diff options
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. */ |