Fix PR86462

Message ID alpine.LSU.2.20.1807121226260.16707@zhemvz.fhfr.qr
State New
Headers show
Series
  • Fix PR86462
Related show

Commit Message

Richard Biener July 12, 2018, 10:29 a.m.
After my PR86413 fix to always annotate existing lexical block DIEs with
range attributes debuginfo grows significantly in case we previously
had "stale" lexical block DIEs without any variables.

The following fixes this by eliding those comletely and not emitting
a lexical block DIE for blocks that just contain DECL_INGORED_P
entities.  This solves the reported size regression and the
empty lexical block DIEs vanish.

Bootstrap & regtest running on x86_64-unknown-linux-gnu.

OK for trunk?

Thanks,
Richard.

2018-07-12  Richard Biener  <rguenther@suse.de>

	PR debug/86462
	* dwarf2out.c (gen_block_die): Only output blocks when they have
	at least one !DECL_IGNORED_P variable.

Comments

Jakub Jelinek July 12, 2018, 10:35 a.m. | #1
On Thu, Jul 12, 2018 at 12:29:20PM +0200, Richard Biener wrote:
> After my PR86413 fix to always annotate existing lexical block DIEs with
> range attributes debuginfo grows significantly in case we previously
> had "stale" lexical block DIEs without any variables.
> 
> The following fixes this by eliding those comletely and not emitting
> a lexical block DIE for blocks that just contain DECL_INGORED_P
> entities.  This solves the reported size regression and the
> empty lexical block DIEs vanish.
> 
> Bootstrap & regtest running on x86_64-unknown-linux-gnu.
> 
> OK for trunk?

Do you have a proof that BLOCK_NON_LOCALIZED_VAR is ever !DECL_IGNORED_P?

I see it is filled with:
          if ((!optimize || debug_info_level > DINFO_LEVEL_TERSE)
              && !DECL_IGNORED_P (old_var)
              && nonlocalized_list)
            vec_safe_push (*nonlocalized_list, old_var);
(twice) in tree-inline.c.  Anything else that populates it?

	Jakub
Richard Biener July 12, 2018, 11:01 a.m. | #2
On Thu, 12 Jul 2018, Jakub Jelinek wrote:

> On Thu, Jul 12, 2018 at 12:29:20PM +0200, Richard Biener wrote:
> > After my PR86413 fix to always annotate existing lexical block DIEs with
> > range attributes debuginfo grows significantly in case we previously
> > had "stale" lexical block DIEs without any variables.
> > 
> > The following fixes this by eliding those comletely and not emitting
> > a lexical block DIE for blocks that just contain DECL_INGORED_P
> > entities.  This solves the reported size regression and the
> > empty lexical block DIEs vanish.
> > 
> > Bootstrap & regtest running on x86_64-unknown-linux-gnu.
> > 
> > OK for trunk?
> 
> Do you have a proof that BLOCK_NON_LOCALIZED_VAR is ever !DECL_IGNORED_P?
> 
> I see it is filled with:
>           if ((!optimize || debug_info_level > DINFO_LEVEL_TERSE)
>               && !DECL_IGNORED_P (old_var)
>               && nonlocalized_list)
>             vec_safe_push (*nonlocalized_list, old_var);
> (twice) in tree-inline.c.  Anything else that populates it?

No, I don't think so.  OK, I'll remove the loop over 
BLOCK_NON_LOCALIZED_VAR and keep the original check for it.

I also simplified stuff by hoisting the TREE_USED and friends checks.

Bootstrap & regtest running on x86_64-unknown-linux-gnu, ok?

Thanks,
Richard.

2018-07-12  Richard Biener  <rguenther@suse.de>

	PR debug/86462
	* dwarf2out.c (gen_block_die): Only output blocks when they have
	at least one !DECL_IGNORED_P variable.

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 1127713cbaf..c2422e29658 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -25627,22 +25627,28 @@ gen_block_die (tree stmt, dw_die_ref context_die)
        we might have pruned all BLOCK_VARS as optimized out but we
        still want to generate high/low PC attributes so output it.  */
     must_output_die = 1;
