On 03/17/2015 07:12 PM, Jason Merrill wrote:
On 03/17/2015 03:58 PM, Aldy Hernandez wrote:
The problem is that, for -fno-implicit-templates, the decl is now
DECL_EXTERNAL, which means we never equate this new "DIE with
DW_AT_specification" to the DECL. That is, we never fall through here:
else if (!DECL_EXTERNAL (decl))
{
HOST_WIDE_INT cfa_fb_offset;
struct function *fun = DECL_STRUCT_FUNCTION (decl);
if (!old_die || !get_AT (old_die, DW_AT_inline))
equate_decl_number_to_die (decl, subr_die);
However, when we call gen_subprogram_die() the third time through the
outlining_inline_function hook (late debug), we again try to add a
DW_AT_specification to the DIE cached from the first time around, but
this time we ICE because we're not supposed to have multiple
DW_AT_specification's pointing to the same DIE (the old original DIE).
Why are we outlining a DECL_EXTERNAL function?
SRA is analyzing Object<int>::Method() and noticing that `this' is never
used, so it's trying to rewrite the call to avoid passing `this' (by
creating a clone).
SRA has no restrictions on whether a function is DECL_EXTERNAL. For
that matter, the SRA pass is called on all functions that have a gimple
body, irregardless of DECL_EXTERNAL, courtesy of the pass manager:
if (node->has_gimple_body_p ())
callback (DECL_STRUCT_FUNCTION (node->decl), data);
...and since Object<int>::Method() has a gimple body even though it is
marked DECL_EXTERNAL...we get the call into dwarf2out_abstract_decl.
Incidentally,
/* If we have no location information, this must be a
partially generated DIE from early dwarf generation.
Fall through and generate it. */
Why aren't we checking dumped_early here?
Good point. I'll add an assert.
Aldy