mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-16 14:31:59 +00:00
MCJIT: getPointerToFunction() references target address space.
Make sure to return a pointer into the target memory, not the local memory. Often they are the same, but we can't assume that. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163217 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
706f03a35d
commit
35ed842773
@ -73,6 +73,10 @@ public:
|
||||
/// and resolve relocatons based on where they put it).
|
||||
void *getSymbolAddress(StringRef Name);
|
||||
|
||||
/// Get the address of the target copy of the symbol. This is the address
|
||||
/// used for relocation.
|
||||
uint64_t getSymbolLoadAddress(StringRef Name);
|
||||
|
||||
/// Resolve the relocations for all symbols we currently know about.
|
||||
void resolveRelocations();
|
||||
|
||||
|
@ -113,6 +113,11 @@ void *MCJIT::getPointerToBasicBlock(BasicBlock *BB) {
|
||||
}
|
||||
|
||||
void *MCJIT::getPointerToFunction(Function *F) {
|
||||
// FIXME: This should really return a uint64_t since it's a pointer in the
|
||||
// target address space, not our local address space. That's part of the
|
||||
// ExecutionEngine interface, though. Fix that when the old JIT finally
|
||||
// dies.
|
||||
|
||||
// FIXME: Add support for per-module compilation state
|
||||
if (!isCompiled)
|
||||
emitObject(M);
|
||||
@ -126,10 +131,13 @@ void *MCJIT::getPointerToFunction(Function *F) {
|
||||
|
||||
// FIXME: Should the Dyld be retaining module information? Probably not.
|
||||
// FIXME: Should we be using the mangler for this? Probably.
|
||||
//
|
||||
// This is the accessor for the target address, so make sure to check the
|
||||
// load address of the symbol, not the local address.
|
||||
StringRef BaseName = F->getName();
|
||||
if (BaseName[0] == '\1')
|
||||
return (void*)Dyld.getSymbolAddress(BaseName.substr(1));
|
||||
return (void*)Dyld.getSymbolAddress((TM->getMCAsmInfo()->getGlobalPrefix()
|
||||
return (void*)Dyld.getSymbolLoadAddress(BaseName.substr(1));
|
||||
return (void*)Dyld.getSymbolLoadAddress((TM->getMCAsmInfo()->getGlobalPrefix()
|
||||
+ BaseName).str());
|
||||
}
|
||||
|
||||
|
@ -479,6 +479,10 @@ void *RuntimeDyld::getSymbolAddress(StringRef Name) {
|
||||
return Dyld->getSymbolAddress(Name);
|
||||
}
|
||||
|
||||
uint64_t RuntimeDyld::getSymbolLoadAddress(StringRef Name) {
|
||||
return Dyld->getSymbolLoadAddress(Name);
|
||||
}
|
||||
|
||||
void RuntimeDyld::resolveRelocations() {
|
||||
Dyld->resolveRelocations();
|
||||
}
|
||||
|
@ -177,6 +177,10 @@ protected:
|
||||
return true;
|
||||
}
|
||||
|
||||
uint64_t getSectionLoadAddress(unsigned SectionID) {
|
||||
return Sections[SectionID].LoadAddress;
|
||||
}
|
||||
|
||||
uint8_t *getSectionAddress(unsigned SectionID) {
|
||||
return (uint8_t*)Sections[SectionID].Address;
|
||||
}
|
||||
@ -270,6 +274,15 @@ public:
|
||||
return getSectionAddress(Loc.first) + Loc.second;
|
||||
}
|
||||
|
||||
uint64_t getSymbolLoadAddress(StringRef Name) {
|
||||
// FIXME: Just look up as a function for now. Overly simple of course.
|
||||
// Work in progress.
|
||||
if (GlobalSymbolTable.find(Name) == GlobalSymbolTable.end())
|
||||
return 0;
|
||||
SymbolLoc Loc = GlobalSymbolTable.lookup(Name);
|
||||
return getSectionLoadAddress(Loc.first) + Loc.second;
|
||||
}
|
||||
|
||||
void resolveRelocations();
|
||||
|
||||
void reassignSectionAddress(unsigned SectionID, uint64_t Addr);
|
||||
|
Loading…
x
Reference in New Issue
Block a user