aboutsummaryrefslogtreecommitdiff
path: root/gcc/gcc.c
diff options
context:
space:
mode:
authorSeongbae Park <seongbae.park@gmail.com>2008-04-30 17:17:03 +0000
committerSeongbae Park <spark@gcc.gnu.org>2008-04-30 17:17:03 +0000
commitfe7df9c4566e75472fbf5322ca1a6495b197426f (patch)
treee5863017314cc101fa7a9d8a03e7d9cbe311e6c5 /gcc/gcc.c
parent802367d7c9052b80798421c6452f1361b75bcf32 (diff)
downloadgcc-fe7df9c4566e75472fbf5322ca1a6495b197426f.zip
gcc-fe7df9c4566e75472fbf5322ca1a6495b197426f.tar.gz
gcc-fe7df9c4566e75472fbf5322ca1a6495b197426f.tar.bz2
gcc.c (wrapper_string): New variable.
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. From-SVN: r134832
Diffstat (limited to 'gcc/gcc.c')
-rw-r--r--gcc/gcc.c83
1 files changed, 79 insertions, 4 deletions
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 0636579..b9ca229 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. */