On Sat, Nov 17, 2018 at 05:51:05PM +0100, Richard Biener wrote: > On November 17, 2018 4:14:58 PM GMT+01:00, Jakub Jelinek <ja...@redhat.com> > wrote: > >On Sat, Nov 17, 2018 at 08:31:32AM +0100, Richard Biener wrote: > >> On November 16, 2018 10:10:00 PM GMT+01:00, Jakub Jelinek > >> <ja...@redhat.com> wrote: Can you add a comment why doing it > >differently > >> for this case is necessary or do it the same way in all cases? > > > >Do you mean in omp-expand.c or dwarf2out.c? I believe I'm doing it the > >same > > I meant in dwarf2out.c. IIRC we have multiple calls into dwarf2out_decl and > you adjust only one?
We don't need to change the case where decl isn't a FUNCTION_DECL, and must not change the case where we call dwarf2out_decl (decl), that would lead to infinite recursion. The only case might be replace current_function_decl = origin; dwarf2out_decl (origin); with the dwarf2out_early_global_decl (origin); call, not really sure if that is needed though. Do we ever have functions where decl_function_context (decl) != decl_function_context (DECL_ABSTRACT_ORIGIN (decl)) ? The other possibility is to move this decl_function_context handling code from dwarf2out_early_global_decl to dwarf2out_decl, guarded with if (early_dwarf && decl_function_context (decl))) ... Something like (completely untested): --- gcc/dwarf2out.c.jj 2018-11-16 17:33:42.899215778 +0100 +++ gcc/dwarf2out.c 2018-11-17 20:11:26.847301806 +0100 @@ -26390,22 +26390,6 @@ dwarf2out_early_global_decl (tree decl) { tree save_fndecl = current_function_decl; - /* For nested functions, make sure we have DIEs for the parents first - so that all nested DIEs are generated at the proper scope in the - first shot. */ - tree context = decl_function_context (decl); - if (context != NULL) - { - dw_die_ref context_die = lookup_decl_die (context); - current_function_decl = context; - - /* Avoid emitting DIEs multiple times, but still process CONTEXT - enough so that it lands in its own context. This avoids type - pruning issues later on. */ - if (context_die == NULL || is_declaration_die (context_die)) - dwarf2out_decl (context); - } - /* Emit an abstract origin of a function first. This happens with C++ constructor clones for example and makes dwarf2out_abstract_function happy which requires the early @@ -26716,11 +26700,31 @@ dwarf2out_decl (tree 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 in limbo and create 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; + if (early_dwarf) + { + /* For nested functions, make sure we have DIEs for the parents first + so that all nested DIEs are generated at the proper scope in the + first shot. */ + tree context = decl_function_context (decl); + if (context != NULL) + { + dw_die_ref ctx_die = lookup_decl_die (context); + tree save_fndecl = current_function_decl; + current_function_decl = context; + + /* Avoid emitting DIEs multiple times, but still process CONTEXT + enough so that it lands in its own context. This avoids type + pruning issues later on. */ + if (ctx_die == NULL || is_declaration_die (ctx_die)) + dwarf2out_decl (context); + + current_function_decl = save_fndecl; + + /* But if we're in terse mode, we don't care about scope. */ + if (debug_info_level > DINFO_LEVEL_TERSE) + context_die = NULL; + } + } break; case VAR_DECL: Jakub