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.
54 lines
1.8 KiB
C++
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
|