From fd284c6ce124ef2b78112a57b6c6dd5191aa3bc0 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Wed, 7 May 2014 22:34:08 +0000 Subject: [PATCH] [RuntimeDyld] Make RuntimeDyldImpl::resolveExternalSymbols preserve the relocation entries it applies. Prior to this patch, RuntimeDyldImpl::resolveExternalSymbols discarded relocations for external symbols once they had been applied. This causes issues if the client calls MCJIT::finalizeLoadedModules more than once, and updates the location of any symbols in between (e.g. by calling MCJIT::mapSectionAddress). No test case yet: None of our in-tree memory managers support moving sections around. I'll have to hack up a dummy memory manager before I can write a unit test. Fixes llvm-svn: 208257 --- .../ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index 0956761187d6..d415514df0fb 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -620,6 +620,8 @@ void RuntimeDyldImpl::resolveRelocationList(const RelocationList &Relocs, } void RuntimeDyldImpl::resolveExternalSymbols() { + StringMap ProcessedSymbols; + while (!ExternalSymbolRelocations.empty()) { StringMap::iterator i = ExternalSymbolRelocations.begin(); @@ -665,8 +667,20 @@ void RuntimeDyldImpl::resolveExternalSymbols() { resolveRelocationList(Relocs, Addr); } + ProcessedSymbols[i->first()] = i->second; ExternalSymbolRelocations.erase(i); } + + // Restore the relocation entries that were consumed in the loop above: + // + // FIXME: Replace the following loop with: + // std::swap(ProcessedSymbols, ExternalSymbolRelocations) + // once StringMap has copy and move construction. + for (StringMap::iterator I = ProcessedSymbols.begin(), + E = ProcessedSymbols.end(); + I != E; ++I) { + ExternalSymbolRelocations[I->first()] = I->second; + } } //===----------------------------------------------------------------------===//