Arm: Fix out of range conditional branch (PR/24991)
authorTamar Christina <tamar.christina@arm.com>
Tue, 24 Sep 2019 13:46:17 +0000 (14:46 +0100)
committerTamar Christina <tamar.christina@arm.com>
Tue, 24 Sep 2019 14:00:41 +0000 (15:00 +0100)
commite8f8842d90abe5eafa8c32f08fbc3a747a45747c
tree880995ce4582f8054790b4b962f9b7a0b705bda6
parent352f6bc3e5b23e76d8e6f56fb7db4e57d8f5d5bd
Arm: Fix out of range conditional branch (PR/24991)

The fix for PR12848 introduced an off by one error in the mask, this corrected
the negative overflows but not the positive overflows.  As a result the
conditional branch instructions accepted a too wide positive immediate which
resulted in it corrupting the instruction during encoding.

The relocation I believe has been incorrectly named, to be consistent with the
other relocations it should have been named BRANCH21 which is why the masks for
it are confusing.

I've replaced the masks with a function out_of_range_p which should make it
harder to make such mistakes.

The mask for BL/BLX on Armv6t+ is also wrong, the extended range is 25-bits
and so the mask should be checking for 24-bits for positive overflow.

gas/ChangeLog:

PR gas/24991
* config/tc-arm.c (out_of_range_p): New.
(md_apply_fix): Use it in BFD_RELOC_THUMB_PCREL_BRANCH9,
BFD_RELOC_THUMB_PCREL_BRANCH12, BFD_RELOC_THUMB_PCREL_BRANCH20,
BFD_RELOC_THUMB_PCREL_BRANCH23, BFD_RELOC_THUMB_PCREL_BRANCH25
* testsuite/gas/arm/pr24991.d: New test.
* testsuite/gas/arm/pr24991.l: New test.
* testsuite/gas/arm/pr24991.s: New test.
gas/ChangeLog
gas/config/tc-arm.c
gas/testsuite/gas/arm/pr24991.d [new file with mode: 0644]
gas/testsuite/gas/arm/pr24991.l [new file with mode: 0644]
gas/testsuite/gas/arm/pr24991.s [new file with mode: 0644]