diff options
author | Andrew Kaylor <andrew.kaylor@intel.com> | 2013-11-11 19:55:10 +0000 |
---|---|---|
committer | Andrew Kaylor <andrew.kaylor@intel.com> | 2013-11-11 19:55:10 +0000 |
commit | 559d409633ce22574dcab56d4f600b6eb1304652 (patch) | |
tree | ab529ea082cb249ea7001d7f8d5c7864ba40d8b3 /lib/ExecutionEngine | |
parent | 07a5d3dc3d99ad2bf5c1122787d37ec0e17adde6 (diff) | |
download | external_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/ExecutionEngine')
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | 14 |
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); } } |