On Thu, Mar 23, 2017 at 05:24:31PM -0400, Jason Merrill wrote: > On Thu, Mar 23, 2017 at 4:44 PM, Jakub Jelinek <ja...@redhat.com> wrote: > > The following C testcase shows how profiledbootstrap fails with checking > > compiler. We have a (nested) FUNCTION_DECL inside of BLOCK_VARS of an > > inline function, when it gets inlined, it is moved into > > BLOCK_NONLOCALIZED_VARS. And, decls_for_scope calls process_scope_var > > with NULL decl and non-NULL origin for all BLOCK_NONLOCALIZED_VARS. > > That is fine for variables, but for FUNCTION_DECLs it can actually > > try to dwarf2out_abstract_function that FUNCTION_DECL, which should be > > really done only when it is inlined (i.e. BLOCK_ABSTRACT_ORIGIN of > > some BLOCK). > > And when it's cloned. > > But does it make sense for gen_decl_die to call > dwarf2out_abstract_function when decl is null? That seems wrong.
Before r144529 we had just: if (DECL_ORIGIN (decl) != decl) dwarf2out_abstract_function (DECL_ABSTRACT_ORIGIN (decl)); and that is indeed to handle clones etc. r144529 changed that to: if (origin || DECL_ORIGIN (decl) != decl) dwarf2out_abstract_function (DECL_ABSTRACT_ORIGIN (decl)); All of the decl is NULL introduced in r144529 implies decl_or_origin is abstract. Removing that origin || wouldn't really work, we'd have to rewrite most of gen_decl_die FUNCTION_DECL handling to use decl_or_origin instead of decl etc. But it doesn't look right to me, conceptually a FUNCTION_DECL in BLOCK_NONLOCALIZED_VARS is nothing that represents a clone or something abstract in itself. We can't keep it in BLOCK_VARS just because those are chained through DECL_CHAIN and a single FUNCTION_DECL can't be put into multiple BLOCK_VARS chains. It is still the same FUNCTION_DECL, not a sign that we want to have in each inline function a separate function declaration with abstract origin of the original FUNCTION_DECL. Jakub