X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fprint-tree.c;h=ddc18695be4ed1bf40069bc629b92af2efd6473e;hb=90dc47e0c0d52ee7ed59d28d1c91283676cfc28d;hp=d7b9fddc3656021f41732ed4283a0cd11ef3a7d7;hpb=9656bfb287e709c2037e929c46d119128875f571;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/print-tree.c b/gcc/print-tree.c index d7b9fddc365..ddc18695be4 100644 --- a/gcc/print-tree.c +++ b/gcc/print-tree.c @@ -1,5 +1,6 @@ /* Prints out tree in human readable form - GNU C-compiler - Copyright (C) 1990, 91, 93, 94, 95, 1996 Free Software Foundation, Inc. + Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 + Free Software Foundation, Inc. This file is part of GNU CC. @@ -20,15 +21,9 @@ Boston, MA 02111-1307, USA. */ #include "config.h" +#include "system.h" #include "tree.h" -#include - -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. */ @@ -51,13 +46,10 @@ void debug_tree (node) tree node; { - char *object = (char *) oballoc (0); - - table = (struct bucket **) oballoc (HASH_SIZE * sizeof (struct bucket *)); + table = (struct bucket **) permalloc (HASH_SIZE * sizeof (struct bucket *)); bzero ((char *) table, HASH_SIZE * sizeof (struct bucket *)); print_node (stderr, "", node, 0); table = 0; - obfree (object); fprintf (stderr, "\n"); } @@ -66,7 +58,7 @@ debug_tree (node) void print_node_brief (file, prefix, node, indent) FILE *file; - char *prefix; + const char *prefix; tree node; int indent; { @@ -82,7 +74,7 @@ print_node_brief (file, prefix, node, 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') { @@ -117,7 +109,7 @@ print_node_brief (file, prefix, node, indent) { fprintf (file, "-"); fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, - -TREE_INT_CST_LOW (node)); + -TREE_INT_CST_LOW (node)); } else fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX, @@ -178,7 +170,7 @@ indent_to (file, column) void print_node (file, prefix, node, indent) FILE *file; - char *prefix; + const char *prefix; tree node; int indent; { @@ -218,7 +210,7 @@ print_node (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) @@ -229,7 +221,7 @@ print_node (file, prefix, node, indent) } /* Add this node to the table. */ - b = (struct bucket *) oballoc (sizeof (struct bucket)); + b = (struct bucket *) permalloc (sizeof (struct bucket)); b->node = node; b->next = table[hash]; table[hash] = b; @@ -239,7 +231,7 @@ print_node (file, prefix, node, indent) /* 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') @@ -272,19 +264,6 @@ print_node (file, prefix, node, indent) print_node (file, "type", TREE_TYPE (node), indent + 4); if (TREE_TYPE (node)) indent_to (file, indent + 3); - - 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 (TREE_PERMANENT (node)) - fputs (" !!permanent object in non-permanent obstack!!", file); - else - fputs (" !!non-permanent object in permanent obstack!!", file); - indent_to (file, indent + 3); } if (TREE_SIDE_EFFECTS (node)) @@ -303,12 +282,14 @@ print_node (file, prefix, node, indent) fputs (" asm_written", file); if (TREE_USED (node)) fputs (" used", file); - if (TREE_RAISES (node)) - fputs (" raises", file); - if (TREE_PERMANENT (node)) - fputs (" permanent", file); + if (TREE_NOTHROW (node)) + fputs (" nothrow", 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)) @@ -345,34 +326,37 @@ print_node (file, prefix, node, indent) fputs (" external", file); if (DECL_REGISTER (node)) fputs (" regdecl", file); - if (DECL_PACKED (node)) - fputs (" packed", file); if (DECL_NONLOCAL (node)) fputs (" nonlocal", file); - if (DECL_INLINE (node)) - fputs (" inline", file); if (TREE_CODE (node) == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node)) fputs (" suppress-debug", file); + if (TREE_CODE (node) == FUNCTION_DECL && DECL_INLINE (node)) + fputs (" inline", file); if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN (node)) fputs (" built-in", file); if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN_NONANSI (node)) fputs (" built-in-nonansi", file); + if (TREE_CODE (node) == FIELD_DECL && DECL_PACKED (node)) + fputs (" packed", file); if (TREE_CODE (node) == FIELD_DECL && DECL_BIT_FIELD (node)) fputs (" bit-field", file); + if (TREE_CODE (node) == LABEL_DECL && DECL_TOO_LATE (node)) fputs (" too-late", file); + if (TREE_CODE (node) == VAR_DECL && DECL_IN_TEXT_SECTION (node)) fputs (" in-text-section", file); + if (TREE_CODE (node) == PARM_DECL && DECL_TRANSPARENT_UNION (node)) + fputs (" transparent-union", file); + if (DECL_VIRTUAL_P (node)) fputs (" virtual", file); if (DECL_DEFER_OUTPUT (node)) fputs (" defer-output", file); - if (DECL_TRANSPARENT_UNION (node)) - fputs (" transparent-union", file); if (DECL_LANG_FLAG_0 (node)) fputs (" decl_0", file); @@ -391,29 +375,60 @@ print_node (file, prefix, node, indent) 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); + print_node (file, "unit size", DECL_SIZE_UNIT (node), indent + 4); + + if (TREE_CODE (node) != FUNCTION_DECL + || DECL_INLINE (node) || DECL_BUILT_IN (node)) + indent_to (file, indent + 3); + if (TREE_CODE (node) != FUNCTION_DECL) - fprintf (file, " align %d", DECL_ALIGN (node)); + { + fprintf (file, " align %d", DECL_ALIGN (node)); + if (TREE_CODE (node) == FIELD_DECL) + { + fprintf (file, " offset_align "); + fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, + DECL_OFFSET_ALIGN (node)); + } + } else if (DECL_INLINE (node)) - fprintf (file, " frame_size %d", DECL_FRAME_SIZE (node)); + { + fprintf (file, " frame_size "); + fprintf (file, HOST_WIDE_INT_PRINT_DEC, DECL_FRAME_SIZE (node)); + } else if (DECL_BUILT_IN (node)) - fprintf (file, " built-in code %d", DECL_FUNCTION_CODE (node)); + fprintf (file, " built-in %s:%s", + built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)], + built_in_names[(int) DECL_FUNCTION_CODE (node)]); + + if (DECL_POINTER_ALIAS_SET_KNOWN_P (node)) + { + fprintf (file, " alias set "); + fprintf (file, HOST_WIDE_INT_PRINT_DEC, + DECL_POINTER_ALIAS_SET (node)); + } + if (TREE_CODE (node) == FIELD_DECL) - print_node (file, "bitpos", DECL_FIELD_BITPOS (node), indent + 4); + { + print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4); + print_node (file, "bit offset", DECL_FIELD_BIT_OFFSET (node), + indent + 4); + } + 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, "machine_attributes", + DECL_MACHINE_ATTRIBUTES (node), indent + 4); print_node_brief (file, "abstract_origin", DECL_ABSTRACT_ORIGIN (node), indent + 4); print_node (file, "arguments", DECL_ARGUMENTS (node), indent + 4); - print_node (file, "result", DECL_RESULT (node), indent + 4); + print_node (file, "result", DECL_RESULT_FLD (node), indent + 4); print_node_brief (file, "initial", DECL_INITIAL (node), indent + 4); print_lang_decl (file, node, indent); @@ -424,20 +439,18 @@ print_node (file, prefix, node, indent) print_rtl (file, DECL_RTL (node)); } - if (DECL_SAVED_INSNS (node) != 0) + if (TREE_CODE (node) == PARM_DECL && DECL_INCOMING_RTL (node) != 0) { indent_to (file, indent + 4); - if (TREE_CODE (node) == PARM_DECL) - { - fprintf (file, "incoming-rtl "); - print_rtl (file, DECL_INCOMING_RTL (node)); - } - else if (TREE_CODE (node) == FUNCTION_DECL) - { - fprintf (file, "saved-insns "); - fprintf (file, HOST_PTR_PRINTF, - (HOST_WIDE_INT) DECL_SAVED_INSNS (node)); - } + fprintf (file, "incoming-rtl "); + print_rtl (file, DECL_INCOMING_RTL (node)); + } + else if (TREE_CODE (node) == FUNCTION_DECL + && DECL_SAVED_INSNS (node) != 0) + { + indent_to (file, indent + 4); + fprintf (file, "saved-insns "); + fprintf (file, HOST_PTR_PRINTF, (char *) DECL_SAVED_INSNS (node)); } /* Print the decl chain only if decl is at second level. */ @@ -448,14 +461,36 @@ print_node (file, prefix, node, indent) break; case 't': - if (TYPE_NO_FORCE_BLK (node)) + /* The no-force-blk flag is used for different things in + different types. */ + if ((TREE_CODE (node) == RECORD_TYPE + || TREE_CODE (node) == UNION_TYPE + || TREE_CODE (node) == QUAL_UNION_TYPE) + && TYPE_NO_FORCE_BLK (node)) fputs (" no-force-blk", file); + else if (TREE_CODE (node) == INTEGER_TYPE + && TYPE_IS_SIZETYPE (node)) + fputs (" sizetype", file); + else if (TREE_CODE (node) == FUNCTION_TYPE + && TYPE_RETURNS_STACK_DEPRESSED (node)) + fputs (" returns-stack-depressed", file); + if (TYPE_STRING_FLAG (node)) fputs (" string-flag", file); if (TYPE_NEEDS_CONSTRUCTING (node)) fputs (" needs-constructing", file); - if (TYPE_TRANSPARENT_UNION (node)) + + /* The transparent-union flag is used for different things in + different nodes. */ + if (TREE_CODE (node) == UNION_TYPE && TYPE_TRANSPARENT_UNION (node)) fputs (" transparent-union", file); + else if (TREE_CODE (node) == ARRAY_TYPE + && TYPE_NONALIASED_COMPONENT (node)) + fputs (" nonaliased-component", file); + else if (TREE_CODE (node) == FUNCTION_TYPE + && TYPE_AMBIENT_BOUNDEDNESS (node)) + fputs (" ambient-boundedness", file); + if (TYPE_PACKED (node)) fputs (" packed", file); @@ -475,13 +510,16 @@ print_node (file, prefix, node, indent) 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); + print_node (file, "unit size", TYPE_SIZE_UNIT (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 "); + fprintf (file, HOST_WIDE_INT_PRINT_DEC, TYPE_ALIAS_SET (node)); print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4); @@ -508,12 +546,17 @@ print_node (file, prefix, node, indent) || TREE_CODE (node) == UNION_TYPE || TREE_CODE (node) == QUAL_UNION_TYPE) print_node (file, "fields", TYPE_FIELDS (node), indent + 4); - else if (TREE_CODE (node) == FUNCTION_TYPE || TREE_CODE (node) == METHOD_TYPE) + else if (TREE_CODE (node) == FUNCTION_TYPE + || TREE_CODE (node) == METHOD_TYPE) { if (TYPE_METHOD_BASETYPE (node)) - print_node_brief (file, "method basetype", TYPE_METHOD_BASETYPE (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); @@ -528,13 +571,12 @@ print_node (file, prefix, node, indent) 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 '<': @@ -542,36 +584,20 @@ print_node (file, prefix, node, indent) 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 (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) @@ -592,6 +618,16 @@ print_node (file, prefix, node, indent) 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)); + } + print_node (file, "chain", BLOCK_CHAIN (node), indent + 4); break; case 'c': @@ -690,6 +726,12 @@ print_node (file, prefix, node, indent) 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;