Re: [PATCH v2 17/21] libcc1: share the GCC interface code

2021-04-30 Thread Jeff Law via Gcc-patches



On 4/27/2021 7:01 PM, Tom Tromey wrote:

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.


OK

Jeff


[PATCH v2 17/21] libcc1: share the GCC interface code

2021-04-27 Thread Tom Tromey
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 =