MIPS/GAS: Relax branches to symbols resolved at link time
authorMaciej W. Rozycki <macro@imgtec.com>
Fri, 8 Apr 2016 23:20:35 +0000 (00:20 +0100)
committerMaciej W. Rozycki <macro@imgtec.com>
Wed, 13 Apr 2016 12:32:41 +0000 (13:32 +0100)
commitc1f61bd2b0644fc710dcfbb378a63f0b34be8903
tree0bbb911a341ba1d2c67dcca23f3562f77f990f2f
parentd6bb17b07976ecbced934c1ad2cfec9976dbd8ce
MIPS/GAS: Relax branches to symbols resolved at link time

Where branch relaxation is enabled emit the long sequence for branches
whose distance cannot be determined, i.e. to symbols that are undefined
or in a different segment.  These symbols are only resolved at link time
and therefore the longer sequence ensures the branch target is in range,
which cannot be guaranteed with a direct branch.

This is the opposite to the current implementation, originally proposed
here: <https://sourceware.org/ml/binutils/2002-09/msg00218.html>.  The
proposal was then extensively discussed before the final version was
posted here: <https://sourceware.org/ml/binutils/2002-10/msg00191.html>
and eventually committed:

commit 4a6a3df43dbb37853a7b88b10ae97d9ec5daf987
Author: Alexandre Oliva <aoliva@redhat.com>
Date:   Sat Oct 12 05:23:33 2002 +0000

The case considered here was not commented in the review however and the
original version remains.  With branch relaxation enabled it makes more
sense to do it consistently, so that all code impure with respect to
branch distances can be linked.  Direct branches are still produced for
the cases concerned where branch relaxation is disabled, which is the
default.

gas/
* config/tc-mips.c (relaxed_branch_length): Use the long
sequence where the distance cannot be determined.
(relaxed_micromips_32bit_branch_length): Likewise.
* testsuite/gas/mips/branch-extern-1.d: New test.
* testsuite/gas/mips/branch-extern-2.d: New test.
* testsuite/gas/mips/branch-extern-3.d: New test.
* testsuite/gas/mips/branch-extern-4.d: New test.
* testsuite/gas/mips/branch-extern.l: New stderr output.
* testsuite/gas/mips/branch-extern.s: New test source.
* testsuite/gas/mips/branch-section-1.d: New test.
* testsuite/gas/mips/branch-section-2.d: New test.
* testsuite/gas/mips/branch-section-3.d: New test.
* testsuite/gas/mips/branch-section-4.d: New test.
* testsuite/gas/mips/branch-section.l: New stderr output.
* testsuite/gas/mips/branch-section.s: New test source.
* testsuite/gas/mips/mips.exp: Run the new tests.
15 files changed:
gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/gas/mips/branch-extern-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-extern-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-extern-3.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-extern-4.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-extern.l [new file with mode: 0644]
gas/testsuite/gas/mips/branch-extern.s [new file with mode: 0644]
gas/testsuite/gas/mips/branch-section-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-section-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-section-3.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-section-4.d [new file with mode: 0644]
gas/testsuite/gas/mips/branch-section.l [new file with mode: 0644]
gas/testsuite/gas/mips/branch-section.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips.exp