123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- //===------- EPCGenericDylibManager.cpp -- Dylib management via EPC -------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #include "llvm/ExecutionEngine/Orc/EPCGenericDylibManager.h"
- #include "llvm/ExecutionEngine/Orc/Core.h"
- #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
- #include "llvm/ExecutionEngine/Orc/Shared/SimpleRemoteEPCUtils.h"
- namespace llvm {
- namespace orc {
- namespace shared {
- template <>
- class SPSSerializationTraits<SPSRemoteSymbolLookupSetElement,
- SymbolLookupSet::value_type> {
- public:
- static size_t size(const SymbolLookupSet::value_type &V) {
- return SPSArgList<SPSString, bool>::size(
- *V.first, V.second == SymbolLookupFlags::RequiredSymbol);
- }
- static bool serialize(SPSOutputBuffer &OB,
- const SymbolLookupSet::value_type &V) {
- return SPSArgList<SPSString, bool>::serialize(
- OB, *V.first, V.second == SymbolLookupFlags::RequiredSymbol);
- }
- };
- template <>
- class TrivialSPSSequenceSerialization<SPSRemoteSymbolLookupSetElement,
- SymbolLookupSet> {
- public:
- static constexpr bool available = true;
- };
- template <>
- class SPSSerializationTraits<SPSRemoteSymbolLookup,
- ExecutorProcessControl::LookupRequest> {
- using MemberSerialization =
- SPSArgList<SPSExecutorAddr, SPSRemoteSymbolLookupSet>;
- public:
- static size_t size(const ExecutorProcessControl::LookupRequest &LR) {
- return MemberSerialization::size(ExecutorAddr(LR.Handle), LR.Symbols);
- }
- static bool serialize(SPSOutputBuffer &OB,
- const ExecutorProcessControl::LookupRequest &LR) {
- return MemberSerialization::serialize(OB, ExecutorAddr(LR.Handle),
- LR.Symbols);
- }
- };
- } // end namespace shared
- Expected<EPCGenericDylibManager>
- EPCGenericDylibManager::CreateWithDefaultBootstrapSymbols(
- ExecutorProcessControl &EPC) {
- SymbolAddrs SAs;
- if (auto Err = EPC.getBootstrapSymbols(
- {{SAs.Instance, rt::SimpleExecutorDylibManagerInstanceName},
- {SAs.Open, rt::SimpleExecutorDylibManagerOpenWrapperName},
- {SAs.Lookup, rt::SimpleExecutorDylibManagerLookupWrapperName}}))
- return std::move(Err);
- return EPCGenericDylibManager(EPC, std::move(SAs));
- }
- Expected<tpctypes::DylibHandle> EPCGenericDylibManager::open(StringRef Path,
- uint64_t Mode) {
- Expected<tpctypes::DylibHandle> H((ExecutorAddr()));
- if (auto Err =
- EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerOpenSignature>(
- SAs.Open, H, SAs.Instance, Path, Mode))
- return std::move(Err);
- return H;
- }
- Expected<std::vector<ExecutorAddr>>
- EPCGenericDylibManager::lookup(tpctypes::DylibHandle H,
- const SymbolLookupSet &Lookup) {
- Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>()));
- if (auto Err =
- EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>(
- SAs.Lookup, Result, SAs.Instance, H, Lookup))
- return std::move(Err);
- return Result;
- }
- Expected<std::vector<ExecutorAddr>>
- EPCGenericDylibManager::lookup(tpctypes::DylibHandle H,
- const RemoteSymbolLookupSet &Lookup) {
- Expected<std::vector<ExecutorAddr>> Result((std::vector<ExecutorAddr>()));
- if (auto Err =
- EPC.callSPSWrapper<rt::SPSSimpleExecutorDylibManagerLookupSignature>(
- SAs.Lookup, Result, SAs.Instance, H, Lookup))
- return std::move(Err);
- return Result;
- }
- } // end namespace orc
- } // end namespace llvm
|