> 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

Reply via email to