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