diff options
author | Andrew Waterman <andrew@sifive.com> | 2017-02-21 21:56:57 -0800 |
---|---|---|
committer | Palmer Dabbelt <palmer@dabbelt.com> | 2017-02-24 09:30:32 -0800 |
commit | d0f744f970225f68460eb36a4975ae92a2e9495a (patch) | |
tree | 996fe3d43e3f9b608e27fb9af40c9939716894f1 /bfd/elfnn-riscv.c | |
parent | 742d14b39b384e822fd2218cf1803aef68a95d99 (diff) | |
download | gdb-d0f744f970225f68460eb36a4975ae92a2e9495a.zip gdb-d0f744f970225f68460eb36a4975ae92a2e9495a.tar.gz gdb-d0f744f970225f68460eb36a4975ae92a2e9495a.tar.bz2 |
bfd: RISC-V: relax to gp in more cases.
bfd/ChangeLog:
2017-02-24 Andrew Waterman <andrew@sifive.com>
* elfnn-riscv.c (GP_NAME): New macro.
(riscv_global_pointer_value): Use it.
(_bfd_riscv_relax_lui): If symbol and global pointer are in same
output section, consider only that section's alignment.
Diffstat (limited to 'bfd/elfnn-riscv.c')
-rw-r--r-- | bfd/elfnn-riscv.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c index 6c14313..2ccfc5f 100644 --- a/bfd/elfnn-riscv.c +++ b/bfd/elfnn-riscv.c @@ -52,6 +52,10 @@ #define ELF_MAXPAGESIZE 0x1000 #define ELF_COMMONPAGESIZE 0x1000 +/* The global pointer's symbol name. */ + +#define GP_NAME "__global_pointer$" + /* The RISC-V linker needs to keep track of the number of relocs that it decides to copy as dynamic relocs in check_relocs for each symbol. This is so that it can later discard them if they are found to be @@ -1463,7 +1467,7 @@ riscv_global_pointer_value (struct bfd_link_info *info) { struct bfd_link_hash_entry *h; - h = bfd_link_hash_lookup (info->hash, "__global_pointer$", FALSE, FALSE, TRUE); + h = bfd_link_hash_lookup (info->hash, GP_NAME, FALSE, FALSE, TRUE); if (h == NULL || h->type != bfd_link_hash_defined) return 0; @@ -2809,6 +2813,16 @@ _bfd_riscv_relax_lui (bfd *abfd, BFD_ASSERT (rel->r_offset + 4 <= sec->size); + if (gp) + { + /* If gp and the symbol are in the same output section, then + consider only that section's alignment. */ + struct bfd_link_hash_entry *h = + bfd_link_hash_lookup (link_info->hash, GP_NAME, FALSE, FALSE, TRUE); + if (h->u.def.section->output_section == sym_sec->output_section) + max_alignment = (bfd_vma) 1 << sym_sec->output_section->alignment_power; + } + /* Is the reference in range of x0 or gp? Valid gp range conservatively because of alignment issue. */ if (VALID_ITYPE_IMM (symval) |