Skip to content

Commit d9acf0c

Browse files
committed
[lld][LoongArch] Precommit test for TLSDESC GD/LD to LE/IE.
Add symbol `d` in loongarch-tlsdesc-extreme.s/loongarch-tlsdesc-pcrel20-s2.s, which is placed at 0x1000. After optimization to LE, it will generate two instructions.
1 parent ac1d560 commit d9acf0c

File tree

3 files changed

+318
-79
lines changed

3 files changed

+318
-79
lines changed
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
# REQUIRES: loongarch
2+
# RUN: rm -rf %t && split-file %s %t && cd %t
3+
# RUN: llvm-mc -filetype=obj -triple=loongarch64 a.s -o a.64.o
4+
# RUN: llvm-mc -filetype=obj -triple=loongarch64 c.s -o c.64.o
5+
# RUN: ld.lld -shared -soname=c.64.so c.64.o -o c.64.so
6+
7+
# RUN: ld.lld -shared -z now a.64.o c.64.o -o a.64.so
8+
# RUN: llvm-readobj -r -x .got a.64.so | FileCheck --check-prefix=GD64-RELA %s
9+
# RUN: llvm-objdump --no-show-raw-insn -h -d a.64.so | FileCheck %s --check-prefix=GD64
10+
11+
# RUN: ld.lld -shared -z now a.64.o c.64.o -o rel.64.so -z rel
12+
# RUN: llvm-readobj -r -x .got rel.64.so | FileCheck --check-prefix=GD64-REL %s
13+
14+
## FIXME: The transition frome TLSDESC to IE/LE has not yet been implemented.
15+
## Keep the dynamic relocations and hand them over to dynamic linker.
16+
17+
# RUN: ld.lld -e 0 -z now a.64.o c.64.o -o a.64.le
18+
# RUN: llvm-readobj -r -x .got a.64.le | FileCheck --check-prefix=LE64-RELA %s
19+
20+
# RUN: ld.lld -e 0 -z now a.64.o c.64.so -o a.64.ie
21+
# RUN: llvm-readobj -r -x .got a.64.ie | FileCheck --check-prefix=IE64-RELA %s
22+
23+
# GD64-RELA: .rela.dyn {
24+
# GD64-RELA-NEXT: 0x20568 R_LARCH_TLS_DESC64 - 0x1000
25+
# GD64-RELA-NEXT: 0x20518 R_LARCH_TLS_DESC64 a 0x0
26+
# GD64-RELA-NEXT: 0x20528 R_LARCH_TLS_DESC64 c 0x0
27+
# GD64-RELA-NEXT: 0x20538 R_LARCH_TLS_DESC64 d 0x0
28+
# GD64-RELA-NEXT: 0x20548 R_LARCH_TLS_DESC64 e 0x0
29+
# GD64-RELA-NEXT: 0x20558 R_LARCH_TLS_DESC64 f 0x0
30+
# GD64-RELA-NEXT: }
31+
# GD64-RELA: Hex dump of section '.got':
32+
# GD64-RELA-NEXT: 0x00020518 00000000 00000000 00000000 00000000 .
33+
# GD64-RELA-NEXT: 0x00020528 00000000 00000000 00000000 00000000 .
34+
# GD64-RELA-NEXT: 0x00020538 00000000 00000000 00000000 00000000 .
35+
# GD64-RELA-NEXT: 0x00020548 00000000 00000000 00000000 00000000 .
36+
# GD64-RELA-NEXT: 0x00020558 00000000 00000000 00000000 00000000 .
37+
# GD64-RELA-NEXT: 0x00020568 00000000 00000000 00000000 00000000 .
38+
39+
# GD64-REL: .rel.dyn {
40+
# GD64-REL-NEXT: 0x20538 R_LARCH_TLS_DESC64 -
41+
# GD64-REL-NEXT: 0x204E8 R_LARCH_TLS_DESC64 a
42+
# GD64-REL-NEXT: 0x204F8 R_LARCH_TLS_DESC64 c
43+
# GD64-REL-NEXT: 0x20508 R_LARCH_TLS_DESC64 d
44+
# GD64-REL-NEXT: 0x20518 R_LARCH_TLS_DESC64 e
45+
# GD64-REL-NEXT: 0x20528 R_LARCH_TLS_DESC64 f
46+
# GD64-REL-NEXT: }
47+
# GD64-REL: Hex dump of section '.got':
48+
# GD64-REL-NEXT: 0x000204e8 00000000 00000000 00000000 00000000 .
49+
# GD64-REL-NEXT: 0x000204f8 00000000 00000000 00000000 00000000 .
50+
# GD64-REL-NEXT: 0x00020508 00000000 00000000 00000000 00000000 .
51+
# GD64-REL-NEXT: 0x00020518 00000000 00000000 00000000 00000000 .
52+
# GD64-REL-NEXT: 0x00020528 00000000 00000000 00000000 00000000 .
53+
# GD64-REL-NEXT: 0x00020538 00000000 00000000 00100000 00000000 .
54+
55+
# GD64: .got 00000060 0000000000020518
56+
57+
## &.got[a]-. = 0x20518 - 0x10398: 0x10 pages, page offset 0x518
58+
# GD64: 10398: pcalau12i $a0, 16
59+
# GD64-NEXT: addi.d $t0, $zero, 1304
60+
# GD64-NEXT: lu32i.d $t0, 0
61+
# GD64-NEXT: lu52i.d $t0, $t0, 0
62+
# GD64-NEXT: add.d $a0, $a0, $t0
63+
# GD64-NEXT: ld.d $ra, $a0, 0
64+
# GD64-NEXT: jirl $ra, $ra, 0
65+
# GD64-NEXT: add.d $a1, $a0, $tp
66+
67+
## &.got[b]-. = 0x20518+80 - 0x103b8: 0x10 pages, page offset 0x568
68+
# GD64: 103b8: pcalau12i $a0, 16
69+
# GD64-NEXT: addi.d $t0, $zero, 1384
70+
# GD64-NEXT: lu32i.d $t0, 0
71+
# GD64-NEXT: lu52i.d $t0, $t0, 0
72+
# GD64-NEXT: add.d $a0, $a0, $t0
73+
# GD64-NEXT: ld.d $ra, $a0, 0
74+
# GD64-NEXT: jirl $ra, $ra, 0
75+
# GD64-NEXT: add.d $a2, $a0, $tp
76+
77+
## &.got[c]-. = 0x20518+16 - 0x103d8: 0x10 pages, page offset 0x528
78+
# GD64: 103d8: pcalau12i $a0, 16
79+
# GD64-NEXT: addi.d $t0, $zero, 1320
80+
# GD64-NEXT: lu32i.d $t0, 0
81+
# GD64-NEXT: lu52i.d $t0, $t0, 0
82+
# GD64-NEXT: add.d $a0, $a0, $t0
83+
# GD64-NEXT: ld.d $ra, $a0, 0
84+
# GD64-NEXT: jirl $ra, $ra, 0
85+
# GD64-NEXT: add.d $a3, $a0, $tp
86+
87+
## &.got[d]-. = 0x20518+32 - 0x103f8: 0x10 pages, page offset 0x538
88+
# GD64: 103f8: pcalau12i $a0, 16
89+
# GD64-NEXT: addi.d $t0, $zero, 1336
90+
# GD64-NEXT: lu32i.d $t0, 0
91+
# GD64-NEXT: lu52i.d $t0, $t0, 0
92+
# GD64-NEXT: add.d $a0, $a0, $t0
93+
# GD64-NEXT: ld.d $ra, $a0, 0
94+
# GD64-NEXT: jirl $ra, $ra, 0
95+
# GD64-NEXT: add.d $a4, $a0, $tp
96+
97+
## &.got[e]-. = 0x20518+48 - 0x10418: 0x10 pages, page offset 0x548
98+
# GD64: 10418: pcalau12i $a0, 16
99+
# GD64-NEXT: addi.d $t0, $zero, 1352
100+
# GD64-NEXT: lu32i.d $t0, 0
101+
# GD64-NEXT: lu52i.d $t0, $t0, 0
102+
# GD64-NEXT: add.d $a0, $a0, $t0
103+
# GD64-NEXT: ld.d $ra, $a0, 0
104+
# GD64-NEXT: jirl $ra, $ra, 0
105+
# GD64-NEXT: add.d $a5, $a0, $tp
106+
107+
## &.got[f]-. = 0x20518+64 - 0x10438: 0x10 pages, page offset 0x558
108+
# GD64: 10438: pcalau12i $a0, 16
109+
# GD64-NEXT: addi.d $t0, $zero, 1368
110+
# GD64-NEXT: lu32i.d $t0, 0
111+
# GD64-NEXT: lu52i.d $t0, $t0, 0
112+
# GD64-NEXT: add.d $a0, $a0, $t0
113+
# GD64-NEXT: ld.d $ra, $a0, 0
114+
# GD64-NEXT: jirl $ra, $ra, 0
115+
# GD64-NEXT: add.d $a6, $a0, $tp
116+
117+
# LE64-RELA: .rela.dyn {
118+
# LE64-RELA-NEXT: 0x30318 R_LARCH_TLS_DESC64 - 0x8
119+
# LE64-RELA-NEXT: 0x30328 R_LARCH_TLS_DESC64 - 0x7FFFFFFF
120+
# LE64-RELA-NEXT: 0x30338 R_LARCH_TLS_DESC64 - 0x80000000
121+
# LE64-RELA-NEXT: 0x30348 R_LARCH_TLS_DESC64 - 0x100000000
122+
# LE64-RELA-NEXT: 0x30358 R_LARCH_TLS_DESC64 - 0x10000000000000
123+
# LE64-RELA-NEXT: 0x30368 R_LARCH_TLS_DESC64 - 0x1000
124+
# LE64-RELA-NEXT: }
125+
# LE64-RELA: Hex dump of section '.got':
126+
# LE64-RELA-NEXT: 0x00030318 00000000 00000000 00000000 00000000 .
127+
# LE64-RELA-NEXT: 0x00030328 00000000 00000000 00000000 00000000 .
128+
# LE64-RELA-NEXT: 0x00030338 00000000 00000000 00000000 00000000 .
129+
# LE64-RELA-NEXT: 0x00030348 00000000 00000000 00000000 00000000 .
130+
# LE64-RELA-NEXT: 0x00030358 00000000 00000000 00000000 00000000 .
131+
# LE64-RELA-NEXT: 0x00030368 00000000 00000000 00000000 00000000 .
132+
133+
# IE64-RELA: .rela.dyn {
134+
# IE64-RELA-NEXT: 0x30508 R_LARCH_TLS_DESC64 - 0x8
135+
# IE64-RELA-NEXT: 0x30558 R_LARCH_TLS_DESC64 - 0x1000
136+
# IE64-RELA-NEXT: 0x30518 R_LARCH_TLS_DESC64 c 0x0
137+
# IE64-RELA-NEXT: 0x30528 R_LARCH_TLS_DESC64 d 0x0
138+
# IE64-RELA-NEXT: 0x30538 R_LARCH_TLS_DESC64 e 0x0
139+
# IE64-RELA-NEXT: 0x30548 R_LARCH_TLS_DESC64 f 0x0
140+
# IE64-RELA-NEXT: }
141+
# IE64-RELA: Hex dump of section '.got':
142+
# IE64-RELA-NEXT: 0x00030508 00000000 00000000 00000000 00000000 .
143+
# IE64-RELA-NEXT: 0x00030518 00000000 00000000 00000000 00000000 .
144+
# IE64-RELA-NEXT: 0x00030528 00000000 00000000 00000000 00000000 .
145+
# IE64-RELA-NEXT: 0x00030538 00000000 00000000 00000000 00000000 .
146+
# IE64-RELA-NEXT: 0x00030548 00000000 00000000 00000000 00000000 .
147+
# IE64-RELA-NEXT: 0x00030558 00000000 00000000 00000000 00000000 .
148+
149+
#--- a.s
150+
.macro add dst, src1, src2
151+
.ifdef ELF32
152+
add.w \dst, \src1, \src2
153+
.else
154+
add.d \dst, \src1, \src2
155+
.endif
156+
.endm
157+
158+
la.tls.desc $a0, $t0, a
159+
add $a1, $a0, $tp
160+
161+
la.tls.desc $a0, $t0, b
162+
add $a2, $a0, $tp
163+
164+
la.tls.desc $a0, $t0, c
165+
add $a3, $a0, $tp
166+
167+
la.tls.desc $a0, $t0, d
168+
add $a4, $a0, $tp
169+
170+
la.tls.desc $a0, $t0, e
171+
add $a5, $a0, $tp
172+
173+
la.tls.desc $a0, $t0, f
174+
add $a6, $a0, $tp
175+
176+
.section .tbss,"awT",@nobits
177+
.globl a
178+
.zero 8
179+
a:
180+
.zero 0x1000-8 ## Place b at 0x1000
181+
b:
182+
183+
#--- c.s
184+
.section .tbss,"awT",@nobits
185+
.globl c, d, e, f
186+
.zero 0x80000000-0x1000-1 ## Place c at 0x7fffffff
187+
c:
188+
.zero 1 ## Place d at 0x8000,0000
189+
d:
190+
.zero 0x100000000-0x80000000 ## Place e at 0x1,0000,0000
191+
e:
192+
.zero 0x10000000000000-0x100000000 ## Place f at 0x10,0000,0000,0000
193+
f:
194+

