OSDN Git Service

* lto-symtab.c (lto_cgraph_replace_node): Do not remove edges;
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 May 2010 15:17:10 +0000 (15:17 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 May 2010 15:17:10 +0000 (15:17 +0000)
node will be removed anyway.
(lto_varpool_replace_node): Allow also unanalyzed nodes;
relink aliases of node into prevailing node.
* varpool.c (varpool_remove_node): Remove aliases properly;
when removing node, remove all its aliases too; remove DECL_INITIAL
of removed node; ggc_free the varpool node.

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

gcc/ChangeLog
gcc/lto-symtab.c
gcc/varpool.c

index c7d8620..fb76cf6 100644 (file)
@@ -1,3 +1,13 @@
+2010-05-04  Jan Hubicka  <jh@suse.cz>
+
+       * lto-symtab.c (lto_cgraph_replace_node): Do not remove edges;
+       node will be removed anyway.
+       (lto_varpool_replace_node): Allow also unanalyzed nodes;
+       relink aliases of node into prevailing node.
+       * varpool.c (varpool_remove_node): Remove aliases properly;
+       when removing node, remove all its aliases too; remove DECL_INITIAL
+       of removed node; ggc_free the varpool node.
+
 2010-05-04  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/43879
 2010-05-04  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/43879
index b5430a5..bd7022b 100644 (file)
@@ -215,15 +215,6 @@ lto_cgraph_replace_node (struct cgraph_node *node,
       cgraph_redirect_edge_callee (e, prevailing_node);
     }
 
       cgraph_redirect_edge_callee (e, prevailing_node);
     }
 
-  /* There are not supposed to be any outgoing edges from a node we
-     replace.  Still this can happen for multiple instances of weak
-     functions.  */
-  for (e = node->callees; e; e = next)
-    {
-      next = e->next_callee;
-      cgraph_remove_edge (e);
-    }
-
   if (node->same_body)
     {
       struct cgraph_node *alias;
   if (node->same_body)
     {
       struct cgraph_node *alias;
@@ -257,9 +248,28 @@ lto_varpool_replace_node (struct varpool_node *vnode,
   /* Merge node flags.  */
   if (vnode->needed)
     {
   /* Merge node flags.  */
   if (vnode->needed)
     {
-      gcc_assert (prevailing_node->analyzed);
+      gcc_assert (!vnode->analyzed || prevailing_node->analyzed);
       varpool_mark_needed_node (prevailing_node);
     }
       varpool_mark_needed_node (prevailing_node);
     }
+  /* Relink aliases.  */
+  if (vnode->extra_name && !vnode->alias)
+    {
+      struct varpool_node *alias, *last;
+      for (alias = vnode->extra_name;
+          alias; alias = alias->next)
+       {
+         last = alias;
+         alias->extra_name = prevailing_node;
+       }
+
+      if (prevailing_node->extra_name)
+       {
+         last->next = prevailing_node->extra_name;
+         prevailing_node->extra_name->prev = last;
+       }
+      prevailing_node->extra_name = vnode->extra_name;
+      vnode->extra_name = NULL;
+    }
   gcc_assert (!vnode->finalized || prevailing_node->finalized);
   gcc_assert (!vnode->analyzed || prevailing_node->analyzed);
 
   gcc_assert (!vnode->finalized || prevailing_node->finalized);
   gcc_assert (!vnode->analyzed || prevailing_node->analyzed);
 
index 5a98a7c..76d8f72 100644 (file)
@@ -157,14 +157,25 @@ varpool_remove_node (struct varpool_node *node)
   gcc_assert (*slot == node);
   htab_clear_slot (varpool_hash, slot);
   gcc_assert (!varpool_assembled_nodes_queue);
   gcc_assert (*slot == node);
   htab_clear_slot (varpool_hash, slot);
   gcc_assert (!varpool_assembled_nodes_queue);
+  if (!node->alias)
+    while (node->extra_name)
+      varpool_remove_node (node->extra_name);
   if (node->next)
     node->next->prev = node->prev;
   if (node->prev)
     node->prev->next = node->next;
   if (node->next)
     node->next->prev = node->prev;
   if (node->prev)
     node->prev->next = node->next;
-  else if (node->next)
+  else
     {
     {
-      gcc_assert (varpool_nodes == node);
-      varpool_nodes = node->next;
+      if (node->alias)
+       {
+          gcc_assert (node->extra_name->extra_name == node);
+         node->extra_name->extra_name = node->next;
+       }
+      else
+       {
+          gcc_assert (varpool_nodes == node);
+          varpool_nodes = node->next;
+       }
     }
   if (varpool_first_unanalyzed_node == node)
     varpool_first_unanalyzed_node = node->next_needed;
     }
   if (varpool_first_unanalyzed_node == node)
     varpool_first_unanalyzed_node = node->next_needed;
@@ -182,7 +193,9 @@ varpool_remove_node (struct varpool_node *node)
       gcc_assert (varpool_nodes_queue == node);
       varpool_nodes_queue = node->next_needed;
     }
       gcc_assert (varpool_nodes_queue == node);
       varpool_nodes_queue = node->next_needed;
     }
-  node->decl = NULL;
+  if (DECL_INITIAL (node->decl))
+    DECL_INITIAL (node->decl) = error_mark_node;
+  ggc_free (node);
 }
 
 /* Dump given cgraph node.  */
 }
 
 /* Dump given cgraph node.  */