/* Prints out tree in human readable form - GCC
Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
Free Software Foundation, Inc.
This file is part of GCC.
#include "coretypes.h"
#include "tm.h"
#include "tree.h"
-#include "real.h"
-#include "fixed-value.h"
#include "ggc.h"
#include "langhooks.h"
#include "tree-iterator.h"
#include "diagnostic.h"
+#include "gimple-pretty-print.h"
#include "tree-flow.h"
+#include "tree-pass.h"
/* Define the hash table of nodes already seen.
Such nodes are not repeated; brief cross-references are used. */
Most nodes referred to by this one are printed recursively
down to a depth of six. */
-void
+DEBUG_FUNCTION void
debug_tree (tree node)
{
table = XCNEWVEC (struct bucket *, HASH_SIZE);
putc ('\n', stderr);
}
+/* Print the vector of trees VEC on standard error, for debugging.
+ Most nodes referred to by this one are printed recursively
+ down to a depth of six. */
+
+DEBUG_FUNCTION void
+debug_vec_tree (VEC(tree,gc) *vec)
+{
+ table = XCNEWVEC (struct bucket *, HASH_SIZE);
+ print_vec_tree (stderr, "", vec, 0);
+ free (table);
+ table = 0;
+ putc ('\n', stderr);
+}
+
/* Print PREFIX and ADDR to FILE. */
void
dump_addr (FILE *file, const char *prefix, const void *addr)
fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
else if (TREE_CODE (node) == LABEL_DECL
&& LABEL_DECL_UID (node) != -1)
- fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
+ {
+ if (dump_flags & TDF_NOUID)
+ fprintf (file, " L.xxxx");
+ else
+ fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
+ }
else
- fprintf (file, " %c.%u", TREE_CODE (node) == CONST_DECL ? 'C' : 'D',
- DECL_UID (node));
+ {
+ if (dump_flags & TDF_NOUID)
+ fprintf (file, " %c.xxxx",
+ TREE_CODE (node) == CONST_DECL ? 'C' : 'D');
+ else
+ fprintf (file, " %c.%u",
+ TREE_CODE (node) == CONST_DECL ? 'C' : 'D',
+ DECL_UID (node));
+ }
}
else if (tclass == tcc_type)
{
fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
else if (code == LABEL_DECL
&& LABEL_DECL_UID (node) != -1)
- fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
+ {
+ if (dump_flags & TDF_NOUID)
+ fprintf (file, " L.xxxx");
+ else
+ fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
+ }
else
- fprintf (file, " %c.%u", code == CONST_DECL ? 'C' : 'D',
- DECL_UID (node));
+ {
+ if (dump_flags & TDF_NOUID)
+ fprintf (file, " %c.xxxx", code == CONST_DECL ? 'C' : 'D');
+ else
+ fprintf (file, " %c.%u", code == CONST_DECL ? 'C' : 'D',
+ DECL_UID (node));
+ }
}
else if (tclass == tcc_type)
{
if (indent <= 4)
print_node_brief (file, "type", TREE_TYPE (node), indent + 4);
}
- else
+ else if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
{
print_node (file, "type", TREE_TYPE (node), indent + 4);
if (TREE_TYPE (node))
fputs (" built-in", file);
if (code == FUNCTION_DECL && DECL_STATIC_CHAIN (node))
fputs (" static-chain", file);
+ if (TREE_CODE (node) == FUNCTION_DECL && decl_is_tm_clone (node))
+ fputs (" tm-clone", file);
if (code == FIELD_DECL && DECL_PACKED (node))
fputs (" packed", file);
if (code == VAR_DECL && DECL_IN_TEXT_SECTION (node))
fputs (" in-text-section", file);
+ if (code == VAR_DECL && DECL_IN_CONSTANT_POOL (node))
+ fputs (" in-constant-pool", file);
if (code == VAR_DECL && DECL_COMMON (node))
fputs (" common", file);
if (code == VAR_DECL && DECL_THREAD_LOCAL_P (node))
/* The transparent-union flag is used for different things in
different nodes. */
- if (code == UNION_TYPE && TYPE_TRANSPARENT_UNION (node))
- fputs (" transparent-union", file);
+ if ((code == UNION_TYPE || code == RECORD_TYPE)
+ && TYPE_TRANSPARENT_AGGR (node))
+ fputs (" transparent-aggr", file);
else if (code == ARRAY_TYPE
&& TYPE_NONALIASED_COMPONENT (node))
fputs (" nonaliased-component", file);
print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
}
}
- print_node (file, "chain", TREE_CHAIN (node), indent + 4);
+ if (CODE_CONTAINS_STRUCT (code, TS_COMMON))
+ print_node (file, "chain", TREE_CHAIN (node), indent + 4);
break;
case tcc_constant:
}
fputc ('\"', file);
}
- /* Print the chain at second level. */
- if (indent == 4)
- print_node (file, "chain", TREE_CHAIN (node), indent + 4);
- else
- print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
break;
case IDENTIFIER_NODE:
{
char temp[10];
sprintf (temp, "elt %d", i);
- indent_to (file, indent + 4);
- print_node_brief (file, temp, TREE_VEC_ELT (node, i), 0);
+ print_node (file, temp, TREE_VEC_ELT (node, i), indent + 4);
}
break;
print_node (file, "stmt", tsi_stmt (i), indent + 4);
}
}
- print_node (file, "chain", TREE_CHAIN (node), indent + 4);
break;
case BLOCK:
fprintf (file, ">");
}
+
+/* Print the tree vector VEC in full on file FILE, preceded by PREFIX,
+ starting in column INDENT. */
+
+void
+print_vec_tree (FILE *file, const char *prefix, VEC(tree,gc) *vec, int indent)
+{
+ tree elt;
+ unsigned ix;
+
+ /* Indent to the specified column, since this is the long form. */
+ indent_to (file, indent);
+
+ /* Print the slot this node is in, and its code, and address. */
+ fprintf (file, "%s <VEC", prefix);
+ dump_addr (file, " ", vec);
+
+ FOR_EACH_VEC_ELT (tree, vec, ix, elt)
+ {
+ char temp[10];
+ sprintf (temp, "elt %d", ix);
+ print_node (file, temp, elt, indent + 4);
+ }
+}