| //===--- 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(); | |
| createSimpleFunction("__bolt_hugify_start_program", | |
| BC.MIB->createSymbolTrampoline(StartSym, BC.Ctx.get())); | |
| return Error::success(); | |
| } | |
| } // namespace bolt | |
| } // namespace llvm |