This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: C++ constructors and callgraph interaction ("__ct_comp " vs constructor function body)
- From: David Malcolm <dmalcolm at redhat dot com>
- To: gcc at gcc dot gnu dot org
- Date: Wed, 05 Feb 2020 23:35:41 -0500
- Subject: Re: C++ constructors and callgraph interaction ("__ct_comp " vs constructor function body)
- References: <e36224c87497fc1019eaf4a2eeac3707f3b7c9fd.camel@redhat.com>
On Wed, 2020-02-05 at 23:07 -0500, David Malcolm wrote:
> When debugging PR analyzer/93288, I'm compiling this test C++ file:
>
> struct a {
> a();
> };
> class foo {
> a b;
> } c;
>
> I see a cgraph_edge from __static_initialization_and_destruction_0 to
> a "__ct_comp ", which I see is a DECL_COMPLETE_CONSTRUCTOR_P.
>
> The "__ct_comp " prints as a "a::a()/2", but its DECL_STRUCT_FUNCTION
> has a NULL CFG (which is what's causing the ICE in the analyzer).
>
> The simple fix is to check for NULL, and skip such cases (but that
> would fail to analyze the calls).
>
> However, there seems to be a separate a::a in the cgraph with a CFG
> containing the body of the ctor.
>
> Looking at the __ct_comp:
>
> (gdb) call edge->callee->debug()
> _ZN3fooC1Ev/2 (foo::foo()) @0x7fffeaaaa2d0
> Type: function definition analyzed alias cpp_implicit_alias
> Visibility: externally_visible public weak comdat
> comdat_group:_ZN3fooC5Ev one_only artificial
> Same comdat group as: _ZN3fooC2Ev/1
> References: _ZN3fooC2Ev/1 (alias)
> Referring:
> Availability: available
> Function flags:
> Called by: _Z41__static_initialization_and_destruction_0ii/4 (can
> throw external)
> Calls:
>
> and I note that we have _ZN3fooC1Ev/2 (the __ct_comp) and
> _ZN3fooC2Ev/1, which demangle to foo::foo()/2 and foo::foo()/1
> respectively.
>
> I'm a bit hazy on the details here, sorry.
>
> Presumably this "__ct_comp " fndecl's cgraph_node is thus linked to
> the
> "real" fndecl as a "cpp_implicit_alias"?
>
> What's the best strategy for the analyzer to follow when it
> encounters
> a DECL_STRUCT_FUNCTION with a NULL CFG?
>
> Should the analyzer:
>
> (a) special-case this (e.g. assume that "cpp_implicit_alias" will
> have
> a single reference I can look up, or get it from the comdat groups,
> or
> somesuch), or
>
> (b) are there some more general semantics I need to implement? (e.g.
> if
> it's weak, look in the comdat group for a non-weak alias, or
> somesuch?)
Answering my own question, calling ultimate_alias_target on the
__ct_comp cgraph_node seems to find the "right" cgraph_node.
Is that the right general-purpose answer here?
Thanks
Dave
> (c) not bother exploring those paths
> Thanks, and sorry if I'm missing something obvious here (I'm less
> familiar with this part of the compiler)
>
> Dave
>