+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
&& (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
+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
[ ]*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
\.\.\.
[ ]*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
\.\.\.
--- /dev/null
+#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
+ \.\.\.
--- /dev/null
+#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
+ \.\.\.
--- /dev/null
+# 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
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 {