From e60bf9d4f97a321bd1147853ab143fd93d12401c Mon Sep 17 00:00:00 2001 From: Nathan Froyd Date: Sun, 8 Aug 2010 17:42:40 +0000 Subject: [PATCH] c-tree.h (c_arg_tag): Define. * 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 | 8 ++++++++ gcc/c-decl.c | 24 ++++++++++++++---------- gcc/c-tree.h | 12 +++++++++++- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c565b3fd05..b3bcc73e32b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-08-08 Nathan Froyd + + * 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 * config/rs6000/rs6000.c (branch_island): Define. Define a VEC of it. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 010421c0b89..e4e872d9b9d 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 984b5975f8d..745dd053a8c 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) -- 2.30.2