summaryrefslogtreecommitdiff
path: root/lib/ExecutionEngine
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2014-05-07 22:34:08 +0000
committerLang Hames <lhames@gmail.com>2014-05-07 22:34:08 +0000
commit318659742325cb41797a93b9e7932509c708ec23 (patch)
treebc21dfd8e916a9648715821e3e96b6e1f4ab50bf /lib/ExecutionEngine
parentdf60e43e05e1a61f1c9f7039ae9f7054bba570ea (diff)
downloadllvm-318659742325cb41797a93b9e7932509c708ec23.tar.gz
llvm-318659742325cb41797a93b9e7932509c708ec23.tar.bz2
llvm-318659742325cb41797a93b9e7932509c708ec23.tar.xz
[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 <rdar://problem/16764378> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208257 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine')
-rw-r--r--lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
index 0956761187..d415514df0 100644
--- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
+++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
@@ -620,6 +620,8 @@ void RuntimeDyldImpl::resolveRelocationList(const RelocationList &Relocs,
}
void RuntimeDyldImpl::resolveExternalSymbols() {
+ StringMap<RelocationList> ProcessedSymbols;
+
while (!ExternalSymbolRelocations.empty()) {
StringMap<RelocationList>::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<RelocationList>::iterator I = ProcessedSymbols.begin(),
+ E = ProcessedSymbols.end();
+ I != E; ++I) {
+ ExternalSymbolRelocations[I->first()] = I->second;
+ }
}
//===----------------------------------------------------------------------===//