diff options
author | Steven Bosscher <steven@gcc.gnu.org> | 2010-05-07 20:49:29 +0000 |
---|---|---|
committer | Steven Bosscher <steven@gcc.gnu.org> | 2010-05-07 20:49:29 +0000 |
commit | 18bc5398c1526d6a852b2f18152ebcfe6b706dcf (patch) | |
tree | a8dfdd0ff86c317f8c7bb14a0c719cb6994ffef2 /gcc/c-pragma.c | |
parent | 0f590a2d73476b362a13e60aadde8a4252ce272f (diff) | |
download | gcc-18bc5398c1526d6a852b2f18152ebcfe6b706dcf.zip gcc-18bc5398c1526d6a852b2f18152ebcfe6b706dcf.tar.gz gcc-18bc5398c1526d6a852b2f18152ebcfe6b706dcf.tar.bz2 |
c-pragma.c (pending_weak_d, [...]): New.
* 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.
From-SVN: r159172
Diffstat (limited to 'gcc/c-pragma.c')
-rw-r--r-- | gcc/c-pragma.c | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/gcc/c-pragma.c b/gcc/c-pragma.c index 79b3d13..f3cce3e 100644 --- a/gcc/c-pragma.c +++ b/gcc/c-pragma.c @@ -244,7 +244,16 @@ handle_pragma_pack (cpp_reader * ARG_UNUSED (dummy)) } #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_UNUSED (dummy)) 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 |