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