public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Nelson Chu <nelson@rivosinc.com>
To: binutils@sourceware.org, jim.wilson.gcc@gmail.com,
	palmer@dabbelt.com,  andrew@sifive.com
Subject: Re: [PATCH] [PR ld/22263] RISC-V: Avoid spurious R_RISCV_NONE for pr22263-1 test.
Date: Thu, 1 Jun 2023 12:35:06 +0800	[thread overview]
Message-ID: <CAPpQWtC16nZ5jBwhZHC+aNzNJpyr1QZyqpX2e=w4Ey-DcHKE0g@mail.gmail.com> (raw)
In-Reply-To: <20230527013620.65127-1-nelson@rivosinc.com>

[-- Attachment #1: Type: text/plain, Size: 4690 bytes --]

Committed since passed the riscv-gnu-toolchain gcc/binutils regressions.

Thanks
Nelson

On Sat, May 27, 2023 at 9:36 AM Nelson Chu <nelson@rivosinc.com> wrote:

> For TLS GD/IE, add the same condition with the relocate_section in the
> allocate_dynrelocs, to make sure we won't reserve redundant spaces
> for dynamic relocations since the conservative estimatation.
>
> After applying this patch, ld seems no longer generate the spurious
> R_RISCV_NONE for pr22263-1 test.
>
> bfd/
>         PR ld/22263
>         * elfnn-riscv.c (RISCV_TLS_GD_IE_NEED_DYN_RELOC): New defined.
>         Set NEED_RELOC to true if TLS GD/IE needs dynamic relocations,
>         and INDX will be the dynamic index.
>         (allocate_dynrelocs): Don't reserve extra spaces in the rela.got
>         if RISCV_TLS_GD_IE_NEED_DYN_RELOC set need_reloc to false.  This
>         condition needs to be same as relocate_section.
>         (relocate_section): Likewise, use the same condition as
>         allocate_dynrelocs.
> ---
>  bfd/elfnn-riscv.c | 41 ++++++++++++++++++++++++++++-------------
>  1 file changed, 28 insertions(+), 13 deletions(-)
>
> diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
> index 762ea231c0b..30d2faa405d 100644
> --- a/bfd/elfnn-riscv.c
> +++ b/bfd/elfnn-riscv.c
> @@ -111,6 +111,25 @@
>     || (bfd_link_pic (INFO) \
>         && SYMBOL_REFERENCES_LOCAL ((INFO), (H))))
>
> +/* Set NEED_RELOC to true if TLS GD/IE needs dynamic relocations, and
> INDX will
> +   be the dynamic index.  PR22263, use the same check in
> allocate_dynrelocs and
> +   riscv_elf_relocate_section for TLS GD/IE.  */
> +#define RISCV_TLS_GD_IE_NEED_DYN_RELOC(INFO, DYN, H, INDX, NEED_RELOC) \
> +  do \
> +    { \
> +      if ((H) != NULL \
> +         && (H)->dynindx != -1 \
> +         && WILL_CALL_FINISH_DYNAMIC_SYMBOL ((DYN), bfd_link_pic (INFO),
> (H)) \
> +         && (bfd_link_dll (INFO) || !SYMBOL_REFERENCES_LOCAL ((INFO),
> (H)))) \
> +       (INDX) = (H)->dynindx; \
> +      if ((bfd_link_dll (INFO) || (INDX) != 0) \
> +         && ((H) == NULL \
> +             || ELF_ST_VISIBILITY ((H)->other) == STV_DEFAULT \
> +             || (H)->root.type != bfd_link_hash_undefweak)) \
> +       (NEED_RELOC) = true; \
> +    } \
> +  while (0)
> +
>  /* Internal relocations used exclusively by the relaxation pass.  */
>  #define R_RISCV_DELETE (R_RISCV_max + 1)
>
> @@ -1297,18 +1316,24 @@ allocate_dynrelocs (struct elf_link_hash_entry *h,
> void *inf)
>        dyn = htab->elf.dynamic_sections_created;
>        if (tls_type & (GOT_TLS_GD | GOT_TLS_IE))
>         {
> +         int indx = 0;
> +         bool need_reloc = false;
> +         RISCV_TLS_GD_IE_NEED_DYN_RELOC(info, dyn, h, indx, need_reloc);
> +
>           /* TLS_GD needs two dynamic relocs and two GOT slots.  */
>           if (tls_type & GOT_TLS_GD)
>             {
>               s->size += 2 * RISCV_ELF_WORD_BYTES;
> -             htab->elf.srelgot->size += 2 * sizeof (ElfNN_External_Rela);
> +             if (need_reloc)
> +               htab->elf.srelgot->size += 2 * sizeof
> (ElfNN_External_Rela);
>             }
>
>           /* TLS_IE needs one dynamic reloc and one GOT slot.  */
>           if (tls_type & GOT_TLS_IE)
>             {
>               s->size += RISCV_ELF_WORD_BYTES;
> -             htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
> +             if (need_reloc)
> +               htab->elf.srelgot->size += sizeof (ElfNN_External_Rela);
>             }
>         }
>        else
> @@ -2882,20 +2907,10 @@ riscv_elf_relocate_section (bfd *output_bfd,
>                 abort ();
>
>               bool dyn = elf_hash_table (info)->dynamic_sections_created;
> -             if (h != NULL
> -                 && h->dynindx != -1
> -                 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic
> (info), h)
> -                 && (bfd_link_dll (info) || !SYMBOL_REFERENCES_LOCAL
> (info, h)))
> -               indx = h->dynindx;
> +             RISCV_TLS_GD_IE_NEED_DYN_RELOC (info, dyn, h, indx,
> need_relocs);
>
>               /* The GOT entries have not been initialized yet.  Do it
>                  now, and emit any relocations.  */
> -             if ((bfd_link_dll (info) || indx != 0)
> -                 && (h == NULL
> -                     || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
> -                     || h->root.type != bfd_link_hash_undefweak))
> -               need_relocs = true;
> -
>               if (tls_type & GOT_TLS_GD)
>                 {
>                   if (need_relocs)
> --
> 2.39.2 (Apple Git-143)
>
>

      reply	other threads:[~2023-06-01  4:35 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-27  1:36 Nelson Chu
2023-06-01  4:35 ` Nelson Chu [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAPpQWtC16nZ5jBwhZHC+aNzNJpyr1QZyqpX2e=w4Ey-DcHKE0g@mail.gmail.com' \
    --to=nelson@rivosinc.com \
    --cc=andrew@sifive.com \
    --cc=binutils@sourceware.org \
    --cc=jim.wilson.gcc@gmail.com \
    --cc=palmer@dabbelt.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).