It doesn't make sense to move symbol relocations to section relocations when

relocations are resolved.  It's much more reasonable to do this decision when
relocations are just being added - we have all the information at that point.

Also a bit of renaming and extra comments to clarify extensions.

llvm-svn: 155819
This commit is contained in:
Eli Bendersky 2012-04-30 12:15:58 +00:00
parent 34c4869cf6
commit b92e1cf636
2 changed files with 27 additions and 26 deletions

View File

@ -39,7 +39,7 @@ namespace {
// Resolve the relocations for all symbols we currently know about.
void RuntimeDyldImpl::resolveRelocations() {
// First, resolve relocations associated with external symbols.
resolveSymbols();
resolveExternalSymbols();
// Just iterate over the sections we have and resolve all the relocations
// in them. Gross overkill, but it gets the job done.
@ -324,12 +324,20 @@ void RuntimeDyldImpl::addRelocation(const RelocationValueRef &Value,
Offset,
RelType,
Value.Addend));
} else
SymbolRelocations[Value.SymbolName].push_back(RelocationEntry(
SectionID,
Offset,
RelType,
Value.Addend));
} else {
// Relocation by symbol. If the symbol is found in the global symbol table,
// create an appropriate section relocation. Otherwise, add it to
// ExternalSymbolRelocations.
RelocationEntry RE(SectionID, Offset, RelType, Value.Addend);
StringMap<SymbolLoc>::const_iterator Loc = SymbolTable.find(Value.SymbolName);
if (Loc == SymbolTable.end()) {
ExternalSymbolRelocations[Value.SymbolName].push_back(RE);
} else {
RE.Addend += Loc->second.second;
Relocations[Loc->second.first].push_back(RE);
}
}
}
uint8_t *RuntimeDyldImpl::createStubFunction(uint8_t *Addr) {
@ -386,11 +394,9 @@ void RuntimeDyldImpl::resolveRelocationList(const RelocationList &Relocs,
}
}
// resolveSymbols - Resolve any relocations to the specified symbols if
// we know where it lives.
void RuntimeDyldImpl::resolveSymbols() {
StringMap<RelocationList>::iterator i = SymbolRelocations.begin(),
e = SymbolRelocations.end();
void RuntimeDyldImpl::resolveExternalSymbols() {
StringMap<RelocationList>::iterator i = ExternalSymbolRelocations.begin(),
e = ExternalSymbolRelocations.end();
for (; i != e; i++) {
StringRef Name = i->first();
RelocationList &Relocs = i->second;
@ -405,15 +411,7 @@ void RuntimeDyldImpl::resolveSymbols() {
<< "\n");
resolveRelocationList(Relocs, (uintptr_t)Addr);
} else {
// Change the relocation to be section relative rather than symbol
// relative and move it to the resolved relocation list.
DEBUG(dbgs() << "Resolving symbol '" << Name << "'\n");
for (int i = 0, e = Relocs.size(); i != e; ++i) {
RelocationEntry Entry = Relocs[i];
Entry.Addend += Loc->second.second;
Relocations[Loc->second.first].push_back(Entry);
}
Relocs.clear();
report_fatal_error("Expected external symbol");
}
}
}

View File

@ -129,7 +129,7 @@ protected:
// references it.
typedef std::map<SectionRef, unsigned> ObjSectionToIDMap;
// Master symbol table. As modules are loaded and external symbols are
// Master symbol table. As modules are loaded and symbols are
// resolved, their addresses are stored here as a SectionID/Offset pair.
typedef std::pair<unsigned, uintptr_t> SymbolLoc;
StringMap<SymbolLoc> SymbolTable;
@ -148,9 +148,11 @@ protected:
// source of the address. The target where the address will be writen is
// SectionID/Offset in the relocation itself.
DenseMap<unsigned, RelocationList> Relocations;
// Relocations to external symbols that are not yet resolved.
// Indexed by symbol name.
StringMap<RelocationList> SymbolRelocations;
// Relocations to external symbols that are not yet resolved. Symbols are
// external when they aren't found in the global symbol table of all loaded
// modules. This map is indexed by symbol name.
StringMap<RelocationList> ExternalSymbolRelocations;
typedef std::map<RelocationValueRef, uintptr_t> StubMap;
@ -235,7 +237,8 @@ protected:
LocalSymbolMap &Symbols,
StubMap &Stubs) = 0;
void resolveSymbols();
/// \brief Resolve relocations to external symbols.
void resolveExternalSymbols();
virtual ObjectImage *createObjectImage(const MemoryBuffer *InputBuffer);
virtual void handleObjectLoaded(ObjectImage *Obj)
{