public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Aldy Hernandez <aldyh@redhat.com>
To: Jason Merrill <jason@redhat.com>
Cc: gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: [debug-early] equate new DIE with DW_AT_specificationto a previous declaration
Date: Fri, 10 Apr 2015 21:10:00 -0000	[thread overview]
Message-ID: <55283C51.40204@redhat.com> (raw)
In-Reply-To: <551EA684.8090600@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 1106 bytes --]

On 04/03/2015 07:41 AM, Jason Merrill wrote:
> On 03/18/2015 11:51 AM, Aldy Hernandez wrote:
>> On 03/17/2015 07:12 PM, Jason Merrill wrote:
>>> Why are we outlining a DECL_EXTERNAL function?
>>
>> SRA has no restrictions on whether a function is DECL_EXTERNAL.
>
> Aha.
>
> So it seems that DECL_EXTERNAL is the wrong gate for
> equate_decl_number_to_die here.  I think the rule we want is that if we
> don't already have a non-declaration DIE for a function, we should
> equate the new DIE.  Let's remove the existing calls and replace them
> with a single conditional call before the if (declaration).

Nice.  Done.

> Incidentally,
>
>>       /* A declaration that has been previously dumped needs no
>>          additional information.  */
>>       if (dumped_early && declaration)
>>         return;
>
> Do we need to check dumped_early here?  I would think that any
> declaration that has an old_die needs no additional information.

Indeed, good catch.  Fixed.

The attached patch fixes the original regression, and introduces none in 
either gdb or the guality tests on gcc.

OK for branch?

Aldy

[-- Attachment #2: curr --]
[-- Type: text/plain, Size: 3584 bytes --]

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 0976415..d7c367e 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -18743,13 +18743,13 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
      much as possible.  */
   else if (old_die)
     {
-      dumped_early = old_die->dumped_early;
-
       /* A declaration that has been previously dumped needs no
 	 additional information.  */
-      if (dumped_early && declaration)
+      if (declaration)
 	return;
 
+      dumped_early = old_die->dumped_early;
+
       if (!get_AT_flag (old_die, DW_AT_declaration)
 	  /* We can have a normal definition following an inline one in the
 	     case of redefinition of GNU C extern inlines.
@@ -18829,8 +18829,6 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
 		add_type_attribute (subr_die, TREE_TYPE (TREE_TYPE (decl)),
 				    TYPE_UNQUALIFIED, context_die);
 	    }
-	  if (early_dwarf_dumping)
-	    equate_decl_number_to_die (decl, subr_die);
 	}
     }
   /* Anything else... create a brand new DIE.  */
@@ -18860,6 +18858,11 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
       add_accessibility_attribute (subr_die, decl);
     }
 
+  /* Unless we have an existing non-declaration DIE, eqaute the new
+     DIE.  */
+  if (!old_die || is_declaration_die (old_die))
+    equate_decl_number_to_die (decl, subr_die);
+
   if (declaration)
     {
       if (!old_die || !get_AT (old_die, DW_AT_inline))
@@ -18877,15 +18880,6 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
 	  if (lang_hooks.decls.function_decl_deleted_p (decl)
 	      && (! dwarf_strict))
 	    add_AT_flag (subr_die, DW_AT_GNU_deleted, 1);
-
-	  /* The first time we see a member function, it is in the context of
-	     the class to which it belongs.  We make sure of this by emitting
-	     the class first.  The next time is the definition, which is
-	     handled above.  The two may come from the same source text.
-
-	     Note that force_decl_die() forces function declaration die. It is
-	     later reused to represent definition.  */
-	  equate_decl_number_to_die (decl, subr_die);
 	}
     }
   /* Tag abstract instances with DW_AT_inline.  */
@@ -18909,8 +18903,6 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
       if (DECL_DECLARED_INLINE_P (decl)
 	  && lookup_attribute ("artificial", DECL_ATTRIBUTES (decl)))
 	add_AT_flag (subr_die, DW_AT_artificial, 1);
-
-      equate_decl_number_to_die (decl, subr_die);
     }
   /* For non DECL_EXTERNALs, if range information is available, fill
      the DIE with it.  */
@@ -18920,9 +18912,6 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
 
       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);
-
       /* If we have no fun->fde, we have no range information.
 	 Skip over and fill in range information in the second
 	 dwarf pass.  */
@@ -19090,14 +19079,9 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
     }
 
   /* Generate child dies for template paramaters.  */
-  if (debug_info_level > DINFO_LEVEL_TERSE)
-    {
-      /* XXX */
-      if (!lookup_decl_die (decl))
-	equate_decl_number_to_die (decl, subr_die);
-      if (early_dwarf_dumping)
-	gen_generic_params_dies (decl);
-    }
+  if (debug_info_level > DINFO_LEVEL_TERSE
+      && early_dwarf_dumping)
+    gen_generic_params_dies (decl);
 
   /* Now output descriptions of the arguments for this function. This gets
      (unnecessarily?) complex because of the fact that the DECL_ARGUMENT list

      reply	other threads:[~2015-04-10 21:10 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-17 19:58 Aldy Hernandez
2015-03-18  2:12 ` Jason Merrill
2015-03-18 15:51   ` Aldy Hernandez
2015-04-03 14:41     ` Jason Merrill
2015-04-10 21:10       ` Aldy Hernandez [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55283C51.40204@redhat.com \
    --to=aldyh@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=jason@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).