summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-06-14 21:16:29 +0000
committerLang Hames <lhames@gmail.com>2018-06-14 21:16:29 +0000
commit5d6c509944fc2a5873d0a70410c82a6ebd4ae31c (patch)
treed3ecf5ca8d6103d015eec13cc7f80e5fa905f974 /llvm/lib
parent248acf6b57ecb38125aed1ea1d7d547d99e4100f (diff)
downloadbcm5719-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.cpp7
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);
OpenPOWER on IntegriCloud