Skip to content

Commit d728d60

Browse files
wangleiattru
authored andcommitted
[lld][ELF][LoongArch] Support R_LARCH_TLS_{LD,GD,DESC}_PCREL_S2
Reviewed By: MaskRay, SixWeining Pull Request: #100105 (cherry picked from commit 0057a96)
1 parent cbfbbd7 commit d728d60

File tree

5 files changed

+365
-1
lines changed

5 files changed

+365
-1
lines changed

lld/ELF/Arch/LoongArch.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,12 @@ RelExpr LoongArch::getRelExpr(const RelType type, const Symbol &s,
511511
return R_TLSDESC;
512512
case R_LARCH_TLS_DESC_CALL:
513513
return R_TLSDESC_CALL;
514+
case R_LARCH_TLS_LD_PCREL20_S2:
515+
return R_TLSLD_PC;
516+
case R_LARCH_TLS_GD_PCREL20_S2:
517+
return R_TLSGD_PC;
518+
case R_LARCH_TLS_DESC_PCREL20_S2:
519+
return R_TLSDESC_PC;
514520

515521
// Other known relocs that are explicitly unimplemented:
516522
//
@@ -557,7 +563,11 @@ void LoongArch::relocate(uint8_t *loc, const Relocation &rel,
557563
write64le(loc, val);
558564
return;
559565

566+
// Relocs intended for `pcaddi`.
560567
case R_LARCH_PCREL20_S2:
568+
case R_LARCH_TLS_LD_PCREL20_S2:
569+
case R_LARCH_TLS_GD_PCREL20_S2:
570+
case R_LARCH_TLS_DESC_PCREL20_S2:
561571
checkInt(loc, val, 22, rel);
562572
checkAlignment(loc, val, 4, rel);
563573
write32le(loc, setJ20(read32le(loc), val >> 2));

lld/ELF/Relocations.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1309,7 +1309,8 @@ static unsigned handleTlsRelocation(RelType type, Symbol &sym,
13091309
// LoongArch does not yet implement transition from TLSDESC to LE/IE, so
13101310
// generate TLSDESC dynamic relocation for the dynamic linker to handle.
13111311
if (config->emachine == EM_LOONGARCH &&
1312-
oneof<R_LOONGARCH_TLSDESC_PAGE_PC, R_TLSDESC, R_TLSDESC_CALL>(expr)) {
1312+
oneof<R_LOONGARCH_TLSDESC_PAGE_PC, R_TLSDESC, R_TLSDESC_PC,
1313+
R_TLSDESC_CALL>(expr)) {
13131314
if (expr != R_TLSDESC_CALL) {
13141315
sym.setFlags(NEEDS_TLSDESC);
13151316
c.addReloc({expr, type, offset, addend, &sym});
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# REQUIRES: loongarch
2+
# RUN: rm -rf %t && split-file %s %t
3+
4+
# RUN: llvm-mc --filetype=obj --triple=loongarch32 %t/a.s -o %t/a.32.o
5+
# RUN: llvm-mc --filetype=obj --triple=loongarch32 %t/bc.s -o %t/bc.32.o
6+
# RUN: ld.lld -shared -soname=bc.so %t/bc.32.o -o %t/bc.32.so
7+
# RUN: llvm-mc --filetype=obj --triple=loongarch32 %t/tga.s -o %t/tga.32.o
8+
# RUN: llvm-mc --filetype=obj --triple=loongarch64 %t/a.s -o %t/a.64.o
9+
# RUN: llvm-mc --filetype=obj --triple=loongarch64 %t/bc.s -o %t/bc.64.o
10+
# RUN: ld.lld -shared -soname=bc.so %t/bc.64.o -o %t/bc.64.so
11+
# RUN: llvm-mc --filetype=obj --triple=loongarch64 %t/tga.s -o %t/tga.64.o
12+
13+
## LA32 GD
14+
# RUN: ld.lld -shared %t/a.32.o %t/bc.32.o -o %t/gd.32.so
15+
# RUN: llvm-readobj -r %t/gd.32.so | FileCheck --check-prefix=GD32-REL %s
16+
# RUN: llvm-objdump -d --no-show-raw-insn %t/gd.32.so | FileCheck --check-prefix=GD32 %s
17+
18+
## LA32 GD -> LE
19+
# RUN: ld.lld %t/a.32.o %t/bc.32.o %t/tga.32.o -o %t/le.32
20+
# RUN: llvm-readelf -r %t/le.32 | FileCheck --check-prefix=NOREL %s
21+
# RUN: llvm-readelf -x .got %t/le.32 | FileCheck --check-prefix=LE32-GOT %s
22+
# RUN: ld.lld -pie %t/a.32.o %t/bc.32.o %t/tga.32.o -o %t/le-pie.32
23+
# RUN: llvm-readelf -r %t/le-pie.32 | FileCheck --check-prefix=NOREL %s
24+
# RUN: llvm-readelf -x .got %t/le-pie.32 | FileCheck --check-prefix=LE32-GOT %s
25+
26+
## LA32 GD -> IE
27+
# RUN: ld.lld %t/a.32.o %t/bc.32.so %t/tga.32.o -o %t/ie.32
28+
# RUN: llvm-readobj -r %t/ie.32 | FileCheck --check-prefix=IE32-REL %s
29+
# RUN: llvm-readelf -x .got %t/ie.32 | FileCheck --check-prefix=IE32-GOT %s
30+
31+
## LA64 GD
32+
# RUN: ld.lld -shared %t/a.64.o %t/bc.64.o -o %t/gd.64.so
33+
# RUN: llvm-readobj -r %t/gd.64.so | FileCheck --check-prefix=GD64-REL %s
34+
# RUN: llvm-objdump -d --no-show-raw-insn %t/gd.64.so | FileCheck --check-prefix=GD64 %s
35+
36+
## LA64 GD -> LE
37+
# RUN: ld.lld %t/a.64.o %t/bc.64.o %t/tga.64.o -o %t/le.64
38+
# RUN: llvm-readelf -r %t/le.64 | FileCheck --check-prefix=NOREL %s
39+
# RUN: llvm-readelf -x .got %t/le.64 | FileCheck --check-prefix=LE64-GOT %s
40+
# RUN: ld.lld -pie %t/a.64.o %t/bc.64.o %t/tga.64.o -o %t/le-pie.64
41+
# RUN: llvm-readelf -r %t/le-pie.64 | FileCheck --check-prefix=NOREL %s
42+
# RUN: llvm-readelf -x .got %t/le-pie.64 | FileCheck --check-prefix=LE64-GOT %s
43+
44+
## LA64 GD -> IE
45+
# RUN: ld.lld %t/a.64.o %t/bc.64.so %t/tga.64.o -o %t/ie.64
46+
# RUN: llvm-readobj -r %t/ie.64 | FileCheck --check-prefix=IE64-REL %s
47+
# RUN: llvm-readelf -x .got %t/ie.64 | FileCheck --check-prefix=IE64-GOT %s
48+
49+
# GD32-REL: .rela.dyn {
50+
# GD32-REL-NEXT: 0x20300 R_LARCH_TLS_DTPMOD32 a 0x0
51+
# GD32-REL-NEXT: 0x20304 R_LARCH_TLS_DTPREL32 a 0x0
52+
# GD32-REL-NEXT: 0x20308 R_LARCH_TLS_DTPMOD32 b 0x0
53+
# GD32-REL-NEXT: 0x2030C R_LARCH_TLS_DTPREL32 b 0x0
54+
# GD32-REL-NEXT: }
55+
56+
## &DTPMOD(a) - . = 0x20300 - 0x10250 = 16428<<2
57+
# GD32: 10250: pcaddi $a0, 16428
58+
# GD32-NEXT: bl 44
59+
60+
## &DTPMOD(b) - . = 0x20308 - 0x10258 = 16428<<2
61+
# GD32: 10258: pcaddi $a0, 16428
62+
# GD32-NEXT: bl 36
63+
64+
# GD64-REL: .rela.dyn {
65+
# GD64-REL-NEXT: 0x204C0 R_LARCH_TLS_DTPMOD64 a 0x0
66+
# GD64-REL-NEXT: 0x204C8 R_LARCH_TLS_DTPREL64 a 0x0
67+
# GD64-REL-NEXT: 0x204D0 R_LARCH_TLS_DTPMOD64 b 0x0
68+
# GD64-REL-NEXT: 0x204D8 R_LARCH_TLS_DTPREL64 b 0x0
69+
# GD64-REL-NEXT: }
70+
71+
## &DTPMOD(a) - . = 0x204c0 - 0x10398 = 16458<<2
72+
# GD64: 10398: pcaddi $a0, 16458
73+
# GD64-NEXT: bl 52
74+
75+
## &DTPMOD(b) - . = 0x204d0 - 0x103a4 = 16460<<2
76+
# GD64: 103a0: pcaddi $a0, 16460
77+
# GD64-NEXT: bl 44
78+
79+
# NOREL: no relocations
80+
81+
## .got contains pre-populated values: [a@dtpmod, a@dtprel, b@dtpmod, b@dtprel]
82+
## a@dtprel = st_value(a) = 0x8
83+
## b@dtprel = st_value(b) = 0xc
84+
# LE32-GOT: section '.got':
85+
# LE32-GOT-NEXT: 0x[[#%x,A:]] 01000000 08000000 01000000 0c000000
86+
# LE64-GOT: section '.got':
87+
# LE64-GOT-NEXT: 0x[[#%x,A:]] 01000000 00000000 08000000 00000000
88+
# LE64-GOT-NEXT: 0x[[#%x,A:]] 01000000 00000000 0c000000 00000000
89+
90+
## a is local - relaxed to LE - its DTPMOD/DTPREL slots are link-time constants.
91+
## b is external - DTPMOD/DTPREL dynamic relocations are required.
92+
# IE32-REL: .rela.dyn {
93+
# IE32-REL-NEXT: 0x30220 R_LARCH_TLS_DTPMOD32 b 0x0
94+
# IE32-REL-NEXT: 0x30224 R_LARCH_TLS_DTPREL32 b 0x0
95+
# IE32-REL-NEXT: }
96+
# IE32-GOT: section '.got':
97+
# IE32-GOT-NEXT: 0x00030218 01000000 08000000 00000000 00000000
98+
99+
# IE64-REL: .rela.dyn {
100+
# IE64-REL-NEXT: 0x30380 R_LARCH_TLS_DTPMOD64 b 0x0
101+
# IE64-REL-NEXT: 0x30388 R_LARCH_TLS_DTPREL64 b 0x0
102+
# IE64-REL-NEXT: }
103+
# IE64-GOT: section '.got':
104+
# IE64-GOT-NEXT: 0x00030370 01000000 00000000 08000000 00000000
105+
# IE64-GOT-NEXT: 0x00030380 00000000 00000000 00000000 00000000
106+
107+
#--- a.s
108+
pcaddi $a0, %gd_pcrel_20(a)
109+
bl %plt(__tls_get_addr)
110+
111+
pcaddi $a0, %gd_pcrel_20(b)
112+
bl %plt(__tls_get_addr)
113+
114+
.section .tbss,"awT",@nobits
115+
.globl a
116+
.zero 8
117+
a:
118+
.zero 4
119+
120+
#--- bc.s
121+
.section .tbss,"awT",@nobits
122+
.globl b, c
123+
b:
124+
.zero 4
125+
c:
126+
127+
#--- tga.s
128+
.globl __tls_get_addr
129+
__tls_get_addr:
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# REQUIRES: loongarch
2+
# RUN: rm -rf %t && split-file %s %t
3+
4+
# RUN: llvm-mc --filetype=obj --triple=loongarch32 --position-independent %t/a.s -o %t/a.32.o
5+
# RUN: llvm-mc --filetype=obj --triple=loongarch32 %t/tga.s -o %t/tga.32.o
6+
# RUN: llvm-mc --filetype=obj --triple=loongarch64 --position-independent %t/a.s -o %t/a.64.o
7+
# RUN: llvm-mc --filetype=obj --triple=loongarch64 %t/tga.s -o %t/tga.64.o
8+
9+
## LA32 LD
10+
# RUN: ld.lld -shared %t/a.32.o -o %t/ld.32.so
11+
# RUN: llvm-readobj -r %t/ld.32.so | FileCheck --check-prefix=LD32-REL %s
12+
# RUN: llvm-readelf -x .got %t/ld.32.so | FileCheck --check-prefix=LD32-GOT %s
13+
# RUN: llvm-objdump -d --no-show-raw-insn %t/ld.32.so | FileCheck --check-prefixes=LD32 %s
14+
15+
## LA32 LD -> LE
16+
# RUN: ld.lld %t/a.32.o %t/tga.32.o -o %t/le.32
17+
# RUN: llvm-readelf -r %t/le.32 | FileCheck --check-prefix=NOREL %s
18+
# RUN: llvm-readelf -x .got %t/le.32 | FileCheck --check-prefix=LE32-GOT %s
19+
# RUN: llvm-objdump -d --no-show-raw-insn %t/le.32 | FileCheck --check-prefixes=LE32 %s
20+
21+
## LA64 LD
22+
# RUN: ld.lld -shared %t/a.64.o -o %t/ld.64.so
23+
# RUN: llvm-readobj -r %t/ld.64.so | FileCheck --check-prefix=LD64-REL %s
24+
# RUN: llvm-readelf -x .got %t/ld.64.so | FileCheck --check-prefix=LD64-GOT %s
25+
# RUN: llvm-objdump -d --no-show-raw-insn %t/ld.64.so | FileCheck --check-prefixes=LD64 %s
26+
27+
## LA64 LD -> LE
28+
# RUN: ld.lld %t/a.64.o %t/tga.64.o -o %t/le.64
29+
# RUN: llvm-readelf -r %t/le.64 | FileCheck --check-prefix=NOREL %s
30+
# RUN: llvm-readelf -x .got %t/le.64 | FileCheck --check-prefix=LE64-GOT %s
31+
# RUN: llvm-objdump -d --no-show-raw-insn %t/le.64 | FileCheck --check-prefixes=LE64 %s
32+
33+
## a@dtprel = st_value(a) = 0 is a link-time constant.
34+
# LD32-REL: .rela.dyn {
35+
# LD32-REL-NEXT: 0x20280 R_LARCH_TLS_DTPMOD32 - 0x0
36+
# LD32-REL-NEXT: }
37+
# LD32-GOT: section '.got':
38+
# LD32-GOT-NEXT: 0x00020280 00000000 00000000
39+
40+
# LD64-REL: .rela.dyn {
41+
# LD64-REL-NEXT: 0x20400 R_LARCH_TLS_DTPMOD64 - 0x0
42+
# LD64-REL-NEXT: }
43+
# LD64-GOT: section '.got':
44+
# LD64-GOT-NEXT: 0x00020400 00000000 00000000 00000000 00000000
45+
46+
## LA32: &DTPMOD(a) - . = 0x20280 - 0x101cc = 16429<<2
47+
# LD32: 101cc: pcaddi $a0, 16429
48+
# LD32-NEXT: bl 48
49+
50+
## LA64: &DTPMOD(a) - . = 0x20400 - 0x102e0 = 16456<<2
51+
# LD64: 102e0: pcaddi $a0, 16456
52+
# LD64-NEXT: bl 44
53+
54+
# NOREL: no relocations
55+
56+
## a is local - its DTPMOD/DTPREL slots are link-time constants.
57+
## a@dtpmod = 1 (main module)
58+
# LE32-GOT: section '.got':
59+
# LE32-GOT-NEXT: 0x0003011c 01000000 00000000
60+
61+
# LE64-GOT: section '.got':
62+
# LE64-GOT-NEXT: 0x000301d0 01000000 00000000 00000000 00000000
63+
64+
## LA32: DTPMOD(.LANCHOR0) - . = 0x3011c - 0x20114 = 16386<<2
65+
# LE32: 20114: pcaddi $a0, 16386
66+
# LE32-NEXT: bl 4
67+
68+
## LA64: DTPMOD(.LANCHOR0) - . = 0x301d0 - 0x201c8 = 16386<<2
69+
# LE64: 201c8: pcaddi $a0, 16386
70+
# LE64-NEXT: bl 4
71+
72+
#--- a.s
73+
pcaddi $a0, %ld_pcrel_20(.LANCHOR0)
74+
bl %plt(__tls_get_addr)
75+
76+
.section .tbss,"awT",@nobits
77+
.set .LANCHOR0, . + 0
78+
.zero 8
79+
80+
#--- tga.s
81+
.globl __tls_get_addr
82+
__tls_get_addr:
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
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+
# RUN: llvm-mc -filetype=obj -triple=loongarch32 --defsym ELF32=1 a.s -o a.32.o
7+
# RUN: llvm-mc -filetype=obj -triple=loongarch32 --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+
# RUN: ld.lld -shared -z now a.64.o c.64.o -o a.64.so
11+
# RUN: llvm-readobj -r -x .got a.64.so | FileCheck --check-prefix=GD64-RELA %s
12+
# RUN: llvm-objdump --no-show-raw-insn -h -d a.64.so | FileCheck %s --check-prefix=GD64
13+
14+
# RUN: ld.lld -shared -z now a.64.o c.64.o -o rel.64.so -z rel
15+
# RUN: llvm-readobj -r -x .got rel.64.so | FileCheck --check-prefix=GD64-REL %s
16+
17+
## FIXME: The transition frome TLSDESC to IE/LE has not yet been implemented.
18+
## Keep the dynamic relocations and hand them over to dynamic linker.
19+
20+
# RUN: ld.lld -e 0 -z now a.64.o c.64.o -o a.64.le
21+
# RUN: llvm-readobj -r -x .got a.64.le | FileCheck --check-prefix=LE64-RELA %s
22+
23+
# RUN: ld.lld -e 0 -z now a.64.o c.64.so -o a.64.ie
24+
# RUN: llvm-readobj -r -x .got a.64.ie | FileCheck --check-prefix=IE64-RELA %s
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: 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
35+
# GD64-RELA-NEXT: }
36+
# 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 .
40+
41+
# 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
45+
# GD64-REL-NEXT: }
46+
# 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+
51+
# GD64: .got 00000030 00000000000203d0
52+
53+
## &.got[a]-. = 0x203d0 - 0x102e0 = 16444<<2
54+
# GD64: 102e0: pcaddi $a0, 16444
55+
# GD64-NEXT: ld.d $ra, $a0, 0
56+
# GD64-NEXT: jirl $ra, $ra, 0
57+
# GD64-NEXT: add.d $a1, $a0, $tp
58+
59+
## &.got[b]-. = 0x203d0+32 - 0x102f0 = 16448<<2
60+
# GD64: 102f0: pcaddi $a0, 16448
61+
# GD64-NEXT: ld.d $ra, $a0, 0
62+
# GD64-NEXT: jirl $ra, $ra, 0
63+
# GD64-NEXT: add.d $a2, $a0, $tp
64+
65+
## &.got[c]-. = 0x203d0+16 - 0x10300 = 16440<<2
66+
# GD64: 10300: pcaddi $a0, 16440
67+
# GD64-NEXT: ld.d $ra, $a0, 0
68+
# GD64-NEXT: jirl $ra, $ra, 0
69+
# GD64-NEXT: add.d $a3, $a0, $tp
70+
71+
# 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
75+
# LE64-RELA-NEXT: }
76+
# 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 .
80+
81+
# 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
85+
# IE64-RELA-NEXT: }
86+
# 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 .
90+
91+
# 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
95+
# GD32-REL-NEXT: }
96+
# GD32-REL: Hex dump of section '.got':
97+
# GD32-REL-NEXT: 0x00020254 00000000 00000000 00000000 00000000 .
98+
# GD32-REL-NEXT: 0x00020264 00000000 ff070000 .
99+
100+
#--- a.s
101+
.macro add dst, src1, src2
102+
.ifdef ELF32
103+
add.w \dst, \src1, \src2
104+
.else
105+
add.d \dst, \src1, \src2
106+
.endif
107+
.endm
108+
.macro load dst, src1, src2
109+
.ifdef ELF32
110+
ld.w \dst, \src1, \src2
111+
.else
112+
ld.d \dst, \src1, \src2
113+
.endif
114+
.endm
115+
116+
pcaddi $a0, %desc_pcrel_20(a)
117+
load $ra, $a0, %desc_ld(a)
118+
jirl $ra, $ra, %desc_call(a)
119+
add $a1, $a0, $tp
120+
121+
pcaddi $a0, %desc_pcrel_20(b)
122+
load $ra, $a0, %desc_ld(b)
123+
jirl $ra, $ra, %desc_call(b)
124+
add $a2, $a0, $tp
125+
126+
pcaddi $a0, %desc_pcrel_20(c)
127+
load $ra, $a0, %desc_ld(c)
128+
jirl $ra, $ra, %desc_call(c)
129+
add $a3, $a0, $tp
130+
131+
.section .tbss,"awT",@nobits
132+
.globl a
133+
.zero 8
134+
a:
135+
.zero 2039 ## Place b at 0x7ff
136+
b:
137+
.zero 1
138+
139+
#--- c.s
140+
.section .tbss,"awT",@nobits
141+
.globl c
142+
c: .zero 4

0 commit comments

Comments
 (0)