Skip to content
This repository has been archived by the owner on Apr 23, 2020. It is now read-only.

Commit

Permalink
Fixing a problem with iterator validity in RuntimeDyldImpl::resolveEx…
Browse files Browse the repository at this point in the history
…ternalSymbols

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194415 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Andrew Kaylor committed Nov 11, 2013
1 parent 07a5d3d commit 559d409
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -494,10 +494,10 @@ void RuntimeDyldImpl::resolveExternalSymbols() {
StringMap<RelocationList>::iterator i = ExternalSymbolRelocations.begin();

StringRef Name = i->first();
RelocationList &Relocs = i->second;
if (Name.size() == 0) {
// This is an absolute symbol, use an address of zero.
DEBUG(dbgs() << "Resolving absolute relocations." << "\n");
RelocationList &Relocs = i->second;
resolveRelocationList(Relocs, 0);
} else {
uint64_t Addr = 0;
Expand All @@ -506,6 +506,13 @@ void RuntimeDyldImpl::resolveExternalSymbols() {
// This is an external symbol, try to get its address from
// MemoryManager.
Addr = MemMgr->getSymbolAddress(Name.data());
// The call to getSymbolAddress may have caused additional modules to
// be loaded, which may have added new entries to the
// ExternalSymbolRelocations map. Consquently, we need to update our
// iterator. This is also why retrieval of the relocation list
// associated with this symbol is deferred until below this point.
// New entries may have been added to the relocation list.
i = ExternalSymbolRelocations.find(Name);
} else {
// We found the symbol in our global table. It was probably in a
// Module that we loaded previously.
Expand All @@ -522,10 +529,13 @@ void RuntimeDyldImpl::resolveExternalSymbols() {
DEBUG(dbgs() << "Resolving relocations Name: " << Name
<< "\t" << format("0x%lx", Addr)
<< "\n");
// This list may have been updated when we called getSymbolAddress, so
// don't change this code to get the list earlier.
RelocationList &Relocs = i->second;
resolveRelocationList(Relocs, Addr);
}

ExternalSymbolRelocations.erase(i->first());
ExternalSymbolRelocations.erase(i);
}
}

Expand Down

0 comments on commit 559d409

Please sign in to comment.