Patchwork Use vec.h in the driver

login
register
mail settings
Submitter Joseph S. Myers
Date Nov. 16, 2010, 12:23 a.m.
Message ID <Pine.LNX.4.64.1011160022410.29540@digraph.polyomino.org.uk>
Download mbox | patch
Permalink /patch/71321/
State New
Headers show

Comments

Joseph S. Myers - Nov. 16, 2010, 12:23 a.m.
The handling of some options involves storing things in VECs.  For
sharing more option handling with the driver, this means that either
VECs need to be usable from the driver, or the handing of those
options needs to be moved to code that is not shared with the driver.

Moving that handling means deferring the options in
common_handle_option - and the natural structure for storing deferred
options is also a VEC.

In addition, gcc.c has seven resized arrays for which VEC is a natural
structure: argbuf, compilers, preprocessor_options, assembler_options,
linker_options, infiles, switches.  So it seems generally useful to
make VECs available to the driver.  This patch does so, converting
argbuf as an initial use of VECs there.  (I have no immediate plans to
convert the other six arrays.)

Because of the interaction of VECs and garbage collection, this patch
links ggc-none.o into the driver, as is already done for some other
parts of the compiler.  I didn't think of ggc-none.o when dealing with
pretty-print.c dependence on garbage collection
<http://gcc.gnu.org/ml/gcc-patches/2010-05/msg02005.html>, but the
control of allocators for identifier_to_locale there seems
unnecessarily complex in the light of ggc-none.o, and it might make
sense to revert that patch and just rely on code using pretty-print.o
also using ggc-none.o.

Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  OK to
commit?

