Patchwork convert c_arg_info.tags into a VEC

login
register
mail settings
Submitter Nathan Froyd
Date Aug. 8, 2010, 1:27 a.m.
Message ID <20100808012709.GQ17362@codesourcery.com>
Download mbox | patch
Permalink /patch/61194/
State New
Headers show

Comments

Nathan Froyd - Aug. 8, 2010, 1:27 a.m.
As $SUBJECT indicates.  Most TREE_LIST removal, hooray, hooray.

Tested on x86_64-unknown-linux-gnu.  OK to commit?

-Nathan

	* c-tree.h (c_arg_tag): Define.  Define a VEC containing it.
	(struct c_arg_info): Change type of tags field.
	* c-decl.c (grokdeclarator): Update for changed type of tags field.
	(get_parm_info): Likewise.
	(store_parm_decls_newstyle): Likewise.
Joseph S. Myers - Aug. 8, 2010, 12:39 p.m.
On Sat, 7 Aug 2010, Nathan Froyd wrote:

> As $SUBJECT indicates.  Most TREE_LIST removal, hooray, hooray.
> 
> Tested on x86_64-unknown-linux-gnu.  OK to commit?
> 
> -Nathan
> 
> 	* c-tree.h (c_arg_tag): Define.  Define a VEC containing it.
> 	(struct c_arg_info): Change type of tags field.
> 	* c-decl.c (grokdeclarator): Update for changed type of tags field.
> 	(get_parm_info): Likewise.
> 	(store_parm_decls_newstyle): Likewise.

OK.

Patch

diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 010421c..e4e872d 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -5541,12 +5541,11 @@  grokdeclarator (const struct c_declarator *declarator,
 	       the formal parameter list of this FUNCTION_TYPE to point to
 	       the FUNCTION_TYPE node itself.  */
 	    {
-	      tree link;
+	      c_arg_tag *tag;
+	      unsigned ix;
 
-	      for (link = arg_info->tags;
-		   link;
-		   link = TREE_CHAIN (link))
-		TYPE_CONTEXT (TREE_VALUE (link)) = type;
+	      FOR_EACH_VEC_ELT_REVERSE (c_arg_tag, arg_info->tags, ix, tag)
+		TYPE_CONTEXT (tag->type) = type;
 	    }
 	    break;
 	  }
@@ -6192,7 +6191,7 @@  get_parm_info (bool ellipsis)
   struct c_arg_info *arg_info = XOBNEW (&parser_obstack,
 					struct c_arg_info);
   tree parms    = 0;
-  tree tags     = 0;
+  VEC(c_arg_tag,gc) *tags = NULL;
   tree types    = 0;
   tree others   = 0;
 
@@ -6246,6 +6245,7 @@  get_parm_info (bool ellipsis)
     {
       tree decl = b->decl;
       tree type = TREE_TYPE (decl);
+      c_arg_tag *tag;
       const char *keyword;
 
       switch (TREE_CODE (decl))
@@ -6319,7 +6319,9 @@  get_parm_info (bool ellipsis)
 		}
 	    }
 
-	  tags = tree_cons (b->id, decl, tags);
+	  tag = VEC_safe_push (c_arg_tag, gc, tags, NULL);
+	  tag->id = b->id;
+	  tag->type = decl;
 	  break;
 
 	case CONST_DECL:
@@ -7644,6 +7646,8 @@  static void
 store_parm_decls_newstyle (tree fndecl, const struct c_arg_info *arg_info)
 {
   tree decl;
+  c_arg_tag *tag;
+  unsigned ix;
 
   if (current_scope->bindings)
     {
@@ -7696,9 +7700,9 @@  store_parm_decls_newstyle (tree fndecl, const struct c_arg_info *arg_info)
     }
 
   /* And all the tag declarations.  */
-  for (decl = arg_info->tags; decl; decl = TREE_CHAIN (decl))
-    if (TREE_PURPOSE (decl))
-      bind (TREE_PURPOSE (decl), TREE_VALUE (decl), current_scope,
+  FOR_EACH_VEC_ELT_REVERSE (c_arg_tag, arg_info->tags, ix, tag)
+    if (tag->id)
+      bind (tag->id, tag->type, current_scope,
 	    /*invisible=*/false, /*nested=*/false, UNKNOWN_LOCATION);
 }
 
diff --git a/gcc/c-tree.h b/gcc/c-tree.h
index 984b597..745dd05 100644
--- a/gcc/c-tree.h
+++ b/gcc/c-tree.h
@@ -295,12 +295,22 @@  enum c_declarator_kind {
   cdk_attrs
 };
 
+typedef struct GTY(()) c_arg_tag_d {
+  /* The argument name.  */
+  tree id;
+  /* The type of the argument.  */
+  tree type;
+} c_arg_tag;
+
+DEF_VEC_O(c_arg_tag);
+DEF_VEC_ALLOC_O(c_arg_tag,gc);
+
 /* Information about the parameters in a function declarator.  */
 struct c_arg_info {
   /* A list of parameter decls.  */
   tree parms;
   /* A list of structure, union and enum tags defined.  */
-  tree tags;
+  VEC(c_arg_tag,gc) *tags;
   /* A list of argument types to go in the FUNCTION_TYPE.  */
   tree types;
   /* A list of non-parameter decls (notably enumeration constants)