summaryrefslogtreecommitdiffstats
path: root/llvm/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
commitfd284c6ce124ef2b78112a57b6c6dd5191aa3bc0 (patch)
tree19dc29e3d989ca664e76e5056cf25cc3f0fccc30 /llvm/lib/ExecutionEngine
parent9967f49a3c6218f37776cd9f1a0457e4447cc083 (diff)
downloadbcm5719-llvm-fd284c6ce124ef2b78112a57b6c6dd5191aa3bc0.tar.gz
bcm5719-llvm-fd284c6ce124ef2b78112a57b6c6dd5191aa3bc0.zip
[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> llvm-svn: 208257
Diffstat (limited to 'llvm/lib/ExecutionEngine')
-rw-r--r--llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
index 0956761187d..d415514df0f 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<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;
+ }
}
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud