blob: 50dc72653aeab1caad814ff253aa88a323ad37d6 [file] [log] [blame]
Chih-Hung Hsieh1e859582015-07-28 16:24:05 +00001; RUN: llc < %s -emulated-tls -march=x86 -mtriple=i386-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X32 %s
2; RUN: llc < %s -emulated-tls -march=x86-64 -mtriple=x86_64-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X64 %s
3; RUN: llc < %s -emulated-tls -march=x86 -mtriple=i386-linux-android -relocation-model=pic | FileCheck -check-prefix=X32 %s
4; RUN: llc < %s -emulated-tls -march=x86-64 -mtriple=x86_64-linux-android -relocation-model=pic | FileCheck -check-prefix=X64 %s
5
6; Use my_emutls_get_address like __emutls_get_address.
7@my_emutls_v_xyz = external global i8*, align 4
8declare i8* @my_emutls_get_address(i8*)
9
10define i32 @my_get_xyz() {
11; X32-LABEL: my_get_xyz:
12; X32: movl my_emutls_v_xyz@GOT(%ebx), %eax
13; X32-NEXT: movl %eax, (%esp)
14; X32-NEXT: calll my_emutls_get_address@PLT
15; X64-LABEL: my_get_xyz:
16; X64: movq my_emutls_v_xyz@GOTPCREL(%rip), %rdi
17; X64-NEXT: callq my_emutls_get_address@PLT
18; X64-NEXT: movl (%rax), %eax
19
20entry:
21 %call = call i8* @my_emutls_get_address(i8* bitcast (i8** @my_emutls_v_xyz to i8*))
22 %0 = bitcast i8* %call to i32*
23 %1 = load i32, i32* %0, align 4
24 ret i32 %1
25}
26
27@i = thread_local global i32 15
28@j = internal thread_local global i32 42
29@k = internal thread_local global i32 0, align 8
30
31define i32 @f1() {
32entry:
33 %tmp1 = load i32, i32* @i
34 ret i32 %tmp1
35}
36
37; X32-LABEL: f1:
38; X32: movl __emutls_v.i@GOT(%ebx), %eax
39; X32-NEXT: movl %eax, (%esp)
40; X32-NEXT: calll __emutls_get_address@PLT
41; X64-LABEL: f1:
42; X64: movq __emutls_v.i@GOTPCREL(%rip), %rdi
43; X64-NEXT: callq __emutls_get_address@PLT
44; X64-NEXT: movl (%rax), %eax
45
46@i2 = external thread_local global i32
47
48define i32* @f2() {
49entry:
50 ret i32* @i
51}
52
53; X32-LABEL: f2:
54; X64-LABEL: f2:
55
56
57define i32 @f3() {
58entry:
59 %tmp1 = load i32, i32* @i ; <i32> [#uses=1]
60 ret i32 %tmp1
61}
62
63; X32-LABEL: f3:
64; X64-LABEL: f3:
65
66
67define i32* @f4() nounwind {
68entry:
69 ret i32* @i
70}
71
72; X32-LABEL: f4:
73; X64-LABEL: f4:
74
75
76define i32 @f5() nounwind {
77entry:
78 %0 = load i32, i32* @j, align 4
79 %1 = load i32, i32* @k, align 4
80 %add = add nsw i32 %0, %1
81 ret i32 %add
82}
83
84; X32-LABEL: f5:
Chih-Hung Hsieh57886402016-01-13 23:56:37 +000085; X32: leal __emutls_v.j@GOTOFF(%ebx), %eax
Chih-Hung Hsieh1e859582015-07-28 16:24:05 +000086; X32-NEXT: movl %eax, (%esp)
87; X32-NEXT: calll __emutls_get_address@PLT
88; X32-NEXT: movl (%eax), %esi
Chih-Hung Hsieh57886402016-01-13 23:56:37 +000089; X32-NEXT: leal __emutls_v.k@GOTOFF(%ebx), %eax
Chih-Hung Hsieh1e859582015-07-28 16:24:05 +000090; X32-NEXT: movl %eax, (%esp)
91; X32-NEXT: calll __emutls_get_address@PLT
92; X32-NEXT: addl (%eax), %esi
93; X32-NEXT: movl %esi, %eax
94
95; X64-LABEL: f5:
Chih-Hung Hsieh57886402016-01-13 23:56:37 +000096; X64: leaq __emutls_v.j(%rip), %rdi
Chih-Hung Hsieh1e859582015-07-28 16:24:05 +000097; X64-NEXT: callq __emutls_get_address@PLT
98; X64-NEXT: movl (%rax), %ebx
Chih-Hung Hsieh57886402016-01-13 23:56:37 +000099; X64-NEXT: leaq __emutls_v.k(%rip), %rdi
Chih-Hung Hsieh1e859582015-07-28 16:24:05 +0000100; X64-NEXT: callq __emutls_get_address@PLT
101; X64-NEXT: addl (%rax), %ebx
102; X64-NEXT: movl %ebx, %eax
103
104;;;;; 32-bit targets
105
Chih-Hung Hsieh57886402016-01-13 23:56:37 +0000106; X32: .data{{$}}
107; X32: .globl __emutls_v.i
Chih-Hung Hsieh1e859582015-07-28 16:24:05 +0000108; X32-LABEL: __emutls_v.i:
109; X32-NEXT: .long 4
110; X32-NEXT: .long 4
111; X32-NEXT: .long 0
112; X32-NEXT: .long __emutls_t.i
113
114; X32: .section .rodata,
115; X32-LABEL: __emutls_t.i:
116; X32-NEXT: .long 15
117
Chih-Hung Hsieh57886402016-01-13 23:56:37 +0000118; X32: .data{{$}}
119; X32-NOT: .globl
Chih-Hung Hsieh1e859582015-07-28 16:24:05 +0000120; X32-LABEL: __emutls_v.j:
121; X32-NEXT: .long 4
122; X32-NEXT: .long 4
123; X32-NEXT: .long 0
124; X32-NEXT: .long __emutls_t.j
125
126; X32: .section .rodata,
127; X32-LABEL: __emutls_t.j:
128; X32-NEXT: .long 42
129
Chih-Hung Hsieh57886402016-01-13 23:56:37 +0000130; X32: .data{{$}}
131; X32-NOT: .globl
Chih-Hung Hsieh1e859582015-07-28 16:24:05 +0000132; X32-LABEL: __emutls_v.k:
133; X32-NEXT: .long 4
134; X32-NEXT: .long 8
135; X32-NEXT: .long 0
136; X32-NEXT: .long 0
137
138; X32-NOT: __emutls_t.k:
139
140;;;;; 64-bit targets
141
Chih-Hung Hsieh57886402016-01-13 23:56:37 +0000142; X64: .data{{$}}
143; X64: .globl __emutls_v.i
Chih-Hung Hsieh1e859582015-07-28 16:24:05 +0000144; X64-LABEL: __emutls_v.i:
145; X64-NEXT: .quad 4
146; X64-NEXT: .quad 4
147; X64-NEXT: .quad 0
148; X64-NEXT: .quad __emutls_t.i
149
150; X64: .section .rodata,
151; X64-LABEL: __emutls_t.i:
152; X64-NEXT: .long 15
153
Chih-Hung Hsieh57886402016-01-13 23:56:37 +0000154; X64: .data{{$}}
155; X64-NOT: .globl
Chih-Hung Hsieh1e859582015-07-28 16:24:05 +0000156; X64-LABEL: __emutls_v.j:
157; X64-NEXT: .quad 4
158; X64-NEXT: .quad 4
159; X64-NEXT: .quad 0
160; X64-NEXT: .quad __emutls_t.j
161
162; X64: .section .rodata,
163; X64-LABEL: __emutls_t.j:
164; X64-NEXT: .long 42
165
Chih-Hung Hsieh57886402016-01-13 23:56:37 +0000166; X64: .data{{$}}
167; X64-NOT: .globl
Chih-Hung Hsieh1e859582015-07-28 16:24:05 +0000168; X64-LABEL: __emutls_v.k:
169; X64-NEXT: .quad 4
170; X64-NEXT: .quad 8
171; X64-NEXT: .quad 0
172; X64-NEXT: .quad 0
173
174; X64-NOT: __emutls_t.k: