MIPS/LD: Skip overflow check for %pcrel_hi relocations
authorFaraz Shahbazker <fshahbazker@wavecomp.com>
Fri, 24 May 2019 01:16:08 +0000 (18:16 -0700)
committerFaraz Shahbazker <fshahbazker@wavecomp.com>
Tue, 28 May 2019 17:49:16 +0000 (10:49 -0700)
Overflow checks were removed for all hi16 relocations except PC-relative
high relocations per PR ld/16720.  Remove overflow checks from %pcrel_hi
relocations so that we can correctly handle negative offsets from PC.

bfd/
* elfxx-mips.c (mips_elf_calculate_relocation) <R_MIPS_PCHI16>:
Remove overflow check.

ld/
* testsuite/ld-mips-elf/undefweak-overflow.s: Remove test case
for pcrel_hi/pcrel_lo.
* testsuite/ld-mips-elf/undefweak-overflow.d: Update to match.
* testsuite/ld-mips-elf/reloc-pcrel-r6.s: New test source.
* testsuite/ld-mips-elf/reloc-pcrel-r6.d: New test linker script.
* testsuite/ld-mips-elf/reloc-pcrel-r6.ld: New test.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new test.

bfd/ChangeLog
bfd/elfxx-mips.c
ld/ChangeLog
ld/testsuite/ld-mips-elf/mips-elf.exp
ld/testsuite/ld-mips-elf/reloc-pcrel-r6.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/reloc-pcrel-r6.ld [new file with mode: 0644]
ld/testsuite/ld-mips-elf/reloc-pcrel-r6.s [new file with mode: 0644]
ld/testsuite/ld-mips-elf/undefweak-overflow.d
ld/testsuite/ld-mips-elf/undefweak-overflow.s

index 09ba27afd4439bddeeea729290a7aea764486833..a6157a4b426fe2687e3b0c3648913447a07155bc 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-28  Faraz Shahbazker  <fshahbazker@wavecomp.com>
+
+       * elfxx-mips.c (mips_elf_calculate_relocation) <R_MIPS_PCHI16>:
+       Remove overflow check.
+
 2019-05-28  Alan Modra  <amodra@gmail.com>
 
        PR 24596
index c64f90c3bb66b1d7d2517dae0be2130605842128..55f891d7be70b16f8f0fcebf7d3eca26b71212ad 100644 (file)
@@ -6326,8 +6326,6 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
 
     case R_MIPS_PCHI16:
       value = mips_elf_high (symbol + addend - p);
-      if (was_local_p || h->root.root.type != bfd_link_hash_undefweak)
-       overflowed_p = mips_elf_overflow_p (value, 16);
       value &= howto->dst_mask;
       break;
 
index 52d89ecd7a6373f9ad9289a67bd91e13890d50fd..54bc8746dcc1f9bcb3765e3d4089fe79af4ab287 100644 (file)
@@ -1,3 +1,13 @@
+2019-05-28  Faraz Shahbazker  <fshahbazker@wavecomp.com>
+
+       * testsuite/ld-mips-elf/undefweak-overflow.s: Remove test case
+       for pcrel_hi/pcrel_lo.
+       * testsuite/ld-mips-elf/undefweak-overflow.d: Update to match.
+       * testsuite/ld-mips-elf/reloc-pcrel-r6.s: New test source.
+       * testsuite/ld-mips-elf/reloc-pcrel-r6.d: New test linker script.
+       * testsuite/ld-mips-elf/reloc-pcrel-r6.ld: New test.
+       * testsuite/ld-mips-elf/mips-elf.exp: Run the new test.
+
 2019-05-28  Alan Modra  <amodra@gmail.com>
 
        PR 24596
index 07d1dc3ecce19a7ace64f3dc6881162f4d515560..1fee8efb8476e45a69fcef50e8f12fb872114a98 100644 (file)
@@ -1656,3 +1656,5 @@ run_dump_test_o32 "pic-reloc-6"
 run_dump_test_n64 "pic-reloc-7"
 run_dump_test_n64 "pic-reloc-7" [list [list name (microMIPS)] \
                                      [list as "-mmicromips"]]
