+2016-05-24 Maciej W. Rozycki <macro@imgtec.com>
+
+ * config/tc-mips.c (mips_fix_adjustable): Also return 0 for
+ jump relocations against MIPS16 or microMIPS symbols on RELA
+ targets.
+ * testsuite/gas/mips/jalx-local.d: New test.
+ * testsuite/gas/mips/jalx-local-n32.d: New test.
+ * testsuite/gas/mips/jalx-local-n64.d: New test.
+ * testsuite/gas/mips/jalx-local.s: New test source.
+ * testsuite/gas/mips/mips.exp: Run the new tests.
+
2016-05-24 Maciej W. Rozycki <macro@imgtec.com>
* config/tc-mips.c (md_apply_fix)
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 on
- targets with in-place addends; the relocation field cannot
- encode the low bit.
+ 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.
For simplicity, we deal with (3)-(4) by not reducing _any_ relocation
against a MIPS16 symbol. We deal with (5) by by not reducing any
that we have for MIPS16 symbols. */
if (fixp->fx_subsy == NULL
&& (ELF_ST_IS_MIPS16 (S_GET_OTHER (fixp->fx_addsy))
- || *symbol_get_tc (fixp->fx_addsy)
- || (HAVE_IN_PLACE_ADDENDS
- && ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
- && jmp_reloc_p (fixp->fx_r_type))))
+ || (ELF_ST_IS_MICROMIPS (S_GET_OTHER (fixp->fx_addsy))
+ && jmp_reloc_p (fixp->fx_r_type))
+ || *symbol_get_tc (fixp->fx_addsy)))
return 0;
return 1;
--- /dev/null
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JALX local symbol relocation (n32)
+#as: -n32 -march=from-abi
+#source: jalx-local.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+ \.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f400 0000 jal 00000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 \.text\+0x1020
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f000 0000 jalx 00000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 \.text\+0x1020
+[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]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 0c000000 jal 00000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MIPS_26 foo
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 74000000 jalx 00000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MIPS_26 foo
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+ \.\.\.
--- /dev/null
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JALX local symbol relocation (n64)
+#as: -64 -march=from-abi
+#source: jalx-local.s
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+ \.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f400 0000 jal 0000000000000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 \.text\+0x1020
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x1020
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x1020
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f000 0000 jalx 0000000000000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 \.text\+0x1020
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x1020
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*\+0x1020
+[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]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 0c000000 jal 0000000000000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MIPS_26 foo
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 74000000 jalx 0000000000000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MIPS_26 foo
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*
+[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\*
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+ \.\.\.
--- /dev/null
+#objdump: -dr --prefix-addresses --show-raw-insn
+#name: MIPS JALX local symbol relocation
+#as: -32
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+ \.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f400 0810 jal 00001020 <bar>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 \.text
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f000 0408 jalx 00001020 <bar>
+[ ]*[0-9a-f]+: R_MICROMIPS_26_S1 \.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]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 0c000000 jal 00000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MIPS_26 foo
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 74000000 jalx 00000000 <foo-0x1000>
+[ ]*[0-9a-f]+: R_MIPS_26 foo
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+ \.\.\.
--- /dev/null
+ .text
+ .set noreorder
+ .space 0x1000
+
+ .align 4
+ .set micromips
+ .ent foo
+foo:
+ nor $0, $0
+ jal bar
+ nor $0, $0
+ jalx bar
+ nor $0, $0
+ jalr $0, $ra
+ nor $0, $0
+ .end foo
+
+ .align 4
+ .set nomicromips
+ .ent bar
+bar:
+ nor $0, $0
+ jal foo
+ nor $0, $0
+ jalx 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
run_dump_test "mips-jalx-2"
run_dump_test "jalx-imm"
run_dump_test "jalx-addend"
+ run_dump_test "jalx-local"
if $has_newabi {
run_dump_test "jalx-imm-n32"
run_dump_test "jalx-addend-n32"
+ run_dump_test "jalx-local-n32"
run_dump_test "jalx-imm-n64"
run_dump_test "jalx-addend-n64"
+ run_dump_test "jalx-local-n64"
}
# Check MIPS16 HI16/LO16 relocations
run_dump_test "mips16-hilo"
+2016-05-24 Maciej W. Rozycki <macro@imgtec.com>
+
+ * testsuite/ld-mips-elf/jalx-local.d: New test.
+ * testsuite/ld-mips-elf/jalx-local-n32.d: New test.
+ * testsuite/ld-mips-elf/jalx-local-n64.d: New test.
+ * testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
+
2016-05-23 Kuba Sejdak <jakub.sejdak@phoesys.com>
* Makefile.am: Add earmelf_phoenix.c.
--- /dev/null
+#name: MIPS JALX to local symbol (n32)
+#source: ../../../gas/testsuite/gas/mips/jalx-local.s
+#as: -EB -n32 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: jalx-local.d
--- /dev/null
+#name: MIPS JALX to local symbol (n64)
+#source: ../../../gas/testsuite/gas/mips/jalx-local.s
+#as: -EB -64 -march=from-abi
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+#dump: jalx-local.d
--- /dev/null
+#name: MIPS JALX to local symbol
+#source: ../../../gas/testsuite/gas/mips/jalx-local.s
+#as: -EB -32
+#ld: -EB -Ttext 0x1c000000 -e 0x1c000000
+#objdump: -dr --prefix-addresses --show-raw-insn
+
+.*: +file format .*mips.*
+
+Disassembly of section \.text:
+ \.\.\.
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f300 0408 jalx 0*1c001020 <.*>
+[0-9a-f]+ <[^>]*> 0000 02d0 not zero,zero
+[0-9a-f]+ <[^>]*> f300 0408 jalx 0*1c001020 <.*>
+[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]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 77000400 jalx 0*1c001000 <.*>
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 77000400 jalx 0*1c001000 <.*>
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+[0-9a-f]+ <[^>]*> 03e00009 jalr zero,ra
+[0-9a-f]+ <[^>]*> 00000027 nor zero,zero,zero
+ \.\.\.
}
run_dump_test "jalx-addend" [list [list ld $abi_ldflags(o32)]]
+run_dump_test "jalx-local" [list [list ld $abi_ldflags(o32)]]
if $has_newabi {
run_dump_test "jalx-addend-n32" [list [list ld $abi_ldflags(n32)]]
+ run_dump_test "jalx-local-n32" [list [list ld $abi_ldflags(n32)]]
run_dump_test "jalx-addend-n64" [list [list ld $abi_ldflags(n64)]]
+ run_dump_test "jalx-local-n64" [list [list ld $abi_ldflags(n64)]]
}
# Test multi-got link. We only do this on GNU/Linux because it requires