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
19 #include "JITSymbol.h"
20 #include "RPCChannel.h"
27 class DirectBufferWriter {
29 DirectBufferWriter() = default;
30 DirectBufferWriter(const char *Src, TargetAddress Dst, uint64_t Size)
31 : Src(Src), Dst(Dst), Size(Size) {}
33 const char *getSrc() const { return Src; }
34 TargetAddress getDst() const { return Dst; }
35 uint64_t getSize() const { return Size; }
43 inline Error serialize(RPCChannel &C, const DirectBufferWriter &DBW) {
44 if (auto EC = serialize(C, DBW.getDst()))
46 if (auto EC = serialize(C, DBW.getSize()))
48 return C.appendBytes(DBW.getSrc(), DBW.getSize());
51 inline Error deserialize(RPCChannel &C, DirectBufferWriter &DBW) {
53 if (auto EC = deserialize(C, Dst))
56 if (auto EC = deserialize(C, Size))
58 char *Addr = reinterpret_cast<char *>(static_cast<uintptr_t>(Dst));
60 DBW = DirectBufferWriter(0, Dst, Size);
62 return C.readBytes(Addr, Size);
65 class OrcRemoteTargetRPCAPI : public RPC<RPCChannel> {
69 typedef uint64_t ResourceId;
70 static const ResourceId InvalidId = ~0U;
72 ResourceId getNext() {
73 if (!FreeIds.empty()) {
74 ResourceId I = FreeIds.back();
80 void release(ResourceId I) { FreeIds.push_back(I); }
83 ResourceId NextId = 0;
84 std::vector<ResourceId> FreeIds;
88 // FIXME: Remove constructors once MSVC supports synthesizing move-ops.
89 OrcRemoteTargetRPCAPI() = default;
90 OrcRemoteTargetRPCAPI(const OrcRemoteTargetRPCAPI &) = delete;
91 OrcRemoteTargetRPCAPI &operator=(const OrcRemoteTargetRPCAPI &) = delete;
93 OrcRemoteTargetRPCAPI(OrcRemoteTargetRPCAPI &&) {}
94 OrcRemoteTargetRPCAPI &operator=(OrcRemoteTargetRPCAPI &&) { return *this; }
96 enum JITFuncId : uint32_t {
97 InvalidId = RPCFunctionIdTraits<JITFuncId>::InvalidId,
98 CallIntVoidId = RPCFunctionIdTraits<JITFuncId>::FirstValidId,
101 CreateRemoteAllocatorId,
102 CreateIndirectStubsOwnerId,
103 DeregisterEHFramesId,
104 DestroyRemoteAllocatorId,
105 DestroyIndirectStubsOwnerId,
108 EmitTrampolineBlockId,
121 static const char *getJITFuncIdName(JITFuncId Id);
123 typedef Function<CallIntVoidId, int32_t(TargetAddress Addr)> CallIntVoid;
125 typedef Function<CallMainId,
126 int32_t(TargetAddress Addr, std::vector<std::string> Args)>
129 typedef Function<CallVoidVoidId, void(TargetAddress FnAddr)> CallVoidVoid;
131 typedef Function<CreateRemoteAllocatorId,
132 void(ResourceIdMgr::ResourceId AllocatorID)>
133 CreateRemoteAllocator;
135 typedef Function<CreateIndirectStubsOwnerId,
136 void(ResourceIdMgr::ResourceId StubOwnerID)>
137 CreateIndirectStubsOwner;
139 typedef Function<DeregisterEHFramesId,
140 void(TargetAddress Addr, uint32_t Size)>
143 typedef Function<DestroyRemoteAllocatorId,
144 void(ResourceIdMgr::ResourceId AllocatorID)>
145 DestroyRemoteAllocator;
147 typedef Function<DestroyIndirectStubsOwnerId,
148 void(ResourceIdMgr::ResourceId StubsOwnerID)>
149 DestroyIndirectStubsOwner;
151 /// EmitIndirectStubs result is (StubsBase, PtrsBase, NumStubsEmitted).
152 typedef Function<EmitIndirectStubsId,
153 std::tuple<TargetAddress, TargetAddress, uint32_t>(
154 ResourceIdMgr::ResourceId StubsOwnerID,
155 uint32_t NumStubsRequired)>
158 typedef Function<EmitResolverBlockId, void()> EmitResolverBlock;
160 /// EmitTrampolineBlock result is (BlockAddr, NumTrampolines).
161 typedef Function<EmitTrampolineBlockId, std::tuple<TargetAddress, uint32_t>()>
164 typedef Function<GetSymbolAddressId, TargetAddress(std::string SymbolName)>
167 /// GetRemoteInfo result is (Triple, PointerSize, PageSize, TrampolineSize,
168 /// IndirectStubsSize).
169 typedef Function<GetRemoteInfoId, std::tuple<std::string, uint32_t, uint32_t,
170 uint32_t, uint32_t>()>
173 typedef Function<ReadMemId,
174 std::vector<char>(TargetAddress Src, uint64_t Size)>
177 typedef Function<RegisterEHFramesId, void(TargetAddress Addr, uint32_t Size)>
180 typedef Function<ReserveMemId,
181 TargetAddress(ResourceIdMgr::ResourceId AllocID,
182 uint64_t Size, uint32_t Align)>
185 typedef Function<RequestCompileId,
186 TargetAddress(TargetAddress TrampolineAddr)>
189 typedef Function<SetProtectionsId,
190 void(ResourceIdMgr::ResourceId AllocID, TargetAddress Dst,
194 typedef Function<TerminateSessionId, void()> TerminateSession;
196 typedef Function<WriteMemId, void(DirectBufferWriter DB)> WriteMem;
198 typedef Function<WritePtrId, void(TargetAddress Dst, TargetAddress Val)>
202 } // end namespace remote
203 } // end namespace orc
204 } // end namespace llvm