xref: /aosp_15_r20/external/clang/test/CodeGen/tls-model.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -triple x86_64-pc-linux-gnu -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-GD
2*67e74705SXin Li // RUN: %clang_cc1 %s -triple x86_64-pc-linux-gnu -ftls-model=global-dynamic -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-GD
3*67e74705SXin Li // RUN: %clang_cc1 %s -triple x86_64-pc-linux-gnu -ftls-model=local-dynamic -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-LD
4*67e74705SXin Li // RUN: %clang_cc1 %s -triple x86_64-pc-linux-gnu -ftls-model=initial-exec -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-IE
5*67e74705SXin Li // RUN: %clang_cc1 %s -triple x86_64-pc-linux-gnu -ftls-model=local-exec -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-LE
6*67e74705SXin Li //
7*67e74705SXin Li // RUN: %clang_cc1 %s -triple x86_64-pc-linux-gnu -femulated-tls -emit-llvm -o - 2>&1 | \
8*67e74705SXin Li // RUN:     FileCheck %s -check-prefix=CHECK-GD
9*67e74705SXin Li 
10*67e74705SXin Li int z1 = 0;
11*67e74705SXin Li int z2;
12*67e74705SXin Li int __thread x;
f()13*67e74705SXin Li int f() {
14*67e74705SXin Li   static int __thread y;
15*67e74705SXin Li   return y++;
16*67e74705SXin Li }
17*67e74705SXin Li int __thread __attribute__((tls_model("initial-exec"))) z;
18*67e74705SXin Li 
19*67e74705SXin Li // Note that unlike normal C uninitialized global variables,
20*67e74705SXin Li // uninitialized TLS variables do NOT have COMMON linkage.
21*67e74705SXin Li 
22*67e74705SXin Li // CHECK-GD: @z1 = global i32 0
23*67e74705SXin Li // CHECK-GD: @f.y = internal thread_local global i32 0
24*67e74705SXin Li // CHECK-GD: @z2 = common global i32 0
25*67e74705SXin Li // CHECK-GD: @x = thread_local global i32 0
26*67e74705SXin Li // CHECK-GD: @z = thread_local(initialexec) global i32 0
27*67e74705SXin Li 
28*67e74705SXin Li // CHECK-LD: @z1 = global i32 0
29*67e74705SXin Li // CHECK-LD: @f.y = internal thread_local(localdynamic) global i32 0
30*67e74705SXin Li // CHECK-LD: @z2 = common global i32 0
31*67e74705SXin Li // CHECK-LD: @x = thread_local(localdynamic) global i32 0
32*67e74705SXin Li // CHECK-LD: @z = thread_local(initialexec) global i32 0
33*67e74705SXin Li 
34*67e74705SXin Li // CHECK-IE: @z1 = global i32 0
35*67e74705SXin Li // CHECK-IE: @f.y = internal thread_local(initialexec) global i32 0
36*67e74705SXin Li // CHECK-IE: @z2 = common global i32 0
37*67e74705SXin Li // CHECK-IE: @x = thread_local(initialexec) global i32 0
38*67e74705SXin Li // CHECK-IE: @z = thread_local(initialexec) global i32 0
39*67e74705SXin Li 
40*67e74705SXin Li // CHECK-LE: @z1 = global i32 0
41*67e74705SXin Li // CHECK-LE: @f.y = internal thread_local(localexec) global i32 0
42*67e74705SXin Li // CHECK-LE: @z2 = common global i32 0
43*67e74705SXin Li // CHECK-LE: @x = thread_local(localexec) global i32 0
44*67e74705SXin Li // CHECK-LE: @z = thread_local(initialexec) global i32 0
45