[BOLT][AArch64] Fix crash for conditional tail calls (#140669)

When conditional tail call is located in old code while BOLT is
operating in lite mode, the call will require optional pending
relocation with a type that is currently not supported resulting in a
build-time crash.

Before a proper fix is implemented, ignore conditional tail calls for
relocation purposes and mark their target functions to be patched, i.e.
to be served as veneers/thunks.
This commit is contained in:
Maksim Panchenko 2025-05-20 10:38:00 -07:00 committed by GitHub
parent 747620db2a
commit 51e222ef48
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 25 additions and 4 deletions

View File

@ -1783,10 +1783,22 @@ bool BinaryFunction::scanExternalRefs() {
// On AArch64, we use instruction patches for fixing references. We make an
// exception for branch instructions since they require optional
// relocations.
if (BC.isAArch64() && !BranchTargetSymbol) {
LLVM_DEBUG(BC.printInstruction(dbgs(), Instruction, AbsoluteInstrAddr));
InstructionPatches.push_back({AbsoluteInstrAddr, Instruction});
continue;
if (BC.isAArch64()) {
if (!BranchTargetSymbol) {
LLVM_DEBUG(BC.printInstruction(dbgs(), Instruction, AbsoluteInstrAddr));
InstructionPatches.push_back({AbsoluteInstrAddr, Instruction});
continue;
}
// Conditional tail calls require new relocation types that are currently
// not supported. https://github.com/llvm/llvm-project/issues/138264
if (BC.MIB->isConditionalBranch(Instruction)) {
if (BinaryFunction *TargetBF =
BC.getFunctionForSymbol(BranchTargetSymbol)) {
TargetBF->setNeedsPatch(true);
continue;
}
}
}
// Emit the instruction using temp emitter and generate relocations.

View File

@ -129,6 +129,15 @@ cold_function:
# CHECK-INPUT-NEXT: b {{.*}} <_start>
# CHECK-NEXT: b {{.*}} <_start.org.0>
## Quick test for conditional tail calls. A proper test is being added in:
## https://github.com/llvm/llvm-project/pull/139565
## For now check that llvm-bolt doesn't choke on CTCs.
.ifndef COMPACT
b.eq _start
cbz x0, _start
tbz x0, 42, _start
.endif
.cfi_endproc
.size cold_function, .-cold_function