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