From fe7df9c4566e75472fbf5322ca1a6495b197426f Mon Sep 17 00:00:00 2001 From: Seongbae Park Date: Wed, 30 Apr 2008 17:17:03 +0000 Subject: [PATCH] gcc.c (wrapper_string): New variable. 2008-04-30 Seongbae Park * gcc.c (wrapper_string): New variable. (insert_wrapper): New function. (execute): New option -wrapper. * doc/invoke.texi (Overall Options): New driver option -wrapper. From-SVN: r134832 --- gcc/ChangeLog | 7 ++++ gcc/doc/invoke.texi | 15 +++++++- gcc/gcc.c | 83 ++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 100 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e02823bee78..ae74e649a9b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-04-30 Seongbae Park + + * gcc.c (wrapper_string): New variable. + (insert_wrapper): New function. + (execute): New option -wrapper. + * doc/invoke.texi (Overall Options): New driver option -wrapper. + 2008-04-30 Nathan Froyd * config/rs6000/crtresgpr.asm, config/rs6000/crtresxgpr.asm, diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index bb7be99e7d2..dfd22afab6c 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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}. @@ -1251,6 +1251,19 @@ diff /tmp/O2-opts /tmp/O3-opts | grep enabled @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 -wrapper 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 diff --git a/gcc/gcc.c b/gcc/gcc.c index 0636579644f..b9ca2293149 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -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 *); @@ -2845,6 +2854,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) @@ -2859,10 +2875,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) @@ -3798,6 +3816,15 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n" 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 @@ -4163,6 +4190,8 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n" 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) @@ -4414,6 +4443,52 @@ 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. */ -- 2.30.2