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