lld/test/ELF/loongarch-tlsdesc-pcrel20-s2.s

Lines changed: 61 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -29,73 +29,88 @@
2929
# RUN: llvm-readobj -r -x .got rel.32.so | FileCheck --check-prefix=GD32-REL %s
3030

3131
# GD64-RELA: .rela.dyn {
32-
# GD64-RELA-NEXT: 0x203F0 R_LARCH_TLS_DESC64 - 0x7FF
33-
# GD64-RELA-NEXT: 0x203D0 R_LARCH_TLS_DESC64 a 0x0
34-
# GD64-RELA-NEXT: 0x203E0 R_LARCH_TLS_DESC64 c 0x0
32+
# GD64-RELA-NEXT: 0x20448 R_LARCH_TLS_DESC64 - 0x7FF
33+
# GD64-RELA-NEXT: 0x20418 R_LARCH_TLS_DESC64 a 0x0
34+
# GD64-RELA-NEXT: 0x20428 R_LARCH_TLS_DESC64 c 0x0
35+
# GD64-RELA-NEXT: 0x20438 R_LARCH_TLS_DESC64 d 0x0
3536
# GD64-RELA-NEXT: }
3637
# GD64-RELA: Hex dump of section '.got':
37-
# GD64-RELA-NEXT: 0x000203d0 00000000 00000000 00000000 00000000 .
38-
# GD64-RELA-NEXT: 0x000203e0 00000000 00000000 00000000 00000000 .
39-
# GD64-RELA-NEXT: 0x000203f0 00000000 00000000 00000000 00000000 .
38+
# GD64-RELA-NEXT: 0x00020418 00000000 00000000 00000000 00000000 .
39+
# GD64-RELA-NEXT: 0x00020428 00000000 00000000 00000000 00000000 .
40+
# GD64-RELA-NEXT: 0x00020438 00000000 00000000 00000000 00000000 .
41+
# GD64-RELA-NEXT: 0x00020448 00000000 00000000 00000000 00000000 .
4042

