diff options
-rw-r--r-- | lld/ELF/Thunks.cpp | 3 | ||||
-rw-r--r-- | lld/test/ELF/arm-thumb-interwork-thunk-range.s | 14 |
2 files changed, 16 insertions, 1 deletions
diff --git a/lld/ELF/Thunks.cpp b/lld/ELF/Thunks.cpp index 1ebbb17f303..50b05c777ae 100644 --- a/lld/ELF/Thunks.cpp +++ b/lld/ELF/Thunks.cpp @@ -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> diff --git a/lld/test/ELF/arm-thumb-interwork-thunk-range.s b/lld/test/ELF/arm-thumb-interwork-thunk-range.s new file mode 100644 index 00000000000..9ef64c7cb1c --- /dev/null +++ b/lld/test/ELF/arm-thumb-interwork-thunk-range.s @@ -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: |