> commit be1b04c77a420288e29c48c07e68c3ec87dd5b24 > Author: Jason Merrill <ja...@redhat.com> > Date: Thu Jan 12 14:04:42 2012 -0500 > > PR c++/41090 > Add -fdeclone-ctor-dtor. > gcc/cp/ > * optimize.c (can_alias_cdtor, populate_clone_array): Split out > from maybe_clone_body. > (maybe_thunk_body): New function. > (maybe_clone_body): Call it. > * mangle.c (write_mangled_name): Remove code to suppress > writing of mangled name for cloned constructor or destructor. > (write_special_name_constructor): Handle decloned constructor. > (write_special_name_destructor): Handle decloned destructor. > * method.c (trivial_fn_p): Handle decloning. > * semantics.c (expand_or_defer_fn_1): Clone after setting linkage. > gcc/c-family/ > * c.opt: Add -fdeclone-ctor-dtor. > * c-opts.c (c_common_post_options): Default to on iff -Os. > gcc/ > * cgraph.h (struct cgraph_node): Add calls_comdat_local. > (symtab_comdat_local_p, symtab_in_same_comdat_p): New. > * cif-code.def: Add USES_COMDAT_LOCAL. > * symtab.c (verify_symtab_base): Make sure we don't refer to a > comdat-local symbol from outside its comdat. > * cgraph.c (verify_cgraph_node): Likewise. > * cgraphunit.c (mark_functions_to_output): Don't mark comdat-locals. > * ipa.c (symtab_remove_unreachable_nodes): Likewise. > (function_and_variable_visibility): Handle comdat-local fns. > * ipa-cp.c (determine_versionability): Don't clone comdat-locals. > * ipa-inline-analysis.c (compute_inline_parameters): Update > calls_comdat_local. > * ipa-inline-transform.c (inline_call): Likewise. > (save_inline_function_body): Don't clear DECL_COMDAT_GROUP. > * ipa-inline.c (can_inline_edge_p): Check calls_comdat_local. > * lto-cgraph.c (input_overwrite_node): Read calls_comdat_local. > (lto_output_node): Write it. > * symtab.c (symtab_dissolve_same_comdat_group_list): Clear > DECL_COMDAT_GROUP for comdat-locals. > include/ > * demangle.h (enum gnu_v3_ctor_kinds): > Added literal gnu_v3_unified_ctor. > (enum gnu_v3_ctor_kinds): > Added literal gnu_v3_unified_dtor. > libiberty/ > * cp-demangle.c (cplus_demangle_fill_ctor,cplus_demangle_fill_dtor): > Handle unified ctor/dtor. > (d_ctor_dtor_name): Handle unified ctor/dtor.
> --- a/gcc/ipa-inline-transform.c > +++ b/gcc/ipa-inline-transform.c > @@ -272,6 +272,18 @@ inline_call (struct cgraph_edge *e, bool update_original, > inline_update_overall_summary (to); > new_size = inline_summary (to)->size; > > + if (callee->calls_comdat_local) > + to->calls_comdat_local = true; > + else if (to->calls_comdat_local && symtab_comdat_local_p (callee)) > + { > + struct cgraph_edge *se = to->callees; > + for (; se; se = se->next_callee) > + if (se->inline_failed && symtab_comdat_local_p (se->callee)) > + break; > + if (se == NULL) > + to->calls_comdat_local = false; > + } I still do not think this is quite right. A function (after inlining) as at this stage represented by tree of functions linked via call edges with inline_failed set to NULL. TO represents a root of this tree, E->CALLER is the function we inlined into. I think we want to keep calls_comdat_local up to doate even for inline clones, so here we should update calls_comdat_local of e->caller (instead of to) and if it changes propagate the change into callers until we reach TO. I can handle this incrementally, since I do not think it will reproduce with our current limited use of comdat locals. The patch is OK, thanks! Honza