@@ -29,7 +29,7 @@ along with GCC; see the file COPYING3. If not see
#include <sys/stat.h>
#include <stdlib.h>
#include <sstream>
-#include "marshall-c.hh"
+#include "marshall.hh"
#include "rpc.hh"
#include "connection.hh"
#include "names.hh"
@@ -39,6 +39,7 @@ along with GCC; see the file COPYING3. If not see
#include "findcomp.hh"
#include "compiler-name.hh"
#include "intl.h"
+#include "gcc-c-interface.h"
struct libcc1;
@@ -63,8 +63,9 @@
#include "callbacks.hh"
#include "connection.hh"
-#include "marshall-c.hh"
+#include "marshall.hh"
#include "rpc.hh"
+#include "gcc-c-interface.h"
#ifdef __GNUC__
#pragma GCC visibility push(default)
deleted file mode 100644
@@ -1,59 +0,0 @@
-/* Marshalling and unmarshalling of C-specific types.
- Copyright (C) 2014-2021 Free Software Foundation, Inc.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3. If not see
-<http://www.gnu.org/licenses/>. */
-
-#ifndef CC1_PLUGIN_MARSHALL_C_HH
-#define CC1_PLUGIN_MARSHALL_C_HH
-
-#include "marshall.hh"
-#include "gcc-c-interface.h"
-
-namespace cc1_plugin
-{
- status
- unmarshall (connection *conn, enum gcc_c_symbol_kind *result)
- {
- protocol_int p;
- if (!unmarshall_intlike (conn, &p))
- return FAIL;
- *result = (enum gcc_c_symbol_kind) p;
- return OK;
- }
-
- status
- unmarshall (connection *conn, enum gcc_c_oracle_request *result)
- {
- protocol_int p;
- if (!unmarshall_intlike (conn, &p))
- return FAIL;
- *result = (enum gcc_c_oracle_request) p;
- return OK;
- }
-
- status
- unmarshall (connection *conn, enum gcc_qualifiers *result)
- {
- protocol_int p;
- if (!unmarshall_intlike (conn, &p))
- return FAIL;
- *result = (enum gcc_qualifiers) p;
- return OK;
- }
-}
-
-#endif // CC1_PLUGIN_MARSHALL_C_HH
@@ -25,46 +25,6 @@ along with GCC; see the file COPYING3. If not see
namespace cc1_plugin
{
- status
- unmarshall (connection *conn, enum gcc_cp_symbol_kind *result)
- {
- protocol_int p;
- if (!unmarshall_intlike (conn, &p))
- return FAIL;
- *result = (enum gcc_cp_symbol_kind) p;
- return OK;
- }
-
- status
- unmarshall (connection *conn, enum gcc_cp_oracle_request *result)
- {
- protocol_int p;
- if (!unmarshall_intlike (conn, &p))
- return FAIL;
- *result = (enum gcc_cp_oracle_request) p;
- return OK;
- }
-
- status
- unmarshall (connection *conn, enum gcc_cp_qualifiers *result)
- {
- protocol_int p;
- if (!unmarshall_intlike (conn, &p))
- return FAIL;
- *result = (enum gcc_cp_qualifiers) p;
- return OK;
- }
-
- status
- unmarshall (connection *conn, enum gcc_cp_ref_qualifiers *result)
- {
- protocol_int p;
- if (!unmarshall_intlike (conn, &p))
- return FAIL;
- *result = (enum gcc_cp_ref_qualifiers) p;
- return OK;
- }
-
// Send a gcc_vbase_array marker followed by the array.
status
marshall (connection *conn, const gcc_vbase_array *a)
@@ -20,6 +20,8 @@ along with GCC; see the file COPYING3. If not see
#ifndef CC1_PLUGIN_MARSHALL_HH
#define CC1_PLUGIN_MARSHALL_HH
+#include <type_traits>
+
#include "status.hh"
#include "gcc-interface.h"
@@ -59,17 +61,31 @@ namespace cc1_plugin
}
// A template function that can handle unmarshalling various integer
- // objects from the connection. Note that this can't be
- // instantiated for enum types. Note also that there's no way at
- // the protocol level to distinguish different int types.
+ // objects from the connection. Note that there's no way at the
+ // protocol level to distinguish different int types.
+ template<typename T>
+ status unmarshall (connection *conn, T *scalar,
+ typename std::enable_if<std::is_integral<T>::value, T>::type * = 0)
+ {
+ protocol_int result;
+
+ if (!unmarshall_intlike (conn, &result))
+ return FAIL;
+ *scalar = (T) result;
+ return OK;
+ }
+
+ // A template function that can handle unmarshalling various enum
+ // objects from the connection.
template<typename T>
- status unmarshall (connection *conn, T *scalar)
+ status unmarshall (connection *conn, T *e_val,
+ typename std::enable_if<std::is_enum<T>::value, T>::type * = 0)
{
protocol_int result;
if (!unmarshall_intlike (conn, &result))
return FAIL;
- *scalar = result;
+ *e_val = (T) result;
return OK;
}