From: Maciej W. Rozycki Date: Thu, 23 Jun 2016 10:33:52 +0000 (+0100) Subject: MIPS/GAS: Keep the original microMIPS symbol reference in branch relocs X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0e9c5a5c9916efc8a6c518c84ffdd50a745482c3;p=binutils-gdb.git MIPS/GAS: Keep the original microMIPS symbol reference in branch relocs Keep original microMIPS symbols in references from branch relocations so that the ISA bit is retained and can be verified for validity in static link. No need to update WRT MIPS16 symbols because we keep them all anyway for other reasons. gas/ * 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 66c36073410..782dc8e3a60 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,16 @@ +2016-06-23 Maciej W. Rozycki + + * 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 * 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 6891508e132..bbb604ae179 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -4108,6 +4108,17 @@ jmp_reloc_p (bfd_reloc_code_real_type reloc) return reloc == BFD_RELOC_MIPS_JMP || reloc == BFD_RELOC_MICROMIPS_JMP; } +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) { @@ -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 00000000000..f85bb8da5ff --- /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 +[ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 foo +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> cfff b 0000101c +[ ]*[0-9a-f]+: R_MICROMIPS_PC10_S1 foo +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 8d7f beqz v0,00001022 +[ ]*[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 00000000000..4000c8f846d --- /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 00000000000..5dbf9e6f860 --- /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 +[ ]*[0-9a-f]+: R_MICROMIPS_PC16_S1 foo-0x4 +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> cc00 b 0000101e +[ ]*[0-9a-f]+: R_MICROMIPS_PC10_S1 foo-0x2 +[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero +[0-9a-f]+ <[^>]*> 8d00 beqz v0,00001024 +[ ]*[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 00000000000..f20819e2a97 --- /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 +[ ]*[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 +[ ]*[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 +[ ]*[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 008dac004ed..4665d97a60f 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]+ -[ ]*[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]+ -[ ]*[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 4236397dcf2..30143b86746 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"