xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/emutls.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -emulated-tls -mtriple=arm-linux-android \
2*9880d681SAndroid Build Coastguard Worker; RUN:     -relocation-model=pic < %s | FileCheck -check-prefix=ARM32 %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Copied from X86/emutls.ll
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Use my_emutls_get_address like __emutls_get_address.
7*9880d681SAndroid Build Coastguard Worker@my_emutls_v_xyz = external global i8*, align 4
8*9880d681SAndroid Build Coastguard Workerdeclare i8* @my_emutls_get_address(i8*)
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdefine i32 @my_get_xyz() {
11*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: my_get_xyz:
12*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
13*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0, [pc, r0]
14*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl my_emutls_get_address
15*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   ldr r0, [r0]
16*9880d681SAndroid Build Coastguard Worker; ARM32:        .long my_emutls_v_xyz(GOT_PREL)
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerentry:
19*9880d681SAndroid Build Coastguard Worker  %call = call i8* @my_emutls_get_address(i8* bitcast (i8** @my_emutls_v_xyz to i8*))
20*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i8* %call to i32*
21*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %0, align 4
22*9880d681SAndroid Build Coastguard Worker  ret i32 %1
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker@i1 = thread_local global i32 15
26*9880d681SAndroid Build Coastguard Worker@i2 = external thread_local global i32
27*9880d681SAndroid Build Coastguard Worker@i3 = internal thread_local global i32 15
28*9880d681SAndroid Build Coastguard Worker@i4 = hidden thread_local global i32 15
29*9880d681SAndroid Build Coastguard Worker@i5 = external hidden thread_local global i32
30*9880d681SAndroid Build Coastguard Worker@s1 = thread_local global i16 15
31*9880d681SAndroid Build Coastguard Worker@b1 = thread_local global i8 0
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdefine i32 @f1() {
34*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f1:
35*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
36*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0, [pc, r0]
37*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
38*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   ldr r0, [r0]
39*9880d681SAndroid Build Coastguard Worker; ARM32:        .long __emutls_v.i1(GOT_PREL)
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerentry:
42*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* @i1
43*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp1
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine i32* @f2() {
47*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f2:
48*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
49*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0, [pc, r0]
50*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
51*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   pop
52*9880d681SAndroid Build Coastguard Worker; ARM32:        .long __emutls_v.i1(GOT_PREL)
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerentry:
55*9880d681SAndroid Build Coastguard Worker  ret i32* @i1
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Workerdefine i32 @f3() nounwind {
59*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f3:
60*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
61*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0, [pc, r0]
62*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
63*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   ldr r0, [r0]
64*9880d681SAndroid Build Coastguard Worker; ARM32:        .long __emutls_v.i2(GOT_PREL)
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerentry:
67*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* @i2
68*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp1
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdefine i32* @f4() {
72*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f4:
73*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
74*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0, [pc, r0]
75*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
76*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   pop
77*9880d681SAndroid Build Coastguard Worker; ARM32:        .long __emutls_v.i2(GOT_PREL)
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerentry:
80*9880d681SAndroid Build Coastguard Worker  ret i32* @i2
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerdefine i32 @f5() nounwind {
84*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f5:
85*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
86*9880d681SAndroid Build Coastguard Worker; ARM32:        add	r0, pc, r0
87*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
88*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   ldr r0, [r0]
89*9880d681SAndroid Build Coastguard Worker; ARM32:        .long __emutls_v.i3-
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerentry:
92*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* @i3
93*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp1
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerdefine i32* @f6() {
97*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f6:
98*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
99*9880d681SAndroid Build Coastguard Worker; ARM32:        add	r0, pc, r0
100*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
101*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   pop
102*9880d681SAndroid Build Coastguard Worker; ARM32:        .long __emutls_v.i3-
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Workerentry:
105*9880d681SAndroid Build Coastguard Worker  ret i32* @i3
106*9880d681SAndroid Build Coastguard Worker}
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Workerdefine i32 @f7() {
109*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f7:
110*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
111*9880d681SAndroid Build Coastguard Worker; ARM32:        add r0, pc, r0
112*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
113*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   ldr r0, [r0]
114*9880d681SAndroid Build Coastguard Worker; ARM32:        .long __emutls_v.i4-(.LPC
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerentry:
117*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* @i4
118*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp1
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerdefine i32* @f8() {
122*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f8:
123*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
124*9880d681SAndroid Build Coastguard Worker; ARM32:        add r0, pc, r0
125*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
126*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   pop
127*9880d681SAndroid Build Coastguard Worker; ARM32:        .long __emutls_v.i4-(.LPC
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Workerentry:
130*9880d681SAndroid Build Coastguard Worker  ret i32* @i4
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerdefine i32 @f9() {
134*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f9:
135*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
136*9880d681SAndroid Build Coastguard Worker; ARM32:        add r0, pc, r0
137*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
138*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   ldr r0, [r0]
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerentry:
141*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* @i5
142*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp1
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerdefine i32* @f10() {
146*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f10:
147*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
148*9880d681SAndroid Build Coastguard Worker; ARM32:        add r0, pc, r0
149*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
150*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   pop
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerentry:
153*9880d681SAndroid Build Coastguard Worker  ret i32* @i5
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerdefine i16 @f11() {
157*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f11:
158*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
159*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0, [pc, r0]
160*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
161*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   ldrh r0, [r0]
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerentry:
164*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i16, i16* @s1
165*9880d681SAndroid Build Coastguard Worker  ret i16 %tmp1
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workerdefine i32 @f12() {
169*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f12:
170*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
171*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0, [pc, r0]
172*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
173*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   ldrsh r0, [r0]
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerentry:
176*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i16, i16* @s1
177*9880d681SAndroid Build Coastguard Worker  %tmp2 = sext i16 %tmp1 to i32
178*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp2
179*9880d681SAndroid Build Coastguard Worker}
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Workerdefine i8 @f13() {
182*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f13:
183*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
184*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0, [pc, r0]
185*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
186*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   ldrb r0, [r0]
187*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: pop
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Workerentry:
190*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i8, i8* @b1
191*9880d681SAndroid Build Coastguard Worker  ret i8 %tmp1
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workerdefine i32 @f14() {
195*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: f14:
196*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0,
197*9880d681SAndroid Build Coastguard Worker; ARM32:        ldr r0, [pc, r0]
198*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   bl __emutls_get_address
199*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT:   ldrsb r0, [r0]
200*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: pop
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Workerentry:
203*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i8, i8* @b1
204*9880d681SAndroid Build Coastguard Worker  %tmp2 = sext i8 %tmp1 to i32
205*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp2
206*9880d681SAndroid Build Coastguard Worker}
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker;;;;;;;;;;;;;; 32-bit __emutls_v. and __emutls_t.
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker; ARM32:      .data{{$}}
211*9880d681SAndroid Build Coastguard Worker; ARM32:      .globl __emutls_v.i1
212*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_v.i1:
213*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 4
214*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 4
215*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 0
216*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long __emutls_t.i1
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker; ARM32:      .section .rodata,
219*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_t.i1:
220*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 15
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker; ARM32-NOT:   __emutls_v.i2
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker; ARM32:      .data{{$}}
225*9880d681SAndroid Build Coastguard Worker; ARM32-NOT:  .globl
226*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_v.i3:
227*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 4
228*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 4
229*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 0
230*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long __emutls_t.i3
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker; ARM32:      .section .rodata,
233*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_t.i3:
234*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 15
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Worker; ARM32:      .data{{$}}
237*9880d681SAndroid Build Coastguard Worker; ARM32:      .globl __emutls_v.i4
238*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_v.i4:
239*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 4
240*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 4
241*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 0
242*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long __emutls_t.i4
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker; ARM32:      .section .rodata,
245*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_t.i4:
246*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 15
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Worker; ARM32-NOT:   __emutls_v.i5:
249*9880d681SAndroid Build Coastguard Worker; ARM32:      .hidden __emutls_v.i5
250*9880d681SAndroid Build Coastguard Worker; ARM32-NOT:   __emutls_v.i5:
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Worker; ARM32:      .data{{$}}
253*9880d681SAndroid Build Coastguard Worker; ARM32:      .globl __emutls_v.s1
254*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_v.s1:
255*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 2
256*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 2
257*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 0
258*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long __emutls_t.s1
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker; ARM32 .section .rodata,
261*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_t.s1:
262*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .short 15
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Worker; ARM32:      .data{{$}}
265*9880d681SAndroid Build Coastguard Worker; ARM32:      .globl __emutls_v.b1
266*9880d681SAndroid Build Coastguard Worker; ARM32-LABEL: __emutls_v.b1:
267*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 1
268*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 1
269*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 0
270*9880d681SAndroid Build Coastguard Worker; ARM32-NEXT: .long 0
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Worker; ARM32-NOT:   __emutls_t.b1
273