2010-11-15  Joseph Myers  <joseph@codesourcery.com>

	* gcc.c: Include "vec.h".
	(argbuf): Make into a VEC.
	(argbuf_length, argbuf_index): Remove.
	(alloc_args, clear_args, store_arg, execute, insert_wrapper,
	do_spec, do_self_spec, do_spec_1, eval_spec_function, main,
	compare_debug_dump_opt_spec_function: Use VEC interfaces on
	argbuf.
	* Makefile.in (GCC_OBJS): Add vec.o and ggc-none.o.
	(gcc.o): Depend on $(VEC_H).
Richard Henderson - Nov. 16, 2010, 12:48 a.m.
On 11/15/2010 04:23 PM, Joseph S. Myers wrote:
> 	* gcc.c: Include "vec.h".
> 	(argbuf): Make into a VEC.
> 	(argbuf_length, argbuf_index): Remove.
> 	(alloc_args, clear_args, store_arg, execute, insert_wrapper,
> 	do_spec, do_self_spec, do_spec_1, eval_spec_function, main,
> 	compare_debug_dump_opt_spec_function: Use VEC interfaces on
> 	argbuf.
> 	* Makefile.in (GCC_OBJS): Add vec.o and ggc-none.o.
> 	(gcc.o): Depend on $(VEC_H).

Ok.


r~

Patch

Index: gcc/gcc.c
===================================================================
--- gcc/gcc.c	(revision 166752)
+++ gcc/gcc.c	(working copy)
@@ -47,6 +47,7 @@  compilation is specified by a string cal
 #include "diagnostic.h"
 #include "flags.h"
 #include "opts.h"
+#include "vec.h"
 
 #ifdef HAVE_MMAP_FILE
 # include <sys/mman.h>
@@ -1503,19 +1504,15 @@  set_spec (const char *name, const char *
 
 /* Accumulate a command (program name and args), and run it.  */
 
-/* Vector of pointers to arguments in the current line of specifications.  */
-
-static const char **argbuf;
-
-/* Number of elements allocated in argbuf.  */
+typedef const char *const_char_p; /* For DEF_VEC_P.  */
+DEF_VEC_P(const_char_p);
+DEF_VEC_ALLOC_P(const_char_p,heap);
 
-static int argbuf_length;
-
-/* Number of elements in argbuf currently in use (containing args).  */
+/* Vector of pointers to arguments in the current line of specifications.  */
 
-static int argbuf_index;
+static VEC(const_char_p,heap) *argbuf;
 
-/* Position in the argbuf array containing the name of the output file
+/* Position in the argbuf vector containing the name of the output file
    (the value associated with the "-o" flag).  */
 
 static int have_o_argbuf_index = 0;
@@ -1552,8 +1549,7 @@  static int signal_count;
 static void
 alloc_args (void)
 {
-  argbuf_length = 10;
-  argbuf = XNEWVEC (const char *, argbuf_length);
+  argbuf = VEC_alloc (const_char_p, heap, 10);
 }
 
 /* Clear out the vector of arguments (after a command is executed).  */
@@ -1561,7 +1557,7 @@  alloc_args (void)
 static void
 clear_args (void)
 {
-  argbuf_index = 0;
+  VEC_truncate (const_char_p, argbuf, 0);
 }
 
 /* Add one argument to the vector at the end.
@@ -1574,14 +1570,10 @@  clear_args (void)
 static void
 store_arg (const char *arg, int delete_always, int delete_failure)
 {
-  if (argbuf_index + 1 == argbuf_length)
-    argbuf = XRESIZEVEC (const char *, argbuf, (argbuf_length *= 2));
-
-  argbuf[argbuf_index++] = arg;
-  argbuf[argbuf_index] = 0;
+  VEC_safe_push (const_char_p, heap, argbuf, arg);
 
   if (strcmp (arg, "-o") == 0)
-    have_o_argbuf_index = argbuf_index;
+    have_o_argbuf_index = VEC_length (const_char_p, argbuf);
   if (delete_always || delete_failure)
     {
       const char *p;
@@ -2459,6 +2451,7 @@  execute (void)
     const char *prog;		/* program name.  */
     const char **argv;		/* vector of args.  */
   };
+  const char *arg;
 
   struct command *commands;	/* each command buffer with above info.  */
 
@@ -2466,14 +2459,16 @@  execute (void)
 
   if (wrapper_string)
     {
-      string = find_a_file (&exec_prefixes, argbuf[0], X_OK, false);
-      argbuf[0] = (string) ? string : argbuf[0];
+      string = find_a_file (&exec_prefixes,
+			    VEC_index (const_char_p, argbuf, 0), X_OK, false);
+      if (string)
+	VEC_replace (const_char_p, argbuf, 0, string);
       insert_wrapper (wrapper_string);
     }
 
   /* Count # of piped commands.  */
-  for (n_commands = 1, i = 0; i < argbuf_index; i++)
-    if (strcmp (argbuf[i], "|") == 0)
+  for (n_commands = 1, i = 0; VEC_iterate (const_char_p, argbuf, i, arg); i++)
+    if (strcmp (arg, "|") == 0)
       n_commands++;
 
   /* Get storage for each command.  */
@@ -2483,8 +2478,10 @@  execute (void)
      and record info about each one.
      Also search for the programs that are to be run.  */
 
-  commands[0].prog = argbuf[0]; /* first command.  */
-  commands[0].argv = &argbuf[0];
+  VEC_safe_push (const_char_p, heap, argbuf, 0);
+
+  commands[0].prog = VEC_index (const_char_p, argbuf, 0); /* first command.  */
+  commands[0].argv = VEC_address (const_char_p, argbuf);
 
   if (!wrapper_string)
     {
@@ -2492,15 +2489,17 @@  execute (void)
       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)
+  for (n_commands = 1, i = 0; VEC_iterate (const_char_p, argbuf, i, arg); i++)
+    if (arg && strcmp (arg, "|") == 0)
       {				/* each command.  */
 #if defined (__MSDOS__) || defined (OS2) || defined (VMS)
 	fatal_error ("-pipe not supported");
 #endif
-	argbuf[i] = 0;	/* termination of command args.  */
-	commands[n_commands].prog = argbuf[i + 1];
-	commands[n_commands].argv = &argbuf[i + 1];
+	VEC_replace (const_char_p, argbuf, i, 0); /* Termination of
+						     command args.  */
+	commands[n_commands].prog = VEC_index (const_char_p, argbuf, i + 1);
+	commands[n_commands].argv
+	  = &(VEC_address (const_char_p, argbuf))[i + 1];
 	string = find_a_file (&exec_prefixes, commands[n_commands].prog,
 			      X_OK, false);
 	if (string)
@@ -2508,8 +2507,6 @@  execute (void)
 	n_commands++;
       }
 
-  argbuf[argbuf_index] = 0;
-
   /* If -v, print what we are about to do, and maybe query.  */
 
   if (verbose_flag)
@@ -4104,6 +4101,7 @@  insert_wrapper (const char *wrapper)
   int i;
   char *buf = xstrdup (wrapper);
   char *p = buf;
+  unsigned int old_length = VEC_length (const_char_p, argbuf);
 
   do
     {
@@ -4113,15 +4111,10 @@  insert_wrapper (const char *wrapper)
     }
   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 = XRESIZEVEC (const char *, argbuf, argbuf_length);
-    }
-  for (i = argbuf_index - 1; i >= 0; i--)
-    argbuf[i + n] = argbuf[i];
+  VEC_safe_grow (const_char_p, heap, argbuf, old_length + n);
+  memmove (VEC_address (const_char_p, argbuf) + n,
+	   VEC_address (const_char_p, argbuf),
+	   old_length * sizeof (const_char_p));
 
   i = 0;
   p = buf;
@@ -4132,11 +4125,11 @@  insert_wrapper (const char *wrapper)
           *p = 0;
           p++;
         }
