Index: lld/trunk/ELF/Target.cpp =================================================================== --- lld/trunk/ELF/Target.cpp +++ lld/trunk/ELF/Target.cpp @@ -1652,6 +1652,9 @@ 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. Index: lld/trunk/test/ELF/arm-thumb-no-undefined-thunk.s =================================================================== --- lld/trunk/test/ELF/arm-thumb-no-undefined-thunk.s +++ lld/trunk/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