aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Froyd <froydnj@codesourcery.com>2010-08-08 17:42:40 +0000
committerNathan Froyd <froydnj@gcc.gnu.org>2010-08-08 17:42:40 +0000
commite60bf9d4f97a321bd1147853ab143fd93d12401c (patch)
tree1fc773b8a3cbcbc980aa5a7951f4ab0aea73bce5 /gcc
parent4f8c876d4305f863ebccf6b0905be4d8a8d99be6 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/c-decl.c24
-rw-r--r--gcc/c-tree.h12
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)