c-objc-common.c (c_tree_printer): Check flag before hashtable.
authorDaniel Berlin <dberlin@dberlin.org>
Wed, 1 Jun 2005 00:39:49 +0000 (00:39 +0000)
committerDaniel Berlin <dberlin@gcc.gnu.org>
Wed, 1 Jun 2005 00:39:49 +0000 (00:39 +0000)
2005-05-30  Daniel Berlin  <dberlin@dberlin.org>

* c-objc-common.c (c_tree_printer): Check flag before hashtable.
Use DECL_DEBUG_EXPR and SET_DECL_DEBUG_EXPR.
* dwarf2out.c (dwarf2out_var_location): Ditto.
* toplev.c (default_tree_printer): Ditto.
* tree-outof-ssa.c (create_temp): Ditto.
* tree-sra.c (instantiate_element): Ditto.
* var-tracking.c (track_expr_p): Ditto.
* tree.c (struct tree_map): New structure.
(debug_expr_for_decl): New.
(tree_map_eq): New function.
(tree_map_hash): Ditto.
(tree_map_marked_p): Ditto.
(print_debug_expr_statistics): Ditto.
(decl_debug_expr_lookup): Ditto.
(decl_debug_expr_insert): Ditto.
(dump_tree_statistics): Dump debug_expr hashtable stats.
* tree.h (DECL_DEBUG_EXPR): Change
(SET_DECL_DEBUG_EXPR): Add.

From-SVN: r100417

gcc/ChangeLog
gcc/c-objc-common.c
gcc/dwarf2out.c
gcc/toplev.c
gcc/tree-outof-ssa.c
gcc/tree-sra.c
gcc/tree.c
gcc/tree.h
gcc/var-tracking.c

index 9672b492afa6ed4eba0c5e4bb173295179cb748e..7b6f3ff390c4b3406f9f03ae1c2e7d1063c977fa 100644 (file)
@@ -1,3 +1,24 @@
+2005-05-30  Daniel Berlin  <dberlin@dberlin.org>
+
+       * c-objc-common.c (c_tree_printer): Check flag before hashtable.
+       Use DECL_DEBUG_EXPR and SET_DECL_DEBUG_EXPR.
+       * dwarf2out.c (dwarf2out_var_location): Ditto.
+       * toplev.c (default_tree_printer): Ditto.
+       * tree-outof-ssa.c (create_temp): Ditto.
+       * tree-sra.c (instantiate_element): Ditto.
+       * var-tracking.c (track_expr_p): Ditto.
+       * tree.c (struct tree_map): New structure.
+       (debug_expr_for_decl): New.
+       (tree_map_eq): New function.
+       (tree_map_hash): Ditto.
+       (tree_map_marked_p): Ditto.
+       (print_debug_expr_statistics): Ditto.
+       (decl_debug_expr_lookup): Ditto.
+       (decl_debug_expr_insert): Ditto.
+       (dump_tree_statistics): Dump debug_expr hashtable stats.
+       * tree.h (DECL_DEBUG_EXPR): Change
+       (SET_DECL_DEBUG_EXPR): Add.
+       
 2005-06-01  Alan Modra  <amodra@bigpond.net.au>
 
        * configure.ac: Add --enable-secureplt.
