diff options
author | Lang Hames <lhames@gmail.com> | 2018-06-14 21:16:29 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2018-06-14 21:16:29 +0000 |
commit | 5d6c509944fc2a5873d0a70410c82a6ebd4ae31c (patch) | |
tree | d3ecf5ca8d6103d015eec13cc7f80e5fa905f974 /llvm/lib | |
parent | 248acf6b57ecb38125aed1ea1d7d547d99e4100f (diff) | |
download | bcm5719-llvm-5d6c509944fc2a5873d0a70410c82a6ebd4ae31c.tar.gz bcm5719-llvm-5d6c509944fc2a5873d0a70410c82a6ebd4ae31c.zip |
[ORC] Strip weak flags from a symbol once it is selected for materialization.
Once a symbol has been selected for materialization it can no longer be
overridden. Stripping the weak flag guarantees this (override attempts will
then be treated as duplicate definitions and result in a DuplicateDefinition
error).
llvm-svn: 334771
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/Core.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp index 82be34476f6..894e210da13 100644 --- a/llvm/lib/ExecutionEngine/Orc/Core.cpp +++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp @@ -468,6 +468,8 @@ void VSO::resolve(const SymbolMap &Resolved) { for (const auto &KV : Resolved) { auto &Name = KV.first; auto Sym = KV.second; + JITSymbolFlags ResolvedFlags = Sym.getFlags(); + ResolvedFlags &= ~JITSymbolFlags::Weak; assert(!Sym.getFlags().isLazy() && !Sym.getFlags().isMaterializing() && "Materializing flags should be managed internally"); @@ -480,13 +482,11 @@ void VSO::resolve(const SymbolMap &Resolved) { "Symbol should be materializing"); assert(I->second.getAddress() == 0 && "Symbol has already been resolved"); - assert(Sym.getFlags() == + assert(ResolvedFlags == JITSymbolFlags::stripTransientFlags(I->second.getFlags()) && "Resolved flags should match the declared flags"); // Once resolved, symbols can never be weak. - JITSymbolFlags ResolvedFlags = Sym.getFlags(); - ResolvedFlags &= ~JITSymbolFlags::Weak; ResolvedFlags |= JITSymbolFlags::Materializing; I->second = JITEvaluatedSymbol(Sym.getAddress(), ResolvedFlags); @@ -748,6 +748,7 @@ void VSO::lookupImpl(std::shared_ptr<AsynchronousSymbolQuery> &Q, for (auto &KV : MU->getSymbols()) { auto SymK = Symbols.find(KV.first); auto Flags = SymK->second.getFlags(); + Flags &= ~JITSymbolFlags::Weak; Flags &= ~JITSymbolFlags::Lazy; Flags |= JITSymbolFlags::Materializing; SymK->second.setFlags(Flags); |