/* Prints out tree in human readable form - GNU C-compiler
- Copyright (C) 1990, 1991, 1993, 1994, 1995 Free Software Foundation, Inc.
+ Copyright (C) 1990, 91, 93-98, 1999 Free Software Foundation, Inc.
This file is part of GNU CC.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
#include "config.h"
+#include "system.h"
#include "tree.h"
-#include <stdio.h>
-
-extern char **tree_code_name;
-
-extern char *mode_name[];
-
-void print_node ();
-void indent_to ();
+#include "ggc.h"
/* Define the hash table of nodes already seen.
Such nodes are not repeated; brief cross-references are used. */
void
print_node_brief (file, prefix, node, indent)
FILE *file;
- char *prefix;
+ const char *prefix;
tree node;
int indent;
{
if (indent > 0)
fprintf (file, " ");
fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
- fprintf (file, HOST_PTR_PRINTF, (HOST_WIDE_INT) node);
+ fprintf (file, HOST_PTR_PRINTF, (char *) node);
if (class == 'd')
{
if (TREE_CONSTANT_OVERFLOW (node))
fprintf (file, " overflow");
+ fprintf (file, " ");
if (TREE_INT_CST_HIGH (node) == 0)
- fprintf (file,
-#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
- " %1u",
-#else
- " %1lu",
-#endif
- TREE_INT_CST_LOW (node));
+ fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, TREE_INT_CST_LOW (node));
else if (TREE_INT_CST_HIGH (node) == -1
&& TREE_INT_CST_LOW (node) != 0)
- fprintf (file,
-#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
- " -%1u",
-#else
- " -%1lu",
-#endif
+ {
+ fprintf (file, "-");
+ fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
-TREE_INT_CST_LOW (node));
+ }
else
- fprintf (file,
-#if HOST_BITS_PER_WIDE_INT == 64
-#if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
- " 0x%lx%016lx",
-#else
- " 0x%x%016x",
-#endif
-#else
-#if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
- " 0x%lx%08lx",
-#else
- " 0x%x%08x",
-#endif
-#endif
+ fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
}
if (TREE_CODE (node) == REAL_CST)
void
print_node (file, prefix, node, indent)
FILE *file;
- char *prefix;
+ const char *prefix;
tree node;
int indent;
{
return;
}
- /* It is unsafe to look at any other filds of an ERROR_MARK node. */
+ /* It is unsafe to look at any other filds of an ERROR_MARK node. */
if (TREE_CODE (node) == ERROR_MARK)
{
print_node_brief (file, prefix, node, indent);
return;
}
- hash = ((unsigned HOST_WIDE_INT) node) % HASH_SIZE;
+ hash = ((unsigned long) node) % HASH_SIZE;
/* If node is in the table, just mention its address. */
for (b = table[hash]; b; b = b->next)
/* Print the slot this node is in, and its code, and address. */
fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
- fprintf (file, HOST_PTR_PRINTF, (HOST_WIDE_INT) node);
+ fprintf (file, HOST_PTR_PRINTF, (char *) node);
/* Print the name, if any. */
if (class == 'd')
if (TREE_TYPE (node))
indent_to (file, indent + 3);
- print_obstack_name ((char *) node, file, "");
+ if (!ggc_p)
+ print_obstack_name ((char *) node, file, "");
indent_to (file, indent + 3);
}
/* If a permanent object is in the wrong obstack, or the reverse, warn. */
- if (object_permanent_p (node) != TREE_PERMANENT (node))
+ if (!ggc_p && object_permanent_p (node) != TREE_PERMANENT (node))
{
if (TREE_PERMANENT (node))
fputs (" !!permanent object in non-permanent obstack!!", file);
fputs (" permanent", file);
if (TREE_PUBLIC (node))
fputs (" public", file);
+ if (TREE_PRIVATE (node))
+ fputs (" private", file);
+ if (TREE_PROTECTED (node))
+ fputs (" protected", file);
if (TREE_STATIC (node))
fputs (" static", file);
if (TREE_LANG_FLAG_0 (node))
fputs (" inline", file);
if (TREE_CODE (node) == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node))
- fputs (" supress-debug", file);
+ fputs (" suppress-debug", file);
if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN (node))
fputs (" built-in", file);
if (DECL_LANG_FLAG_7 (node))
fputs (" decl_7", file);
- fprintf (file, " %s", mode_name[(int) mode]);
+ fprintf (file, " %s", GET_MODE_NAME(mode));
fprintf (file, " file %s line %d",
DECL_SOURCE_FILE (node), DECL_SOURCE_LINE (node));
print_node (file, "size", DECL_SIZE (node), indent + 4);
- print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4);
indent_to (file, indent + 3);
if (TREE_CODE (node) != FUNCTION_DECL)
fprintf (file, " align %d", DECL_ALIGN (node));
fprintf (file, " built-in code %d", DECL_FUNCTION_CODE (node));
if (TREE_CODE (node) == FIELD_DECL)
print_node (file, "bitpos", DECL_FIELD_BITPOS (node), indent + 4);
+ if (DECL_POINTER_ALIAS_SET_KNOWN_P (node))
+ fprintf (file, " alias set %d", DECL_POINTER_ALIAS_SET (node));
print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4);
print_node_brief (file, "machine_attributes", DECL_MACHINE_ATTRIBUTES (node), indent + 4);
print_node_brief (file, "abstract_origin",
{
fprintf (file, "saved-insns ");
fprintf (file, HOST_PTR_PRINTF,
- (HOST_WIDE_INT) DECL_SAVED_INSNS (node));
+ (char *) DECL_SAVED_INSNS (node));
}
}
fputs (" needs-constructing", file);
if (TYPE_TRANSPARENT_UNION (node))
fputs (" transparent-union", file);
+ if (TYPE_PACKED (node))
+ fputs (" packed", file);
if (TYPE_LANG_FLAG_0 (node))
fputs (" type_0", file);
fputs (" type_6", file);
mode = TYPE_MODE (node);
- fprintf (file, " %s", mode_name[(int) mode]);
+ fprintf (file, " %s", GET_MODE_NAME(mode));
print_node (file, "size", TYPE_SIZE (node), indent + 4);
indent_to (file, indent + 3);
fprintf (file, " align %d", TYPE_ALIGN (node));
fprintf (file, " symtab %d", TYPE_SYMTAB_ADDRESS (node));
+ fprintf (file, " alias set %d", TYPE_ALIAS_SET (node));
print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4);
print_node_brief (file, "method basetype", TYPE_METHOD_BASETYPE (node), indent + 4);
print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
}
+ else if (TREE_CODE (node) == OFFSET_TYPE)
+ print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node),
+ indent + 4);
if (TYPE_CONTEXT (node))
print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);
case 'b':
print_node (file, "vars", BLOCK_VARS (node), indent + 4);
- print_node (file, "tags", BLOCK_TYPE_TAGS (node), indent + 4);
print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node), indent + 4);
print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
print_node (file, "chain", BLOCK_CHAIN (node), indent + 4);
print_node (file, "abstract_origin",
BLOCK_ABSTRACT_ORIGIN (node), indent + 4);
- return;
+ break;
case 'e':
case '<':
case '2':
case 'r':
case 's':
- switch (TREE_CODE (node))
+ if (TREE_CODE (node) == BIND_EXPR)
{
- case BIND_EXPR:
print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
- return;
+ break;
}
- first_rtl = len = tree_code_length[(int) TREE_CODE (node)];
- /* These kinds of nodes contain rtx's, not trees,
+ len = tree_code_length[(int) TREE_CODE (node)];
+ /* Some nodes contain rtx's, not trees,
after a certain point. Print the rtx's as rtx's. */
- switch (TREE_CODE (node))
- {
- case SAVE_EXPR:
- first_rtl = 2;
- break;
- case CALL_EXPR:
- first_rtl = 2;
- break;
- case METHOD_CALL_EXPR:
- first_rtl = 3;
- break;
- case WITH_CLEANUP_EXPR:
- /* Should be defined to be 2. */
- first_rtl = 1;
- break;
- case RTL_EXPR:
- first_rtl = 0;
- }
+ first_rtl = first_rtl_op (TREE_CODE (node));
for (i = 0; i < len; i++)
{
if (i >= first_rtl)
print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
}
}
+
+ if (TREE_CODE (node) == EXPR_WITH_FILE_LOCATION)
+ {
+ indent_to (file, indent+4);
+ fprintf (file, "%s:%d:%d",
+ (EXPR_WFL_FILENAME_NODE (node ) ?
+ EXPR_WFL_FILENAME (node) : "(no file info)"),
+ EXPR_WFL_LINENO (node), EXPR_WFL_COLNO (node));
+ }
break;
case 'c':
if (TREE_CONSTANT_OVERFLOW (node))
fprintf (file, " overflow");
+ fprintf (file, " ");
if (TREE_INT_CST_HIGH (node) == 0)
- fprintf (file,
-#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
- " %1u",
-#else
- " %1lu",
-#endif
+ fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
TREE_INT_CST_LOW (node));
else if (TREE_INT_CST_HIGH (node) == -1
&& TREE_INT_CST_LOW (node) != 0)
- fprintf (file,
-#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
- " -%1u",
-#else
- " -%1lu",
-#endif
- -TREE_INT_CST_LOW (node));
+ {
+ fprintf (file, "-");
+ fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
+ -TREE_INT_CST_LOW (node));
+ }
else
- fprintf (file,
-#if HOST_BITS_PER_WIDE_INT == 64
-#if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
- " 0x%lx%016lx",
-#else
- " 0x%x%016x",
-#endif
-#else
-#if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
- " 0x%lx%08lx",
-#else
- " 0x%x%08x",
-#endif
-#endif
+ fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
break;
case OP_IDENTIFIER:
print_node (file, "op1", TREE_PURPOSE (node), indent + 4);
print_node (file, "op2", TREE_VALUE (node), indent + 4);
+ break;
+
+ default:
+ if (TREE_CODE_CLASS (TREE_CODE (node)) == 'x')
+ lang_print_xnode (file, node, indent);
+ break;
}
break;