This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH] bfd: RISC-V: relax to gp in more cases.
- From: Palmer Dabbelt <palmer at dabbelt dot com>
- To: binutils at sourceware dot org
- Cc: Andrew Waterman <andrew at sifive dot com>
- Date: Fri, 24 Feb 2017 09:31:33 -0800
- Subject: Re: [PATCH] bfd: RISC-V: relax to gp in more cases.
- Authentication-results: sourceware.org; auth=none
- References: <20170223040309.5842-1-palmer@dabbelt.com>
On Wed, Feb 22, 2017 at 8:03 PM, Palmer Dabbelt <palmer@dabbelt.com> wrote:
> From: Andrew Waterman <andrew@sifive.com>
>
> bfd/ChangeLog:
>
> 2017-02-21 Andrew Waterman <andrew@sifive.com>
>
> Relax to gp in more cases.
> * 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.
> ---
> bfd/elfnn-riscv.c | 16 +++++++++++++++-
> 1 file changed, 15 insertions(+), 1 deletion(-)
>
> 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)
> --
> 2.10.2
>
Committed.