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) { 76*bdd1243dSDimitry 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 84349cc55cSDimitry Andric Expected<std::vector<ExecutorAddr>> 85349cc55cSDimitry Andric EPCGenericDylibManager::lookup(tpctypes::DylibHandle H, 86349cc55cSDimitry Andric const SymbolLookupSet &Lookup) { 87349cc55cSDimitry Andric Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>())); 88349cc55cSDimitry Andric if (auto Err = 89349cc55cSDimitry Andric EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>( 90349cc55cSDimitry Andric SAs.Lookup, Result, SAs.Instance, H, Lookup)) 91349cc55cSDimitry Andric return std::move(Err); 92349cc55cSDimitry Andric return Result; 93349cc55cSDimitry Andric } 94349cc55cSDimitry Andric 95349cc55cSDimitry Andric Expected<std::vector<ExecutorAddr>> 96349cc55cSDimitry Andric EPCGenericDylibManager::lookup(tpctypes::DylibHandle H, 97349cc55cSDimitry Andric const RemoteSymbolLookupSet &Lookup) { 98349cc55cSDimitry Andric Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>())); 99349cc55cSDimitry Andric if (auto Err = 100349cc55cSDimitry Andric EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>( 101349cc55cSDimitry Andric SAs.Lookup, Result, SAs.Instance, H, Lookup)) 102349cc55cSDimitry Andric return std::move(Err); 103349cc55cSDimitry Andric return Result; 104349cc55cSDimitry Andric } 105349cc55cSDimitry Andric 106349cc55cSDimitry Andric } // end namespace orc 107349cc55cSDimitry Andric } // end namespace llvm 108