From ce70d90a3e5e00fd49b46164a43e3dfbcf1cf404 Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Mon, 28 Feb 2011 15:44:53 +0000 Subject: [PATCH] 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. --- gas/ChangeLog | 5 +++++ gas/config/tc-mips.c | 8 +++++-- gas/testsuite/ChangeLog | 10 +++++++++ gas/testsuite/gas/mips/branch-misc-2.d | 2 +- gas/testsuite/gas/mips/branch-misc-2pic.d | 2 +- gas/testsuite/gas/mips/branch-misc-4-64.d | 35 +++++++++++++++++++++++++++++++ gas/testsuite/gas/mips/branch-misc-4.d | 26 +++++++++++++++++++++++ gas/testsuite/gas/mips/branch-misc-4.s | 28 +++++++++++++++++++++++++ gas/testsuite/gas/mips/mips.exp | 5 +++++ 9 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 gas/testsuite/gas/mips/branch-misc-4-64.d create mode 100644 gas/testsuite/gas/mips/branch-misc-4.d create mode 100644 gas/testsuite/gas/mips/branch-misc-4.s diff --git a/gas/ChangeLog b/gas/ChangeLog index e5dd2bd..316abb7 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,10 @@ 2011-02-28 Maciej W. Rozycki + * config/tc-mips.c (mips_fix_adjustable): On REL targets also + reject PC-relative relocations. + +2011-02-28 Maciej W. Rozycki + * 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 4b7dcdc..897ed0f 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 8eca541..1b0dfde 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,5 +1,15 @@ 2011-02-28 Maciej W. Rozycki + * 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 + * 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 ffd823c..205d685 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 -[ ]*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 5b42b29..bc60431 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 -[ ]*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 0000000..13c77d7 --- /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]+ +[ ]*[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]+ +[ ]*[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]+ +[ ]*[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]+ +[ ]*[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 0000000..6c4e99c --- /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 +[ ]*[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 +[ ]*[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 0000000..0b7a817 --- /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 056dd75..ad11f02 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 { -- 2.7.4