llvm-project/lld/test
Peter Smith e35929e026 [LLD][ELF][ARM] Refactor inBranchRange to use addend for PC Bias
In AArch32 ARM, the PC reads two instructions ahead of the currently
executiing instruction. This evaluates to 8 in ARM state and 4 in
Thumb state. Branch instructions on AArch32 compensate for this by
subtracting the PC bias from the addend. For a branch to symbol this
will result in an addend of -8 in ARM state and -4 in Thumb state.

The existing ARM Target::inBranchRange function accounted for this
implict addend within the function meaning that if the addend were
to be taken into account by the caller then it would be double
counted. This complicates the interface for all Targets as callers
wanting to account for addends had to account for the ARM PC-bias.

In certain situations such as:
https://github.com/ClangBuiltLinux/linux/issues/1305
the PC-bias compensation code didn't match up. In particular
normalizeExistingThunk() didn't put the PC-bias back in as Arm
thunks did not store the addend.

The simplest fix for the problem is to add the PC bias in
normalizeExistingThunk when restoring the addend. However I think
it is worth refactoring the Arm inBranchRange implementation so
that fewer calls to getPCBias are needed for other Targets. I
wasn't able to remove getPCBias completely but hopefully the
Relocations.cpp code is simpler now.

In principle a test could be written to replicate the linux kernel
build failure but I wasn't able to reproduce with a small example
that I could build up from scratch.

Fixes https://github.com/ClangBuiltLinux/linux/issues/1305

Differential Revision: https://reviews.llvm.org/D97550
2021-03-02 11:02:33 +00:00
..
COFF [LLD] [COFF] Allow invoking lib.exe mode via -lib in addition to /lib 2021-02-24 11:16:12 +02:00
ELF [LLD][ELF][ARM] Refactor inBranchRange to use addend for PC Bias 2021-03-02 11:02:33 +00:00
MachO [lld/mac] Implement the missing bits of -undefined 2021-03-01 15:30:53 -05:00
MinGW [LLD] [MinGW] Pass the --demangle and --no-demangle options to the COFF linker 2021-01-07 10:02:19 +02:00
Unit Support multi-configuration generators correctly in several config files 2021-02-11 09:32:20 -08:00
darwin [lld-macho] Switch default to new Darwin backend 2021-03-01 12:30:10 -05:00
mach-o [lld-macho] Switch default to new Darwin backend 2021-03-01 12:30:10 -05:00
wasm [lld][WebAssembly] Convert lld/test/wasm/data-layout.ll to asm. NFC. 2021-03-01 16:14:36 -08:00
CMakeLists.txt Support multi-configuration generators correctly in several config files 2021-02-11 09:32:20 -08:00
lit.cfg.py [lld][WebAssembly] Add suppport for PIC + passive data initialization 2020-12-04 17:28:23 -08:00
lit.site.cfg.py.in Support multi-configuration generators correctly in several config files 2021-02-11 09:32:20 -08:00