[4/5] libcc1: Add 'set compile-gcc'
diff mbox

Message ID 20150421214131.14972.57617.stgit@host1.jankratochvil.net
State New
Headers show

Commit Message

Jan Kratochvil April 21, 2015, 9:41 p.m. UTC
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.  GDB would provide new option 'set compile-gcc'.

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

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

GDB counterpart:
	[PATCH 4/4] compile: Add 'set compile-gcc'
	https://sourceware.org/ml/gdb-patches/2015-04/msg00808.html
	Message-ID: <20150421213657.14147.60506.stgit@host1.jankratochvil.net>


Jan


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.

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

	* libcc1.cc (libcc1_set_arguments): Implement filenames for
	triplet_regexp.
---
 include/gcc-interface.h |    7 ++++-
 libcc1/libcc1.cc        |   62 +++++++++++++++++++++++++++--------------------
 2 files changed, 41 insertions(+), 28 deletions(-)

Comments

Jeff Law April 22, 2015, 1:10 p.m. UTC | #1
On 04/21/2015 03:41 PM, Jan Kratochvil wrote:
> 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.  GDB would provide new option 'set compile-gcc'.
>
> This patch does not change the libcc1 API as it overloads the triplet_regexp
> parameter of GCC's set_arguments according to:
>
> +  if (access (triplet_regexp, X_OK) == 0)
>
> GDB counterpart:
> 	[PATCH 4/4] compile: Add 'set compile-gcc'
> 	https://sourceware.org/ml/gdb-patches/2015-04/msg00808.html
> 	Message-ID: <20150421213657.14147.60506.stgit@host1.jankratochvil.net>
>
>
> Jan
>
>
> 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.
>
> libcc1/ChangeLog
> 2015-04-21  Jan Kratochvil  <jan.kratochvil@redhat.com>
>
> 	* libcc1.cc (libcc1_set_arguments): Implement filenames for
> 	triplet_regexp.
OK.  Please install on the trunk.

jeff

Patch
diff mbox

diff --git a/include/gcc-interface.h b/include/gcc-interface.h
index dd9fd50..a15edf7 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,
 };
 
@@ -69,7 +71,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
diff --git a/libcc1/libcc1.cc b/libcc1/libcc1.cc
index d36073d..e2718b0 100644
--- a/libcc1/libcc1.cc
+++ b/libcc1/libcc1.cc
@@ -322,38 +322,48 @@  libcc1_set_arguments (struct gcc_base_context *s,
 
   self->verbose = verbose != 0;
 
-  std::string rx = make_regexp (triplet_regexp, COMPILER_NAME);
-  // Simulate fnotice by fprintf.
-  if (self->verbose)
-    fprintf (stderr, _("searching for compiler matching regex %s\n"),
-	     rx.c_str());
-  code = regcomp (&triplet, rx.c_str (), REG_EXTENDED | REG_NOSUB);
-  if (code != 0)
+  std::string compiler;
+  if (access (triplet_regexp, X_OK) == 0)
     {
-      size_t len = regerror (code, &triplet, NULL, 0);
-      char err[len];
+      compiler = triplet_regexp;
+      // Simulate fnotice by fprintf.
+      if (self->verbose)
+	fprintf (stderr, _("using explicit compiler filename %s\n"),
+		 compiler.c_str());
+    }
+  else
+    {
+      std::string rx = make_regexp (triplet_regexp, COMPILER_NAME);
+      if (self->verbose)
+	fprintf (stderr, _("searching for compiler matching regex %s\n"),
+		 rx.c_str());
+      code = regcomp (&triplet, rx.c_str (), REG_EXTENDED | REG_NOSUB);
+      if (code != 0)
+	{
+	  size_t len = regerror (code, &triplet, NULL, 0);
+	  char err[len];
 
-      regerror (code, &triplet, err, len);
+	  regerror (code, &triplet, err, len);
 
-      return concat ("Could not compile regexp \"",
-		     rx.c_str (),
-		     "\": ",
-		     err,
-		     (char *) NULL);
-    }
+	  return concat ("Could not compile regexp \"",
+			 rx.c_str (),
+			 "\": ",
+			 err,
+			 (char *) NULL);
+	}
 
-  std::string compiler;
-  if (!find_compiler (triplet, &compiler))
-    {
+      if (!find_compiler (triplet, &compiler))
+	{
+	  regfree (&triplet);
+	  return concat ("Could not find a compiler matching \"",
+			 rx.c_str (),
+			 "\"",
+			 (char *) NULL);
+	}
       regfree (&triplet);
-      return concat ("Could not find a compiler matching \"",
-		     rx.c_str (),
-		     "\"",
-		     (char *) NULL);
+      if (self->verbose)
+	fprintf (stderr, _("found compiler %s\n"), compiler.c_str());
     }
-  regfree (&triplet);
-  if (self->verbose)
-    fprintf (stderr, _("found compiler %s\n"), compiler.c_str());
 
   self->args.push_back (compiler);