This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch] c-pragma.c: Stop using TREE_LIST for pending_weaks
- From: Steven Bosscher <stevenb dot gcc at gmail dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, "Joseph S. Myers" <joseph at codesourcery dot com>
- Date: Wed, 5 May 2010 23:44:38 +0200
- Subject: [patch] c-pragma.c: Stop using TREE_LIST for pending_weaks
Hello,
This is a report of Kazu's
http://gcc.gnu.org/ml/gcc-patches/2006-06/msg00092.html (r114397 on
the oldlto branch). The patch was approved for GCC 4.3 stage 1. I'll
take that as an approval for GCC 4.6 stage 1(after proper retesting)
unless someone objects.
Ciao!
Steven
* c-pragma.c (pending_weak_d, pending_weak): New.
(pending_weaks): Change the type to VEC((pending_weak,gc) *.
(maybe_apply_pragma_weak, maybe_apply_pending_pragma_weaks,
handle_pragma_weak): Update the uses of pending_weaks.
Index: c-pragma.c
===================================================================
--- c-pragma.c (revision 158996)
+++ c-pragma.c (working copy)
@@ -244,7 +244,16 @@ handle_pragma_pack (cpp_reader * ARG_UNU
}
#endif /* HANDLE_PRAGMA_PACK */
-static GTY(()) tree pending_weaks;
+typedef struct GTY(()) pending_weak_d
+{
+ tree name;
+ tree value;
+} pending_weak;
+
+DEF_VEC_O(pending_weak);
+DEF_VEC_ALLOC_O(pending_weak,gc);
+
+static GTY(()) VEC(pending_weak,gc) *pending_weaks;
#ifdef HANDLE_PRAGMA_WEAK
static void apply_pragma_weak (tree, tree);
@@ -274,7 +283,9 @@ apply_pragma_weak (tree decl, tree value
void
maybe_apply_pragma_weak (tree decl)
{
- tree *p, t, id;
+ tree id;
+ int i;
+ pending_weak *pe;
/* Avoid asking for DECL_ASSEMBLER_NAME when it's not needed. */
@@ -293,11 +304,11 @@ maybe_apply_pragma_weak (tree decl)
id = DECL_ASSEMBLER_NAME (decl);
- for (p = &pending_weaks; (t = *p) ; p = &TREE_CHAIN (t))
- if (id == TREE_PURPOSE (t))
+ for (i = 0; VEC_iterate (pending_weak, pending_weaks, i, pe); i++)
+ if (id == pe->name)
{
- apply_pragma_weak (decl, TREE_VALUE (t));
- *p = TREE_CHAIN (t);
+ apply_pragma_weak (decl, pe->value);
+ VEC_unordered_remove (pending_weak, pending_weaks, i);
break;
}
}
@@ -307,15 +318,16 @@ maybe_apply_pragma_weak (tree decl)
void
maybe_apply_pending_pragma_weaks (void)
{
- tree *p, t, alias_id, id, decl, *next;
+ tree alias_id, id, decl;
+ int i;
+ pending_weak *pe;
- for (p = &pending_weaks; (t = *p) ; p = next)
+ for (i = 0; VEC_iterate (pending_weak, pending_weaks, i, pe); i++)
{
- next = &TREE_CHAIN (t);
- alias_id = TREE_PURPOSE (t);
- id = TREE_VALUE (t);
+ alias_id = pe->name;
+ id = pe->value;
- if (TREE_VALUE (t) == NULL)
+ if (id == NULL)
continue;
decl = build_decl (UNKNOWN_LOCATION,
@@ -359,7 +371,12 @@ handle_pragma_weak (cpp_reader * ARG_UNU
assemble_alias (decl, value);
}
else
- pending_weaks = tree_cons (name, value, pending_weaks);
+ {
+ pending_weak *pe;
+ pe = VEC_safe_push (pending_weak, gc, pending_weaks, NULL);
+ pe->name = name;
+ pe->value = value;
+ }
}
#else
void