> > diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c > > index fbb63da..aa49bfe 100644 > > --- a/gcc/ipa-inline.c > > +++ b/gcc/ipa-inline.c > > @@ -230,6 +230,25 @@ report_inline_failed_reason (struct cgraph_edge *e) > > } > > } > > > > +/* True iff NODE calls another function which is local to its comdat > > + (i.e. C++ decloned constructor); in that case, calls to NODE cannot be > > + inlined, as that would cause a reference from outside the comdat to the > > + local symbol. If we inline the call from NODE to the local function, > > + then inlining NODE can succeed. */ > > + > > +static bool > > +calls_comdat_local_p (struct cgraph_node *node) > > +{ > > + if (!node->same_comdat_group) > > + return false; > > + for (struct cgraph_edge *e = node->callees; e; e = e->next_callee) > > + { > > + if (comdat_local_p (e->callee)) > > + return true; > > + } > > + return false; > > +}
Also this is not correct - because it ignores functions inlined into NODE and use in can_inline_edge_p will lead to quadratic time issues. We probably want ipa-inline to compute flag if function refer to local symbol just before inlining starts and propagate it across inlining decisions in make_edge_inline and only check the flag in can_inline_edge_p. Honza