[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 "