Skip to content

Commit 99c1a4e

Browse files
committed
Modify loongarch-tlsdesc.s and loongarch-tlsdesc-pcrel20-s2.s
Add loongarch-relax-tlsdesc.s
1 parent 4b91af1 commit 99c1a4e

File tree

3 files changed

+227
-153
lines changed

3 files changed

+227
-153
lines changed

lld/test/ELF/loongarch-relax-tlsdesc.s

Lines changed: 141 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,18 @@
99
# RUN: llvm-readobj -r -x .got a.64.so | FileCheck --check-prefix=GD64-RELA %s
1010
# RUN: llvm-objdump --no-show-raw-insn -dr -h a.64.so | FileCheck %s --check-prefix=GD64
1111

12-
## FIXME: The transition from TLSDESC to IE/LE has not yet been implemented.
13-
## Keep the dynamic relocations and hand them over to dynamic linker.
14-
15-
# RUN: ld.lld --relax -e 0 -z now a.64.o c.64.o -o a.64.le
16-
# RUN: llvm-readobj -r -x .got a.64.le | FileCheck --check-prefix=LE64-RELA %s
17-
# RUN: llvm-objdump --no-show-raw-insn -d -h a.64.le | FileCheck %s --check-prefix=LE64
12+
## FIXME: IE/LE relaxation have not yet been implemented, --relax/--no-relax obtain the same results.
13+
## Transition from TLSDESC to IE/LE. Also check --emit-relocs.
14+
# RUN: ld.lld -e 0 -z now --emit-relocs a.64.o c.64.o -o a.64.le
15+
# RUN: llvm-readobj -r -x .got a.64.le 2>&1 | FileCheck --check-prefix=LE64-RELA %s
16+
# RUN: llvm-objdump --no-show-raw-insn -dr -h a.64.le | FileCheck %s --check-prefix=LE64
1817

1918
# RUN: ld.lld --no-relax -e 0 -z now a.64.o c.64.o -o a.64.le.norelax
2019
# RUN: llvm-objdump --no-show-raw-insn -d -h a.64.le.norelax | FileCheck %s --check-prefix=LE64-NORELAX
2120

22-
# RUN: ld.lld --relax -e 0 -z now a.64.o c.64.so -o a.64.ie
21+
# RUN: ld.lld --relax -e 0 -z now --emit-relocs a.64.o c.64.so -o a.64.ie
2322
# RUN: llvm-readobj -r -x .got a.64.ie | FileCheck --check-prefix=IE64-RELA %s
24-
# RUN: llvm-objdump --no-show-raw-insn -d -h a.64.ie | FileCheck %s --check-prefix=IE64
23+
# RUN: llvm-objdump --no-show-raw-insn -dr -h a.64.ie | FileCheck %s --check-prefix=IE64
2524

2625
# RUN: ld.lld --no-relax -e 0 -z now a.64.o c.64.so -o a.64.ie.norelax
2726
# RUN: llvm-objdump --no-show-raw-insn -d -h a.64.ie.norelax | FileCheck %s --check-prefix=IE64-NORELAX
@@ -71,172 +70,199 @@
7170
# GD64-NEXT: jirl $ra, $ra, 0
7271
# GD64-NEXT: add.d $a4, $a0, $tp
7372

