diff options
author | Lang Hames <lhames@gmail.com> | 2018-01-22 03:00:31 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2018-01-22 03:00:31 +0000 |
commit | 635fd9092b059b1fb7327f83963c5009d3edef0e (patch) | |
tree | f04170cc4a08f403f92ae07b35b59a3fadff616b /llvm/lib/ExecutionEngine/Orc | |
parent | ac471d6db2674ffd74a8be1680ae1e6e2bef50b8 (diff) | |
download | bcm5719-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.txt | 1 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/Core.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/Legacy.cpp | 75 |
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. |