Mercurial > hg > CbC > CbC_llvm
view llvm/tools/llvm-exegesis/lib/Assembler.h @ 201:a96fbbdf2d0f
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 04 Jun 2021 21:07:06 +0900 |
parents | 0572611fdcc8 |
children | 1f2b6ac9f198 |
line wrap: on
line source
//===-- Assembler.h ---------------------------------------------*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// /// /// \file /// Defines classes to assemble functions composed of a single basic block of /// MCInsts. /// //===----------------------------------------------------------------------===// #ifndef LLVM_TOOLS_LLVM_EXEGESIS_ASSEMBLER_H #define LLVM_TOOLS_LLVM_EXEGESIS_ASSEMBLER_H #include <memory> #include "BenchmarkCode.h" #include "Error.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/BitVector.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/ExecutionEngine/ExecutionEngine.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/MC/MCInst.h" #include "llvm/Object/Binary.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetMachine.h" namespace llvm { namespace exegesis { class ExegesisTarget; // Gather the set of reserved registers (depends on function's calling // convention and target machine). BitVector getFunctionReservedRegs(const TargetMachine &TM); // Helper to fill in a basic block. class BasicBlockFiller { public: BasicBlockFiller(MachineFunction &MF, MachineBasicBlock *MBB, const MCInstrInfo *MCII); void addInstruction(const MCInst &Inst, const DebugLoc &DL = DebugLoc()); void addInstructions(ArrayRef<MCInst> Insts, const DebugLoc &DL = DebugLoc()); void addReturn(const DebugLoc &DL = DebugLoc()); MachineFunction &MF; MachineBasicBlock *const MBB; const MCInstrInfo *const MCII; }; // Helper to fill in a function. class FunctionFiller { public: FunctionFiller(MachineFunction &MF, std::vector<unsigned> RegistersSetUp); // Adds a basic block to the function. BasicBlockFiller addBasicBlock(); // Returns the function entry point. BasicBlockFiller getEntry() { return Entry; } MachineFunction &MF; const MCInstrInfo *const MCII; // Returns the set of registers in the snippet setup code. ArrayRef<unsigned> getRegistersSetUp() const; private: BasicBlockFiller Entry; // The set of registers that are set up in the basic block. std::vector<unsigned> RegistersSetUp; }; // A callback that fills a function. using FillFunction = std::function<void(FunctionFiller &)>; // Creates a temporary `void foo(char*)` function containing the provided // Instructions. Runs a set of llvm Passes to provide correct prologue and // epilogue. Once the MachineFunction is ready, it is assembled for TM to // AsmStream, the temporary function is eventually discarded. Error assembleToStream(const ExegesisTarget &ET, std::unique_ptr<LLVMTargetMachine> TM, ArrayRef<unsigned> LiveIns, ArrayRef<RegisterValue> RegisterInitialValues, const FillFunction &Fill, raw_pwrite_stream &AsmStream); // Creates an ObjectFile in the format understood by the host. // Note: the resulting object keeps a copy of Buffer so it can be discarded once // this function returns. object::OwningBinary<object::ObjectFile> getObjectFromBuffer(StringRef Buffer); // Loads the content of Filename as on ObjectFile and returns it. object::OwningBinary<object::ObjectFile> getObjectFromFile(StringRef Filename); // Consumes an ObjectFile containing a `void foo(char*)` function and make it // executable. struct ExecutableFunction { explicit ExecutableFunction( std::unique_ptr<LLVMTargetMachine> TM, object::OwningBinary<object::ObjectFile> &&ObjectFileHolder); // Retrieves the function as an array of bytes. StringRef getFunctionBytes() const { return FunctionBytes; } // Executes the function. void operator()(char *Memory) const { ((void (*)(char *))(intptr_t)FunctionBytes.data())(Memory); } std::unique_ptr<LLVMContext> Context; std::unique_ptr<ExecutionEngine> ExecEngine; StringRef FunctionBytes; }; // Creates a void(int8*) MachineFunction. MachineFunction &createVoidVoidPtrMachineFunction(StringRef FunctionID, Module *Module, MachineModuleInfo *MMI); } // namespace exegesis } // namespace llvm #endif // LLVM_TOOLS_LLVM_EXEGESIS_ASSEMBLER_H