diff options
author | Jim Grosbach <grosbach@apple.com> | 2012-01-16 23:50:55 +0000 |
---|---|---|
committer | Jim Grosbach <grosbach@apple.com> | 2012-01-16 23:50:55 +0000 |
commit | 020f4e861a9a32059f76377e787703c92ba55a98 (patch) | |
tree | 73b5d18c7b6491d94a4117ffe0aa3d98c44e6d1d /lib | |
parent | 652ca2fe0c8bd406222d064937adc28b281d7b89 (diff) | |
download | external_llvm-020f4e861a9a32059f76377e787703c92ba55a98.zip external_llvm-020f4e861a9a32059f76377e787703c92ba55a98.tar.gz external_llvm-020f4e861a9a32059f76377e787703c92ba55a98.tar.bz2 |
ExecutionEngine interface to re-map addresses for engines that support it.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148264 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ExecutionEngine/MCJIT/MCJIT.h | 8 | ||||
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | 13 | ||||
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h | 9 | ||||
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp | 2 |
4 files changed, 31 insertions, 1 deletions
diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.h b/lib/ExecutionEngine/MCJIT/MCJIT.h index 51e63d9..7f4ae77 100644 --- a/lib/ExecutionEngine/MCJIT/MCJIT.h +++ b/lib/ExecutionEngine/MCJIT/MCJIT.h @@ -67,6 +67,14 @@ public: /// virtual void *getPointerToNamedFunction(const std::string &Name, bool AbortOnFailure = true); + /// mapSectionAddress - map a section to its target address space value. + /// Map the address of a JIT section as returned from the memory manager + /// to the address in the target process as the running code will see it. + /// This is the address which will be used for relocation resolution. + virtual void mapSectionAddress(void *LocalAddress, uint64_t TargetAddress) { + Dyld.mapSectionAddress(LocalAddress, TargetAddress); + } + /// @} /// @name (Private) Registration Interfaces /// @{ diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index 1882797..99524a3 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -54,6 +54,14 @@ void RuntimeDyldImpl::resolveRelocations() { } } +void RuntimeDyldImpl::mapSectionAddress(void *LocalAddress, + uint64_t TargetAddress) { + assert(SectionLocalMemToID.count(LocalAddress) && + "Attempting to remap address of unknown section!"); + unsigned SectionID = SectionLocalMemToID[LocalAddress]; + reassignSectionAddress(SectionID, TargetAddress); +} + //===----------------------------------------------------------------------===// // RuntimeDyld class implementation RuntimeDyld::RuntimeDyld(RTDyldMemoryManager *mm) { @@ -116,6 +124,11 @@ void RuntimeDyld::reassignSectionAddress(unsigned SectionID, Dyld->reassignSectionAddress(SectionID, Addr); } +void RuntimeDyld::mapSectionAddress(void *LocalAddress, + uint64_t TargetAddress) { + Dyld->mapSectionAddress(LocalAddress, TargetAddress); +} + StringRef RuntimeDyld::getErrorString() { return Dyld->getErrorString(); } diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h index bbfef76..59c8636 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h @@ -16,6 +16,7 @@ #include "llvm/ExecutionEngine/RuntimeDyld.h" #include "llvm/Object/MachOObject.h" +#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/IndexedMap.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/Twine.h" @@ -45,10 +46,14 @@ protected: // 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 the above memory block for hosted + // 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; @@ -90,6 +95,8 @@ public: 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; } diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp index a3b4919..1cc021a 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp @@ -172,6 +172,7 @@ loadSegment32(const MachOObject *Obj, // Remember what got allocated for this SectionID. Sections.push_back(sys::MemoryBlock(Buffer, Sect->Size)); + SectionLocalMemToID[Buffer] = SectionID; // By default, the load address of a section is its memory buffer. SectionLoadAddress.push_back((uint64_t)Buffer); @@ -291,6 +292,7 @@ loadSegment64(const MachOObject *Obj, // Remember what got allocated for this SectionID. Sections.push_back(sys::MemoryBlock(Buffer, Sect->Size)); + SectionLocalMemToID[Buffer] = SectionID; // By default, the load address of a section is its memory buffer. SectionLoadAddress.push_back((uint64_t)Buffer); |