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/varpool.c | |
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/varpool.c')
-rw-r--r-- | gcc/varpool.c | 21 |
1 files changed, 17 insertions, 4 deletions
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. */ |