RISC-V: Adjust __global_pointer$ value to reduce code size.
authorJim Wilson <jimw@sifive.com>
Mon, 15 Oct 2018 23:00:28 +0000 (16:00 -0700)
committerJim Wilson <jimw@sifive.com>
Mon, 15 Oct 2018 23:00:28 +0000 (16:00 -0700)
ld/
* emulparams/elf32lriscv-defs.sh (DATA_START_SYMBOLS): New.
(SDATA_START_SYMBOLS): Define __SDATA_BEGIN__.  Don't define
__global_pointer$.
(OTHER_END_SYMBOLS): New.  Define __global_pointer$.
* testsuite/ld-riscv-elf/pcrel-lo-addend-2.d (#ld): Add --no-relax.

ld/ChangeLog
ld/emulparams/elf32lriscv-defs.sh
ld/testsuite/ld-riscv-elf/pcrel-lo-addend-2.d

index 3043096e36a777979acade340b3936101fc4d8bc..8f8880e1bf8a74fc17fdec54f40d9be8c8c5104f 100644 (file)
@@ -1,3 +1,11 @@
+2018-10-15  Jim Wilson  <jimw@sifive.com>
+
+       * emulparams/elf32lriscv-defs.sh (DATA_START_SYMBOLS): New.
+       (SDATA_START_SYMBOLS): Define __SDATA_BEGIN__.  Don't define
+       __global_pointer$.
+       (OTHER_END_SYMBOLS): New.  Define __global_pointer$.
+       * testsuite/ld-riscv-elf/pcrel-lo-addend-2.d (#ld): Add --no-relax.
+
 2018-10-15  Alan Modra  <amodra@gmail.com>
 
        PR 23534
index 91015d44714d0543e0a9de1a3c01bded4b3ed193..5ac3b6023dc1e6a8b7cb3637b21d5b4d675cbbed 100644 (file)
@@ -30,8 +30,19 @@ TEXT_START_ADDR=0x10000
 MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 COMMONPAGESIZE="CONSTANT (COMMONPAGESIZE)"
 
-SDATA_START_SYMBOLS="${CREATE_SHLIB-__global_pointer$ = . + 0x800;}
+DATA_START_SYMBOLS="${CREATE_SHLIB-__DATA_BEGIN__ = .;}"
+
+SDATA_START_SYMBOLS="${CREATE_SHLIB-__SDATA_BEGIN__ = .;}
     *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*)"
 
 INITIAL_READONLY_SECTIONS=".interp         : { *(.interp) } ${CREATE_PIE-${INITIAL_READONLY_SECTIONS}}"
 INITIAL_READONLY_SECTIONS="${RELOCATING+${CREATE_SHLIB-${INITIAL_READONLY_SECTIONS}}}"
+
+# We must cover as much of sdata as possible if it exists.  If sdata+bss is
+# smaller than 0x1000 then we should start from bss end to cover as much of
+# the program as possible.  But we can't allow gp to cover any of rodata, as
+# the address of variables in rodata may change during relaxation, so we start
+# from data in that case.
+OTHER_END_SYMBOLS="${CREATE_SHLIB-__BSS_END__ = .;
+    __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800,
+                           MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800));}"
index 9e94c5c3990b5a7ca0e6e17251dc251513ef0eb6..039de102c3ade82438a0067380b351157e7ebb99 100644 (file)
@@ -1,5 +1,5 @@
 #name: %pcrel_lo overflow with an addend
 #source: pcrel-lo-addend-2.s
 #as: -march=rv32ic
-#ld: -melf32lriscv
+#ld: -melf32lriscv --no-relax
 #error: .*dangerous relocation: %pcrel_lo overflow with an addend