1 //===-- Assembler.h ---------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// 10 /// \file 11 /// Defines classes to assemble functions composed of a single basic block of 12 /// MCInsts. 13 /// 14 //===----------------------------------------------------------------------===// 15 16 #ifndef LLVM_TOOLS_LLVM_EXEGESIS_ASSEMBLER_H 17 #define LLVM_TOOLS_LLVM_EXEGESIS_ASSEMBLER_H 18 19 #include <memory> 20 21 #include "BenchmarkCode.h" 22 #include "llvm/ADT/ArrayRef.h" 23 #include "llvm/ADT/BitVector.h" 24 #include "llvm/CodeGen/MachineFunction.h" 25 #include "llvm/CodeGen/MachineModuleInfo.h" 26 #include "llvm/ExecutionEngine/ExecutionEngine.h" 27 #include "llvm/IR/LLVMContext.h" 28 #include "llvm/IR/Module.h" 29 #include "llvm/MC/MCInst.h" 30 #include "llvm/Object/Binary.h" 31 #include "llvm/Object/ObjectFile.h" 32 #include "llvm/Support/raw_ostream.h" 33 #include "llvm/Target/TargetMachine.h" 34 35 namespace llvm { 36 namespace exegesis { 37 38 class ExegesisTarget; 39 40 // Gather the set of reserved registers (depends on function's calling 41 // convention and target machine). 42 llvm::BitVector getFunctionReservedRegs(const llvm::TargetMachine &TM); 43 44 // Creates a temporary `void foo(char*)` function containing the provided 45 // Instructions. Runs a set of llvm Passes to provide correct prologue and 46 // epilogue. Once the MachineFunction is ready, it is assembled for TM to 47 // AsmStream, the temporary function is eventually discarded. 48 void assembleToStream(const ExegesisTarget &ET, 49 std::unique_ptr<llvm::LLVMTargetMachine> TM, 50 llvm::ArrayRef<unsigned> LiveIns, 51 llvm::ArrayRef<RegisterValue> RegisterInitialValues, 52 llvm::ArrayRef<llvm::MCInst> Instructions, 53 llvm::raw_pwrite_stream &AsmStream); 54 55 // Creates an ObjectFile in the format understood by the host. 56 // Note: the resulting object keeps a copy of Buffer so it can be discarded once 57 // this function returns. 58 llvm::object::OwningBinary<llvm::object::ObjectFile> 59 getObjectFromBuffer(llvm::StringRef Buffer); 60 61 // Loads the content of Filename as on ObjectFile and returns it. 62 llvm::object::OwningBinary<llvm::object::ObjectFile> 63 getObjectFromFile(llvm::StringRef Filename); 64 65 // Consumes an ObjectFile containing a `void foo(char*)` function and make it 66 // executable. 67 struct ExecutableFunction { 68 explicit ExecutableFunction( 69 std::unique_ptr<llvm::LLVMTargetMachine> TM, 70 llvm::object::OwningBinary<llvm::object::ObjectFile> &&ObjectFileHolder); 71 72 // Retrieves the function as an array of bytes. getFunctionBytesExecutableFunction73 llvm::StringRef getFunctionBytes() const { return FunctionBytes; } 74 75 // Executes the function. operatorExecutableFunction76 void operator()(char *Memory) const { 77 ((void (*)(char *))(intptr_t)FunctionBytes.data())(Memory); 78 } 79 80 std::unique_ptr<llvm::LLVMContext> Context; 81 std::unique_ptr<llvm::ExecutionEngine> ExecEngine; 82 llvm::StringRef FunctionBytes; 83 }; 84 85 } // namespace exegesis 86 } // namespace llvm 87 88 #endif // LLVM_TOOLS_LLVM_EXEGESIS_ASSEMBLER_H 89