diff --git a/lld/ELF/Relocations.h b/lld/ELF/Relocations.h --- a/lld/ELF/Relocations.h +++ b/lld/ELF/Relocations.h @@ -135,7 +135,8 @@ void createInitialThunkSections(ArrayRef OutputSections); - std::pair getThunk(Symbol &Sym, RelType Type, uint64_t Src); + std::pair getThunk(InputSection *IS, Symbol &Sym, RelType Type, + uint64_t Src); ThunkSection *addThunkSection(OutputSection *OS, InputSectionDescription *, uint64_t Off); diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -1604,12 +1604,13 @@ InputSectionDescription *ISD, uint64_t Off) { auto *TS = make(OS, Off); + TS->Partition = OS->Partition; ISD->ThunkSections.push_back({TS, Pass}); return TS; } -std::pair ThunkCreator::getThunk(Symbol &Sym, RelType Type, - uint64_t Src) { +std::pair ThunkCreator::getThunk(InputSection *IS, Symbol &Sym, + RelType Type, uint64_t Src) { std::vector *ThunkVec = nullptr; // We use (section, offset) pair to find the thunk position if possible so @@ -1622,7 +1623,8 @@ // Check existing Thunks for Sym to see if they can be reused for (Thunk *T : *ThunkVec) - if (T->isCompatibleWith(Type) && + if (T->getThunkTargetSym()->Section->Partition == IS->Partition && + T->isCompatibleWith(Type) && Target->inBranchRange(Type, Src, T->getThunkTargetSym()->getVA())) return std::make_pair(T, false); @@ -1706,7 +1708,7 @@ Thunk *T; bool IsNew; - std::tie(T, IsNew) = getThunk(*Rel.Sym, Rel.Type, Src); + std::tie(T, IsNew) = getThunk(IS, *Rel.Sym, Rel.Type, Src); if (IsNew) { // Find or create a ThunkSection for the new Thunk diff --git a/lld/test/ELF/partition-thunk-reuse.s b/lld/test/ELF/partition-thunk-reuse.s new file mode 100644 --- /dev/null +++ b/lld/test/ELF/partition-thunk-reuse.s @@ -0,0 +1,33 @@ +// REQUIRES: arm +// RUN: llvm-mc %s -o %t.o -filetype=obj --triple=armv7-unknown-linux -arm-add-build-attributes +// RUN: ld.lld %t.o -o %t --export-dynamic --gc-sections +// RUN: llvm-nm %t | FileCheck %s + +// CHECK: __Thumbv7ABSLongThunk__start +// CHECK: __Thumbv7ABSLongThunk__start + +.thumb + +.section .llvm_sympart.g1,"",%llvm_sympart +.asciz "part1" +.4byte f1 + +.section .llvm_sympart.g2,"",%llvm_sympart +.asciz "part2" +.4byte f2 + +.section .text._start,"ax",%progbits +.globl _start +_start: +bx lr +.zero 17*1048576 + +.section .text.f1,"aw",%progbits +.globl f1 +f1: +b _start + +.section .text.f2,"ax",%progbits +.globl f2 +f2: +b _start