I am testing the following patch to avoid forcing DIEs for a type context for method clones late via limbo processing. Instead hang them off comp_unit_die if there is no early DIE for the function.
One question is whether the comment "If we're a nested function" matches up with the decl_function_context (decl) check or whether we really wanted to check DECL_CONTEXT (decl) == FUNCTION_DECL which would have made this particular case not match (DECL_CONTEXT is a RECORD_TYPE which context is a FUNCTION_DECL). Another option is of course to make clones not inherit DECL_CONTEXT from the cloned function (for an artificial instance the "context" is somewhat arbitrary since it isn't going to be found by lookup). In fact I long wanted to represent clones as artificial containers for an inline instance of the cloned function... LTO bootstrap and regtest running on x86_64-unknown-linux-gnu. If that succeeds I'm going to apply it as a stop-gap measure to make Firefox build again with LTO but I'm open to revising it. Richard. 2018-07-24 Richard Biener <rguent...@suse.de> PR debug/86654 * dwarf2out.c (dwarf2out_decl): Do not handle nested functions special wrt context_die late. Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c (revision 262948) +++ gcc/dwarf2out.c (working copy) @@ -26702,8 +26702,11 @@ dwarf2out_decl (tree decl) case FUNCTION_DECL: /* If we're a nested function, initially use a parent of NULL; if we're a plain function, this will be fixed up in decls_for_scope. If - we're a method, it will be ignored, since we already have a DIE. */ - if (decl_function_context (decl) + we're a method, it will be ignored, since we already have a DIE. + Avoid doing this late though since clones of class methods may + otherwise end up creating type DIEs late. */ + if (early_dwarf + && decl_function_context (decl) /* But if we're in terse mode, we don't care about scope. */ && debug_info_level > DINFO_LEVEL_TERSE) context_die = NULL;