| //===--- 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 |