1*349cc55cSDimitry Andric //===------- EPCGenericDylibManager.cpp -- Dylib management via EPC -------===// 2*349cc55cSDimitry Andric // 3*349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*349cc55cSDimitry Andric // 7*349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 8*349cc55cSDimitry Andric 9*349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h" 10*349cc55cSDimitry Andric 11*349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Core.h" 12*349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h" 13*349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h" 14*349cc55cSDimitry Andric 15*349cc55cSDimitry Andric namespace llvm { 16*349cc55cSDimitry Andric namespace orc { 17*349cc55cSDimitry Andric namespace shared { 18*349cc55cSDimitry Andric 19*349cc55cSDimitry Andric template <> 20*349cc55cSDimitry Andric class SPSSerializationTraits<SPSRemoteSymbolLookupSetElement, 21*349cc55cSDimitry Andric SymbolLookupSet::value_type> { 22*349cc55cSDimitry Andric public: 23*349cc55cSDimitry Andric static size_t size(const SymbolLookupSet::value_type &V) { 24*349cc55cSDimitry Andric return SPSArgList<SPSString, bool>::size( 25*349cc55cSDimitry Andric *V.first, V.second == SymbolLookupFlags::RequiredSymbol); 26*349cc55cSDimitry Andric } 27*349cc55cSDimitry Andric 28*349cc55cSDimitry Andric static bool serialize(SPSOutputBuffer &OB, 29*349cc55cSDimitry Andric const SymbolLookupSet::value_type &V) { 30*349cc55cSDimitry Andric return SPSArgList<SPSString, bool>::serialize( 31*349cc55cSDimitry Andric OB, *V.first, V.second == SymbolLookupFlags::RequiredSymbol); 32*349cc55cSDimitry Andric } 33*349cc55cSDimitry Andric }; 34*349cc55cSDimitry Andric 35*349cc55cSDimitry Andric template <> 36*349cc55cSDimitry Andric class TrivialSPSSequenceSerialization<SPSRemoteSymbolLookupSetElement, 37*349cc55cSDimitry Andric SymbolLookupSet> { 38*349cc55cSDimitry Andric public: 39*349cc55cSDimitry Andric static constexpr bool available = true; 40*349cc55cSDimitry Andric }; 41*349cc55cSDimitry Andric 42*349cc55cSDimitry Andric template <> 43*349cc55cSDimitry Andric class SPSSerializationTraits<SPSRemoteSymbolLookup, 44*349cc55cSDimitry Andric ExecutorProcessControl::LookupRequest> { 45*349cc55cSDimitry Andric using MemberSerialization = 46*349cc55cSDimitry Andric SPSArgList<SPSExecutorAddr, SPSRemoteSymbolLookupSet>; 47*349cc55cSDimitry Andric 48*349cc55cSDimitry Andric public: 49*349cc55cSDimitry Andric static size_t size(const ExecutorProcessControl::LookupRequest &LR) { 50*349cc55cSDimitry Andric return MemberSerialization::size(ExecutorAddr(LR.Handle), LR.Symbols); 51*349cc55cSDimitry Andric } 52*349cc55cSDimitry Andric 53*349cc55cSDimitry Andric static bool serialize(SPSOutputBuffer &OB, 54*349cc55cSDimitry Andric const ExecutorProcessControl::LookupRequest &LR) { 55*349cc55cSDimitry Andric return MemberSerialization::serialize(OB, ExecutorAddr(LR.Handle), 56*349cc55cSDimitry Andric LR.Symbols); 57*349cc55cSDimitry Andric } 58*349cc55cSDimitry Andric }; 59*349cc55cSDimitry Andric 60*349cc55cSDimitry Andric } // end namespace shared 61*349cc55cSDimitry Andric 62*349cc55cSDimitry Andric Expected<EPCGenericDylibManager> 63*349cc55cSDimitry Andric EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols( 64*349cc55cSDimitry Andric ExecutorProcessControl &EPC) { 65*349cc55cSDimitry Andric SymbolAddrs SAs; 66*349cc55cSDimitry Andric if (auto Err = EPC.getBootstrapSymbols( 67*349cc55cSDimitry Andric {{SAs.Instance, rt::SimpleExecutorDylibManagerInstanceName}, 68*349cc55cSDimitry Andric {SAs.Open, rt::SimpleExecutorDylibManagerOpenWrapperName}, 69*349cc55cSDimitry Andric {SAs.Lookup, rt::SimpleExecutorDylibManagerLookupWrapperName}})) 70*349cc55cSDimitry Andric return std::move(Err); 71*349cc55cSDimitry Andric return EPCGenericDylibManager(EPC, std::move(SAs)); 72*349cc55cSDimitry Andric } 73*349cc55cSDimitry Andric 74*349cc55cSDimitry Andric Expected<tpctypes::DylibHandle> EPCGenericDylibManager::open(StringRef Path, 75*349cc55cSDimitry Andric uint64_t Mode) { 76*349cc55cSDimitry Andric Expected<tpctypes::DylibHandle> H(0); 77*349cc55cSDimitry Andric if (auto Err = 78*349cc55cSDimitry Andric EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerOpenSignature>( 79*349cc55cSDimitry Andric SAs.Open, H, SAs.Instance, Path, Mode)) 80*349cc55cSDimitry Andric return std::move(Err); 81*349cc55cSDimitry Andric return H; 82*349cc55cSDimitry Andric } 83*349cc55cSDimitry Andric 84*349cc55cSDimitry Andric Expected<std::vector<ExecutorAddr>> 85*349cc55cSDimitry Andric EPCGenericDylibManager::lookup(tpctypes::DylibHandle H, 86*349cc55cSDimitry Andric const SymbolLookupSet &Lookup) { 87*349cc55cSDimitry Andric Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>())); 88*349cc55cSDimitry Andric if (auto Err = 89*349cc55cSDimitry Andric EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>( 90*349cc55cSDimitry Andric SAs.Lookup, Result, SAs.Instance, H, Lookup)) 91*349cc55cSDimitry Andric return std::move(Err); 92*349cc55cSDimitry Andric return Result; 93*349cc55cSDimitry Andric } 94*349cc55cSDimitry Andric 95*349cc55cSDimitry Andric Expected<std::vector<ExecutorAddr>> 96*349cc55cSDimitry Andric EPCGenericDylibManager::lookup(tpctypes::DylibHandle H, 97*349cc55cSDimitry Andric const RemoteSymbolLookupSet &Lookup) { 98*349cc55cSDimitry Andric Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>())); 99*349cc55cSDimitry Andric if (auto Err = 100*349cc55cSDimitry Andric EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>( 101*349cc55cSDimitry Andric SAs.Lookup, Result, SAs.Instance, H, Lookup)) 102*349cc55cSDimitry Andric return std::move(Err); 103*349cc55cSDimitry Andric return Result; 104*349cc55cSDimitry Andric } 105*349cc55cSDimitry Andric 106*349cc55cSDimitry Andric } // end namespace orc 107*349cc55cSDimitry Andric } // end namespace llvm 108