diff options
author | Tom Tromey <tom@tromey.com> | 2021-05-04 15:26:58 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2021-05-05 00:06:16 -0600 |
commit | 25d1a6ecdc443f19d63ab4dfc449417347ca7be0 (patch) | |
tree | d7d7e3693096c36217f47ba8f9b0ebf8b0123203 /libcc1 | |
parent | 523ca6403c68d580043af01485f2a8a8ce3a56d1 (diff) | |
download | gcc-25d1a6ecdc443f19d63ab4dfc449417347ca7be0.zip gcc-25d1a6ecdc443f19d63ab4dfc449417347ca7be0.tar.gz gcc-25d1a6ecdc443f19d63ab4dfc449417347ca7be0.tar.bz2 |
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.cc | 3 | ||||
-rw-r--r-- | libcc1/libcc1plugin.cc | 3 | ||||
-rw-r--r-- | libcc1/marshall-c.hh | 59 | ||||
-rw-r--r-- | libcc1/marshall-cp.hh | 40 | ||||
-rw-r--r-- | libcc1/marshall.hh | 26 |
5 files changed, 25 insertions, 106 deletions
diff --git a/libcc1/libcc1.cc b/libcc1/libcc1.cc index e4c200c..68d366a 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 e80ecd8..59e4851 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 212603e..0000000 --- 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 ff80bfe..3d6ae41 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 6999c4f..8d890eb 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; } |