4143
# GD64-REL: .rel.dyn {
42-
# GD64-REL-NEXT: 0x203D8 R_LARCH_TLS_DESC64 -
43-
# GD64-REL-NEXT: 0x203B8 R_LARCH_TLS_DESC64 a
44-
# GD64-REL-NEXT: 0x203C8 R_LARCH_TLS_DESC64 c
44+
# GD64-REL-NEXT: 0x20428 R_LARCH_TLS_DESC64 -
45+
# GD64-REL-NEXT: 0x203F8 R_LARCH_TLS_DESC64 a
46+
# GD64-REL-NEXT: 0x20408 R_LARCH_TLS_DESC64 c
47+
# GD64-REL-NEXT: 0x20418 R_LARCH_TLS_DESC64 d
4548
# GD64-REL-NEXT: }
4649
# GD64-REL: Hex dump of section '.got':
47-
# GD64-REL-NEXT: 0x000203b8 00000000 00000000 00000000 00000000 .
48-
# GD64-REL-NEXT: 0x000203c8 00000000 00000000 00000000 00000000 .
49-
# GD64-REL-NEXT: 0x000203d8 00000000 00000000 ff070000 00000000 .
50+
# GD64-REL-NEXT: 0x000203f8 00000000 00000000 00000000 00000000 .
51+
# GD64-REL-NEXT: 0x00020408 00000000 00000000 00000000 00000000 .
52+
# GD64-REL-NEXT: 0x00020418 00000000 00000000 00000000 00000000 .
53+
# GD64-REL-NEXT: 0x00020428 00000000 00000000 ff070000 00000000 .
5054

