From ead84f73b0a0f39ea39aa0329b6da83e4a9e6e02 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Fri, 20 Apr 2012 16:09:11 +0200 Subject: lto-symtab.c (lto_cgraph_replace_node): Merge needed instead of force flags. * lto-symtab.c (lto_cgraph_replace_node): Merge needed instead of force flags. * cgraph.c (cgraph_add_thunk): Use mark_reachable_node. (cgraph_remove_node): Update. (cgraph_mark_needed_node): Remove. (cgraph_mark_force_output_node): New. (dump_cgraph_node): Do not dump needed flag. (cgraph_node_cannot_be_local_p_1): Update. (cgraph_can_remove_if_no_direct_calls_and_refs): Update. * cgraph.h (symtab_node_base): Add force_output flag. (cgraph_node): Remove needed flag. (varpool_node): Remove force_output flag. (cgraph_mark_needed_node): Remove. (cgraph_mark_force_output_node): New. (cgraph_only_called_directly_or_aliased_p, varpool_can_remove_if_no_refs, varpool_all_refs_explicit_p): Update. * ipa-cp.c (ipcp_generate_summary): Remove out of date assert. * cgraphunit.c (cgraph_decide_is_function_needed): rewrite. (cgraph_add_new_function); Update. (cgraph_mark_if_needed); Update. (verify_cgraph_node): Update. (cgraph_analyze_function): Alias target is reachable. (process_function_and_variable_attributes): Update: externally_visible flag makes function reachable. (cgraph_analyze_functions): Update dumping. * lto-cgraph.c (lto_output_node, lto_output_varpool_node, input_overwrite_node, input_varpool_node): Update streaming. * lto-streamer-out.c (produce_symtab): Use force_output. * ipa.c (process_references): Weakrefs must be processed. (cgraph_remove_unreachable_nodes): Likewise; update for new force_output flag. (varpool_externally_visible_p); Weakrefs are externally visible even if they are not. (function_and_variable_visibility): Update; when processing alias pair force the targets to be output. (whole_program_function_and_variable_visility): Use mark_reachable_node. * trans-mem.c (ipa_tm_mark_needed_node): Remove (ipa_tm_mark_force_output_node): New function. (ipa_tm_create_version_alias, ipa_tm_create_version): Update. * gimple-fold.c (can_refer_decl_in_current_unit_p): Be lax about aliases. * varasm.c (mark_decl_referenced): Update. (find_decl_and_mark_needed): Remove. (find_decl): New function. (weak_finish, finish_aliases_1, assemble_alias): Update; do not mark alias targets as needed. (dump_tm_clone_pairs): Update. * tree-inline.c (copy_bb): Update check. * symtab.c (dump_symtab_base): Dump force_output. * tree-ssa-structalias.c (ipa_pta_execute): Use force_output. * passes.c (execute_todo): Fix dumping. * varpool.c (decide_is_variable_needed, varpool_finalize_decl): Update. (varpool_analyze_pending_decls): Alias target is reachable. (varpool_create_variable_alias): Finalize weakrefs. * class.c (make_local_function_alias): Do not mark symbol referenced. * objc-acct.c (mark_referenced_methods); Use cgraph_mark_force_output_node. * gcc-interface/utils.c (gnat_write_global_declarations): Update for new force_output placement. * lto/lto-partition.c (partition_cgraph_node_p): Use force_output. From-SVN: r186624 --- gcc/ipa.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'gcc/ipa.c') diff --git a/gcc/ipa.c b/gcc/ipa.c index 964b2b9..f4daf36 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -97,6 +97,7 @@ process_references (struct ipa_ref_list *list, if (!node->reachable && node->analyzed && (!DECL_EXTERNAL (node->symbol.decl) + || node->alias || before_inlining_p)) node->reachable = true; enqueue_cgraph_node (node, first); @@ -214,7 +215,7 @@ cgraph_remove_unreachable_nodes (bool before_inlining_p, FILE *file) { vnode->next_needed = NULL; vnode->prev_needed = NULL; - if ((vnode->analyzed || vnode->force_output) + if ((vnode->analyzed || vnode->symbol.force_output) && !varpool_can_remove_if_no_refs (vnode)) { vnode->needed = false; @@ -254,6 +255,7 @@ cgraph_remove_unreachable_nodes (bool before_inlining_p, FILE *file) && node->analyzed && (!e->inline_failed || !DECL_EXTERNAL (e->callee->symbol.decl) + || node->alias || before_inlining_p)) e->callee->reachable = true; enqueue_cgraph_node (e->callee, &first); @@ -659,6 +661,12 @@ cgraph_externally_visible_p (struct cgraph_node *node, bool varpool_externally_visible_p (struct varpool_node *vnode, bool aliased) { + /* Do not touch weakrefs; while they are not externally visible, + dropping their DECL_EXTERNAL flags confuse most + of code handling them. */ + if (vnode->alias && DECL_EXTERNAL (vnode->symbol.decl)) + return true; + if (!DECL_COMDAT (vnode->symbol.decl) && !TREE_PUBLIC (vnode->symbol.decl)) return false; @@ -700,7 +708,7 @@ varpool_externally_visible_p (struct varpool_node *vnode, bool aliased) is faster for dynamic linking. Also this match logic hidding vtables from LTO symbol tables. */ if ((in_lto_p || flag_whole_program) - && !vnode->force_output + && !vnode->symbol.force_output && DECL_COMDAT (vnode->symbol.decl) && DECL_VIRTUAL_P (vnode->symbol.decl)) return false; @@ -776,8 +784,7 @@ function_and_variable_visibility (bool whole_program) { if (!node->analyzed) continue; - cgraph_mark_needed_node (node); - gcc_assert (node->needed); + cgraph_mark_force_output_node (node); pointer_set_insert (aliased_nodes, node); if (dump_file) fprintf (dump_file, " node %s/%i", @@ -786,6 +793,7 @@ function_and_variable_visibility (bool whole_program) else if ((vnode = varpool_node_for_asm (p->target)) != NULL && !DECL_EXTERNAL (vnode->symbol.decl)) { + vnode->symbol.force_output = 1; varpool_mark_needed_node (vnode); gcc_assert (vnode->needed); pointer_set_insert (aliased_vnodes, vnode); @@ -813,9 +821,9 @@ function_and_variable_visibility (bool whole_program) /* Frontends and alias code marks nodes as needed before parsing is finished. We may end up marking as node external nodes where this flag is meaningless strip it. */ - if (node->needed + if (node->symbol.force_output && (DECL_EXTERNAL (node->symbol.decl) || !node->analyzed)) - node->needed = 0; + node->symbol.force_output = 0; /* C++ FE on lack of COMDAT support create local COMDAT functions (that ought to be shared but can not due to object format @@ -1017,7 +1025,7 @@ whole_program_function_and_variable_visibility (void) FOR_EACH_DEFINED_FUNCTION (node) if ((node->symbol.externally_visible && !DECL_COMDAT (node->symbol.decl)) && node->local.finalized) - cgraph_mark_needed_node (node); + cgraph_mark_reachable_node (node); FOR_EACH_DEFINED_VARIABLE (vnode) if (vnode->symbol.externally_visible && !DECL_COMDAT (vnode->symbol.decl)) varpool_mark_needed_node (vnode); -- cgit v1.1