From d6101ac20076846ff5092444691d502fd689c886 Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Wed, 29 May 2013 16:22:14 +0000 Subject: [PATCH] gas/ * write.c (resolve_reloc_expr_symbols): On REL targets don't convert relocs who have no relocatable field either. Rephrase the conditional so that the PC-relative check is only applied for REL targets. gas/testsuite/ * gas/mips/jalr3.d: New test. * gas/mips/jalr3-n32.d: New test. * gas/mips/jalr3-n64.d: New test. * gas/mips/jalr3.s: New test source. * gas/mips/mips.exp: Run the new tests. ld/testsuite/ * ld-mips-elf/jalr3.dd: New test. * ld-mips-elf/jalr3.ld: New test linker script. * ld-mips-elf/mips-elf.exp: Run the new test. --- gas/ChangeLog | 7 +++++++ gas/testsuite/ChangeLog | 8 ++++++++ gas/testsuite/gas/mips/jalr3-n32.d | 5 +++++ gas/testsuite/gas/mips/jalr3-n64.d | 15 +++++++++++++++ gas/testsuite/gas/mips/jalr3.d | 11 +++++++++++ gas/testsuite/gas/mips/jalr3.s | 21 +++++++++++++++++++++ gas/testsuite/gas/mips/mips.exp | 10 ++++++++++ gas/write.c | 7 ++++--- ld/testsuite/ChangeLog | 6 ++++++ ld/testsuite/ld-mips-elf/jalr3.dd | 14 ++++++++++++++ ld/testsuite/ld-mips-elf/jalr3.ld | 5 +++++ ld/testsuite/ld-mips-elf/mips-elf.exp | 13 +++++++++++++ 12 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 gas/testsuite/gas/mips/jalr3-n32.d create mode 100644 gas/testsuite/gas/mips/jalr3-n64.d create mode 100644 gas/testsuite/gas/mips/jalr3.d create mode 100644 gas/testsuite/gas/mips/jalr3.s create mode 100644 ld/testsuite/ld-mips-elf/jalr3.dd create mode 100644 ld/testsuite/ld-mips-elf/jalr3.ld diff --git a/gas/ChangeLog b/gas/ChangeLog index b973185..eb53b16 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2013-05-29 Maciej W. Rozycki + + * write.c (resolve_reloc_expr_symbols): On REL targets don't + convert relocs who have no relocatable field either. Rephrase + the conditional so that the PC-relative check is only applied + for REL targets. + 2013-05-28 Chao-ying Fu * config/tc-mips.c (macro) : Don't use $zero for address diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 3b3c376..76c9de8 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2013-05-29 Maciej W. Rozycki + + * gas/mips/jalr3.d: New test. + * gas/mips/jalr3-n32.d: New test. + * gas/mips/jalr3-n64.d: New test. + * gas/mips/jalr3.s: New test source. + * gas/mips/mips.exp: Run the new tests. + 2013-05-28 Cary Coutant * gas/cris/rd-dw2-1.d: Adjust expected output. diff --git a/gas/testsuite/gas/mips/jalr3-n32.d b/gas/testsuite/gas/mips/jalr3-n32.d new file mode 100644 index 0000000..6d9525e --- /dev/null +++ b/gas/testsuite/gas/mips/jalr3-n32.d @@ -0,0 +1,5 @@ +#objdump: -r -j .text +#name: MIPS JALR reloc (n32) +#as: -n32 +#source: jalr3.s +#dump: jalr3.d diff --git a/gas/testsuite/gas/mips/jalr3-n64.d b/gas/testsuite/gas/mips/jalr3-n64.d new file mode 100644 index 0000000..001e7f1 --- /dev/null +++ b/gas/testsuite/gas/mips/jalr3-n64.d @@ -0,0 +1,15 @@ +#objdump: -r -j .text +#name: MIPS JALR reloc (n64) +#as: -64 +#source: jalr3.s + +.*: +file format .*mips.* + +RELOCATION RECORDS FOR \[\.text\]: +OFFSET TYPE VALUE +0000000000000000 R_MIPS_JALR \$bar +0000000000000000 R_MIPS_NONE \*ABS\* +0000000000000000 R_MIPS_NONE \*ABS\* +0000000000000008 R_MIPS_JALR \$bar +0000000000000008 R_MIPS_NONE \*ABS\* +0000000000000008 R_MIPS_NONE \*ABS\* diff --git a/gas/testsuite/gas/mips/jalr3.d b/gas/testsuite/gas/mips/jalr3.d new file mode 100644 index 0000000..73ce08a --- /dev/null +++ b/gas/testsuite/gas/mips/jalr3.d @@ -0,0 +1,11 @@ +#objdump: -r -j .text +#name: MIPS JALR reloc (o32) +#as: -32 +#source: jalr3.s + +.*: +file format .*mips.* + +RELOCATION RECORDS FOR \[\.text\]: +OFFSET TYPE VALUE +00000000 R_MIPS_JALR \$bar +00000008 R_MIPS_JALR \$bar diff --git a/gas/testsuite/gas/mips/jalr3.s b/gas/testsuite/gas/mips/jalr3.s new file mode 100644 index 0000000..6d3ae9f --- /dev/null +++ b/gas/testsuite/gas/mips/jalr3.s @@ -0,0 +1,21 @@ + .text + + .set $bar, bar + + .globl foo + .ent foo +foo: + .reloc 1f, R_MIPS_JALR, $bar +1: jalr $25 + .reloc 1f, R_MIPS_JALR, $bar +1: jr $25 + .end foo + + .ent bar +bar: + j $31 + .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/mips.exp b/gas/testsuite/gas/mips/mips.exp index 1107fb6..a7b85dd 100644 --- a/gas/testsuite/gas/mips/mips.exp +++ b/gas/testsuite/gas/mips/mips.exp @@ -974,6 +974,16 @@ if { [istarget mips*-*-vxworks*] } { run_dump_test "tls-o32" run_dump_test "tls-relw" run_dump_test "jalr2" + run_dump_test_arches "jalr3" [mips_arch_list_matching mips1 \ + !micromips] + if $has_newabi { + run_dump_test_arches "jalr3-n32" \ + [mips_arch_list_matching mips3 \ + !micromips] + run_dump_test_arches "jalr3-n64" \ + [mips_arch_list_matching mips3 \ + !micromips] + } run_dump_test_arches "aent" [mips_arch_list_matching mips1] diff --git a/gas/write.c b/gas/write.c index 22e68c5..745abe6 100644 --- a/gas/write.c +++ b/gas/write.c @@ -722,9 +722,10 @@ resolve_reloc_expr_symbols (void) unless it has enough bits to cover the whole address space. */ if (S_IS_LOCAL (sym) && !symbol_section_p (sym) - && !(howto->partial_inplace - && howto->pc_relative - && howto->src_mask != addr_mask)) + && (sec->use_rela_p + || (howto->partial_inplace + && (!howto->pc_relative + || howto->src_mask == addr_mask)))) { asection *symsec = S_GET_SEGMENT (sym); if (!(((symsec->flags & SEC_MERGE) != 0 diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index cad469c..4e932aa 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-05-29 Maciej W. Rozycki + + * ld-mips-elf/jalr3.dd: New test. + * ld-mips-elf/jalr3.ld: New test linker script. + * ld-mips-elf/mips-elf.exp: Run the new test. + 2013-05-21 Alan Modra PR ld/12982 diff --git a/ld/testsuite/ld-mips-elf/jalr3.dd b/ld/testsuite/ld-mips-elf/jalr3.dd new file mode 100644 index 0000000..6b6d484 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/jalr3.dd @@ -0,0 +1,14 @@ +.*: +file format .*mips.* + +Disassembly of section \.text: + +0+000000 : + 0: 04110003 bal 10 <\$bar> + 4: 00000000 nop + 8: 10000001 b 10 <\$bar> + c: 00000000 nop + +0+000010 <\$bar>: + 10: 03e00008 jr ra + 14: 00000000 nop + \.\.\. diff --git a/ld/testsuite/ld-mips-elf/jalr3.ld b/ld/testsuite/ld-mips-elf/jalr3.ld new file mode 100644 index 0000000..1b86045 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/jalr3.ld @@ -0,0 +1,5 @@ +ENTRY(foo) +SECTIONS +{ + .text : { *(.text) } +} diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp index 97e0c2c..e0ddac9 100644 --- a/ld/testsuite/ld-mips-elf/mips-elf.exp +++ b/ld/testsuite/ld-mips-elf/mips-elf.exp @@ -734,3 +734,16 @@ foreach { abi } $abis { [list "readelf -s ehdr_start-2.nd"] \ "ehdr_start-2-${abi}"]] } + +# R_MIPS_JALR reloc tests. +set abis [concat o32 [expr {$has_newabi ? "n32 n64" : ""}]] +foreach { abi } $abis { + run_ld_link_tests [list \ + [list \ + "MIPS JALR reloc test ($abi)" \ + "$abi_ldflags($abi) -T jalr3.ld" "" \ + "$abi_asflags($abi)" \ + [list ../../../gas/testsuite/gas/mips/jalr3.s] \ + [list "objdump -d jalr3.dd"] \ + "jalr3-${abi}"]] +} -- 2.7.4