aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorTatsuyuki Ishi <ishitatsuyuki@gmail.com>2024-02-21 02:55:52 +0900
committerNelson Chu <nelson@rivosinc.com>2024-02-29 15:02:55 +0800
commit159afbb7617d2c8a9cd3f3350374711f37f60442 (patch)
treec6ca5d1b84b1c73cecd1bc918f75c4908e70f822 /ld
parente0f747d5e912f3a7115a578662a7a5a537cd0eae (diff)
downloadgdb-159afbb7617d2c8a9cd3f3350374711f37f60442.zip
gdb-159afbb7617d2c8a9cd3f3350374711f37f60442.tar.gz
gdb-159afbb7617d2c8a9cd3f3350374711f37f60442.tar.bz2
RISC-V: Initial ld.bfd support for TLSDESC.
Only relocation handling for now; relaxation is not implemented yet. bfd/ * elfnn-riscv.c (riscv_elf_check_relocs): Record GOT reference and paired relocation for TLSDESC_HI20. (riscv_elf_adjust_dynamic_symbol): Allocate GOT and reloc slots for TLSDESC symbols. (riscv_elf_size_dynamic_sections): Likewise but for local symbols. (tlsdescoff): New helper to determine static addend for R_TLSDESC. (riscv_elf_relocate_section): Ignore TLSDESC_CALL reloc for now (it is relaxation only). Handle TLSDESC_{LOAD,ADD}_LO12 as paired pcrel relocs. For TLS GOT slot generation, generalize the logic to handle any combination of (GD, IE, TLSDESC). Add TLSDESC Rela generation. * ld/testsuite/ld-riscv-elf/tls*: Add TLSDESC instruction sequences next to the existing GD and IE sequences. Update expectations.
Diffstat (limited to 'ld')
-rw-r--r--ld/testsuite/ld-riscv-elf/tls.d4
-rw-r--r--ld/testsuite/ld-riscv-elf/tls.s14
-rw-r--r--ld/testsuite/ld-riscv-elf/tlsbin.d5
3 files changed, 22 insertions, 1 deletions
diff --git a/ld/testsuite/ld-riscv-elf/tls.d b/ld/testsuite/ld-riscv-elf/tls.d
index e7f2030..6cf008a 100644
--- a/ld/testsuite/ld-riscv-elf/tls.d
+++ b/ld/testsuite/ld-riscv-elf/tls.d
@@ -2,13 +2,15 @@
#ld: --shared tmpdir/tlslib.so
#readelf: -Wr
-Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 5 entries:
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 7 entries:
+Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLS_DTPMOD64 +0
[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLS_TPREL64 +4
+[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLSDESC +4
[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLS_DTPMOD64 +0+ sg1 \+ 0
[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLS_DTPREL64 +0+ sg1 \+ 0
[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLS_TPREL64 +0+ sg1 \+ 0
+[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLSDESC +0+ sg1 \+ 0
Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entry:
+Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
diff --git a/ld/testsuite/ld-riscv-elf/tls.s b/ld/testsuite/ld-riscv-elf/tls.s
index 79e9bc2..7cbf5ea 100644
--- a/ld/testsuite/ld-riscv-elf/tls.s
+++ b/ld/testsuite/ld-riscv-elf/tls.s
@@ -17,6 +17,13 @@ _start:
la.tls.ie a0,sg1
add a0,a0,tp
+ /* GD (TLSDESC), global var */
+.desc1:
+ auipc a0, %tlsdesc_hi(sg1)
+ lw t0, %tlsdesc_load_lo(.desc1)(a0)
+ addi a0, a0, %tlsdesc_add_lo(.desc1)
+ jalr t0, t0, %tlsdesc_call(.desc1)
+
/* GD, local var */
la.tls.gd a0,sl1
call __tls_get_addr
@@ -25,4 +32,11 @@ _start:
la.tls.ie a0,sl1
add a0,a0,tp
+ /* GD (TLSDESC), local var */
+.desc2:
+ auipc a0, %tlsdesc_hi(sl1)
+ lw t0, %tlsdesc_load_lo(.desc2)(a0)
+ addi a0, a0, %tlsdesc_add_lo(.desc2)
+ jalr t0, t0, %tlsdesc_call(.desc2)
+
ret
diff --git a/ld/testsuite/ld-riscv-elf/tlsbin.d b/ld/testsuite/ld-riscv-elf/tlsbin.d
index cdcd51a..79b7ade 100644
--- a/ld/testsuite/ld-riscv-elf/tlsbin.d
+++ b/ld/testsuite/ld-riscv-elf/tlsbin.d
@@ -2,6 +2,11 @@
#ld: -no-pie tmpdir/tlslib.so
#readelf: -Wr
+Relocation section '.rela.dyn' at offset 0x[0-9a-f]+ contains 2 entries:
+ +Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
+[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLSDESC +4
+[0-9a-f]+ +[0-9a-f]+ R_RISCV_TLSDESC +0
+
Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entry:
+Offset +Info +Type +Symbol's Value +Symbol's Name \+ Addend
[0-9a-f]+ +[0-9a-f]+ R_RISCV_JUMP_SLOT +[0-9a-f]+ __tls_get_addr \+ 0