| //===------- EPCGenericDylibManager.cpp -- Dylib management via EPC -------===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h" | 
 |  | 
 | #include "llvm/ExecutionEngine/Orc/Core.h" | 
 | #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h" | 
 | #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h" | 
 |  | 
 | namespace llvm { | 
 | namespace orc { | 
 | namespace shared { | 
 |  | 
 | template <> | 
 | class SPSSerializationTraits<SPSRemoteSymbolLookupSetElement, | 
 |                              SymbolLookupSet::value_type> { | 
 | public: | 
 |   static size_t size(const SymbolLookupSet::value_type &V) { | 
 |     return SPSArgList<SPSString, bool>::size( | 
 |         *V.first, V.second == SymbolLookupFlags::RequiredSymbol); | 
 |   } | 
 |  | 
 |   static bool serialize(SPSOutputBuffer &OB, | 
 |                         const SymbolLookupSet::value_type &V) { | 
 |     return SPSArgList<SPSString, bool>::serialize( | 
 |         OB, *V.first, V.second == SymbolLookupFlags::RequiredSymbol); | 
 |   } | 
 | }; | 
 |  | 
 | template <> | 
 | class TrivialSPSSequenceSerialization<SPSRemoteSymbolLookupSetElement, | 
 |                                       SymbolLookupSet> { | 
 | public: | 
 |   static constexpr bool available = true; | 
 | }; | 
 |  | 
 | template <> | 
 | class SPSSerializationTraits<SPSRemoteSymbolLookup, | 
 |                              ExecutorProcessControl::LookupRequest> { | 
 |   using MemberSerialization = | 
 |       SPSArgList<SPSExecutorAddr, SPSRemoteSymbolLookupSet>; | 
 |  | 
 | public: | 
 |   static size_t size(const ExecutorProcessControl::LookupRequest &LR) { | 
 |     return MemberSerialization::size(ExecutorAddr(LR.Handle), LR.Symbols); | 
 |   } | 
 |  | 
 |   static bool serialize(SPSOutputBuffer &OB, | 
 |                         const ExecutorProcessControl::LookupRequest &LR) { | 
 |     return MemberSerialization::serialize(OB, ExecutorAddr(LR.Handle), | 
 |                                           LR.Symbols); | 
 |   } | 
 | }; | 
 |  | 
 | } // end namespace shared | 
 |  | 
 | Expected<EPCGenericDylibManager> | 
 | EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols( | 
 |     ExecutorProcessControl &EPC) { | 
 |   SymbolAddrs SAs; | 
 |   if (auto Err = EPC.getBootstrapSymbols( | 
 |           {{SAs.Instance, rt::SimpleExecutorDylibManagerInstanceName}, | 
 |            {SAs.Open, rt::SimpleExecutorDylibManagerOpenWrapperName}, | 
 |            {SAs.Lookup, rt::SimpleExecutorDylibManagerLookupWrapperName}})) | 
 |     return std::move(Err); | 
 |   return EPCGenericDylibManager(EPC, std::move(SAs)); | 
 | } | 
 |  | 
 | Expected<tpctypes::DylibHandle> EPCGenericDylibManager::open(StringRef Path, | 
 |                                                              uint64_t Mode) { | 
 |   Expected<tpctypes::DylibHandle> H((ExecutorAddr())); | 
 |   if (auto Err = | 
 |           EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerOpenSignature>( | 
 |               SAs.Open, H, SAs.Instance, Path, Mode)) | 
 |     return std::move(Err); | 
 |   return H; | 
 | } | 
 |  | 
 | Expected<std::vector<ExecutorAddr>> | 
 | EPCGenericDylibManager::lookup(tpctypes::DylibHandle H, | 
 |                                const SymbolLookupSet &Lookup) { | 
 |   Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>())); | 
 |   if (auto Err = | 
 |           EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>( | 
 |               SAs.Lookup, Result, SAs.Instance, H, Lookup)) | 
 |     return std::move(Err); | 
 |   return Result; | 
 | } | 
 |  | 
 | Expected<std::vector<ExecutorAddr>> | 
 | EPCGenericDylibManager::lookup(tpctypes::DylibHandle H, | 
 |                                const RemoteSymbolLookupSet &Lookup) { | 
 |   Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>())); | 
 |   if (auto Err = | 
 |           EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>( | 
 |               SAs.Lookup, Result, SAs.Instance, H, Lookup)) | 
 |     return std::move(Err); | 
 |   return Result; | 
 | } | 
 |  | 
 | } // end namespace orc | 
 | } // end namespace llvm |