Gergely Bálint f7c5316468
[BOLT][BTI] Refactor: move applyBTIFixup under MCPlusBuilder (#177164)
This patch moves the applyBTIFixup from LongJmp pass to MCPlusBuilder.
This refactor allows applyBTIFixup to be called from other passes
inserting indirect branches, such as:
- Hugify,
- PatchEntries.

As different passes have different information about their targets (e.g.
target BasicBlock, target Symbol, target Function), specialized versions
are created (applyBTIFixupToSymbol, applyBTIFixupToTarget), and each
calls
applyBTIFixupCommon, which implements the original logic from before.

Names of related lit tests are updated to have the "bti" prefix.
2026-02-12 08:29:16 +01:00

54 lines
1.8 KiB
C++

//===--- bolt/Passes/Hugify.cpp -------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "bolt/Passes/Hugify.h"
#define DEBUG_TYPE "bolt-hugify"
using namespace llvm;
namespace llvm {
namespace bolt {
Error HugePage::runOnFunctions(BinaryContext &BC) {
auto *RtLibrary = BC.getRuntimeLibrary();
if (!RtLibrary || !BC.isELF() || !BC.StartFunctionAddress) {
return Error::success();
}
auto createSimpleFunction =
[&](std::string Title, std::vector<MCInst> Instrs) -> BinaryFunction * {
BinaryFunction *Func = BC.createInjectedBinaryFunction(Title);
std::vector<std::unique_ptr<BinaryBasicBlock>> BBs;
BBs.emplace_back(Func->createBasicBlock(nullptr));
BBs.back()->addInstructions(Instrs.begin(), Instrs.end());
BBs.back()->setCFIState(0);
BBs.back()->setOffset(BinaryBasicBlock::INVALID_OFFSET);
Func->insertBasicBlocks(nullptr, std::move(BBs),
/*UpdateLayout=*/true,
/*UpdateCFIState=*/false);
Func->updateState(BinaryFunction::State::CFG_Finalized);
return Func;
};
const BinaryFunction *const Start =
BC.getBinaryFunctionAtAddress(*BC.StartFunctionAddress);
assert(Start && "Entry point function not found");
const MCSymbol *StartSym = Start->getSymbol();
InstructionListType Insts =
BC.MIB->createSymbolTrampoline(StartSym, BC.Ctx.get());
createSimpleFunction("__bolt_hugify_start_program", Insts);
if (BC.usesBTI())
BC.MIB->applyBTIFixupToSymbol(BC, StartSym, *(Insts.end() - 1));
return Error::success();
}
} // namespace bolt
} // namespace llvm