Re: [PATCH 4/5] libcc1: Add 'set compile-gcc'

2015-04-22 Thread Jeff Law

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.st...@host1.jankratochvil.net>


Jan


include/ChangeLog
2015-04-21  Jan Kratochvil  

* 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  

* libcc1.cc (libcc1_set_arguments): Implement filenames for
triplet_regexp.

OK.  Please install on the trunk.

jeff



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

2015-04-21 Thread Jan Kratochvil
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.st...@host1.jankratochvil.net>


Jan


include/ChangeLog
2015-04-21  Jan Kratochvil  

* 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  

* 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 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);