[v3,2/2] compile: Add 'set compile-gcc'

Message ID 20150423210815.GA8626@host1.jankratochvil.net
State New, archived
Headers

Commit Message

Jan Kratochvil April 23, 2015, 9:08 p.m. UTC
  Hi,

as discussed in
	How to use compile & execute function in GDB
	https://sourceware.org/ml/gdb/2015-04/msg00026.html

GDB currently searches for /usr/bin/ARCH-OS-gcc and chooses one but one cannot
override which one.

This patch does not change the libcc1 API as it overloads the triplet_regexp
parameter of GCC's set_arguments.  GCC decides on the meaning of the
triplet_regexp parameter according to the success of:

+  if (access (triplet_regexp, X_OK) == 0)


Jan


gdb/ChangeLog
2015-04-21  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* compile/compile.c (compile_gcc, show_compile_gcc): New.
	(compile_to_object): Implement compile_gcc.
	(_initialize_compile): Install "set compile-gcc".  Initialize
	compile_gcc.

gdb/doc/ChangeLog
2015-04-21  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* doc/gdb.texinfo (Compiling and Injecting Code): Add to subsection
	Compiler search for the compile command descriptions of set
	compile-gcc and show compile-gcc.

include/ChangeLog
2015-04-21  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gcc-interface.h (enum gcc_base_api_version): Add comment to
	GCC_FE_VERSION_1.
	(struct gcc_base_vtable): Describe triplet_regexp parameter overload
	for set_arguments.
---
 gdb/compile/compile.c   | 40 +++++++++++++++++++++++++++++++++-------
 gdb/doc/gdb.texinfo     | 36 ++++++++++++++++++++++++++++++------
 include/gcc-interface.h |  7 +++++--
 3 files changed, 68 insertions(+), 15 deletions(-)
  

Comments

Pedro Alves April 27, 2015, 3:47 p.m. UTC | #1
On 04/23/2015 10:08 PM, Jan Kratochvil wrote:

> @@ -688,4 +704,14 @@ String quoting is parsed like in shell, for example:\n\
>  			 " -fno-stack-protector"
>    );
>    set_compile_args (compile_args, 0, NULL);
> +
> +  add_setshow_filename_cmd ("compile-gcc", class_support,
> +			    &compile_gcc,
> +			    _("Set compile command GCC driver filename"),
> +			    _("Show compile command GCC driver filename"),
> +			    _("\
> +It should be absolute pathname to the gcc executable.\n\
> +If empty the default target triplet will be searched in $PATH."),
> +			    NULL, show_compile_gcc, &setlist, &showlist);
> +  compile_gcc = xstrdup ("");

...

> +@table @code
> +@item set compile-gcc
> +@cindex compile command driver filename override
> +Set compilation command used for compiling and injecting code with the
> +@code{compile} commands.  If this option is not set (it is set to
> +an empty string), the search described above will occur --- that is the
> +default.
> +

IIUC, gdb will always apply the same search as when this is set
empty?  That is, the user can also set this to a regex.  So it seems to me
that the documentation (manual and help) doesn't match the implementation?

Thanks,
Pedro Alves
  
Jan Kratochvil April 27, 2015, 5:54 p.m. UTC | #2
On Mon, 27 Apr 2015 17:47:42 +0200, Pedro Alves wrote:
> IIUC, gdb will always apply the same search as when this is set
> empty?  That is, the user can also set this to a regex.  So it seems to me
> that the documentation (manual and help) doesn't match the implementation?

That it can be also a regex is an API bug because I wanted to make a minimal
API change.  Rather than officially documenting such bug I find then better to
rather make a proper complex change to the API.  Given that you requested an
API rework anyway I will try to post the new API even with this change.


Thanks,
Jan
  
Pedro Alves April 27, 2015, 7:24 p.m. UTC | #3
On 04/27/2015 06:54 PM, Jan Kratochvil wrote:
> On Mon, 27 Apr 2015 17:47:42 +0200, Pedro Alves wrote:
>> IIUC, gdb will always apply the same search as when this is set
>> empty?  That is, the user can also set this to a regex.  So it seems to me
>> that the documentation (manual and help) doesn't match the implementation?
> 
> That it can be also a regex is an API bug because I wanted to make a minimal
> API change.  Rather than officially documenting such bug I find then better to
> rather make a proper complex change to the API.  Given that you requested an
> API rework anyway I will try to post the new API even with this change.

This overload had given me lots of pause, and trying to think it through
(it wasn't clear what the intention was), it seemed to me that it kind of made at
least some sense to allow specifying a different regex, but details of the search
algorithms are foggy to me.  It probably really doesn't make sense to overload.
Given we now clearly understand how to add new methods and it isn't that complex,
and we're already bumping the API, yes, let's please avoid an overload hack
when we don't need it, avoiding such confusions.

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/compile/compile.c b/gdb/compile/compile.c
index 7f4c11d..a4ca7db 100644
--- a/gdb/compile/compile.c
+++ b/gdb/compile/compile.c
@@ -299,6 +299,19 @@  append_args (int *argcp, char ***argvp, int argc, char **argv)
   (*argvp)[(*argcp)] = NULL;
 }
 
