[debug-early] Disable removal of DW_tags* while generating subprogram DIEs
diff mbox

Message ID 541B31C4.8010603@redhat.com
State New
Headers show

Commit Message

Aldy Hernandez Sept. 18, 2014, 7:25 p.m. UTC
This patch disables removing of 
DW_AT_{declaration,object_pointer,formal_parameter} tags while 
generating a DIE for subprograms.  Now that we generate dwarf info 
early, we will always have an old_die the second time around.  I see no 
need to remove the aforementioned tags, only to create them again 
(incorrectly in a C++ testcase I have).

Previously I had the removal predicated by !old_die->dumped_early, hence 
removing it only if it had not been dumped early, but this is 
problematic since types do not have the `dumped_early' flag set.  I 
could add a debug_hook for early_type_decl(), as we did for 
early_global_decl(), so we can tag dumped early types as such, but I'm 
_hoping_ the change here is sufficient.  Things should "just work".  If 
not, perhaps we can look into adding an early_type_decl() hook or some 
other solution.

With this patch I am finally able to build all of libstdc++ without any 
ICEs, all while keeping the guality.exp tests for C at less regressions 
than mainline.

Comitting to branch.  Whine if in violent disagreement.

Aldy
commit 8face8fdb00474fe3e2375d08eab52726e125b8a
Author: Aldy Hernandez <aldyh@redhat.com>
Date:   Thu Sep 18 12:37:43 2014 -0600

    	* dwarf2out.c (gen_subprogram_die): Disable removal of
    	DW_AT_{declaration,object_pointer,formal_parameter}.
    	(remove_child_TAG): Mark as ATTRIBUTE_UNUSED temporarily.

Comments

Jason Merrill Sept. 18, 2014, 7:55 p.m. UTC | #1
On 09/18/2014 03:25 PM, Aldy Hernandez wrote:
> This patch disables removing of
> DW_AT_{declaration,object_pointer,formal_parameter} tags while
> generating a DIE for subprograms.  Now that we generate dwarf info
> early, we will always have an old_die the second time around.   I see no
> need to remove the aforementioned tags, only to create them again
> (incorrectly in a C++ testcase I have).

I think you probably still want to remove DW_AT_declaration, as you 
probably don't want it the second time around (and wouldn't create it 
again).

Jason

Patch
diff mbox

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 0ad8b5d..f6c7f4a 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -4771,7 +4771,7 @@  move_all_children (dw_die_ref old_parent, dw_die_ref new_parent)
 /* Remove child DIE whose die_tag is TAG.  Do nothing if no child
    matches TAG.  */
 
-static void
+static void ATTRIBUTE_UNUSED
 remove_child_TAG (dw_die_ref die, enum dwarf_tag tag)
 {
   dw_die_ref c;
@@ -18301,17 +18301,16 @@  gen_subprogram_die (tree decl, dw_die_ref context_die)
 	  /* ??? Hmmm, early dwarf generation happened earlier, so no
 	     sense in removing the parameters.  Let's keep them and
 	     augment them with location information later.  */
-	  if (!old_die->dumped_early)
-	    {
-	      /* Clear out the declaration attribute and the formal parameters.
-		 Do not remove all children, because it is possible that this
-		 declaration die was forced using force_decl_die(). In such
-		 cases die that forced declaration die (e.g. TAG_imported_module)
-		 is one of the children that we do not want to remove.  */
-	      remove_AT (subr_die, DW_AT_declaration);
-	      remove_AT (subr_die, DW_AT_object_pointer);
-	      remove_child_TAG (subr_die, DW_TAG_formal_parameter);
-	    }
+#if 0
+	  /* Clear out the declaration attribute and the formal parameters.
+	     Do not remove all children, because it is possible that this
+	     declaration die was forced using force_decl_die(). In such
+	     cases die that forced declaration die (e.g. TAG_imported_module)
+	     is one of the children that we do not want to remove.  */
+	  remove_AT (subr_die, DW_AT_declaration);
+	  remove_AT (subr_die, DW_AT_object_pointer);
+	  remove_child_TAG (subr_die, DW_TAG_formal_parameter);
+#endif
 	}
       else
 	{