mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
[Orc][MCJIT][RuntimeDyld] Re-apply r231726 and r231724 with fix suggested by
Dave Blaikie. Thanks Dave! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231896 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -164,27 +164,24 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/// @brief Symbol info for RuntimeDyld.
|
||||
class SymbolInfo {
|
||||
/// @brief Symbol info for RuntimeDyld.
|
||||
class SymbolTableEntry : public JITSymbolBase {
|
||||
public:
|
||||
typedef enum { Hidden = 0, Default = 1 } Visibility;
|
||||
SymbolTableEntry()
|
||||
: JITSymbolBase(JITSymbolFlags::None), Offset(0), SectionID(0) {}
|
||||
|
||||
SymbolInfo() : Offset(0), SectionID(0), Vis(Hidden) {}
|
||||
|
||||
SymbolInfo(unsigned SectionID, uint64_t Offset, Visibility Vis)
|
||||
: Offset(Offset), SectionID(SectionID), Vis(Vis) {}
|
||||
SymbolTableEntry(unsigned SectionID, uint64_t Offset, JITSymbolFlags Flags)
|
||||
: JITSymbolBase(Flags), Offset(Offset), SectionID(SectionID) {}
|
||||
|
||||
unsigned getSectionID() const { return SectionID; }
|
||||
uint64_t getOffset() const { return Offset; }
|
||||
Visibility getVisibility() const { return Vis; }
|
||||
|
||||
private:
|
||||
uint64_t Offset;
|
||||
unsigned SectionID : 31;
|
||||
Visibility Vis : 1;
|
||||
unsigned SectionID;
|
||||
};
|
||||
|
||||
typedef StringMap<SymbolInfo> RTDyldSymbolTable;
|
||||
typedef StringMap<SymbolTableEntry> RTDyldSymbolTable;
|
||||
|
||||
class RuntimeDyldImpl {
|
||||
friend class RuntimeDyld::LoadedObjectInfo;
|
||||
@@ -394,7 +391,7 @@ public:
|
||||
virtual std::unique_ptr<RuntimeDyld::LoadedObjectInfo>
|
||||
loadObject(const object::ObjectFile &Obj) = 0;
|
||||
|
||||
uint8_t* getSymbolAddress(StringRef Name) const {
|
||||
uint8_t* getSymbolLocalAddress(StringRef Name) const {
|
||||
// FIXME: Just look up as a function for now. Overly simple of course.
|
||||
// Work in progress.
|
||||
RTDyldSymbolTable::const_iterator pos = GlobalSymbolTable.find(Name);
|
||||
@@ -404,24 +401,16 @@ public:
|
||||
return getSectionAddress(SymInfo.getSectionID()) + SymInfo.getOffset();
|
||||
}
|
||||
|
||||
uint64_t getSymbolLoadAddress(StringRef Name) const {
|
||||
RuntimeDyld::SymbolInfo getSymbol(StringRef Name) const {
|
||||
// FIXME: Just look up as a function for now. Overly simple of course.
|
||||
// Work in progress.
|
||||
RTDyldSymbolTable::const_iterator pos = GlobalSymbolTable.find(Name);
|
||||
if (pos == GlobalSymbolTable.end())
|
||||
return 0;
|
||||
const auto &SymInfo = pos->second;
|
||||
return getSectionLoadAddress(SymInfo.getSectionID()) + SymInfo.getOffset();
|
||||
}
|
||||
|
||||
uint64_t getExportedSymbolLoadAddress(StringRef Name) const {
|
||||
RTDyldSymbolTable::const_iterator pos = GlobalSymbolTable.find(Name);
|
||||
if (pos == GlobalSymbolTable.end())
|
||||
return 0;
|
||||
const auto &SymInfo = pos->second;
|
||||
if (SymInfo.getVisibility() == SymbolInfo::Hidden)
|
||||
return 0;
|
||||
return getSectionLoadAddress(SymInfo.getSectionID()) + SymInfo.getOffset();
|
||||
return nullptr;
|
||||
const auto &SymEntry = pos->second;
|
||||
uint64_t TargetAddr =
|
||||
getSectionLoadAddress(SymEntry.getSectionID()) + SymEntry.getOffset();
|
||||
return RuntimeDyld::SymbolInfo(TargetAddr, SymEntry.getFlags());
|
||||
}
|
||||
|
||||
void resolveRelocations();
|
||||
|
Reference in New Issue
Block a user