Skip to content

Commit 880523c

Browse files
committed
Add test loongarch-relax-tlsdesc.s
1 parent 56c24f9 commit 880523c

File tree

1 file changed

+189
-0
lines changed

1 file changed

+189
-0
lines changed
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
# REQUIRES: loongarch
2+
# RUN: rm -rf %t && split-file %s %t && cd %t
3+
# RUN: llvm-mc -filetype=obj -triple=loongarch64 -mattr=+relax a.s -o a.64.o
4+
# RUN: llvm-mc -filetype=obj -triple=loongarch64 -mattr=+relax c.s -o c.64.o
5+
# RUN: ld.lld -shared -soname=c.64.so c.64.o -o c.64.so
6+
# RUN: llvm-mc -filetype=obj -triple=loongarch32 -mattr=+relax --defsym ELF32=1 a.s -o a.32.o
7+
# RUN: llvm-mc -filetype=obj -triple=loongarch32 -mattr=+relax --defsym ELF32=1 c.s -o c.32.o
8+
# RUN: ld.lld -shared -soname=c.32.so c.32.o -o c.32.so
9+
10+
## Test the TLSDESC relaxation. Also check --emit-relocs.
11+
# RUN: ld.lld -shared --emit-relocs -z now a.64.o c.64.o -o a.64.so
12+
# RUN: llvm-readobj -r -x .got a.64.so | FileCheck --check-prefix=GD64-RELA %s
13+
# RUN: llvm-objdump --no-show-raw-insn -dr a.64.so | FileCheck %s --check-prefix=GD64
14+
15+
## FIXME: The transition frome TLSDESC to IE/LE has not yet been implemented.
16+
## Keep the dynamic relocations and hand them over to dynamic linker.
17+
18+
# RUN: ld.lld -e 0 -z now --emit-relocs a.64.o c.64.o -o a.64.le
19+
# RUN: llvm-readobj -r -x .got a.64.le | FileCheck --check-prefix=LE64-RELA %s
20+
# RUN: llvm-objdump --no-show-raw-insn -d a.64.le | FileCheck %s --check-prefix=LE64
21+
22+
# RUN: ld.lld -e 0 -z now --emit-relocs a.64.o c.64.so -o a.64.ie
23+
# RUN: llvm-readobj -r -x .got a.64.ie | FileCheck --check-prefix=IE64-RELA %s
24+
# RUN: llvm-objdump --no-show-raw-insn -d a.64.ie | FileCheck %s --check-prefix=IE64
25+
26+
## 32-bit code is mostly the same. We only test a few variants.
27+
28+
# RUN: ld.lld -shared -z now a.32.o c.32.o -o rel.32.so -z rel
29+
# RUN: llvm-readobj -r -x .got rel.32.so | FileCheck --check-prefix=GD32-REL %s
30+
31+
# GD64-RELA: .rela.dyn {
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
36+
# GD64-RELA-NEXT: }
37+
# GD64-RELA: Hex dump of section '.got':
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 .
42+
43+
## &.got[a]-. = 0x20418 - 0x10318 = 16448<<2
44+
# GD64: 10318: pcaddi $a0, 16448
45+
# GD64-NEXT: ld.d $ra, $a0, 0
46+
# GD64-NEXT: jirl $ra, $ra, 0
47+
# GD64-NEXT: add.d $a1, $a0, $tp
48+
49+
## &.got[b]-. = 0x20418+48 - 0x10328 = 16456<<2
50+
# GD64: 10328: pcaddi $a0, 16456
51+
# GD64-NEXT: ld.d $ra, $a0, 0
52+
# GD64-NEXT: jirl $ra, $ra, 0
53+
# GD64-NEXT: add.d $a2, $a0, $tp
54+
55+
## &.got[c]-. = 0x20418+16 - 0x10338 = 16444<<2
56+
# GD64: 10338: pcaddi $a0, 16
57+
# GD64-NEXT: ld.d $ra, $a0, 0
58+
# GD64-NEXT: jirl $ra, $ra, 0
59+
# GD64-NEXT: add.d $a3, $a0, $tp
60+
61+
## &.got[d]-. = 0x20418+32 - 0x10348 = 16444<<2
62+
# GD64: 10348: pcaddi $a0, 16444
63+
# GD64-NEXT: ld.d $ra, $a0, 0
64+
# GD64-NEXT: jirl $ra, $ra, 0
65+
# GD64-NEXT: add.d $a4, $a0, $tp
66+
67+
# LE64-RELA: .rela.dyn {
68+
# LE64-RELA-NEXT: 0x30278 R_LARCH_TLS_DESC64 - 0x8
69+
# LE64-RELA-NEXT: 0x30288 R_LARCH_TLS_DESC64 - 0x800
70+
# LE64-RELA-NEXT: 0x30298 R_LARCH_TLS_DESC64 - 0x1000
71+
# LE64-RELA-NEXT: 0x302A8 R_LARCH_TLS_DESC64 - 0x7FF
72+
# LE64-RELA-NEXT: }
73+
# LE64-RELA: Hex dump of section '.got':
74+
# LE64-RELA-NEXT: 0x00030278 00000000 00000000 00000000 00000000 .
75+
# LE64-RELA-NEXT: 0x00030288 00000000 00000000 00000000 00000000 .
76+
# LE64-RELA-NEXT: 0x00030298 00000000 00000000 00000000 00000000 .
77+
# LE64-RELA-NEXT: 0x000302a8 00000000 00000000 00000000 00000000 .
78+
79+
# LE64-LABEL: <.text>:
80+
## &.got[a]-. = 0x30278 - 0x20228: 0x10 pages, page offset 0x278
81+
# LE64-NEXT: 20228: pcalau12i $a0, 16
82+
# LE64-NEXT: addi.d $a0, $a0, 632
83+
# LE64-NEXT: ld.d $ra, $a0, 0
84+
# LE64-NEXT: jirl $ra, $ra, 0
85+
# LE64-NEXT: add.d $a1, $a0, $tp
86+
## &.got[b]-. = 0x302a8 - 0x2023c: 0x10 pages, page offset 0x2a8
87+
# LE64-NEXT: 2023c: pcalau12i $a0, 16
88+
# LE64-NEXT: addi.d $a0, $a0, 680
89+
# LE64-NEXT: ld.d $ra, $a0, 0
90+
# LE64-NEXT: jirl $ra, $ra, 0
91+
# LE64-NEXT: add.d $a2, $a0, $tp
92+
## &.got[c]-. = 0x30288 - 0x20250: 0x10 pages, page offset 0x288
93+
# LE64-NEXT: 20250: pcalau12i $a0, 16
94+
# LE64-NEXT: addi.d $a0, $a0, 648
95+
# LE64-NEXT: ld.d $ra, $a0, 0
96+
# LE64-NEXT: jirl $ra, $ra, 0
97+
# LE64-NEXT: add.d $a3, $a0, $tp
98+
## &.got[d]-. = 0x30298 - 0x20264: 0x10 pages, page offset 0x298
99+
# LE64-NEXT: 20264: pcalau12i $a0, 16
100+
# LE64-NEXT: addi.d $a0, $a0, 664
101+
# LE64-NEXT: ld.d $ra, $a0, 0
102+
# LE64-NEXT: jirl $ra, $ra, 0
103+
# LE64-NEXT: add.d $a4, $a0, $tp
104+
105+
# IE64-RELA: .rela.dyn {
106+
# IE64-RELA-NEXT: 0x30428 R_LARCH_TLS_DESC64 - 0x8
107+
# IE64-RELA-NEXT: 0x30458 R_LARCH_TLS_DESC64 - 0x7FF
108+
# IE64-RELA-NEXT: 0x30438 R_LARCH_TLS_DESC64 c 0x0
109+
# IE64-RELA-NEXT: 0x30448 R_LARCH_TLS_DESC64 d 0x0
110+
# IE64-RELA-NEXT: }
111+
# IE64-RELA: Hex dump of section '.got':
112+
# IE64-RELA-NEXT: 0x00030428 00000000 00000000 00000000 00000000 .
113+
# IE64-RELA-NEXT: 0x00030438 00000000 00000000 00000000 00000000 .
114+
# IE64-RELA-NEXT: 0x00030448 00000000 00000000 00000000 00000000 .
115+
# IE64-RELA-NEXT: 0x00030458 00000000 00000000 00000000 00000000 .
116+
117+
## a and b are optimized to use LE. c and d are optimized to IE.
118+
# IE64-LABEL: <.text>:
119+
## &.got[a]-. = 0x30428 - 0x202f8: 0x10 pages, page offset 0x428
120+
# IE64-NEXT: 202f8: pcalau12i $a0, 16
121+
# IE64-NEXT: addi.d $a0, $a0, 1064
122+
# IE64-NEXT: ld.d $ra, $a0, 0
123+
# IE64-NEXT: jirl $ra, $ra, 0
124+
# IE64-NEXT: add.d $a1, $a0, $tp
125+
## &.got[b]-. = 0x30458 - 0x2030c: 0x10 pages, page offset 0x458
126+
# IE64-NEXT: 2030c: pcalau12i $a0, 16
127+
# IE64-NEXT: addi.d $a0, $a0, 1112
128+
# IE64-NEXT: ld.d $ra, $a0, 0
129+
# IE64-NEXT: jirl $ra, $ra, 0
130+
# IE64-NEXT: add.d $a2, $a0, $tp
131+
## &.got[c]-. = 0x30438 - 0x20320: 0x10 pages, page offset 0x438
132+
# IE64-NEXT: 20320: pcalau12i $a0, 16
133+
# IE64-NEXT: addi.d $a0, $a0, 1080
134+
# IE64-NEXT: ld.d $ra, $a0, 0
135+
# IE64-NEXT: jirl $ra, $ra, 0
136+
# IE64-NEXT: add.d $a3, $a0, $tp
137+
## &.got[d]-. = 0x30448 - 0x20334: 0x10 pages, page offset 0x448
138+
# IE64-NEXT: 20334: pcalau12i $a0, 16
139+
# IE64-NEXT: addi.d $a0, $a0, 1096
140+
# IE64-NEXT: ld.d $ra, $a0, 0
141+
# IE64-NEXT: jirl $ra, $ra, 0
142+
# IE64-NEXT: add.d $a4, $a0, $tp
143+
144+
# GD32-REL: .rel.dyn {
145+
# GD32-REL-NEXT: 0x202A4 R_LARCH_TLS_DESC32 -
146+
# GD32-REL-NEXT: 0x2028C R_LARCH_TLS_DESC32 a
147+
# GD32-REL-NEXT: 0x20294 R_LARCH_TLS_DESC32 c
148+
# GD32-REL-NEXT: 0x2029C R_LARCH_TLS_DESC32 d
149+
# GD32-REL-NEXT: }
150+
# GD32-REL: Hex dump of section '.got':
151+
# GD32-REL-NEXT: 0x0002028c 00000000 00000000 00000000 00000000 .
152+
# GD32-REL-NEXT: 0x0002029c 00000000 00000000 00000000 ff070000 .
153+
154+
#--- a.s
155+
.macro add dst, src1, src2
156+
.ifdef ELF32
157+
add.w \dst, \src1, \src2
158+
.else
159+
add.d \dst, \src1, \src2
160+
.endif
161+
.endm
162+
163+
la.tls.desc $a0, a
164+
add $a1, $a0, $tp
165+
166+
la.tls.desc $a0, b
167+
add $a2, $a0, $tp
168+
169+
la.tls.desc $a0, c
170+
add $a3, $a0, $tp
171+
172+
la.tls.desc $a0, d
173+
add $a4, $a0, $tp
174+
175+
.section .tbss,"awT",@nobits
176+
.globl a
177+
.zero 8
178+
a:
179+
.zero 2039 ## Place b at 0x7ff
180+
b:
181+
.zero 1
182+
183+
#--- c.s
184+
.section .tbss,"awT",@nobits
185+
.globl c, d
186+
c:
187+
.zero 2048 ## Place d at 0x1000
188+
d:
189+
.zero 4

0 commit comments

Comments
 (0)