MIPS16: Add R_MIPS16_PC16_S1 branch relocation support
authorMaciej W. Rozycki <macro@imgtec.com>
Tue, 28 Jun 2016 00:23:36 +0000 (01:23 +0100)
committerMaciej W. Rozycki <macro@imgtec.com>
Tue, 28 Jun 2016 00:29:56 +0000 (01:29 +0100)
commitc9775dde32773c57d4eb5dfb4265eda9cb8adbe8
tree59735930ba2df8d7a5e885c7d388b45e341ecd04
parentbac13b9c13a0169aea400335776310b1f1ff2d16
MIPS16: Add R_MIPS16_PC16_S1 branch relocation support

For R_MIPS16_PC16_S1 the calculation is `(sign_extend(A) + S - P) >> 1'
and the usual MIPS16 bit shuffling applies to relocated field handling,
as per the encoding of the branch target in the extended form of the
MIPS16 B, BEQZ, BNEZ, BTEQZ and BTNEZ instructions.

include/
* elf/mips.h (R_MIPS16_PC16_S1): New relocation.

bfd/
* elf32-mips.c (elf_mips16_howto_table_rel): Add
R_MIPS16_PC16_S1.
(mips16_reloc_map): Likewise.
* elf64-mips.c (mips16_elf64_howto_table_rel): Likewise.
(mips16_elf64_howto_table_rela): Likewise.
(mips16_reloc_map): Likewise.
* elfn32-mips.c (elf_mips16_howto_table_rel): Likewise.
(elf_mips16_howto_table_rela): Likewise.
(mips16_reloc_map): Likewise.
* elfxx-mips.c (mips16_branch_reloc_p): New function.
(mips16_reloc_p): Handle R_MIPS16_PC16_S1.
(b_reloc_p): Likewise.
(mips_elf_calculate_relocation): Likewise.
(_bfd_mips_elf_check_relocs): Likewise.
* reloc.c (BFD_RELOC_MIPS16_16_PCREL_S1): New relocation.
* bfd-in2.h: Regenerate.
* libbfd.h: Regenerate.

gas/
* config/tc-mips.c (mips16_reloc_p): Handle
BFD_RELOC_MIPS16_16_PCREL_S1.
(b_reloc_p): Likewise.
(limited_pcrel_reloc_p): Likewise.
(md_pcrel_from): Likewise.
(md_apply_fix): Likewise.
(tc_gen_reloc): Likewise.
(md_convert_frag): Likewise.
(mips_fix_adjustable): Update comment.
* testsuite/gas/mips/mips16-branch-reloc-2.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16-branch-reloc-3.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16-branch-addend-2.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16-branch-addend-3.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16-branch-absolute.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16-branch-reloc-2.l: Remove file.
* testsuite/gas/mips/mips16-branch-reloc-3.l: Remove file.
* testsuite/gas/mips/mips16-branch-addend-2.l: Remove file.
* testsuite/gas/mips/mips16-branch-addend-3.l: Remove file.
* testsuite/gas/mips/mips16-branch-absolute.l: Remove file.
* testsuite/gas/mips/mips16-branch-addend-2.s: Add padding.
* testsuite/gas/mips/branch-weak.s: Adjust alignment, avoid
implicit instruction padding, avoid MIPS16 JR->JRC conversion.
* testsuite/gas/mips/branch-weak-6.d: New test.
* testsuite/gas/mips/branch-weak-7.d: New test.
* testsuite/gas/mips/mips.exp: Run the new tests.

ld/
* testsuite/ld-mips-elf/mips16-branch-2.d: New test.
* testsuite/ld-mips-elf/mips16-branch-3.d: New test.
* testsuite/ld-mips-elf/mips16-branch-addend-2.d: New test.
* testsuite/ld-mips-elf/mips16-branch-addend-3.d: New test.
* testsuite/ld-mips-elf/mips16-branch.s: New test source.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
34 files changed:
bfd/ChangeLog
bfd/bfd-in2.h
bfd/elf32-mips.c
bfd/elf64-mips.c
bfd/elfn32-mips.c
bfd/elfxx-mips.c
bfd/libbfd.h
bfd/reloc.c
gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/gas/mips/branch-weak-6.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-weak-7.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-weak.s
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/mips16-branch-absolute.d
gas/testsuite/gas/mips/mips16-branch-absolute.l [deleted file]
gas/testsuite/gas/mips/mips16-branch-addend-2.d
gas/testsuite/gas/mips/mips16-branch-addend-2.l [deleted file]
gas/testsuite/gas/mips/mips16-branch-addend-2.s
gas/testsuite/gas/mips/mips16-branch-addend-3.d
gas/testsuite/gas/mips/mips16-branch-addend-3.l [deleted file]
gas/testsuite/gas/mips/mips16-branch-reloc-2.d
gas/testsuite/gas/mips/mips16-branch-reloc-2.l [deleted file]
gas/testsuite/gas/mips/mips16-branch-reloc-3.d
gas/testsuite/gas/mips/mips16-branch-reloc-3.l [deleted file]
include/ChangeLog
include/elf/mips.h
ld/ChangeLog
ld/testsuite/ld-mips-elf/mips-elf.exp
ld/testsuite/ld-mips-elf/mips16-branch-2.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-branch-3.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-branch-addend-2.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-branch-addend-3.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-branch.s [new file with mode: 0644]