blob: 78ab280c9b063659555021134c3703689b37bbf0 [file] [log] [blame]
Reid Kleckner1808c022019-04-29 23:05:47 +00001// RUN: %clang_cc1 -fms-extensions -fms-compatibility-version=19.20 -triple x86_64-windows-msvc -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s --check-prefix=MSVC
2// RUN: %clang_cc1 -fms-extensions -fms-compatibility-version=19.20 -triple aarch64-windows-msvc -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s --check-prefix=MSVC
3// RUN: %clang_cc1 -triple x86_64-windows-itanium -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s --check-prefix=ITANIUM
4// RUN: %clang_cc1 -triple aarch64-windows-gnu -fexceptions -fcxx-exceptions -emit-llvm -o - %s | FileCheck %s --check-prefix=GNU
5
6void foo1() { throw 1; }
7// _CxxThrowException should not be marked dllimport.
8// MSVC-LABEL: define dso_local void @"?foo1@@YAXXZ"
9// MSVC: call void @_CxxThrowException
10// MSVC: declare dso_local void @_CxxThrowException(i8*, %eh.ThrowInfo*)
11
12// __cxa_throw should be marked dllimport for *-windows-itanium.
13// ITANIUM-LABEL: define dso_local void @_Z4foo1v()
14// ITANIUM: call void @__cxa_throw({{.*}})
15// ITANIUM: declare dllimport void @__cxa_throw({{.*}})
16
17// ... but not for *-windows-gnu.
18// GNU-LABEL: define dso_local void @_Z4foo1v()
19// GNU: call void @__cxa_throw({{.*}})
20// GNU: declare dso_local void @__cxa_throw({{.*}})
21
22
23void bar();
24void foo2() noexcept(true) { bar(); }
25// __std_terminate should not be marked dllimport.
26// MSVC-LABEL: define dso_local void @"?foo2@@YAXXZ"
27// MSVC: call void @__std_terminate()
28// MSVC: declare dso_local void @__std_terminate()
29
30// _ZSt9terminatev and __cxa_begin_catch should be marked dllimport.
Tim Northovera009a602019-08-03 14:28:34 +000031// ITANIUM-LABEL: define linkonce_odr hidden void @__clang_call_terminate(i8* %0)
Reid Kleckner1808c022019-04-29 23:05:47 +000032// ITANIUM: call i8* @__cxa_begin_catch({{.*}})
33// ITANIUM: call void @_ZSt9terminatev()
34// ITANIUM: declare dllimport i8* @__cxa_begin_catch(i8*)
35// ITANIUM: declare dllimport void @_ZSt9terminatev()
36
37// .. not for mingw.
Tim Northovera009a602019-08-03 14:28:34 +000038// GNU-LABEL: define linkonce_odr hidden void @__clang_call_terminate(i8* %0)
Reid Kleckner1808c022019-04-29 23:05:47 +000039// GNU: call i8* @__cxa_begin_catch({{.*}})
40// GNU: call void @_ZSt9terminatev()
41// GNU: declare dso_local i8* @__cxa_begin_catch(i8*)
42// GNU: declare dso_local void @_ZSt9terminatev()
43
44
45struct A {};
46struct B { virtual void f(); };
47struct C : A, virtual B {};
48struct T {};
49T *foo3() { return dynamic_cast<T *>((C *)0); }
50// __RTDynamicCast should not be marked dllimport.
51// MSVC-LABEL: define dso_local %struct.T* @"?foo3@@YAPEAUT@@XZ"
52// MSVC: call i8* @__RTDynamicCast({{.*}})
53// MSVC: declare dso_local i8* @__RTDynamicCast(i8*, i32, i8*, i8*, i32)
54
55// Again, imported
56// ITANIUM-LABEL: define dso_local %struct.T* @_Z4foo3v()
57// ITANIUM: call i8* @__dynamic_cast({{.*}})
58// ITANIUM: declare dllimport i8* @__dynamic_cast({{.*}})
59
60// Not imported
61// GNU-LABEL: define dso_local %struct.T* @_Z4foo3v()
62// GNU: call i8* @__dynamic_cast({{.*}})
63// GNU: declare dso_local i8* @__dynamic_cast({{.*}})