summaryrefslogtreecommitdiffstats
path: root/llvm/lib/ExecutionEngine/Orc
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-01-22 03:00:31 +0000
committerLang Hames <lhames@gmail.com>2018-01-22 03:00:31 +0000
commit635fd9092b059b1fb7327f83963c5009d3edef0e (patch)
treef04170cc4a08f403f92ae07b35b59a3fadff616b /llvm/lib/ExecutionEngine/Orc
parentac471d6db2674ffd74a8be1680ae1e6e2bef50b8 (diff)
downloadbcm5719-llvm-635fd9092b059b1fb7327f83963c5009d3edef0e.tar.gz
bcm5719-llvm-635fd9092b059b1fb7327f83963c5009d3edef0e.zip
[ORC] Add orc::SymbolResolver, a Orc/Legacy API interop header, and an
orc::SymbolResolver to JITSymbolResolver adapter. The new orc::SymbolResolver interface uses asynchronous queries for better performance. (Asynchronous queries with bulk lookup minimize RPC/IPC overhead, support parallel incoming queries, and expose more available work for distribution). Existing ORC layers will soon be updated to use the orc::SymbolResolver API rather than the legacy llvm::JITSymbolResolver API. Because RuntimeDyld still uses JITSymbolResolver, this patch also includes an adapter that wraps an orc::SymbolResolver with a JITSymbolResolver API. llvm-svn: 323073
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc')
-rw-r--r--llvm/lib/ExecutionEngine/Orc/CMakeLists.txt1
-rw-r--r--llvm/lib/ExecutionEngine/Orc/Core.cpp5
-rw-r--r--llvm/lib/ExecutionEngine/Orc/Legacy.cpp75
3 files changed, 80 insertions, 1 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
index ee64990dfb4..ca1b9ee005c 100644
--- a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
+++ b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
@@ -2,6 +2,7 @@ add_llvm_library(LLVMOrcJIT
Core.cpp
ExecutionUtils.cpp
IndirectionUtils.cpp
+ Legacy.cpp
NullResolver.cpp
OrcABISupport.cpp
OrcCBindings.cpp
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index 232c880b9dd..ff78ba19939 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -13,6 +13,7 @@
namespace llvm {
namespace orc {
+void SymbolResolver::anchor() {}
void SymbolSource::anchor() {}
AsynchronousSymbolQuery::AsynchronousSymbolQuery(
@@ -287,7 +288,7 @@ void VSO::finalize(SymbolNameSet SymbolsToFinalize) {
}
}
-VSO::LookupFlagsResult VSO::lookupFlags(SymbolNameSet Names) {
+LookupFlagsResult VSO::lookupFlags(SymbolNameSet Names) {
SymbolFlagsMap FlagsFound;
for (SymbolNameSet::iterator I = Names.begin(), E = Names.end(); I != E;) {
@@ -332,6 +333,8 @@ VSO::LookupResult VSO::lookup(AsynchronousSymbolQuery &Query,
return {std::move(MaterializationWork), std::move(Names)};
}
+ExecutionSession::ExecutionSession(SymbolStringPool &SSP) : SSP(SSP) {}
+
VModuleKey ExecutionSession::allocateVModule() { return ++LastKey; }
void ExecutionSession::releaseVModule(VModuleKey VMod) {
diff --git a/llvm/lib/ExecutionEngine/Orc/Legacy.cpp b/llvm/lib/ExecutionEngine/Orc/Legacy.cpp
new file mode 100644
index 00000000000..e4eba8bd756
--- /dev/null
+++ b/llvm/lib/ExecutionEngine/Orc/Legacy.cpp
@@ -0,0 +1,75 @@
+//===------- Legacy.cpp - Adapters for ExecutionEngine API interop --------===//
+//
+// 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/Legacy.h"
+
+namespace llvm {
+namespace orc {
+
+JITSymbolResolverAdapter::JITSymbolResolverAdapter(ExecutionSession &ES,
+ SymbolResolver &R)
+ : ES(ES), R(R) {}
+
+Expected<JITSymbolResolverAdapter::LookupResult>
+JITSymbolResolverAdapter::lookup(const LookupSet &Symbols) {
+ Error Err = Error::success();
+ JITSymbolResolver::LookupResult Result;
+
+ SymbolNameSet InternedSymbols;
+ for (auto &S : Symbols)
+ InternedSymbols.insert(ES.getSymbolStringPool().intern(S));
+
+ auto OnResolve = [&](Expected<SymbolMap> R) {
+ if (R) {
+ for (auto &KV : *R) {
+ ResolvedStrings.insert(KV.first);
+ Result[*KV.first] = KV.second;
+ }
+ } else
+ Err = joinErrors(std::move(Err), R.takeError());
+ };
+
+ auto OnReady = [](Error Err) {
+ // FIXME: Report error to ExecutionSession.
+ logAllUnhandledErrors(std::move(Err), errs(),
+ "legacy resolver received on-ready error:\n");
+ };
+
+ AsynchronousSymbolQuery Query(InternedSymbols, OnResolve, OnReady);
+
+ auto UnresolvedSymbols = R.lookup(Query, InternedSymbols);
+
+ if (!UnresolvedSymbols.empty())
+ Err = joinErrors(std::move(Err),
+ make_error<StringError>("Unresolved symbols",
+ inconvertibleErrorCode()));
+
+ if (Err)
+ return std::move(Err);
+
+ return Result;
+}
+
+Expected<JITSymbolResolverAdapter::LookupFlagsResult>
+JITSymbolResolverAdapter::lookupFlags(const LookupSet &Symbols) {
+ SymbolNameSet InternedSymbols;
+ for (auto &S : Symbols)
+ InternedSymbols.insert(ES.getSymbolStringPool().intern(S));
+
+ LookupFlagsResult Result;
+ for (auto &KV : R.lookupFlags(InternedSymbols).SymbolFlags) {
+ ResolvedStrings.insert(KV.first);
+ Result[*KV.first] = KV.second;
+ }
+
+ return Result;
+}
+
+} // End namespace orc.
+} // End namespace llvm.
OpenPOWER on IntegriCloud