//===--- 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 Instrs) -> BinaryFunction * { BinaryFunction *Func = BC.createInjectedBinaryFunction(Title); std::vector> 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