74-
# LE64-RELA: .rela.dyn {
75-
# LE64-RELA-NEXT: 0x30280 R_LARCH_TLS_DESC64 - 0x8
76-
# LE64-RELA-NEXT: 0x30290 R_LARCH_TLS_DESC64 - 0x800
77-
# LE64-RELA-NEXT: 0x302A0 R_LARCH_TLS_DESC64 - 0x1000
78-
# LE64-RELA-NEXT: 0x302B0 R_LARCH_TLS_DESC64 - 0x7FF
79-
# LE64-RELA-NEXT: }
80-
# LE64-RELA: Hex dump of section '.got':
81-
# LE64-RELA-NEXT: 0x00030280 00000000 00000000 00000000 00000000 .
82-
# LE64-RELA-NEXT: 0x00030290 00000000 00000000 00000000 00000000 .
83-
# LE64-RELA-NEXT: 0x000302a0 00000000 00000000 00000000 00000000 .
84-
# LE64-RELA-NEXT: 0x000302b0 00000000 00000000 00000000 00000000 .
85-
86-
# LE64: .got 00000040 0000000000030280
87-
88-
## &.got[a]-. = 0x30280 - 0x20228 = 16406<<2
89-
# LE64: 20228: pcaddi $a0, 16406
90-
# LE64-NEXT: ld.d $ra, $a0, 0
91-
# LE64-NEXT: jirl $ra, $ra, 0
73+
# LE64-RELA: could not find section '.got'
74+
75+
## a@tprel = 0x8
76+
# LE64: 20158: nop
77+
# LE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 a
78+
# LE64-NEXT: R_LARCH_RELAX *ABS*
79+
# LE64-NEXT: nop
80+
# LE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 a
81+
# LE64-NEXT: R_LARCH_RELAX *ABS*
82+
# LE64-NEXT: nop
83+
# LE64-NEXT: R_LARCH_TLS_DESC_LD a
84+
# LE64-NEXT: R_LARCH_RELAX *ABS*
85+
# LE64-NEXT: ori $a0, $zero, 8
86+
# LE64-NEXT: R_LARCH_TLS_DESC_CALL a
87+
# LE64-NEXT: R_LARCH_RELAX *ABS*
9288
# LE64-NEXT: add.d $a1, $a0, $tp
9389

94-
## &.got[b]-. = 0x30280+48 - 0x20238: 0x10 pages, page offset 0x2b0
95-
## R_LARCH_RELAX does not appear in pairs. No relaxation.
96-
# LE64: 20238: pcalau12i $a0, 16
97-
# LE64-NEXT: addi.d $a0, $a0, 688
98-
# LE64-NEXT: ld.d $ra, $a0, 0
99-
# LE64-NEXT: jirl $ra, $ra, 0
90+
## b@tprel = 0x7ff
91+
# LE64: 2016c: nop
92+
# LE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 b
93+
# LE64-NEXT: R_LARCH_RELAX *ABS*
94+
# LE64-NEXT: nop
95+
# LE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 b
96+
# LE64-NEXT: nop
97+
# LE64-NEXT: R_LARCH_TLS_DESC_LD b
98+
# LE64-NEXT: ori $a0, $zero, 2047
99+
# LE64-NEXT: R_LARCH_TLS_DESC_CALL b
100100
# LE64-NEXT: add.d $a2, $a0, $tp
101101

102-
## &.got[c]-. = 0x30280+16 - 0x2024c: 0x10 pages, page offset 0x290
102+
## c@tprel = 0x800
103103
## Without R_LARCH_RELAX relocation. No relaxation.
104-
# LE64: 2024c: pcalau12i $a0, 16
104+
# LE64: 20180: nop
105+
# LE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 c
105106
# LE64-NEXT: addi.d $t0, $zero, 0
106-
# LE64-NEXT: addi.d $a0, $a0, 656
107+
# LE64-NEXT: nop
108+
# LE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 c
107109
# LE64-NEXT: addi.d $t0, $t0, 1
108-
# LE64-NEXT: ld.d $ra, $a0, 0
110+
# LE64-NEXT: nop
111+
# LE64-NEXT: R_LARCH_TLS_DESC_LD c
109112
# LE64-NEXT: addi.d $t0, $t0, 1
110-
# LE64-NEXT: jirl $ra, $ra, 0
113+
# LE64-NEXT: ori $a0, $zero, 2048
114+
# LE64-NEXT: R_LARCH_TLS_DESC_CALL c
111115
# LE64-NEXT: add.d $a3, $a0, $tp
112116

