Taints the non-acquire RMW's store address with the load part
[oota-llvm.git] / include / llvm / ExecutionEngine / Orc / OrcRemoteTargetRPCAPI.h
1 //===--- OrcRemoteTargetRPCAPI.h - Orc Remote-target RPC API ----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
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
12 // classes.
13 //
14 //===----------------------------------------------------------------------===//
15
16 #ifndef LLVM_EXECUTIONENGINE_ORC_ORCREMOTETARGETRPCAPI_H
17 #define LLVM_EXECUTIONENGINE_ORC_ORCREMOTETARGETRPCAPI_H
18
19 #include "JITSymbol.h"
20 #include "RPCChannel.h"
21 #include "RPCUtils.h"
22
23 namespace llvm {
24 namespace orc {
25 namespace remote {
26
27 class OrcRemoteTargetRPCAPI : public RPC<RPCChannel> {
28 protected:
29   class ResourceIdMgr {
30   public:
31     typedef uint64_t ResourceId;
32     ResourceIdMgr() : NextId(0) {}
33     ResourceId getNext() {
34       if (!FreeIds.empty()) {
35         ResourceId I = FreeIds.back();
36         FreeIds.pop_back();
37         return I;
38       }
39       return NextId++;
40     }
41     void release(ResourceId I) { FreeIds.push_back(I); }
42
43   private:
44     ResourceId NextId;
45     std::vector<ResourceId> FreeIds;
46   };
47
48 public:
49   enum JITProcId : uint32_t {
50     InvalidId = 0,
51     CallIntVoidId,
52     CallIntVoidResponseId,
53     CallMainId,
54     CallMainResponseId,
55     CallVoidVoidId,
56     CallVoidVoidResponseId,
57     CreateRemoteAllocatorId,
58     CreateIndirectStubsOwnerId,
59     DestroyRemoteAllocatorId,
60     DestroyIndirectStubsOwnerId,
61     EmitIndirectStubsId,
62     EmitIndirectStubsResponseId,
63     EmitResolverBlockId,
64     EmitTrampolineBlockId,
65     EmitTrampolineBlockResponseId,
66     GetSymbolAddressId,
67     GetSymbolAddressResponseId,
68     GetRemoteInfoId,
69     GetRemoteInfoResponseId,
70     ReadMemId,
71     ReadMemResponseId,
72     ReserveMemId,
73     ReserveMemResponseId,
74     RequestCompileId,
75     RequestCompileResponseId,
76     SetProtectionsId,
77     TerminateSessionId,
78     WriteMemId,
79     WritePtrId
80   };
81
82   static const char *getJITProcIdName(JITProcId Id);
83
84   typedef Procedure<CallIntVoidId, TargetAddress /* FnAddr */> CallIntVoid;
85
86   typedef Procedure<CallIntVoidResponseId, int /* Result */>
87       CallIntVoidResponse;
88
89   typedef Procedure<CallMainId, TargetAddress /* FnAddr */,
90                     std::vector<std::string> /* Args */>
91       CallMain;
92
93   typedef Procedure<CallMainResponseId, int /* Result */> CallMainResponse;
94
95   typedef Procedure<CallVoidVoidId, TargetAddress /* FnAddr */> CallVoidVoid;
96
97   typedef Procedure<CallVoidVoidResponseId> CallVoidVoidResponse;
98
99   typedef Procedure<CreateRemoteAllocatorId,
100                     ResourceIdMgr::ResourceId /* Allocator ID */>
101       CreateRemoteAllocator;
102
103   typedef Procedure<CreateIndirectStubsOwnerId,
104                     ResourceIdMgr::ResourceId /* StubsOwner ID */>
105       CreateIndirectStubsOwner;
106
107   typedef Procedure<DestroyRemoteAllocatorId,
108                     ResourceIdMgr::ResourceId /* Allocator ID */>
109       DestroyRemoteAllocator;
110
111   typedef Procedure<DestroyIndirectStubsOwnerId,
112                     ResourceIdMgr::ResourceId /* StubsOwner ID */>
113       DestroyIndirectStubsOwner;
114
115   typedef Procedure<EmitIndirectStubsId,
116                     ResourceIdMgr::ResourceId /* StubsOwner ID */,
117                     uint32_t /* NumStubsRequired */>
118       EmitIndirectStubs;
119
120   typedef Procedure<
121       EmitIndirectStubsResponseId, TargetAddress /* StubsBaseAddr */,
122       TargetAddress /* PtrsBaseAddr */, uint32_t /* NumStubsEmitted */>
123       EmitIndirectStubsResponse;
124
125   typedef Procedure<EmitResolverBlockId> EmitResolverBlock;
126
127   typedef Procedure<EmitTrampolineBlockId> EmitTrampolineBlock;
128
129   typedef Procedure<EmitTrampolineBlockResponseId,
130                     TargetAddress /* BlockAddr */,
131                     uint32_t /* NumTrampolines */>
132       EmitTrampolineBlockResponse;
133
134   typedef Procedure<GetSymbolAddressId, std::string /*SymbolName*/>
135       GetSymbolAddress;
136
137   typedef Procedure<GetSymbolAddressResponseId, uint64_t /* SymbolAddr */>
138       GetSymbolAddressResponse;
139
140   typedef Procedure<GetRemoteInfoId> GetRemoteInfo;
141
142   typedef Procedure<GetRemoteInfoResponseId, std::string /* Triple */,
143                     uint32_t /* PointerSize */, uint32_t /* PageSize */,
144                     uint32_t /* TrampolineSize */,
145                     uint32_t /* IndirectStubSize */>
146       GetRemoteInfoResponse;
147
148   typedef Procedure<ReadMemId, TargetAddress /* Src */, uint64_t /* Size */>
149       ReadMem;
150
151   typedef Procedure<ReadMemResponseId> ReadMemResponse;
152
153   typedef Procedure<ReserveMemId, ResourceIdMgr::ResourceId /* Id */,
154                     uint64_t /* Size */, uint32_t /* Align */>
155       ReserveMem;
156
157   typedef Procedure<ReserveMemResponseId, TargetAddress /* Addr */>
158       ReserveMemResponse;
159
160   typedef Procedure<RequestCompileId, TargetAddress /* TrampolineAddr */>
161       RequestCompile;
162
163   typedef Procedure<RequestCompileResponseId, TargetAddress /* ImplAddr */>
164       RequestCompileResponse;
165
166   typedef Procedure<SetProtectionsId, ResourceIdMgr::ResourceId /* Id */,
167                     TargetAddress /* Dst */, uint32_t /* ProtFlags */>
168       SetProtections;
169
170   typedef Procedure<TerminateSessionId> TerminateSession;
171
172   typedef Procedure<WriteMemId, TargetAddress /* Dst */, uint64_t /* Size */
173                     /* Data should follow */>
174       WriteMem;
175
176   typedef Procedure<WritePtrId, TargetAddress /* Dst */,
177                     TargetAddress /* Val */>
178       WritePtr;
179 };
180
181 } // end namespace remote
182 } // end namespace orc
183 } // end namespace llvm
184
185 #endif