[ORC][ORC-RT] Make WrapperFunctionCall::Create support void functions.
Serialized calls to void-wrapper-functions should have zero bytes of argument
data, but accessing ArgData[0] may (and will, in the case of SmallVector) fail
if the argument data buffer is empty.
This commit fixes the issue by adding a check for empty argument buffers.
GitOrigin-RevId: 0e43f3b04d527776458df7aa1d7ce1787ff0b32f
diff --git a/lib/orc/tests/unit/wrapper_function_utils_test.cpp b/lib/orc/tests/unit/wrapper_function_utils_test.cpp
index 0312383..8d4b9b3 100644
--- a/lib/orc/tests/unit/wrapper_function_utils_test.cpp
+++ b/lib/orc/tests/unit/wrapper_function_utils_test.cpp
@@ -66,6 +66,10 @@
EXPECT_TRUE(strcmp(R.getOutOfBandError(), TestString) == 0);
}
+TEST(WrapperFunctionUtilsTest, WrapperFunctionCCallCreateEmpty) {
+ EXPECT_TRUE(!!WrapperFunctionCall::Create<SPSArgList<>>(ExecutorAddr()));
+}
+
static void voidNoop() {}
static __orc_rt_CWrapperFunctionResult voidNoopWrapper(const char *ArgData,
diff --git a/lib/orc/wrapper_function_utils.h b/lib/orc/wrapper_function_utils.h
index 17aa8bb..b48891b 100644
--- a/lib/orc/wrapper_function_utils.h
+++ b/lib/orc/wrapper_function_utils.h
@@ -408,7 +408,8 @@
const ArgTs &...Args) {
ArgDataBufferType ArgData;
ArgData.resize(SPSSerializer::size(Args...));
- SPSOutputBuffer OB(&ArgData[0], ArgData.size());
+ SPSOutputBuffer OB(ArgData.empty() ? nullptr : ArgData.data(),
+ ArgData.size());
if (SPSSerializer::serialize(OB, Args...))
return WrapperFunctionCall(FnAddr, std::move(ArgData));
return make_error<StringError>("Cannot serialize arguments for "