binutils-2_28-branch, master: Don't use "_gp" on RISC-V, use "_global_pointer$" instead

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

binutils-2_28-branch, master: Don't use "_gp" on RISC-V, use "_global_pointer$" instead

Palmer Dabbelt
This was one of the things Andrew and I found during our pre-upstreaming code
review, but we forgot about it.  I was recently cleaning up the bugs in our
Github bug tracker and found it, and I thought it would be worth proposing a
fix here.

The issue is that we use the "_gp" symbol to store the global pointer, which
can conflict with ABI-complient code on RISC-V (it's not in any namespace or
anything).  This was copied from MIPS, so hopefully it's not going to break
real programs, but we thought that we should try and fix it while we still can.

This will break the RISC-V ABI, but my understanding is that is still OK
because we haven't released yet.  That means we _need_ to get this on the 2.28
branch if it lands on master, which is why I've added Tristan Gingold and the
binutils-2_28-branch tag even though this hasn't made it to master yet.

This patch passes all my test cases, and Andrew and I approve of it.  I'm
mostly wondering if this is still OK to change in our port, and if it's OK for
2.28.

Sorry for the trouble!

[PATCH] Don't use "_gp" on RISC-V, use "_global_pointer$" instead
Reply | Threaded
Open this post in threaded view
|

[PATCH] Don't use "_gp" on RISC-V, use "_global_pointer$" instead

Palmer Dabbelt
"_gp" could conflict with ABI-complient code.  While it's probably OK
because MIPS uses this name, we figured it'd be good to clean this up
before a release with RISC-V in it.

ld/ChangeLog:

2017-02-08  Palmer Dabbelt  <[hidden email]>

        * emulparams/elf32lriscv-defs.sh (SDATA_START_SYMBOLS): Change
        _gp to __global_pointer$.

bfd/ChangeLog:

2017-02-08  Palmer Dabbelt  <[hidden email]>

        * elfnn-riscv.c (riscv_global_pointer_value): Change _gp to
        __global_pointer$.
---
 bfd/elfnn-riscv.c                 | 2 +-
 ld/emulparams/elf32lriscv-defs.sh | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index b8dd1f2..6c14313 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -1463,7 +1463,7 @@ riscv_global_pointer_value (struct bfd_link_info *info)
 {
   struct bfd_link_hash_entry *h;
 
-  h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
+  h = bfd_link_hash_lookup (info->hash, "__global_pointer$", FALSE, FALSE, TRUE);
   if (h == NULL || h->type != bfd_link_hash_defined)
     return 0;
 
diff --git a/ld/emulparams/elf32lriscv-defs.sh b/ld/emulparams/elf32lriscv-defs.sh
index 0eba0d1..ab80333 100644
--- a/ld/emulparams/elf32lriscv-defs.sh
+++ b/ld/emulparams/elf32lriscv-defs.sh
@@ -23,7 +23,7 @@ TEXT_START_ADDR=0x10000
 MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 
-SDATA_START_SYMBOLS="_gp = . + 0x800;
+SDATA_START_SYMBOLS="__global_pointer$ = . + 0x800;
     *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*)"
 
 INITIAL_READONLY_SECTIONS=".interp         : { *(.interp) } ${CREATE_PIE-${INITIAL_READONLY_SECTIONS}}"
--
2.10.2

Reply | Threaded
Open this post in threaded view
|

Re: binutils-2_28-branch, master: Don't use "_gp" on RISC-V, use "_global_pointer$" instead

Tristan Gingold-2
In reply to this post by Palmer Dabbelt

> On 10 Feb 2017, at 03:12, Palmer Dabbelt <[hidden email]> wrote:
>
> This was one of the things Andrew and I found during our pre-upstreaming code
> review, but we forgot about it.  I was recently cleaning up the bugs in our
> Github bug tracker and found it, and I thought it would be worth proposing a
> fix here.
>
> The issue is that we use the "_gp" symbol to store the global pointer, which
> can conflict with ABI-complient code on RISC-V (it's not in any namespace or
> anything).  This was copied from MIPS, so hopefully it's not going to break
> real programs, but we thought that we should try and fix it while we still can.
>
> This will break the RISC-V ABI, but my understanding is that is still OK
> because we haven't released yet.  That means we _need_ to get this on the 2.28
> branch if it lands on master, which is why I've added Tristan Gingold and the
> binutils-2_28-branch tag even though this hasn't made it to master yet.
>
> This patch passes all my test cases, and Andrew and I approve of it.  I'm
> mostly wondering if this is still OK to change in our port, and if it's OK for
> 2.28.

That's ok for 2.28 once in the trunk.

Tristan.

Reply | Threaded
Open this post in threaded view
|

Re: binutils-2_28-branch, master: Don't use "_gp" on RISC-V, use "_global_pointer$" instead

Palmer Dabbelt
On Fri, 10 Feb 2017 00:28:11 PST (-0800), [hidden email] wrote:

>
>> On 10 Feb 2017, at 03:12, Palmer Dabbelt <[hidden email]> wrote:
>>
>> This was one of the things Andrew and I found during our pre-upstreaming code
>> review, but we forgot about it.  I was recently cleaning up the bugs in our
>> Github bug tracker and found it, and I thought it would be worth proposing a
>> fix here.
>>
>> The issue is that we use the "_gp" symbol to store the global pointer, which
>> can conflict with ABI-complient code on RISC-V (it's not in any namespace or
>> anything).  This was copied from MIPS, so hopefully it's not going to break
>> real programs, but we thought that we should try and fix it while we still can.
>>
>> This will break the RISC-V ABI, but my understanding is that is still OK
>> because we haven't released yet.  That means we _need_ to get this on the 2.28
>> branch if it lands on master, which is why I've added Tristan Gingold and the
>> binutils-2_28-branch tag even though this hasn't made it to master yet.
>>
>> This patch passes all my test cases, and Andrew and I approve of it.  I'm
>> mostly wondering if this is still OK to change in our port, and if it's OK for
>> 2.28.
>
> That's ok for 2.28 once in the trunk.

I committed this to master and to 2.28.

Thanks!