Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/EPCGenericDylibManager.cpp
35266 views
//===------- EPCGenericDylibManager.cpp -- Dylib management via EPC -------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h"910#include "llvm/ExecutionEngine/Orc/Core.h"11#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"12#include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h"1314namespace llvm {15namespace orc {16namespace shared {1718template <>19class SPSSerializationTraits<SPSRemoteSymbolLookupSetElement,20SymbolLookupSet::value_type> {21public:22static size_t size(const SymbolLookupSet::value_type &V) {23return SPSArgList<SPSString, bool>::size(24*V.first, V.second == SymbolLookupFlags::RequiredSymbol);25}2627static bool serialize(SPSOutputBuffer &OB,28const SymbolLookupSet::value_type &V) {29return SPSArgList<SPSString, bool>::serialize(30OB, *V.first, V.second == SymbolLookupFlags::RequiredSymbol);31}32};3334template <>35class TrivialSPSSequenceSerialization<SPSRemoteSymbolLookupSetElement,36SymbolLookupSet> {37public:38static constexpr bool available = true;39};4041template <>42class SPSSerializationTraits<SPSRemoteSymbolLookup,43ExecutorProcessControl::LookupRequest> {44using MemberSerialization =45SPSArgList<SPSExecutorAddr, SPSRemoteSymbolLookupSet>;4647public:48static size_t size(const ExecutorProcessControl::LookupRequest &LR) {49return MemberSerialization::size(ExecutorAddr(LR.Handle), LR.Symbols);50}5152static bool serialize(SPSOutputBuffer &OB,53const ExecutorProcessControl::LookupRequest &LR) {54return MemberSerialization::serialize(OB, ExecutorAddr(LR.Handle),55LR.Symbols);56}57};5859} // end namespace shared6061Expected<EPCGenericDylibManager>62EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols(63ExecutorProcessControl &EPC) {64SymbolAddrs SAs;65if (auto Err = EPC.getBootstrapSymbols(66{{SAs.Instance, rt::SimpleExecutorDylibManagerInstanceName},67{SAs.Open, rt::SimpleExecutorDylibManagerOpenWrapperName},68{SAs.Lookup, rt::SimpleExecutorDylibManagerLookupWrapperName}}))69return std::move(Err);70return EPCGenericDylibManager(EPC, std::move(SAs));71}7273Expected<tpctypes::DylibHandle> EPCGenericDylibManager::open(StringRef Path,74uint64_t Mode) {75Expected<tpctypes::DylibHandle> H((ExecutorAddr()));76if (auto Err =77EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerOpenSignature>(78SAs.Open, H, SAs.Instance, Path, Mode))79return std::move(Err);80return H;81}8283void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H,84const SymbolLookupSet &Lookup,85SymbolLookupCompleteFn Complete) {86EPC.callSPSWrapperAsync<rt::SPSSimpleExecutorDylibManagerLookupSignature>(87SAs.Lookup,88[Complete = std::move(Complete)](89Error SerializationErr,90Expected<std::vector<ExecutorSymbolDef>> Result) mutable {91if (SerializationErr) {92cantFail(Result.takeError());93Complete(std::move(SerializationErr));94return;95}96Complete(std::move(Result));97},98SAs.Instance, H, Lookup);99}100101void EPCGenericDylibManager::lookupAsync(tpctypes::DylibHandle H,102const RemoteSymbolLookupSet &Lookup,103SymbolLookupCompleteFn Complete) {104EPC.callSPSWrapperAsync<rt::SPSSimpleExecutorDylibManagerLookupSignature>(105SAs.Lookup,106[Complete = std::move(Complete)](107Error SerializationErr,108Expected<std::vector<ExecutorSymbolDef>> Result) mutable {109if (SerializationErr) {110cantFail(Result.takeError());111Complete(std::move(SerializationErr));112return;113}114Complete(std::move(Result));115},116SAs.Instance, H, Lookup);117}118119} // end namespace orc120} // end namespace llvm121122123