http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48508
Joshua Conner <josh.m.conner at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |josh.m.conner at gmail dot | |com --- Comment #6 from Joshua Conner <josh.m.conner at gmail dot com> 2011-11-06 19:01:26 UTC --- I ran into this bug building SPEC2k for ARM (176.gcc) w/LTO, and have done some investigation. In the provided test case, during inlining we generate an abstract function die for js_InternNonIntElementIdSlow (and the inlined instance with an abstract_origin referring to the abstract function die). Later, when we are generating the debug information for the non-slow version of the function, js_InternNonIntElementId, we process the declaration that appears inside that function: extern bool js_InternNonIntElementIdSlow (JSContext *, JSObject *, const js::Value &, long int *, js::Value *); We attempt to generate a die for this, and in doing so when looking up the decl using lookup_decl_die, we are returned the abstract instance of the "...Slow" function. We then attempt to re-define this die by clearing out the parameters from old instance and re-using it (see the code that follows this comment in gen_subprogram_die): /* If the definition comes from the same place as the declaration, maybe use the old DIE. We always want the DIE for this function that has the *_pc attributes to be under comp_unit_die so the debugger can find it. We also need to do this for abstract instances of inlines, since the spec requires the out-of-line copy to have the same parent. For local class methods, this doesn't apply; we just use the old DIE. */ Once we clear out the parameters, then the abstract_origin parameters in our original inlined instance now point to unreachable/unallocated dies, triggering the assertion failure. It's not clear to me what the fix is, so I could use some insight into what cases this code is supposed to handle. From reading the comments and code, it appears that we're trying to catch a case where we have a declaration followed by a definition? So, it's possible that we should recognize that we don't have a definition here, just a declaration. Alternatively (or in addition), should we recognize that we are dealing with an abstract declaration and not try to re-use it, since doing so will break any references that were almost certainly generated?