public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: "Die Li" <lidie@eswincomputing.com>
To: nelson <nelson@rivosinc.com>
Cc: binutils <binutils@sourceware.org>,
	 "Kito Cheng" <kito.cheng@sifive.com>,
	 palmer <palmer@dabbelt.com>,  gaofei <gaofei@eswincomputing.com>
Subject: Re: Re: [PATCH] [RISC-V] Fix the valid gp range for gp relax.
Date: Thu, 6 Jul 2023 10:48:52 +0800	[thread overview]
Message-ID: <2023070610485224907210@eswincomputing.com> (raw)
In-Reply-To: <CAPpQWtAK56eVPVP2QA5XAJ7Vrxbvdwb+U7BBjNb5oXkqyGh9+Q@mail.gmail.com>

Hi,
On 2023-07-05 20:06,  Nelson Chu wrote:
>
>Sorry, I think this patch is not correct.
>
>On Wed, Jul 5, 2023 at 4:42 PM Die Li <lidie@eswincomputing.com> wrote:
>
>> Taking alignment into consideration, the conservative addressing range
>> for gp relax is [gp - 12bit_imm + max_alignment, gp + 12bit_imm -
>> max_alignment],
>>
>
>The max_alignment is used to reserve the space in case the range is
>extended because of the alignment.  Therefore, the reserved max_alignment
>should make the value between gp and target symbol be larger or smaller, if
>it is positive or negative. 
This means that the aligned symbols need to be within the range of relative 
addressing in the GP. In code, it can be expressed as:
@@ -4630,10 +4630,8 @@ _bfd_riscv_relax_lui (bfd *abfd,
      Should we also consider the alignment issue for x0 base?  */
   if (undefined_weak
       || VALID_ITYPE_IMM (symval)
-      || (symval >= gp
-	  && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
-      || (symval < gp
-	  && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
+          || (VALID_ITYPE_IMM (ROUNDUP(symval, max_alignment) - gp)
+              && VALID_ITYPE_IMM (ROUNDUP(symval + reserve_size, max_alignment) - gp))))
Besides, we define ROUNDUP as:
/* ROUNDUP -- round an integer up to a multiple of n		    */
#define ROUNDUP(i, n) ((((i)+(n)-1)/n)*n)

Is the expression above consistent with what you said?

Finally, I don't quite understand the meaning of "symval - reserve_size" in the current code. 
Generally, reserve_size maps to the actual data type in the source code and represents the 
space occupied by the data. For example, the reserve_size of an int is 4, and the reserve_size 
of "int arr[4]" is 4*4, and so on. "symval + reserve_size" represents the end address of the symbol. 
That's why I replaced the condition "VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)" 
with "VALID_ITYPE_IMM (ROUNDUP(symval + reserve_size, max_alignment) - gp)".

>
>Besides, the offset must be based on gp, so no matter whether gp is larger
>or smaller than the target symbol, we should always use "symval - gp" as
>the offset.
>
>Thanks
>Nelson
>
>
>> which is smaller than the ideal GP addressing range [gp - 12bit_imm, gp +
>> 12bit_imm]. Therefore, when symval < gp, it is necessary to ensure that
>> both
>> symval and symval + reserve_size fall within the range [gp - 12bit_imm +
>> alignment,
>> gp + 12bit_imm - alignment]. Current linker takes the range of gp
>> conservatively,
>> this patch allows more symbols to be accessed by gp relative addressing.
>
>Take the file named with gp-relax.s from this patch as the source file.
>>
>> After assembling and linking with --relax option,
>> Before this patch:
>> 0+[0-9a-f]+ <_start>:
>> .*:[    ]+[0-9a-f]+[    ]+lui+.*
>> .*:[    ]+[0-9a-f]+[    ]+addi+.*
>> .*:[    ]+[0-9a-f]+[    ]+lui+.*
>> .*:[    ]+[0-9a-f]+[    ]+addi+.*
>> .*:[    ]+[0-9a-f]+[    ]+auipc+.*
>> .*:[    ]+[0-9a-f]+[    ]+lw+.*
>>
>> Check the symbal table after linking, we have :
>> Symbol table '.symtab' contains 19 entries:
>>    Num:    Value          Size Type    Bind   Vis      Ndx Name
>> ...
>>      7: 0000000000011900     0 NOTYPE  GLOBAL DEFAULT  ABS
>> __global_pointer$
>> ...
>>     18: 0000000000011108  3600 OBJECT  GLOBAL DEFAULT    3 global_array
>>
>> By comparing the values of `global_array` and `__global_pointer$`, the
>> symbol of
>> global_array can be accessed by gp relative addressing.
>>
>> After this patch:
>> 0+[0-9a-f]+ <_start>:
>> .*:[    ]+[0-9a-f]+[    ]+addi[         ]+a3,gp,\-[0-9]+ # [0-9a-f]+
>> <global_array>
>> .*:[    ]+[0-9a-f]+[    ]+addi[         ]+a4,gp,\-[0-9]+ # [0-9a-f]+
>> <global_array+.*
>> .*:[    ]+[0-9a-f]+[    ]+lw[   ]+a0,\-[0-9]+\(gp\) # [0-9a-f]+
>> <global_array>
>>
>> Co-Authored by: Fei Gao <gaofei@eswincomputing.com>
>> Signed-off-by: Die Li <lidie@eswincomputing.com>
>>
>> ChangeLog:
>>
>>         * bfd/elfnn-riscv.c (_bfd_riscv_relax_lui): Fix the valid gp range.
>>         (_bfd_riscv_relax_pc): Likewise.
>>         * ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp: New test.
>>         * ld/testsuite/ld-riscv-elf/gp-relax.d: New test.
>>         * ld/testsuite/ld-riscv-elf/gp-relax.s: New test.
>> ---
>>  bfd/elfnn-riscv.c                          |  6 +++--
>>  ld/testsuite/ld-riscv-elf/gp-relax.d       | 14 ++++++++++
>>  ld/testsuite/ld-riscv-elf/gp-relax.s       | 30 ++++++++++++++++++++++
>>  ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp |  1 +
>>  4 files changed, 49 insertions(+), 2 deletions(-)
>>  create mode 100644 ld/testsuite/ld-riscv-elf/gp-relax.d
>>  create mode 100644 ld/testsuite/ld-riscv-elf/gp-relax.s
>>
>> diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
>> index 09aa7be225e..00e692c6924 100644
>> --- a/bfd/elfnn-riscv.c
>> +++ b/bfd/elfnn-riscv.c
>> @@ -4633,7 +4633,8 @@ _bfd_riscv_relax_lui (bfd *abfd,
>>        || (symval >= gp
>>           && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
>>        || (symval < gp
>> -         && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
>> +          && VALID_ITYPE_IMM (symval - gp - max_alignment)
>> +          && VALID_ITYPE_IMM (symval - gp + max_alignment +
>> reserve_size)))
>>      {
>>        unsigned sym = ELFNN_R_SYM (rel->r_info);
>>        switch (ELFNN_R_TYPE (rel->r_info))
>> @@ -4897,7 +4898,8 @@ _bfd_riscv_relax_pc (bfd *abfd ATTRIBUTE_UNUSED,
>>        || (symval >= gp
>>           && VALID_ITYPE_IMM (symval - gp + max_alignment + reserve_size))
>>        || (symval < gp
>> -         && VALID_ITYPE_IMM (symval - gp - max_alignment - reserve_size)))
>> +          && VALID_ITYPE_IMM (symval - gp - max_alignment)
>> +          && VALID_ITYPE_IMM (symval - gp + max_alignment +
>> reserve_size)))
>>      {
>>        unsigned sym = hi_reloc.hi_sym;
>>        switch (ELFNN_R_TYPE (rel->r_info))
>> diff --git a/ld/testsuite/ld-riscv-elf/gp-relax.d
>> b/ld/testsuite/ld-riscv-elf/gp-relax.d
>> new file mode 100644
>> index 00000000000..fa93c05ee2c
>> --- /dev/null
>> +++ b/ld/testsuite/ld-riscv-elf/gp-relax.d
>> @@ -0,0 +1,14 @@
>> +#source: gp-relax.s
>> +#as:
>> +#ld: --relax
>> +#objdump: -d -Mno-aliases
>> +
>> +.*:[   ]+file format .*
>> +
>> +
>> +Disassembly of section \.text:
>> +
>> +0+[0-9a-f]+ <_start>:
>> +.*:[   ]+[0-9a-f]+[    ]+addi[         ]+a3,gp,\-[0-9]+ # [0-9a-f]+
>> <global_array>
>> +.*:[   ]+[0-9a-f]+[    ]+addi[         ]+a4,gp,\-[0-9]+ # [0-9a-f]+
>> <global_array+.*
>> +.*:[   ]+[0-9a-f]+[    ]+lw[   ]+a0,\-[0-9]+\(gp\) # [0-9a-f]+
>> <global_array>
>> diff --git a/ld/testsuite/ld-riscv-elf/gp-relax.s
>> b/ld/testsuite/ld-riscv-elf/gp-relax.s
>> new file mode 100644
>> index 00000000000..36addbc770c
>> --- /dev/null
>> +++ b/ld/testsuite/ld-riscv-elf/gp-relax.s
>> @@ -0,0 +1,30 @@
>> +       .globl  global_var
>> +       .section        .sbss,"aw",@nobits
>> +       .align  2
>> +       .type   global_var, @object
>> +       .size   global_var, 4
>> +global_var:
>> +       .zero   4
>> +
>> +       .globl  global_array
>> +       .bss
>> +       .align  3
>> +       .type   global_array, @object
>> +       .size   global_array, 3600
>> +global_array:
>> +       .zero   3600
>> +
>> +       .text
>> +       .align  1
>> +       .globl  _start
>> +       .type   _start, @function
>> +_start:
>> +       lui     a3,%hi(global_array)
>> +       addi    a3,a3,%lo(global_array)
>> +
>> +       lui     a4,%hi(global_array + 0x600)
>> +       addi    a4,a4,%lo(global_array + 0x600)
>> +
>> +.LA0:
>> +        auipc  a5,%pcrel_hi(global_array)
>> +       lw      a0,%pcrel_lo(.LA0)(a5)
>> diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
>> b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
>> index 947a266ba72..6a04955b23b 100644
>> --- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
>> +++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
>> @@ -124,6 +124,7 @@ if [istarget "riscv*-*-*"] {
>>      run_dump_test "pcgp-relax-01"
>>      run_dump_test "pcgp-relax-01-norelaxgp"
>>      run_dump_test "pcgp-relax-02"
>> +    run_dump_test "gp-relax"
>>      run_dump_test "c-lui"
>>      run_dump_test "c-lui-2"
>>      run_dump_test "disas-jalr"
>> --
>> 2.17.1
>>
>>

      reply	other threads:[~2023-07-06  2:49 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-05  8:42 Die Li
2023-07-05 12:06 ` Nelson Chu
2023-07-06  2:48   ` Die Li [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=2023070610485224907210@eswincomputing.com \
    --to=lidie@eswincomputing.com \
    --cc=binutils@sourceware.org \
    --cc=gaofei@eswincomputing.com \
    --cc=kito.cheng@sifive.com \
    --cc=nelson@rivosinc.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).