aboutsummaryrefslogtreecommitdiff
path: root/bfd/elfnn-riscv.c
diff options
context:
space:
mode:
authorNelson Chu <nelson@rivosinc.com>2023-04-21 16:28:39 +0800
committerNelson Chu <nelson@rivosinc.com>2023-04-28 14:27:35 +0800
commit03e63766ef099ba85d8917c9f179441ae086375e (patch)
tree56c13570cb263ba14b59f435e8a7cdfe0e8db98a /bfd/elfnn-riscv.c
parenta48ddc3b572eb7fd9325867c4946f6bbb1f9b5b4 (diff)
downloadgdb-03e63766ef099ba85d8917c9f179441ae086375e.zip
gdb-03e63766ef099ba85d8917c9f179441ae086375e.tar.gz
gdb-03e63766ef099ba85d8917c9f179441ae086375e.tar.bz2
RISC-V: Enable x0 base relaxation for relax_pc even if --no-relax-gp.
Let --no-relax-gp only disable the gp relaxation for lui and pcrel relaxations, since x0 base and gp relaxations are different optimizations in fact, but just use the same function to handle. bfd/ * elfnn-riscv.c (_bfd_riscv_relax_pc): Like _bfd_riscv_relax_lui, set gp to zero when --no-relax-gp, then we should still keep the x0 base relaxation. (_bfd_riscv_relax_section): Enable _bfd_riscv_relax_pc when --no-relax-gp, we will disable the gp relaxation in the _bfd_riscv_relax_pc.
Diffstat (limited to 'bfd/elfnn-riscv.c')
-rw-r--r--bfd/elfnn-riscv.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index 499f51e..a23b91a 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -4508,6 +4508,7 @@ _bfd_riscv_relax_lui (bfd *abfd,
{
struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (link_info);
bfd_byte *contents = elf_section_data (sec)->this_hdr.contents;
+ /* Can relax to x0 even when gp relaxation is disabled. */
bfd_vma gp = htab->params->relax_gp
? riscv_global_pointer_value (link_info)
: 0;
@@ -4721,7 +4722,10 @@ _bfd_riscv_relax_pc (bfd *abfd ATTRIBUTE_UNUSED,
bool undefined_weak)
{
struct riscv_elf_link_hash_table *htab = riscv_elf_hash_table (link_info);
- bfd_vma gp = riscv_global_pointer_value (link_info);
+ /* Can relax to x0 even when gp relaxation is disabled. */
+ bfd_vma gp = htab->params->relax_gp
+ ? riscv_global_pointer_value (link_info)
+ : 0;
BFD_ASSERT (rel->r_offset + 4 <= sec->size);
@@ -4942,7 +4946,7 @@ _bfd_riscv_relax_section (bfd *abfd, asection *sec,
|| type == R_RISCV_TPREL_LO12_I
|| type == R_RISCV_TPREL_LO12_S)
relax_func = _bfd_riscv_relax_tls_le;
- else if (!bfd_link_pic (info) && htab->params->relax_gp
+ else if (!bfd_link_pic (info)
&& (type == R_RISCV_PCREL_HI20
|| type == R_RISCV_PCREL_LO12_I
|| type == R_RISCV_PCREL_LO12_S))