1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck --check-prefix=CHECK --check-prefix=LINUX %s
2*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -femulated-tls -emit-llvm %s -o - \
3*67e74705SXin Li // RUN: -triple x86_64-linux-gnu 2>&1 | FileCheck --check-prefix=CHECK --check-prefix=LINUX %s
4*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple x86_64-apple-darwin12 | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s
5*67e74705SXin Li
6*67e74705SXin Li int f();
7*67e74705SXin Li int g();
8*67e74705SXin Li
9*67e74705SXin Li // LINUX: @a = thread_local global i32 0
10*67e74705SXin Li // DARWIN: @a = internal thread_local global i32 0
11*67e74705SXin Li thread_local int a = f();
12*67e74705SXin Li extern thread_local int b;
13*67e74705SXin Li // CHECK: @c = global i32 0
14*67e74705SXin Li int c = b;
15*67e74705SXin Li // CHECK: @_ZL1d = internal thread_local global i32 0
16*67e74705SXin Li static thread_local int d = g();
17*67e74705SXin Li
18*67e74705SXin Li struct U { static thread_local int m; };
19*67e74705SXin Li // LINUX: @_ZN1U1mE = thread_local global i32 0
20*67e74705SXin Li // DARWIN: @_ZN1U1mE = internal thread_local global i32 0
21*67e74705SXin Li thread_local int U::m = f();
22*67e74705SXin Li
23*67e74705SXin Li namespace MismatchedInitType {
24*67e74705SXin Li // Check that we don't crash here when we're forced to create a new global
25*67e74705SXin Li // variable (with a different type) when we add the initializer.
26*67e74705SXin Li union U {
27*67e74705SXin Li int a;
28*67e74705SXin Li float f;
U()29*67e74705SXin Li constexpr U() : f(0.0) {}
30*67e74705SXin Li };
31*67e74705SXin Li static thread_local U u;
32*67e74705SXin Li void *p = &u;
33*67e74705SXin Li }
34*67e74705SXin Li
35*67e74705SXin Li template<typename T> struct V { static thread_local int m; };
36*67e74705SXin Li template<typename T> thread_local int V<T>::m = g();
37*67e74705SXin Li
38*67e74705SXin Li // CHECK: @e = global i32 0
39*67e74705SXin Li int e = V<int>::m;
40*67e74705SXin Li
41*67e74705SXin Li // CHECK: @_ZN1VIiE1mE = linkonce_odr thread_local global i32 0
42*67e74705SXin Li
43*67e74705SXin Li // CHECK: @_ZZ1fvE1n = internal thread_local global i32 0
44*67e74705SXin Li
45*67e74705SXin Li // CHECK: @_ZGVZ1fvE1n = internal thread_local global i8 0
46*67e74705SXin Li
47*67e74705SXin Li // CHECK: @_ZZ8tls_dtorvE1s = internal thread_local global
48*67e74705SXin Li // CHECK: @_ZGVZ8tls_dtorvE1s = internal thread_local global i8 0
49*67e74705SXin Li
50*67e74705SXin Li // CHECK: @_ZZ8tls_dtorvE1t = internal thread_local global
51*67e74705SXin Li // CHECK: @_ZGVZ8tls_dtorvE1t = internal thread_local global i8 0
52*67e74705SXin Li
53*67e74705SXin Li // CHECK: @_ZZ8tls_dtorvE1u = internal thread_local global
54*67e74705SXin Li // CHECK: @_ZGVZ8tls_dtorvE1u = internal thread_local global i8 0
55*67e74705SXin Li // CHECK: @_ZGRZ8tls_dtorvE1u_ = internal thread_local global
56*67e74705SXin Li
57*67e74705SXin Li // CHECK: @_ZGVN1VIiE1mE = linkonce_odr thread_local global i64 0
58*67e74705SXin Li
59*67e74705SXin Li // CHECK: @__tls_guard = internal thread_local global i8 0
60*67e74705SXin Li
61*67e74705SXin Li // CHECK: @llvm.global_ctors = appending global {{.*}} @[[GLOBAL_INIT:[^ ]*]]
62*67e74705SXin Li
63*67e74705SXin Li // LINUX: @_ZTH1a = alias void (), void ()* @__tls_init
64*67e74705SXin Li // DARWIN: @_ZTH1a = internal alias void (), void ()* @__tls_init
65*67e74705SXin Li // CHECK: @_ZTHL1d = internal alias void (), void ()* @__tls_init
66*67e74705SXin Li // LINUX: @_ZTHN1U1mE = alias void (), void ()* @__tls_init
67*67e74705SXin Li // DARWIN: @_ZTHN1U1mE = internal alias void (), void ()* @__tls_init
68*67e74705SXin Li // CHECK: @_ZTHN1VIiE1mE = linkonce_odr alias void (), void ()* @__tls_init
69*67e74705SXin Li
70*67e74705SXin Li
71*67e74705SXin Li // Individual variable initialization functions:
72*67e74705SXin Li
73*67e74705SXin Li // CHECK: define {{.*}} @[[A_INIT:.*]]()
74*67e74705SXin Li // CHECK: call i32 @_Z1fv()
75*67e74705SXin Li // CHECK-NEXT: store i32 {{.*}}, i32* @a, align 4
76*67e74705SXin Li
77*67e74705SXin Li // CHECK-LABEL: define i32 @_Z1fv()
f()78*67e74705SXin Li int f() {
79*67e74705SXin Li // CHECK: %[[GUARD:.*]] = load i8, i8* @_ZGVZ1fvE1n, align 1
80*67e74705SXin Li // CHECK: %[[NEED_INIT:.*]] = icmp eq i8 %[[GUARD]], 0
81*67e74705SXin Li // CHECK: br i1 %[[NEED_INIT]]
82*67e74705SXin Li
83*67e74705SXin Li // CHECK: %[[CALL:.*]] = call i32 @_Z1gv()
84*67e74705SXin Li // CHECK: store i32 %[[CALL]], i32* @_ZZ1fvE1n, align 4
85*67e74705SXin Li // CHECK: store i8 1, i8* @_ZGVZ1fvE1n
86*67e74705SXin Li // CHECK: br label
87*67e74705SXin Li static thread_local int n = g();
88*67e74705SXin Li
89*67e74705SXin Li // CHECK: load i32, i32* @_ZZ1fvE1n, align 4
90*67e74705SXin Li return n;
91*67e74705SXin Li }
92*67e74705SXin Li
93*67e74705SXin Li // CHECK: define {{.*}} @[[C_INIT:.*]]()
94*67e74705SXin Li // LINUX: call i32* @_ZTW1b()
95*67e74705SXin Li // DARWIN: call cxx_fast_tlscc i32* @_ZTW1b()
96*67e74705SXin Li // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
97*67e74705SXin Li // CHECK-NEXT: store i32 %{{.*}}, i32* @c, align 4
98*67e74705SXin Li
99*67e74705SXin Li // LINUX-LABEL: define weak_odr hidden i32* @_ZTW1b()
100*67e74705SXin Li // LINUX: br i1 icmp ne (void ()* @_ZTH1b, void ()* null),
101*67e74705SXin Li // not null:
102*67e74705SXin Li // LINUX: call void @_ZTH1b()
103*67e74705SXin Li // LINUX: br label
104*67e74705SXin Li // finally:
105*67e74705SXin Li // LINUX: ret i32* @b
106*67e74705SXin Li // DARWIN-LABEL: declare cxx_fast_tlscc i32* @_ZTW1b()
107*67e74705SXin Li // There is no definition of the thread wrapper on Darwin for external TLV.
108*67e74705SXin Li
109*67e74705SXin Li // CHECK: define {{.*}} @[[D_INIT:.*]]()
110*67e74705SXin Li // CHECK: call i32 @_Z1gv()
111*67e74705SXin Li // CHECK-NEXT: store i32 %{{.*}}, i32* @_ZL1d, align 4
112*67e74705SXin Li
113*67e74705SXin Li // CHECK: define {{.*}} @[[U_M_INIT:.*]]()
114*67e74705SXin Li // CHECK: call i32 @_Z1fv()
115*67e74705SXin Li // CHECK-NEXT: store i32 %{{.*}}, i32* @_ZN1U1mE, align 4
116*67e74705SXin Li
117*67e74705SXin Li // CHECK: define {{.*}} @[[E_INIT:.*]]()
118*67e74705SXin Li // LINUX: call i32* @_ZTWN1VIiE1mE()
119*67e74705SXin Li // DARWIN: call cxx_fast_tlscc i32* @_ZTWN1VIiE1mE()
120*67e74705SXin Li // CHECK-NEXT: load i32, i32* %{{.*}}, align 4
121*67e74705SXin Li // CHECK-NEXT: store i32 %{{.*}}, i32* @e, align 4
122*67e74705SXin Li
123*67e74705SXin Li // LINUX-LABEL: define weak_odr hidden i32* @_ZTWN1VIiE1mE()
124*67e74705SXin Li // DARWIN-LABEL: define weak_odr hidden cxx_fast_tlscc i32* @_ZTWN1VIiE1mE()
125*67e74705SXin Li // LINUX: call void @_ZTHN1VIiE1mE()
126*67e74705SXin Li // DARWIN: call cxx_fast_tlscc void @_ZTHN1VIiE1mE()
127*67e74705SXin Li // CHECK: ret i32* @_ZN1VIiE1mE
128*67e74705SXin Li
129*67e74705SXin Li
130*67e74705SXin Li struct S { S(); ~S(); };
131*67e74705SXin Li struct T { ~T(); };
132*67e74705SXin Li
133*67e74705SXin Li // CHECK-LABEL: define void @_Z8tls_dtorv()
tls_dtor()134*67e74705SXin Li void tls_dtor() {
135*67e74705SXin Li // CHECK: load i8, i8* @_ZGVZ8tls_dtorvE1s
136*67e74705SXin Li // CHECK: call void @_ZN1SC1Ev(%struct.S* @_ZZ8tls_dtorvE1s)
137*67e74705SXin Li // LINUX: call i32 @__cxa_thread_atexit({{.*}}@_ZN1SD1Ev {{.*}} @_ZZ8tls_dtorvE1s{{.*}} @__dso_handle
138*67e74705SXin Li // DARWIN: call i32 @_tlv_atexit({{.*}}@_ZN1SD1Ev {{.*}} @_ZZ8tls_dtorvE1s{{.*}} @__dso_handle
139*67e74705SXin Li // CHECK: store i8 1, i8* @_ZGVZ8tls_dtorvE1s
140*67e74705SXin Li static thread_local S s;
141*67e74705SXin Li
142*67e74705SXin Li // CHECK: load i8, i8* @_ZGVZ8tls_dtorvE1t
143*67e74705SXin Li // CHECK-NOT: _ZN1T
144*67e74705SXin Li // LINUX: call i32 @__cxa_thread_atexit({{.*}}@_ZN1TD1Ev {{.*}}@_ZZ8tls_dtorvE1t{{.*}} @__dso_handle
145*67e74705SXin Li // DARWIN: call i32 @_tlv_atexit({{.*}}@_ZN1TD1Ev {{.*}}@_ZZ8tls_dtorvE1t{{.*}} @__dso_handle
146*67e74705SXin Li // CHECK: store i8 1, i8* @_ZGVZ8tls_dtorvE1t
147*67e74705SXin Li static thread_local T t;
148*67e74705SXin Li
149*67e74705SXin Li // CHECK: load i8, i8* @_ZGVZ8tls_dtorvE1u
150*67e74705SXin Li // CHECK: call void @_ZN1SC1Ev(%struct.S* @_ZGRZ8tls_dtorvE1u_)
151*67e74705SXin Li // LINUX: call i32 @__cxa_thread_atexit({{.*}}@_ZN1SD1Ev {{.*}} @_ZGRZ8tls_dtorvE1u_{{.*}} @__dso_handle
152*67e74705SXin Li // DARWIN: call i32 @_tlv_atexit({{.*}}@_ZN1SD1Ev {{.*}} @_ZGRZ8tls_dtorvE1u_{{.*}} @__dso_handle
153*67e74705SXin Li // CHECK: store i8 1, i8* @_ZGVZ8tls_dtorvE1u
154*67e74705SXin Li static thread_local const S &u = S();
155*67e74705SXin Li }
156*67e74705SXin Li
157*67e74705SXin Li // LINUX: declare i32 @__cxa_thread_atexit(void (i8*)*, i8*, i8*)
158*67e74705SXin Li // DARWIN: declare i32 @_tlv_atexit(void (i8*)*, i8*, i8*)
159*67e74705SXin Li
160*67e74705SXin Li // CHECK: define {{.*}} @_Z7PR15991v(
PR15991()161*67e74705SXin Li int PR15991() {
162*67e74705SXin Li thread_local int n;
163*67e74705SXin Li auto l = [] { return n; };
164*67e74705SXin Li return l();
165*67e74705SXin Li }
166*67e74705SXin Li
167*67e74705SXin Li struct PR19254 {
168*67e74705SXin Li static thread_local int n;
169*67e74705SXin Li int f();
170*67e74705SXin Li };
171*67e74705SXin Li // CHECK: define {{.*}} @_ZN7PR192541fEv(
f()172*67e74705SXin Li int PR19254::f() {
173*67e74705SXin Li // LINUX: call void @_ZTHN7PR192541nE(
174*67e74705SXin Li // DARWIN: call cxx_fast_tlscc i32* @_ZTWN7PR192541nE(
175*67e74705SXin Li return this->n;
176*67e74705SXin Li }
177*67e74705SXin Li
178*67e74705SXin Li namespace {
179*67e74705SXin Li thread_local int anon_i{1};
180*67e74705SXin Li }
set_anon_i()181*67e74705SXin Li void set_anon_i() {
182*67e74705SXin Li anon_i = 2;
183*67e74705SXin Li }
184*67e74705SXin Li // LINUX-LABEL: define internal i32* @_ZTWN12_GLOBAL__N_16anon_iE()
185*67e74705SXin Li // DARWIN-LABEL: define internal cxx_fast_tlscc i32* @_ZTWN12_GLOBAL__N_16anon_iE()
186*67e74705SXin Li
187*67e74705SXin Li // CHECK: define {{.*}} @[[V_M_INIT:.*]]()
188*67e74705SXin Li // CHECK: load i8, i8* bitcast (i64* @_ZGVN1VIiE1mE to i8*)
189*67e74705SXin Li // CHECK: %[[V_M_INITIALIZED:.*]] = icmp eq i8 %{{.*}}, 0
190*67e74705SXin Li // CHECK: br i1 %[[V_M_INITIALIZED]],
191*67e74705SXin Li // need init:
192*67e74705SXin Li // CHECK: call i32 @_Z1gv()
193*67e74705SXin Li // CHECK: store i32 %{{.*}}, i32* @_ZN1VIiE1mE, align 4
194*67e74705SXin Li // CHECK: store i64 1, i64* @_ZGVN1VIiE1mE
195*67e74705SXin Li // CHECK: br label
196*67e74705SXin Li
197*67e74705SXin Li // CHECK: define {{.*}}@[[GLOBAL_INIT:.*]]()
198*67e74705SXin Li // CHECK: call void @[[C_INIT]]()
199*67e74705SXin Li // CHECK: call void @[[E_INIT]]()
200*67e74705SXin Li
201*67e74705SXin Li
202*67e74705SXin Li // CHECK: define {{.*}}@__tls_init()
203*67e74705SXin Li // CHECK: load i8, i8* @__tls_guard
204*67e74705SXin Li // CHECK: %[[NEED_TLS_INIT:.*]] = icmp eq i8 %{{.*}}, 0
205*67e74705SXin Li // CHECK: br i1 %[[NEED_TLS_INIT]],
206*67e74705SXin Li // init:
207*67e74705SXin Li // CHECK: store i8 1, i8* @__tls_guard
208*67e74705SXin Li // CHECK: call void @[[A_INIT]]()
209*67e74705SXin Li // CHECK: call void @[[D_INIT]]()
210*67e74705SXin Li // CHECK: call void @[[U_M_INIT]]()
211*67e74705SXin Li // CHECK: call void @[[V_M_INIT]]()
212*67e74705SXin Li
213*67e74705SXin Li
214*67e74705SXin Li // LIUNX: define weak_odr hidden i32* @_ZTW1a() {
215*67e74705SXin Li // DARWIN: define cxx_fast_tlscc i32* @_ZTW1a()
216*67e74705SXin Li // LINUX: call void @_ZTH1a()
217*67e74705SXin Li // DARWIN: call cxx_fast_tlscc void @_ZTH1a()
218*67e74705SXin Li // CHECK: ret i32* @a
219*67e74705SXin Li // CHECK: }
220*67e74705SXin Li
221*67e74705SXin Li
222*67e74705SXin Li // LINUX: declare extern_weak void @_ZTH1b() [[ATTR:#[0-9]+]]
223*67e74705SXin Li
224*67e74705SXin Li
225*67e74705SXin Li // LINUX-LABEL: define internal i32* @_ZTWL1d()
226*67e74705SXin Li // DARWIN-LABEL: define internal cxx_fast_tlscc i32* @_ZTWL1d()
227*67e74705SXin Li // LINUX: call void @_ZTHL1d()
228*67e74705SXin Li // DARWIN: call cxx_fast_tlscc void @_ZTHL1d()
229*67e74705SXin Li // CHECK: ret i32* @_ZL1d
230*67e74705SXin Li
231*67e74705SXin Li // LINUX-LABEL: define weak_odr hidden i32* @_ZTWN1U1mE()
232*67e74705SXin Li // DARWIN-LABEL: define cxx_fast_tlscc i32* @_ZTWN1U1mE()
233*67e74705SXin Li // LINUX: call void @_ZTHN1U1mE()
234*67e74705SXin Li // DARWIN: call cxx_fast_tlscc void @_ZTHN1U1mE()
235*67e74705SXin Li // CHECK: ret i32* @_ZN1U1mE
236*67e74705SXin Li
237*67e74705SXin Li // LINUX: attributes [[ATTR]] = { {{.+}} }
238