X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fvarpool.c;h=c713a7705f6eb7bfa0083824d30f902d5ae9bdaf;hb=be526aa0465b5a3a31111e756ea2e2e479fb435e;hp=5a98a7c04c69c9d4df653467789381af2bd7d27d;hpb=c5fcb1091eb9af20411562379d917de344a68ff4;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/varpool.c b/gcc/varpool.c index 5a98a7c04c6..c713a7705f6 100644 --- a/gcc/varpool.c +++ b/gcc/varpool.c @@ -141,6 +141,7 @@ varpool_node (tree decl) node->decl = decl; node->order = cgraph_order++; node->next = varpool_nodes; + ipa_empty_ref_list (&node->ref_list); if (varpool_nodes) varpool_nodes->prev = node; varpool_nodes = node; @@ -157,14 +158,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 +194,9 @@ varpool_remove_node (struct varpool_node *node) gcc_assert (varpool_nodes_queue == node); varpool_nodes_queue = node->next_needed; } - node->decl = NULL; + ipa_remove_all_references (&node->ref_list); + ipa_remove_all_refering (&node->ref_list); + ggc_free (node); } /* Dump given cgraph node. */ @@ -215,6 +229,10 @@ dump_varpool_node (FILE *f, struct varpool_node *node) else if (node->used_from_other_partition) fprintf (f, " used_from_other_partition"); fprintf (f, "\n"); + fprintf (f, " References: "); + ipa_dump_references (f, &node->ref_list); + fprintf (f, " Refering this var: "); + ipa_dump_refering (f, &node->ref_list); } /* Dump the variable pool. */ @@ -282,7 +300,7 @@ varpool_mark_needed_node (struct varpool_node *node) } /* Reset the queue of needed nodes. */ -static void +void varpool_reset_queue (void) { varpool_last_needed_node = NULL; @@ -303,13 +321,6 @@ decide_is_variable_needed (struct varpool_node *node, tree decl) || node->force_output) return true; - /* ??? If the assembler name is set by hand, it is possible to assemble - the name later after finalizing the function and the fact is noticed - in assemble_name then. This is arguably a bug. */ - if (DECL_ASSEMBLER_NAME_SET_P (decl) - && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))) - return true; - /* Externally visible variables must be output. The exception is COMDAT variables that must be output only when they are needed. */ if (TREE_PUBLIC (decl) @@ -363,6 +374,8 @@ varpool_finalize_decl (tree decl) if (node->needed) varpool_enqueue_needed_node (node); node->finalized = true; + if (TREE_THIS_VOLATILE (decl) || DECL_PRESERVE_P (decl)) + node->force_output = true; if (decide_is_variable_needed (node, decl)) varpool_mark_needed_node (node); @@ -620,6 +633,7 @@ varpool_extra_name_alias (tree alias, tree decl) alias_node->alias = 1; alias_node->extra_name = decl_node; alias_node->next = decl_node->extra_name; + ipa_empty_ref_list (&alias_node->ref_list); if (decl_node->extra_name) decl_node->extra_name->prev = alias_node; decl_node->extra_name = alias_node;