This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] new driver level option -wrapper for developer convenience.
- From: "Seongbae Park (박성배, 朴成培)" <seongbae dot park at gmail dot com>
- To: gcc-patches <gcc-patches at gcc dot gnu dot org>, neil at daikokuya dot co dot uk
- Date: Fri, 4 Apr 2008 11:13:38 -0700
- Subject: [PATCH] new driver level option -wrapper for developer convenience.
2008-04-04 Seongbae Park <seongbae.park@gmail.com>
* gcc.c (wrapper_string): New variable.
(insert_wrapper): New function declaration.
(execute): New option -wrapper.
(insert_wrapper): New function.
* doc/invoke.texi (Overall Options): New driver option -wrapper.
This patch adds a new option -wrapper for the convenience of the developers.
This option can be used to invoke all subcommands of gcc
under gdb or any profiling/debugging programs easily.
e.g.
gcc -wraper gdb,--args ...
would invoke all subprograms (usually cc1/cc1plus first) under gdb.
Or you can use it to invoke, e.g., strace around cc1 or other components,
or under any profiler or valgrind.
This is a direct port from 4.1 days, and I haven't paid much attention
to the code
so it might have gross errors in them - so please take more careful look.
I did a cursory testing and it seems to work but I'm not at all
familiar with gcc.c file...
Seongbae
Index: gcc.c
===================================================================
--- gcc.c (revision 133814)
+++ gcc.c (working copy)
@@ -285,12 +285,21 @@ static struct obstack obstack;
static struct obstack collect_obstack;
+/* This is a list of a wrapper program and its arguments.
+ e.g. wrapper_string of "strace,-c"
+ will cause all programs to run as
+ strace -c program arguments
+ instead of just
+ program arguments */
+static const char *wrapper_string;
+
/* Forward declaration for prototypes. */
struct path_prefix;
struct prefix_list;
static void init_spec (void);
static void store_arg (const char *, int, int);
+static void insert_wrapper (const char *);
static char *load_specs (const char *);
static void read_specs (const char *, int);
static void set_spec (const char *, const char *);
@@ -2842,6 +2851,13 @@ execute (void)
gcc_assert (!processing_spec_function);
+ if (wrapper_string)
+ {
+ string = find_a_file (&exec_prefixes, argbuf[0], X_OK, false);
+ argbuf[0] = (string) ? string : argbuf[0];
+ insert_wrapper (wrapper_string);
+ }
+
/* Count # of piped commands. */
for (n_commands = 1, i = 0; i < argbuf_index; i++)
if (strcmp (argbuf[i], "|") == 0)
@@ -2856,10 +2872,12 @@ execute (void)
commands[0].prog = argbuf[0]; /* first command. */
commands[0].argv = &argbuf[0];
- string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
-
- if (string)
- commands[0].argv[0] = string;
+
+ if (!wrapper_string)
+ {
+ string = find_a_file (&exec_prefixes, commands[0].prog, X_OK, false);
+ commands[0].argv[0] = (string) ? string : commands[0].argv[0];
+ }
for (n_commands = 1, i = 0; i < argbuf_index; i++)
if (strcmp (argbuf[i], "|") == 0)
@@ -3795,6 +3813,15 @@ warranty; not even for MERCHANTABILITY o
use_pipes = 1;
n_switches++;
}
+ else if (strcmp (argv[i], "-wrapper") == 0)
+ {
+ if (++i >= argc)
+ fatal ("argument to '-wrapper' is missing");
+
+ wrapper_string = argv[i];
+ n_switches++;
+ n_switches++;
+ }
else if (strcmp (argv[i], "-###") == 0)
{
/* This is similar to -v except that there is no execution
@@ -4160,6 +4187,8 @@ warranty; not even for MERCHANTABILITY o
infiles[n_infiles].language = "*";
infiles[n_infiles++].name = argv[i];
}
+ else if (strcmp (argv[i], "-wrapper") == 0)
+ i++;
else if (strcmp (argv[i], "-specs") == 0)
i++;
else if (strncmp (argv[i], "-specs=", 7) == 0)
@@ -4411,6 +4440,47 @@ end_going_arg (void)
}
}
+
+/* Parse the WRAPPER string which is a comma separated list of the command line
+ and insert them into the beginning of argbuf. */
+
+static void
+insert_wrapper (const char *wrapper)
+{
+ int n = 0;
+ int i;
+ char *buf = xstrdup (wrapper);
+ char *p = buf;
+
+ do {
+ n++;
+ while (*p == ',') p++;
+ } while((p = strchr(p, ',')) != NULL);
+
+ if (argbuf_index + n >= argbuf_length)
+ {
+ argbuf_length = argbuf_length * 2;
+ while (argbuf_length < argbuf_index + n) argbuf_length *= 2;
+ argbuf = xrealloc (argbuf, argbuf_length * sizeof (const char *));
+ }
+ for (i = argbuf_index - 1; i >= 0; i--)
+ {
+ argbuf[i + n] = argbuf[i];
+ }
+
+ i = 0;
+ p = buf;
+ do {
+ while (*p == ',') {
+ *p = 0;
+ p++;
+ }
+ argbuf[i++] = p;
+ } while((p = strchr(p, ',')) != NULL);
+ gcc_assert (i == n);
+ argbuf_index += n;
+}
+
/* Process the spec SPEC and run the commands specified therein.
Returns 0 if the spec is successfully processed; -1 if failed. */
Index: doc/invoke.texi
===================================================================
--- doc/invoke.texi (revision 133814)
+++ doc/invoke.texi (working copy)
@@ -164,7 +164,7 @@ in the following sections.
@xref{Overall Options,,Options Controlling the Kind of Output}.
@gccoptlist{-c -S -E -o @var{file} -combine -pipe -pass-exit-codes @gol
-x @var{language} -v -### --help@r{[}=@var{class}@r{]} --target-help @gol
---version @@@var{file}}
+--version -wrapper@@@var{file}}
@item C Language Options
@xref{C Dialect Options,,Options Controlling C Dialect}.
@@ -1244,6 +1244,19 @@ diff /tmp/O2-opts /tmp/O3-opts | grep en
@opindex version
Display the version number and copyrights of the invoked GCC@.
+@item -wrapper
+@opindex wrapper
+Invoke all subcommands under a wrapper program. It takes a single
+comma separated list as an argument, which will be used to invoke
+the wrapper:
+
+@smallexample
+gcc -c t.c -wraper gdb,--args
+@end smallexample
+
+This will invoke all subprograms of gcc under "gdb --args",
+thus cc1 invocation will be "gdb --args cc1 ...".
+
@include @value{srcdir}/../libiberty/at-file.texi
@end table