aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2010-05-04 17:17:10 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2010-05-04 15:17:10 +0000
commit688a10c2b9346b7c8d3d9c5ccb10b358eac3770f (patch)
tree1ff2112e47dbaf74edf8d3aa4173f865ba20cc41
parent4ac4b596988312f096f860d3e10579af438e3085 (diff)
downloadgcc-688a10c2b9346b7c8d3d9c5ccb10b358eac3770f.zip
gcc-688a10c2b9346b7c8d3d9c5ccb10b358eac3770f.tar.gz
gcc-688a10c2b9346b7c8d3d9c5ccb10b358eac3770f.tar.bz2
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
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/lto-symtab.c30
-rw-r--r--gcc/varpool.c21
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 <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
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. */