51-
# GD64: .got 00000030 00000000000203d0
55+
# GD64: .got 00000040 0000000000020418
5256

53-
## &.got[a]-. = 0x203d0 - 0x102e0 = 16444<<2
54-
# GD64: 102e0: pcaddi $a0, 16444
57+
## &.got[a]-. = 0x20418 - 0x10318 = 16448<<2
58+
# GD64: 10318: pcaddi $a0, 16448
5559
# GD64-NEXT: ld.d $ra, $a0, 0
5660
# GD64-NEXT: jirl $ra, $ra, 0
5761
# GD64-NEXT: add.d $a1, $a0, $tp
5862

59-
## &.got[b]-. = 0x203d0+32 - 0x102f0 = 16448<<2
60-
# GD64: 102f0: pcaddi $a0, 16448
63+
## &.got[b]-. = 0x20418+48 - 0x10328 = 16456<<2
64+
# GD64: 10328: pcaddi $a0, 16456
6165
# GD64-NEXT: ld.d $ra, $a0, 0
6266
# GD64-NEXT: jirl $ra, $ra, 0
6367
# GD64-NEXT: add.d $a2, $a0, $tp
6468

65-
## &.got[c]-. = 0x203d0+16 - 0x10300 = 16440<<2
66-
# GD64: 10300: pcaddi $a0, 16440
69+
## &.got[c]-. = 0x20418+16 - 0x10338 = 16444<<2
70+
# GD64: 10338: pcaddi $a0, 16444
6771
# GD64-NEXT: ld.d $ra, $a0, 0
6872
# GD64-NEXT: jirl $ra, $ra, 0
6973
# GD64-NEXT: add.d $a3, $a0, $tp
7074

