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] Bits from Early LTO debug merge -- move stuff from late to early finish


On Thu, 22 Sep 2016, Richard Biener wrote:

> 
> This merges moving of unused type pruning from late to early finish as 
> well as handling of debug types and dwarf2 dups elimination.  It adds
> a flag to DIEs so we can mark them as removed in case sth after
> early finish tries to lookup a DIE for a removed DIE again - we shouldn't
> re-use the removed DIE (w/o parent) there.
> 
> I suppose at some point we should re-think how pruning of "unused"
> stuff is supposed to work.  Given my grand plan is to get rid of
> debug hooks and allow FEs direct control over the DWARF it should
> be ultimatively their decision what to remove (err, not create, in
> the first place).
> 
> Bootstrap and regtest running on x86_64-unknown-linux-gnu, ok for trunk?

Testing this separately shows the need to port another hunk.  If we
prune types early we have to make sure to not re-create them late
via typedefs in BLOCKs.

Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c     (revision 240363)
+++ gcc/dwarf2out.c     (working copy)
@@ -23255,7 +23242,13 @@ process_scope_var (tree stmt, tree decl,
     die = lookup_decl_die (decl_or_origin);
   else if (TREE_CODE (decl_or_origin) == TYPE_DECL
            && TYPE_DECL_IS_STUB (decl_or_origin))
-    die = lookup_type_die (TREE_TYPE (decl_or_origin));
+    {
+      /* Avoid re-creating the DIE late if it was optimized
+        as unused early (this BLOCK reference does not count as "use").  
*/
+      die = lookup_type_die (TREE_TYPE (decl_or_origin));
+      if (! die)
+       return;
+    }
   else
     die = NULL;

Richard.

> I believe this is the last part I can reasonably split out (but I'll
> have a second look after merging back from trunk once this and the other
> pending patch is approved).
> 
> Thanks,
> Richard.
> 
> 2016-09-22  Richard Biener  <rguenther@suse.de>
> 
> 	* dwarf2out.c (struct die_struct): Add removed flag.
> 	(lookup_type_die): If the DIE is marked as removed, clear
> 	TYPE_SYMTAB_DIE and return NULL.
> 	(lookup_decl_die): If the DIE is marked as removed, remove it
> 	from the hash and return NULL.
> 	(mark_removed): New helper.
> 	(prune_unused_types_prune): Call it for removed DIEs.
> 	(dwarf2out_finish): Move unused type pruning debug_types handling
> 	and breaking out includes ...
> 	(dwarf2out_early_finish): ... here.
> 
> Index: gcc/dwarf2out.c
> ===================================================================
> --- gcc/dwarf2out.c	(revision 240353)
> +++ gcc/dwarf2out.c	(working copy)
> @@ -2705,6 +2705,10 @@ typedef struct GTY((chain_circular ("%h.
>    /* Die is used and must not be pruned as unused.  */
>    BOOL_BITFIELD die_perennial_p : 1;
>    BOOL_BITFIELD comdat_type_p : 1; /* DIE has a type signature */
> +  /* Whether this DIE was removed from the DIE tree, for example via
> +     prune_unused_types.  We don't consider those present from the
> +     DIE lookup routines.  */
> +  BOOL_BITFIELD removed : 1;
>    /* Lots of spare bits.  */
>  }
>  die_node;
> @@ -5098,7 +5102,13 @@ new_die (enum dwarf_tag tag_value, dw_di
>  static inline dw_die_ref
>  lookup_type_die (tree type)
>  {
> -  return TYPE_SYMTAB_DIE (type);
> +  dw_die_ref die = TYPE_SYMTAB_DIE (type);
> +  if (die && die->removed)
> +    {
> +      TYPE_SYMTAB_DIE (type) = NULL;
> +      return NULL;
> +    }
> +  return die;
>  }
>  
>  /* Given a TYPE_DIE representing the type TYPE, if TYPE is an
> @@ -5163,7 +5173,16 @@ decl_die_hasher::equal (die_node *x, tre
>  static inline dw_die_ref
>  lookup_decl_die (tree decl)
>  {
> -  return decl_die_table->find_with_hash (decl, DECL_UID (decl));
> +  dw_die_ref *die = decl_die_table->find_slot_with_hash (decl, DECL_UID (decl),
> +							 NO_INSERT);
> +  if (!die)
> +    return NULL;
> +  if ((*die)->removed)
> +    {
> +      decl_die_table->clear_slot (die);
> +      return NULL;
> +    }
> +  return *die;
>  }
>  
>  /* Returns a hash value for X (which really is a var_loc_list).  */
> @@ -26195,6 +26214,16 @@ prune_unused_types_update_strings (dw_di
>        }
>  }
>  
> +/* Mark DIE and its children as removed.  */
> +
> +static void
> +mark_removed (dw_die_ref die)
> +{
> +  dw_die_ref c;
> +  die->removed = true;
> +  FOR_EACH_CHILD (die, c, mark_removed (c));
> +}
> +
>  /* Remove from the tree DIE any dies that aren't marked.  */
>  
>  static void
> @@ -26224,12 +26253,14 @@ prune_unused_types_prune (dw_die_ref die
>  	      die->die_child = prev;
>  	    }
>  	  c->die_sib = NULL;
> +	  mark_removed (c);
>  	  return;
>  	}
>        else
>  	{
>  	  next = c->die_sib;
>  	  c->die_sib = NULL;
> +	  mark_removed (c);
>  	}
>  
>      if (c != prev->die_sib)
> @@ -27835,37 +27866,6 @@ dwarf2out_finish (const char *)
>    resolve_addr (comp_unit_die ());
>    move_marked_base_types ();
>  
> -  if (flag_eliminate_unused_debug_types)
> -    prune_unused_types ();
> -
> -  /* Generate separate COMDAT sections for type DIEs. */
> -  if (use_debug_types)
> -    {
> -      break_out_comdat_types (comp_unit_die ());
> -
> -      /* Each new type_unit DIE was added to the limbo die list when created.
> -         Since these have all been added to comdat_type_list, clear the
> -         limbo die list.  */
> -      limbo_die_list = NULL;
> -
> -      /* For each new comdat type unit, copy declarations for incomplete
> -         types to make the new unit self-contained (i.e., no direct
> -         references to the main compile unit).  */
> -      for (ctnode = comdat_type_list; ctnode != NULL; ctnode = ctnode->next)
> -        copy_decls_for_unworthy_types (ctnode->root_die);
> -      copy_decls_for_unworthy_types (comp_unit_die ());
> -
> -      /* In the process of copying declarations from one unit to another,
> -         we may have left some declarations behind that are no longer
> -         referenced.  Prune them.  */
> -      prune_unused_types ();
> -    }
> -
> -  /* Generate separate CUs for each of the include files we've seen.
> -     They will go into limbo_die_list.  */
> -  if (flag_eliminate_dwarf2_dups)
> -    break_out_includes (comp_unit_die ());
> -
>    /* Traverse the DIE's and add sibling attributes to those DIE's that
>       have children.  */
>    add_sibling_attributes (comp_unit_die ());
> @@ -28193,6 +28193,38 @@ dwarf2out_early_finish (const char *file
>      }
>    deferred_asm_name = NULL;
>  
> +  if (flag_eliminate_unused_debug_types)
> +    prune_unused_types ();
> +
> +  /* Generate separate COMDAT sections for type DIEs. */
> +  if (use_debug_types)
> +    {
> +      break_out_comdat_types (comp_unit_die ());
> +
> +      /* Each new type_unit DIE was added to the limbo die list when created.
> +         Since these have all been added to comdat_type_list, clear the
> +         limbo die list.  */
> +      limbo_die_list = NULL;
> +
> +      /* For each new comdat type unit, copy declarations for incomplete
> +         types to make the new unit self-contained (i.e., no direct
> +         references to the main compile unit).  */
> +      for (comdat_type_node *ctnode = comdat_type_list;
> +	   ctnode != NULL; ctnode = ctnode->next)
> +        copy_decls_for_unworthy_types (ctnode->root_die);
> +      copy_decls_for_unworthy_types (comp_unit_die ());
> +
> +      /* In the process of copying declarations from one unit to another,
> +         we may have left some declarations behind that are no longer
> +         referenced.  Prune them.  */
> +      prune_unused_types ();
> +    }
> +
> +  /* Generate separate CUs for each of the include files we've seen.
> +     They will go into limbo_die_list.  */
> +  if (flag_eliminate_dwarf2_dups)
> +    break_out_includes (comp_unit_die ());
> +
>    /* The early debug phase is now finished.  */
>    early_dwarf_finished = true;
>  }
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)


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