blob: 3231a76ba92087552d1fdb1b711957be193d6ca1 [file] [log] [blame]
Manman Ren68150262015-11-11 22:42:31 +00001// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck --check-prefix=CHECK --check-prefix=LINUX %s
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00002// RUN: %clang_cc1 -std=c++11 -femulated-tls -emit-llvm %s -o - \
Manman Ren68150262015-11-11 22:42:31 +00003// RUN: -triple x86_64-linux-gnu 2>&1 | FileCheck --check-prefix=CHECK --check-prefix=LINUX %s
4// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple x86_64-apple-darwin12 | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s
Richard Smithdbf74ba2013-04-14 23:01:42 +00005
Richard Smith2fd1d7a2013-04-19 16:42:07 +00006int f();
Richard Smithdbf74ba2013-04-14 23:01:42 +00007int g();
8
Richard Smithfbe23692017-01-13 00:43:31 +00009// LINUX-DAG: @a = thread_local global i32 0
10// DARWIN-DAG: @a = internal thread_local global i32 0
Richard Smith2fd1d7a2013-04-19 16:42:07 +000011thread_local int a = f();
12extern thread_local int b;
Richard Smithfbe23692017-01-13 00:43:31 +000013// CHECK-DAG: @c = global i32 0
Richard Smith2fd1d7a2013-04-19 16:42:07 +000014int c = b;
Richard Smithfbe23692017-01-13 00:43:31 +000015// CHECK-DAG: @_ZL1d = internal thread_local global i32 0
Richard Smith2fd1d7a2013-04-19 16:42:07 +000016static thread_local int d = g();
17
18struct U { static thread_local int m; };
Richard Smithfbe23692017-01-13 00:43:31 +000019// LINUX-DAG: @_ZN1U1mE = thread_local global i32 0
20// DARWIN-DAG: @_ZN1U1mE = internal thread_local global i32 0
Richard Smith2fd1d7a2013-04-19 16:42:07 +000021thread_local int U::m = f();
22
Richard Smith5a99c492015-12-01 01:10:48 +000023namespace MismatchedInitType {
24 // Check that we don't crash here when we're forced to create a new global
25 // variable (with a different type) when we add the initializer.
26 union U {
27 int a;
28 float f;
29 constexpr U() : f(0.0) {}
30 };
31 static thread_local U u;
32 void *p = &u;
33}
34
Richard Smith2fd1d7a2013-04-19 16:42:07 +000035template<typename T> struct V { static thread_local int m; };
36template<typename T> thread_local int V<T>::m = g();
37
Richard Smithfbe23692017-01-13 00:43:31 +000038template<typename T> struct W { static thread_local int m; };
39template<typename T> thread_local int W<T>::m = 123;
Richard Smith2fd1d7a2013-04-19 16:42:07 +000040
Richard Smithfbe23692017-01-13 00:43:31 +000041struct Dtor { ~Dtor(); };
42template<typename T> struct X { static thread_local Dtor m; };
43template<typename T> thread_local Dtor X<T>::m;
Richard Smith2fd1d7a2013-04-19 16:42:07 +000044
Richard Smithfbe23692017-01-13 00:43:31 +000045// CHECK-DAG: @e = global
46void *e = V<int>::m + W<int>::m + &X<int>::m;
Richard Smith2fd1d7a2013-04-19 16:42:07 +000047
Richard Smithfbe23692017-01-13 00:43:31 +000048template thread_local int V<float>::m;
49template thread_local int W<float>::m;
50template thread_local Dtor X<float>::m;
Richard Smithdbf74ba2013-04-14 23:01:42 +000051
Richard Smithfbe23692017-01-13 00:43:31 +000052extern template thread_local int V<char>::m;
53extern template thread_local int W<char>::m;
54extern template thread_local Dtor X<char>::m;
Richard Smithdbf74ba2013-04-14 23:01:42 +000055
Richard Smithfbe23692017-01-13 00:43:31 +000056void *e2 = V<char>::m + W<char>::m + &X<char>::m;
Richard Smithdbf74ba2013-04-14 23:01:42 +000057
Richard Smithfbe23692017-01-13 00:43:31 +000058// CHECK-DAG: @_ZN1VIiE1mE = linkonce_odr thread_local global i32 0
59// CHECK-DAG: @_ZN1WIiE1mE = linkonce_odr thread_local global i32 123
60// CHECK-DAG: @_ZN1XIiE1mE = linkonce_odr thread_local global {{.*}}
61// CHECK-DAG: @_ZN1VIfE1mE = weak_odr thread_local global i32 0
62// CHECK-DAG: @_ZN1WIfE1mE = weak_odr thread_local global i32 123
63// CHECK-DAG: @_ZN1XIfE1mE = weak_odr thread_local global {{.*}}
Richard Smithdbf74ba2013-04-14 23:01:42 +000064
Richard Smithfbe23692017-01-13 00:43:31 +000065// CHECK-DAG: @_ZZ1fvE1n = internal thread_local global i32 0
Richard Smith2fd1d7a2013-04-19 16:42:07 +000066
Richard Smithfbe23692017-01-13 00:43:31 +000067// CHECK-DAG: @_ZGVZ1fvE1n = internal thread_local global i8 0
Richard Smith2fd1d7a2013-04-19 16:42:07 +000068
Richard Smithfbe23692017-01-13 00:43:31 +000069// CHECK-DAG: @_ZZ8tls_dtorvE1s = internal thread_local global
70// CHECK-DAG: @_ZGVZ8tls_dtorvE1s = internal thread_local global i8 0
Richard Smith2fd1d7a2013-04-19 16:42:07 +000071
Richard Smithfbe23692017-01-13 00:43:31 +000072// CHECK-DAG: @_ZZ8tls_dtorvE1t = internal thread_local global
73// CHECK-DAG: @_ZGVZ8tls_dtorvE1t = internal thread_local global i8 0
74
75// CHECK-DAG: @_ZZ8tls_dtorvE1u = internal thread_local global
76// CHECK-DAG: @_ZGVZ8tls_dtorvE1u = internal thread_local global i8 0
77// CHECK-DAG: @_ZGRZ8tls_dtorvE1u_ = internal thread_local global
78
79// CHECK-DAG: @_ZGVN1VIiE1mE = linkonce_odr thread_local global i64 0
80
81// CHECK-DAG: @__tls_guard = internal thread_local global i8 0
82
83// CHECK-DAG: @llvm.global_ctors = appending global {{.*}} @[[GLOBAL_INIT:[^ ]*]]
84
85// LINUX-DAG: @_ZTH1a = alias void (), void ()* @__tls_init
86// DARWIN-DAG: @_ZTH1a = internal alias void (), void ()* @__tls_init
87// CHECK-DAG: @_ZTHL1d = internal alias void (), void ()* @__tls_init
88// LINUX-DAG: @_ZTHN1U1mE = alias void (), void ()* @__tls_init
89// DARWIN-DAG: @_ZTHN1U1mE = internal alias void (), void ()* @__tls_init
90// CHECK-DAG: @_ZTHN1VIiE1mE = linkonce_odr alias void (), void ()* @[[V_M_INIT:[^, ]*]]
91// CHECK-NOT: @_ZTHN1WIiE1mE =
92// CHECK-DAG: @_ZTHN1XIiE1mE = linkonce_odr alias void (), void ()* @[[X_M_INIT:[^, ]*]]
93// CHECK-DAG: @_ZTHN1VIfE1mE = weak_odr alias void (), void ()* @[[VF_M_INIT:[^, ]*]]
94// CHECK-NOT: @_ZTHN1WIfE1mE =
95// CHECK-DAG: @_ZTHN1XIfE1mE = weak_odr alias void (), void ()* @[[XF_M_INIT:[^, ]*]]
Richard Smith2fd1d7a2013-04-19 16:42:07 +000096
97
98// Individual variable initialization functions:
99
100// CHECK: define {{.*}} @[[A_INIT:.*]]()
101// CHECK: call i32 @_Z1fv()
102// CHECK-NEXT: store i32 {{.*}}, i32* @a, align 4
103
Stephen Lin43622612013-08-15 06:47:53 +0000104// CHECK-LABEL: define i32 @_Z1fv()
Richard Smithdbf74ba2013-04-14 23:01:42 +0000105int f() {
David Blaikiea953f282015-02-27 21:19:58 +0000106 // CHECK: %[[GUARD:.*]] = load i8, i8* @_ZGVZ1fvE1n, align 1
Richard Smithdbf74ba2013-04-14 23:01:42 +0000107 // CHECK: %[[NEED_INIT:.*]] = icmp eq i8 %[[GUARD]], 0
108 // CHECK: br i1 %[[NEED_INIT]]
109
110 // CHECK: %[[CALL:.*]] = call i32 @_Z1gv()
111 // CHECK: store i32 %[[CALL]], i32* @_ZZ1fvE1n, align 4
112 // CHECK: store i8 1, i8* @_ZGVZ1fvE1n
113 // CHECK: br label
114 static thread_local int n = g();
115
David Blaikiea953f282015-02-27 21:19:58 +0000116 // CHECK: load i32, i32* @_ZZ1fvE1n, align 4
Richard Smithdbf74ba2013-04-14 23:01:42 +0000117 return n;
118}
119
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000120// CHECK: define {{.*}} @[[C_INIT:.*]]()
Manman Renb0b3af72015-12-17 00:42:36 +0000121// LINUX: call i32* @_ZTW1b()
122// DARWIN: call cxx_fast_tlscc i32* @_ZTW1b()
David Blaikiea953f282015-02-27 21:19:58 +0000123// CHECK-NEXT: load i32, i32* %{{.*}}, align 4
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000124// CHECK-NEXT: store i32 %{{.*}}, i32* @c, align 4
125
Manman Ren68150262015-11-11 22:42:31 +0000126// LINUX-LABEL: define weak_odr hidden i32* @_ZTW1b()
127// LINUX: br i1 icmp ne (void ()* @_ZTH1b, void ()* null),
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000128// not null:
Manman Ren68150262015-11-11 22:42:31 +0000129// LINUX: call void @_ZTH1b()
130// LINUX: br label
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000131// finally:
Manman Ren68150262015-11-11 22:42:31 +0000132// LINUX: ret i32* @b
Manman Renb0b3af72015-12-17 00:42:36 +0000133// DARWIN-LABEL: declare cxx_fast_tlscc i32* @_ZTW1b()
Manman Ren68150262015-11-11 22:42:31 +0000134// There is no definition of the thread wrapper on Darwin for external TLV.
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000135
136// CHECK: define {{.*}} @[[D_INIT:.*]]()
137// CHECK: call i32 @_Z1gv()
138// CHECK-NEXT: store i32 %{{.*}}, i32* @_ZL1d, align 4
139
140// CHECK: define {{.*}} @[[U_M_INIT:.*]]()
141// CHECK: call i32 @_Z1fv()
142// CHECK-NEXT: store i32 %{{.*}}, i32* @_ZN1U1mE, align 4
143
144// CHECK: define {{.*}} @[[E_INIT:.*]]()
Manman Renb0b3af72015-12-17 00:42:36 +0000145// LINUX: call i32* @_ZTWN1VIiE1mE()
146// DARWIN: call cxx_fast_tlscc i32* @_ZTWN1VIiE1mE()
David Blaikiea953f282015-02-27 21:19:58 +0000147// CHECK-NEXT: load i32, i32* %{{.*}}, align 4
Richard Smithfbe23692017-01-13 00:43:31 +0000148// LINUX: call {{.*}}* @_ZTWN1XIiE1mE()
149// DARWIN: call cxx_fast_tlscc {{.*}}* @_ZTWN1XIiE1mE()
150// CHECK: store {{.*}} @e
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000151
Manman Renb0b3af72015-12-17 00:42:36 +0000152// LINUX-LABEL: define weak_odr hidden i32* @_ZTWN1VIiE1mE()
153// DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc i32* @_ZTWN1VIiE1mE()
Manman Ren5e5d0462016-03-18 23:35:21 +0000154// LINUX: call void @_ZTHN1VIiE1mE()
155// DARWIN: call cxx_fast_tlscc void @_ZTHN1VIiE1mE()
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000156// CHECK: ret i32* @_ZN1VIiE1mE
157
Richard Smithfbe23692017-01-13 00:43:31 +0000158// LINUX-LABEL: define weak_odr hidden i32* @_ZTWN1WIiE1mE()
159// DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc i32* @_ZTWN1WIiE1mE()
160// CHECK-NOT: call
161// CHECK: ret i32* @_ZN1WIiE1mE
162
163// LINUX-LABEL: define weak_odr hidden {{.*}}* @_ZTWN1XIiE1mE()
164// DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc {{.*}}* @_ZTWN1XIiE1mE()
165// LINUX: call void @_ZTHN1XIiE1mE()
166// DARWIN: call cxx_fast_tlscc void @_ZTHN1XIiE1mE()
167// CHECK: ret {{.*}}* @_ZN1XIiE1mE
168
169// CHECK: define internal {{.*}} @[[VF_M_INIT]]()
170// LINUX-SAME: comdat($_ZN1VIfE1mE)
171// DARWIN-NOT: comdat
172// CHECK: load i8, i8* bitcast (i64* @_ZGVN1VIfE1mE to i8*)
173// CHECK: %[[VF_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0
174// CHECK: br i1 %[[VF_M_INITIALIZED]],
175// need init:
176// CHECK: call i32 @_Z1gv()
177// CHECK: store i32 %{{.*}}, i32* @_ZN1VIfE1mE, align 4
178// CHECK: store i64 1, i64* @_ZGVN1VIfE1mE
179// CHECK: br label
180
181// CHECK: define internal {{.*}} @[[XF_M_INIT]]()
182// LINUX-SAME: comdat($_ZN1XIfE1mE)
183// DARWIN-NOT: comdat
184// CHECK: load i8, i8* bitcast (i64* @_ZGVN1XIfE1mE to i8*)
185// CHECK: %[[XF_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0
186// CHECK: br i1 %[[XF_M_INITIALIZED]],
187// need init:
188// LINUX: call {{.*}}__cxa_thread_atexit
189// DARWIN: call {{.*}}_tlv_atexit
190// CHECK: store i64 1, i64* @_ZGVN1XIfE1mE
191// CHECK: br label
192
193// LINUX: declare i32 @__cxa_thread_atexit(void (i8*)*, i8*, i8*)
194// DARWIN: declare i32 @_tlv_atexit(void (i8*)*, i8*, i8*)
195
196// DARWIN: declare cxx_fast_tlscc i32* @_ZTWN1VIcE1mE()
197// LINUX: define weak_odr hidden i32* @_ZTWN1VIcE1mE()
198// LINUX-NOT: comdat
199// LINUX: br i1 icmp ne (void ()* @_ZTHN1VIcE1mE,
200// LINUX: call void @_ZTHN1VIcE1mE()
201// LINUX: ret i32* @_ZN1VIcE1mE
202
203// DARWIN: declare cxx_fast_tlscc i32* @_ZTWN1WIcE1mE()
204// LINUX: define weak_odr hidden i32* @_ZTWN1WIcE1mE()
205// LINUX-NOT: comdat
206// LINUX: br i1 icmp ne (void ()* @_ZTHN1WIcE1mE,
207// LINUX: call void @_ZTHN1WIcE1mE()
208// LINUX: ret i32* @_ZN1WIcE1mE
209
210// DARWIN: declare cxx_fast_tlscc {{.*}}* @_ZTWN1XIcE1mE()
211// LINUX: define weak_odr hidden {{.*}}* @_ZTWN1XIcE1mE()
212// LINUX-NOT: comdat
213// LINUX: br i1 icmp ne (void ()* @_ZTHN1XIcE1mE,
214// LINUX: call void @_ZTHN1XIcE1mE()
215// LINUX: ret {{.*}}* @_ZN1XIcE1mE
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000216
Richard Smithdbf74ba2013-04-14 23:01:42 +0000217struct S { S(); ~S(); };
218struct T { ~T(); };
219
Stephen Lin43622612013-08-15 06:47:53 +0000220// CHECK-LABEL: define void @_Z8tls_dtorv()
Richard Smithdbf74ba2013-04-14 23:01:42 +0000221void tls_dtor() {
David Blaikiea953f282015-02-27 21:19:58 +0000222 // CHECK: load i8, i8* @_ZGVZ8tls_dtorvE1s
Richard Smithdbf74ba2013-04-14 23:01:42 +0000223 // CHECK: call void @_ZN1SC1Ev(%struct.S* @_ZZ8tls_dtorvE1s)
Manman Ren68150262015-11-11 22:42:31 +0000224 // LINUX: call i32 @__cxa_thread_atexit({{.*}}@_ZN1SD1Ev {{.*}} @_ZZ8tls_dtorvE1s{{.*}} @__dso_handle
225 // DARWIN: call i32 @_tlv_atexit({{.*}}@_ZN1SD1Ev {{.*}} @_ZZ8tls_dtorvE1s{{.*}} @__dso_handle
Richard Smithdbf74ba2013-04-14 23:01:42 +0000226 // CHECK: store i8 1, i8* @_ZGVZ8tls_dtorvE1s
227 static thread_local S s;
228
David Blaikiea953f282015-02-27 21:19:58 +0000229 // CHECK: load i8, i8* @_ZGVZ8tls_dtorvE1t
Richard Smithdbf74ba2013-04-14 23:01:42 +0000230 // CHECK-NOT: _ZN1T
Manman Ren68150262015-11-11 22:42:31 +0000231 // LINUX: call i32 @__cxa_thread_atexit({{.*}}@_ZN1TD1Ev {{.*}}@_ZZ8tls_dtorvE1t{{.*}} @__dso_handle
232 // DARWIN: call i32 @_tlv_atexit({{.*}}@_ZN1TD1Ev {{.*}}@_ZZ8tls_dtorvE1t{{.*}} @__dso_handle
Richard Smithdbf74ba2013-04-14 23:01:42 +0000233 // CHECK: store i8 1, i8* @_ZGVZ8tls_dtorvE1t
234 static thread_local T t;
235
David Blaikiea953f282015-02-27 21:19:58 +0000236 // CHECK: load i8, i8* @_ZGVZ8tls_dtorvE1u
David Majnemer3b3bdb52014-05-06 22:49:16 +0000237 // CHECK: call void @_ZN1SC1Ev(%struct.S* @_ZGRZ8tls_dtorvE1u_)
Manman Ren68150262015-11-11 22:42:31 +0000238 // LINUX: call i32 @__cxa_thread_atexit({{.*}}@_ZN1SD1Ev {{.*}} @_ZGRZ8tls_dtorvE1u_{{.*}} @__dso_handle
239 // DARWIN: call i32 @_tlv_atexit({{.*}}@_ZN1SD1Ev {{.*}} @_ZGRZ8tls_dtorvE1u_{{.*}} @__dso_handle
Richard Smithdbf74ba2013-04-14 23:01:42 +0000240 // CHECK: store i8 1, i8* @_ZGVZ8tls_dtorvE1u
241 static thread_local const S &u = S();
242}
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000243
Richard Smith2414a692013-05-16 19:52:25 +0000244// CHECK: define {{.*}} @_Z7PR15991v(
245int PR15991() {
246 thread_local int n;
247 auto l = [] { return n; };
248 return l();
249}
250
Richard Smith0f383742014-03-26 22:48:22 +0000251struct PR19254 {
252 static thread_local int n;
253 int f();
254};
255// CHECK: define {{.*}} @_ZN7PR192541fEv(
256int PR19254::f() {
Manman Ren68150262015-11-11 22:42:31 +0000257 // LINUX: call void @_ZTHN7PR192541nE(
Manman Renb0b3af72015-12-17 00:42:36 +0000258 // DARWIN: call cxx_fast_tlscc i32* @_ZTWN7PR192541nE(
Richard Smith0f383742014-03-26 22:48:22 +0000259 return this->n;
260}
261
David Majnemerceaaa8d2014-05-05 18:54:23 +0000262namespace {
263thread_local int anon_i{1};
264}
265void set_anon_i() {
266 anon_i = 2;
267}
Manman Renb0b3af72015-12-17 00:42:36 +0000268// LINUX-LABEL: define internal i32* @_ZTWN12_GLOBAL__N_16anon_iE()
269// DARWIN-LABEL: define internal cxx_fast_tlscc i32* @_ZTWN12_GLOBAL__N_16anon_iE()
David Majnemerceaaa8d2014-05-05 18:54:23 +0000270
Richard Smithfbe23692017-01-13 00:43:31 +0000271// CHECK: define internal {{.*}} @[[V_M_INIT]]()
272// LINUX-SAME: comdat($_ZN1VIiE1mE)
273// DARWIN-NOT: comdat
David Blaikiea953f282015-02-27 21:19:58 +0000274// CHECK: load i8, i8* bitcast (i64* @_ZGVN1VIiE1mE to i8*)
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000275// CHECK: %[[V_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0
276// CHECK: br i1 %[[V_M_INITIALIZED]],
277// need init:
278// CHECK: call i32 @_Z1gv()
279// CHECK: store i32 %{{.*}}, i32* @_ZN1VIiE1mE, align 4
280// CHECK: store i64 1, i64* @_ZGVN1VIiE1mE
281// CHECK: br label
282
Richard Smithfbe23692017-01-13 00:43:31 +0000283// CHECK: define internal {{.*}} @[[X_M_INIT]]()
284// LINUX-SAME: comdat($_ZN1XIiE1mE)
285// DARWIN-NOT: comdat
286// CHECK: load i8, i8* bitcast (i64* @_ZGVN1XIiE1mE to i8*)
287// CHECK: %[[X_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0
288// CHECK: br i1 %[[X_M_INITIALIZED]],
289// need init:
290// LINUX: call {{.*}}__cxa_thread_atexit
291// DARWIN: call {{.*}}_tlv_atexit
292// CHECK: store i64 1, i64* @_ZGVN1XIiE1mE
293// CHECK: br label
294
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000295// CHECK: define {{.*}}@[[GLOBAL_INIT:.*]]()
296// CHECK: call void @[[C_INIT]]()
297// CHECK: call void @[[E_INIT]]()
298
299
300// CHECK: define {{.*}}@__tls_init()
David Blaikiea953f282015-02-27 21:19:58 +0000301// CHECK: load i8, i8* @__tls_guard
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000302// CHECK: %[[NEED_TLS_INIT:.*]] = icmp eq i8 %{{.*}}, 0
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000303// CHECK: br i1 %[[NEED_TLS_INIT]],
304// init:
Manman Ren14f88152015-11-11 19:19:26 +0000305// CHECK: store i8 1, i8* @__tls_guard
Richard Smithfbe23692017-01-13 00:43:31 +0000306// CHECK-NOT: call void @[[V_M_INIT]]()
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000307// CHECK: call void @[[A_INIT]]()
Richard Smithfbe23692017-01-13 00:43:31 +0000308// CHECK-NOT: call void @[[V_M_INIT]]()
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000309// CHECK: call void @[[D_INIT]]()
Richard Smithfbe23692017-01-13 00:43:31 +0000310// CHECK-NOT: call void @[[V_M_INIT]]()
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000311// CHECK: call void @[[U_M_INIT]]()
Richard Smithfbe23692017-01-13 00:43:31 +0000312// CHECK-NOT: call void @[[V_M_INIT]]()
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000313
314
Manman Ren68150262015-11-11 22:42:31 +0000315// LIUNX: define weak_odr hidden i32* @_ZTW1a() {
Manman Renb0b3af72015-12-17 00:42:36 +0000316// DARWIN: define cxx_fast_tlscc i32* @_ZTW1a()
Manman Ren5e5d0462016-03-18 23:35:21 +0000317// LINUX: call void @_ZTH1a()
318// DARWIN: call cxx_fast_tlscc void @_ZTH1a()
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000319// CHECK: ret i32* @a
320// CHECK: }
321
322
Akira Hatanaka26907f92016-01-15 03:34:06 +0000323// LINUX: declare extern_weak void @_ZTH1b() [[ATTR:#[0-9]+]]
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000324
325
Manman Renb0b3af72015-12-17 00:42:36 +0000326// LINUX-LABEL: define internal i32* @_ZTWL1d()
327// DARWIN-LABEL: define internal cxx_fast_tlscc i32* @_ZTWL1d()
Manman Ren5e5d0462016-03-18 23:35:21 +0000328// LINUX: call void @_ZTHL1d()
329// DARWIN: call cxx_fast_tlscc void @_ZTHL1d()
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000330// CHECK: ret i32* @_ZL1d
331
Manman Ren68150262015-11-11 22:42:31 +0000332// LINUX-LABEL: define weak_odr hidden i32* @_ZTWN1U1mE()
Manman Renb0b3af72015-12-17 00:42:36 +0000333// DARWIN-LABEL: define cxx_fast_tlscc i32* @_ZTWN1U1mE()
Manman Ren5e5d0462016-03-18 23:35:21 +0000334// LINUX: call void @_ZTHN1U1mE()
335// DARWIN: call cxx_fast_tlscc void @_ZTHN1U1mE()
Richard Smith2fd1d7a2013-04-19 16:42:07 +0000336// CHECK: ret i32* @_ZN1U1mE
Akira Hatanaka26907f92016-01-15 03:34:06 +0000337
338// LINUX: attributes [[ATTR]] = { {{.+}} }