diff options
author | Nelson Chu <nelson@rivosinc.com> | 2023-04-21 16:28:39 +0800 |
---|---|---|
committer | Nelson Chu <nelson@rivosinc.com> | 2023-04-28 14:27:35 +0800 |
commit | 03e63766ef099ba85d8917c9f179441ae086375e (patch) | |
tree | 56c13570cb263ba14b59f435e8a7cdfe0e8db98a /bfd/elfnn-riscv.c | |
parent | a48ddc3b572eb7fd9325867c4946f6bbb1f9b5b4 (diff) | |
download | gdb-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.c | 8 |
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)) |