aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorAndrew Kaylor <andrew.kaylor@intel.com>2013-11-11 19:55:10 +0000
committerAndrew Kaylor <andrew.kaylor@intel.com>2013-11-11 19:55:10 +0000
commit559d409633ce22574dcab56d4f600b6eb1304652 (patch)
treeab529ea082cb249ea7001d7f8d5c7864ba40d8b3 /lib
parent07a5d3dc3d99ad2bf5c1122787d37ec0e17adde6 (diff)
downloadexternal_llvm-559d409633ce22574dcab56d4f600b6eb1304652.zip
external_llvm-559d409633ce22574dcab56d4f600b6eb1304652.tar.gz
external_llvm-559d409633ce22574dcab56d4f600b6eb1304652.tar.bz2
Fixing a problem with iterator validity in RuntimeDyldImpl::resolveExternalSymbols
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194415 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
index f40bed1..6aa6576 100644
--- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
+++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
@@ -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;
@@ -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.
@@ -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);
}
}