113-
## &.got[d]-. = 0x30280+32 - 0x2026c = 16397<<2
114-
# LE64: 2026c: pcaddi $a0, 16397
115-
# LE64-NEXT: ld.d $ra, $a0, 0
116-
# LE64-NEXT: jirl $ra, $ra, 0
117+
## d@tprel = 0x1000
118+
# LE64: 201a0: nop
119+
# LE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 d
120+
# LE64-NEXT: R_LARCH_RELAX *ABS*
121+
# LE64-NEXT: nop
122+
# LE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 d
123+
# LE64-NEXT: R_LARCH_RELAX *ABS*
124+
# LE64-NEXT: lu12i.w $a0, 1
125+
# LE64-NEXT: R_LARCH_TLS_DESC_LD d
126+
# LE64-NEXT: ori $a0, $a0, 0
127+
# LE64-NEXT: R_LARCH_TLS_DESC_CALL d
117128
# LE64-NEXT: add.d $a4, $a0, $tp
118129

119-
# LE64-NORELAX: .got 00000040 0000000000030288
120-
121-
## &.got[a]-. = 0x30288 - 0x20228 = 0x10 pages, page offset 0x288
122-
# LE64-NORELAX: 20228: pcalau12i $a0, 16
123-
# LE64-NORELAX-NEXT: addi.d $a0, $a0, 648
124-
# LE64-NORELAX-NEXT: ld.d $ra, $a0, 0
125-
# LE64-NORELAX-NEXT: jirl $ra, $ra, 0
130+
## a@tprel = 0x8
131+
# LE64-NORELAX: 20158: nop
132+
# LE64-NORELAX-NEXT: nop
133+
# LE64-NORELAX-NEXT: nop
134+
# LE64-NORELAX-NEXT: ori $a0, $zero, 8
126135
# LE64-NORELAX-NEXT: add.d $a1, $a0, $tp
127136

128-
## &.got[b]-. = 0x30288+48 - 0x2023c: 0x10 pages, page offset 0x2b8
129-
## R_LARCH_RELAX does not appear in pairs. No relaxation.
130-
# LE64-NORELAX: 2023c: pcalau12i $a0, 16
131-
# LE64-NORELAX-NEXT: addi.d $a0, $a0, 696
132-
# LE64-NORELAX-NEXT: ld.d $ra, $a0, 0
133-
# LE64-NORELAX-NEXT: jirl $ra, $ra, 0
137+
## b@tprel = 0x7ff
138+
# LE64-NORELAX: 2016c: nop
139+
# LE64-NORELAX-NEXT: nop
140+
# LE64-NORELAX-NEXT: nop
141+
# LE64-NORELAX-NEXT: ori $a0, $zero, 2047
134142
# LE64-NORELAX-NEXT: add.d $a2, $a0, $tp
135143

136-
## &.got[c]-. = 0x30288+16 - 0x20250: 0x10 pages, page offset 0x298
144+
## c@tprel = 0x800
137145
## Without R_LARCH_RELAX relocation. No relaxation.
138-
# LE64-NORELAX: 20250: pcalau12i $a0, 16
146+
# LE64-NORELAX: 20180: nop
139147
# LE64-NORELAX-NEXT: addi.d $t0, $zero, 0
140-
# LE64-NORELAX-NEXT: addi.d $a0, $a0, 664
148+
# LE64-NORELAX-NEXT: nop
141149
# LE64-NORELAX-NEXT: addi.d $t0, $t0, 1
142-
# LE64-NORELAX-NEXT: ld.d $ra, $a0, 0
150+
# LE64-NORELAX-NEXT: nop
143151
# LE64-NORELAX-NEXT: addi.d $t0, $t0, 1
144-
# LE64-NORELAX-NEXT: jirl $ra, $ra, 0
152+
# LE64-NORELAX-NEXT: ori $a0, $zero, 2048
145153
# LE64-NORELAX-NEXT: add.d $a3, $a0, $tp
146154

