
Updates tpctypes::DylibHandle to be an ExecutorAddr (rather than a uint64_t), and SimpleExecutorDylibManager to hold and return raw OS handle values (as ExecutorAddrs) rather than index values into a map of DynamicLibrary instances. This will allow clients to use EPCGenericDylibManager in contexts where the existing DynamicLibrary interface is too limited to be used. (e.g. to look up JIT symbols in a dylib that was loaded with RTLD_LOCAL).
108 lines
3.8 KiB
C++
108 lines
3.8 KiB
C++
//===------- 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
|