1
- // RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++2a %s -emit-llvm -o - | FileCheck %s
1
+ // RUN: %clang_cc1 -triple x86_64-linux-gnu -std=c++2a %s -emit-llvm -o - | FileCheck --check-prefix=CHECK --check-prefix=LINUX %s
2
+ // RUN: %clang_cc1 -triple x86_64-apple-darwin12 -std=c++2a %s -emit-llvm -o - | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s
3
+
4
+ // Check variable definitions/declarations. Note that on Darwin, typically the
5
+ // variable's symbol is marked internal, and only the _ZTW function is
6
+ // exported. Except: constinit variables do get exported, even on darwin.
7
+
8
+ // CHECK-DAG: @a = external thread_local global i32
9
+ // CHECK-DAG: @b = external thread_local global i32
10
+ // LINUX-DAG: @c = thread_local global i32 0, align 4
11
+ // DARWIN-DAG: @c = internal thread_local global i32 0, align 4
12
+ // LINUX-DAG: @d = thread_local global i32 0, align 4
13
+ // DARWIN-DAG: @d = internal thread_local global i32 0, align 4
14
+ // CHECK-DAG: @e = external thread_local global %struct.Destructed, align 4
15
+ // CHECK-DAG: @e2 = thread_local global %struct.Destructed zeroinitializer, align 4
16
+ // CHECK-DAG: @f = thread_local global i32 4, align 4
2
17
3
- // CHECK-DAG: @a = external thread_local global i32
4
18
extern thread_local int a;
5
-
6
- // CHECK-DAG: @b = external thread_local global i32
7
19
extern thread_local constinit int b;
8
20
9
- // CHECK-LABEL: define i32 @_Z1fv ()
10
- // CHECK: call i32* @_ZTW1a()
21
+ // CHECK-LABEL: define i32 @_Z5get_av ()
22
+ // CHECK: call {{(cxx_fast_tlscc )?}} i32* @_ZTW1a()
11
23
// CHECK: }
12
- int f () { return a; }
24
+ int get_a () { return a; }
13
25
14
- // CHECK-LABEL: define linkonce_odr {{.*}} @_ZTW1a()
15
- // CHECK: br i1
16
- // CHECK: call void @_ZTH1a()
17
- // CHECK: }
26
+ // LINUX-LABEL: define linkonce_odr {{.*}} @_ZTW1a()
27
+ // LINUX: br i1
28
+ // LINUX: call void @_ZTH1a()
29
+ // LINUX: }
30
+ // DARWIN-NOT: define {{.*}}@_ZTW1a()
18
31
19
- // CHECK-LABEL: define i32 @_Z1gv ()
32
+ // CHECK-LABEL: define i32 @_Z5get_bv ()
20
33
// CHECK-NOT: call
21
34
// CHECK: load i32, i32* @b
22
35
// CHECK-NOT: call
23
36
// CHECK: }
24
- int g () { return b; }
37
+ int get_b () { return b; }
25
38
26
39
// CHECK-NOT: define {{.*}} @_ZTW1b()
27
40
28
41
extern thread_local int c;
29
42
30
- // CHECK-LABEL: define i32 @_Z1hv ()
31
- // CHECK : call i32* @_ZTW1c()
43
+ // CHECK-LABEL: define i32 @_Z5get_cv ()
44
+ // LINUX : call {{(cxx_fast_tlscc )?}} i32* @_ZTW1c()
32
45
// CHECK: load i32, i32* %
33
46
// CHECK: }
34
- int h () { return c; }
47
+ int get_c () { return c; }
35
48
36
49
// Note: use of 'c' does not trigger initialization of 'd', because 'c' has a
37
50
// constant initializer.
38
- // CHECK-LABEL: define weak_odr {{.*}} @_ZTW1c()
51
+ // DARWIN-LABEL: define cxx_fast_tlscc {{.*}} @_ZTW1c()
52
+ // LINUX-LABEL: define weak_odr {{.*}} @_ZTW1c()
39
53
// CHECK-NOT: br i1
40
54
// CHECK-NOT: call
41
55
// CHECK: ret i32* @c
@@ -55,15 +69,18 @@ struct Destructed {
55
69
};
56
70
57
71
extern thread_local constinit Destructed e;
58
- // CHECK-LABEL: define i32 @_Z1iv ()
72
+ // CHECK-LABEL: define i32 @_Z5get_ev ()
59
73
// CHECK: call {{.*}}* @_ZTW1e()
60
74
// CHECK: }
61
- int i () { return e.n ; }
75
+ int get_e () { return e.n ; }
62
76
63
77
// CHECK: define {{.*}}[[E2_INIT:@__cxx_global_var_init[^(]*]](
64
- // CHECK: call {{.*}} @__cxa_thread_atexit({{.*}} @_ZN10DestructedD1Ev {{.*}} @e2
78
+ // LINUX: call {{.*}} @__cxa_thread_atexit({{.*}} @_ZN10DestructedD1Ev {{.*}} @e2
79
+ // DARWIN: call {{.*}} @_tlv_atexit({{.*}} @_ZN10DestructedD1Ev {{.*}} @e2
65
80
thread_local constinit Destructed e2 ;
66
81
82
+ thread_local constinit int f = 4 ;
83
+
67
84
// CHECK-LABEL: define {{.*}}__tls_init
68
85
// CHECK: call {{.*}} [[D_INIT]]
69
86
// CHECK: call {{.*}} [[E2_INIT]]
0 commit comments