summaryrefslogtreecommitdiffstats
path: root/llvm/lib/ExecutionEngine/Orc/Core.cpp
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-04-19 18:42:49 +0000
committerLang Hames <lhames@gmail.com>2018-04-19 18:42:49 +0000
commit9bbd653084de43b3d1d80fec157798bc0d557598 (patch)
tree56d4b3c45d17da9b41931cdbb1de54954ac8738f /llvm/lib/ExecutionEngine/Orc/Core.cpp
parent46eab8d9fee52444915e336ce73374ba4c9e53d4 (diff)
downloadbcm5719-llvm-9bbd653084de43b3d1d80fec157798bc0d557598.tar.gz
bcm5719-llvm-9bbd653084de43b3d1d80fec157798bc0d557598.zip
[ORC] Make VSO symbol resolution/finalization operations private.
This forces these operations to be carried out via a MaterializationResponsibility instance, ensuring responsibility is explicitly tracked. llvm-svn: 330356
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/Core.cpp')
-rw-r--r--llvm/lib/ExecutionEngine/Orc/Core.cpp194
1 files changed, 109 insertions, 85 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index da0c60455b9..983d3b202de 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -170,19 +170,6 @@ MaterializationResponsibility::~MaterializationResponsibility() {
"All symbols should have been explicitly materialized or failed");
}
-MaterializationResponsibility
-MaterializationResponsibility::takeResponsibility(SymbolNameSet Symbols) {
- SymbolFlagsMap ExtractedFlags;
-
- for (auto &S : Symbols) {
- auto I = SymbolFlags.find(S);
- ExtractedFlags.insert(*I);
- SymbolFlags.erase(I);
- }
-
- return MaterializationResponsibility(V, std::move(ExtractedFlags));
-}
-
void MaterializationResponsibility::resolve(const SymbolMap &Symbols) {
#ifndef NDEBUG
for (auto &KV : Symbols) {
@@ -212,6 +199,19 @@ void MaterializationResponsibility::notifyMaterializationFailed() {
V.notifyMaterializationFailed(SymbolNames);
}
+MaterializationResponsibility
+MaterializationResponsibility::delegate(SymbolNameSet Symbols) {
+ SymbolFlagsMap ExtractedFlags;
+
+ for (auto &S : Symbols) {
+ auto I = SymbolFlags.find(S);
+ ExtractedFlags.insert(*I);
+ SymbolFlags.erase(I);
+ }
+
+ return MaterializationResponsibility(V, std::move(ExtractedFlags));
+}
+
VSO::Materializer::Materializer(std::unique_ptr<MaterializationUnit> MU,
MaterializationResponsibility R)
: MU(std::move(MU)), R(std::move(R)) {}
@@ -239,6 +239,14 @@ VSO::SymbolTableEntry::SymbolTableEntry(JITSymbolFlags Flags,
this->Flags |= JITSymbolFlags::Lazy;
}
+VSO::SymbolTableEntry::SymbolTableEntry(JITSymbolFlags Flags)
+ : Flags(Flags), Address(0) {
+ // We *don't* expect isMaterializing to be set here. That's for the VSO to do.
+ assert(!Flags.isLazy() && "Initial flags include lazy?");
+ assert(!Flags.isMaterializing() && "Initial flags include materializing");
+ this->Flags |= JITSymbolFlags::Materializing;
+}
+
VSO::SymbolTableEntry::SymbolTableEntry(JITEvaluatedSymbol Sym)
: Flags(Sym.getFlags()), Address(Sym.getAddress()) {
assert(!Flags.isLazy() && !Flags.isMaterializing() &&
@@ -295,6 +303,23 @@ void VSO::SymbolTableEntry::replaceWith(VSO &V, SymbolStringPtr Name,
UMII = std::move(NewUMII);
}
+void VSO::SymbolTableEntry::replaceMaterializing(VSO &V, SymbolStringPtr Name,
+ JITSymbolFlags NewFlags) {
+ assert(!NewFlags.isWeak() &&
+ "Can't define a lazy symbol in materializing mode");
+ assert(!NewFlags.isLazy() && !NewFlags.isMaterializing() &&
+ "Flags should not be in lazy or materializing state");
+ if (Flags.isLazy()) {
+ UMII->discard(V, Name);
+ if (UMII->Symbols.empty())
+ V.UnmaterializedInfos.erase(UMII);
+ }
+ destroy();
+ Flags = NewFlags;
+ Flags |= JITSymbolFlags::Materializing;
+ Address = 0;
+}
+
void VSO::SymbolTableEntry::notifyMaterializing() {
assert(Flags.isLazy() && "Can only start materializing from lazy state");
UMII.~UnmaterializedInfoIterator();
@@ -378,7 +403,6 @@ Error VSO::define(SymbolMap NewSymbols) {
}
Error VSO::defineLazy(std::unique_ptr<MaterializationUnit> MU) {
-
auto UMII = UnmaterializedInfos.insert(UnmaterializedInfos.end(),
UnmaterializedInfo(std::move(MU)));
@@ -424,77 +448,6 @@ Error VSO::defineLazy(std::unique_ptr<MaterializationUnit> MU) {
return Err;
}
-void VSO::resolve(const SymbolMap &SymbolValues) {
- for (auto &KV : SymbolValues) {
- auto I = Symbols.find(KV.first);
- assert(I != Symbols.end() && "Resolving symbol not present in this dylib");
- I->second.resolve(*this, KV.second);
-
- auto J = MaterializingInfos.find(KV.first);
- if (J == MaterializingInfos.end())
- continue;
-
- assert(J->second.PendingFinalization.empty() &&
- "Queries already pending finalization?");
- for (auto &Q : J->second.PendingResolution)
- Q->resolve(KV.first, KV.second);
- J->second.PendingFinalization = std::move(J->second.PendingResolution);
- J->second.PendingResolution = MaterializingInfo::QueryList();
- }
-}
-
-void VSO::notifyMaterializationFailed(const SymbolNameSet &Names) {
- assert(!Names.empty() && "Failed to materialize empty set?");
-
- std::map<std::shared_ptr<AsynchronousSymbolQuery>, SymbolNameSet>
- ResolutionFailures;
- std::map<std::shared_ptr<AsynchronousSymbolQuery>, SymbolNameSet>
- FinalizationFailures;
-
- for (auto &S : Names) {
- auto I = Symbols.find(S);
- assert(I != Symbols.end() && "Symbol not present in this VSO");
-
- auto J = MaterializingInfos.find(S);
- if (J != MaterializingInfos.end()) {
- if (J->second.PendingFinalization.empty()) {
- for (auto &Q : J->second.PendingResolution)
- ResolutionFailures[Q].insert(S);
- } else {
- for (auto &Q : J->second.PendingFinalization)
- FinalizationFailures[Q].insert(S);
- }
- MaterializingInfos.erase(J);
- }
- Symbols.erase(I);
- }
-
- for (auto &KV : ResolutionFailures)
- KV.first->notifyMaterializationFailed(
- make_error<FailedToResolve>(std::move(KV.second)));
-
- for (auto &KV : FinalizationFailures)
- KV.first->notifyMaterializationFailed(
- make_error<FailedToFinalize>(std::move(KV.second)));
-}
-
-void VSO::finalize(const SymbolNameSet &SymbolsToFinalize) {
- for (auto &S : SymbolsToFinalize) {
- auto I = Symbols.find(S);
- assert(I != Symbols.end() && "Finalizing symbol not present in this dylib");
-
- auto J = MaterializingInfos.find(S);
- if (J != MaterializingInfos.end()) {
- assert(J->second.PendingResolution.empty() &&
- "Queries still pending resolution?");
- for (auto &Q : J->second.PendingFinalization)
- Q->finalizeSymbol();
- MaterializingInfos.erase(J);
- }
- I->second.finalize();
- }
-}
-
SymbolNameSet VSO::lookupFlags(SymbolFlagsMap &Flags, SymbolNameSet Names) {
for (SymbolNameSet::iterator I = Names.begin(), E = Names.end(); I != E;) {
@@ -580,6 +533,77 @@ VSO::LookupResult VSO::lookup(std::shared_ptr<AsynchronousSymbolQuery> Query,
return {std::move(Materializers), std::move(Names)};
}
+void VSO::resolve(const SymbolMap &SymbolValues) {
+ for (auto &KV : SymbolValues) {
+ auto I = Symbols.find(KV.first);
+ assert(I != Symbols.end() && "Resolving symbol not present in this dylib");
+ I->second.resolve(*this, KV.second);
+
+ auto J = MaterializingInfos.find(KV.first);
+ if (J == MaterializingInfos.end())
+ continue;
+
+ assert(J->second.PendingFinalization.empty() &&
+ "Queries already pending finalization?");
+ for (auto &Q : J->second.PendingResolution)
+ Q->resolve(KV.first, KV.second);
+ J->second.PendingFinalization = std::move(J->second.PendingResolution);
+ J->second.PendingResolution = MaterializingInfo::QueryList();
+ }
+}
+
+void VSO::notifyMaterializationFailed(const SymbolNameSet &Names) {
+ assert(!Names.empty() && "Failed to materialize empty set?");
+
+ std::map<std::shared_ptr<AsynchronousSymbolQuery>, SymbolNameSet>
+ ResolutionFailures;
+ std::map<std::shared_ptr<AsynchronousSymbolQuery>, SymbolNameSet>
+ FinalizationFailures;
+
+ for (auto &S : Names) {
+ auto I = Symbols.find(S);
+ assert(I != Symbols.end() && "Symbol not present in this VSO");
+
+ auto J = MaterializingInfos.find(S);
+ if (J != MaterializingInfos.end()) {
+ if (J->second.PendingFinalization.empty()) {
+ for (auto &Q : J->second.PendingResolution)
+ ResolutionFailures[Q].insert(S);
+ } else {
+ for (auto &Q : J->second.PendingFinalization)
+ FinalizationFailures[Q].insert(S);
+ }
+ MaterializingInfos.erase(J);
+ }
+ Symbols.erase(I);
+ }
+
+ for (auto &KV : ResolutionFailures)
+ KV.first->notifyMaterializationFailed(
+ make_error<FailedToResolve>(std::move(KV.second)));
+
+ for (auto &KV : FinalizationFailures)
+ KV.first->notifyMaterializationFailed(
+ make_error<FailedToFinalize>(std::move(KV.second)));
+}
+
+void VSO::finalize(const SymbolNameSet &SymbolsToFinalize) {
+ for (auto &S : SymbolsToFinalize) {
+ auto I = Symbols.find(S);
+ assert(I != Symbols.end() && "Finalizing symbol not present in this dylib");
+
+ auto J = MaterializingInfos.find(S);
+ if (J != MaterializingInfos.end()) {
+ assert(J->second.PendingResolution.empty() &&
+ "Queries still pending resolution?");
+ for (auto &Q : J->second.PendingFinalization)
+ Q->finalizeSymbol();
+ MaterializingInfos.erase(J);
+ }
+ I->second.finalize();
+ }
+}
+
Expected<SymbolMap> lookup(const std::vector<VSO *> &VSOs, SymbolNameSet Names,
MaterializationDispatcher DispatchMaterialization) {
#if LLVM_ENABLE_THREADS
OpenPOWER on IntegriCloud