Commit fe7df9c4 by Seongbae Park Committed by Seongbae Park

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
parent 802367d7
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.
2008-04-30 Nathan Froyd <froydnj@codesourcery.com>
* config/rs6000/crtresgpr.asm, config/rs6000/crtresxgpr.asm,
......
......@@ -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
......
......@@ -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. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment