This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix PR86462


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;
     }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]