1 //===--- OrcRemoteTargetRPCAPI.h - Orc Remote-target RPC API ----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the Orc remote-target RPC API. It should not be used
11 // directly, but is used by the RemoteTargetClient and RemoteTargetServer
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_EXECUTIONENGINE_ORC_ORCREMOTETARGETRPCAPI_H
17 #define LLVM_EXECUTIONENGINE_ORC_ORCREMOTETARGETRPCAPI_H
20 #include "RawByteChannel.h"
21 #include "llvm/ExecutionEngine/JITSymbol.h"
27 class DirectBufferWriter {
29 DirectBufferWriter() = default;
30 DirectBufferWriter(const char *Src, JITTargetAddress Dst, uint64_t Size)
31 : Src(Src), Dst(Dst), Size(Size) {}
33 const char *getSrc() const { return Src; }
34 JITTargetAddress getDst() const { return Dst; }
35 uint64_t getSize() const { return Size; }
43 } // end namespace remote
47 template <> class RPCTypeName<remote::DirectBufferWriter> {
49 static const char *getName() { return "DirectBufferWriter"; }
52 template <typename ChannelT>
53 class SerializationTraits<
54 ChannelT, remote::DirectBufferWriter, remote::DirectBufferWriter,
55 typename std::enable_if<
56 std::is_base_of<RawByteChannel, ChannelT>::value>::type> {
58 static Error serialize(ChannelT &C, const remote::DirectBufferWriter &DBW) {
59 if (auto EC = serializeSeq(C, DBW.getDst()))
61 if (auto EC = serializeSeq(C, DBW.getSize()))
63 return C.appendBytes(DBW.getSrc(), DBW.getSize());
66 static Error deserialize(ChannelT &C, remote::DirectBufferWriter &DBW) {
68 if (auto EC = deserializeSeq(C, Dst))
71 if (auto EC = deserializeSeq(C, Size))
73 char *Addr = reinterpret_cast<char *>(static_cast<uintptr_t>(Dst));
75 DBW = remote::DirectBufferWriter(0, Dst, Size);
77 return C.readBytes(Addr, Size);
81 } // end namespace rpc
85 class OrcRemoteTargetRPCAPI
86 : public rpc::SingleThreadedRPCEndpoint<rpc::RawByteChannel> {
90 typedef uint64_t ResourceId;
91 static const ResourceId InvalidId = ~0U;
93 ResourceId getNext() {
94 if (!FreeIds.empty()) {
95 ResourceId I = FreeIds.back();
101 void release(ResourceId I) { FreeIds.push_back(I); }
104 ResourceId NextId = 0;
105 std::vector<ResourceId> FreeIds;
109 // FIXME: Remove constructors once MSVC supports synthesizing move-ops.
110 OrcRemoteTargetRPCAPI(rpc::RawByteChannel &C)
111 : rpc::SingleThreadedRPCEndpoint<rpc::RawByteChannel>(C, true) {}
114 : public rpc::Function<CallIntVoid, int32_t(JITTargetAddress Addr)> {
116 static const char *getName() { return "CallIntVoid"; }
120 : public rpc::Function<CallMain, int32_t(JITTargetAddress Addr,
121 std::vector<std::string> Args)> {
123 static const char *getName() { return "CallMain"; }
127 : public rpc::Function<CallVoidVoid, void(JITTargetAddress FnAddr)> {
129 static const char *getName() { return "CallVoidVoid"; }
132 class CreateRemoteAllocator
133 : public rpc::Function<CreateRemoteAllocator,
134 void(ResourceIdMgr::ResourceId AllocatorID)> {
136 static const char *getName() { return "CreateRemoteAllocator"; }
139 class CreateIndirectStubsOwner
140 : public rpc::Function<CreateIndirectStubsOwner,
141 void(ResourceIdMgr::ResourceId StubOwnerID)> {
143 static const char *getName() { return "CreateIndirectStubsOwner"; }
146 class DeregisterEHFrames
147 : public rpc::Function<DeregisterEHFrames,
148 void(JITTargetAddress Addr, uint32_t Size)> {
150 static const char *getName() { return "DeregisterEHFrames"; }
153 class DestroyRemoteAllocator
154 : public rpc::Function<DestroyRemoteAllocator,
155 void(ResourceIdMgr::ResourceId AllocatorID)> {
157 static const char *getName() { return "DestroyRemoteAllocator"; }
160 class DestroyIndirectStubsOwner
161 : public rpc::Function<DestroyIndirectStubsOwner,
162 void(ResourceIdMgr::ResourceId StubsOwnerID)> {
164 static const char *getName() { return "DestroyIndirectStubsOwner"; }
167 /// EmitIndirectStubs result is (StubsBase, PtrsBase, NumStubsEmitted).
168 class EmitIndirectStubs
169 : public rpc::Function<
171 std::tuple<JITTargetAddress, JITTargetAddress, uint32_t>(
172 ResourceIdMgr::ResourceId StubsOwnerID,
173 uint32_t NumStubsRequired)> {
175 static const char *getName() { return "EmitIndirectStubs"; }
178 class EmitResolverBlock : public rpc::Function<EmitResolverBlock, void()> {
180 static const char *getName() { return "EmitResolverBlock"; }
183 /// EmitTrampolineBlock result is (BlockAddr, NumTrampolines).
184 class EmitTrampolineBlock
185 : public rpc::Function<EmitTrampolineBlock,
186 std::tuple<JITTargetAddress, uint32_t>()> {
188 static const char *getName() { return "EmitTrampolineBlock"; }
191 class GetSymbolAddress
192 : public rpc::Function<GetSymbolAddress,
193 JITTargetAddress(std::string SymbolName)> {
195 static const char *getName() { return "GetSymbolAddress"; }
198 /// GetRemoteInfo result is (Triple, PointerSize, PageSize, TrampolineSize,
199 /// IndirectStubsSize).
201 : public rpc::Function<
203 std::tuple<std::string, uint32_t, uint32_t, uint32_t, uint32_t>()> {
205 static const char *getName() { return "GetRemoteInfo"; }
209 : public rpc::Function<ReadMem, std::vector<uint8_t>(JITTargetAddress Src,
212 static const char *getName() { return "ReadMem"; }
215 class RegisterEHFrames
216 : public rpc::Function<RegisterEHFrames,
217 void(JITTargetAddress Addr, uint32_t Size)> {
219 static const char *getName() { return "RegisterEHFrames"; }
223 : public rpc::Function<ReserveMem,
224 JITTargetAddress(ResourceIdMgr::ResourceId AllocID,
225 uint64_t Size, uint32_t Align)> {
227 static const char *getName() { return "ReserveMem"; }
231 : public rpc::Function<
232 RequestCompile, JITTargetAddress(JITTargetAddress TrampolineAddr)> {
234 static const char *getName() { return "RequestCompile"; }
238 : public rpc::Function<SetProtections,
239 void(ResourceIdMgr::ResourceId AllocID,
240 JITTargetAddress Dst, uint32_t ProtFlags)> {
242 static const char *getName() { return "SetProtections"; }
245 class TerminateSession : public rpc::Function<TerminateSession, void()> {
247 static const char *getName() { return "TerminateSession"; }
251 : public rpc::Function<WriteMem, void(remote::DirectBufferWriter DB)> {
253 static const char *getName() { return "WriteMem"; }
256 class WritePtr : public rpc::Function<WritePtr, void(JITTargetAddress Dst,
257 JITTargetAddress Val)> {
259 static const char *getName() { return "WritePtr"; }
263 } // end namespace remote
264 } // end namespace orc
265 } // end namespace llvm