c-tree.h (c_arg_tag): Define.
authorNathan Froyd <froydnj@codesourcery.com>
Sun, 8 Aug 2010 17:42:40 +0000 (17:42 +0000)
committerNathan Froyd <froydnj@gcc.gnu.org>
Sun, 8 Aug 2010 17:42:40 +0000 (17:42 +0000)
* 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.

From-SVN: r163013

gcc/ChangeLog
gcc/c-decl.c
gcc/c-tree.h

index 4c565b3..b3bcc73 100644 (file)
@@ -1,5 +1,13 @@
 2010-08-08  Nathan Froyd  <froydnj@codesourcery.com>
 
+       * 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.
+
+2010-08-08  Nathan Froyd  <froydnj@codesourcery.com>
+
        * config/rs6000/rs6000.c (branch_island): Define.  Define a VEC of it.
        (branch_island_list): Delete.
        (branch_islands): Declare.
index 010421c..e4e872d 100644 (file)
@@ -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);
 }
 
index 984b597..745dd05 100644 (file)
@@ -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)