| //===-- RuntimeDyldImpl.h - Run-time dynamic linker for MC-JIT --*- C++ -*-===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // Interface for the implementations of runtime dynamic linker facilities. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef LLVM_RUNTIME_DYLD_IMPL_H | 
 | #define LLVM_RUNTIME_DYLD_IMPL_H | 
 |  | 
 | #include "llvm/ExecutionEngine/RuntimeDyld.h" | 
 | #include "llvm/ADT/DenseMap.h" | 
 | #include "llvm/ADT/StringMap.h" | 
 | #include "llvm/ADT/Twine.h" | 
 | #include "llvm/ADT/SmallVector.h" | 
 | #include "llvm/ExecutionEngine/ExecutionEngine.h" | 
 | #include "llvm/Support/Memory.h" | 
 | #include "llvm/Support/MemoryBuffer.h" | 
 | #include "llvm/Support/system_error.h" | 
 | #include "llvm/Support/raw_ostream.h" | 
 | #include "llvm/Support/Debug.h" | 
 | #include "llvm/Support/ErrorHandling.h" | 
 |  | 
 | using namespace llvm; | 
 |  | 
 | namespace llvm { | 
 | class RuntimeDyldImpl { | 
 | protected: | 
 |   unsigned CPUType; | 
 |   unsigned CPUSubtype; | 
 |  | 
 |   // The MemoryManager to load objects into. | 
 |   RTDyldMemoryManager *MemMgr; | 
 |  | 
 |   // For each section, we have a MemoryBlock of it's data. | 
 |   // Indexed by SectionID. | 
 |   SmallVector<sys::MemoryBlock, 32> Sections; | 
 |   // For each section, the address it will be considered to live at for | 
 |   // relocations. The same as the pointer to the above memory block for hosted | 
 |   // JITs. Indexed by SectionID. | 
 |   SmallVector<uint64_t, 32> SectionLoadAddress; | 
 |  | 
 |   // Keep a map of starting local address to the SectionID which references it. | 
 |   // Lookup function for when we assign virtual addresses. | 
 |   DenseMap<void *, unsigned> SectionLocalMemToID; | 
 |  | 
 |   // Master symbol table. As modules are loaded and external symbols are | 
 |   // resolved, their addresses are stored here as a SectionID/Offset pair. | 
 |   typedef std::pair<unsigned, uint64_t> SymbolLoc; | 
 |   StringMap<SymbolLoc> SymbolTable; | 
 |  | 
 |   bool HasError; | 
 |   std::string ErrorStr; | 
 |  | 
 |   // Set the error state and record an error string. | 
 |   bool Error(const Twine &Msg) { | 
 |     ErrorStr = Msg.str(); | 
 |     HasError = true; | 
 |     return true; | 
 |   } | 
 |  | 
 |   uint8_t *getSectionAddress(unsigned SectionID) { | 
 |     return (uint8_t*)Sections[SectionID].base(); | 
 |   } | 
 |   void extractFunction(StringRef Name, uint8_t *StartAddress, | 
 |                        uint8_t *EndAddress); | 
 |  | 
 | public: | 
 |   RuntimeDyldImpl(RTDyldMemoryManager *mm) : MemMgr(mm), HasError(false) {} | 
 |  | 
 |   virtual ~RuntimeDyldImpl(); | 
 |  | 
 |   virtual bool loadObject(MemoryBuffer *InputBuffer) = 0; | 
 |  | 
 |   void *getSymbolAddress(StringRef Name) { | 
 |     // FIXME: Just look up as a function for now. Overly simple of course. | 
 |     // Work in progress. | 
 |     if (SymbolTable.find(Name) == SymbolTable.end()) | 
 |       return 0; | 
 |     SymbolLoc Loc = SymbolTable.lookup(Name); | 
 |     return getSectionAddress(Loc.first) + Loc.second; | 
 |   } | 
 |  | 
 |   virtual void resolveRelocations(); | 
 |  | 
 |   virtual void reassignSectionAddress(unsigned SectionID, uint64_t Addr) = 0; | 
 |  | 
 |   void mapSectionAddress(void *LocalAddress, uint64_t TargetAddress); | 
 |  | 
 |   // Is the linker in an error state? | 
 |   bool hasError() { return HasError; } | 
 |  | 
 |   // Mark the error condition as handled and continue. | 
 |   void clearError() { HasError = false; } | 
 |  | 
 |   // Get the error message. | 
 |   StringRef getErrorString() { return ErrorStr; } | 
 |  | 
 |   virtual bool isCompatibleFormat(const MemoryBuffer *InputBuffer) const = 0; | 
 | }; | 
 |  | 
 | } // end namespace llvm | 
 |  | 
 |  | 
 | #endif |