xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/tls-models.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm -mtriple=arm-linux-gnueabi < %s \
2*9880d681SAndroid Build Coastguard Worker; RUN:     | FileCheck -check-prefix=CHECK-NONPIC -check-prefix=COMMON %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=arm -mtriple=arm-linux-gnueabi -relocation-model=pic < %s \
4*9880d681SAndroid Build Coastguard Worker; RUN:     | FileCheck -check-prefix=CHECK-PIC  -check-prefix=COMMON %s
5*9880d681SAndroid Build Coastguard Worker; RUN: llc -emulated-tls -march=arm -mtriple=arm-linux-gnueabi < %s \
6*9880d681SAndroid Build Coastguard Worker; RUN:     | FileCheck -check-prefix=EMUNONPIC -check-prefix=EMU -check-prefix=COMMON %s
7*9880d681SAndroid Build Coastguard Worker; RUN: llc -emulated-tls -march=arm -mtriple=arm-linux-gnueabi -relocation-model=pic < %s \
8*9880d681SAndroid Build Coastguard Worker; RUN:     | FileCheck -check-prefix=EMUPIC -check-prefix=EMU -check-prefix=COMMON %s
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker@external_gd = external thread_local global i32
12*9880d681SAndroid Build Coastguard Worker@internal_gd = internal thread_local global i32 42
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker@external_ld = external thread_local(localdynamic) global i32
15*9880d681SAndroid Build Coastguard Worker@internal_ld = internal thread_local(localdynamic) global i32 42
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker@external_ie = external thread_local(initialexec) global i32
18*9880d681SAndroid Build Coastguard Worker@internal_ie = internal thread_local(initialexec) global i32 42
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker@external_le = external thread_local(localexec) global i32
21*9880d681SAndroid Build Coastguard Worker@internal_le = internal thread_local(localexec) global i32 42
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker; ----- no model specified -----
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine i32* @f1() {
26*9880d681SAndroid Build Coastguard Workerentry:
27*9880d681SAndroid Build Coastguard Worker  ret i32* @external_gd
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker  ; COMMON-LABEL:   f1:
30*9880d681SAndroid Build Coastguard Worker  ; Non-PIC code can use initial-exec, PIC code has to use general dynamic.
31*9880d681SAndroid Build Coastguard Worker  ; CHECK-NONPIC:   external_gd(GOTTPOFF)
32*9880d681SAndroid Build Coastguard Worker  ; CHECK-PIC:      external_gd(TLSGD)
33*9880d681SAndroid Build Coastguard Worker  ; EMU:            __emutls_get_address
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdefine i32* @f2() {
37*9880d681SAndroid Build Coastguard Workerentry:
38*9880d681SAndroid Build Coastguard Worker  ret i32* @internal_gd
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker  ; COMMON-LABEL:   f2:
41*9880d681SAndroid Build Coastguard Worker  ; Non-PIC code can use local exec, PIC code can use local dynamic,
42*9880d681SAndroid Build Coastguard Worker  ; but that is not implemented, so falls back to general dynamic.
43*9880d681SAndroid Build Coastguard Worker  ; CHECK-NONPIC:   internal_gd(TPOFF)
44*9880d681SAndroid Build Coastguard Worker  ; CHECK-PIC:      internal_gd(TLSGD)
45*9880d681SAndroid Build Coastguard Worker  ; EMU:            __emutls_get_address
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker; ----- localdynamic specified -----
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdefine i32* @f3() {
52*9880d681SAndroid Build Coastguard Workerentry:
53*9880d681SAndroid Build Coastguard Worker  ret i32* @external_ld
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker  ; COMMON-LABEL:   f3:
56*9880d681SAndroid Build Coastguard Worker  ; Non-PIC code can use initial exec, PIC should use local dynamic,
57*9880d681SAndroid Build Coastguard Worker  ; but that is not implemented, so falls back to general dynamic.
58*9880d681SAndroid Build Coastguard Worker  ; CHECK-NONPIC:   external_ld(GOTTPOFF)
59*9880d681SAndroid Build Coastguard Worker  ; CHECK-PIC:      external_ld(TLSGD)
60*9880d681SAndroid Build Coastguard Worker  ; EMU:            __emutls_get_address
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine i32* @f4() {
64*9880d681SAndroid Build Coastguard Workerentry:
65*9880d681SAndroid Build Coastguard Worker  ret i32* @internal_ld
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Worker  ; COMMON-LABEL:   f4:
68*9880d681SAndroid Build Coastguard Worker  ; Non-PIC code can use local exec, PIC code can use local dynamic,
69*9880d681SAndroid Build Coastguard Worker  ; but that is not implemented, so it falls back to general dynamic.
70*9880d681SAndroid Build Coastguard Worker  ; CHECK-NONPIC:   internal_ld(TPOFF)
71*9880d681SAndroid Build Coastguard Worker  ; CHECK-PIC:      internal_ld(TLSGD)
72*9880d681SAndroid Build Coastguard Worker  ; EMU:            __emutls_get_address
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker; ----- initialexec specified -----
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerdefine i32* @f5() {
79*9880d681SAndroid Build Coastguard Workerentry:
80*9880d681SAndroid Build Coastguard Worker  ret i32* @external_ie
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker  ; COMMON-LABEL:   f5:
83*9880d681SAndroid Build Coastguard Worker  ; Non-PIC and PIC code will use initial exec as specified.
84*9880d681SAndroid Build Coastguard Worker  ; CHECK-NONPIC:   external_ie(GOTTPOFF)
85*9880d681SAndroid Build Coastguard Worker  ; CHECK-PIC:      external_ie(GOTTPOFF)
86*9880d681SAndroid Build Coastguard Worker  ; EMU:            __emutls_get_address
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine i32* @f6() {
90*9880d681SAndroid Build Coastguard Workerentry:
91*9880d681SAndroid Build Coastguard Worker  ret i32* @internal_ie
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker  ; COMMON-LABEL:   f6:
94*9880d681SAndroid Build Coastguard Worker  ; Non-PIC code can use local exec, PIC code use initial exec as specified.
95*9880d681SAndroid Build Coastguard Worker  ; CHECK-NONPIC:   internal_ie(TPOFF)
96*9880d681SAndroid Build Coastguard Worker  ; CHECK-PIC:      internal_ie(GOTTPOFF)
97*9880d681SAndroid Build Coastguard Worker  ; EMU:            __emutls_get_address
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker; ----- localexec specified -----
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine i32* @f7() {
104*9880d681SAndroid Build Coastguard Workerentry:
105*9880d681SAndroid Build Coastguard Worker  ret i32* @external_le
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker  ; COMMON-LABEL:   f7:
108*9880d681SAndroid Build Coastguard Worker  ; Non-PIC and PIC code will use local exec as specified.
109*9880d681SAndroid Build Coastguard Worker  ; CHECK-NONPIC:   external_le(TPOFF)
110*9880d681SAndroid Build Coastguard Worker  ; CHECK-PIC:      external_le(TPOFF)
111*9880d681SAndroid Build Coastguard Worker  ; EMU:            __emutls_get_address
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdefine i32* @f8() {
115*9880d681SAndroid Build Coastguard Workerentry:
116*9880d681SAndroid Build Coastguard Worker  ret i32* @internal_le
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker  ; COMMON-LABEL:   f8:
119*9880d681SAndroid Build Coastguard Worker  ; Non-PIC and PIC code will use local exec as specified.
120*9880d681SAndroid Build Coastguard Worker  ; CHECK-NONPIC:   internal_le(TPOFF)
121*9880d681SAndroid Build Coastguard Worker  ; CHECK-PIC:      internal_le(TPOFF)
122*9880d681SAndroid Build Coastguard Worker  ; EMU:            __emutls_get_address
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker; ----- emulated specified -----
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker; External declaration has no initializer.
129*9880d681SAndroid Build Coastguard Worker; Internal definition has initializer.
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; EMU-NOT:   __emutls_t.external_gd
132*9880d681SAndroid Build Coastguard Worker; EMU-NOT:   __emutls_v.external_gd
133*9880d681SAndroid Build Coastguard Worker; EMU:       .p2align 2
134*9880d681SAndroid Build Coastguard Worker; EMU-LABEL: __emutls_v.internal_gd:
135*9880d681SAndroid Build Coastguard Worker; EMU-NEXT:  .long 4
136*9880d681SAndroid Build Coastguard Worker; EMU-NEXT:  .long 4
137*9880d681SAndroid Build Coastguard Worker; EMU-NEXT:  .long 0
138*9880d681SAndroid Build Coastguard Worker; EMU-NEXT:  .long __emutls_t.internal_gd
139*9880d681SAndroid Build Coastguard Worker; EMU-LABEL: __emutls_t.internal_gd:
140*9880d681SAndroid Build Coastguard Worker; EMU-NEXT:  .long 42
141*9880d681SAndroid Build Coastguard Worker; EMU-NOT:   __emutls_t.external_gd
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker; __emutls_t and __emutls_v are the same for PIC and non-PIC modes.
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker; EMU-NOT:   __emutls_t.external_gd
146*9880d681SAndroid Build Coastguard Worker; EMU-NOT:   __emutls_v.external_gd
147*9880d681SAndroid Build Coastguard Worker; EMU:       .p2align 2
148*9880d681SAndroid Build Coastguard Worker; EMU-LABEL: __emutls_v.internal_le:
149*9880d681SAndroid Build Coastguard Worker; EMU-NEXT:  .long 4
150*9880d681SAndroid Build Coastguard Worker; EMU-NEXT:  .long 4
151*9880d681SAndroid Build Coastguard Worker; EMU-NEXT:  .long 0
152*9880d681SAndroid Build Coastguard Worker; EMU-NEXT:  .long __emutls_t.internal_le
153*9880d681SAndroid Build Coastguard Worker; EMU-LABEL: __emutls_t.internal_le:
154*9880d681SAndroid Build Coastguard Worker; EMU-NEXT:  .long 42
155*9880d681SAndroid Build Coastguard Worker; EMU-NOT:   __emutls_t.external_le
156