1e8d8bef9SDimitry Andric //===--- TargetProcessControlTypes.h -- Shared Core/TPC types ---*- C++ -*-===//
2e8d8bef9SDimitry Andric //
3e8d8bef9SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e8d8bef9SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e8d8bef9SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e8d8bef9SDimitry Andric //
7e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===//
8e8d8bef9SDimitry Andric //
9e8d8bef9SDimitry Andric // TargetProcessControl types that are used by both the Orc and
10e8d8bef9SDimitry Andric // OrcTargetProcess libraries.
11e8d8bef9SDimitry Andric //
12e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===//
13e8d8bef9SDimitry Andric 
14e8d8bef9SDimitry Andric #ifndef LLVM_EXECUTIONENGINE_ORC_SHARED_TARGETPROCESSCONTROLTYPES_H
15e8d8bef9SDimitry Andric #define LLVM_EXECUTIONENGINE_ORC_SHARED_TARGETPROCESSCONTROLTYPES_H
16e8d8bef9SDimitry Andric 
17e8d8bef9SDimitry Andric #include "llvm/ADT/ArrayRef.h"
18e8d8bef9SDimitry Andric #include "llvm/ADT/StringRef.h"
19e8d8bef9SDimitry Andric #include "llvm/ExecutionEngine/JITSymbol.h"
2004eeddc0SDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/AllocationActions.h"
21349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
22*1db9f3b2SDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/ExecutorSymbolDef.h"
23bdd1243dSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/MemoryFlags.h"
24349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h"
25349cc55cSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/WrapperFunctionUtils.h"
26349cc55cSDimitry Andric #include "llvm/Support/Memory.h"
27e8d8bef9SDimitry Andric 
28e8d8bef9SDimitry Andric #include <vector>
29e8d8bef9SDimitry Andric 
30e8d8bef9SDimitry Andric namespace llvm {
31e8d8bef9SDimitry Andric namespace orc {
32e8d8bef9SDimitry Andric namespace tpctypes {
33e8d8bef9SDimitry Andric 
3406c3fb27SDimitry Andric struct RemoteAllocGroup {
3506c3fb27SDimitry Andric   RemoteAllocGroup() = default;
RemoteAllocGroupRemoteAllocGroup3606c3fb27SDimitry Andric   RemoteAllocGroup(MemProt Prot) : Prot(Prot) {}
RemoteAllocGroupRemoteAllocGroup3706c3fb27SDimitry Andric   RemoteAllocGroup(MemProt Prot, bool FinalizeLifetime)
3806c3fb27SDimitry Andric       : Prot(Prot), FinalizeLifetime(FinalizeLifetime) {}
RemoteAllocGroupRemoteAllocGroup3906c3fb27SDimitry Andric   RemoteAllocGroup(const AllocGroup &AG) : Prot(AG.getMemProt()) {
405f757f3fSDimitry Andric     assert(AG.getMemLifetime() != orc::MemLifetime::NoAlloc &&
4106c3fb27SDimitry Andric            "Cannot use no-alloc memory in a remote alloc request");
425f757f3fSDimitry Andric     FinalizeLifetime = AG.getMemLifetime() == orc::MemLifetime::Finalize;
4306c3fb27SDimitry Andric   }
4406c3fb27SDimitry Andric 
4506c3fb27SDimitry Andric   MemProt Prot;
4606c3fb27SDimitry Andric   bool FinalizeLifetime = false;
4706c3fb27SDimitry Andric };
4806c3fb27SDimitry Andric 
49349cc55cSDimitry Andric struct SegFinalizeRequest {
5006c3fb27SDimitry Andric   RemoteAllocGroup RAG;
51349cc55cSDimitry Andric   ExecutorAddr Addr;
52349cc55cSDimitry Andric   uint64_t Size;
53349cc55cSDimitry Andric   ArrayRef<char> Content;
54349cc55cSDimitry Andric };
55349cc55cSDimitry Andric 
56349cc55cSDimitry Andric struct FinalizeRequest {
57349cc55cSDimitry Andric   std::vector<SegFinalizeRequest> Segments;
5804eeddc0SDimitry Andric   shared::AllocActions Actions;
59349cc55cSDimitry Andric };
60349cc55cSDimitry Andric 
61fcaf7f86SDimitry Andric struct SharedMemorySegFinalizeRequest {
6206c3fb27SDimitry Andric   RemoteAllocGroup RAG;
63fcaf7f86SDimitry Andric   ExecutorAddr Addr;
64fcaf7f86SDimitry Andric   uint64_t Size;
65fcaf7f86SDimitry Andric };
66fcaf7f86SDimitry Andric 
67fcaf7f86SDimitry Andric struct SharedMemoryFinalizeRequest {
68fcaf7f86SDimitry Andric   std::vector<SharedMemorySegFinalizeRequest> Segments;
69fcaf7f86SDimitry Andric   shared::AllocActions Actions;
70fcaf7f86SDimitry Andric };
71fcaf7f86SDimitry Andric 
72e8d8bef9SDimitry Andric template <typename T> struct UIntWrite {
73e8d8bef9SDimitry Andric   UIntWrite() = default;
UIntWriteUIntWrite74349cc55cSDimitry Andric   UIntWrite(ExecutorAddr Addr, T Value) : Addr(Addr), Value(Value) {}
75e8d8bef9SDimitry Andric 
76349cc55cSDimitry Andric   ExecutorAddr Addr;
77e8d8bef9SDimitry Andric   T Value = 0;
78e8d8bef9SDimitry Andric };
79e8d8bef9SDimitry Andric 
80e8d8bef9SDimitry Andric /// Describes a write to a uint8_t.
81e8d8bef9SDimitry Andric using UInt8Write = UIntWrite<uint8_t>;
82e8d8bef9SDimitry Andric 
83e8d8bef9SDimitry Andric /// Describes a write to a uint16_t.
84e8d8bef9SDimitry Andric using UInt16Write = UIntWrite<uint16_t>;
85e8d8bef9SDimitry Andric 
86e8d8bef9SDimitry Andric /// Describes a write to a uint32_t.
87e8d8bef9SDimitry Andric using UInt32Write = UIntWrite<uint32_t>;
88e8d8bef9SDimitry Andric 
89e8d8bef9SDimitry Andric /// Describes a write to a uint64_t.
90e8d8bef9SDimitry Andric using UInt64Write = UIntWrite<uint64_t>;
91e8d8bef9SDimitry Andric 
92e8d8bef9SDimitry Andric /// Describes a write to a buffer.
93e8d8bef9SDimitry Andric /// For use with TargetProcessControl::MemoryAccess objects.
94e8d8bef9SDimitry Andric struct BufferWrite {
95e8d8bef9SDimitry Andric   BufferWrite() = default;
BufferWriteBufferWrite96349cc55cSDimitry Andric   BufferWrite(ExecutorAddr Addr, StringRef Buffer)
97349cc55cSDimitry Andric       : Addr(Addr), Buffer(Buffer) {}
98e8d8bef9SDimitry Andric 
99349cc55cSDimitry Andric   ExecutorAddr Addr;
100e8d8bef9SDimitry Andric   StringRef Buffer;
101e8d8bef9SDimitry Andric };
102e8d8bef9SDimitry Andric 
1035f757f3fSDimitry Andric /// Describes a write to a pointer.
1045f757f3fSDimitry Andric /// For use with TargetProcessControl::MemoryAccess objects.
1055f757f3fSDimitry Andric struct PointerWrite {
1065f757f3fSDimitry Andric   PointerWrite() = default;
PointerWritePointerWrite1075f757f3fSDimitry Andric   PointerWrite(ExecutorAddr Addr, ExecutorAddr Value)
1085f757f3fSDimitry Andric       : Addr(Addr), Value(Value) {}
1095f757f3fSDimitry Andric 
1105f757f3fSDimitry Andric   ExecutorAddr Addr;
1115f757f3fSDimitry Andric   ExecutorAddr Value;
1125f757f3fSDimitry Andric };
1135f757f3fSDimitry Andric 
114e8d8bef9SDimitry Andric /// A handle used to represent a loaded dylib in the target process.
115bdd1243dSDimitry Andric using DylibHandle = ExecutorAddr;
116e8d8bef9SDimitry Andric 
117*1db9f3b2SDimitry Andric using LookupResult = std::vector<ExecutorSymbolDef>;
118e8d8bef9SDimitry Andric 
119e8d8bef9SDimitry Andric } // end namespace tpctypes
120349cc55cSDimitry Andric 
121349cc55cSDimitry Andric namespace shared {
122349cc55cSDimitry Andric 
12306c3fb27SDimitry Andric class SPSRemoteAllocGroup;
124349cc55cSDimitry Andric 
125349cc55cSDimitry Andric using SPSSegFinalizeRequest =
12606c3fb27SDimitry Andric     SPSTuple<SPSRemoteAllocGroup, SPSExecutorAddr, uint64_t, SPSSequence<char>>;
127349cc55cSDimitry Andric 
128349cc55cSDimitry Andric using SPSFinalizeRequest = SPSTuple<SPSSequence<SPSSegFinalizeRequest>,
12904eeddc0SDimitry Andric                                     SPSSequence<SPSAllocActionCallPair>>;
130349cc55cSDimitry Andric 
131fcaf7f86SDimitry Andric using SPSSharedMemorySegFinalizeRequest =
13206c3fb27SDimitry Andric     SPSTuple<SPSRemoteAllocGroup, SPSExecutorAddr, uint64_t>;
133fcaf7f86SDimitry Andric 
134fcaf7f86SDimitry Andric using SPSSharedMemoryFinalizeRequest =
135fcaf7f86SDimitry Andric     SPSTuple<SPSSequence<SPSSharedMemorySegFinalizeRequest>,
136fcaf7f86SDimitry Andric              SPSSequence<SPSAllocActionCallPair>>;
137fcaf7f86SDimitry Andric 
138349cc55cSDimitry Andric template <typename T>
139349cc55cSDimitry Andric using SPSMemoryAccessUIntWrite = SPSTuple<SPSExecutorAddr, T>;
140349cc55cSDimitry Andric 
141349cc55cSDimitry Andric using SPSMemoryAccessUInt8Write = SPSMemoryAccessUIntWrite<uint8_t>;
142349cc55cSDimitry Andric using SPSMemoryAccessUInt16Write = SPSMemoryAccessUIntWrite<uint16_t>;
143349cc55cSDimitry Andric using SPSMemoryAccessUInt32Write = SPSMemoryAccessUIntWrite<uint32_t>;
144349cc55cSDimitry Andric using SPSMemoryAccessUInt64Write = SPSMemoryAccessUIntWrite<uint64_t>;
145349cc55cSDimitry Andric 
146349cc55cSDimitry Andric using SPSMemoryAccessBufferWrite = SPSTuple<SPSExecutorAddr, SPSSequence<char>>;
1475f757f3fSDimitry Andric using SPSMemoryAccessPointerWrite = SPSTuple<SPSExecutorAddr, SPSExecutorAddr>;
148349cc55cSDimitry Andric 
14906c3fb27SDimitry Andric template <>
15006c3fb27SDimitry Andric class SPSSerializationTraits<SPSRemoteAllocGroup, tpctypes::RemoteAllocGroup> {
151bdd1243dSDimitry Andric   enum WireBits {
152bdd1243dSDimitry Andric     ReadBit = 1 << 0,
153bdd1243dSDimitry Andric     WriteBit = 1 << 1,
154bdd1243dSDimitry Andric     ExecBit = 1 << 2,
155bdd1243dSDimitry Andric     FinalizeBit = 1 << 3
156bdd1243dSDimitry Andric   };
157bdd1243dSDimitry Andric 
158349cc55cSDimitry Andric public:
size(const tpctypes::RemoteAllocGroup & RAG)15906c3fb27SDimitry Andric   static size_t size(const tpctypes::RemoteAllocGroup &RAG) {
160bdd1243dSDimitry Andric     // All AllocGroup values encode to the same size.
161bdd1243dSDimitry Andric     return SPSArgList<uint8_t>::size(uint8_t(0));
162349cc55cSDimitry Andric   }
163349cc55cSDimitry Andric 
serialize(SPSOutputBuffer & OB,const tpctypes::RemoteAllocGroup & RAG)16406c3fb27SDimitry Andric   static bool serialize(SPSOutputBuffer &OB,
16506c3fb27SDimitry Andric                         const tpctypes::RemoteAllocGroup &RAG) {
166bdd1243dSDimitry Andric     uint8_t WireValue = 0;
16706c3fb27SDimitry Andric     if ((RAG.Prot & MemProt::Read) != MemProt::None)
168bdd1243dSDimitry Andric       WireValue |= ReadBit;
16906c3fb27SDimitry Andric     if ((RAG.Prot & MemProt::Write) != MemProt::None)
170bdd1243dSDimitry Andric       WireValue |= WriteBit;
17106c3fb27SDimitry Andric     if ((RAG.Prot & MemProt::Exec) != MemProt::None)
172bdd1243dSDimitry Andric       WireValue |= ExecBit;
17306c3fb27SDimitry Andric     if (RAG.FinalizeLifetime)
174bdd1243dSDimitry Andric       WireValue |= FinalizeBit;
175bdd1243dSDimitry Andric     return SPSArgList<uint8_t>::serialize(OB, WireValue);
176349cc55cSDimitry Andric   }
177349cc55cSDimitry Andric 
deserialize(SPSInputBuffer & IB,tpctypes::RemoteAllocGroup & RAG)17806c3fb27SDimitry Andric   static bool deserialize(SPSInputBuffer &IB, tpctypes::RemoteAllocGroup &RAG) {
179349cc55cSDimitry Andric     uint8_t Val;
180349cc55cSDimitry Andric     if (!SPSArgList<uint8_t>::deserialize(IB, Val))
181349cc55cSDimitry Andric       return false;
182bdd1243dSDimitry Andric     MemProt MP = MemProt::None;
183bdd1243dSDimitry Andric     if (Val & ReadBit)
184bdd1243dSDimitry Andric       MP |= MemProt::Read;
185bdd1243dSDimitry Andric     if (Val & WriteBit)
186bdd1243dSDimitry Andric       MP |= MemProt::Write;
187bdd1243dSDimitry Andric     if (Val & ExecBit)
188bdd1243dSDimitry Andric       MP |= MemProt::Exec;
18906c3fb27SDimitry Andric     bool FinalizeLifetime = (Val & FinalizeBit) ? true : false;
19006c3fb27SDimitry Andric     RAG = {MP, FinalizeLifetime};
191349cc55cSDimitry Andric     return true;
192349cc55cSDimitry Andric   }
193349cc55cSDimitry Andric };
194349cc55cSDimitry Andric 
195349cc55cSDimitry Andric template <>
196349cc55cSDimitry Andric class SPSSerializationTraits<SPSSegFinalizeRequest,
197349cc55cSDimitry Andric                              tpctypes::SegFinalizeRequest> {
198349cc55cSDimitry Andric   using SFRAL = SPSSegFinalizeRequest::AsArgList;
199349cc55cSDimitry Andric 
200349cc55cSDimitry Andric public:
size(const tpctypes::SegFinalizeRequest & SFR)201349cc55cSDimitry Andric   static size_t size(const tpctypes::SegFinalizeRequest &SFR) {
20206c3fb27SDimitry Andric     return SFRAL::size(SFR.RAG, SFR.Addr, SFR.Size, SFR.Content);
203349cc55cSDimitry Andric   }
204349cc55cSDimitry Andric 
serialize(SPSOutputBuffer & OB,const tpctypes::SegFinalizeRequest & SFR)205349cc55cSDimitry Andric   static bool serialize(SPSOutputBuffer &OB,
206349cc55cSDimitry Andric                         const tpctypes::SegFinalizeRequest &SFR) {
20706c3fb27SDimitry Andric     return SFRAL::serialize(OB, SFR.RAG, SFR.Addr, SFR.Size, SFR.Content);
208349cc55cSDimitry Andric   }
209349cc55cSDimitry Andric 
deserialize(SPSInputBuffer & IB,tpctypes::SegFinalizeRequest & SFR)210349cc55cSDimitry Andric   static bool deserialize(SPSInputBuffer &IB,
211349cc55cSDimitry Andric                           tpctypes::SegFinalizeRequest &SFR) {
21206c3fb27SDimitry Andric     return SFRAL::deserialize(IB, SFR.RAG, SFR.Addr, SFR.Size, SFR.Content);
213349cc55cSDimitry Andric   }
214349cc55cSDimitry Andric };
215349cc55cSDimitry Andric 
216349cc55cSDimitry Andric template <>
217349cc55cSDimitry Andric class SPSSerializationTraits<SPSFinalizeRequest, tpctypes::FinalizeRequest> {
218349cc55cSDimitry Andric   using FRAL = SPSFinalizeRequest::AsArgList;
219349cc55cSDimitry Andric 
220349cc55cSDimitry Andric public:
size(const tpctypes::FinalizeRequest & FR)221349cc55cSDimitry Andric   static size_t size(const tpctypes::FinalizeRequest &FR) {
222349cc55cSDimitry Andric     return FRAL::size(FR.Segments, FR.Actions);
223349cc55cSDimitry Andric   }
224349cc55cSDimitry Andric 
serialize(SPSOutputBuffer & OB,const tpctypes::FinalizeRequest & FR)225349cc55cSDimitry Andric   static bool serialize(SPSOutputBuffer &OB,
226349cc55cSDimitry Andric                         const tpctypes::FinalizeRequest &FR) {
227349cc55cSDimitry Andric     return FRAL::serialize(OB, FR.Segments, FR.Actions);
228349cc55cSDimitry Andric   }
229349cc55cSDimitry Andric 
deserialize(SPSInputBuffer & IB,tpctypes::FinalizeRequest & FR)230349cc55cSDimitry Andric   static bool deserialize(SPSInputBuffer &IB, tpctypes::FinalizeRequest &FR) {
231349cc55cSDimitry Andric     return FRAL::deserialize(IB, FR.Segments, FR.Actions);
232349cc55cSDimitry Andric   }
233349cc55cSDimitry Andric };
234349cc55cSDimitry Andric 
235fcaf7f86SDimitry Andric template <>
236fcaf7f86SDimitry Andric class SPSSerializationTraits<SPSSharedMemorySegFinalizeRequest,
237fcaf7f86SDimitry Andric                              tpctypes::SharedMemorySegFinalizeRequest> {
238fcaf7f86SDimitry Andric   using SFRAL = SPSSharedMemorySegFinalizeRequest::AsArgList;
239fcaf7f86SDimitry Andric 
240fcaf7f86SDimitry Andric public:
size(const tpctypes::SharedMemorySegFinalizeRequest & SFR)241fcaf7f86SDimitry Andric   static size_t size(const tpctypes::SharedMemorySegFinalizeRequest &SFR) {
24206c3fb27SDimitry Andric     return SFRAL::size(SFR.RAG, SFR.Addr, SFR.Size);
243fcaf7f86SDimitry Andric   }
244fcaf7f86SDimitry Andric 
serialize(SPSOutputBuffer & OB,const tpctypes::SharedMemorySegFinalizeRequest & SFR)245fcaf7f86SDimitry Andric   static bool serialize(SPSOutputBuffer &OB,
246fcaf7f86SDimitry Andric                         const tpctypes::SharedMemorySegFinalizeRequest &SFR) {
24706c3fb27SDimitry Andric     return SFRAL::serialize(OB, SFR.RAG, SFR.Addr, SFR.Size);
248fcaf7f86SDimitry Andric   }
249fcaf7f86SDimitry Andric 
deserialize(SPSInputBuffer & IB,tpctypes::SharedMemorySegFinalizeRequest & SFR)250fcaf7f86SDimitry Andric   static bool deserialize(SPSInputBuffer &IB,
251fcaf7f86SDimitry Andric                           tpctypes::SharedMemorySegFinalizeRequest &SFR) {
25206c3fb27SDimitry Andric     return SFRAL::deserialize(IB, SFR.RAG, SFR.Addr, SFR.Size);
253fcaf7f86SDimitry Andric   }
254fcaf7f86SDimitry Andric };
255fcaf7f86SDimitry Andric 
256fcaf7f86SDimitry Andric template <>
257fcaf7f86SDimitry Andric class SPSSerializationTraits<SPSSharedMemoryFinalizeRequest,
258fcaf7f86SDimitry Andric                              tpctypes::SharedMemoryFinalizeRequest> {
259fcaf7f86SDimitry Andric   using FRAL = SPSSharedMemoryFinalizeRequest::AsArgList;
260fcaf7f86SDimitry Andric 
261fcaf7f86SDimitry Andric public:
size(const tpctypes::SharedMemoryFinalizeRequest & FR)262fcaf7f86SDimitry Andric   static size_t size(const tpctypes::SharedMemoryFinalizeRequest &FR) {
263fcaf7f86SDimitry Andric     return FRAL::size(FR.Segments, FR.Actions);
264fcaf7f86SDimitry Andric   }
265fcaf7f86SDimitry Andric 
serialize(SPSOutputBuffer & OB,const tpctypes::SharedMemoryFinalizeRequest & FR)266fcaf7f86SDimitry Andric   static bool serialize(SPSOutputBuffer &OB,
267fcaf7f86SDimitry Andric                         const tpctypes::SharedMemoryFinalizeRequest &FR) {
268fcaf7f86SDimitry Andric     return FRAL::serialize(OB, FR.Segments, FR.Actions);
269fcaf7f86SDimitry Andric   }
270fcaf7f86SDimitry Andric 
deserialize(SPSInputBuffer & IB,tpctypes::SharedMemoryFinalizeRequest & FR)271fcaf7f86SDimitry Andric   static bool deserialize(SPSInputBuffer &IB,
272fcaf7f86SDimitry Andric                           tpctypes::SharedMemoryFinalizeRequest &FR) {
273fcaf7f86SDimitry Andric     return FRAL::deserialize(IB, FR.Segments, FR.Actions);
274fcaf7f86SDimitry Andric   }
275fcaf7f86SDimitry Andric };
276fcaf7f86SDimitry Andric 
277349cc55cSDimitry Andric template <typename T>
278349cc55cSDimitry Andric class SPSSerializationTraits<SPSMemoryAccessUIntWrite<T>,
279349cc55cSDimitry Andric                              tpctypes::UIntWrite<T>> {
280349cc55cSDimitry Andric public:
size(const tpctypes::UIntWrite<T> & W)281349cc55cSDimitry Andric   static size_t size(const tpctypes::UIntWrite<T> &W) {
282349cc55cSDimitry Andric     return SPSTuple<SPSExecutorAddr, T>::AsArgList::size(W.Addr, W.Value);
283349cc55cSDimitry Andric   }
284349cc55cSDimitry Andric 
serialize(SPSOutputBuffer & OB,const tpctypes::UIntWrite<T> & W)285349cc55cSDimitry Andric   static bool serialize(SPSOutputBuffer &OB, const tpctypes::UIntWrite<T> &W) {
286349cc55cSDimitry Andric     return SPSTuple<SPSExecutorAddr, T>::AsArgList::serialize(OB, W.Addr,
287349cc55cSDimitry Andric                                                               W.Value);
288349cc55cSDimitry Andric   }
289349cc55cSDimitry Andric 
deserialize(SPSInputBuffer & IB,tpctypes::UIntWrite<T> & W)290349cc55cSDimitry Andric   static bool deserialize(SPSInputBuffer &IB, tpctypes::UIntWrite<T> &W) {
291349cc55cSDimitry Andric     return SPSTuple<SPSExecutorAddr, T>::AsArgList::deserialize(IB, W.Addr,
292349cc55cSDimitry Andric                                                                 W.Value);
293349cc55cSDimitry Andric   }
294349cc55cSDimitry Andric };
295349cc55cSDimitry Andric 
296349cc55cSDimitry Andric template <>
297349cc55cSDimitry Andric class SPSSerializationTraits<SPSMemoryAccessBufferWrite,
298349cc55cSDimitry Andric                              tpctypes::BufferWrite> {
299349cc55cSDimitry Andric public:
size(const tpctypes::BufferWrite & W)300349cc55cSDimitry Andric   static size_t size(const tpctypes::BufferWrite &W) {
301349cc55cSDimitry Andric     return SPSTuple<SPSExecutorAddr, SPSSequence<char>>::AsArgList::size(
302349cc55cSDimitry Andric         W.Addr, W.Buffer);
303349cc55cSDimitry Andric   }
304349cc55cSDimitry Andric 
serialize(SPSOutputBuffer & OB,const tpctypes::BufferWrite & W)305349cc55cSDimitry Andric   static bool serialize(SPSOutputBuffer &OB, const tpctypes::BufferWrite &W) {
306349cc55cSDimitry Andric     return SPSTuple<SPSExecutorAddr, SPSSequence<char>>::AsArgList ::serialize(
307349cc55cSDimitry Andric         OB, W.Addr, W.Buffer);
308349cc55cSDimitry Andric   }
309349cc55cSDimitry Andric 
deserialize(SPSInputBuffer & IB,tpctypes::BufferWrite & W)310349cc55cSDimitry Andric   static bool deserialize(SPSInputBuffer &IB, tpctypes::BufferWrite &W) {
311349cc55cSDimitry Andric     return SPSTuple<SPSExecutorAddr,
312349cc55cSDimitry Andric                     SPSSequence<char>>::AsArgList ::deserialize(IB, W.Addr,
313349cc55cSDimitry Andric                                                                 W.Buffer);
314349cc55cSDimitry Andric   }
315349cc55cSDimitry Andric };
316349cc55cSDimitry Andric 
3175f757f3fSDimitry Andric template <>
3185f757f3fSDimitry Andric class SPSSerializationTraits<SPSMemoryAccessPointerWrite,
3195f757f3fSDimitry Andric                              tpctypes::PointerWrite> {
3205f757f3fSDimitry Andric public:
size(const tpctypes::PointerWrite & W)3215f757f3fSDimitry Andric   static size_t size(const tpctypes::PointerWrite &W) {
3225f757f3fSDimitry Andric     return SPSTuple<SPSExecutorAddr, SPSExecutorAddr>::AsArgList::size(W.Addr,
3235f757f3fSDimitry Andric                                                                        W.Value);
3245f757f3fSDimitry Andric   }
3255f757f3fSDimitry Andric 
serialize(SPSOutputBuffer & OB,const tpctypes::PointerWrite & W)3265f757f3fSDimitry Andric   static bool serialize(SPSOutputBuffer &OB, const tpctypes::PointerWrite &W) {
3275f757f3fSDimitry Andric     return SPSTuple<SPSExecutorAddr, SPSExecutorAddr>::AsArgList::serialize(
3285f757f3fSDimitry Andric         OB, W.Addr, W.Value);
3295f757f3fSDimitry Andric   }
3305f757f3fSDimitry Andric 
deserialize(SPSInputBuffer & IB,tpctypes::PointerWrite & W)3315f757f3fSDimitry Andric   static bool deserialize(SPSInputBuffer &IB, tpctypes::PointerWrite &W) {
3325f757f3fSDimitry Andric     return SPSTuple<SPSExecutorAddr, SPSExecutorAddr>::AsArgList::deserialize(
3335f757f3fSDimitry Andric         IB, W.Addr, W.Value);
3345f757f3fSDimitry Andric   }
3355f757f3fSDimitry Andric };
3365f757f3fSDimitry Andric 
337349cc55cSDimitry Andric } // end namespace shared
338e8d8bef9SDimitry Andric } // end namespace orc
339e8d8bef9SDimitry Andric } // end namespace llvm
340e8d8bef9SDimitry Andric 
341e8d8bef9SDimitry Andric #endif // LLVM_EXECUTIONENGINE_ORC_SHARED_TARGETPROCESSCONTROLTYPES_H
342