147-
## &.got[d]-. = 0x30288+32 - 0x20270: 0x10 pages, page offset 0x2a8
148-
# LE64-NORELAX: 20270: pcalau12i $a0, 16
149-
# LE64-NORELAX-NEXT: addi.d $a0, $a0, 680
150-
# LE64-NORELAX-NEXT: ld.d $ra, $a0, 0
151-
# LE64-NORELAX-NEXT: jirl $ra, $ra, 0
155+
## d@tprel = 0x1000
156+
# LE64-NORELAX: 201a0: nop
157+
# LE64-NORELAX-NEXT: nop
158+
# LE64-NORELAX-NEXT: lu12i.w $a0, 1
159+
# LE64-NORELAX-NEXT: ori $a0, $a0, 0
152160
# LE64-NORELAX-NEXT: add.d $a4, $a0, $tp
153161

154162
# IE64-RELA: .rela.dyn {
155-
# IE64-RELA-NEXT: 0x30430 R_LARCH_TLS_DESC64 - 0x8
156-
# IE64-RELA-NEXT: 0x30460 R_LARCH_TLS_DESC64 - 0x7FF
157-
# IE64-RELA-NEXT: 0x30440 R_LARCH_TLS_DESC64 c 0x0
158-
# IE64-RELA-NEXT: 0x30450 R_LARCH_TLS_DESC64 d 0x0
163+
# IE64-RELA-NEXT: 0x30408 R_LARCH_TLS_TPREL64 c 0x0
164+
# IE64-RELA-NEXT: 0x30410 R_LARCH_TLS_TPREL64 d 0x0
159165
# IE64-RELA-NEXT: }
160166
# IE64-RELA: Hex dump of section '.got':
161-
# IE64-RELA-NEXT: 0x00030430 00000000 00000000 00000000 00000000 .
162-
# IE64-RELA-NEXT: 0x00030440 00000000 00000000 00000000 00000000 .
163-
# IE64-RELA-NEXT: 0x00030450 00000000 00000000 00000000 00000000 .
164-
# IE64-RELA-NEXT: 0x00030460 00000000 00000000 00000000 00000000 .
167+
# IE64-RELA-NEXT: 0x00030408 00000000 00000000 00000000 00000000 .
165168

166-
# IE64: .got 00000040 0000000000030430
169+
# IE64: .got 00000010 0000000000030408
167170

168171
## a and b are optimized to use LE. c and d are optimized to IE.
169-
## &.got[a]-. = 0x30430 - 0x202f8 = 16462<<2
170-
# IE64: 202f8: pcaddi $a0, 16462
171-
# IE64-NEXT: ld.d $ra, $a0, 0
172-
# IE64-NEXT: jirl $ra, $ra, 0
172+
## a@tprel = 0x8
173+
# IE64: 202c8: nop
174+
# IE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 a
175+
# IE64-NEXT: R_LARCH_RELAX *ABS*
176+
# IE64-NEXT: nop
177+
# IE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 a
178+
# IE64-NEXT: R_LARCH_RELAX *ABS*
179+
# IE64-NEXT: nop
180+
# IE64-NEXT: R_LARCH_TLS_DESC_LD a
181+
# IE64-NEXT: R_LARCH_RELAX *ABS*
182+
# IE64-NEXT: ori $a0, $zero, 8
183+
# IE64-NEXT: R_LARCH_TLS_DESC_CALL a
184+
# IE64-NEXT: R_LARCH_RELAX *ABS*
173185
# IE64-NEXT: add.d $a1, $a0, $tp
174186