+/* String for 'set compile-gcc' and 'show compile-gcc'.  */
+static char *compile_gcc;
+
+/* Implement 'show compile-gcc'.  */
+
+static void
+show_compile_gcc (struct ui_file *file, int from_tty,
+		  struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("Compile command GCC driver filename is \"%s\".\n"),
+		    value);
+}
+
 /* Return DW_AT_producer parsed for get_selected_frame () (if any).
    Return NULL otherwise.
 
@@ -430,8 +443,6 @@  compile_to_object (struct command_line *cmd, char *cmd_string,
   int ok;
   FILE *src;
   struct gdbarch *gdbarch = get_current_arch ();
-  const char *os_rx;
-  const char *arch_rx;
   char *triplet_rx;
   char *error_message;
 
@@ -481,12 +492,17 @@  compile_to_object (struct command_line *cmd, char *cmd_string,
   if (compile_debug)
     fprintf_unfiltered (gdb_stdout, "debug output:\n\n%s", code);
 
-  os_rx = osabi_triplet_regexp (gdbarch_osabi (gdbarch));
-  arch_rx = gdbarch_gnu_triplet_regexp (gdbarch);
+  if (compile_gcc[0] != 0)
+    triplet_rx = compile_gcc;
+  else
+    {
+      const char *os_rx = osabi_triplet_regexp (gdbarch_osabi (gdbarch));
+      const char *arch_rx = gdbarch_gnu_triplet_regexp (gdbarch);
 
-  /* Allow triplets with or without vendor set.  */
-  triplet_rx = concat (arch_rx, "(-[^-]*)?-", os_rx, (char *) NULL);
-  make_cleanup (xfree, triplet_rx);
+      /* Allow triplets with or without vendor set.  */
+      triplet_rx = concat (arch_rx, "(-[^-]*)?-", os_rx, (char *) NULL);
+      make_cleanup (xfree, triplet_rx);
+    }
 
   /* Set compiler command-line arguments.  */
   get_args (compiler, gdbarch, &argc, &argv);
@@ -688,4 +704,14 @@  String quoting is parsed like in shell, for example:\n\
 			 " -fno-stack-protector"
   );
   set_compile_args (compile_args, 0, NULL);
+
+  add_setshow_filename_cmd ("compile-gcc", class_support,
+			    &compile_gcc,
+			    _("Set compile command GCC driver filename"),
+			    _("Show compile command GCC driver filename"),
+			    _("\
+It should be absolute pathname to the gcc executable.\n\
+If empty the default target triplet will be searched in $PATH."),
+			    NULL, show_compile_gcc, &setlist, &showlist);
+  compile_gcc = xstrdup ("");
 }
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 0410702..cbcc2ee 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -17435,13 +17435,15 @@  will print to the console.
 
 @subsection Compiler search for the @code{compile} command
 
-@value{GDBN} needs to find @value{NGCC} for the inferior being debugged which
-may not be obvious for remote targets of different architecture than where
-@value{GDBN} is running.  Environment variable @code{PATH} (@code{PATH} from
-shell that executed @value{GDBN}, not the one set by @value{GDBN}
-command @code{set environment}).  @xref{Environment}.  @code{PATH} on
+@value{GDBN} needs to find @value{NGCC} for the inferior being debugged
+which may not be obvious for remote targets of different architecture
+than where @value{GDBN} is running.  Environment variable @code{PATH} on
 @value{GDBN} host is searched for @value{NGCC} binary matching the
-target architecture and operating system.
+target architecture and operating system.  This search can be overriden
+by @code{set compile-gcc} @value{GDBN} command below.  @code{PATH} is
+taken from shell that executed @value{GDBN}, it is not the value set by
+@value{GDBN} command @code{set environment}).  @xref{Environment}.
+
 
 Specifically @code{PATH} is searched for binaries matching regular expression
 @code{@var{arch}(-[^-]*)?-@var{os}-gcc} according to the inferior target being
@@ -17451,6 +17453,28 @@  example both @code{i386} and @code{x86_64} targets look for pattern
 for pattern @code{s390x?}.  @var{os} is currently supported only for
 pattern @code{linux(-gnu)?}.
 
+On Posix hosts the compiler driver @value{GDBN} needs to find also
+shared library @file{libcc1.so} from the compiler.  It is searched in
+default shared library search path (overridable with usual environment
+variable @code{LD_LIBRARY_PATH}), unrelated to @code{PATH} or @code{set
+compile-gcc} settings.  Contrary to it @file{libcc1plugin.so} is found
+according to the installation of the found compiler --- as possibly
+specified by the @code{set compile-gcc} command.
+
+@table @code
+@item set compile-gcc
+@cindex compile command driver filename override
+Set compilation command used for compiling and injecting code with the
+@code{compile} commands.  If this option is not set (it is set to
+an empty string), the search described above will occur --- that is the
+default.
+
+@item show compile-gcc
+Displays the current compile command @value{NGCC} driver filename.
+If set, it is the main command @code{gcc}, found usually for example
+under name @code{x86_64-linux-gnu-gcc}.
+@end table
+
 @node GDB Files
 @chapter @value{GDBN} Files
 
diff --git a/include/gcc-interface.h b/include/gcc-interface.h
index c11b7a1..81925b1 100644
--- a/include/gcc-interface.h
+++ b/include/gcc-interface.h
@@ -46,7 +46,9 @@  enum gcc_base_api_version
 {
   GCC_FE_VERSION_0 = 0,
 
-  /* Parameter verbose has been moved from compile to set_arguments.  */
+  /* Parameter verbose has been moved from compile to set_arguments.
+     Parameter triplet_regexp of set_arguments can be also gcc driver
+     executable.  */
   GCC_FE_VERSION_1 = 1,
 };
 
@@ -104,7 +106,8 @@  struct gcc_base_vtable
 
   /* Set the compiler's command-line options for the next compilation.
      TRIPLET_REGEXP is a regular expression that is used to match the
-     configury triplet prefix to the compiler.
+     configury triplet prefix to the compiler; TRIPLET_REGEXP can be
+     also absolute filename  to the computer.
      The arguments are copied by GCC.  ARGV need not be
      NULL-terminated.  The arguments must be set separately for each
      compilation; that is, after a compile is requested, the