]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
MIPS: Add options to control branch ISA checks
authorMaciej W. Rozycki <macro@imgtec.com>
Mon, 30 Jan 2017 17:11:22 +0000 (17:11 +0000)
committerMaciej W. Rozycki <macro@imgtec.com>
Mon, 30 Jan 2017 17:23:06 +0000 (17:23 +0000)
commite1df6767a7711b8714876d1c36c1f532c04af4cb
tree553a733023ef02ddeb537866c2b28e2b59de6d9a
parent47003d3a4069d6a0ecc769cbb2ab1e6fd12b73bf
MIPS: Add options to control branch ISA checks

Complement commit 9d862524f6ae ("MIPS: Verify the ISA mode and alignment
of branch and jump targets") and add GAS and LD options to control the
checks for invalid branches between ISA modes introduced there, to help
with some handwritten code lacking `.insn' annotation for labels used as
branch targets and code produced by older versions of GCC which suffers
from the issue with branches to code that has been optimized away,
addressed with GCC commit 242424 ("MIPS/GCC: Mark trailing labels with
`.insn'"), <https://gcc.gnu.org/ml/gcc-patches/2016-11/msg01061.html>.

bfd/
* elfxx-mips.h (_bfd_mips_elf_insn32): Rename prototype to...
(_bfd_mips_elf_linker_flags): ... this.  Add another parameter.
* elfxx-mips.c (mips_elf_link_hash_table): Add
`ignore_branch_isa' member.
(mips_elf_perform_relocation): Do not treat an ISA mode mismatch
in branch relocation calculation as an error if
`ignore_branch_isa' has been set.
(_bfd_mips_elf_insn32): Rename to...
(_bfd_mips_elf_linker_flags): ... this.  Rename the `on'
parameter to `insn32' and add an `ignore_branch_isa' parameter.
Handle the new parameter.

gas/
* config/tc-mips.c (mips_ignore_branch_isa): New variable.
(options): Add OPTION_IGNORE_BRANCH_ISA and
OPTION_NO_IGNORE_BRANCH_ISA enum values.
(md_longopts): Add "mignore-branch-isa" and
"mno-ignore-branch-isa" options.
(md_parse_option): Handle OPTION_IGNORE_BRANCH_ISA and
OPTION_NO_IGNORE_BRANCH_ISA.
(fix_bad_cross_mode_branch_p): Return FALSE if
`mips_ignore_branch_isa' has been set.
(md_show_usage): Add `-mignore-branch-isa' and
`-mno-ignore-branch-isa'.

* doc/as.texinfo (Target MIPS options): Add
`-mignore-branch-isa' and `-mno-ignore-branch-isa' options.
(-mignore-branch-isa, -mno-ignore-branch-isa): New options.
* doc/c-mips.texi (MIPS Options): Add `-mignore-branch-isa' and
`-mno-ignore-branch-isa' options.

* testsuite/gas/mips/branch-local-ignore-2.d: New test.
* testsuite/gas/mips/branch-local-ignore-3.d: New test.
* testsuite/gas/mips/branch-local-ignore-n32-2.d: New test.
* testsuite/gas/mips/branch-local-ignore-n32-3.d: New test.
* testsuite/gas/mips/branch-local-ignore-n64-2.d: New test.
* testsuite/gas/mips/branch-local-ignore-n64-3.d: New test.
* testsuite/gas/mips/mips.exp: Run the new tests.

ld/
* emultempl/mipself.em (ignore_branch_isa): New variable.
(mips_create_output_section_statements): Rename
`_bfd_mips_elf_insn32' called to `_bfd_mips_elf_linker_flags',
add `ignore_branch_isa' argument.
(PARSE_AND_LIST_PROLOGUE): Add OPTION_IGNORE_BRANCH_ISA and
OPTION_NO_IGNORE_BRANCH_ISA enum values.
(PARSE_AND_LIST_LONGOPTS): Add "ignore-branch-isa" and
"no-ignore-branch-isa" options.
(PARSE_AND_LIST_OPTIONS): Add `--ignore-branch-isa' and
`--no-ignore-branch-isa'.
(PARSE_AND_LIST_ARGS_CASES): Handle OPTION_IGNORE_BRANCH_ISA and
OPTION_NO_IGNORE_BRANCH_ISA.

* ld.texinfo (Options specific to MIPS targets): Add
`--ignore-branch-isa' and `--no-ignore-branch-isa' options.
(ld and the MIPS family): Likewise.

* testsuite/ld-mips-elf/bal-jalx-pic-ignore.d: New test.
* testsuite/ld-mips-elf/bal-jalx-pic-ignore-n32.d: New test.
* testsuite/ld-mips-elf/bal-jalx-pic-ignore-n64.d: New test.
* testsuite/ld-mips-elf/unaligned-branch-ignore-2.d: New test.
* testsuite/ld-mips-elf/unaligned-branch-ignore-r6-1: New test.
* testsuite/ld-mips-elf/unaligned-branch-ignore-mips16: New
test.
* testsuite/ld-mips-elf/unaligned-branch-ignore-micromips: New
test.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.

(cherry picked from commit 8b10b0b3e100c25322a083248c7a18bf5a1f3527)
25 files changed:
bfd/ChangeLog
bfd/elfxx-mips.c
bfd/elfxx-mips.h
gas/ChangeLog
gas/config/tc-mips.c
gas/doc/as.texinfo
gas/doc/c-mips.texi
gas/testsuite/gas/mips/branch-local-ignore-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-local-ignore-3.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-local-ignore-n32-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-local-ignore-n32-3.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-local-ignore-n64-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-local-ignore-n64-3.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips.exp
ld/ChangeLog
ld/emultempl/mipself.em
ld/ld.texinfo
ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-n32.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore-n64.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/bal-jalx-pic-ignore.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips-elf.exp
ld/testsuite/ld-mips-elf/unaligned-branch-ignore-2.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/unaligned-branch-ignore-micromips.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/unaligned-branch-ignore-mips16.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/unaligned-branch-ignore-r6-1.d [new file with mode: 0644]