2020namespace llvm ::orc {
2121
2222namespace detail {
23- template <typename RetT, typename ... ArgTs> struct SPSCallSerializationImpl {
24- using RetSerialization = shared::SPSArgList<RetT>;
25- using ArgSerialization = shared::SPSArgList<ArgTs...>;
26- };
27- } // namespace detail
28-
29- template <typename SPSSig>
30- struct SPSCallSerialization
31- : public CallableTraitsHelper<detail::SPSCallSerializationImpl, SPSSig> {};
23+ template <typename SPSRetT, typename ... SPSArgTs>
24+ struct SPSCallSerializationImpl {
25+ using RetSerialization = shared::SPSArgList<SPSRetT>;
26+ using ArgSerialization = shared::SPSArgList<SPSArgTs...>;
3227
33- template <typename SPSSig> class SPSCallSerializer {
34- public:
3528 template <typename ... ArgTs>
3629 Expected<shared::WrapperFunctionResult> serialize (ArgTs &&...Args) {
37- using ArgSerialization =
38- typename SPSCallSerialization<SPSSig>::ArgSerialization;
3930 auto Buffer = shared::WrapperFunctionResult::allocate (
4031 ArgSerialization::size (Args...));
4132 shared::SPSOutputBuffer OB (Buffer.data (), Buffer.size ());
@@ -44,11 +35,22 @@ template <typename SPSSig> class SPSCallSerializer {
4435 inconvertibleErrorCode ());
4536 return std::move (Buffer);
4637 }
38+ };
39+
40+ template <typename SPSSig>
41+ struct SPSCallSerialization
42+ : public CallableTraitsHelper<detail::SPSCallSerializationImpl, SPSSig> {};
43+
44+ } // namespace detail
45+
46+ // / SPS serialization for non-void calls.
47+ template <typename SPSSig>
48+ struct SPSCallSerializer : public detail ::SPSCallSerialization<SPSSig> {
4749
4850 template <typename RetT>
4951 Expected<RetT> deserialize (shared::WrapperFunctionResult ResultBytes) {
5052 using RetDeserialization =
51- typename SPSCallSerialization<SPSSig>::RetSerialization;
53+ typename detail:: SPSCallSerialization<SPSSig>::RetSerialization;
5254 shared::SPSInputBuffer IB (ResultBytes.data (), ResultBytes.size ());
5355 RetT ReturnValue;
5456 if (!RetDeserialization::deserialize (IB, ReturnValue))
@@ -58,6 +60,20 @@ template <typename SPSSig> class SPSCallSerializer {
5860 }
5961};
6062
63+ // / SPS serialization for void calls.
64+ template <typename ... SPSArgTs>
65+ struct SPSCallSerializer <void (SPSArgTs...)>
66+ : public detail::SPSCallSerialization<void (SPSArgTs...)> {
67+ template <typename RetT>
68+ std::enable_if_t <std::is_void_v<RetT>, Error>
69+ deserialize (shared::WrapperFunctionResult ResultBytes) {
70+ if (!ResultBytes.empty ())
71+ return make_error<StringError>(" Could not deserialize return value" ,
72+ inconvertibleErrorCode ());
73+ return Error::success ();
74+ }
75+ };
76+
6177template <typename SPSSig>
6278class SPSEPCCaller : public EPCCaller <SPSCallSerializer<SPSSig>> {
6379public:
0 commit comments