1a2c1cf09SLang Hames //===------- EPCGenericDylibManager.cpp -- Dylib management via EPC -------===// 2a2c1cf09SLang Hames // 3a2c1cf09SLang Hames // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4a2c1cf09SLang Hames // See https://llvm.org/LICENSE.txt for license information. 5a2c1cf09SLang Hames // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a2c1cf09SLang Hames // 7a2c1cf09SLang Hames //===----------------------------------------------------------------------===// 8a2c1cf09SLang Hames 9a2c1cf09SLang Hames #include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h" 10a2c1cf09SLang Hames 11a2c1cf09SLang Hames #include "llvm/ExecutionEngine/Orc/Core.h" 12a2c1cf09SLang Hames #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h" 13a2c1cf09SLang Hames #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h" 14a2c1cf09SLang Hames 15a2c1cf09SLang Hames namespace llvm { 16a2c1cf09SLang Hames namespace orc { 17a2c1cf09SLang Hames namespace shared { 18a2c1cf09SLang Hames 19a2c1cf09SLang Hames template <> 20a2c1cf09SLang Hames class SPSSerializationTraits<SPSRemoteSymbolLookupSetElement, 21a2c1cf09SLang Hames SymbolLookupSet::value_type> { 22a2c1cf09SLang Hames public: 23a2c1cf09SLang Hames static size_t size(const SymbolLookupSet::value_type &V) { 24a2c1cf09SLang Hames return SPSArgList<SPSString, bool>::size( 25a2c1cf09SLang Hames *V.first, V.second == SymbolLookupFlags::RequiredSymbol); 26a2c1cf09SLang Hames } 27a2c1cf09SLang Hames 28a2c1cf09SLang Hames static bool serialize(SPSOutputBuffer &OB, 29a2c1cf09SLang Hames const SymbolLookupSet::value_type &V) { 30a2c1cf09SLang Hames return SPSArgList<SPSString, bool>::serialize( 31a2c1cf09SLang Hames OB, *V.first, V.second == SymbolLookupFlags::RequiredSymbol); 32a2c1cf09SLang Hames } 33a2c1cf09SLang Hames }; 34a2c1cf09SLang Hames 35a2c1cf09SLang Hames template <> 36a2c1cf09SLang Hames class TrivialSPSSequenceSerialization<SPSRemoteSymbolLookupSetElement, 37a2c1cf09SLang Hames SymbolLookupSet> { 38a2c1cf09SLang Hames public: 39a2c1cf09SLang Hames static constexpr bool available = true; 40a2c1cf09SLang Hames }; 41a2c1cf09SLang Hames 42a2c1cf09SLang Hames template <> 43a2c1cf09SLang Hames class SPSSerializationTraits<SPSRemoteSymbolLookup, 44*db21bd4fSLang Hames DylibManager::LookupRequest> { 45a2c1cf09SLang Hames using MemberSerialization = 46ef391df2SLang Hames SPSArgList<SPSExecutorAddr, SPSRemoteSymbolLookupSet>; 47a2c1cf09SLang Hames 48a2c1cf09SLang Hames public: 49*db21bd4fSLang Hames static size_t size(const DylibManager::LookupRequest &LR) { 50ef391df2SLang Hames return MemberSerialization::size(ExecutorAddr(LR.Handle), LR.Symbols); 51a2c1cf09SLang Hames } 52a2c1cf09SLang Hames 53a2c1cf09SLang Hames static bool serialize(SPSOutputBuffer &OB, 54*db21bd4fSLang Hames const DylibManager::LookupRequest &LR) { 55ef391df2SLang Hames return MemberSerialization::serialize(OB, ExecutorAddr(LR.Handle), 56a2c1cf09SLang Hames LR.Symbols); 57a2c1cf09SLang Hames } 58a2c1cf09SLang Hames }; 59a2c1cf09SLang Hames 60a2c1cf09SLang Hames } // end namespace shared 61a2c1cf09SLang Hames 62a2c1cf09SLang Hames Expected<EPCGenericDylibManager> 63a2c1cf09SLang Hames EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols( 64a2c1cf09SLang Hames ExecutorProcessControl &EPC) { 65a2c1cf09SLang Hames SymbolAddrs SAs; 66a2c1cf09SLang Hames if (auto Err = EPC.getBootstrapSymbols( 67a2c1cf09SLang Hames {{SAs.Instance, rt::SimpleExecutorDylibManagerInstanceName}, 68a2c1cf09SLang Hames {SAs.Open, rt::SimpleExecutorDylibManagerOpenWrapperName}, 69a2c1cf09SLang Hames {SAs.Lookup, rt::SimpleExecutorDylibManagerLookupWrapperName}})) 70a2c1cf09SLang Hames return std::move(Err); 71a2c1cf09SLang Hames return EPCGenericDylibManager(EPC, std::move(SAs)); 72a2c1cf09SLang Hames } 73a2c1cf09SLang Hames 74a2c1cf09SLang Hames Expected<tpctypes::DylibHandle> EPCGenericDylibManager::open(StringRef Path, 75a2c1cf09SLang Hames uint64_t Mode) { 766613f4afSLang Hames Expected<tpctypes::DylibHandle> H((ExecutorAddr())); 77a2c1cf09SLang Hames if (auto Err = 78a2c1cf09SLang Hames EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerOpenSignature>( 7921a06254SLang Hames SAs.Open, H, SAs.Instance, Path, Mode)) 80a2c1cf09SLang Hames return std::move(Err); 81a2c1cf09SLang Hames return H; 82a2c1cf09SLang Hames } 83a2c1cf09SLang Hames 8454226e23SBen Langmuir void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H, 8554226e23SBen Langmuir const SymbolLookupSet &Lookup, 8654226e23SBen Langmuir SymbolLookupCompleteFn Complete) { 8754226e23SBen Langmuir EPC.callSPSWrapperAsync<rt::SPSSimpleExecutorDylibManagerLookupSignature>( 8854226e23SBen Langmuir SAs.Lookup, 8954226e23SBen Langmuir [Complete = std::move(Complete)]( 9054226e23SBen Langmuir Error SerializationErr, 9154226e23SBen Langmuir Expected<std::vector<ExecutorSymbolDef>> Result) mutable { 9254226e23SBen Langmuir if (SerializationErr) { 9354226e23SBen Langmuir cantFail(Result.takeError()); 9454226e23SBen Langmuir Complete(std::move(SerializationErr)); 95e7e13c6fSLang Hames return; 9654226e23SBen Langmuir } 9754226e23SBen Langmuir Complete(std::move(Result)); 9854226e23SBen Langmuir }, 9954226e23SBen Langmuir SAs.Instance, H, Lookup); 100a2c1cf09SLang Hames } 101a2c1cf09SLang Hames 10254226e23SBen Langmuir void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H, 10354226e23SBen Langmuir const RemoteSymbolLookupSet &Lookup, 10454226e23SBen Langmuir SymbolLookupCompleteFn Complete) { 10554226e23SBen Langmuir EPC.callSPSWrapperAsync<rt::SPSSimpleExecutorDylibManagerLookupSignature>( 10654226e23SBen Langmuir SAs.Lookup, 10754226e23SBen Langmuir [Complete = std::move(Complete)]( 10854226e23SBen Langmuir Error SerializationErr, 10954226e23SBen Langmuir Expected<std::vector<ExecutorSymbolDef>> Result) mutable { 11054226e23SBen Langmuir if (SerializationErr) { 11154226e23SBen Langmuir cantFail(Result.takeError()); 11254226e23SBen Langmuir Complete(std::move(SerializationErr)); 113cbf1535cSLang Hames return; 11454226e23SBen Langmuir } 11554226e23SBen Langmuir Complete(std::move(Result)); 11654226e23SBen Langmuir }, 11754226e23SBen Langmuir SAs.Instance, H, Lookup); 118a2c1cf09SLang Hames } 119a2c1cf09SLang Hames 120a2c1cf09SLang Hames } // end namespace orc 121a2c1cf09SLang Hames } // end namespace llvm 122