blob: c0b97221235732fed300da979c0fd7ae3994857c [file] [log] [blame]
Rafael Espindola442ecd22013-11-09 23:05:07 +00001// RUN: %clang_cc1 -emit-llvm %s -o - -mconstructor-aliases -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s
John McCallc84ed6a2012-05-01 06:13:13 +00002
Reid Kleckner37384452013-08-22 20:07:45 +00003// CHECK: @llvm.global_ctors = appending global [2 x { i32, void ()* }]
Reid Kleckner1ece9fc2013-09-10 20:43:12 +00004// CHECK: [{ i32, void ()* } { i32 65535, void ()* @"\01??__Efoo@?$B@H@@YAXXZ" },
Reid Kleckner37384452013-08-22 20:07:45 +00005// CHECK: { i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
6
John McCallc84ed6a2012-05-01 06:13:13 +00007struct S {
Reid Klecknerd8110b62013-09-10 20:14:30 +00008 S();
9 ~S();
10};
11
12S s;
John McCallc84ed6a2012-05-01 06:13:13 +000013
Reid Kleckner1ece9fc2013-09-10 20:43:12 +000014// CHECK: define internal void @"\01??__Es@@YAXXZ"() [[NUW:#[0-9]+]]
NAKAMURA Takumi924ce0d2012-09-25 09:53:18 +000015// CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %struct.S* @"\01??0S@@QAE@XZ"
Reid Klecknerd8110b62013-09-10 20:14:30 +000016// CHECK: call i32 @atexit(void ()* @"\01??__Fs@@YAXXZ")
John McCallc84ed6a2012-05-01 06:13:13 +000017// CHECK: ret void
18
Reid Klecknerd8110b62013-09-10 20:14:30 +000019// CHECK: define internal void @"\01??__Fs@@YAXXZ"() [[NUW]] {
Timur Iskhodzhanovc5098ad2012-07-12 09:50:54 +000020// CHECK: call x86_thiscallcc void @"\01??1S@@QAE@XZ"
John McCallc84ed6a2012-05-01 06:13:13 +000021// CHECK: ret void
22
Reid Klecknerd8110b62013-09-10 20:14:30 +000023void StaticLocal() {
24 static S TheS;
25}
26// CHECK-LABEL: define void @"\01?StaticLocal@@YAXXZ"()
27// CHECK: load i32* @"\01?$S1@?1??StaticLocal@@YAXXZ@4IA"
28// CHECK: store i32 {{.*}}, i32* @"\01?$S1@?1??StaticLocal@@YAXXZ@4IA"
29// CHECK: ret
30
31void MultipleStatics() {
32 static S S1;
33 static S S2;
34 static S S3;
35 static S S4;
36 static S S5;
37 static S S6;
38 static S S7;
39 static S S8;
40 static S S9;
41 static S S10;
42 static S S11;
43 static S S12;
44 static S S13;
45 static S S14;
46 static S S15;
47 static S S16;
48 static S S17;
49 static S S18;
50 static S S19;
51 static S S20;
52 static S S21;
53 static S S22;
54 static S S23;
55 static S S24;
56 static S S25;
57 static S S26;
58 static S S27;
59 static S S28;
60 static S S29;
61 static S S30;
62 static S S31;
63 static S S32;
64 static S S33;
65 static S S34;
66 static S S35;
67}
68// CHECK-LABEL: define void @"\01?MultipleStatics@@YAXXZ"()
69// CHECK: load i32* @"\01?$S1@?1??MultipleStatics@@YAXXZ@4IA"
70// CHECK: and i32 {{.*}}, 1
71// CHECK: and i32 {{.*}}, 2
72// CHECK: and i32 {{.*}}, 4
73// CHECK: and i32 {{.*}}, 8
74// CHECK: and i32 {{.*}}, 16
75// ...
76// CHECK: and i32 {{.*}}, -2147483648
77// CHECK: load i32* @"\01?$S1@?1??MultipleStatics@@YAXXZ@4IA1"
78// CHECK: and i32 {{.*}}, 1
79// CHECK: and i32 {{.*}}, 2
80// CHECK: and i32 {{.*}}, 4
81// CHECK: ret
82
John McCallc84ed6a2012-05-01 06:13:13 +000083// Force WeakODRLinkage by using templates
84class A {
85 public:
86 A() {}
87 ~A() {}
88};
89
90template<typename T>
91class B {
92 public:
93 static A foo;
94};
95
96template<typename T> A B<T>::foo;
97
Reid Klecknerd8110b62013-09-10 20:14:30 +000098inline S &UnreachableStatic() {
99 if (0) {
100 static S s; // bit 1
101 return s;
102 }
103 static S s; // bit 2
104 return s;
105}
106
107// CHECK-LABEL: define linkonce_odr %struct.S* @"\01?UnreachableStatic@@YAAAUS@@XZ"()
108// CHECK: and i32 {{.*}}, 2
109// CHECK: or i32 {{.*}}, 2
110// CHECK: ret
111
112inline S &getS() {
113 static S TheS;
114 return TheS;
115}
116
117// CHECK-LABEL: define linkonce_odr %struct.S* @"\01?getS@@YAAAUS@@XZ"
118// CHECK: load i32* @"\01??_B?1??getS@@YAAAUS@@XZ@51"
119// CHECK: and i32 {{.*}}, 1
120// CHECK: icmp ne i32 {{.*}}, 0
121// CHECK: br i1
122// init:
123// CHECK: or i32 {{.*}}, 1
124// CHECK: store i32 {{.*}}, i32* @"\01??_B?1??getS@@YAAAUS@@XZ@51"
125// CHECK: call x86_thiscallcc %struct.S* @"\01??0S@@QAE@XZ"(%struct.S* @"\01?TheS@?1??getS@@YAAAUS@@XZ@4U2@A")
126// CHECK: call i32 @atexit(void ()* @"\01??__FTheS@?1??getS@@YAAAUS@@XZ@YAXXZ")
127// CHECK: br label
128// init.end:
129// CHECK: ret %struct.S* @"\01?TheS@?1??getS@@YAAAUS@@XZ@4U2@A"
130
John McCallc84ed6a2012-05-01 06:13:13 +0000131void force_usage() {
Reid Klecknerd8110b62013-09-10 20:14:30 +0000132 UnreachableStatic();
133 getS();
John McCallc84ed6a2012-05-01 06:13:13 +0000134 (void)B<int>::foo; // (void) - force usage
135}
136
Reid Kleckner1ece9fc2013-09-10 20:43:12 +0000137// CHECK: define internal void @"\01??__Efoo@?$B@H@@YAXXZ"() [[NUW]]
NAKAMURA Takumi924ce0d2012-09-25 09:53:18 +0000138// CHECK: %{{[.0-9A-Z_a-z]+}} = call x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ"
Reid Klecknerd8110b62013-09-10 20:14:30 +0000139// CHECK: call i32 @atexit(void ()* @"\01??__Ffoo@?$B@H@@YAXXZ")
John McCallc84ed6a2012-05-01 06:13:13 +0000140// CHECK: ret void
141
John McCall0f999f32012-09-25 08:00:39 +0000142// CHECK: define linkonce_odr x86_thiscallcc %class.A* @"\01??0A@@QAE@XZ"
John McCallc84ed6a2012-05-01 06:13:13 +0000143
Timur Iskhodzhanovc5098ad2012-07-12 09:50:54 +0000144// CHECK: define linkonce_odr x86_thiscallcc void @"\01??1A@@QAE@XZ"
John McCallc84ed6a2012-05-01 06:13:13 +0000145
Reid Klecknerd8110b62013-09-10 20:14:30 +0000146// CHECK: define internal void @"\01??__Ffoo@?$B@H@@YAXXZ"
Timur Iskhodzhanovc5098ad2012-07-12 09:50:54 +0000147// CHECK: call x86_thiscallcc void @"\01??1A@@QAE@XZ"{{.*}}foo
John McCallc84ed6a2012-05-01 06:13:13 +0000148// CHECK: ret void
149
Bill Wendling2386bb12013-02-27 00:06:04 +0000150// CHECK: define internal void @_GLOBAL__I_a() [[NUW]] {
Reid Kleckner1ece9fc2013-09-10 20:43:12 +0000151// CHECK: call void @"\01??__Es@@YAXXZ"()
John McCallc84ed6a2012-05-01 06:13:13 +0000152// CHECK: ret void
Bill Wendlingc33fc4c2013-02-20 07:22:19 +0000153
Bill Wendling2386bb12013-02-27 00:06:04 +0000154// CHECK: attributes [[NUW]] = { nounwind }