+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
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)
{
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
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;
--- /dev/null
+#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
+ \.\.\.
--- /dev/null
+ .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
--- /dev/null
+#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
+ \.\.\.
--- /dev/null
+#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
+ \.\.\.
[ ]*[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
\.\.\.
[ ]*[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
\.\.\.
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"