aboutsummaryrefslogtreecommitdiff
path: root/gcc/varpool.c
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2012-05-17 18:37:33 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2012-05-17 16:37:33 +0000
commit6649df51ec79ed1ffe81dc8b93b7fc8cce85040f (patch)
treec091b61bf18ed877244605adef29bd8f35c140b1 /gcc/varpool.c
parentf9eead1f8953869fcfd8be7b0e58aff50fbe1fd5 (diff)
downloadgcc-6649df51ec79ed1ffe81dc8b93b7fc8cce85040f.zip
gcc-6649df51ec79ed1ffe81dc8b93b7fc8cce85040f.tar.gz
gcc-6649df51ec79ed1ffe81dc8b93b7fc8cce85040f.tar.bz2
lto-symtab.c (lto_symtab_resolve_symbols): Preffer decl with constructor over decl without.
* lto-symtab.c (lto_symtab_resolve_symbols): Preffer decl with constructor over decl without. * cgraph.c (cgraph_remove_node): Clear also body of unanalyzed nodes. * cgraph.h (varpool_can_remove_if_no_refs): Handle external correctly. * cgraphunit.c (process_function_and_variable_attributes): Finalize extrnal decls. (mark_functions_to_output): Also accept bodies for functions with clones. (output_in_order): Skip external vars. * lto-cgraph.c (lto_output_node): External functions are never in other partition. (lto_output_varpool_node): Likewise. * lto-streamer-out.c (lto_write_tree): Always use error_mark_nodes for forgotten initializers. * ipa.c (process_references): Handle external vars. (symtab_remove_unreachable_nodes): Update to handle external vars. (varpool_externally_visible_p): External vars are externally visible. * gimple-fold.c (can_refer_decl_in_current_unit_p): Update. * varpool.c (varpool_remove_node): Remove constructor. (decide_is_variable_needed): Handle externals. (varpool_remove_unreferenced_decls): Likewise. * lto-partition.c (add_references_to_partition): Handle external vars. (partition_varpool_node_p): Likewise. (lto_promote_cross_file_statics): Do not promote externals. From-SVN: r187631
Diffstat (limited to 'gcc/varpool.c')
-rw-r--r--gcc/varpool.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/gcc/varpool.c b/gcc/varpool.c
index ef02567..ceb16f9 100644
--- a/gcc/varpool.c
+++ b/gcc/varpool.c
@@ -59,6 +59,14 @@ void
varpool_remove_node (struct varpool_node *node)
{
symtab_unregister_node ((symtab_node)node);
+ if (DECL_INITIAL (node->symbol.decl)
+ && !DECL_IN_CONSTANT_POOL (node->symbol.decl)
+ /* Keep vtables for BINFO folding. */
+ && !DECL_VIRTUAL_P (node->symbol.decl)
+ /* dbxout output constant initializers for readonly vars. */
+ && (!host_integerp (DECL_INITIAL (node->symbol.decl), 0)
+ || !TREE_READONLY (node->symbol.decl)))
+ DECL_INITIAL (node->symbol.decl) = error_mark_node;
ggc_free (node);
}
@@ -118,17 +126,17 @@ varpool_node_for_asm (tree asmname)
bool
decide_is_variable_needed (struct varpool_node *node, tree decl)
{
+ if (DECL_EXTERNAL (decl))
+ return false;
+
/* If the user told us it is used, then it must be so. */
if (node->symbol.force_output)
return true;
- gcc_assert (!DECL_EXTERNAL (decl));
-
/* Externally visible variables must be output. The exception is
COMDAT variables that must be output only when they are needed. */
if (TREE_PUBLIC (decl)
- && !DECL_COMDAT (decl)
- && !DECL_EXTERNAL (decl))
+ && !DECL_COMDAT (decl))
return true;
return false;
@@ -348,7 +356,8 @@ varpool_remove_unreferenced_decls (void)
&& (!varpool_can_remove_if_no_refs (node)
/* We just expanded all function bodies. See if any of
them needed the variable. */
- || DECL_RTL_SET_P (node->symbol.decl)))
+ || (!DECL_EXTERNAL (node->symbol.decl)
+ && DECL_RTL_SET_P (node->symbol.decl))))
{
enqueue_node (node, &first);
if (cgraph_dump_file)
@@ -372,6 +381,8 @@ varpool_remove_unreferenced_decls (void)
}
for (i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list, i, ref); i++)
if (symtab_variable_p (ref->referred)
+ && (!DECL_EXTERNAL (ref->referred->symbol.decl)
+ || varpool (ref->referred)->alias)
&& varpool (ref->referred)->analyzed)
enqueue_node (varpool (ref->referred), &first);
}