1349cc55cSDimitry Andric //===------- EPCGenericDylibManager.cpp -- Dylib management via EPC -------===// 2349cc55cSDimitry Andric // 3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6349cc55cSDimitry Andric // 7349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 8349cc55cSDimitry Andric 9349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h" 10349cc55cSDimitry Andric 11349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Core.h" 12349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h" 13349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h" 14349cc55cSDimitry Andric 15349cc55cSDimitry Andric namespace llvm { 16349cc55cSDimitry Andric namespace orc { 17349cc55cSDimitry Andric namespace shared { 18349cc55cSDimitry Andric 19349cc55cSDimitry Andric template <> 20349cc55cSDimitry Andric class SPSSerializationTraits<SPSRemoteSymbolLookupSetElement, 21349cc55cSDimitry Andric SymbolLookupSet::value_type> { 22349cc55cSDimitry Andric public: 23349cc55cSDimitry Andric static size_t size(const SymbolLookupSet::value_type &V) { 24349cc55cSDimitry Andric return SPSArgList<SPSString, bool>::size( 25349cc55cSDimitry Andric *V.first, V.second == SymbolLookupFlags::RequiredSymbol); 26349cc55cSDimitry Andric } 27349cc55cSDimitry Andric 28349cc55cSDimitry Andric static bool serialize(SPSOutputBuffer &OB, 29349cc55cSDimitry Andric const SymbolLookupSet::value_type &V) { 30349cc55cSDimitry Andric return SPSArgList<SPSString, bool>::serialize( 31349cc55cSDimitry Andric OB, *V.first, V.second == SymbolLookupFlags::RequiredSymbol); 32349cc55cSDimitry Andric } 33349cc55cSDimitry Andric }; 34349cc55cSDimitry Andric 35349cc55cSDimitry Andric template <> 36349cc55cSDimitry Andric class TrivialSPSSequenceSerialization<SPSRemoteSymbolLookupSetElement, 37349cc55cSDimitry Andric SymbolLookupSet> { 38349cc55cSDimitry Andric public: 39349cc55cSDimitry Andric static constexpr bool available = true; 40349cc55cSDimitry Andric }; 41349cc55cSDimitry Andric 42349cc55cSDimitry Andric template <> 43349cc55cSDimitry Andric class SPSSerializationTraits<SPSRemoteSymbolLookup, 44349cc55cSDimitry Andric ExecutorProcessControl::LookupRequest> { 45349cc55cSDimitry Andric using MemberSerialization = 46349cc55cSDimitry Andric SPSArgList<SPSExecutorAddr, SPSRemoteSymbolLookupSet>; 47349cc55cSDimitry Andric 48349cc55cSDimitry Andric public: 49349cc55cSDimitry Andric static size_t size(const ExecutorProcessControl::LookupRequest &LR) { 50349cc55cSDimitry Andric return MemberSerialization::size(ExecutorAddr(LR.Handle), LR.Symbols); 51349cc55cSDimitry Andric } 52349cc55cSDimitry Andric 53349cc55cSDimitry Andric static bool serialize(SPSOutputBuffer &OB, 54349cc55cSDimitry Andric const ExecutorProcessControl::LookupRequest &LR) { 55349cc55cSDimitry Andric return MemberSerialization::serialize(OB, ExecutorAddr(LR.Handle), 56349cc55cSDimitry Andric LR.Symbols); 57349cc55cSDimitry Andric } 58349cc55cSDimitry Andric }; 59349cc55cSDimitry Andric 60349cc55cSDimitry Andric } // end namespace shared 61349cc55cSDimitry Andric 62349cc55cSDimitry Andric Expected<EPCGenericDylibManager> 63349cc55cSDimitry Andric EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols( 64349cc55cSDimitry Andric ExecutorProcessControl &EPC) { 65349cc55cSDimitry Andric SymbolAddrs SAs; 66349cc55cSDimitry Andric if (auto Err = EPC.getBootstrapSymbols( 67349cc55cSDimitry Andric {{SAs.Instance, rt::SimpleExecutorDylibManagerInstanceName}, 68349cc55cSDimitry Andric {SAs.Open, rt::SimpleExecutorDylibManagerOpenWrapperName}, 69349cc55cSDimitry Andric {SAs.Lookup, rt::SimpleExecutorDylibManagerLookupWrapperName}})) 70349cc55cSDimitry Andric return std::move(Err); 71349cc55cSDimitry Andric return EPCGenericDylibManager(EPC, std::move(SAs)); 72349cc55cSDimitry Andric } 73349cc55cSDimitry Andric 74349cc55cSDimitry Andric Expected<tpctypes::DylibHandle> EPCGenericDylibManager::open(StringRef Path, 75349cc55cSDimitry Andric uint64_t Mode) { 76bdd1243dSDimitry Andric Expected<tpctypes::DylibHandle> H((ExecutorAddr())); 77349cc55cSDimitry Andric if (auto Err = 78349cc55cSDimitry Andric EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerOpenSignature>( 79349cc55cSDimitry Andric SAs.Open, H, SAs.Instance, Path, Mode)) 80349cc55cSDimitry Andric return std::move(Err); 81349cc55cSDimitry Andric return H; 82349cc55cSDimitry Andric } 83349cc55cSDimitry Andric 84*0fca6ea1SDimitry Andric void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H, 85*0fca6ea1SDimitry Andric const SymbolLookupSet &Lookup, 86*0fca6ea1SDimitry Andric SymbolLookupCompleteFn Complete) { 87*0fca6ea1SDimitry Andric EPC.callSPSWrapperAsync<rt::SPSSimpleExecutorDylibManagerLookupSignature>( 88*0fca6ea1SDimitry Andric SAs.Lookup, 89*0fca6ea1SDimitry Andric [Complete = std::move(Complete)]( 90*0fca6ea1SDimitry Andric Error SerializationErr, 91*0fca6ea1SDimitry Andric Expected<std::vector<ExecutorSymbolDef>> Result) mutable { 92*0fca6ea1SDimitry Andric if (SerializationErr) { 93*0fca6ea1SDimitry Andric cantFail(Result.takeError()); 94*0fca6ea1SDimitry Andric Complete(std::move(SerializationErr)); 95*0fca6ea1SDimitry Andric return; 96*0fca6ea1SDimitry Andric } 97*0fca6ea1SDimitry Andric Complete(std::move(Result)); 98*0fca6ea1SDimitry Andric }, 99*0fca6ea1SDimitry Andric SAs.Instance, H, Lookup); 100349cc55cSDimitry Andric } 101349cc55cSDimitry Andric 102*0fca6ea1SDimitry Andric void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H, 103*0fca6ea1SDimitry Andric const RemoteSymbolLookupSet &Lookup, 104*0fca6ea1SDimitry Andric SymbolLookupCompleteFn Complete) { 105*0fca6ea1SDimitry Andric EPC.callSPSWrapperAsync<rt::SPSSimpleExecutorDylibManagerLookupSignature>( 106*0fca6ea1SDimitry Andric SAs.Lookup, 107*0fca6ea1SDimitry Andric [Complete = std::move(Complete)]( 108*0fca6ea1SDimitry Andric Error SerializationErr, 109*0fca6ea1SDimitry Andric Expected<std::vector<ExecutorSymbolDef>> Result) mutable { 110*0fca6ea1SDimitry Andric if (SerializationErr) { 111*0fca6ea1SDimitry Andric cantFail(Result.takeError()); 112*0fca6ea1SDimitry Andric Complete(std::move(SerializationErr)); 113*0fca6ea1SDimitry Andric return; 114*0fca6ea1SDimitry Andric } 115*0fca6ea1SDimitry Andric Complete(std::move(Result)); 116*0fca6ea1SDimitry Andric }, 117*0fca6ea1SDimitry Andric SAs.Instance, H, Lookup); 118349cc55cSDimitry Andric } 119349cc55cSDimitry Andric 120349cc55cSDimitry Andric } // end namespace orc 121349cc55cSDimitry Andric } // end namespace llvm 122