blob: 56536b1a5704d4eba107584f883b025a8c0e3c9e [file] [log] [blame]
John McCallc84ed6a2012-05-01 06:13:13 +00001// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s
2
Reid Kleckner37384452013-08-22 20:07:45 +00003// CHECK: @llvm.global_ctors = appending global [2 x { i32, void ()* }]
4// CHECK: [{ i32, void ()* } { i32 65535, void ()* [[INIT_foo:@.*global_var.*]] },
5// CHECK: { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
6
John McCallc84ed6a2012-05-01 06:13:13 +00007struct S {
8 S() {}
9 ~S() {}
10} s;
11
Bill Wendling2386bb12013-02-27 00:06:04 +000012// CHECK: define internal void [[INIT_s:@.*global_var.*]] [[NUW:#[0-9]+]]
NAKAMURA Takumi924ce0d2012-09-25 09:53:18 +000013// CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %struct.S* @"\01??0S@@QAE@XZ"
John McCallc84ed6a2012-05-01 06:13:13 +000014// CHECK: call i32 @atexit(void ()* @"__dtor_\01?s@@3US@@A")
15// CHECK: ret void
16
Bill Wendling2386bb12013-02-27 00:06:04 +000017// CHECK: define internal void @"__dtor_\01?s@@3US@@A"() [[NUW]] {
Timur Iskhodzhanovc5098ad2012-07-12 09:50:54 +000018// CHECK: call x86_thiscallcc void @"\01??1S@@QAE@XZ"
John McCallc84ed6a2012-05-01 06:13:13 +000019// CHECK: ret void
20
21// Force WeakODRLinkage by using templates
22class A {
23 public:
24 A() {}
25 ~A() {}
26};
27
28template<typename T>
29class B {
30 public:
31 static A foo;
32};
33
34template<typename T> A B<T>::foo;
35
36void force_usage() {
37 (void)B<int>::foo; // (void) - force usage
38}
39
Reid Kleckner37384452013-08-22 20:07:45 +000040// CHECK: define internal void [[INIT_foo]]() [[NUW]]
NAKAMURA Takumi924ce0d2012-09-25 09:53:18 +000041// CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ"
John McCallc84ed6a2012-05-01 06:13:13 +000042// CHECK: call i32 @atexit(void ()* [[FOO_DTOR:@"__dtor_.*foo@.*]])
43// CHECK: ret void
44
John McCall0f999f32012-09-25 08:00:39 +000045// CHECK: define linkonce_odr x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ"
John McCallc84ed6a2012-05-01 06:13:13 +000046
Timur Iskhodzhanovc5098ad2012-07-12 09:50:54 +000047// CHECK: define linkonce_odr x86_thiscallcc void @"\01??1A@@QAE@XZ"
John McCallc84ed6a2012-05-01 06:13:13 +000048
49// CHECK: define internal void [[FOO_DTOR]]
Timur Iskhodzhanovc5098ad2012-07-12 09:50:54 +000050// CHECK: call x86_thiscallcc void @"\01??1A@@QAE@XZ"{{.*}}foo
John McCallc84ed6a2012-05-01 06:13:13 +000051// CHECK: ret void
52
Bill Wendling2386bb12013-02-27 00:06:04 +000053// CHECK: define internal void @_GLOBAL__I_a() [[NUW]] {
John McCallc84ed6a2012-05-01 06:13:13 +000054// CHECK: call void [[INIT_s]]
John McCallc84ed6a2012-05-01 06:13:13 +000055// CHECK: ret void
Bill Wendlingc33fc4c2013-02-20 07:22:19 +000056
Bill Wendling2386bb12013-02-27 00:06:04 +000057// CHECK: attributes [[NUW]] = { nounwind }