diff options
author | spark <spark@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-04-30 17:17:03 +0000 |
---|---|---|
committer | spark <spark@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-04-30 17:17:03 +0000 |
commit | 0bfd146ec9e6d100b38e18f073290cdfe6826cea (patch) | |
tree | e5863017314cc101fa7a9d8a03e7d9cbe311e6c5 /gcc/gcc.c | |
parent | f955bfc411e31faaa688bd36d253c59d88cf5cc1 (diff) | |
download | gcc-0bfd146ec9e6d100b38e18f073290cdfe6826cea.tar.gz |
2008-04-30 Seongbae Park <seongbae.park@gmail.com>
* gcc.c (wrapper_string): New variable.
(insert_wrapper): New function.
(execute): New option -wrapper.
* doc/invoke.texi (Overall Options): New driver option -wrapper.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@134832 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gcc.c')
-rw-r--r-- | gcc/gcc.c | 83 |
1 files changed, 79 insertions, 4 deletions
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. */ |