1 //===----------- JITSymbol.h - JIT symbol abstraction -----------*- 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 // Abstraction for target process addresses. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_EXECUTIONENGINE_ORC_JITSYMBOL_H 15 #define LLVM_EXECUTIONENGINE_ORC_JITSYMBOL_H 16 17 #include "llvm/ExecutionEngine/JITSymbolFlags.h" 18 #include "llvm/ExecutionEngine/RuntimeDyld.h" 19 #include "llvm/Support/DataTypes.h" 20 #include <cassert> 21 #include <functional> 22 23 namespace llvm { 24 namespace orc { 25 26 /// @brief Represents an address in the target process's address space. 27 typedef uint64_t TargetAddress; 28 29 /// @brief Represents a symbol in the JIT. 30 class JITSymbol : public JITSymbolBase { 31 public: 32 33 typedef std::function<TargetAddress()> GetAddressFtor; 34 35 /// @brief Create a 'null' symbol that represents failure to find a symbol 36 /// definition. JITSymbol(std::nullptr_t)37 JITSymbol(std::nullptr_t) 38 : JITSymbolBase(JITSymbolFlags::None), CachedAddr(0) {} 39 40 /// @brief Create a symbol for a definition with a known address. JITSymbol(TargetAddress Addr,JITSymbolFlags Flags)41 JITSymbol(TargetAddress Addr, JITSymbolFlags Flags) 42 : JITSymbolBase(Flags), CachedAddr(Addr) {} 43 44 /// @brief Create a symbol for a definition that doesn't have a known address 45 /// yet. 46 /// @param GetAddress A functor to materialize a definition (fixing the 47 /// address) on demand. 48 /// 49 /// This constructor allows a JIT layer to provide a reference to a symbol 50 /// definition without actually materializing the definition up front. The 51 /// user can materialize the definition at any time by calling the getAddress 52 /// method. JITSymbol(GetAddressFtor GetAddress,JITSymbolFlags Flags)53 JITSymbol(GetAddressFtor GetAddress, JITSymbolFlags Flags) 54 : JITSymbolBase(Flags), GetAddress(std::move(GetAddress)), CachedAddr(0) {} 55 56 /// @brief Create a JITSymbol from a RuntimeDyld::SymbolInfo. JITSymbol(const RuntimeDyld::SymbolInfo & Sym)57 JITSymbol(const RuntimeDyld::SymbolInfo &Sym) 58 : JITSymbolBase(Sym.getFlags()), CachedAddr(Sym.getAddress()) {} 59 60 /// @brief Returns true if the symbol exists, false otherwise. 61 explicit operator bool() const { return CachedAddr || GetAddress; } 62 63 /// @brief Get the address of the symbol in the target address space. Returns 64 /// '0' if the symbol does not exist. getAddress()65 TargetAddress getAddress() { 66 if (GetAddress) { 67 CachedAddr = GetAddress(); 68 assert(CachedAddr && "Symbol could not be materialized."); 69 GetAddress = nullptr; 70 } 71 return CachedAddr; 72 } 73 74 /// @brief Convert this JITSymbol to a RuntimeDyld::SymbolInfo. toRuntimeDyldSymbol()75 RuntimeDyld::SymbolInfo toRuntimeDyldSymbol() { 76 return RuntimeDyld::SymbolInfo(getAddress(), getFlags()); 77 } 78 79 private: 80 GetAddressFtor GetAddress; 81 TargetAddress CachedAddr; 82 }; 83 84 } // End namespace orc. 85 } // End namespace llvm. 86 87 #endif // LLVM_EXECUTIONENGINE_ORC_JITSYMBOL_H 88