index 0dc8f55ddfcb242d642883ff60cf159746aaed9e..95a0a3a7130a54be58221aa8dac2fa6183b0bdfd 100644 (file)
@@ -171,7 +171,7 @@ c_tree_printer (pretty_printer *pp, text_info *text)
   switch (*text->format_spec)
     {
     case 'D':
-      if (DECL_DEBUG_EXPR (t) && DECL_DEBUG_EXPR_IS_FROM (t))
+      if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t))
        {
          t = DECL_DEBUG_EXPR (t);
          if (!DECL_P (t))
index 32711c7227cfee9e32266a743b3c0a2c68dfc9e5..1afe52e540da2655b9da3ccbab40d6ffa913a2f0 100644 (file)
@@ -13283,7 +13283,7 @@ dwarf2out_var_location (rtx loc_note)
   last_insn = loc_note;
   last_label = newloc->label;
   decl = NOTE_VAR_LOCATION_DECL (loc_note);
-  if (DECL_DEBUG_EXPR (decl) && DECL_DEBUG_EXPR_IS_FROM (decl)
+  if (DECL_DEBUG_EXPR_IS_FROM (decl) && DECL_DEBUG_EXPR (decl) 
       && DECL_P (DECL_DEBUG_EXPR (decl)))
     decl = DECL_DEBUG_EXPR (decl); 
   add_var_loc_to_decl (decl, newloc);
index 196595c680551d8d3eeed87da8098fa21e9223e9..6cda6bba35b43424b563fc72ca0eb048d2ec8719 100644 (file)
@@ -1575,7 +1575,7 @@ default_tree_printer (pretty_printer * pp, text_info *text)
     {
     case 'D':
       t = va_arg (*text->args_ptr, tree);
-      if (DECL_DEBUG_EXPR (t) && DECL_DEBUG_EXPR_IS_FROM (t))
+      if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t))
        t = DECL_DEBUG_EXPR (t);
       break;
 
index 52505c1aee41d968900551042b3763eec1e8344a..de3af73b3b3b58c7177b93216e55563b39260e3a 100644 (file)
@@ -158,14 +158,14 @@ create_temp (tree t)
     name = "temp";
   tmp = create_tmp_var (type, name);
 
-  if (DECL_DEBUG_EXPR (t) && DECL_DEBUG_EXPR_IS_FROM (t))
+  if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t))
     {
-      DECL_DEBUG_EXPR (tmp) = DECL_DEBUG_EXPR (t);  
+      SET_DECL_DEBUG_EXPR (tmp, DECL_DEBUG_EXPR (t));  
       DECL_DEBUG_EXPR_IS_FROM (tmp) = 1;
     }
   else if (!DECL_IGNORED_P (t))
     {
-      DECL_DEBUG_EXPR (tmp) = t;
+      SET_DECL_DEBUG_EXPR (tmp, t);
       DECL_DEBUG_EXPR_IS_FROM (tmp) = 1;
     }
   DECL_ARTIFICIAL (tmp) = DECL_ARTIFICIAL (t);
index 78cd03b7bf5f7aa51569e81fc4024080f261a7fe..811f675fd3816d09285ac30aca1e32c820eb03ee 100644 (file)
@@ -1126,9 +1126,9 @@ instantiate_element (struct sra_elt *elt)
       DECL_NAME (var) = get_identifier (pretty_name);
       obstack_free (&sra_obstack, pretty_name);
 
-      DECL_DEBUG_EXPR (var) = generate_element_ref (elt);
+      SET_DECL_DEBUG_EXPR (var, generate_element_ref (elt));
       DECL_DEBUG_EXPR_IS_FROM (var) = 1;
-
+      
       DECL_IGNORED_P (var) = 0;
       TREE_NO_WARNING (var) = TREE_NO_WARNING (base);
     }
index 133feb8988181791583ddba69f1600a0feeb992a..b34d07c548f9256282e2d2f7fc2d8b60c1aef133 100644 (file)
@@ -131,19 +131,36 @@ static GTY (()) tree int_cst_node;
 static GTY ((if_marked ("ggc_marked_p"), param_is (union tree_node)))
      htab_t int_cst_hash_table;
 
+/* General tree->tree mapping  structure for use in hash tables.  */
+
+struct tree_map GTY(())
+{
+  hashval_t hash;
+  tree from;
+  tree to;
+};
+
+static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map))) 
+     htab_t debug_expr_for_decl;
+
 static void set_type_quals (tree, int);
 static int type_hash_eq (const void *, const void *);
 static hashval_t type_hash_hash (const void *);
+static int tree_map_eq (const void *, const void *);
+static hashval_t tree_map_hash (const void *);
 static hashval_t int_cst_hash_hash (const void *);
 static int int_cst_hash_eq (const void *, const void *);
 static void print_type_hash_statistics (void);
+static void print_debug_expr_statistics (void);
 static tree make_vector_type (tree, int, enum machine_mode);
 static int type_hash_marked_p (const void *);
+static int tree_map_marked_p (const void *);
 static unsigned int type_hash_list (tree, hashval_t);
 static unsigned int attribute_hash_list (tree, hashval_t);
 
 tree global_trees[TI_MAX];
 tree integer_types[itk_none];
+
 \f
 /* Init tree.c.  */
 
@@ -153,9 +170,15 @@ init_ttree (void)
   /* Initialize the hash table of types.  */
   type_hash_table = htab_create_ggc (TYPE_HASH_INITIAL_SIZE, type_hash_hash,
                                     type_hash_eq, 0);
+
+  debug_expr_for_decl = htab_create_ggc (512, tree_map_hash,
+                                        tree_map_eq, 0);
+
   int_cst_hash_table = htab_create_ggc (1024, int_cst_hash_hash,
                                        int_cst_hash_eq, NULL);
+  
   int_cst_node = make_node (INTEGER_CST);
+
 }
 
 \f
@@ -3430,6 +3453,76 @@ build_variant_type_copy (tree type)
   return t;
 }
 \f
