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

Reply via email to