[PATCH v2 3/4] libcc1: Add 'set compile-gcc'

Jan Kratochvil jan.kratochvil@redhat.com
Thu Apr 23 20:38:00 GMT 2015


Hi,

already approved, reposting just to keep it a part of the series:
	https://gcc.gnu.org/ml/gcc-patches/2015-04/msg01299.html

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 v2 2/2] compile: Add 'set compile-gcc'
	https://sourceware.org/ml/gdb-patches/2015-04/msg00910.html
	Message-ID: <20150423203402.23140.92757.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(-)

diff --git a/include/gcc-interface.h b/include/gcc-interface.h
index 21cc403..95b9b12 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
diff --git a/libcc1/libcc1.cc b/libcc1/libcc1.cc
index 06a91f6..c2a1d5f 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);
 



More information about the Gcc-patches mailing list