From f38cfdabd1ec53eb4278e02af98a76620f33e260 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Thu, 2 Sep 2021 20:45:46 +1000 Subject: [PATCH] [ORC] Add specialized SPSSerializationTraits for ArrayRef. Deserializing from an SPSSequence to an an ArrayRef will point the ArrayRef at the input buffer. --- .../Orc/Shared/SimplePackedSerialization.h | 25 +++++++++++++++++++ .../Orc/SimplePackedSerializationTest.cpp | 20 +++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h b/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h index dfa2307b2f20..e444a6352c51 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/Shared/SimplePackedSerialization.h @@ -296,6 +296,31 @@ public: static constexpr bool available = true; }; +/// Specialized SPSSequence -> ArrayRef serialization. +/// +/// On deserialize, points directly into the input buffer. +template <> class SPSSerializationTraits, ArrayRef> { +public: + static size_t size(const ArrayRef &A) { + return SPSArgList::size(static_cast(A.size())) + + A.size(); + } + + static bool serialize(SPSOutputBuffer &OB, const ArrayRef &A) { + if (!SPSArgList::serialize(OB, static_cast(A.size()))) + return false; + return OB.write(A.data(), A.size()); + } + + static bool deserialize(SPSInputBuffer &IB, ArrayRef &A) { + uint64_t Size; + if (!SPSArgList::deserialize(IB, Size)) + return false; + A = {IB.data(), Size}; + return IB.skip(Size); + } +}; + /// 'Trivial' sequence serialization: Sequence is serialized as a uint64_t size /// followed by a for-earch loop over the elements of the sequence to serialize /// each of them. diff --git a/llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp b/llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp index b5455e6580bd..b43735d6a094 100644 --- a/llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp +++ b/llvm/unittests/ExecutionEngine/Orc/SimplePackedSerializationTest.cpp @@ -168,3 +168,23 @@ TEST(SimplePackedSerialization, StringMap) { StringMap M({{"A", 1}, {"B", 2}}); spsSerializationRoundTrip>>(M); } + +TEST(SimplePackedSerializationTest, ArrayRef) { + constexpr unsigned BufferSize = 6 + 8; // "hello\0" + sizeof(uint64_t) + ArrayRef HelloOut = "hello"; + char Buffer[BufferSize]; + memset(Buffer, 0, BufferSize); + + SPSOutputBuffer OB(Buffer, BufferSize); + EXPECT_TRUE(SPSArgList>::serialize(OB, HelloOut)); + + ArrayRef HelloIn; + SPSInputBuffer IB(Buffer, BufferSize); + EXPECT_TRUE(SPSArgList>::deserialize(IB, HelloIn)); + + // Output should be copied to buffer. + EXPECT_NE(HelloOut.data(), Buffer); + + // Input should reference buffer. + EXPECT_LT(HelloIn.data() - Buffer, BufferSize); +}