diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 9539a81f6ac3d..d2e26d86f51fa 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -1652,6 +1652,9 @@ void ARMTargetInfo::writePlt(uint8_t *Buf, uint64_t GotEntryAddr, RelExpr ARMTargetInfo::getThunkExpr(RelExpr Expr, uint32_t RelocType, const InputFile &File, const SymbolBody &S) const { + // If S is an undefined weak symbol we don't need a Thunk + if (S.isUndefined()) + return Expr; // A state change from ARM to Thumb and vice versa must go through an // interworking thunk if the relocation type is not R_ARM_CALL or // R_ARM_THM_CALL. diff --git a/lld/test/ELF/arm-thumb-no-undefined-thunk.s b/lld/test/ELF/arm-thumb-no-undefined-thunk.s new file mode 100644 index 0000000000000..80cf50d5e2c9e --- /dev/null +++ b/lld/test/ELF/arm-thumb-no-undefined-thunk.s @@ -0,0 +1,23 @@ +// RUN: llvm-mc -filetype=obj -triple=thumbv7a-none-linux-gnueabi %s -o %t +// RUN: ld.lld %t -o %t2 2>&1 +// RUN: llvm-objdump -triple=thumbv7a-none-linux-gnueabi -d %t2 | FileCheck %s +// REQUIRES: arm + +// Check that no thunks are created for an undefined weak symbol + .syntax unified + +.weak target + +.section .text.thumb, "ax", %progbits + .thumb + .global +_start: + bl target + b target + b.w target + +// CHECK: Disassembly of section .text: +// CHECK-NEXT: _start: +// CHECK-NEXT: 11000: ee f7 fe ef blx #-69636 +// CHECK-NEXT: 11004: ee f7 fc bf b.w #-69640 +// CHECK-NEXT: 11008: ee f7 fa bf b.w #-69644