summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaciej W. Rozycki <macro@linux-mips.org>2011-02-28 15:44:53 +0000
committerMaciej W. Rozycki <macro@linux-mips.org>2011-02-28 15:44:53 +0000
commitce70d90a3e5e00fd49b46164a43e3dfbcf1cf404 (patch)
tree3fa69a6e9d73d3806e9892bba1a4cd515edbef7e
parent5c4f07bae108d3f6e70b755f49d1c008088138f9 (diff)
downloadbinutils-ce70d90a3e5e00fd49b46164a43e3dfbcf1cf404.tar.gz
binutils-ce70d90a3e5e00fd49b46164a43e3dfbcf1cf404.tar.bz2
binutils-ce70d90a3e5e00fd49b46164a43e3dfbcf1cf404.zip
gas/
* config/tc-mips.c (mips_fix_adjustable): On REL targets also reject PC-relative relocations. gas/testsuite/ * gas/mips/branch-misc-2.d: Adjust for relocation change. * gas/mips/branch-misc-2pic.d: Likewise. * gas/mips/branch-misc-4.d: New test for PC-relative relocation overflow. * gas/mips/branch-misc-4-64.d: Likewise. * gas/mips/branch-misc-4.s: Source for the new tests. * testsuite/gas/mips/mips.exp: Run the new tests.
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-mips.c8
-rw-r--r--gas/testsuite/ChangeLog10
-rw-r--r--gas/testsuite/gas/mips/branch-misc-2.d2
-rw-r--r--gas/testsuite/gas/mips/branch-misc-2pic.d2
-rw-r--r--gas/testsuite/gas/mips/branch-misc-4-64.d35
-rw-r--r--gas/testsuite/gas/mips/branch-misc-4.d26
-rw-r--r--gas/testsuite/gas/mips/branch-misc-4.s28
-rw-r--r--gas/testsuite/gas/mips/mips.exp5
9 files changed, 117 insertions, 4 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index e5dd2bdcfc9..316abb73c7b 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,10 @@
2011-02-28 Maciej W. Rozycki <macro@codesourcery.com>
+ * config/tc-mips.c (mips_fix_adjustable): On REL targets also
+ reject PC-relative relocations.
+
+2011-02-28 Maciej W. Rozycki <macro@codesourcery.com>
+
* config/tc-mips.c (md_convert_frag): Correct message
capitalization.
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 4b7dcdcdd84..897ed0f8361 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -14248,8 +14248,12 @@ mips_fix_adjustable (fixS *fixp)
&& (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_MERGE) != 0)
return 0;
- /* There is no place to store an in-place offset for JALR relocations. */
- if (fixp->fx_r_type == BFD_RELOC_MIPS_JALR && HAVE_IN_PLACE_ADDENDS)
+ /* There is no place to store an in-place offset for JALR relocations.
+ Likewise an in-range offset of PC-relative relocations may overflow
+ the in-place relocatable field if recalculated against the start
+ address of the symbol's containing section. */
+ if (HAVE_IN_PLACE_ADDENDS
+ && (fixp->fx_pcrel || fixp->fx_r_type == BFD_RELOC_MIPS_JALR))
return 0;
#ifdef OBJ_ELF
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 8eca541b67d..1b0dfde8327 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,5 +1,15 @@
2011-02-28 Maciej W. Rozycki <macro@codesourcery.com>
+ * gas/mips/branch-misc-2.d: Adjust for relocation change.
+ * gas/mips/branch-misc-2pic.d: Likewise.
+ * gas/mips/branch-misc-4.d: New test for PC-relative relocation
+ overflow.
+ * gas/mips/branch-misc-4-64.d: Likewise.
+ * gas/mips/branch-misc-4.s: Source for the new tests.
+ * testsuite/gas/mips/mips.exp: Run the new tests.
+
+2011-02-28 Maciej W. Rozycki <macro@codesourcery.com>
+
* gas/mips/relax-swap1.l: Adjust for message capitalization
correction.
* gas/mips/relax-swap2.l: Likewise.
diff --git a/gas/testsuite/gas/mips/branch-misc-2.d b/gas/testsuite/gas/mips/branch-misc-2.d
index ffd823c7b62..205d68542f8 100644
--- a/gas/testsuite/gas/mips/branch-misc-2.d
+++ b/gas/testsuite/gas/mips/branch-misc-2.d
@@ -39,6 +39,6 @@ Disassembly of section .text:
[ ]*b0: R_MIPS_PC16 x2
0+00b4 <[^>]*> 00000000 nop
0+00b8 <[^>]*> 1000ffff b 000000b8 <g6\+0x10>
-[ ]*b8: R_MIPS_PC16 \.data
+[ ]*b8: R_MIPS_PC16 \.Ldata
0+00bc <[^>]*> 00000000 nop
\.\.\.
diff --git a/gas/testsuite/gas/mips/branch-misc-2pic.d b/gas/testsuite/gas/mips/branch-misc-2pic.d
index 5b42b29603e..bc604311a99 100644
--- a/gas/testsuite/gas/mips/branch-misc-2pic.d
+++ b/gas/testsuite/gas/mips/branch-misc-2pic.d
@@ -40,6 +40,6 @@ Disassembly of section .text:
[ ]*b0: R_MIPS_PC16 x2
0+00b4 <[^>]*> 00000000 nop
0+00b8 <[^>]*> 1000ffff b 000000b8 <g6\+0x10>
-[ ]*b8: R_MIPS_PC16 \.data
+[ ]*b8: R_MIPS_PC16 \.Ldata
0+00bc <[^>]*> 00000000 nop
\.\.\.
diff --git a/gas/testsuite/gas/mips/branch-misc-4-64.d b/gas/testsuite/gas/mips/branch-misc-4-64.d
new file mode 100644
index 00000000000..13c77d7f86a
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-misc-4-64.d
@@ -0,0 +1,35 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS branch-misc-4-64
+#as: -64
+#source: branch-misc-4.s
+
+# Verify PC-relative relocations do not overflow.
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+ \.\.\.
+[0-9a-f]+ <[^>]*> 10000000 b [0-9a-f]+ <foo\+0x[0-9a-f]+>
+[ ]*[0-9a-f]+: R_MIPS_PC16 bar\+0xf+fffc
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0xf+fffc
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0xf+fffc
+[0-9a-f]+ <[^>]*> 00000000 nop
+[0-9a-f]+ <[^>]*> 10000000 b [0-9a-f]+ <foo\+0x[0-9a-f]+>
+[ ]*[0-9a-f]+: R_MIPS_PC16 \.init\+0x4
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x4
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x4
+[0-9a-f]+ <[^>]*> 00000000 nop
+ \.\.\.
+
+Disassembly of section \.init:
+[0-9a-f]+ <[^>]*> 10000000 b [0-9a-f]+ <bar\+0x[0-9a-f]+>
+[ ]*[0-9a-f]+: R_MIPS_PC16 foo\+0xf+fffc
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0xf+fffc
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0xf+fffc
+[0-9a-f]+ <[^>]*> 00000000 nop
+[0-9a-f]+ <[^>]*> 10000000 b [0-9a-f]+ <bar\+0x[0-9a-f]+>
+[ ]*[0-9a-f]+: R_MIPS_PC16 \.text\+0x40004
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x40004
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x40004
+[0-9a-f]+ <[^>]*> 00000000 nop
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/branch-misc-4.d b/gas/testsuite/gas/mips/branch-misc-4.d
new file mode 100644
index 00000000000..6c4e99c64fe
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-misc-4.d
@@ -0,0 +1,26 @@
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS branch-misc-4
+#as: -32
+
+# Verify PC-relative relocations do not overflow.
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+ \.\.\.
+([0-9a-f]+) <[^>]*> 1000ffff b \1 <foo>
+[ ]*[0-9a-f]+: R_MIPS_PC16 bar
+[0-9a-f]+ <[^>]*> 00000000 nop
+([0-9a-f]+) <[^>]*> 1000ffff b \1 <\.Lfoo>
+[ ]*[0-9a-f]+: R_MIPS_PC16 \.Lbar
+[0-9a-f]+ <[^>]*> 00000000 nop
+ \.\.\.
+
+Disassembly of section \.init:
+([0-9a-f]+) <[^>]*> 1000ffff b \1 <bar>
+[ ]*[0-9a-f]+: R_MIPS_PC16 foo
+[0-9a-f]+ <[^>]*> 00000000 nop
+([0-9a-f]+) <[^>]*> 1000ffff b \1 <\.Lbar>
+[ ]*[0-9a-f]+: R_MIPS_PC16 \.Lfoo
+[0-9a-f]+ <[^>]*> 00000000 nop
+ \.\.\.
diff --git a/gas/testsuite/gas/mips/branch-misc-4.s b/gas/testsuite/gas/mips/branch-misc-4.s
new file mode 100644
index 00000000000..0b7a8170350
--- /dev/null
+++ b/gas/testsuite/gas/mips/branch-misc-4.s
@@ -0,0 +1,28 @@
+# Source file to verify PC-relative relocations do not overflow.
+
+ .text
+ .space 0x40000
+ .globl foo
+ .ent foo
+foo:
+ b bar
+.Lfoo:
+ b .Lbar
+ .end foo
+
+# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
+ .align 2
+ .space 8
+
+ .section .init, "ax", @progbits
+ .globl bar
+ .ent bar
+bar:
+ b foo
+.Lbar:
+ b .Lfoo
+ .end bar
+
+# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
+ .align 2
+ .space 8
diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp
index 056dd75c090..ad11f0225ec 100644
--- a/gas/testsuite/gas/mips/mips.exp
+++ b/gas/testsuite/gas/mips/mips.exp
@@ -830,6 +830,11 @@ if { [istarget mips*-*-vxworks*] } {
run_dump_test "jalr2"
run_dump_test_arches "aent" [mips_arch_list_matching mips1]
+
+ run_dump_test_arches "branch-misc-4" \
+ [mips_arch_list_matching mips1]
+ run_dump_test_arches "branch-misc-4-64" \
+ [mips_arch_list_matching mips3]
}
if $has_newabi {