diff options
author | Nathan Froyd <froydnj@codesourcery.com> | 2010-08-08 17:42:40 +0000 |
---|---|---|
committer | Nathan Froyd <froydnj@gcc.gnu.org> | 2010-08-08 17:42:40 +0000 |
commit | e60bf9d4f97a321bd1147853ab143fd93d12401c (patch) | |
tree | 1fc773b8a3cbcbc980aa5a7951f4ab0aea73bce5 /gcc | |
parent | 4f8c876d4305f863ebccf6b0905be4d8a8d99be6 (diff) | |
download | gcc-e60bf9d4f97a321bd1147853ab143fd93d12401c.zip gcc-e60bf9d4f97a321bd1147853ab143fd93d12401c.tar.gz gcc-e60bf9d4f97a321bd1147853ab143fd93d12401c.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/c-decl.c | 24 | ||||
-rw-r--r-- | gcc/c-tree.h | 12 |
3 files changed, 33 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c565b3..b3bcc73 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. 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) |