From f4d9f129fe9884da7b5f92f919a22157f729c577 Mon Sep 17 00:00:00 2001 From: Steve Ellcey Date: Mon, 30 Mar 2009 16:43:40 +0000 Subject: [PATCH] re PR middle-end/38237 (multiple weak directives) PR middle-end/38237 * tree.h (tree_find_value): New declaration. * tree.c (tree_find_value): New function. * varasm.c (assemble_external): Avoid duplicate entries on lists. From-SVN: r145303 --- gcc/ChangeLog | 7 +++++++ gcc/tree.c | 12 ++++++++++++ gcc/tree.h | 4 ++++ gcc/varasm.c | 10 ++++++---- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 421be6a..d1de48d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-03-30 Steve Ellcey + + PR middle-end/38237 + * tree.h (tree_find_value): New declaration. + * tree.c (tree_find_value): New function. + * varasm.c (assemble_external): Avoid duplicate entries on lists. + 2009-03-30 Jakub Jelinek PR debug/39563 diff --git a/gcc/tree.c b/gcc/tree.c index 76cba27..bbc52e7 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -1802,6 +1802,18 @@ tree_last (tree chain) return chain; } +/* Return the node in a chain of nodes whose value is x, NULL if not found. */ + +tree +tree_find_value (tree chain, tree x) +{ + tree list; + for (list = chain; list; list = TREE_CHAIN (list)) + if (TREE_VALUE (list) == x) + return list; + return NULL; +} + /* Reverse the order of elements in the chain T, and return the new head of the chain (old last element). */ diff --git a/gcc/tree.h b/gcc/tree.h index 2efc978..830852d 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -4384,6 +4384,10 @@ extern tree tree_cons_stat (tree, tree, tree MEM_STAT_DECL); extern tree tree_last (tree); +/* Return the node in a chain whose TREE_VALUE is x, NULL if not found. */ + +extern tree tree_find_value (tree, tree); + /* Reverse the order of elements in a chain, and return the new head. */ extern tree nreverse (tree); diff --git a/gcc/varasm.c b/gcc/varasm.c index e5b9f35..9eefb02 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -2315,12 +2315,14 @@ assemble_external (tree decl ATTRIBUTE_UNUSED) locally emitted, inlined or otherwise not-really-extern, but for declarations that can be weak, it happens to be match. */ - && !TREE_STATIC (decl)) - weak_decls = tree_cons (NULL, decl, weak_decls); + && !TREE_STATIC (decl) + && tree_find_value (weak_decls, decl) == NULL_TREE) + weak_decls = tree_cons (NULL, decl, weak_decls); #ifdef ASM_OUTPUT_EXTERNAL - pending_assemble_externals = tree_cons (0, decl, - pending_assemble_externals); + if (tree_find_value (pending_assemble_externals, decl) == NULL_TREE) + pending_assemble_externals = tree_cons (NULL, decl, + pending_assemble_externals); #endif } -- 2.7.4