1 ; RUN: llc -emulated-tls -mtriple=arm-linux-android \
2 ; RUN: -relocation-model=pic < %s | FileCheck -check-prefix=ARM32 %s
4 ; Copied from X86/emutls.ll
6 ; Use my_emutls_get_address like __emutls_get_address.
7 @my_emutls_v_xyz = external global i8*, align 4
8 declare i8* @my_emutls_get_address(i8*)
10 define i32 @my_get_xyz() {
11 ; ARM32-LABEL: my_get_xyz:
13 ; ARM32: ldr r0, [pc, r0]
14 ; ARM32-NEXT: bl my_emutls_get_address(PLT)
15 ; ARM32-NEXT: ldr r0, [r0]
18 %call = call i8* @my_emutls_get_address(i8* bitcast (i8** @my_emutls_v_xyz to i8*))
19 %0 = bitcast i8* %call to i32*
20 %1 = load i32, i32* %0, align 4
24 @i1 = thread_local global i32 15
25 @i2 = external thread_local global i32
26 @i3 = internal thread_local global i32 15
27 @i4 = hidden thread_local global i32 15
28 @i5 = external hidden thread_local global i32
29 @s1 = thread_local global i16 15
30 @b1 = thread_local global i8 0
35 ; ARM32: ldr r0, [pc, r0]
36 ; ARM32-NEXT: bl __emutls_get_address(PLT)
37 ; ARM32-NEXT: ldr r0, [r0]
40 %tmp1 = load i32, i32* @i1
47 ; ARM32: ldr r0, [pc, r0]
48 ; ARM32-NEXT: bl __emutls_get_address(PLT)
55 define i32 @f3() nounwind {
58 ; ARM32: ldr r0, [pc, r0]
59 ; ARM32-NEXT: bl __emutls_get_address(PLT)
60 ; ARM32-NEXT: ldr r0, [r0]
63 %tmp1 = load i32, i32* @i2
70 ; ARM32: ldr r0, [pc, r0]
71 ; ARM32-NEXT: bl __emutls_get_address(PLT)
78 define i32 @f5() nounwind {
81 ; ARM32: ldr r0, [pc, r0]
82 ; ARM32-NEXT: bl __emutls_get_address(PLT)
83 ; ARM32-NEXT: ldr r0, [r0]
86 %tmp1 = load i32, i32* @i3
93 ; ARM32: ldr r0, [pc, r0]
94 ; ARM32-NEXT: bl __emutls_get_address(PLT)
104 ; ARM32: ldr r0, [pc, r0]
105 ; ARM32-NEXT: bl __emutls_get_address(PLT)
106 ; ARM32-NEXT: ldr r0, [r0]
109 %tmp1 = load i32, i32* @i4
116 ; ARM32: ldr r0, [pc, r0]
117 ; ARM32-NEXT: bl __emutls_get_address(PLT)
127 ; ARM32: ldr r0, [pc, r0]
128 ; ARM32-NEXT: bl __emutls_get_address(PLT)
129 ; ARM32-NEXT: ldr r0, [r0]
132 %tmp1 = load i32, i32* @i5
139 ; ARM32: ldr r0, [pc, r0]
140 ; ARM32-NEXT: bl __emutls_get_address(PLT)
150 ; ARM32: ldr r0, [pc, r0]
151 ; ARM32-NEXT: bl __emutls_get_address(PLT)
152 ; ARM32-NEXT: ldrh r0, [r0]
155 %tmp1 = load i16, i16* @s1
162 ; ARM32: ldr r0, [pc, r0]
163 ; ARM32-NEXT: bl __emutls_get_address(PLT)
164 ; ARM32-NEXT: ldrsh r0, [r0]
167 %tmp1 = load i16, i16* @s1
168 %tmp2 = sext i16 %tmp1 to i32
175 ; ARM32: ldr r0, [pc, r0]
176 ; ARM32-NEXT: bl __emutls_get_address(PLT)
177 ; ARM32-NEXT: ldrb r0, [r0]
181 %tmp1 = load i8, i8* @b1
188 ; ARM32: ldr r0, [pc, r0]
189 ; ARM32-NEXT: bl __emutls_get_address(PLT)
190 ; ARM32-NEXT: ldrsb r0, [r0]
194 %tmp1 = load i8, i8* @b1
195 %tmp2 = sext i8 %tmp1 to i32
199 ;;;;;;;;;;;;;; 32-bit __emutls_v. and __emutls_t.
201 ; ARM32 .section .data.rel.local,
202 ; ARM32-LABEL: __emutls_v.i1:
203 ; ARM32-NEXT: .long 4
204 ; ARM32-NEXT: .long 4
205 ; ARM32-NEXT: .long 0
206 ; ARM32-NEXT: .long __emutls_t.i1
208 ; ARM32 .section .rodata,
209 ; ARM32-LABEL: __emutls_t.i1:
210 ; ARM32-NEXT: .long 15
212 ; ARM32-NOT: __emutls_v.i2
214 ; ARM32 .section .data.rel.local,
215 ; ARM32-LABEL: __emutls_v.i3:
216 ; ARM32-NEXT: .long 4
217 ; ARM32-NEXT: .long 4
218 ; ARM32-NEXT: .long 0
219 ; ARM32-NEXT: .long __emutls_t.i3
221 ; ARM32 .section .rodata,
222 ; ARM32-LABEL: __emutls_t.i3:
223 ; ARM32-NEXT: .long 15
225 ; ARM32 .section .data.rel.local,
226 ; ARM32-LABEL: __emutls_v.i4:
227 ; ARM32-NEXT: .long 4
228 ; ARM32-NEXT: .long 4
229 ; ARM32-NEXT: .long 0
230 ; ARM32-NEXT: .long __emutls_t.i4
232 ; ARM32 .section .rodata,
233 ; ARM32-LABEL: __emutls_t.i4:
234 ; ARM32-NEXT: .long 15
236 ; ARM32-NOT: __emutls_v.i5:
237 ; ARM32 .hidden __emutls_v.i5
238 ; ARM32-NOT: __emutls_v.i5:
240 ; ARM32 .section .data.rel.local,
241 ; ARM32-LABEL: __emutls_v.s1:
242 ; ARM32-NEXT: .long 2
243 ; ARM32-NEXT: .long 2
244 ; ARM32-NEXT: .long 0
245 ; ARM32-NEXT: .long __emutls_t.s1
247 ; ARM32 .section .rodata,
248 ; ARM32-LABEL: __emutls_t.s1:
249 ; ARM32-NEXT: .short 15
251 ; ARM32 .section .data.rel.local,
252 ; ARM32-LABEL: __emutls_v.b1:
253 ; ARM32-NEXT: .long 1
254 ; ARM32-NEXT: .long 1
255 ; ARM32-NEXT: .long 0
256 ; ARM32-NEXT: .long 0
258 ; ARM32-NOT: __emutls_t.b1