[llvm] [orc-rt] Add SPS serialization for AllocAction and AllocActionPair. (PR #157620)

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 9 00:07:48 PDT 2025


https://github.com/lhames created https://github.com/llvm/llvm-project/pull/157620

None

>From 51b7b292ae768759ebcb202095e5a7d99efc6be1 Mon Sep 17 00:00:00 2001
From: Lang Hames <lhames at gmail.com>
Date: Tue, 9 Sep 2025 16:59:21 +1000
Subject: [PATCH] [orc-rt] Add SPS serialization for AllocAction and
 AllocActionPair.

---
 orc-rt/include/orc-rt/SPSAllocAction.h  | 47 ++++++++++++++++++++++++
 orc-rt/unittests/CMakeLists.txt         |  1 +
 orc-rt/unittests/SPSAllocActionTest.cpp | 49 +++++++++++++++++++++++++
 3 files changed, 97 insertions(+)
 create mode 100644 orc-rt/unittests/SPSAllocActionTest.cpp

diff --git a/orc-rt/include/orc-rt/SPSAllocAction.h b/orc-rt/include/orc-rt/SPSAllocAction.h
index 6107516029cfd..ce9c11606338f 100644
--- a/orc-rt/include/orc-rt/SPSAllocAction.h
+++ b/orc-rt/include/orc-rt/SPSAllocAction.h
@@ -15,10 +15,57 @@
 #define ORC_RT_SPSALLOCACTION_H
 
 #include "orc-rt/AllocAction.h"
+#include "orc-rt/SPSWrapperFunctionBuffer.h"
 #include "orc-rt/SimplePackedSerialization.h"
 
 namespace orc_rt {
 
+struct SPSAllocAction;
+
+template <> class SPSSerializationTraits<SPSAllocAction, AllocAction> {
+public:
+  static size_t size(const AllocAction &AA) {
+    return SPSArgList<SPSExecutorAddr, SPSWrapperFunctionBuffer>::size(
+        ExecutorAddr::fromPtr(AA.Fn), AA.ArgData);
+  }
+
+  static bool serialize(SPSOutputBuffer &OB, const AllocAction &AA) {
+    return SPSArgList<SPSExecutorAddr, SPSWrapperFunctionBuffer>::serialize(
+        OB, ExecutorAddr::fromPtr(AA.Fn), AA.ArgData);
+  }
+
+  static bool deserialize(SPSInputBuffer &IB, AllocAction &AA) {
+    ExecutorAddr Fn;
+    WrapperFunctionBuffer ArgData;
+    if (!SPSArgList<SPSExecutorAddr, SPSWrapperFunctionBuffer>::deserialize(
+            IB, Fn, ArgData))
+      return false;
+    AA.Fn = Fn.toPtr<AllocActionFn>();
+    AA.ArgData = std::move(ArgData);
+    return true;
+  }
+};
+
+struct SPSAllocActionPair;
+
+template <> class SPSSerializationTraits<SPSAllocActionPair, AllocActionPair> {
+public:
+  static size_t size(const AllocActionPair &AAP) {
+    return SPSArgList<SPSAllocAction, SPSAllocAction>::size(AAP.Finalize,
+                                                            AAP.Dealloc);
+  }
+
+  static bool serialize(SPSOutputBuffer &OB, const AllocActionPair &AAP) {
+    return SPSArgList<SPSAllocAction, SPSAllocAction>::serialize(
+        OB, AAP.Finalize, AAP.Dealloc);
+  }
+
+  static bool deserialize(SPSInputBuffer &IB, AllocActionPair &AAP) {
+    return SPSArgList<SPSAllocAction, SPSAllocAction>::deserialize(
+        IB, AAP.Finalize, AAP.Dealloc);
+  }
+};
+
 template <typename... SPSArgTs> struct AllocActionSPSDeserializer {
   template <typename... ArgTs>
   bool deserialize(const char *ArgData, size_t ArgSize, ArgTs &...Args) {
diff --git a/orc-rt/unittests/CMakeLists.txt b/orc-rt/unittests/CMakeLists.txt
index ca501e69034bf..f29fb1e3b9d03 100644
--- a/orc-rt/unittests/CMakeLists.txt
+++ b/orc-rt/unittests/CMakeLists.txt
@@ -24,6 +24,7 @@ add_orc_rt_unittest(CoreTests
   RTTITest.cpp
   ScopeExitTest.cpp
   SimplePackedSerializationTest.cpp
+  SPSAllocActionTest.cpp
   SPSMemoryFlagsTest.cpp
   SPSWrapperFunctionTest.cpp
   SPSWrapperFunctionBufferTest.cpp
diff --git a/orc-rt/unittests/SPSAllocActionTest.cpp b/orc-rt/unittests/SPSAllocActionTest.cpp
new file mode 100644
index 0000000000000..b7791e3385382
--- /dev/null
+++ b/orc-rt/unittests/SPSAllocActionTest.cpp
@@ -0,0 +1,49 @@
+//===-- SPSAllocActionTest.cpp --------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Test SPS serialization for AllocAction APIs.
+//
+//===----------------------------------------------------------------------===//
+
+#include "orc-rt/SPSAllocAction.h"
+
+#include "SimplePackedSerializationTestUtils.h"
+#include "gtest/gtest.h"
+
+using namespace orc_rt;
+
+static bool AAEQ(const AllocAction &LHS, const AllocAction &RHS) {
+  if (LHS.Fn != RHS.Fn)
+    return false;
+  if (LHS.ArgData.size() != RHS.ArgData.size())
+    return false;
+  return memcmp(LHS.ArgData.data(), RHS.ArgData.data(), LHS.ArgData.size()) ==
+         0;
+}
+
+static bool AAPEQ(const AllocActionPair &LHS, const AllocActionPair &RHS) {
+  return AAEQ(LHS.Finalize, RHS.Finalize) && AAEQ(LHS.Dealloc, RHS.Dealloc);
+}
+
+static orc_rt_WrapperFunctionBuffer noopAction(const char *ArgData,
+                                               size_t ArgSize) {
+  return WrapperFunctionBuffer().release();
+}
+
+TEST(SPSAllocActionTest, AllocActionSerialization) {
+  AllocAction AA(noopAction, WrapperFunctionBuffer::copyFrom("hello, world!"));
+  blobSerializationRoundTrip<SPSAllocAction>(AA, AAEQ);
+}
+
+TEST(SPSAllocActionTest, AllocActionPairSerialization) {
+  AllocActionPair AAP;
+  AAP.Finalize = {noopAction, WrapperFunctionBuffer::copyFrom("foo")};
+  AAP.Dealloc = {noopAction, WrapperFunctionBuffer::copyFrom("foo")};
+
+  blobSerializationRoundTrip<SPSAllocActionPair>(AAP, AAPEQ);
+}



More information about the llvm-commits mailing list