-  else
+  else if (TREE_USED (stmt)
+	   || TREE_ASM_WRITTEN (stmt)
+	   || BLOCK_ABSTRACT (stmt))
     {
       /* Determine if this block directly contains any "significant"
 	 local declarations which we will need to output DIEs for.  */
       if (debug_info_level > DINFO_LEVEL_TERSE)
-	/* We are not in terse mode so *any* local declaration counts
-	   as being a "significant" one.  */
-	must_output_die = ((BLOCK_VARS (stmt) != NULL
-			    || BLOCK_NUM_NONLOCALIZED_VARS (stmt))
-			   && (TREE_USED (stmt)
-			       || TREE_ASM_WRITTEN (stmt)
-			       || BLOCK_ABSTRACT (stmt)));
-      else if ((TREE_USED (stmt)
-		|| TREE_ASM_WRITTEN (stmt)
-		|| BLOCK_ABSTRACT (stmt))
-      	       && !dwarf2out_ignore_block (stmt))
+	{
+	  /* We are not in terse mode so any local declaration that
+	     is not ignored for debug purposes counts as being a
+	     "significant" one.  */
+	  if (BLOCK_NUM_NONLOCALIZED_VARS (stmt))
+	    must_output_die = 1;
+	  else
+	    for (tree var = BLOCK_VARS (stmt); var; var = DECL_CHAIN (var))
+	      if (!DECL_IGNORED_P (var))
+		{
+		  must_output_die = 1;
+		  break;
+		}
+	}
+      else if (!dwarf2out_ignore_block (stmt))
 	must_output_die = 1;
     }
Jakub Jelinek July 12, 2018, 11:03 a.m. | #3
On Thu, Jul 12, 2018 at 01:01:14PM +0200, Richard Biener wrote:
> No, I don't think so.  OK, I'll remove the loop over 
> BLOCK_NON_LOCALIZED_VAR and keep the original check for it.
> 
> I also simplified stuff by hoisting the TREE_USED and friends checks.
> 
> Bootstrap & regtest running on x86_64-unknown-linux-gnu, ok?

LGTM.

> 2018-07-12  Richard Biener  <rguenther@suse.de>
> 
> 	PR debug/86462
> 	* dwarf2out.c (gen_block_die): Only output blocks when they have
> 	at least one !DECL_IGNORED_P variable.

	Jakub

Patch

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 1127713cbaf..995a463bddc 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -25632,13 +25632,30 @@  gen_block_die (tree stmt, dw_die_ref context_die)
       /* Determine if this block directly contains any "significant"
 	 local declarations which we will need to output DIEs for.  */
       if (debug_info_level > DINFO_LEVEL_TERSE)
-	/* We are not in terse mode so *any* local declaration counts
-	   as being a "significant" one.  */
-	must_output_die = ((BLOCK_VARS (stmt) != NULL
-			    || BLOCK_NUM_NONLOCALIZED_VARS (stmt))
-			   && (TREE_USED (stmt)
-			       || TREE_ASM_WRITTEN (stmt)
-			       || BLOCK_ABSTRACT (stmt)));
+	{
+	  /* We are not in terse mode so any local declaration that
+	     is not ignored for debug purposes counts as being a
+	     "significant" one.  */
+	  if (TREE_USED (stmt)
+	      || TREE_ASM_WRITTEN (stmt)
+	      || BLOCK_ABSTRACT (stmt))
+	    {
+	      for (tree var = BLOCK_VARS (stmt); var; var = DECL_CHAIN (var))
+		if (!DECL_IGNORED_P (var))
+		  {
+		    must_output_die = 1;
+		    break;
+		  }
+	      if (!must_output_die)
+		for (unsigned i = 0; i < BLOCK_NUM_NONLOCALIZED_VARS (stmt);
+		     ++i)
+		  if (!DECL_IGNORED_P (BLOCK_NONLOCALIZED_VAR (stmt, i)))
+		    {
+		      must_output_die = 1;
+		      break;
+		    }
+	    }
+	}
       else if ((TREE_USED (stmt)
 		|| TREE_ASM_WRITTEN (stmt)
 		|| BLOCK_ABSTRACT (stmt))