[LLD][ELF][ARM] Fix case of patched unrelocated BLX
authorPeter Smith <peter.smith@arm.com>
Fri, 25 Jun 2021 09:52:15 +0000 (10:52 +0100)
committerPeter Smith <peter.smith@arm.com>
Wed, 30 Jun 2021 13:07:35 +0000 (14:07 +0100)
commitdd4d3f74062c64d57a5881dceac028ec6c231b73
treeb6b9115ba6a7095372671e43a49edcd5471f22e5
parent002911503fe29ac30ef0aa0a15b624982814548b
[LLD][ELF][ARM] Fix case of patched unrelocated BLX

There are a couple of problems with the code to patch
unrelocated BLX instructions:
1. The calculation of the PC needs to take into account
   the alignment of the instruction. The Thumb BLX
   uses alignDown(PC, 4) for the source address.
2. The calculation of the PC bias is hard-coded to 4
   which works for Thumb, but when there is a BLX the
   branch will be in Arm state so it needs an 8 byte
   PC bias.

No asssembler generates an unrelocated BLX instruction
so these problems do not affect real world programs.
However we should still fix them.

Differential Revision: https://reviews.llvm.org/D104905
lld/ELF/ARMErrataFix.cpp
lld/test/ELF/arm-fix-cortex-a8-blx.s