summaryrefslogtreecommitdiff
path: root/libcc1
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2021-05-04 15:26:58 -0600
committerTom Tromey <tom@tromey.com>2021-05-05 00:06:16 -0600
commit25d1a6ecdc443f19d63ab4dfc449417347ca7be0 (patch)
treed7d7e3693096c36217f47ba8f9b0ebf8b0123203 /libcc1
parent523ca6403c68d580043af01485f2a8a8ce3a56d1 (diff)
libcc1: use templates to unmarshall enums
Now that C++11 can be used in GCC, libcc1 can be changed to use templates and type traits to handle unmarshalling all kinds of enums. libcc1 * marshall.hh (cc1_plugin::unmarshall): Use type traits. * marshall-cp.hh (cc1_plugin::unmarshall): Remove overloads. * marshall-c.hh: Remove. * libcc1plugin.cc: Update includes. * libcc1.cc: Update includes.
Diffstat (limited to 'libcc1')
-rw-r--r--libcc1/libcc1.cc3
-rw-r--r--libcc1/libcc1plugin.cc3
-rw-r--r--libcc1/marshall-c.hh59
-rw-r--r--libcc1/marshall-cp.hh40
-rw-r--r--libcc1/marshall.hh26
5 files changed, 25 insertions, 106 deletions
diff --git a/libcc1/libcc1.cc b/libcc1/libcc1.cc
index e4c200c8abd..68d366a7287 100644
--- a/libcc1/libcc1.cc
+++ b/libcc1/libcc1.cc
@@ -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;
diff --git a/libcc1/libcc1plugin.cc b/libcc1/libcc1plugin.cc
index e80ecd8f4b3..59e4851064a 100644
--- a/libcc1/libcc1plugin.cc
+++ b/libcc1/libcc1plugin.cc
@@ -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)
diff --git a/libcc1/marshall-c.hh b/libcc1/marshall-c.hh
deleted file mode 100644
index 212603ebb81..00000000000
--- a/libcc1/marshall-c.hh
+++ /dev/null
@@ -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
diff --git a/libcc1/marshall-cp.hh b/libcc1/marshall-cp.hh
index ff80bfe4187..3d6ae4126ae 100644
--- a/libcc1/marshall-cp.hh
+++ b/libcc1/marshall-cp.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)
diff --git a/libcc1/marshall.hh b/libcc1/marshall.hh
index 6999c4ff8fd..8d890eb9b6c 100644
--- a/libcc1/marshall.hh
+++ b/libcc1/marshall.hh
@@ -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;
}