microsoft-abi-static-initializers.cpp revision 0e33dcda5c0f642da737c00e65bcdea6b988ce0b
1// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s
2
3struct S {
4  S() {}
5  ~S() {}
6} s;
7
8// CHECK: define internal void [[INIT_s:@.*global_var.*]] nounwind
9// CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %struct.S* @"\01??0S@@QAE@XZ"
10// CHECK: call i32 @atexit(void ()* @"__dtor_\01?s@@3US@@A")
11// CHECK: ret void
12
13// CHECK: define internal void @"__dtor_\01?s@@3US@@A"() nounwind {
14// CHECK: call x86_thiscallcc void @"\01??1S@@QAE@XZ"
15// CHECK: ret void
16
17// Force WeakODRLinkage by using templates
18class A {
19 public:
20  A() {}
21  ~A() {}
22};
23
24template<typename T>
25class B {
26 public:
27  static A foo;
28};
29
30template<typename T> A B<T>::foo;
31
32void force_usage() {
33  (void)B<int>::foo;  // (void) - force usage
34}
35
36// CHECK: define internal void [[INIT_foo:@.*global_var.*]] nounwind
37// CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ"
38// CHECK: call i32 @atexit(void ()* [[FOO_DTOR:@"__dtor_.*foo@.*]])
39// CHECK: ret void
40
41// CHECK: define linkonce_odr x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ"
42
43// CHECK: define linkonce_odr x86_thiscallcc void @"\01??1A@@QAE@XZ"
44
45// CHECK: define internal void [[FOO_DTOR]]
46// CHECK: call x86_thiscallcc void @"\01??1A@@QAE@XZ"{{.*}}foo
47// CHECK: ret void
48
49// CHECK: define internal void @_GLOBAL__I_a() nounwind {
50// CHECK: call void [[INIT_s]]
51// CHECK: call void [[INIT_foo]]
52// CHECK: ret void
53