+2010-05-07 Steven Bosscher <steven@gcc.gnu.org>
+
+ * 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.
+
2010-05-07 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
PR documentation/44016
}
#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);
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. */
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;
}
}
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,
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