public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Palmer Dabbelt <palmer@rivosinc.com>
To: Joseph.Faulls@imgtec.com
Cc: binutils@sourceware.org, nelson@rivosinc.com
Subject: Re: [PATCH] RISC-V: Do not gp relax against an ABS symbol if it is far away.
Date: Thu, 27 Jul 2023 14:08:56 -0700 (PDT)	[thread overview]
Message-ID: <mhng-826a140b-ebc7-4697-94c8-b3b8231f58a9@palmer-ri-x1c9> (raw)
In-Reply-To: <LO4P265MB59141A6F1238DFB73BC2A9818001A@LO4P265MB5914.GBRP265.PROD.OUTLOOK.COM>

On Thu, 27 Jul 2023 09:48:24 PDT (-0700), Joseph.Faulls@imgtec.com wrote:
> Relaxations can cause the gp to move after it has been decided to gp
> relax. Against an absolute symbol, the distance may change such that the
> offset can no longer fit in the 12-bit immediate field.
>
> bfd/
>         * elfnn-riscv.c (_bfd_riscv_relax_pc) Do not gp relax against and ABS
>           symbol if it is far away.
> ld/
>         * ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp: Updated.
>         * ld/testsuite/ld-riscv-elf/gp-relax-abs*: New testcases.
> ---
> bfd/elfnn-riscv.c                            | 12 ++++++++++++
> ld/testsuite/ld-riscv-elf/gp-relax-abs-sym.s |  3 +++
> ld/testsuite/ld-riscv-elf/gp-relax-abs.d     | 14 ++++++++++++++
> ld/testsuite/ld-riscv-elf/gp-relax-abs.s     |  5 +++++
> ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp   |  1 +
> 5 files changed, 35 insertions(+)
> create mode 100644 ld/testsuite/ld-riscv-elf/gp-relax-abs-sym.s
> create mode 100644 ld/testsuite/ld-riscv-elf/gp-relax-abs.d
> create mode 100644 ld/testsuite/ld-riscv-elf/gp-relax-abs.s
>
> diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
> index 09aa7be225e..79e29e8b272 100644
> --- a/bfd/elfnn-riscv.c
> +++ b/bfd/elfnn-riscv.c
> @@ -4885,6 +4885,18 @@ _bfd_riscv_relax_pc (bfd *abfd ATTRIBUTE_UNUSED,
>               max_alignment = _bfd_riscv_get_max_alignment (sec, gp);
>               htab->max_alignment_for_gp = max_alignment;
>             }
> +         /* If the symbol is in the abs section, relaxation could cause the gp
> +          * to move such that the gp relocation is no longer possible.

I'm not quite sure what you mean by GP moving -- GP's the register, so 
it doesn't have a value until runtime.  GP is meant to equal 
__global_pointer$, but that's usually a data symbol and thus doesn't 
move as a result of relaxation.

We do have some other issues related to SHN_ABS (for example position 
independent vs PC relative stuff), so it's possible there's some other 
bug here?

> +          * Conservatively half the allowed distance, as it cannot be that
> +          * gp moves more than this, i.e. more than half the instructions be
> +          * deleted due to relaxation.  Do this by adjusting reserve_size.  */
> +         if (sym_sec->output_section == bfd_abs_section_ptr)
> +           {
> +             if (symval >= gp)
> +               reserve_size += (symval - gp) / 2;
> +             else
> +               reserve_size += (gp - symval) / 2;

We can have more than a factor of two from relaxation, for example from 
alignment.  If a hueristic is all we can do then I guess we'll have to 
live with it, but I think I'd want to understand the movement 

> +           }
>         }
>      }
>
> diff --git a/ld/testsuite/ld-riscv-elf/gp-relax-abs-sym.s b/ld/testsuite/ld-riscv-elf/gp-relax-abs-sym.s
> new file mode 100644
> index 00000000000..a018bb3a50a
> --- /dev/null
> +++ b/ld/testsuite/ld-riscv-elf/gp-relax-abs-sym.s
> @@ -0,0 +1,3 @@
> +.section .data
> +.globl sym
> +.set sym,0x10804
> diff --git a/ld/testsuite/ld-riscv-elf/gp-relax-abs.d b/ld/testsuite/ld-riscv-elf/gp-relax-abs.d
> new file mode 100644
> index 00000000000..2c7ab3a2579
> --- /dev/null
> +++ b/ld/testsuite/ld-riscv-elf/gp-relax-abs.d
> @@ -0,0 +1,14 @@
> +#source: gp-relax-abs.s
> +#source: gp-relax-abs-sym.s
> +#as: -march=rv64ic -mabi=lp64
> +#ld: -Tcode-model-01.ld -melf64lriscv
> +#objdump: -d
> +
> +.*:[   ]+file format .*
> +
> +Disassembly of section \.text:
> +
> +[0-9a-f]+ <_start>:
> +.*auipc.*
> +.*lw.*# [0-9a-f]* <sym>
> +#pass
> diff --git a/ld/testsuite/ld-riscv-elf/gp-relax-abs.s b/ld/testsuite/ld-riscv-elf/gp-relax-abs.s
> new file mode 100644
> index 00000000000..db2103bafd1
> --- /dev/null
> +++ b/ld/testsuite/ld-riscv-elf/gp-relax-abs.s
> @@ -0,0 +1,5 @@
> +.text
> +.global _start
> +_start:
> +    auipc t0, %pcrel_hi(sym)
> +    lw t0, %pcrel_lo(_start)(t0)
> diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
> index 947a266ba72..a53a2758991 100644
> --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
> +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
> @@ -172,6 +172,7 @@ if [istarget "riscv*-*-*"] {
>      run_dump_test "attr-merge-priv-spec-failed-06"
>      run_dump_test "attr-phdr"
>      run_dump_test "relax-max-align-gp"
> +    run_dump_test "gp-relax-abs"
>      run_dump_test "uleb128"
>      run_ld_link_tests [list \
>         [list "Weak reference 32" "-T weakref.ld -m[riscv_choose_ilp32_emul]" "" \

  parent reply	other threads:[~2023-07-27 21:08 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-27 16:48 Joseph Faulls
2023-07-27 17:02 ` Andreas Schwab
2023-07-27 21:08 ` Palmer Dabbelt [this message]
2023-07-28  1:02   ` Nelson Chu
2023-07-28  1:15     ` Nelson Chu
2023-07-28  9:18       ` [EXTERNAL] " Joseph Faulls
2023-07-28 15:03         ` Palmer Dabbelt
2023-07-28 15:52           ` Joseph Faulls
2023-07-28 16:12             ` Palmer Dabbelt
2023-08-08  9:49 ` Maciej W. Rozycki
2023-08-08 10:38   ` [EXTERNAL] " Joseph Faulls
2023-08-08 12:04     ` Maciej W. Rozycki
2023-08-23 11:16     ` Joseph Faulls

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=mhng-826a140b-ebc7-4697-94c8-b3b8231f58a9@palmer-ri-x1c9 \
    --to=palmer@rivosinc.com \
    --cc=Joseph.Faulls@imgtec.com \
    --cc=binutils@sourceware.org \
    --cc=nelson@rivosinc.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).