Sign extend a value before passing it to the Target.

This is what InputSectionBase<ELFT>::relocate does and we need to be
consistent. The other option would be to be more explicit about which
relocations are signed and which are not, and sign extend only when
appropriated. That would require extending the target interface.

llvm-svn: 280366
This commit is contained in:
Rafael Espindola 2016-09-01 13:52:52 +00:00
parent 0f298a2655
commit 3a9eef1670
2 changed files with 16 additions and 1 deletions

View File

@ -100,7 +100,8 @@ public:
// ARM Target Thunks
template <class ELFT> static uint64_t getARMThunkDestVA(const SymbolBody &S) {
return S.isInPlt() ? S.getPltVA<ELFT>() : S.getVA<ELFT>();
uint64_t V = S.isInPlt() ? S.getPltVA<ELFT>() : S.getVA<ELFT>();
return SignExtend64<32>(V);
}
template <class ELFT>

View File

@ -0,0 +1,14 @@
// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t.o
// RUN: ld.lld %t.o -o %t -image-base=0x80000000
// Test that when the thunk is at a high address we don't get confused with it
// being out of range.
.thumb
.global _start
_start:
b.w foo
.arm
.weak foo
foo: