xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/darwin-tls.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - -fast-isel %s | FileCheck %s --check-prefix=T2-MOVT-PIC
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s -mattr=+no-movt | FileCheck %s --check-prefix=T2-LIT-PIC
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s -relocation-model=static | FileCheck %s --check-prefix=T2-MOVT-STATIC
4*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv7s-apple-ios7.0 -o - %s -mattr=+no-movt -relocation-model=static | FileCheck %s --check-prefix=T2-LIT-STATIC
5*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=armv7s-apple-ios7.0 -o - %s | FileCheck %s --check-prefix=ARM-MOVT-PIC
6*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=armv7s-apple-ios7.0 -o - %s -mattr=+no-movt | FileCheck %s --check-prefix=ARM-LIT-PIC
7*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=armv7s-apple-ios7.0 -o - %s -relocation-model=static | FileCheck %s --check-prefix=ARM-MOVT-STATIC
8*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=armv7s-apple-ios7.0 -o - %s -mattr=+no-movt -relocation-model=static | FileCheck %s --check-prefix=ARM-LIT-STATIC
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker@local_tls_var = thread_local global i32 0
12*9880d681SAndroid Build Coastguard Worker@external_tls_var = external thread_local global i32
13*9880d681SAndroid Build Coastguard Worker@hidden_external_tls_var = external hidden thread_local global i32
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine i32 @test_local_tls() {
17*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC-LABEL: test_local_tls:
18*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: movw r0, :lower16:(_local_tls_var-([[PCREL_LOC:LPC[0-9]+_[0-9]+]]+4))
19*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: movt r0, :upper16:(_local_tls_var-([[PCREL_LOC]]+4))
20*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: [[PCREL_LOC]]:
21*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC-NEXT: add r0, pc
22*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
23*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: blx [[TLV_GET_ADDR]]
24*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: ldr r0, [r0]
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC-LABEL: test_local_tls:
27*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr r0, [[LOCAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]
28*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: [[PCREL_LOC:LPC[0-9]+_[0-9]+]]:
29*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC-NEXT: add r0, pc
30*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
31*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: blx [[TLV_GET_ADDR]]
32*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr r0, [r0]
33*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: [[LOCAL_VAR_ADDR]]:
34*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC-NEXT: .long _local_tls_var-([[PCREL_LOC]]+4)
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC-LABEL: test_local_tls:
37*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: movw r0, :lower16:_local_tls_var
38*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: movt r0, :upper16:_local_tls_var
39*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
40*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: blx [[TLV_GET_ADDR]]
41*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: ldr r0, [r0]
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC-LABEL: test_local_tls:
44*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: ldr r0, [[LOCAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]
45*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
46*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: blx [[TLV_GET_ADDR]]
47*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: ldr r0, [r0]
48*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: [[LOCAL_VAR_ADDR]]:
49*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC-NEXT: .long _local_tls_var
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC-LABEL: test_local_tls:
52*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: movw [[VARPC1:r[0-9]+]], :lower16:(_local_tls_var-([[PCREL_LOC1:LPC[0-9]+_[0-9]+]]+8))
53*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: movt [[VARPC1]], :upper16:(_local_tls_var-([[PCREL_LOC1]]+8))
54*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: [[PCREL_LOC1]]:
55*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: add r0, pc, [[VARPC1]]
56*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: movw [[VARPC2:r[0-9]+]], :lower16:(_local_tls_var-([[PCREL_LOC2:LPC[0-9]+_[0-9]+]]+8))
57*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: movt [[VARPC2]], :upper16:(_local_tls_var-([[PCREL_LOC2]]+8))
58*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: [[PCREL_LOC2]]:
59*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC-NEXT: ldr [[TLV_GET_ADDR:r[0-9]+]], [pc, [[VARPC2]]]
60*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: blx [[TLV_GET_ADDR]]
61*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: ldr r0, [r0]
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC-LABEL: test_local_tls:
64*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr r0, [[LOCAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]
65*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: [[PCREL_LOC:LPC[0-9]+_[0-9]+]]:
66*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC-NEXT: add r0, pc
67*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
68*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: blx [[TLV_GET_ADDR]]
69*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr r0, [r0]
70*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: [[LOCAL_VAR_ADDR]]:
71*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC-NEXT: .long _local_tls_var-([[PCREL_LOC]]+8)
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC-LABEL: test_local_tls:
74*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: movw r0, :lower16:_local_tls_var
75*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: movt r0, :upper16:_local_tls_var
76*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
77*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: blx [[TLV_GET_ADDR]]
78*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: ldr r0, [r0]
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC-LABEL: test_local_tls:
81*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: ldr r0, [[LOCAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]
82*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
83*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: blx [[TLV_GET_ADDR]]
84*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: ldr r0, [r0]
85*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: [[LOCAL_VAR_ADDR]]:
86*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC-NEXT: .long _local_tls_var
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker  %val = load i32, i32* @local_tls_var, align 4
90*9880d681SAndroid Build Coastguard Worker  ret i32 %val
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine i32 @test_external_tls() {
94*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC-LABEL: test_external_tls:
95*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: movw r[[EXTGOT:[0-9]+]], :lower16:(L_external_tls_var$non_lazy_ptr-([[PCREL_LOC:LPC[0-9]+_[0-9]+]]+4))
96*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: movt r[[EXTGOT]], :upper16:(L_external_tls_var$non_lazy_ptr-([[PCREL_LOC]]+4))
97*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: [[PCREL_LOC]]:
98*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC-NEXT: add r[[EXTGOT]], pc
99*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: ldr r0, [r[[EXTGOT]]]
100*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
101*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: blx [[TLV_GET_ADDR]]
102*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: ldr r0, [r0]
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC-LABEL: test_external_tls:
105*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr r[[EXTGOT:[0-9]+]], [[EXTERNAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]
106*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: [[PCREL_LOC:LPC[0-9]+_[0-9]+]]:
107*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC-NEXT: add r[[EXTGOT]], pc
108*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr r0, [r[[EXTGOT]]]
109*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
110*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: blx [[TLV_GET_ADDR]]
111*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: ldr r0, [r0]
112*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC: [[EXTERNAL_VAR_ADDR]]:
113*9880d681SAndroid Build Coastguard Worker; T2-LIT-PIC-NEXT: .long L_external_tls_var$non_lazy_ptr-([[PCREL_LOC]]+4)
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC-LABEL: test_external_tls:
116*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: movw r0, :lower16:_external_tls_var
117*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: movt r0, :upper16:_external_tls_var
118*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
119*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: blx [[TLV_GET_ADDR]]
120*9880d681SAndroid Build Coastguard Worker; T2-MOVT-STATIC: ldr r0, [r0]
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC-LABEL: test_external_tls:
123*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: ldr r0, [[EXTERNAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]
124*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
125*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: blx [[TLV_GET_ADDR]]
126*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: ldr r0, [r0]
127*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC: [[EXTERNAL_VAR_ADDR]]:
128*9880d681SAndroid Build Coastguard Worker; T2-LIT-STATIC-NEXT: .long _external_tls_var
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC-LABEL: test_external_tls:
131*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: movw r[[EXTGOT:[0-9]+]], :lower16:(L_external_tls_var$non_lazy_ptr-([[PCREL_LOC:LPC[0-9]+_[0-9]+]]+8))
132*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: movt r[[EXTGOT]], :upper16:(L_external_tls_var$non_lazy_ptr-([[PCREL_LOC]]+8))
133*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: [[PCREL_LOC]]:
134*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC-NEXT: ldr r0, [pc, r[[EXTGOT]]]
135*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
136*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: blx [[TLV_GET_ADDR]]
137*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-PIC: ldr r0, [r0]
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC-LABEL: test_external_tls:
140*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr r[[EXTGOT:[0-9]+]], [[EXTERNAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]
141*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: [[PCREL_LOC:LPC[0-9]+_[0-9]+]]:
142*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC-NEXT: add r[[EXTGOT]], pc
143*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr r0, [r[[EXTGOT]]]
144*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
145*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: blx [[TLV_GET_ADDR]]
146*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: ldr r0, [r0]
147*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC: [[EXTERNAL_VAR_ADDR]]:
148*9880d681SAndroid Build Coastguard Worker; ARM-LIT-PIC-NEXT: .long L_external_tls_var$non_lazy_ptr-([[PCREL_LOC]]+8)
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC-LABEL: test_external_tls:
151*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: movw r0, :lower16:_external_tls_var
152*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: movt r0, :upper16:_external_tls_var
153*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
154*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: blx [[TLV_GET_ADDR]]
155*9880d681SAndroid Build Coastguard Worker; ARM-MOVT-STATIC: ldr r0, [r0]
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC-LABEL: test_external_tls:
158*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: ldr r0, [[EXTERNAL_VAR_ADDR:LCPI[0-9]+_[0-9]+]]
159*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: ldr [[TLV_GET_ADDR:r[0-9]+]], [r0]
160*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: blx [[TLV_GET_ADDR]]
161*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: ldr r0, [r0]
162*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC: [[EXTERNAL_VAR_ADDR]]:
163*9880d681SAndroid Build Coastguard Worker; ARM-LIT-STATIC-NEXT: .long _external_tls_var
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker  %val = load i32, i32* @external_tls_var, align 4
166*9880d681SAndroid Build Coastguard Worker  ret i32 %val
167*9880d681SAndroid Build Coastguard Worker}
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker; Just need something to trigger an indirect reference to the var.
170*9880d681SAndroid Build Coastguard Workerdefine i32 @use_hidden_external_tls() {
171*9880d681SAndroid Build Coastguard Worker  %val = load i32, i32* @hidden_external_tls_var, align 4
172*9880d681SAndroid Build Coastguard Worker  ret i32 %val
173*9880d681SAndroid Build Coastguard Worker}
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: .section __DATA,__thread_ptr,thread_local_variable_pointers
176*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: .p2align 2
177*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: L_external_tls_var$non_lazy_ptr:
178*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC:     .indirect_symbol _external_tls_var
179*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC:     .long 0
180*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC: L_hidden_external_tls_var$non_lazy_ptr:
181*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC:     .indirect_symbol _hidden_external_tls_var
182*9880d681SAndroid Build Coastguard Worker; T2-MOVT-PIC:     .long 0
183