[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:
parent
4c635107de
commit
fc89b1c2d8
@ -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);
|
||||
|
||||
|
||||
20
bolt/test/AArch64/constant-island-reference.s
Normal file
20
bolt/test/AArch64/constant-island-reference.s
Normal 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
|
||||
Loading…
x
Reference in New Issue
Block a user