mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-08 09:43:20 +00:00
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
This commit is contained in:
parent
652ca2fe0c
commit
020f4e861a
@ -239,6 +239,14 @@ public:
|
||||
virtual void *getPointerToNamedFunction(const std::string &Name,
|
||||
bool AbortOnFailure = true) = 0;
|
||||
|
||||
/// 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) {
|
||||
assert(0 && "Re-mapping of section addresses not supported with this EE!");
|
||||
}
|
||||
|
||||
/// runStaticConstructorsDestructors - This method is used to execute all of
|
||||
/// the static constructors or destructors for a program.
|
||||
///
|
||||
|
@ -64,6 +64,10 @@ class RuntimeDyld {
|
||||
// interface.
|
||||
RuntimeDyldImpl *Dyld;
|
||||
RTDyldMemoryManager *MM;
|
||||
protected:
|
||||
// Change the address associated with a section when resolving relocations.
|
||||
// Any relocations already associated with the symbol will be re-resolved.
|
||||
void reassignSectionAddress(unsigned SectionID, uint64_t Addr);
|
||||
public:
|
||||
RuntimeDyld(RTDyldMemoryManager*);
|
||||
~RuntimeDyld();
|
||||
@ -75,9 +79,13 @@ public:
|
||||
void *getSymbolAddress(StringRef Name);
|
||||
// Resolve the relocations for all symbols we currently know about.
|
||||
void resolveRelocations();
|
||||
// Change the address associated with a section when resolving relocations.
|
||||
// Any relocations already associated with the symbol will be re-resolved.
|
||||
void reassignSectionAddress(unsigned SectionID, uint64_t Addr);
|
||||
|
||||
/// 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.
|
||||
void mapSectionAddress(void *LocalAddress, uint64_t TargetAddress);
|
||||
|
||||
StringRef getErrorString();
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
/// @{
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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; }
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user