+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.
#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
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;
/* 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. */
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;
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);
}
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