X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fprint-tree.c;h=662521563d60622869930b2cb878bc31a06da396;hb=1515f92ff456e0479c0f4358519f0f1af5aae3d3;hp=74a6026c8d3905f39b1c54b64005f9cfcc7cae5c;hpb=0f0b4dbc9d8b1da94d3489cf3ff3840fe9375a7d;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/print-tree.c b/gcc/print-tree.c index 74a6026c8d3..662521563d6 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, 1991 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. @@ -15,19 +16,14 @@ GNU General Public License for more details. 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 - -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. */ @@ -50,12 +46,10 @@ void debug_tree (node) tree node; { - char *object = (char *) oballoc (0); - table = (struct bucket **) oballoc (HASH_SIZE * sizeof (struct bucket *)); - bzero (table, HASH_SIZE * sizeof (struct bucket *)); + table = (struct bucket **) permalloc (HASH_SIZE * sizeof (struct bucket *)); + memset ((char *) table, 0, HASH_SIZE * sizeof (struct bucket *)); print_node (stderr, "", node, 0); table = 0; - obfree (object); fprintf (stderr, "\n"); } @@ -64,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; { @@ -79,8 +73,8 @@ print_node_brief (file, prefix, node, indent) name if any. */ if (indent > 0) fprintf (file, " "); - fprintf (file, "%s <%s %x", prefix, - tree_code_name[(int) TREE_CODE (node)], (int) node); + fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]); + fprintf (file, HOST_PTR_PRINTF, (char *) node); if (class == 'd') { @@ -101,33 +95,57 @@ print_node_brief (file, prefix, node, indent) } if (TREE_CODE (node) == IDENTIFIER_NODE) fprintf (file, " %s", IDENTIFIER_POINTER (node)); - /* We might as well always print the value of an integer. */ + + /* We might as well always print the value of an integer or real. */ if (TREE_CODE (node) == INTEGER_CST) { + if (TREE_CONSTANT_OVERFLOW (node)) + fprintf (file, " overflow"); + + fprintf (file, " "); if (TREE_INT_CST_HIGH (node) == 0) - fprintf (file, " %1u", 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, " -%1u", -TREE_INT_CST_LOW (node)); + { + fprintf (file, "-"); + fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, + -TREE_INT_CST_LOW (node)); + } else - fprintf (file, " 0x%x%08x", - TREE_INT_CST_HIGH (node), - TREE_INT_CST_LOW (node)); + fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX, + TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node)); } if (TREE_CODE (node) == REAL_CST) { -#ifndef REAL_IS_NOT_DOUBLE - fprintf (file, " %e", TREE_REAL_CST (node)); + REAL_VALUE_TYPE d; + + if (TREE_OVERFLOW (node)) + fprintf (file, " overflow"); + +#if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC) + d = TREE_REAL_CST (node); + if (REAL_VALUE_ISINF (d)) + fprintf (file, " Inf"); + else if (REAL_VALUE_ISNAN (d)) + fprintf (file, " Nan"); + else + { + char string[100]; + + REAL_VALUE_TO_DECIMAL (d, "%e", string); + fprintf (file, " %s", string); + } #else { int i; - char *p = (char *) &TREE_REAL_CST (node); + unsigned char *p = (unsigned char *) &TREE_REAL_CST (node); fprintf (file, " 0x"); for (i = 0; i < sizeof TREE_REAL_CST (node); i++) fprintf (file, "%02x", *p++); fprintf (file, ""); } -#endif /* REAL_IS_NOT_DOUBLE */ +#endif } fprintf (file, ">"); @@ -153,7 +171,7 @@ indent_to (file, column) void print_node (file, prefix, node, indent) FILE *file; - char *prefix; + const char *prefix; tree node; int indent; { @@ -186,14 +204,14 @@ print_node (file, prefix, node, 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 = ((int) node & ~(1 << (HOST_BITS_PER_INT - 1))) % 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) @@ -204,7 +222,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; @@ -213,8 +231,8 @@ print_node (file, prefix, node, indent) indent_to (file, indent); /* Print the slot this node is in, and its code, and address. */ - fprintf (file, "%s <%s %x", prefix, - tree_code_name[(int) TREE_CODE (node)], (int) node); + fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]); + fprintf (file, HOST_PTR_PRINTF, (char *) node); /* Print the name, if any. */ if (class == 'd') @@ -249,16 +267,6 @@ print_node (file, prefix, node, indent) 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)) fputs (" side-effects", file); if (TREE_READONLY (node)) @@ -275,10 +283,14 @@ print_node (file, prefix, node, indent) fputs (" asm_written", file); if (TREE_USED (node)) fputs (" used", 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)) @@ -303,22 +315,50 @@ print_node (file, prefix, node, indent) case 'd': mode = DECL_MODE (node); - if (TREE_EXTERNAL (node)) + if (DECL_IGNORED_P (node)) + fputs (" ignored", file); + if (DECL_ABSTRACT (node)) + fputs (" abstract", file); + if (DECL_IN_SYSTEM_HEADER (node)) + fputs (" in_system_header", file); + if (DECL_COMMON (node)) + fputs (" common", file); + if (DECL_EXTERNAL (node)) fputs (" external", file); - if (TREE_NONLOCAL (node)) - fputs (" nonlocal", file); - if (TREE_REGDECL (node)) + if (DECL_REGISTER (node)) fputs (" regdecl", file); - if (TREE_INLINE (node)) + if (DECL_NONLOCAL (node)) + fputs (" nonlocal", 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 (DECL_BIT_FIELD (node)) + 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_FROM_INLINE (node)) - fputs (" from_inline", file); - if (DECL_IGNORED_P (node)) - fputs (" ignored", file); + if (DECL_DEFER_OUTPUT (node)) + fputs (" defer-output", file); + if (DECL_LANG_FLAG_0 (node)) fputs (" decl_0", file); if (DECL_LANG_FLAG_1 (node)) @@ -336,25 +376,67 @@ 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); - 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)); - else if (TREE_INLINE (node)) - fprintf (file, " frame_size %d", DECL_FRAME_SIZE (node)); + { + if (DECL_USER_ALIGN (node)) + fprintf (file, " user"); + + 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 "); + 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)); + { + if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD) + fprintf (file, " built-in BUILT_IN_MD %d", DECL_FUNCTION_CODE (node)); + else + 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, "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); @@ -365,16 +447,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 0x%x", 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. */ @@ -385,8 +469,39 @@ print_node (file, prefix, node, indent) break; case 't': - if (TYPE_NO_FORCE_BLK (node)) - fputs (" no_force_blk", file); + /* 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); + + /* 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); + if (TYPE_LANG_FLAG_0 (node)) fputs (" type_0", file); if (TYPE_LANG_FLAG_1 (node)) @@ -403,39 +518,49 @@ 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); + if (TYPE_USER_ALIGN (node)) + fprintf (file, " user"); + 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)); - if (TREE_CODE (node) == ARRAY_TYPE || TREE_CODE (node) == SET_TYPE) - print_node (file, "domain", TYPE_DOMAIN (node), indent + 4); - else if (TREE_CODE (node) == INTEGER_TYPE) - { - fprintf (file, " precision %d", TYPE_PRECISION (node)); - print_node (file, "min", TYPE_MIN_VALUE (node), indent + 4); - print_node (file, "max", TYPE_MAX_VALUE (node), indent + 4); - } - else if (TREE_CODE (node) == ENUMERAL_TYPE) + print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4); + + if (INTEGRAL_TYPE_P (node) || TREE_CODE (node) == REAL_TYPE) { fprintf (file, " precision %d", TYPE_PRECISION (node)); - print_node (file, "min", TYPE_MIN_VALUE (node), indent + 4); - print_node (file, "max", TYPE_MAX_VALUE (node), indent + 4); - print_node (file, "values", TYPE_VALUES (node), indent + 4); + print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4); + print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4); } - else if (TREE_CODE (node) == REAL_TYPE) - fprintf (file, " precision %d", TYPE_PRECISION (node)); - else if (TREE_CODE (node) == RECORD_TYPE || TREE_CODE (node) == UNION_TYPE) + + if (TREE_CODE (node) == ENUMERAL_TYPE) + print_node (file, "values", TYPE_VALUES (node), indent + 4); + else if (TREE_CODE (node) == ARRAY_TYPE || TREE_CODE (node) == SET_TYPE) + print_node (file, "domain", TYPE_DOMAIN (node), indent + 4); + else if (TREE_CODE (node) == RECORD_TYPE + || 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); @@ -443,55 +568,43 @@ print_node (file, prefix, node, indent) if (TYPE_POINTER_TO (node) || TREE_CHAIN (node)) indent_to (file, indent + 3); - print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node), indent + 4); - print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node), indent + 4); + + print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node), + indent + 4); + print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node), + indent + 4); print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4); break; + case 'b': + print_node (file, "vars", BLOCK_VARS (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); + break; + case 'e': case '<': case '1': case '2': case 'r': case 's': - switch (TREE_CODE (node)) + if (TREE_CODE (node) == BIND_EXPR) { - case BLOCK: - 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); - return; - - 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) @@ -499,7 +612,7 @@ print_node (file, prefix, node, indent) indent_to (file, indent + 4); fprintf (file, "rtl %d ", i); if (TREE_OPERAND (node, i)) - print_rtl (file, TREE_OPERAND (node, i)); + print_rtl (file, (struct rtx_def *) TREE_OPERAND (node, i)); else fprintf (file, "(nil)"); fprintf (file, "\n"); @@ -512,6 +625,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': @@ -519,29 +642,56 @@ print_node (file, prefix, node, indent) switch (TREE_CODE (node)) { case INTEGER_CST: + if (TREE_CONSTANT_OVERFLOW (node)) + fprintf (file, " overflow"); + + fprintf (file, " "); if (TREE_INT_CST_HIGH (node) == 0) - fprintf (file, " %1u", 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, " -%1u", -TREE_INT_CST_LOW (node)); + { + fprintf (file, "-"); + fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, + -TREE_INT_CST_LOW (node)); + } else - fprintf (file, " 0x%x%08x", - TREE_INT_CST_HIGH (node), - TREE_INT_CST_LOW (node)); + fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX, + TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node)); break; case REAL_CST: -#ifndef REAL_IS_NOT_DOUBLE - fprintf (file, " %e", TREE_REAL_CST (node)); -#else { - char *p = (char *) &TREE_REAL_CST (node); - fprintf (file, " 0x"); - for (i = 0; i < sizeof TREE_REAL_CST (node); i++) - fprintf (file, "%02x", *p++); - fprintf (file, ""); + REAL_VALUE_TYPE d; + + if (TREE_OVERFLOW (node)) + fprintf (file, " overflow"); + +#if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC) + d = TREE_REAL_CST (node); + if (REAL_VALUE_ISINF (d)) + fprintf (file, " Inf"); + else if (REAL_VALUE_ISNAN (d)) + fprintf (file, " Nan"); + else + { + char string[100]; + + REAL_VALUE_TO_DECIMAL (d, "%e", string); + fprintf (file, " %s", string); + } +#else + { + int i; + unsigned char *p = (unsigned char *) &TREE_REAL_CST (node); + fprintf (file, " 0x"); + for (i = 0; i < sizeof TREE_REAL_CST (node); i++) + fprintf (file, "%02x", *p++); + fprintf (file, ""); + } +#endif } -#endif /* REAL_IS_NOT_DOUBLE */ break; case COMPLEX_CST: @@ -551,6 +701,11 @@ print_node (file, prefix, node, indent) case STRING_CST: fprintf (file, " \"%s\"", TREE_STRING_POINTER (node)); + /* 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: @@ -566,19 +721,28 @@ print_node (file, prefix, node, indent) case TREE_VEC: len = TREE_VEC_LENGTH (node); for (i = 0; i < len; i++) - { - char temp[10]; - sprintf (temp, "elt %d", i); - indent_to (file, indent + 4); - print_node_brief (file, temp, TREE_VEC_ELT (node, i), 0); - } + if (TREE_VEC_ELT (node, i)) + { + char temp[10]; + sprintf (temp, "elt %d", i); + indent_to (file, indent + 4); + print_node_brief (file, temp, TREE_VEC_ELT (node, i), 0); + } 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; } + + fprintf (file, ">"); }