OSDN Git Service

PR middle-end/38237
authorsje <sje@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 30 Mar 2009 16:43:40 +0000 (16:43 +0000)
committersje <sje@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 30 Mar 2009 16:43:40 +0000 (16:43 +0000)
* tree.h (tree_find_value): New declaration.
* tree.c (tree_find_value): New function.
* varasm.c (assemble_external): Avoid duplicate entries on lists.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145303 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree.c
gcc/tree.h
gcc/varasm.c

index 421be6a..d1de48d 100644 (file)
@@ -1,3 +1,10 @@
+2009-03-30  Steve Ellcey  <sje@cup.hp.com>
+
+       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  <jakub@redhat.com>
 
        PR debug/39563
index 76cba27..bbc52e7 100644 (file)
@@ -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).  */
 
index 2efc978..830852d 100644 (file)
@@ -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);
index e5b9f35..9eefb02 100644 (file)
@@ -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
 }