Both the C and C++ side of the GDB plugin in libcc1 share a lot of
code relating to the base GCC interface. It was all copy-and-pasted,
but is essentially identical between the two. This is by design, as
the base GCC API is intended to be shared.
This patch merges the implementations into base_gdb_plugin, which was
introduced earlier for this purpose.
libcc1/ChangeLog
2021-04-27 Tom Tromey
* libcp1.cc (libcp1): Change parameters. Update.
(libcp1_set_verbose, libcp1_set_arguments)
(libcp1_set_triplet_regexp, libcp1_set_driver_filename)
(libcp1_set_source_file, libcp1_set_print_callback, fork_exec)
(libcp1_compile, libcp1_destroy, vtable): Remove.
(libcp1::add_callbacks): New method, extracted from
libcp1_compile.
(gcc_c_fe_context): Update.
* libcc1.cc (libcc1): Change parameters. Update.
(libcc1_set_verbose, libcc1_set_arguments)
(libcc1_set_triplet_regexp, libcc1_set_driver_filename)
(libcc1_set_source_file, libcc1_set_print_callback, fork_exec)
(libcc1_compile, libcc1_destroy, vtable): Remove.
(libcc1::add_callbacks): New method, extracted from
libcc1_compile.
(gcc_c_fe_context): Update.
* gdbctx.hh (base_gdb_plugin): Change parameters.
(~base_gdb_plugin): New.
: New virtual method.
: New members.
(get_self, do_set_verbose, do_set_arguments)
(do_set_triplet_regexp, do_set_driver_filename)
(do_set_arguments_v0, do_set_source_file, do_set_print_callback)
(fork_exec, do_compile, do_compile_v0, do_destroy): New methods.
---
libcc1/ChangeLog | 27 +
libcc1/gdbctx.hh | 253 ++-
libcc1/libcc1.cc | 242 +++--
libcc1/libcp1.cc | 246 +++--
4 files changed, 304 insertions(+), 464 deletions(-)
diff --git a/libcc1/gdbctx.hh b/libcc1/gdbctx.hh
index 1c8d87dff021..4a48381f2b4a 100644
--- a/libcc1/gdbctx.hh
+++ b/libcc1/gdbctx.hh
@@ -23,16 +23,38 @@ along with GCC; see the file COPYING3. If not see
namespace cc1_plugin
{
// The compiler context that we hand back to our caller.
+ // Due to this, the entire implementation is in this header.
template
struct base_gdb_plugin : public T
{
-explicit base_gdb_plugin (const gcc_base_vtable *v)
+base_gdb_plugin (const char *plugin_name_, const char *base_name,
+int version)
: verbose (false),
+ plugin_name (plugin_name_),
+ fe_version (version),
+ compiler_name (base_name),
compilerp (new compiler (verbose))
{
- this->base.ops = v;
+ vtable =
+ {
+ GCC_FE_VERSION_1,
+ do_set_arguments_v0,
+ do_set_source_file,
+ do_set_print_callback,
+ do_compile_v0,
+ do_destroy,
+ do_set_verbose,
+ do_compile,
+ do_set_arguments,
+ do_set_triplet_regexp,
+ do_set_driver_filename,
+ };
+
+ this->base.ops =
}
+virtual ~base_gdb_plugin () = default;
+
// A convenience function to print something.
void print (const char *str)
{
@@ -53,6 +75,10 @@ namespace cc1_plugin
connection.reset (new local_connection (fd, aux_fd, this));
}
+// This is called just before compilation begins. It should set
+// any needed callbacks on the connection.
+virtual void add_callbacks () = 0;
+
// A local subclass of connection that holds a back-pointer to the
// context object that we provide to our caller.
class local_connection : public cc1_plugin::connection
@@ -84,7 +110,230 @@ namespace cc1_plugin
/* Non-zero as an equivalent to gcc driver option "-v". */
bool verbose;
+const char *plugin_name;
+int fe_version;
+
+const char *compiler_name;
std::unique_ptr compilerp;
+
+ private:
+
+struct gcc_base_vtable vtable;
+
+static inline base_gdb_plugin *
+get_self (gcc_base_context *s)
+{
+ T *sub = (T *) s;
+ return static_cast *> (sub);
+}
+
+static void
+do_set_verbose (struct gcc_base_context *s, int /* bool */ verbose)
+{
+ base_gdb_plugin *self = get_self (s);
+
+ self->set_verbose (verbose != 0);
+}
+
+static char *
+do_set_arguments (struct gcc_base_context *s,
+ int argc, char **argv)
+{
+ base_gdb_plugin *self = get_self (s);
+
+ std::string compiler;
+ char *errmsg = self->compilerp->find (self->compiler_name, compiler);
+ if (errmsg != NULL)
+ return errmsg;
+
+ self->args.push_back (compiler);
+
+ for (int i = 0; i < argc; ++i)
+ self->args.push_back (argv[i]);
+
+ return NULL;
+}
+
+static char *
+do_set_triplet_regexp (struct gcc_base_context *s,
+ const char *triplet_regexp)
+{
+ base_gdb_plugin *self =