diff options
author | Lang Hames <lhames@gmail.com> | 2014-05-07 22:34:08 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2014-05-07 22:34:08 +0000 |
commit | 318659742325cb41797a93b9e7932509c708ec23 (patch) | |
tree | bc21dfd8e916a9648715821e3e96b6e1f4ab50bf /lib | |
parent | df60e43e05e1a61f1c9f7039ae9f7054bba570ea (diff) | |
download | llvm-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')
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | 14 |
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; + } } //===----------------------------------------------------------------------===// |