diff options
author | Jan Hubicka <jh@suse.cz> | 2010-05-04 17:17:10 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2010-05-04 15:17:10 +0000 |
commit | 688a10c2b9346b7c8d3d9c5ccb10b358eac3770f (patch) | |
tree | 1ff2112e47dbaf74edf8d3aa4173f865ba20cc41 /gcc | |
parent | 4ac4b596988312f096f860d3e10579af438e3085 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/lto-symtab.c | 30 | ||||
-rw-r--r-- | 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 <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. */ |