From 0e39210161e7c547ab53afb86997303e24a42c0c Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Tue, 28 Feb 2017 00:14:08 +0000 Subject: [PATCH] MIPS/BFD: Also handle `jalr $0, $25' with R_MIPS_JALR Interpret the `jalr $0, $25' instruction encoding with an R_MIPS_JALR relocation attached as an alias to `jr $25' and convert the jump to an equivalent branch where possible, consequently covering the MIPSr6 architecture for the purpose of this optimization too. bfd/ * elfxx-mips.c (mips_elf_perform_relocation): Also handle the `jalr $0, $25' instruction encoding. gas/ * testsuite/gas/mips/jalr4.s: Add `jalr $0, $25' instructions. * testsuite/gas/mips/jalr4.d: Adjust accordingly. Remove MIPSr6 encoding patterns. * testsuite/gas/mips/jalr4-n64.d: Likewise. * testsuite/gas/mips/mipsr6@jalr4.d: New test. * testsuite/gas/mips/mipsr6@jalr4-n32.d: New test. * testsuite/gas/mips/mipsr6@jalr4-n64.d: New test. ld/ * testsuite/ld-mips-elf/jalr4.dd: Adjust for `jalr $0, $25' instructions. * testsuite/ld-mips-elf/jalr4-r6.dd: New test. * testsuite/ld-mips-elf/mips-elf.exp: Run the new test. --- bfd/ChangeLog | 5 +++ bfd/elfxx-mips.c | 8 ++--- gas/ChangeLog | 10 ++++++ gas/testsuite/gas/mips/jalr4-n64.d | 21 ++++++++++-- gas/testsuite/gas/mips/jalr4.d | 15 ++++++-- gas/testsuite/gas/mips/jalr4.s | 6 ++++ gas/testsuite/gas/mips/mipsr6@jalr4-n32.d | 5 +++ gas/testsuite/gas/mips/mipsr6@jalr4-n64.d | 57 +++++++++++++++++++++++++++++++ gas/testsuite/gas/mips/mipsr6@jalr4.d | 39 +++++++++++++++++++++ ld/ChangeLog | 7 ++++ ld/testsuite/ld-mips-elf/jalr4-r6.dd | 25 ++++++++++++++ ld/testsuite/ld-mips-elf/jalr4.dd | 10 ++++-- ld/testsuite/ld-mips-elf/mips-elf.exp | 11 ++++++ 13 files changed, 207 insertions(+), 12 deletions(-) create mode 100644 gas/testsuite/gas/mips/mipsr6@jalr4-n32.d create mode 100644 gas/testsuite/gas/mips/mipsr6@jalr4-n64.d create mode 100644 gas/testsuite/gas/mips/mipsr6@jalr4.d create mode 100644 ld/testsuite/ld-mips-elf/jalr4-r6.dd diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0f8d9ee..652c074 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2017-02-28 Maciej W. Rozycki + + * elfxx-mips.c (mips_elf_perform_relocation): Also handle the + `jalr $0, $25' instruction encoding. + 2017-02-27 Nick Clifton PR ld/21180 diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 9693442..7a1d5f8 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -6465,13 +6465,13 @@ mips_elf_perform_relocation (struct bfd_link_info *info, && !cross_mode_jump_p && ((JAL_TO_BAL_P (input_bfd) && r_type == R_MIPS_26 - && (x >> 26) == 0x3) /* jal addr */ + && (x >> 26) == 0x3) /* jal addr */ || (JALR_TO_BAL_P (input_bfd) && r_type == R_MIPS_JALR - && x == 0x0320f809) /* jalr t9 */ + && x == 0x0320f809) /* jalr t9 */ || (JR_TO_B_P (input_bfd) && r_type == R_MIPS_JALR - && x == 0x03200008))) /* jr t9 */ + && (x & ~1) == 0x03200008))) /* jr t9 / jalr zero, t9 */ { bfd_vma addr; bfd_vma dest; @@ -6488,7 +6488,7 @@ mips_elf_perform_relocation (struct bfd_link_info *info, off = dest - addr; if (off <= 0x1ffff && off >= -0x20000) { - if (x == 0x03200008) /* jr t9 */ + if ((x & ~1) == 0x03200008) /* jr t9 / jalr zero, t9 */ x = 0x10000000 | (((bfd_vma) off >> 2) & 0xffff); /* b addr */ else x = 0x04110000 | (((bfd_vma) off >> 2) & 0xffff); /* bal addr */ diff --git a/gas/ChangeLog b/gas/ChangeLog index b2908dc..ec6dbf7 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,13 @@ +2017-02-28 Maciej W. Rozycki + + * testsuite/gas/mips/jalr4.s: Add `jalr $0, $25' instructions. + * testsuite/gas/mips/jalr4.d: Adjust accordingly. Remove MIPSr6 + encoding patterns. + * testsuite/gas/mips/jalr4-n64.d: Likewise. + * testsuite/gas/mips/mipsr6@jalr4.d: New test. + * testsuite/gas/mips/mipsr6@jalr4-n32.d: New test. + * testsuite/gas/mips/mipsr6@jalr4-n64.d: New test. + 2017-02-25 Alan Modra * testsuite/gas/elf/strtab.s: Don't put directives on first diff --git a/gas/testsuite/gas/mips/jalr4-n64.d b/gas/testsuite/gas/mips/jalr4-n64.d index b61fc23..99a334d 100644 --- a/gas/testsuite/gas/mips/jalr4-n64.d +++ b/gas/testsuite/gas/mips/jalr4-n64.d @@ -11,7 +11,12 @@ Disassembly of section \.text: [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* [0-9a-f]+ <[^>]*> 00000000 nop -[0-9a-f]+ <[^>]*> 0320000[89] jr t9 +[0-9a-f]+ <[^>]*> 03200009 jalr zero,t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar0 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200008 jr t9 [ ]*[0-9a-f]+: R_MIPS_JALR bar0 [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* @@ -21,7 +26,12 @@ Disassembly of section \.text: [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* [0-9a-f]+ <[^>]*> 00000000 nop -[0-9a-f]+ <[^>]*> 0320000[89] jr t9 +[0-9a-f]+ <[^>]*> 03200009 jalr zero,t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar1 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200008 jr t9 [ ]*[0-9a-f]+: R_MIPS_JALR bar1 [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* @@ -31,7 +41,12 @@ Disassembly of section \.text: [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* [0-9a-f]+ <[^>]*> 00000000 nop -[0-9a-f]+ <[^>]*> 0320000[89] jr t9 +[0-9a-f]+ <[^>]*> 03200009 jalr zero,t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar2 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200008 jr t9 [ ]*[0-9a-f]+: R_MIPS_JALR bar2 [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* [ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* diff --git a/gas/testsuite/gas/mips/jalr4.d b/gas/testsuite/gas/mips/jalr4.d index 1a1afdd..4cafd41 100644 --- a/gas/testsuite/gas/mips/jalr4.d +++ b/gas/testsuite/gas/mips/jalr4.d @@ -9,19 +9,28 @@ Disassembly of section \.text: [0-9a-f]+ <[^>]*> 0320f809 jalr t9 [ ]*[0-9a-f]+: R_MIPS_JALR bar0 [0-9a-f]+ <[^>]*> 00000000 nop -[0-9a-f]+ <[^>]*> 0320000[89] jr t9 +[0-9a-f]+ <[^>]*> 03200009 jalr zero,t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar0 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200008 jr t9 [ ]*[0-9a-f]+: R_MIPS_JALR bar0 [0-9a-f]+ <[^>]*> 00000000 nop [0-9a-f]+ <[^>]*> 0320f809 jalr t9 [ ]*[0-9a-f]+: R_MIPS_JALR bar1 [0-9a-f]+ <[^>]*> 00000000 nop -[0-9a-f]+ <[^>]*> 0320000[89] jr t9 +[0-9a-f]+ <[^>]*> 03200009 jalr zero,t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar1 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200008 jr t9 [ ]*[0-9a-f]+: R_MIPS_JALR bar1 [0-9a-f]+ <[^>]*> 00000000 nop [0-9a-f]+ <[^>]*> 0320f809 jalr t9 [ ]*[0-9a-f]+: R_MIPS_JALR bar2 [0-9a-f]+ <[^>]*> 00000000 nop -[0-9a-f]+ <[^>]*> 0320000[89] jr t9 +[0-9a-f]+ <[^>]*> 03200009 jalr zero,t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar2 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200008 jr t9 [ ]*[0-9a-f]+: R_MIPS_JALR bar2 [0-9a-f]+ <[^>]*> 00000000 nop \.\.\. diff --git a/gas/testsuite/gas/mips/jalr4.s b/gas/testsuite/gas/mips/jalr4.s index 4ad6f26..25e8634 100644 --- a/gas/testsuite/gas/mips/jalr4.s +++ b/gas/testsuite/gas/mips/jalr4.s @@ -8,14 +8,20 @@ foo: .reloc 1f, R_MIPS_JALR, bar0 1: jalr $25 .reloc 1f, R_MIPS_JALR, bar0 +1: jalr $0, $25 + .reloc 1f, R_MIPS_JALR, bar0 1: jr $25 .reloc 1f, R_MIPS_JALR, bar1 1: jalr $25 .reloc 1f, R_MIPS_JALR, bar1 +1: jalr $0, $25 + .reloc 1f, R_MIPS_JALR, bar1 1: jr $25 .reloc 1f, R_MIPS_JALR, bar2 1: jalr $25 .reloc 1f, R_MIPS_JALR, bar2 +1: jalr $0, $25 + .reloc 1f, R_MIPS_JALR, bar2 1: jr $25 .end foo diff --git a/gas/testsuite/gas/mips/mipsr6@jalr4-n32.d b/gas/testsuite/gas/mips/mipsr6@jalr4-n32.d new file mode 100644 index 0000000..0a17cbf --- /dev/null +++ b/gas/testsuite/gas/mips/mipsr6@jalr4-n32.d @@ -0,0 +1,5 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS JALR reloc unaligned/cross-mode (n32) +#as: -n32 +#source: jalr4.s +#dump: mipsr6@jalr4.d diff --git a/gas/testsuite/gas/mips/mipsr6@jalr4-n64.d b/gas/testsuite/gas/mips/mipsr6@jalr4-n64.d new file mode 100644 index 0000000..b7424d6 --- /dev/null +++ b/gas/testsuite/gas/mips/mipsr6@jalr4-n64.d @@ -0,0 +1,57 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS JALR reloc unaligned/cross-mode (n64) +#as: -64 +#source: jalr4.s + +.*: +file format .*mips.* + +Disassembly of section \.text: +[0-9a-f]+ <[^>]*> 0320f809 jalr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar0 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar0 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar0 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 0320f809 jalr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar1 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar1 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar1 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 0320f809 jalr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar2 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar2 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar2 +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[ ]*[0-9a-f]+: R_MIPS_NONE \*ABS\* +[0-9a-f]+ <[^>]*> 00000000 nop + \.\.\. + \.\.\. + \.\.\. + \.\.\. diff --git a/gas/testsuite/gas/mips/mipsr6@jalr4.d b/gas/testsuite/gas/mips/mipsr6@jalr4.d new file mode 100644 index 0000000..9b49339 --- /dev/null +++ b/gas/testsuite/gas/mips/mipsr6@jalr4.d @@ -0,0 +1,39 @@ +#objdump: -dr --prefix-addresses --show-raw-insn +#name: MIPS JALR reloc unaligned/cross-mode (o32) +#as: -32 +#source: jalr4.s + +.*: +file format .*mips.* + +Disassembly of section \.text: +[0-9a-f]+ <[^>]*> 0320f809 jalr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar0 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar0 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar0 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 0320f809 jalr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar1 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar1 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar1 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 0320f809 jalr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar2 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar2 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[ ]*[0-9a-f]+: R_MIPS_JALR bar2 +[0-9a-f]+ <[^>]*> 00000000 nop + \.\.\. + \.\.\. + \.\.\. + \.\.\. diff --git a/ld/ChangeLog b/ld/ChangeLog index a4f2406..ceee695 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2017-02-28 Maciej W. Rozycki + + * testsuite/ld-mips-elf/jalr4.dd: Adjust for `jalr $0, $25' + instructions. + * testsuite/ld-mips-elf/jalr4-r6.dd: New test. + * testsuite/ld-mips-elf/mips-elf.exp: Run the new test. + 2017-02-27 Georg-Johann Lay PR target/20849 diff --git a/ld/testsuite/ld-mips-elf/jalr4-r6.dd b/ld/testsuite/ld-mips-elf/jalr4-r6.dd new file mode 100644 index 0000000..f587513 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/jalr4-r6.dd @@ -0,0 +1,25 @@ +.*: +file format .*mips.* + +Disassembly of section \.text: +[0-9a-f]+ <[^>]*> 04110017 bal 0+000060 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 10000015 b 0+000060 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 10000013 b 0+000060 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 0320f809 jalr t9 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 0320f809 jalr t9 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jr t9 +[0-9a-f]+ <[^>]*> 00000000 nop + \.\.\. + \.\.\. + \.\.\. + \.\.\. diff --git a/ld/testsuite/ld-mips-elf/jalr4.dd b/ld/testsuite/ld-mips-elf/jalr4.dd index 8e41756..56ee094 100644 --- a/ld/testsuite/ld-mips-elf/jalr4.dd +++ b/ld/testsuite/ld-mips-elf/jalr4.dd @@ -1,16 +1,22 @@ .*: +file format .*mips.* Disassembly of section \.text: -[0-9a-f]+ <[^>]*> 0411000f bal 0+000040 +[0-9a-f]+ <[^>]*> 04110017 bal 0+000060 [0-9a-f]+ <[^>]*> 00000000 nop -[0-9a-f]+ <[^>]*> 1000000d b 0+000040 +[0-9a-f]+ <[^>]*> 10000015 b 0+000060 +[0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 10000013 b 0+000060 [0-9a-f]+ <[^>]*> 00000000 nop [0-9a-f]+ <[^>]*> 0320f809 jalr t9 [0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jalr zero,t9 +[0-9a-f]+ <[^>]*> 00000000 nop [0-9a-f]+ <[^>]*> 03200008 jr t9 [0-9a-f]+ <[^>]*> 00000000 nop [0-9a-f]+ <[^>]*> 0320f809 jalr t9 [0-9a-f]+ <[^>]*> 00000000 nop +[0-9a-f]+ <[^>]*> 03200009 jalr zero,t9 +[0-9a-f]+ <[^>]*> 00000000 nop [0-9a-f]+ <[^>]*> 03200008 jr t9 [0-9a-f]+ <[^>]*> 00000000 nop \.\.\. diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp index dab0e0f..73d5969 100644 --- a/ld/testsuite/ld-mips-elf/mips-elf.exp +++ b/ld/testsuite/ld-mips-elf/mips-elf.exp @@ -1006,6 +1006,17 @@ foreach { abi } $abis { "$abi_asflags($abi)" \ [list ../../../gas/testsuite/gas/mips/jalr4.s] \ [list "objdump {-d --prefix-addresses --show-raw-insn} jalr4.dd"] \ + "jalr4-${abi}"] \ + [list \ + "MIPSr6 JALR reloc unaligned/cross-mode link test ($abi)" \ + "$abi_ldflags($abi) -T jalr3.ld" "" \ + [string map \ + [list -32 "-mips32r6 -32" \ + -n32 "-mips64r6 -n32" \ + -64 "-mips64r6 -64"] \ + [regsub -- -march=from-abi $abi_asflags($abi) ""]] \ + {../../../gas/testsuite/gas/mips/jalr4.s} \ + {{objdump {-d --prefix-addresses --show-raw-insn} jalr4-r6.dd}} \ "jalr4-${abi}"]] } -- 2.7.4