summaryrefslogtreecommitdiffstats
path: root/llvm/lib/ExecutionEngine/Orc
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-01-05 22:50:43 +0000
committerLang Hames <lhames@gmail.com>2018-01-05 22:50:43 +0000
commit1097dc47eb69b0e488767cb3f0362c10d5e642e2 (patch)
tree54acc218584cf871d06077e64bc6ee721979cc09 /llvm/lib/ExecutionEngine/Orc
parentb96a3a4fe55d65bb9e595410ca682892e271624f (diff)
downloadbcm5719-llvm-1097dc47eb69b0e488767cb3f0362c10d5e642e2.tar.gz
bcm5719-llvm-1097dc47eb69b0e488767cb3f0362c10d5e642e2.zip
[ORC] Re-apply just the AsynchronousSymbolLookup class from r321838 while I
investigate builder / test failures. llvm-svn: 321910
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc')
-rw-r--r--llvm/lib/ExecutionEngine/Orc/CMakeLists.txt1
-rw-r--r--llvm/lib/ExecutionEngine/Orc/Core.cpp67
-rw-r--r--llvm/lib/ExecutionEngine/Orc/OrcError.cpp23
3 files changed, 89 insertions, 2 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
index f83e002c758..ee64990dfb4 100644
--- a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
+++ b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
@@ -1,4 +1,5 @@
add_llvm_library(LLVMOrcJIT
+ Core.cpp
ExecutionUtils.cpp
IndirectionUtils.cpp
NullResolver.cpp
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
new file mode 100644
index 00000000000..4c1ed18d4d1
--- /dev/null
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -0,0 +1,67 @@
+//===--------- Core.cpp - Core ORC APIs (SymbolSource, VSO, etc.) ---------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ExecutionEngine/Orc/Core.h"
+#include "llvm/ExecutionEngine/Orc/OrcError.h"
+
+namespace llvm {
+namespace orc {
+
+AsynchronousSymbolQuery::AsynchronousSymbolQuery(
+ const SymbolNameSet &Symbols,
+ SymbolsResolvedCallback NotifySymbolsResolved,
+ SymbolsReadyCallback NotifySymbolsReady)
+ : NotifySymbolsResolved(std::move(NotifySymbolsResolved)),
+ NotifySymbolsReady(std::move(NotifySymbolsReady)) {
+ assert(this->NotifySymbolsResolved &&
+ "Symbols resolved callback must be set");
+ assert(this->NotifySymbolsReady && "Symbols ready callback must be set");
+ OutstandingResolutions = OutstandingFinalizations = Symbols.size();
+}
+
+void AsynchronousSymbolQuery::setFailed(Error Err) {
+ OutstandingResolutions = OutstandingFinalizations = 0;
+ if (NotifySymbolsResolved)
+ NotifySymbolsResolved(std::move(Err));
+ else
+ NotifySymbolsReady(std::move(Err));
+}
+
+void AsynchronousSymbolQuery::setDefinition(SymbolStringPtr Name,
+ JITSymbol Sym) {
+ // If OutstandingResolutions is zero we must have errored out already. Just
+ // ignore this.
+ if (OutstandingResolutions == 0)
+ return;
+
+ assert(!Symbols.count(Name) &&
+ "Symbol has already been assigned an address");
+ Symbols.insert(std::make_pair(std::move(Name), std::move(Sym)));
+ --OutstandingResolutions;
+ if (OutstandingResolutions == 0) {
+ NotifySymbolsResolved(std::move(Symbols));
+ // Null out NotifySymbolsResolved to indicate that we've already called it.
+ NotifySymbolsResolved = {};
+ }
+}
+
+void AsynchronousSymbolQuery::notifySymbolFinalized() {
+ // If OutstandingFinalizations is zero we must have errored out already. Just
+ // ignore this.
+ if (OutstandingFinalizations == 0)
+ return;
+
+ assert(OutstandingFinalizations > 0 && "All symbols already finalized");
+ --OutstandingFinalizations;
+ if (OutstandingFinalizations == 0)
+ NotifySymbolsReady(Error::success());
+}
+
+} // End namespace orc.
+} // End namespace llvm.
diff --git a/llvm/lib/ExecutionEngine/Orc/OrcError.cpp b/llvm/lib/ExecutionEngine/Orc/OrcError.cpp
index c218cb9a523..f0bfed8ddb8 100644
--- a/llvm/lib/ExecutionEngine/Orc/OrcError.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/OrcError.cpp
@@ -29,6 +29,10 @@ public:
std::string message(int condition) const override {
switch (static_cast<OrcErrorCode>(condition)) {
+ case OrcErrorCode::DuplicateDefinition:
+ return "Duplicate symbol definition";
+ case OrcErrorCode::JITSymbolNotFound:
+ return "JIT symbol not found";
case OrcErrorCode::RemoteAllocatorDoesNotExist:
return "Remote allocator does not exist";
case OrcErrorCode::RemoteAllocatorIdAlreadyInUse:
@@ -45,8 +49,6 @@ public:
return "Could not negotiate RPC function";
case OrcErrorCode::RPCResponseAbandoned:
return "RPC response abandoned";
- case OrcErrorCode::JITSymbolNotFound:
- return "JIT symbol not found";
case OrcErrorCode::UnexpectedRPCCall:
return "Unexpected RPC call";
case OrcErrorCode::UnexpectedRPCResponse:
@@ -67,6 +69,7 @@ static ManagedStatic<OrcErrorCategory> OrcErrCat;
namespace llvm {
namespace orc {
+char DuplicateDefinition::ID = 0;
char JITSymbolNotFound::ID = 0;
std::error_code orcError(OrcErrorCode ErrCode) {
@@ -74,6 +77,22 @@ std::error_code orcError(OrcErrorCode ErrCode) {
return std::error_code(static_cast<UT>(ErrCode), *OrcErrCat);
}
+
+DuplicateDefinition::DuplicateDefinition(std::string SymbolName)
+ : SymbolName(std::move(SymbolName)) {}
+
+std::error_code DuplicateDefinition::convertToErrorCode() const {
+ return orcError(OrcErrorCode::DuplicateDefinition);
+}
+
+void DuplicateDefinition::log(raw_ostream &OS) const {
+ OS << "Duplicate definition of symbol '" << SymbolName << "'";
+}
+
+const std::string &DuplicateDefinition::getSymbolName() const {
+ return SymbolName;
+}
+
JITSymbolNotFound::JITSymbolNotFound(std::string SymbolName)
: SymbolName(std::move(SymbolName)) {}
OpenPOWER on IntegriCloud