From 688a10c2b9346b7c8d3d9c5ccb10b358eac3770f Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Tue, 4 May 2010 17:17:10 +0200 Subject: [PATCH] lto-symtab.c (lto_cgraph_replace_node): Do not remove edges; node will be removed anyway. * 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. From-SVN: r159031 --- gcc/ChangeLog | 10 ++++++++++ gcc/lto-symtab.c | 30 ++++++++++++++++++++---------- gcc/varpool.c | 21 +++++++++++++++++---- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c7d8620..fb76cf6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2010-05-04 Jan Hubicka + + * 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 PR tree-optimization/43879 diff --git a/gcc/lto-symtab.c b/gcc/lto-symtab.c index b5430a5..bd7022b 100644 --- a/gcc/lto-symtab.c +++ b/gcc/lto-symtab.c @@ -215,15 +215,6 @@ lto_cgraph_replace_node (struct cgraph_node *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; @@ -257,9 +248,28 @@ lto_varpool_replace_node (struct varpool_node *vnode, /* Merge node flags. */ if (vnode->needed) { - gcc_assert (prevailing_node->analyzed); + gcc_assert (!vnode->analyzed || prevailing_node->analyzed); 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); diff --git a/gcc/varpool.c b/gcc/varpool.c index 5a98a7c..76d8f72 100644 --- a/gcc/varpool.c +++ b/gcc/varpool.c @@ -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); + 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; - 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; @@ -182,7 +193,9 @@ varpool_remove_node (struct varpool_node *node) 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. */ -- 2.7.4