+/* Return true if the from tree in both tree maps are equal.  */
+
+static int
+tree_map_eq (const void *va, const void *vb)
+{
+  const struct tree_map  *a = va, *b = vb;
+  return (a->from == b->from);
+}
+
+/* Hash a from tree in a tree_map.  */
+
+static hashval_t
+tree_map_hash (const void *item)
+{
+  return (((const struct tree_map *) item)->hash);
+}
+
+/* Return true if this tree map structure is marked for garbage collection
+   purposes.  We simply return true if the from tree is marked, so that this
+   structure goes away when the from tree goes away.  */
+
+static int
+tree_map_marked_p (const void *p)
+{
+  tree from = ((struct tree_map *) p)->from;
+
+  return ggc_marked_p (from);
+}
+
+/* Print out the statistics for the DECL_DEBUG_EXPR hash table.  */
+
+static void
+print_debug_expr_statistics (void)
+{
+  fprintf (stderr, "DECL_DEBUG_EXPR  hash: size %ld, %ld elements, %f collisions\n",
+          (long) htab_size (debug_expr_for_decl),
+          (long) htab_elements (debug_expr_for_decl),
+          htab_collisions (debug_expr_for_decl));
+}
+
+/* Lookup a debug expression for FROM, and return it if we find one.  */
+
+tree 
+decl_debug_expr_lookup (tree from)
+{
+  struct tree_map *h, in;
+  in.from = from;
+
+  h = htab_find_with_hash (debug_expr_for_decl, &in, htab_hash_pointer (from));
+  if (h)
+    return h->to;
+  return NULL_TREE;
+}
+
+/* Insert a mapping FROM->TO in the debug expression hashtable.  */
+
+void
+decl_debug_expr_insert (tree from, tree to)
+{
+  struct tree_map *h;
+  void **loc;
+
+  h = ggc_alloc (sizeof (struct tree_map));
+  h->hash = htab_hash_pointer (from);
+  h->from = from;
+  h->to = to;
+  loc = htab_find_slot_with_hash (debug_expr_for_decl, h, h->hash, INSERT);
+  *(struct tree_map **) loc = h;
+}  
+  
 /* Hashing of types so that we don't make duplicates.
    The entry point is `type_hash_canon'.  */
 
@@ -5261,6 +5354,7 @@ dump_tree_statistics (void)
   fprintf (stderr, "(No per-node statistics)\n");
 #endif
   print_type_hash_statistics ();
+  print_debug_expr_statistics ();
   lang_hooks.print_statistics ();
 }
 \f
index e72a20fddca71b9551e5211649bbe7b3938b9591..e842f6940252e4a31bbe8510c583f37f6272aef3 100644 (file)
@@ -2053,10 +2053,17 @@ struct tree_binfo GTY (())
    writing debugging information about vfield and vbase decls for C++.  */
 #define DECL_FCONTEXT(NODE) (FIELD_DECL_CHECK (NODE)->decl.vindex)
 
+extern tree decl_debug_expr_lookup (tree);
+extern void decl_debug_expr_insert (tree, tree);
+
 /* For VAR_DECL, this is set to either an expression that it was split
    from (if DECL_DEBUG_EXPR_IS_FROM is true), otherwise a tree_list of
    subexpressions that it was split into.  */
-#define DECL_DEBUG_EXPR(NODE) (DECL_CHECK (NODE)->decl.vindex)
+#define DECL_DEBUG_EXPR(NODE) \
+  (decl_debug_expr_lookup (VAR_DECL_CHECK (NODE)))
+
+#define SET_DECL_DEBUG_EXPR(NODE, VAL) \
+  (decl_debug_expr_insert (VAR_DECL_CHECK (NODE), (VAL)))
 
 #define DECL_DEBUG_EXPR_IS_FROM(NODE) \
   (DECL_CHECK (NODE)->decl.debug_expr_is_from)
index a6a9c15d79e122b1d66b91fb9154b36529ae9f2d..626a8e04dd992d941c89fb4f00eff66cfa3c1389 100644 (file)
@@ -1441,8 +1441,7 @@ track_expr_p (tree expr)
      don't need to track this expression if the ultimate declaration is
      ignored.  */
   realdecl = expr;
-  if (DECL_DEBUG_EXPR (realdecl)
-      && DECL_DEBUG_EXPR_IS_FROM (realdecl))
+  if (DECL_DEBUG_EXPR_IS_FROM (realdecl) && DECL_DEBUG_EXPR (realdecl))
     {
       realdecl = DECL_DEBUG_EXPR (realdecl);
       /* ??? We don't yet know how to emit DW_OP_piece for variable