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