1 ; RUN: llc < %s -emulated-tls -mtriple=arm-linux-android -relocation-model=pic \
2 ; RUN: | FileCheck -check-prefix=ARM_32 %s
3 ; RUN: llc < %s -emulated-tls -mtriple=arm-linux-androidabi -relocation-model=pic \
4 ; RUN: | FileCheck -check-prefix=ARM_32 %s
5 ; RUN: llc < %s -emulated-tls -mtriple=aarch64-linux-android -relocation-model=pic \
6 ; RUN: | FileCheck -check-prefix=ARM_64 %s
7 ; RUN: llc < %s -emulated-tls -mtriple=arm-linux-androidabi -relocation-model=pic -O3 \
8 ; RUN: | FileCheck -check-prefix=ARM_32 %s
9 ; RUN: llc < %s -emulated-tls -mtriple=aarch64-linux-android -relocation-model=pic -O3 \
10 ; RUN: | FileCheck -check-prefix=ARM_64 %s
11 ; RUN: llc < %s -emulated-tls -mtriple=arm-linux-androidabi -O3 \
12 ; RUN: | FileCheck -check-prefix=ARM_32 %s
13 ; RUN: llc < %s -emulated-tls -mtriple=aarch64-linux-android -O3 \
14 ; RUN: | FileCheck -check-prefix=ARM_64 %s
15 ; RUN: llc < %s -emulated-tls -mtriple=i686-linux-android -relocation-model=pic \
16 ; RUN: | FileCheck -check-prefix=X86_32 %s
17 ; RUN: llc < %s -emulated-tls -mtriple=x86_64-linux-android -march=x86 -relocation-model=pic \
18 ; RUN: | FileCheck -check-prefix=X86_32 %s
19 ; RUN: llc < %s -emulated-tls -mtriple=x86_64-linux-android -relocation-model=pic \
20 ; RUN: | FileCheck -check-prefix=X86_64 %s
21 ; RUN: llc < %s -emulated-tls -mtriple=mipsel-linux-android -relocation-model=pic \
22 ; RUN: | FileCheck -check-prefix=MIPS_32 %s
23 ; RUN: llc < %s -emulated-tls -mtriple=mips64el-linux-android -relocation-model=pic \
24 ; RUN: | FileCheck -check-prefix=MIPS_64 %s
25 ; RUN: llc < %s -emulated-tls -march=ppc64 -relocation-model=pic \
27 ; RUN: llc < %s -emulated-tls -march=ppc32 -relocation-model=pic \
29 ; RUN: llc < %s -emulated-tls -march=x86 -mtriple=i386-linux-gnu -relocation-model=pic \
32 ; Make sure that TLS symbols are emitted in expected order.
34 @external_x = external thread_local global i32, align 8
35 @external_y = thread_local global i8 7, align 2
36 @internal_y = internal thread_local global i64 9, align 16
38 define i32* @get_external_x() {
43 define i8* @get_external_y() {
48 define i64* @get_internal_y() {
53 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; targets independent mode
54 ; CHECK-LABEL: get_external_x:
55 ; CHECK-NOT: _tls_get_address
56 ; CHECK: __emutls_get_address
57 ; CHECK-LABEL: get_external_y:
58 ; CHECK: __emutls_get_address
59 ; CHECK-NOT: _tls_get_address
60 ; CHECK-LABEL: get_internal_y:
62 ; CHECK-NOT: __emutls_t.external_x:
63 ; CHECK-NOT: __emutls_v.external_x:
65 ; CHECK-LABEL: __emutls_v.external_y:
66 ; CHECK-LABEL: __emutls_t.external_y:
67 ; CHECK: __emutls_t.external_y
69 ; CHECK-LABEL: __emutls_v.internal_y:
70 ; CHECK-LABEL: __emutls_t.internal_y:
71 ; CHECK: __emutls_t.internal_y
73 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 32-bit mode
74 ; ARM_32-LABEL: get_external_x:
75 ; X86_32-LABEL: get_external_x:
76 ; MIPS-LABEL: get_external_x:
78 ; ARM_32: bl __emutls_get_address
79 ; ARM_32: .long __emutls_v.external_x
81 ; X86_32: movl __emutls_v.external_x
82 ; X86_32: calll __emutls_get_address
84 ; ARM_32-LABEL: get_external_y:
85 ; X86_32-LABEL: get_external_y:
86 ; MIPS_32-LABEL: get_external_y:
88 ; ARM_32: bl __emutls_get_address
89 ; ARM_32: .long __emutls_v.external_y
91 ; X86_32: movl __emutls_v.external_y
92 ; X86_32: calll __emutls_get_address
94 ; ARM_32-LABEL: get_internal_y:
95 ; X86_32-LABEL: get_internal_y:
96 ; MIPS_32-LABEL: get_internal_y:
98 ; ARM_32: bl __emutls_get_address
99 ; ARM_32: .long __emutls_v.internal_y
101 ; X86_32: movl __emutls_v.internal_y
102 ; X86_32: calll __emutls_get_address
104 ; MIPS_32: lw {{.+}}(__emutls_v.internal_y
105 ; MIPS_32: lw {{.+}}call16(__emutls_get_address
107 ; ARM_32-NOT: __emutls_t.external_x
108 ; X86_32-NOT: __emutls_t.external_x
109 ; MIPS_32-NOT: __emutls_t.external_x
111 ; ARM_32-NOT: __emutls_v.external_x:
112 ; X86_32-NOT: __emutls_v.external_x:
113 ; MIPS_32-NOT: __emutls_v.external_x:
115 ; ARM_32: .section .data.rel.local
116 ; X86_32: .section .data.rel.local
117 ; MIPS_32: .section .data.rel.local
123 ; ARM_32-LABEL: __emutls_v.external_y:
124 ; X86_32-LABEL: __emutls_v.external_y:
125 ; MIPS_32-LABEL: __emutls_v.external_y:
127 ; ARM_32-NEXT: .long 1
128 ; ARM_32-NEXT: .long 2
129 ; ARM_32-NEXT: .long 0
130 ; ARM_32-NEXT: .long __emutls_t.external_y
132 ; X86_32-NEXT: .long 1
133 ; X86_32-NEXT: .long 2
134 ; X86_32-NEXT: .long 0
135 ; X86_32-NEXT: .long __emutls_t.external_y
137 ; ARM_32: .section .rodata,
138 ; X86_32: .section .rodata,
139 ; MIPS_32: .section .rodata,
141 ; ARM_32-LABEL: __emutls_t.external_y:
142 ; X86_32-LABEL: __emutls_t.external_y:
143 ; MIPS_32-LABEL: __emutls_t.external_y:
145 ; ARM_32-NEXT: .byte 7
146 ; X86_32-NEXT: .byte 7
147 ; MIPS_32-NEXT: .byte 7
149 ; ARM_32: .section .data.rel.local
150 ; X86_32: .section .data.rel.local
151 ; MIPS_32: .section .data.rel.local
157 ; ARM_32-LABEL: __emutls_v.internal_y:
158 ; X86_32-LABEL: __emutls_v.internal_y:
159 ; MIPS_32-LABEL: __emutls_v.internal_y:
161 ; ARM_32-NEXT: .long 8
162 ; ARM_32-NEXT: .long 16
163 ; ARM_32-NEXT: .long 0
164 ; ARM_32-NEXT: .long __emutls_t.internal_y
166 ; X86_32-NEXT: .long 8
167 ; X86_32-NEXT: .long 16
168 ; X86_32-NEXT: .long 0
169 ; X86_32-NEXT: .long __emutls_t.internal_y
171 ; MIPS_32-NEXT: .4byte 8
172 ; MIPS_32-NEXT: .4byte 16
173 ; MIPS_32-NEXT: .4byte 0
174 ; MIPS_32-NEXT: .4byte __emutls_t.internal_y
176 ; ARM_32-LABEL: __emutls_t.internal_y:
177 ; X86_32-LABEL: __emutls_t.internal_y:
178 ; MIPS_32-LABEL: __emutls_t.internal_y:
180 ; ARM_32-NEXT: .long 9
181 ; ARM_32-NEXT: .long 0
182 ; X86_32-NEXT: .quad 9
183 ; MIPS_32-NEXT: .8byte 9
186 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 64-bit mode
187 ; X86_64-LABEL: get_external_x:
188 ; ARM_64-LABEL: get_external_x:
189 ; MIPS_64-LABEL: get_external_x:
191 ; X86_64: __emutls_v.external_x
192 ; X86_64: __emutls_get_address
194 ; ARM_64: __emutls_v.external_x
195 ; ARM_64: __emutls_get_address
197 ; X86_64-LABEL: get_external_y:
198 ; ARM_64-LABEL: get_external_y:
199 ; MIPS_64-LABEL: get_external_y:
201 ; X86_64: __emutls_v.external_y
202 ; X86_64: __emutls_get_address
204 ; ARM_64: __emutls_v.external_y
205 ; ARM_64: __emutls_get_address
207 ; X86_64-LABEL: get_internal_y:
208 ; ARM_64-LABEL: get_internal_y:
209 ; MIPS_64-LABEL: get_internal_y:
211 ; X86_64: __emutls_v.internal_y
212 ; X86_64: __emutls_get_address
214 ; ARM_64: __emutls_v.internal_y
215 ; ARM_64: __emutls_get_address
217 ; MIPS_64: ld {{.+}}(__emutls_v.internal_y
218 ; MIPS_64: ld {{.+}}call16(__emutls_get_address
220 ; ARM_64-NOT: __emutls_t.external_x
221 ; X86_64-NOT: __emutls_t.external_x
222 ; MIPS_64-NOT: __emutls_t.external_x
224 ; X86_64-NOT: __emutls_v.external_x:
225 ; ARM_64-NOT: __emutls_v.external_x:
226 ; MIPS_64-NOT: __emutls_v.external_x:
231 ; X86_64-LABEL: __emutls_v.external_y:
232 ; ARM_64-LABEL: __emutls_v.external_y:
233 ; MIPS_64-LABEL: __emutls_v.external_y:
235 ; X86_64-NEXT: .quad 1
236 ; X86_64-NEXT: .quad 2
237 ; X86_64-NEXT: .quad 0
238 ; X86_64-NEXT: .quad __emutls_t.external_y
240 ; ARM_64-NEXT: .xword 1
241 ; ARM_64-NEXT: .xword 2
242 ; ARM_64-NEXT: .xword 0
243 ; ARM_64-NEXT: .xword __emutls_t.external_y
245 ; X86_64-NOT: __emutls_v.external_x:
246 ; ARM_64-NOT: __emutls_v.external_x:
247 ; MIPS_64-NOT: __emutls_v.external_x:
249 ; ARM_64: .section .rodata,
250 ; X86_64: .section .rodata,
251 ; MIPS_64: .section .rodata,
253 ; X86_64-LABEL: __emutls_t.external_y:
254 ; ARM_64-LABEL: __emutls_t.external_y:
255 ; MIPS_64-LABEL: __emutls_t.external_y:
257 ; X86_64-NEXT: .byte 7
258 ; ARM_64-NEXT: .byte 7
259 ; MIPS_64-NEXT: .byte 7
261 ; ARM_64: .section .data.rel.local
262 ; X86_64: .section .data.rel.local
263 ; MIPS_64: .section .data.rel.local
269 ; X86_64-LABEL: __emutls_v.internal_y:
270 ; ARM_64-LABEL: __emutls_v.internal_y:
271 ; MIPS_64-LABEL: __emutls_v.internal_y:
273 ; X86_64-NEXT: .quad 8
274 ; X86_64-NEXT: .quad 16
275 ; X86_64-NEXT: .quad 0
276 ; X86_64-NEXT: .quad __emutls_t.internal_y
278 ; ARM_64-NEXT: .xword 8
279 ; ARM_64-NEXT: .xword 16
280 ; ARM_64-NEXT: .xword 0
281 ; ARM_64-NEXT: .xword __emutls_t.internal_y
283 ; MIPS_64-NEXT: .8byte 8
284 ; MIPS_64-NEXT: .8byte 16
285 ; MIPS_64-NEXT: .8byte 0
286 ; MIPS_64-NEXT: .8byte __emutls_t.internal_y
288 ; ARM_64: .section .rodata,
289 ; X86_64: .section .rodata,
290 ; MIPS_64: .section .rodata,
292 ; X86_64-LABEL: __emutls_t.internal_y:
293 ; ARM_64-LABEL: __emutls_t.internal_y:
294 ; MIPS_64-LABEL: __emutls_t.internal_y:
296 ; X86_64-NEXT: .quad 9
297 ; ARM_64-NEXT: .xword 9
298 ; MIPS_64-NEXT: .8byte 9