175-
## &.got[b]-. = 0x30430+48 - 0x20308: 0x10 pages, page offset 0x460
176-
## R_LARCH_RELAX does not appear in pairs. No relaxation.
177-
# IE64: 20308: pcalau12i $a0, 16
178-
# IE64-NEXT: addi.d $a0, $a0, 1120
179-
# IE64-NEXT: ld.d $ra, $a0, 0
180-
# IE64-NEXT: jirl $ra, $ra, 0
187+
## b@tprel = 0x7ff
188+
# IE64: 202dc: nop
189+
# IE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 b
190+
# IE64-NEXT: R_LARCH_RELAX *ABS*
191+
# IE64-NEXT: nop
192+
# IE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 b
193+
# IE64-NEXT: nop
194+
# IE64-NEXT: R_LARCH_TLS_DESC_LD b
195+
# IE64-NEXT: ori $a0, $zero, 2047
196+
# IE64-NEXT: R_LARCH_TLS_DESC_CALL b
181197
# IE64-NEXT: add.d $a2, $a0, $tp
182198

183-
## &.got[c]-. = 0x30430+16 - 0x2031c: 0x10 pages, page offset 0x440
199+
## &.got[c]-. = 0x30408 - 0x20300: 0x10 pages, page offset 0x408
184200
## Without R_LARCH_RELAX relocation. No relaxation.
185-
# IE64: 2031c: pcalau12i $a0, 16
201+
# IE64: 202f0: nop
202+
# IE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 c
186203
# IE64-NEXT: addi.d $t0, $zero, 0
187-
# IE64-NEXT: addi.d $a0, $a0, 1088
204+
# IE64-NEXT: nop
205+
# IE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 c
188206
# IE64-NEXT: addi.d $t0, $t0, 1
189-
# IE64-NEXT: ld.d $ra, $a0, 0
207+
# IE64-NEXT: pcalau12i $a0, 16
208+
# IE64-NEXT: R_LARCH_TLS_DESC_LD c
190209
# IE64-NEXT: addi.d $t0, $t0, 1
191-
# IE64-NEXT: jirl $ra, $ra, 0
210+
# IE64-NEXT: ld.d $a0, $a0, 1032
211+
# IE64-NEXT: R_LARCH_TLS_DESC_CALL c
192212
# IE64-NEXT: add.d $a3, $a0, $tp
193213

194-
## &.got[d]-. = 0x30430+32 - 0x2033c = 16453<<2
195-
# IE64: 2033c: pcaddi $a0, 16453
196-
# IE64-NEXT: ld.d $ra, $a0, 0
197-
# IE64-NEXT: jirl $ra, $ra, 0
214+
## &.got[d]-. = 0x30408+8 - 0x20318: 0x10 pages, page offset 0x410
215+
# IE64: 20310: nop
216+
# IE64-NEXT: R_LARCH_TLS_DESC_PC_HI20 d
217+
# IE64-NEXT: R_LARCH_RELAX *ABS*
218+
# IE64-NEXT: nop
219+
# IE64-NEXT: R_LARCH_TLS_DESC_PC_LO12 d
220+
# IE64-NEXT: R_LARCH_RELAX *ABS*
221+
# IE64-NEXT: pcalau12i $a0, 16
222+
# IE64-NEXT: R_LARCH_TLS_DESC_LD d
223+
# IE64-NEXT: ld.d $a0, $a0, 1040
224+
# IE64-NEXT: R_LARCH_TLS_DESC_CALL d
198225
# IE64-NEXT: add.d $a4, $a0, $tp
199226

200-
# IE64-NORELAX: .got 00000040 0000000000030438
227+
# IE64-NORELAX: .got 00000010 0000000000030408
201228

202-
## &.got[a]-. = 0x30438 - 0x202f8 = 0x10 pages, page offset 0x438
203-
# IE64-NORELAX: 202f8: pcalau12i $a0, 16
204-
# IE64-NORELAX-NEXT: addi.d $a0, $a0, 1080
205-
# IE64-NORELAX-NEXT: ld.d $ra, $a0, 0
206-
# IE64-NORELAX-NEXT: jirl $ra, $ra, 0
229+
## a@tprel = 0x8
230+
# IE64-NORELAX: 202c8: nop
231+
# IE64-NORELAX-NEXT: nop
232+
# IE64-NORELAX-NEXT: nop
233+
# IE64-NORELAX-NEXT: ori $a0, $zero, 8
207234
# IE64-NORELAX-NEXT: add.d $a1, $a0, $tp
208235