-      argbuf[i++] = p;
+      VEC_replace (const_char_p, argbuf, i, p);
+      i++;
     }
   while ((p = strchr (p, ',')) != NULL);
   gcc_assert (i == n);
-  argbuf_index += n;
 }
 
 /* Process the spec SPEC and run the commands specified therein.
@@ -4153,12 +4146,13 @@  do_spec (const char *spec)
      If -pipe, this forces out the last command if it ended in `|'.  */
   if (value == 0)
     {
-      if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
-	argbuf_index--;
+      if (VEC_length (const_char_p, argbuf) > 0
+	  && !strcmp (VEC_last (const_char_p, argbuf), "|"))
+	VEC_pop (const_char_p, argbuf);
 
       set_collect_gcc_options ();
 
-      if (argbuf_index > 0)
+      if (VEC_length (const_char_p, argbuf) > 0)
 	value = execute ();
     }
 
@@ -4254,7 +4248,7 @@  do_self_spec (const char *spec)
     if ((switches[i].live_cond & SWITCH_IGNORE))
       switches[i].live_cond |= SWITCH_IGNORE_PERMANENTLY;
 
-  if (argbuf_index > 0)
+  if (VEC_length (const_char_p, argbuf) > 0)
     {
       const char **argbuf_copy;
       struct cl_decoded_option *decoded_options;
@@ -4264,11 +4258,14 @@  do_self_spec (const char *spec)
 
       /* Create a copy of argbuf with a dummy argv[0] entry for
 	 decode_cmdline_options_to_array.  */
-      argbuf_copy = XNEWVEC (const char *, argbuf_index + 1);
+      argbuf_copy = XNEWVEC (const char *,
+			     VEC_length (const_char_p, argbuf) + 1);
       argbuf_copy[0] = "";
-      memcpy (argbuf_copy + 1, argbuf, argbuf_index * sizeof (const char *));
+      memcpy (argbuf_copy + 1, VEC_address (const_char_p, argbuf),
+	      VEC_length (const_char_p, argbuf) * sizeof (const char *));
 
-      decode_cmdline_options_to_array (argbuf_index + 1, argbuf_copy,
+      decode_cmdline_options_to_array (VEC_length (const_char_p, argbuf) + 1,
+				       argbuf_copy,
 				       CL_DRIVER, &decoded_options,
 				       &decoded_options_count);
 
@@ -4435,7 +4432,8 @@  do_spec_1 (const char *spec, int inswitc
       case '\n':
 	end_going_arg ();
 
-	if (argbuf_index > 0 && !strcmp (argbuf[argbuf_index - 1], "|"))
+	if (VEC_length (const_char_p, argbuf) > 0
+	    && !strcmp (VEC_last (const_char_p, argbuf), "|"))
 	  {
 	    /* A `|' before the newline means use a pipe here,
 	       but only if -pipe was specified.
@@ -4446,12 +4444,12 @@  do_spec_1 (const char *spec, int inswitc
 		break;
 	      }
 	    else
-	      argbuf_index--;
+	      VEC_pop (const_char_p, argbuf);
 	  }
 
 	set_collect_gcc_options ();
 
-	if (argbuf_index > 0)
+	if (VEC_length (const_char_p, argbuf) > 0)
 	  {
 	    value = execute ();
 	    if (value)
@@ -4947,7 +4945,7 @@  do_spec_1 (const char *spec, int inswitc
 
 	  case 'W':
 	    {
-	      int cur_index = argbuf_index;
+	      unsigned int cur_index = VEC_length (const_char_p, argbuf);
 	      /* Handle the {...} following the %W.  */
 	      if (*p != '{')
 		fatal_error ("spec %qs has invalid %<%%W%c%>", spec, *p);
@@ -4957,8 +4955,8 @@  do_spec_1 (const char *spec, int inswitc
 	      end_going_arg ();
 	      /* If any args were output, mark the last one for deletion
 		 on failure.  */
-	      if (argbuf_index != cur_index)
-		record_temp_file (argbuf[argbuf_index - 1], 0, 1);
+	      if (VEC_length (const_char_p, argbuf) != cur_index)
+		record_temp_file (VEC_last (const_char_p, argbuf), 0, 1);
 	      break;
 	    }
 
@@ -5302,9 +5300,7 @@  eval_spec_function (const char *func, co
   const char *funcval;
 
   /* Saved spec processing context.  */
-  int save_argbuf_index;
-  int save_argbuf_length;
-  const char **save_argbuf;
+  VEC(const_char_p,heap) *save_argbuf;
 
   int save_arg_going;
   int save_delete_this_arg;
@@ -5320,8 +5316,6 @@  eval_spec_function (const char *func, co
     fatal_error ("unknown spec function %qs", func);
 
   /* Push the spec processing context.  */
-  save_argbuf_index = argbuf_index;
-  save_argbuf_length = argbuf_length;
   save_argbuf = argbuf;
 
   save_arg_going = arg_going;
@@ -5342,12 +5336,11 @@  eval_spec_function (const char *func, co
   /* argbuf_index is an index for the next argument to be inserted, and
      so contains the count of the args already inserted.  */
 
-  funcval = (*sf->func) (argbuf_index, argbuf);
+  funcval = (*sf->func) (VEC_length (const_char_p, argbuf),
+			 VEC_address (const_char_p, argbuf));
 
   /* Pop the spec processing context.  */
-  argbuf_index = save_argbuf_index;
-  argbuf_length = save_argbuf_length;
-  free (argbuf);
+  VEC_free (const_char_p, heap, argbuf);
   argbuf = save_argbuf;
 
   arg_going = save_arg_going;
@@ -6320,10 +6313,10 @@  main (int argc, char **argv)
   if (*sysroot_suffix_spec != 0
       && do_spec_2 (sysroot_suffix_spec) == 0)
     {
-      if (argbuf_index > 1)
+      if (VEC_length (const_char_p, argbuf) > 1)
         error ("spec failure: more than one arg to SYSROOT_SUFFIX_SPEC");
-      else if (argbuf_index == 1)
-        target_sysroot_suffix = xstrdup (argbuf[argbuf_index -1]);
+      else if (VEC_length (const_char_p, argbuf) == 1)
+        target_sysroot_suffix = xstrdup (VEC_last (const_char_p, argbuf));
     }
 
 #ifdef HAVE_LD_SYSROOT
@@ -6343,10 +6336,10 @@  main (int argc, char **argv)
   if (*sysroot_hdrs_suffix_spec != 0
       && do_spec_2 (sysroot_hdrs_suffix_spec) == 0)
     {
-      if (argbuf_index > 1)
+      if (VEC_length (const_char_p, argbuf) > 1)
         error ("spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC");
-      else if (argbuf_index == 1)
-        target_sysroot_hdrs_suffix = xstrdup (argbuf[argbuf_index -1]);
+      else if (VEC_length (const_char_p, argbuf) == 1)
+        target_sysroot_hdrs_suffix = xstrdup (VEC_last (const_char_p, argbuf));
     }
 
   /* Look for startfiles in the standard places.  */
@@ -6354,9 +6347,10 @@  main (int argc, char **argv)
       && do_spec_2 (startfile_prefix_spec) == 0
       && do_spec_1 (" ", 0, NULL) == 0)
     {
+      const char *arg;
       int ndx;
-      for (ndx = 0; ndx < argbuf_index; ndx++)
-	add_sysrooted_prefix (&startfile_prefixes, argbuf[ndx], "BINUTILS",
+      FOR_EACH_VEC_ELT (const_char_p, argbuf, ndx, arg)
+	add_sysrooted_prefix (&startfile_prefixes, arg, "BINUTILS",
 			      PREFIX_PRIORITY_LAST, 0, 1);
     }
   /* We should eventually get rid of all these and stick to
@@ -8087,19 +8081,20 @@  compare_debug_dump_opt_spec_function (in
   do_spec_2 ("%{fdump-final-insns=*:%*}");
   do_spec_1 (" ", 0, NULL);
 
-  if (argbuf_index > 0 && strcmp (argv[argbuf_index - 1], "."))
+  if (VEC_length (const_char_p, argbuf) > 0
+      && strcmp (argv[VEC_length (const_char_p, argbuf) - 1], "."))
     {
       if (!compare_debug)
 	return NULL;
 
-      name = xstrdup (argv[argbuf_index - 1]);
+      name = xstrdup (argv[VEC_length (const_char_p, argbuf) - 1]);
       ret = NULL;
     }
   else
     {
       const char *ext = NULL;
 
-      if (argbuf_index > 0)
+      if (VEC_length (const_char_p, argbuf) > 0)
 	{
 	  do_spec_2 ("%{o*:%*}%{!o:%{!S:%b%O}%{S:%b.s}}");
 	  ext = ".gkd";
@@ -8111,9 +8106,9 @@  compare_debug_dump_opt_spec_function (in
 
       do_spec_1 (" ", 0, NULL);
 
-      gcc_assert (argbuf_index > 0);
+      gcc_assert (VEC_length (const_char_p, argbuf) > 0);
 
-      name = concat (argbuf[argbuf_index - 1], ext, NULL);
+      name = concat (VEC_last (const_char_p, argbuf), ext, NULL);
 
       ret = concat ("-fdump-final-insns=", name, NULL);
     }
@@ -8157,9 +8152,9 @@  compare_debug_self_opt_spec_function (in
   do_spec_2 ("%{c|S:%{o*:%*}}");
   do_spec_1 (" ", 0, NULL);
 
-  if (argbuf_index > 0)
+  if (VEC_length (const_char_p, argbuf) > 0)
     debug_auxbase_opt = concat ("-auxbase-strip ",
-				argbuf[argbuf_index - 1],
+				VEC_last (const_char_p, argbuf),
 				NULL);
   else
     debug_auxbase_opt = NULL;
Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in	(revision 166752)
+++ gcc/Makefile.in	(working copy)
@@ -1137,7 +1137,7 @@  FORTRAN_TARGET_OBJS=@fortran_target_objs
 
 # Object files for gcc driver.
 GCC_OBJS = gcc.o opts-common.o gcc-options.o diagnostic.o pretty-print.o \
-  input.o
+  input.o vec.o ggc-none.o
 
 # Language-specific object files shared by all C-family front ends.
 C_COMMON_OBJS = c-family/c-common.o c-family/c-cppbuiltin.o c-family/c-dump.o \
@@ -2191,7 +2191,7 @@  DRIVER_DEFINES = \
 
 gcc.o: gcc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) intl.h multilib.h \
     Makefile $(lang_specs_files) specs.h prefix.h $(GCC_H) $(FLAGS_H) \
-    configargs.h $(OBSTACK_H) $(OPTS_H) $(DIAGNOSTIC_H)
+    configargs.h $(OBSTACK_H) $(OPTS_H) $(DIAGNOSTIC_H) $(VEC_H)
 	(SHLIB_LINK='$(SHLIB_LINK)'; \
 	$(COMPILER) $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) \
   $(DRIVER_DEFINES) \