75+
## &.got[d]-. = 0x20418+32 - 0x10348 = 16444<<2
76+
# GD64: 10348: pcaddi $a0, 16444
77+
# GD64-NEXT: ld.d $ra, $a0, 0
78+
# GD64-NEXT: jirl $ra, $ra, 0
79+
# GD64-NEXT: add.d $a4, $a0, $tp
80+
7181
# LE64-RELA: .rela.dyn {
72-
# LE64-RELA-NEXT: 0x30240 R_LARCH_TLS_DESC64 - 0x8
73-
# LE64-RELA-NEXT: 0x30250 R_LARCH_TLS_DESC64 - 0x800
74-
# LE64-RELA-NEXT: 0x30260 R_LARCH_TLS_DESC64 - 0x7FF
82+
# LE64-RELA-NEXT: 0x30268 R_LARCH_TLS_DESC64 - 0x8
83+
# LE64-RELA-NEXT: 0x30278 R_LARCH_TLS_DESC64 - 0x800
84+
# LE64-RELA-NEXT: 0x30288 R_LARCH_TLS_DESC64 - 0x1000
85+
# LE64-RELA-NEXT: 0x30298 R_LARCH_TLS_DESC64 - 0x7FF
7586
# LE64-RELA-NEXT: }
7687
# LE64-RELA: Hex dump of section '.got':
77-
# LE64-RELA-NEXT: 0x00030240 00000000 00000000 00000000 00000000 .
78-
# LE64-RELA-NEXT: 0x00030250 00000000 00000000 00000000 00000000 .
79-
# LE64-RELA-NEXT: 0x00030260 00000000 00000000 00000000 00000000 .
88+
# LE64-RELA-NEXT: 0x00030268 00000000 00000000 00000000 00000000 .
89+
# LE64-RELA-NEXT: 0x00030278 00000000 00000000 00000000 00000000 .
90+
# LE64-RELA-NEXT: 0x00030288 00000000 00000000 00000000 00000000 .
91+
# LE64-RELA-NEXT: 0x00030298 00000000 00000000 00000000 00000000 .
8092

