* [PATCH] MIPS/LD: Skip overflow check for %pcrel_hi relocations
@ 2019-05-24 1:16 Faraz Shahbazker
2019-05-27 9:23 ` Paul Hua
0 siblings, 1 reply; 2+ messages in thread
From: Faraz Shahbazker @ 2019-05-24 1:16 UTC (permalink / raw)
To: binutils; +Cc: Faraz Shahbazker, paul.hua.gm
Overflow checks were removed for all hi16 relocations except PC-relative
high relocations per PR ld/16720. This patch finishes the job. Due to
the overflow check, %pcrel_hi cannot handle any negative offsets from PC.
Ok to commit?
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/elfxx-mips.c | 2 --
ld/testsuite/ld-mips-elf/mips-elf.exp | 2 ++
ld/testsuite/ld-mips-elf/reloc-pcrel-r6.d | 18 ++++++++++++++++++
ld/testsuite/ld-mips-elf/reloc-pcrel-r6.ld | 9 +++++++++
ld/testsuite/ld-mips-elf/reloc-pcrel-r6.s | 27 +++++++++++++++++++++++++++
ld/testsuite/ld-mips-elf/undefweak-overflow.d | 16 +++++++---------
ld/testsuite/ld-mips-elf/undefweak-overflow.s | 2 --
7 files changed, 63 insertions(+), 13 deletions(-)
create mode 100644 ld/testsuite/ld-mips-elf/reloc-pcrel-r6.d
create mode 100644 ld/testsuite/ld-mips-elf/reloc-pcrel-r6.ld
create mode 100644 ld/testsuite/ld-mips-elf/reloc-pcrel-r6.s
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index c64f90c..55f891d 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -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;
diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp
index 07d1dc3..1fee8ef 100644
--- a/ld/testsuite/ld-mips-elf/mips-elf.exp
+++ b/ld/testsuite/ld-mips-elf/mips-elf.exp
@@ -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
index 0000000..ad4ac9e
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/reloc-pcrel-r6.d
@@ -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
index 0000000..a40c704
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/reloc-pcrel-r6.ld
@@ -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
index 0000000..3cc8850
--- /dev/null
+++ b/ld/testsuite/ld-mips-elf/reloc-pcrel-r6.s
@@ -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
diff --git a/ld/testsuite/ld-mips-elf/undefweak-overflow.d b/ld/testsuite/ld-mips-elf/undefweak-overflow.d
index b74f910..bbed997 100644
--- a/ld/testsuite/ld-mips-elf/undefweak-overflow.d
+++ b/ld/testsuite/ld-mips-elf/undefweak-overflow.d
@@ -10,11 +10,9 @@
[ 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
@@ -22,13 +20,13 @@
[ 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
diff --git a/ld/testsuite/ld-mips-elf/undefweak-overflow.s b/ld/testsuite/ld-mips-elf/undefweak-overflow.s
index a7a9937..d439d7c 100644
--- a/ld/testsuite/ld-mips-elf/undefweak-overflow.s
+++ b/ld/testsuite/ld-mips-elf/undefweak-overflow.s
@@ -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
--
2.9.5
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] MIPS/LD: Skip overflow check for %pcrel_hi relocations
2019-05-24 1:16 [PATCH] MIPS/LD: Skip overflow check for %pcrel_hi relocations Faraz Shahbazker
@ 2019-05-27 9:23 ` Paul Hua
0 siblings, 0 replies; 2+ messages in thread
From: Paul Hua @ 2019-05-27 9:23 UTC (permalink / raw)
To: Faraz Shahbazker; +Cc: binutils
ok. Please apply.
On Fri, May 24, 2019 at 9:16 AM Faraz Shahbazker
<fshahbazker@wavecomp.com> wrote:
>
> Overflow checks were removed for all hi16 relocations except PC-relative
> high relocations per PR ld/16720. This patch finishes the job. Due to
> the overflow check, %pcrel_hi cannot handle any negative offsets from PC.
>
> Ok to commit?
>
> 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/elfxx-mips.c | 2 --
> ld/testsuite/ld-mips-elf/mips-elf.exp | 2 ++
> ld/testsuite/ld-mips-elf/reloc-pcrel-r6.d | 18 ++++++++++++++++++
> ld/testsuite/ld-mips-elf/reloc-pcrel-r6.ld | 9 +++++++++
> ld/testsuite/ld-mips-elf/reloc-pcrel-r6.s | 27 +++++++++++++++++++++++++++
> ld/testsuite/ld-mips-elf/undefweak-overflow.d | 16 +++++++---------
> ld/testsuite/ld-mips-elf/undefweak-overflow.s | 2 --
> 7 files changed, 63 insertions(+), 13 deletions(-)
> create mode 100644 ld/testsuite/ld-mips-elf/reloc-pcrel-r6.d
> create mode 100644 ld/testsuite/ld-mips-elf/reloc-pcrel-r6.ld
> create mode 100644 ld/testsuite/ld-mips-elf/reloc-pcrel-r6.s
>
> diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
> index c64f90c..55f891d 100644
> --- a/bfd/elfxx-mips.c
> +++ b/bfd/elfxx-mips.c
> @@ -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;
>
> diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp
> index 07d1dc3..1fee8ef 100644
> --- a/ld/testsuite/ld-mips-elf/mips-elf.exp
> +++ b/ld/testsuite/ld-mips-elf/mips-elf.exp
> @@ -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
> index 0000000..ad4ac9e
> --- /dev/null
> +++ b/ld/testsuite/ld-mips-elf/reloc-pcrel-r6.d
> @@ -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
> index 0000000..a40c704
> --- /dev/null
> +++ b/ld/testsuite/ld-mips-elf/reloc-pcrel-r6.ld
> @@ -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
> index 0000000..3cc8850
> --- /dev/null
> +++ b/ld/testsuite/ld-mips-elf/reloc-pcrel-r6.s
> @@ -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
> diff --git a/ld/testsuite/ld-mips-elf/undefweak-overflow.d b/ld/testsuite/ld-mips-elf/undefweak-overflow.d
> index b74f910..bbed997 100644
> --- a/ld/testsuite/ld-mips-elf/undefweak-overflow.d
> +++ b/ld/testsuite/ld-mips-elf/undefweak-overflow.d
> @@ -10,11 +10,9 @@
> [ 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
> @@ -22,13 +20,13 @@
> [ 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
> diff --git a/ld/testsuite/ld-mips-elf/undefweak-overflow.s b/ld/testsuite/ld-mips-elf/undefweak-overflow.s
> index a7a9937..d439d7c 100644
> --- a/ld/testsuite/ld-mips-elf/undefweak-overflow.s
> +++ b/ld/testsuite/ld-mips-elf/undefweak-overflow.s
> @@ -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
> --
> 2.9.5
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-05-27 9:23 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-24 1:16 [PATCH] MIPS/LD: Skip overflow check for %pcrel_hi relocations Faraz Shahbazker
2019-05-27 9:23 ` Paul Hua
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).