Implement target independent TLS compatible with glibc's emutls.c.
[oota-llvm.git] / test / CodeGen / Generic / emutls.ll
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 \
26 ; RUN:     | FileCheck %s
27 ; RUN: llc < %s -emulated-tls -march=ppc32 -relocation-model=pic \
28 ; RUN:     | FileCheck %s
29 ; RUN: llc < %s -emulated-tls -march=x86 -mtriple=i386-linux-gnu -relocation-model=pic \
30 ; RUN:     | FileCheck %s
31
32 ; Make sure that TLS symbols are emitted in expected order.
33
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
37
38 define i32* @get_external_x() {
39 entry:
40   ret i32* @external_x
41 }
42
43 define i8* @get_external_y() {
44 entry:
45   ret i8* @external_y
46 }
47
48 define i64* @get_internal_y() {
49 entry:
50   ret i64* @internal_y
51 }
52
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:
61
62 ; CHECK-NOT:   __emutls_t.external_x:
63 ; CHECK-NOT:   __emutls_v.external_x:
64
65 ; CHECK-LABEL: __emutls_v.external_y:
66 ; CHECK-LABEL: __emutls_t.external_y:
67 ; CHECK:       __emutls_t.external_y
68
69 ; CHECK-LABEL: __emutls_v.internal_y:
70 ; CHECK-LABEL: __emutls_t.internal_y:
71 ; CHECK:       __emutls_t.internal_y
72
73 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 32-bit mode
74 ; ARM_32-LABEL:  get_external_x:
75 ; X86_32-LABEL:  get_external_x:
76 ; MIPS-LABEL:    get_external_x:
77
78 ; ARM_32:        bl __emutls_get_address
79 ; ARM_32:        .long __emutls_v.external_x
80
81 ; X86_32:        movl __emutls_v.external_x
82 ; X86_32:        calll __emutls_get_address
83
84 ; ARM_32-LABEL:  get_external_y:
85 ; X86_32-LABEL:  get_external_y:
86 ; MIPS_32-LABEL: get_external_y:
87
88 ; ARM_32:        bl __emutls_get_address
89 ; ARM_32:        .long __emutls_v.external_y
90
91 ; X86_32:        movl __emutls_v.external_y
92 ; X86_32:        calll __emutls_get_address
93
94 ; ARM_32-LABEL:  get_internal_y:
95 ; X86_32-LABEL:  get_internal_y:
96 ; MIPS_32-LABEL: get_internal_y:
97
98 ; ARM_32:      bl __emutls_get_address
99 ; ARM_32:      .long __emutls_v.internal_y
100
101 ; X86_32:      movl __emutls_v.internal_y
102 ; X86_32:      calll __emutls_get_address
103
104 ; MIPS_32:     lw {{.+}}(__emutls_v.internal_y
105 ; MIPS_32:     lw {{.+}}call16(__emutls_get_address
106
107 ; ARM_32-NOT:   __emutls_t.external_x
108 ; X86_32-NOT:   __emutls_t.external_x
109 ; MIPS_32-NOT:  __emutls_t.external_x
110
111 ; ARM_32-NOT:   __emutls_v.external_x:
112 ; X86_32-NOT:   __emutls_v.external_x:
113 ; MIPS_32-NOT:  __emutls_v.external_x:
114
115 ; ARM_32:        .section .data.rel.local
116 ; X86_32:        .section .data.rel.local
117 ; MIPS_32:       .section .data.rel.local
118
119 ; ARM_32:        .align 2
120 ; X86_32:        .align 4
121 ; MIPS_32:       .align 2
122
123 ; ARM_32-LABEL:  __emutls_v.external_y:
124 ; X86_32-LABEL:  __emutls_v.external_y:
125 ; MIPS_32-LABEL: __emutls_v.external_y:
126
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
131
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
136
137 ; ARM_32:        .section .rodata,
138 ; X86_32:        .section .rodata,
139 ; MIPS_32:       .section .rodata,
140
141 ; ARM_32-LABEL:  __emutls_t.external_y:
142 ; X86_32-LABEL:  __emutls_t.external_y:
143 ; MIPS_32-LABEL: __emutls_t.external_y:
144
145 ; ARM_32-NEXT:   .byte 7
146 ; X86_32-NEXT:   .byte 7
147 ; MIPS_32-NEXT:  .byte 7
148
149 ; ARM_32:        .section .data.rel.local
150 ; X86_32:        .section .data.rel.local
151 ; MIPS_32:       .section .data.rel.local
152
153 ; ARM_32:        .align 2
154 ; X86_32:        .align 4
155 ; MIPS_32:       .align 2
156
157 ; ARM_32-LABEL:  __emutls_v.internal_y:
158 ; X86_32-LABEL:  __emutls_v.internal_y:
159 ; MIPS_32-LABEL: __emutls_v.internal_y:
160
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
165
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
170
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
175
176 ; ARM_32-LABEL:  __emutls_t.internal_y:
177 ; X86_32-LABEL:  __emutls_t.internal_y:
178 ; MIPS_32-LABEL: __emutls_t.internal_y:
179
180 ; ARM_32-NEXT:   .long 9
181 ; ARM_32-NEXT:   .long 0
182 ; X86_32-NEXT:   .quad 9
183 ; MIPS_32-NEXT:  .8byte 9
184
185
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:
190
191 ; X86_64:      __emutls_v.external_x
192 ; X86_64:      __emutls_get_address
193
194 ; ARM_64:      __emutls_v.external_x
195 ; ARM_64:      __emutls_get_address
196
197 ; X86_64-LABEL:  get_external_y:
198 ; ARM_64-LABEL:  get_external_y:
199 ; MIPS_64-LABEL: get_external_y:
200
201 ; X86_64:      __emutls_v.external_y
202 ; X86_64:      __emutls_get_address
203
204 ; ARM_64:      __emutls_v.external_y
205 ; ARM_64:      __emutls_get_address
206
207 ; X86_64-LABEL:  get_internal_y:
208 ; ARM_64-LABEL:  get_internal_y:
209 ; MIPS_64-LABEL: get_internal_y:
210
211 ; X86_64:      __emutls_v.internal_y
212 ; X86_64:      __emutls_get_address
213
214 ; ARM_64:      __emutls_v.internal_y
215 ; ARM_64:      __emutls_get_address
216
217 ; MIPS_64:     ld {{.+}}(__emutls_v.internal_y
218 ; MIPS_64:     ld {{.+}}call16(__emutls_get_address
219
220 ; ARM_64-NOT:   __emutls_t.external_x
221 ; X86_64-NOT:   __emutls_t.external_x
222 ; MIPS_64-NOT:  __emutls_t.external_x
223
224 ; X86_64-NOT:   __emutls_v.external_x:
225 ; ARM_64-NOT:   __emutls_v.external_x:
226 ; MIPS_64-NOT:  __emutls_v.external_x:
227
228 ; X86_64:        .align 8
229 ; ARM_64:        .align 3
230
231 ; X86_64-LABEL:  __emutls_v.external_y:
232 ; ARM_64-LABEL:  __emutls_v.external_y:
233 ; MIPS_64-LABEL: __emutls_v.external_y:
234
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
239
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
244
245 ; X86_64-NOT:    __emutls_v.external_x:
246 ; ARM_64-NOT:    __emutls_v.external_x:
247 ; MIPS_64-NOT:   __emutls_v.external_x:
248
249 ; ARM_64:        .section .rodata,
250 ; X86_64:        .section .rodata,
251 ; MIPS_64:       .section .rodata,
252
253 ; X86_64-LABEL:  __emutls_t.external_y:
254 ; ARM_64-LABEL:  __emutls_t.external_y:
255 ; MIPS_64-LABEL: __emutls_t.external_y:
256
257 ; X86_64-NEXT:   .byte 7
258 ; ARM_64-NEXT:   .byte 7
259 ; MIPS_64-NEXT:  .byte 7
260
261 ; ARM_64:        .section .data.rel.local
262 ; X86_64:        .section .data.rel.local
263 ; MIPS_64:       .section .data.rel.local
264
265 ; X86_64:        .align 8
266 ; ARM_64:        .align 3
267 ; MIPS_64:       .align 3
268
269 ; X86_64-LABEL:  __emutls_v.internal_y:
270 ; ARM_64-LABEL:  __emutls_v.internal_y:
271 ; MIPS_64-LABEL: __emutls_v.internal_y:
272
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
277
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
282
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
287
288 ; ARM_64:        .section .rodata,
289 ; X86_64:        .section .rodata,
290 ; MIPS_64:       .section .rodata,
291
292 ; X86_64-LABEL:  __emutls_t.internal_y:
293 ; ARM_64-LABEL:  __emutls_t.internal_y:
294 ; MIPS_64-LABEL: __emutls_t.internal_y:
295
296 ; X86_64-NEXT:   .quad 9
297 ; ARM_64-NEXT:   .xword 9
298 ; MIPS_64-NEXT:  .8byte 9