blob: 8c1c40dd6eace8c1096f6b6698ab9b135970fa67 [file] [log] [blame]
Chih-Hung Hsieh9843f402015-07-28 17:32:49 +00001; 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=arm-linux-androidabi -relocation-model=pic -O3 \
6; RUN: | FileCheck -check-prefix=ARM_32 %s
7; RUN: llc < %s -emulated-tls -mtriple=arm-linux-androidabi -O3 \
8; RUN: | FileCheck -check-prefix=ARM_32 %s
Martin Storsjoc85cc412017-12-04 09:08:55 +00009; RUN: llc < %s -emulated-tls -mtriple=arm-apple-darwin -O3 \
10; RUN: | FileCheck -check-prefix=DARWIN %s
11; RUN: llc < %s -emulated-tls -mtriple=thumbv7-windows-gnu -O3 \
12; RUN: | FileCheck -check-prefix=WIN %s
Chih-Hung Hsieh9843f402015-07-28 17:32:49 +000013
14; Make sure that TLS symbols are emitted in expected order.
15
16@external_x = external thread_local global i32, align 8
17@external_y = thread_local global i8 7, align 2
18@internal_y = internal thread_local global i64 9, align 16
19
20define i32* @get_external_x() {
21entry:
22 ret i32* @external_x
23}
24
25define i8* @get_external_y() {
26entry:
27 ret i8* @external_y
28}
29
30define i64* @get_internal_y() {
31entry:
32 ret i64* @internal_y
33}
34
35; ARM_32-LABEL: get_external_x:
36; ARM_32: bl __emutls_get_address
37; ARM_32: .long __emutls_v.external_x
38; ARM_32-LABEL: get_external_y:
39; ARM_32: bl __emutls_get_address
40; ARM_32: .long __emutls_v.external_y
41; ARM_32-LABEL: get_internal_y:
Chih-Hung Hsieh57886402016-01-13 23:56:37 +000042; ARM_32: bl __emutls_get_address
43; ARM_32: .long __emutls_v.internal_y
44; ARM_32-NOT: __emutls_t.external_x
45; ARM_32-NOT: __emutls_v.external_x:
46; ARM_32: .data{{$}}
47; ARM_32: .globl __emutls_v.external_y
Dan Gohman61d15ae2016-01-26 00:03:25 +000048; ARM_32: .p2align 2
Chih-Hung Hsieh9843f402015-07-28 17:32:49 +000049; ARM_32-LABEL: __emutls_v.external_y:
50; ARM_32-NEXT: .long 1
51; ARM_32-NEXT: .long 2
52; ARM_32-NEXT: .long 0
53; ARM_32-NEXT: .long __emutls_t.external_y
54; ARM_32: .section .rodata,
55; ARM_32-LABEL: __emutls_t.external_y:
56; ARM_32-NEXT: .byte 7
Chih-Hung Hsieh57886402016-01-13 23:56:37 +000057; ARM_32: .data{{$}}
58; ARM_32-NOT: .globl
Dan Gohman61d15ae2016-01-26 00:03:25 +000059; ARM_32: .p2align 2
Chih-Hung Hsieh9843f402015-07-28 17:32:49 +000060; ARM_32-LABEL: __emutls_v.internal_y:
61; ARM_32-NEXT: .long 8
62; ARM_32-NEXT: .long 16
63; ARM_32-NEXT: .long 0
64; ARM_32-NEXT: .long __emutls_t.internal_y
65; ARM_32-LABEL: __emutls_t.internal_y:
66; ARM_32-NEXT: .long 9
67; ARM_32-NEXT: .long 0
Martin Storsjoc85cc412017-12-04 09:08:55 +000068
69; WIN-LABEL: get_external_x:
70; WIN: movw r0, :lower16:__emutls_v.external_x
71; WIN: movt r0, :upper16:__emutls_v.external_x
72; WIN: bl __emutls_get_address
73; WIN-LABEL: get_external_y:
74; WIN: movw r0, :lower16:__emutls_v.external_y
75; WIN: movt r0, :upper16:__emutls_v.external_y
76; WIN: bl __emutls_get_address
77; WIN-LABEL: get_internal_y:
78; WIN: movw r0, :lower16:__emutls_v.internal_y
79; WIN: movt r0, :upper16:__emutls_v.internal_y
80; WIN: bl __emutls_get_address
81; WIN-NOT: __emutls_t.external_x
82; WIN-NOT: __emutls_v.external_x:
83; WIN: .data{{$}}
84; WIN: .globl __emutls_v.external_y
85; WIN: .p2align 2
86; WIN-LABEL: __emutls_v.external_y:
87; WIN-NEXT: .long 1
88; WIN-NEXT: .long 2
89; WIN-NEXT: .long 0
90; WIN-NEXT: .long __emutls_t.external_y
91; WIN: .section .rdata,
92; WIN-LABEL: __emutls_t.external_y:
93; WIN-NEXT: .byte 7
94; WIN: .data{{$}}
95; WIN-NOT: .globl
96; WIN: .p2align 2
97; WIN-LABEL: __emutls_v.internal_y:
98; WIN-NEXT: .long 8
99; WIN-NEXT: .long 16
100; WIN-NEXT: .long 0
101; WIN-NEXT: .long __emutls_t.internal_y
102; WIN-LABEL: __emutls_t.internal_y:
103; .quad 9 is equivalent to .long 9 .long 0
104; WIN-NEXT: .quad 9
105
106; DARWIN-LABEL: _get_external_x:
107; DARWIN: bl ___emutls_get_address
108; DARWIN: .long L___emutls_v.external_x$non_lazy_ptr-(LPC0_0+8)
109; DARWIN-LABEL: _get_external_y:
110; DARWIN: bl ___emutls_get_address
111; DARWIN: .long ___emutls_v.external_y-(LPC1_0+8)
112; DARWIN-LABEL: _get_internal_y:
113; DARWIN: bl ___emutls_get_address
114; DARWIN: .long ___emutls_v.internal_y-(LPC2_0+8)
115; DARWIN-NOT: ___emutls_t.external_x
116; DARWIN-NOT: ___emutls_v.external_x:
117; DARWIN: .section __DATA,__data
118; DARWIN: .globl ___emutls_v.external_y
119; DARWIN: .p2align 2
120; DARWIN-LABEL: ___emutls_v.external_y:
121; DARWIN-NEXT: .long 1
122; DARWIN-NEXT: .long 2
123; DARWIN-NEXT: .long 0
124; DARWIN-NEXT: .long ___emutls_t.external_y
125; DARWIN: .section __TEXT,__const
126; DARWIN-LABEL: ___emutls_t.external_y:
127; DARWIN-NEXT: .byte 7
128; DARWIN: .section __DATA,__data
129; DARWIN-NOT: .globl
130; DARWIN: .p2align 2
131; DARWIN-LABEL: ___emutls_v.internal_y:
132; DARWIN-NEXT: .long 8
133; DARWIN-NEXT: .long 16
134; DARWIN-NEXT: .long 0
135; DARWIN-NEXT: .long ___emutls_t.internal_y
136; DARWIN-LABEL: ___emutls_t.internal_y:
137; DARWIN-NEXT: .long 9
138; DARWIN-NEXT: .long 0