From 559d409633ce22574dcab56d4f600b6eb1304652 Mon Sep 17 00:00:00 2001 From: Andrew Kaylor Date: Mon, 11 Nov 2013 19:55:10 +0000 Subject: 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 --- lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index f40bed1b3f..6aa6576e2e 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -494,10 +494,10 @@ void RuntimeDyldImpl::resolveExternalSymbols() { StringMap::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); } } -- cgit v1.2.3