brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · 1f19d17 Raw
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