+
+run_dump_test_o32 "reloc-pcrel-r6"
diff --git a/ld/testsuite/ld-mips-elf/reloc-pcrel-r6.d b/ld/testsuite/ld-mips-elf/reloc-pcrel-r6.d
new file mode 100644 (file)
index 0000000..ad4ac9e
--- /dev/null
@@ -0,0 +1,18 @@
+#name: MIPS r6 PC-relative hi+lo relocations
+#ld: -Treloc-pcrel-r6.ld -e0
+#as: -mips32r6
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: reloc-pcrel-r6.d
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+[0-9a-f]+ <test> ec9ed000      auipc   a0,0xd000
+[0-9a-f]+ <[^>]*> 24840001     addiu   a0,a0,1
+[0-9a-f]+ <[^>]*> ec9e0000     auipc   a0,0x0
+[0-9a-f]+ <[^>]*> 2484eff8     addiu   a0,a0,-4104
+[0-9a-f]+ <[^>]*> ec9e0001     auipc   a0,0x1
+[0-9a-f]+ <[^>]*> 2484eff0     addiu   a0,a0,-4112
+[0-9a-f]+ <[^>]*> ec9e4000     auipc   a0,0x4000
+[0-9a-f]+ <[^>]*> 2484ffe9     addiu   a0,a0,-23
+       \.\.\.
diff --git a/ld/testsuite/ld-mips-elf/reloc-pcrel-r6.ld b/ld/testsuite/ld-mips-elf/reloc-pcrel-r6.ld
new file mode 100644 (file)
index 0000000..a40c704
--- /dev/null
@@ -0,0 +1,9 @@
+SECTIONS
+{
+  x1 = 0x10000001;     /* lower and far  */
+  x2 = 0x3ffff000;     /* lower and near  */
+  . = 0x40000000;
+  .text : { *(.text) }
+  x3 = 0x4000f000;     /* high and near  */
+  x4 = 0x80000001;     /* high and far  */
+}
diff --git a/ld/testsuite/ld-mips-elf/reloc-pcrel-r6.s b/ld/testsuite/ld-mips-elf/reloc-pcrel-r6.s
new file mode 100644 (file)
index 0000000..3cc8850
--- /dev/null
@@ -0,0 +1,27 @@
+       .text
+       .globl test
+       .globl x1
+       .globl x2
+       .globl x3
+       .globl x4
+       .ent test
+test:
+1:
+       auipc   $a0,%pcrel_hi(x1)
+2:
+       addiu   $a0,$a0,%pcrel_lo(x1+(2b-1b))
+1:
+       auipc   $a0,%pcrel_hi(x2)
+2:
+       addiu   $a0,$a0, %pcrel_lo(x2+(2b-1b))
+1:
+       auipc   $a0,%pcrel_hi(x3)
+2:
+       addiu   $a0,$a0,%pcrel_lo(x3+(2b-1b))
+1:
+       auipc   $a0,%pcrel_hi(x4)
+2:
+       addiu   $a0,$a0,%pcrel_lo(x4+(2b-1b))
+       .end test
+       .align  2, 0
+       .space  8
index b74f91033b59962091281f073cb42650d66cb1f6..bbed9970dffe39d1469d18f5681328c1a4dda86f 100644 (file)
 [ 0-9a-f]+:    ec4ffffd        lwpc    v0,20000000 <_ftext>
 [ 0-9a-f]+:    ec5bfffe        ldpc    v0,20000000 <_ftext>
 [ 0-9a-f]+:    cbfffffa        bc      20000000 <_ftext>
-[ 0-9a-f]+:    ec9ee000        auipc   a0,0xe000
-[ 0-9a-f]+:    2484ffe8        addiu   a0,a0,-24
-[ 0-9a-f]+:    1000fff7        b       20000000 <_ftext>
+[ 0-9a-f]+:    1000fff9        b       20000000 <_ftext>
 [ 0-9a-f]+:    00000000        nop
-[ 0-9a-f]+:    0411fff5        bal     20000000 <_ftext>
+[ 0-9a-f]+:    0411fff7        bal     20000000 <_ftext>
 [ 0-9a-f]+:    3c......        lui     a0,0x....
 [ 0-9a-f]+:    0c000000        jal     20000000 <_ftext>
 [ 0-9a-f]+:    00000000        nop
 [ 0-9a-f]+:    00000000        nop
 
 [0-9a-f]+ <micro>:
-[ 0-9a-f]+:    8e5f            beqz    a0,20000000 <_ftext>
+[ 0-9a-f]+:    8e63            beqz    a0,20000000 <_ftext>
 [ 0-9a-f]+:    0c00            nop
-[ 0-9a-f]+:    cfdd            b       20000000 <_ftext>
+[ 0-9a-f]+:    cfe1            b       20000000 <_ftext>
 [ 0-9a-f]+:    0c00            nop
-[ 0-9a-f]+:    9400 ffda       b       20000000 <_ftext>
+[ 0-9a-f]+:    9400 ffde       b       20000000 <_ftext>
 [ 0-9a-f]+:    0c00            nop
-[ 0-9a-f]+:    4060 ffd7       bal     20000000 <_ftext>
+[ 0-9a-f]+:    4060 ffdb       bal     20000000 <_ftext>
 [ 0-9a-f]+:    0000 0000       nop
 [ 0-9a-f]+:    f400 0000       jal     20000000 <_ftext>
 [ 0-9a-f]+:    0000 0000       nop
@@ -36,7 +34,7 @@
 [ 0-9a-f]+:    0c00            nop
 
 [0-9a-f]+ <mips16>:
-[ 0-9a-f]+:    f7df 100c       b       20000000 <_ftext>
+[ 0-9a-f]+:    f7df 1010       b       20000000 <_ftext>
 [ 0-9a-f]+:    1800 0000       jal     20000000 <_ftext>
 [ 0-9a-f]+:    6500            nop
 #pass
index a7a99371b4d6d3087a10980e1d9767c0fe5ed2cb..d439d7c7c734de4ba5251d153e6e939154a32406 100644 (file)
@@ -13,8 +13,6 @@ start:
        lwpc    $2, foo
        ldpc    $2, foo
        bc      foo
-       auipc   $4, %pcrel_hi(foo)
-       addiu   $4, $4, %pcrel_lo(foo+4)
 
        b       foo
        nop