[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:
parent
747620db2a
commit
51e222ef48
@ -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.
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user