209-
## &.got[b]-. = 0x30438+48 - 0x2030c: 0x10 pages, page offset 0x468
210-
## R_LARCH_RELAX does not appear in pairs. No relaxation.
211-
# IE64-NORELAX: 2030c: pcalau12i $a0, 16
212-
# IE64-NORELAX-NEXT: addi.d $a0, $a0, 1128
213-
# IE64-NORELAX-NEXT: ld.d $ra, $a0, 0
214-
# IE64-NORELAX-NEXT: jirl $ra, $ra, 0
236+
## b@tprel = 0x7ff
237+
# IE64-NORELAX: 202dc: nop
238+
# IE64-NORELAX-NEXT: nop
239+
# IE64-NORELAX-NEXT: nop
240+
# IE64-NORELAX-NEXT: ori $a0, $zero, 2047
215241
# IE64-NORELAX-NEXT: add.d $a2, $a0, $tp
216242

217-
## &.got[c]-. = 0x30438+16 - 0x20320: 0x10 pages, page offset 0x448
243+
## &.got[c]-. = 0x30408 - 0x20300: 0x10 pages, page offset 0x408
218244
## Without R_LARCH_RELAX relocation. No relaxation.
219-
# IE64-NORELAX: 20320: pcalau12i $a0, 16
245+
# IE64-NORELAX: 202f0: nop
220246
# IE64-NORELAX-NEXT: addi.d $t0, $zero, 0
221-
# IE64-NORELAX-NEXT: addi.d $a0, $a0, 1096
247+
# IE64-NORELAX-NEXT: nop
222248
# IE64-NORELAX-NEXT: addi.d $t0, $t0, 1
223-
# IE64-NORELAX-NEXT: ld.d $ra, $a0, 0
249+
# IE64-NORELAX-NEXT: pcalau12i $a0, 16
224250
# IE64-NORELAX-NEXT: addi.d $t0, $t0, 1
225-
# IE64-NORELAX-NEXT: jirl $ra, $ra, 0
251+
# IE64-NORELAX-NEXT: ld.d $a0, $a0, 1032
226252
# IE64-NORELAX-NEXT: add.d $a3, $a0, $tp
227253

228-
## &.got[d]-. = 0x30438+32 - 0x20340: 0x10 pages, page offset 0x458
229-
# IE64-NORELAX: 20340: pcalau12i $a0, 16
230-
# IE64-NORELAX-NEXT: addi.d $a0, $a0, 1112
231-
# IE64-NORELAX-NEXT: ld.d $ra, $a0, 0
232-
# IE64-NORELAX-NEXT: jirl $ra, $ra, 0
254+
## &.got[d]-. = 0x30408+8 - 0x20318: 0x10 pages, page offset 0x410
255+
# IE64-NORELAX: 20310: nop
256+
# IE64-NORELAX-NEXT: nop
257+
# IE64-NORELAX-NEXT: pcalau12i $a0, 16
258+
# IE64-NORELAX-NEXT: ld.d $a0, $a0, 1040
233259
# IE64-NORELAX-NEXT: add.d $a4, $a0, $tp
234260

235261
#--- a.s
236262
la.tls.desc $a0, a
237263
add.d $a1, $a0, $tp
238264

239-
# ADDI.D does not have R_LARCH_RELAX. No relaxation.
265+
# ADDI.D does not have R_LARCH_RELAX. No relaxation when it is not optimized to IE/LE (--shared).
240266
pcalau12i $a0, %desc_pc_hi20(b)
241267
.reloc .-4, R_LARCH_RELAX, 0
242268
addi.d $a0, $a0, %desc_pc_lo12(b)

0 commit comments

Comments
 (0)