124 lines · cpp
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-exception6//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 DylibManager::LookupRequest> {45 using MemberSerialization =46 SPSArgList<SPSExecutorAddr, SPSRemoteSymbolLookupSet>;47 48public:49 static size_t size(const DylibManager::LookupRequest &LR) {50 return MemberSerialization::size(ExecutorAddr(LR.Handle), LR.Symbols);51 }52 53 static bool serialize(SPSOutputBuffer &OB,54 const DylibManager::LookupRequest &LR) {55 return MemberSerialization::serialize(OB, ExecutorAddr(LR.Handle),56 LR.Symbols);57 }58};59 60} // end namespace shared61 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.Resolve, rt::SimpleExecutorDylibManagerResolveWrapperName}}))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 84void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H,85 const SymbolLookupSet &Lookup,86 SymbolLookupCompleteFn Complete) {87 EPC.callSPSWrapperAsync<rt::SPSSimpleExecutorDylibManagerResolveSignature>(88 SAs.Resolve,89 [Complete = std::move(Complete)](90 Error SerializationErr,91 Expected<std::vector<std::optional<ExecutorSymbolDef>>>92 Result) mutable {93 if (SerializationErr) {94 cantFail(Result.takeError());95 Complete(std::move(SerializationErr));96 return;97 }98 Complete(std::move(Result));99 },100 H, Lookup);101}102 103void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H,104 const RemoteSymbolLookupSet &Lookup,105 SymbolLookupCompleteFn Complete) {106 EPC.callSPSWrapperAsync<rt::SPSSimpleExecutorDylibManagerResolveSignature>(107 SAs.Resolve,108 [Complete = std::move(Complete)](109 Error SerializationErr,110 Expected<std::vector<std::optional<ExecutorSymbolDef>>>111 Result) mutable {112 if (SerializationErr) {113 cantFail(Result.takeError());114 Complete(std::move(SerializationErr));115 return;116 }117 Complete(std::move(Result));118 },119 H, Lookup);120}121 122} // end namespace orc123} // end namespace llvm124