diff --git a/libcc1/libcc1.cc b/libcc1/libcc1.cc index e4c200c8abd578948229f191db0a6ee5ba49065b..68d366a7287110955dfbe542be880bc5e95acbab 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 e80ecd8f4b353b5bdd759cd3fbb688a8aa1f9563..59e4851064a211df324deef6ba1a0509f84b2671 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 212603ebb819f5d533f25c9e090cd5be29113558..0000000000000000000000000000000000000000 --- 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 ff80bfe41870c0d7e2edd29ddff7fe651eb297dc..3d6ae4126aee72f58a4a639384623ad53bb568c5 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 6999c4ff8fd1c32c59f6caa5fbf7519f3ccb568e..8d890eb9b6c73935a9cc3c21024988db9489e7e2 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; }