This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]