diff options
-rw-r--r-- | gas/ChangeLog | 13 | ||||
-rw-r--r-- | gas/config/tc-mips.c | 25 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/branch-local-1.d | 26 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/branch-local-1.s | 31 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/branch-local-n32-1.d | 26 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/branch-local-n64-1.d | 32 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/micromips@branch-misc-4-64.d | 16 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/mips.exp | 5 |
8 files changed, 161 insertions, 13 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 66c3607..782dc8e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,16 @@ +2016-06-23 Maciej W. Rozycki <macro@imgtec.com> + + * config/tc-mips.c (b_reloc_p): New function. + (mips_fix_adjustable): Also keep the original microMIPS symbol + referred from branch relocations. + * testsuite/gas/mips/branch-local-1.d: New test. + * testsuite/gas/mips/branch-local-n32-1.d: New test. + * testsuite/gas/mips/branch-local-n64-1.d: New test. + * testsuite/gas/mips/micromips@branch-misc-4-64.d: Update + relocations. + * testsuite/gas/mips/branch-local-1.s: New test source. + * testsuite/gas/mips/mips.exp: Run the new cases. + 2016-06-23 Graham Markall <graham.markall@embecosm.com> * config/tc-arc.c (options, md_longopts, md_parse_option): Move diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 6891508..bbb604a 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -4109,6 +4109,17 @@ jmp_reloc_p (bfd_reloc_code_real_type reloc) } static inline bfd_boolean +b_reloc_p (bfd_reloc_code_real_type reloc) +{ + return (reloc == BFD_RELOC_MIPS_26_PCREL_S2 + || reloc == BFD_RELOC_MIPS_21_PCREL_S2 + || reloc == BFD_RELOC_16_PCREL_S2 + || reloc == BFD_RELOC_MICROMIPS_16_PCREL_S1 + || reloc == BFD_RELOC_MICROMIPS_10_PCREL_S1 + || reloc == BFD_RELOC_MICROMIPS_7_PCREL_S1); +} + +static inline bfd_boolean got16_reloc_p (bfd_reloc_code_real_type reloc) { return (reloc == BFD_RELOC_MIPS_GOT16 || reloc == BFD_RELOC_MIPS16_GOT16 @@ -17218,13 +17229,16 @@ mips_fix_adjustable (fixS *fixp) There is a further restriction: 5. We cannot reduce jump relocations (R_MIPS_26, R_MIPS16_26 or - R_MICROMIPS_26_S1) against MIPS16 or microMIPS symbols because - we need to keep the MIPS16 or microMIPS symbol for the purpose - of converting JAL to JALX instructions in the linker. + R_MICROMIPS_26_S1) or branch relocations (R_MIPS_PC26_S2, + R_MIPS_PC21_S2, R_MIPS_PC16, R_MICROMIPS_PC16_S1, + R_MICROMIPS_PC10_S1 or R_MICROMIPS_PC7_S1) against MIPS16 or + microMIPS symbols because we need to keep the MIPS16 or + microMIPS symbol for the purpose of mode mismatch detection + and JAL to JALX instruction conversion in the linker. For simplicity, we deal with (3)-(4) by not reducing _any_ relocation against a MIPS16 symbol. We deal with (5) by additionally leaving - alone any jump relocations against a microMIPS symbol. + alone any jump and branch relocations against a microMIPS symbol. We deal with (1)-(2) by saying that, if there's a R_MIPS16_26 relocation against some symbol R, no relocation against R may be @@ -17236,7 +17250,8 @@ mips_fix_adjustable (fixS *fixp) if (fixp->fx_subsy == NULL && (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy)) || (ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy)) - && jmp_reloc_p (fixp->fx_r_type)) + && (jmp_reloc_p (fixp->fx_r_type) + || b_reloc_p (fixp->fx_r_type))) || *symbol_get_tc (fixp->fx_addsy))) return 0; diff --git a/gas/testsuite/gas/mips/branch-local-1.d b/gas/testsuite/gas/mips/branch-local-1.d new file mode 100644 index 0000000..f85bb8d --- /dev/null +++ b/gas/testsuite/gas/mips/branch-local-1.d @@ -0,0 +1,26 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS branch local symbol relocation 1 +#as: -32 +#source: branch-local-1.s + +.*: +file format .*mips.* + +Disassembly of section \.text: + \.\.\. +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 001f 0f3c jr ra +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 0000 0000 nop +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 40e2 fffe beqzc v0,00001014 <bar\+0x4> +[ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 foo +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> cfff b 0000101c <bar\+0xc> +[ ]*[0-9a-f]+: R_MICROMIPS_PC10_S1 foo +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 8d7f beqz v0,00001022 <bar\+0x12> +[ ]*[0-9a-f]+: R_MICROMIPS_PC7_S1 foo +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 001f 0f3c jr ra +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero + \.\.\. diff --git a/gas/testsuite/gas/mips/branch-local-1.s b/gas/testsuite/gas/mips/branch-local-1.s new file mode 100644 index 0000000..4000c8f --- /dev/null +++ b/gas/testsuite/gas/mips/branch-local-1.s @@ -0,0 +1,31 @@ + .text + .set noreorder + .space 0x1000 + + .align 4 + .set micromips + .ent foo +foo: + nor $0, $0 + jalr $0, $ra + nor $0, $0 + .end foo + + .align 4 + .set micromips + .ent bar +bar: + nor $0, $0 + beqzc $2, foo + nor $0, $0 + b foo + nor $0, $0 + beqz $2, foo + nor $0, $0 + jalr $0, $ra + nor $0, $0 + .end bar + +# Force some (non-delay-slot) zero bytes, to make 'objdump' print ... + .align 4, 0 + .space 16 diff --git a/gas/testsuite/gas/mips/branch-local-n32-1.d b/gas/testsuite/gas/mips/branch-local-n32-1.d new file mode 100644 index 0000000..5dbf9e6 --- /dev/null +++ b/gas/testsuite/gas/mips/branch-local-n32-1.d @@ -0,0 +1,26 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS branch local symbol relocation 1 (n32) +#as: -n32 -march=from-abi +#source: branch-local-1.s + +.*: +file format .*mips.* + +Disassembly of section \.text: + \.\.\. +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 001f 0f3c jr ra +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 0000 0000 nop +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 40e2 0000 beqzc v0,00001018 <bar\+0x8> +[ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 foo-0x4 +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> cc00 b 0000101e <bar\+0xe> +[ ]*[0-9a-f]+: R_MICROMIPS_PC10_S1 foo-0x2 +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 8d00 beqz v0,00001024 <bar\+0x14> +[ ]*[0-9a-f]+: R_MICROMIPS_PC7_S1 foo-0x2 +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 001f 0f3c jr ra +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero + \.\.\. diff --git a/gas/testsuite/gas/mips/branch-local-n64-1.d b/gas/testsuite/gas/mips/branch-local-n64-1.d new file mode 100644 index 0000000..f20819e --- /dev/null +++ b/gas/testsuite/gas/mips/branch-local-n64-1.d @@ -0,0 +1,32 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS branch local symbol relocation 1 (n64) +#as: -64 -march=from-abi +#source: branch-local-1.s + +.*: +file format .*mips.* + +Disassembly of section \.text: + \.\.\. +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 001f 0f3c jr ra +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 0000 0000 nop +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 40e2 0000 beqzc v0,0000000000001018 <bar\+0x8> +[ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 foo-0x4 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x4 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x4 +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> cc00 b 000000000000101e <bar\+0xe> +[ ]*[0-9a-f]+: R_MICROMIPS_PC10_S1 foo-0x2 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x2 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x2 +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 8d00 beqz v0,0000000000001024 <bar\+0x14> +[ ]*[0-9a-f]+: R_MICROMIPS_PC7_S1 foo-0x2 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x2 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x2 +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 001f 0f3c jr ra +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero + \.\.\. diff --git a/gas/testsuite/gas/mips/micromips@branch-misc-4-64.d b/gas/testsuite/gas/mips/micromips@branch-misc-4-64.d index 008dac0..4665d97 100644 --- a/gas/testsuite/gas/mips/micromips@branch-misc-4-64.d +++ b/gas/testsuite/gas/mips/micromips@branch-misc-4-64.d @@ -14,10 +14,10 @@ Disassembly of section \.text: [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\-0x4 [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\-0x4 [0-9a-f]+ <[^>]*> 0c00 nop -[0-9a-f]+ <[^>]*> 9400 0000 b [0-9a-f]+ <foo\+0x[0-9a-f]+> -[ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 \.init\+0x2 -[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x2 -[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x2 +[0-9a-f]+ <[^>]*> 9400 0000 b [0-9a-f]+ <\.Lfoo\+0x[0-9a-f]+> +[ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 \.Lbar-0x4 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x4 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x4 [0-9a-f]+ <[^>]*> 0c00 nop \.\.\. @@ -27,9 +27,9 @@ Disassembly of section \.init: [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\-0x4 [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\-0x4 [0-9a-f]+ <[^>]*> 0c00 nop -[0-9a-f]+ <[^>]*> 9400 0000 b [0-9a-f]+ <bar\+0x[0-9a-f]+> -[ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 \.text\+0x40002 -[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x40002 -[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x40002 +[0-9a-f]+ <[^>]*> 9400 0000 b [0-9a-f]+ <\.Lbar\+0x[0-9a-f]+> +[ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 \.Lfoo-0x4 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x4 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*-0x4 [0-9a-f]+ <[^>]*> 0c00 nop \.\.\. diff --git a/gas/testsuite/gas/mips/mips.exp b/gas/testsuite/gas/mips/mips.exp index 4236397..30143b8 100644 --- a/gas/testsuite/gas/mips/mips.exp +++ b/gas/testsuite/gas/mips/mips.exp @@ -588,6 +588,11 @@ if { [istarget mips*-*-vxworks*] } { run_dump_test "branch-weak-3" run_dump_test "branch-weak-4" run_dump_test "branch-weak-5" + run_dump_test "branch-local-1" + if $has_newabi { + run_dump_test "branch-local-n32-1" + run_dump_test "branch-local-n64-1" + } run_dump_test "compact-eh-eb-1" run_dump_test "compact-eh-eb-2" |