diff options
author | Maciej W. Rozycki <macro@imgtec.com> | 2017-02-28 00:14:08 +0000 |
---|---|---|
committer | Maciej W. Rozycki <macro@imgtec.com> | 2017-02-28 00:22:36 +0000 |
commit | 0e39210161e7c547ab53afb86997303e24a42c0c (patch) | |
tree | d9e7851d07bece63eb64bb4e283d70f7b59932ca /bfd | |
parent | 279a558a4d0fad268738ec916628c9c12cfcaf5b (diff) | |
download | gdb-0e39210161e7c547ab53afb86997303e24a42c0c.zip gdb-0e39210161e7c547ab53afb86997303e24a42c0c.tar.gz gdb-0e39210161e7c547ab53afb86997303e24a42c0c.tar.bz2 |
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.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 8 |
2 files changed, 9 insertions, 4 deletions
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 <macro@imgtec.com> + + * elfxx-mips.c (mips_elf_perform_relocation): Also handle the + `jalr $0, $25' instruction encoding. + 2017-02-27 Nick Clifton <nickc@redhat.com> 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 */ |