From 8a41354f5b0ce051d47ec8465048a1873a62e8e6 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Fri, 30 Aug 2013 17:41:26 +0200 Subject: [PATCH] cgraph.c (cgraph_function_body_availability): Handle weakref correctly. * cgraph.c (cgraph_function_body_availability): Handle weakref correctly. * passes.def: Remove pass_fixup_cfg. * ipa-inline.c (ipa_inline): When not optimizing, do not inline; track when we need to remove functions. (gate_ipa_inline): Execute inlining always; add comment why. (pass_data_ipa_inline): Remove TODO_remove_functions. * ipa-inline-analysis.c (inline_generate_summary): When not optimizing do not produce summaries. * symtab.c (change_decl_assembler_name): Handle renaming of weakrefs. (symtab_nonoverwritable_alias): Assert we are not called on weakref. * varpool.c (cgraph_variable_initializer_availability): Fix weakrefs, constant pool and vtable. From-SVN: r202111 --- gcc/ChangeLog | 16 ++++++++++++++++ gcc/cgraph.c | 2 ++ gcc/ipa-inline-analysis.c | 5 +++++ gcc/ipa-inline.c | 16 +++++++++++----- gcc/passes.def | 1 - gcc/symtab.c | 14 ++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/attr-alias.c | 2 +- gcc/varpool.c | 14 +++++++++++++- 9 files changed, 67 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c1ced6eda18..33ce266dc22 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2013-08-29 Jan Hubicka + + * cgraph.c (cgraph_function_body_availability): Handle weakref + correctly. + * passes.def: Remove pass_fixup_cfg. + * ipa-inline.c (ipa_inline): When not optimizing, do not inline; + track when we need to remove functions. + (gate_ipa_inline): Execute inlining always; add comment why. + (pass_data_ipa_inline): Remove TODO_remove_functions. + * ipa-inline-analysis.c (inline_generate_summary): When not optimizing + do not produce summaries. + * symtab.c (change_decl_assembler_name): Handle renaming of weakrefs. + (symtab_nonoverwritable_alias): Assert we are not called on weakref. + * varpool.c (cgraph_variable_initializer_availability): Fix weakrefs, + constant pool and vtable. + 2013-08-30 Tejas Belagod * config/aarch64/arm_neon.h (__AARCH64_UINT64_C, __AARCH64_INT64_C): New diff --git a/gcc/cgraph.c b/gcc/cgraph.c index feb17bb0dd9..d89522432b3 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -2046,6 +2046,8 @@ cgraph_function_body_availability (struct cgraph_node *node) avail = AVAIL_NOT_AVAILABLE; else if (node->local.local) avail = AVAIL_LOCAL; + else if (node->symbol.alias && node->symbol.weakref) + cgraph_function_or_thunk_node (node, &avail); else if (!node->symbol.externally_visible) avail = AVAIL_AVAILABLE; /* Inline functions are safe to be analyzed even if their symbol can diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index 806b219c228..722ba51f42d 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -3698,6 +3698,11 @@ inline_generate_summary (void) { struct cgraph_node *node; + /* When not optimizing, do not bother to analyze. Inlining is still done + because edge redirection needs to happen there. */ + if (!optimize && !flag_lto && !flag_wpa) + return; + function_insertion_hook_holder = cgraph_add_function_insertion_hook (&add_new_function, NULL); diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 11526957190..9a9408ee2ab 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -1904,6 +1904,10 @@ ipa_inline (void) XCNEWVEC (struct cgraph_node *, cgraph_n_nodes); int i; int cold; + bool remove_functions = false; + + if (!optimize) + return 0; if (in_lto_p && optimize) ipa_update_after_lto_read (); @@ -1984,6 +1988,7 @@ ipa_inline (void) { cgraph_resolve_speculation (edge, NULL); update = true; + remove_functions = true; } } if (update) @@ -2018,6 +2023,7 @@ ipa_inline (void) } inline_call (node->callers, true, NULL, NULL, true); + remove_functions = true; if (dump_file) fprintf (dump_file, " Inlined into %s which now has %i size\n", @@ -2048,7 +2054,7 @@ ipa_inline (void) /* In WPA we use inline summaries for partitioning process. */ if (!flag_wpa) inline_free_summary (); - return 0; + return remove_functions ? TODO_remove_functions : 0; } /* Inline always-inline function calls in NODE. */ @@ -2292,13 +2298,13 @@ make_pass_early_inline (gcc::context *ctxt) /* When to run IPA inlining. Inlining of always-inline functions happens during early inlining. - Enable inlining unconditoinally at -flto. We need size estimates to - drive partitioning. */ + Enable inlining unconditoinally, because callgraph redirection + happens here. */ static bool gate_ipa_inline (void) { - return optimize || flag_lto || flag_wpa; + return true; } namespace { @@ -2315,7 +2321,7 @@ const pass_data pass_data_ipa_inline = 0, /* properties_provided */ 0, /* properties_destroyed */ TODO_remove_functions, /* todo_flags_start */ - ( TODO_dump_symtab | TODO_remove_functions ), /* todo_flags_finish */ + ( TODO_dump_symtab ), /* todo_flags_finish */ }; class pass_ipa_inline : public ipa_opt_pass_d diff --git a/gcc/passes.def b/gcc/passes.def index b289713368f..aa45d51994b 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -126,7 +126,6 @@ along with GCC; see the file COPYING3. If not see /* These passes are run after IPA passes on every function that is being output to the assembler file. */ INSERT_PASSES_AFTER (all_passes) - NEXT_PASS (pass_fixup_cfg); NEXT_PASS (pass_lower_eh_dispatch); NEXT_PASS (pass_all_optimizations); PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations) diff --git a/gcc/symtab.c b/gcc/symtab.c index a86bf6b1327..bfbc03b6a82 100644 --- a/gcc/symtab.c +++ b/gcc/symtab.c @@ -390,6 +390,9 @@ change_decl_assembler_name (tree decl, tree name) if (name == DECL_ASSEMBLER_NAME (decl)) return; + tree alias = (IDENTIFIER_TRANSPARENT_ALIAS (DECL_ASSEMBLER_NAME (decl)) + ? TREE_CHAIN (DECL_ASSEMBLER_NAME (decl)) + : NULL); if (node) unlink_from_assembler_name_hash (node, true); if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) @@ -397,6 +400,11 @@ change_decl_assembler_name (tree decl, tree name) warning (0, "%D renamed after being referenced in assembly", decl); SET_DECL_ASSEMBLER_NAME (decl, name); + if (alias) + { + IDENTIFIER_TRANSPARENT_ALIAS (name) = 1; + TREE_CHAIN (DECL_ASSEMBLER_NAME (name)) = alias; + } if (node) insert_to_assembler_name_hash (node, true); } @@ -1065,11 +1073,17 @@ symtab_nonoverwritable_alias (symtab_node node) { tree new_decl; symtab_node new_node = NULL; + + /* First try to look up existing alias or base object + (if that is already non-overwritable). */ + node = symtab_alias_ultimate_target (node, NULL); + gcc_assert (!node->symbol.alias && !node->symbol.weakref); symtab_for_node_and_aliases (node, symtab_nonoverwritable_alias_1, (void *)&new_node, true); if (new_node) return new_node; + /* Otherwise create a new one. */ new_decl = copy_node (node->symbol.decl); DECL_NAME (new_decl) = clone_function_name (node->symbol.decl, "localalias"); if (TREE_CODE (new_decl) == FUNCTION_DECL) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f8a1f4964d2..5c1a8d6b024 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-08-29 Jan Hubicka + + * gcc.dg/tree-ssa/attr-alias.c: Rename test3 to test1 to match template + and comment. + 2013-08-30 Paolo Carlini PR c++/51424 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/attr-alias.c b/gcc/testsuite/gcc.dg/tree-ssa/attr-alias.c index 96c0dc24bed..fe4084d2131 100644 --- a/gcc/testsuite/gcc.dg/tree-ssa/attr-alias.c +++ b/gcc/testsuite/gcc.dg/tree-ssa/attr-alias.c @@ -8,7 +8,7 @@ int test() return 0; } static int test2() __attribute__ ((alias("test"))); -static int test3() __attribute__ ((weakref)) __attribute__ ((alias("test2"))); +static int test1() __attribute__ ((weakref)) __attribute__ ((alias("test2"))); static int test4() __attribute__ ((weakref)) __attribute__ ((alias("test"))); main() { diff --git a/gcc/varpool.c b/gcc/varpool.c index b426757ec84..f558aae0bd1 100644 --- a/gcc/varpool.c +++ b/gcc/varpool.c @@ -260,10 +260,22 @@ cgraph_variable_initializer_availability (struct varpool_node *node) return AVAIL_NOT_AVAILABLE; if (!TREE_PUBLIC (node->symbol.decl)) return AVAIL_AVAILABLE; + if (DECL_IN_CONSTANT_POOL (node->symbol.decl) + || DECL_VIRTUAL_P (node->symbol.decl)) + return AVAIL_AVAILABLE; + if (node->symbol.alias && node->symbol.weakref) + { + enum availability avail; + + cgraph_variable_initializer_availability + (varpool_variable_node (node, &avail)); + return avail; + } /* If the variable can be overwritten, return OVERWRITABLE. Takes care of at least one notable extension - the COMDAT variables used to share template instantiations in C++. */ - if (!decl_replaceable_p (node->symbol.decl)) + if (decl_replaceable_p (node->symbol.decl) + || DECL_EXTERNAL (node->symbol.decl)) return AVAIL_OVERWRITABLE; return AVAIL_AVAILABLE; }