Fix print_node for CONSTRUCTORs
authorMartin Liska <mliska@suse.cz>
Thu, 24 Nov 2016 09:42:18 +0000 (10:42 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 24 Nov 2016 09:42:18 +0000 (09:42 +0000)
* print-tree.c (struct bucket): Remove.
(print_node): Add new argument which drives whether a tree node
is printed briefly or not.
(debug_tree): Replace a custom hash table with hash_set<T>.
* print-tree.h (print_node): Add the argument.

From-SVN: r242820

gcc/ChangeLog
gcc/print-tree.c
gcc/print-tree.h

index de39daf..b150362 100644 (file)
@@ -1,3 +1,11 @@
+2016-11-24  Martin Liska  <mliska@suse.cz>
+
+       * print-tree.c (struct bucket): Remove.
+       (print_node): Add new argument which drives whether a tree node
+       is printed briefly or not.
+       (debug_tree): Replace a custom hash table with hash_set<T>.
+       * print-tree.h (print_node): Add the argument.
+
 2016-11-24  Chung-Lin Tang  <cltang@codesourcery.com>
 
        * config/nios2/nios2.c (nios2_init_libfuncs): Add ATTRIBUTE_UNUSED.
index 8c63cb8..f3ee04c 100644 (file)
@@ -33,19 +33,14 @@ along with GCC; see the file COPYING3.  If not see
 #include "gimple-pretty-print.h" /* FIXME */
 #include "tree-cfg.h"
 #include "tree-dump.h"
+#include "print-tree.h"
 
 /* Define the hash table of nodes already seen.
    Such nodes are not repeated; brief cross-references are used.  */
 
 #define HASH_SIZE 37
 
-struct bucket
-{
-  tree node;
-  struct bucket *next;
-};
-
-static struct bucket **table;
+static hash_set<tree> *table = NULL;
 
 /* Print PREFIX and ADDR to FILE.  */
 void
@@ -176,10 +171,9 @@ indent_to (FILE *file, int column)
    starting in column INDENT.  */
 
 void
-print_node (FILE *file, const char *prefix, tree node, int indent)
+print_node (FILE *file, const char *prefix, tree node, int indent,
+           bool brief_for_visited)
 {
-  int hash;
-  struct bucket *b;
   machine_mode mode;
   enum tree_code_class tclass;
   int len;
@@ -219,21 +213,14 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
   /* Allow this function to be called if the table is not there.  */
   if (table)
     {
-      hash = ((uintptr_t) node) % HASH_SIZE;
-
       /* If node is in the table, just mention its address.  */
-      for (b = table[hash]; b; b = b->next)
-       if (b->node == node)
-         {
-           print_node_brief (file, prefix, node, indent);
-           return;
-         }
+      if (table->contains (node) && brief_for_visited)
+       {
+         print_node_brief (file, prefix, node, indent);
+         return;
+       }
 
-      /* Add this node to the table.  */
-      b = XNEW (struct bucket);
-      b->node = node;
-      b->next = table[hash];
-      table[hash] = b;
+      table->add (node);
     }
 
   /* Indent to the specified column, since this is the long form.  */
@@ -846,8 +833,8 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
            FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node),
                                      cnt, index, value)
              {
-               print_node (file, "idx", index, indent + 4);
-               print_node (file, "val", value, indent + 4);
+               print_node (file, "idx", index, indent + 4, false);
+               print_node (file, "val", value, indent + 4, false);
              }
          }
          break;
@@ -997,10 +984,10 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
 DEBUG_FUNCTION void
 debug_tree (tree node)
 {
-  table = XCNEWVEC (struct bucket *, HASH_SIZE);
+  table = new hash_set<tree> (HASH_SIZE);
   print_node (stderr, "", node, 0);
-  free (table);
-  table = 0;
+  delete table;
+  table = NULL;
   putc ('\n', stderr);
 }
 
index 124deab..fd610f9 100644 (file)
@@ -38,7 +38,8 @@ extern void debug_raw (vec<tree, va_gc> &ref);
 extern void debug_raw (vec<tree, va_gc> *ptr);
 #ifdef BUFSIZ
 extern void dump_addr (FILE*, const char *, const void *);
-extern void print_node (FILE *, const char *, tree, int);
+extern void print_node (FILE *, const char *, tree, int,
+                       bool brief_for_visited = true);
 extern void print_node_brief (FILE *, const char *, const_tree, int);
 extern void indent_to (FILE *, int);
 #endif