8193
# IE64-RELA: .rela.dyn {
82-
# IE64-RELA-NEXT: 0x303C8 R_LARCH_TLS_DESC64 - 0x8
83-
# IE64-RELA-NEXT: 0x303E8 R_LARCH_TLS_DESC64 - 0x7FF
84-
# IE64-RELA-NEXT: 0x303D8 R_LARCH_TLS_DESC64 c 0x0
94+
# IE64-RELA-NEXT: 0x30418 R_LARCH_TLS_DESC64 - 0x8
95+
# IE64-RELA-NEXT: 0x30448 R_LARCH_TLS_DESC64 - 0x7FF
96+
# IE64-RELA-NEXT: 0x30428 R_LARCH_TLS_DESC64 c 0x0
97+
# IE64-RELA-NEXT: 0x30438 R_LARCH_TLS_DESC64 d 0x0
8598
# IE64-RELA-NEXT: }
8699
# IE64-RELA: Hex dump of section '.got':
87-
# IE64-RELA-NEXT: 0x000303c8 00000000 00000000 00000000 00000000 .
88-
# IE64-RELA-NEXT: 0x000303d8 00000000 00000000 00000000 00000000 .
89-
# IE64-RELA-NEXT: 0x000303e8 00000000 00000000 00000000 00000000 .
100+
# IE64-RELA-NEXT: 0x00030418 00000000 00000000 00000000 00000000 .
101+
# IE64-RELA-NEXT: 0x00030428 00000000 00000000 00000000 00000000 .
102+
# IE64-RELA-NEXT: 0x00030438 00000000 00000000 00000000 00000000 .
103+
# IE64-RELA-NEXT: 0x00030448 00000000 00000000 00000000 00000000 .
90104

91105
# GD32-REL: .rel.dyn {
92-
# GD32-REL-NEXT: 0x20264 R_LARCH_TLS_DESC32 -
93-
# GD32-REL-NEXT: 0x20254 R_LARCH_TLS_DESC32 a
94-
# GD32-REL-NEXT: 0x2025C R_LARCH_TLS_DESC32 c
106+
# GD32-REL-NEXT: 0x202A4 R_LARCH_TLS_DESC32 -
107+
# GD32-REL-NEXT: 0x2028C R_LARCH_TLS_DESC32 a
108+
# GD32-REL-NEXT: 0x20294 R_LARCH_TLS_DESC32 c
109+
# GD32-REL-NEXT: 0x2029C R_LARCH_TLS_DESC32 d
95110
# GD32-REL-NEXT: }
96111
# GD32-REL: Hex dump of section '.got':
97-
# GD32-REL-NEXT: 0x00020254 00000000 00000000 00000000 00000000 .
98-
# GD32-REL-NEXT: 0x00020264 00000000 ff070000 .
112+
# GD32-REL-NEXT: 0x0002028c 00000000 00000000 00000000 00000000 .
113+
# GD32-REL-NEXT: 0x0002029c 00000000 00000000 00000000 ff070000 .
99114

100115
#--- a.s
101116
.macro add dst, src1, src2
@@ -128,6 +143,11 @@ load $ra, $a0, %desc_ld(c)
128143
jirl $ra, $ra, %desc_call(c)
129144
add $a3, $a0, $tp
130145

146+
pcaddi $a0, %desc_pcrel_20(d)
147+
load $ra, $a0, %desc_ld(d)
148+
jirl $ra, $ra, %desc_call(d)
149+
add $a4, $a0, $tp
150+
131151
.section .tbss,"awT",@nobits
132152
.globl a
133153
.zero 8
@@ -138,5 +158,8 @@ b:
138158

139159
#--- c.s
140160
.section .tbss,"awT",@nobits
141-
.globl c
142-
c: .zero 4
161+
.globl c, d
162+
c:
163+
.zero 2048 ## Place d at 0x1000
164+
d:
165+
.zero 4

0 commit comments

Comments
 (0)