[BOLT] Get symbol for const island referenced across func by relocation (#178988)

When handling relocation in one function referencing code or
data defined in another function, we should check if relocation
target is constant island or not, and get the referenced symbol
accordingly for both cases.
This commit is contained in:
YongKang Zhu 2026-02-02 16:05:40 -08:00 committed by GitHub
parent 4c635107de
commit fc89b1c2d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 24 additions and 3 deletions

View File

@ -3136,10 +3136,11 @@ void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
ReferencedSymbol = nullptr;
ExtractedValue = Address;
} else if (RefFunctionOffset) {
if (ContainingBF && ContainingBF != ReferencedBF &&
!ReferencedBF->isInConstantIsland(Address)) {
if (ContainingBF && ContainingBF != ReferencedBF) {
ReferencedSymbol =
ReferencedBF->addEntryPointAtOffset(RefFunctionOffset);
ReferencedBF->isInConstantIsland(Address)
? ReferencedBF->getOrCreateIslandAccess(Address)
: ReferencedBF->addEntryPointAtOffset(RefFunctionOffset);
} else {
ReferencedSymbol = ReferencedBF->getOrCreateLocalLabel(Address);

View File

@ -0,0 +1,20 @@
// Test BOLT won't ignore function having reference to constant island
// that is defined in another function.
// RUN: %clang %cxxflags -fuse-ld=lld %s -o %t.so -Wl,-q -no-pie
// RUN: llvm-bolt %t.so -o %t.bolt.so --strict
.text
.type foo,@function
foo:
adrp x9, :got:_global_func_ptr
ldr x9, [x9, #:got_lo12:_global_func_ptr]
blr x9
.size foo, .-foo
.type bar,@function
bar:
nop
_global_func_ptr:
.quad 0
.size bar, .-bar