print-tree.c revision 52521
118334Speter/* Prints out tree in human readable form - GNU C-compiler 252521Sobrien Copyright (C) 1990, 91, 93-97, 1998 Free Software Foundation, Inc. 318334Speter 418334SpeterThis file is part of GNU CC. 518334Speter 618334SpeterGNU CC is free software; you can redistribute it and/or modify 718334Speterit under the terms of the GNU General Public License as published by 818334Speterthe Free Software Foundation; either version 2, or (at your option) 918334Speterany later version. 1018334Speter 1118334SpeterGNU CC is distributed in the hope that it will be useful, 1218334Speterbut WITHOUT ANY WARRANTY; without even the implied warranty of 1318334SpeterMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1418334SpeterGNU General Public License for more details. 1518334Speter 1618334SpeterYou should have received a copy of the GNU General Public License 1718334Speteralong with GNU CC; see the file COPYING. If not, write to 1818334Speterthe Free Software Foundation, 59 Temple Place - Suite 330, 1918334SpeterBoston, MA 02111-1307, USA. */ 2018334Speter 2152521Sobrien/* $FreeBSD: head/contrib/gcc/print-tree.c 52521 1999-10-26 09:17:58Z obrien $ */ 2218334Speter 2352521Sobrien 2418334Speter#include "config.h" 2550617Sobrien#include "system.h" 2618334Speter#include "tree.h" 2718334Speter 2818334Speterextern char *mode_name[]; 2918334Speter 3018334Spetervoid print_node (); 3118334Spetervoid indent_to (); 3218334Speter 3318334Speter/* Define the hash table of nodes already seen. 3418334Speter Such nodes are not repeated; brief cross-references are used. */ 3518334Speter 3618334Speter#define HASH_SIZE 37 3718334Speter 3818334Speterstruct bucket 3918334Speter{ 4018334Speter tree node; 4118334Speter struct bucket *next; 4218334Speter}; 4318334Speter 4418334Speterstatic struct bucket **table; 4518334Speter 4618334Speter/* Print the node NODE on standard error, for debugging. 4718334Speter Most nodes referred to by this one are printed recursively 4818334Speter down to a depth of six. */ 4918334Speter 5018334Spetervoid 5118334Speterdebug_tree (node) 5218334Speter tree node; 5318334Speter{ 5418334Speter char *object = (char *) oballoc (0); 5518334Speter 5618334Speter table = (struct bucket **) oballoc (HASH_SIZE * sizeof (struct bucket *)); 5718334Speter bzero ((char *) table, HASH_SIZE * sizeof (struct bucket *)); 5818334Speter print_node (stderr, "", node, 0); 5918334Speter table = 0; 6018334Speter obfree (object); 6118334Speter fprintf (stderr, "\n"); 6218334Speter} 6318334Speter 6418334Speter/* Print a node in brief fashion, with just the code, address and name. */ 6518334Speter 6618334Spetervoid 6718334Speterprint_node_brief (file, prefix, node, indent) 6818334Speter FILE *file; 6952521Sobrien const char *prefix; 7018334Speter tree node; 7118334Speter int indent; 7218334Speter{ 7318334Speter char class; 7418334Speter 7518334Speter if (node == 0) 7618334Speter return; 7718334Speter 7818334Speter class = TREE_CODE_CLASS (TREE_CODE (node)); 7918334Speter 8018334Speter /* Always print the slot this node is in, and its code, address and 8118334Speter name if any. */ 8218334Speter if (indent > 0) 8318334Speter fprintf (file, " "); 8418334Speter fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]); 8550617Sobrien fprintf (file, HOST_PTR_PRINTF, (char *) node); 8618334Speter 8718334Speter if (class == 'd') 8818334Speter { 8918334Speter if (DECL_NAME (node)) 9018334Speter fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node))); 9118334Speter } 9218334Speter else if (class == 't') 9318334Speter { 9418334Speter if (TYPE_NAME (node)) 9518334Speter { 9618334Speter if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE) 9718334Speter fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node))); 9818334Speter else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL 9918334Speter && DECL_NAME (TYPE_NAME (node))) 10018334Speter fprintf (file, " %s", 10118334Speter IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node)))); 10218334Speter } 10318334Speter } 10418334Speter if (TREE_CODE (node) == IDENTIFIER_NODE) 10518334Speter fprintf (file, " %s", IDENTIFIER_POINTER (node)); 10618334Speter /* We might as well always print the value of an integer. */ 10718334Speter if (TREE_CODE (node) == INTEGER_CST) 10818334Speter { 10918334Speter if (TREE_CONSTANT_OVERFLOW (node)) 11018334Speter fprintf (file, " overflow"); 11118334Speter 11250617Sobrien fprintf (file, " "); 11318334Speter if (TREE_INT_CST_HIGH (node) == 0) 11450617Sobrien fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, TREE_INT_CST_LOW (node)); 11518334Speter else if (TREE_INT_CST_HIGH (node) == -1 11618334Speter && TREE_INT_CST_LOW (node) != 0) 11750617Sobrien { 11850617Sobrien fprintf (file, "-"); 11950617Sobrien fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, 12018334Speter -TREE_INT_CST_LOW (node)); 12150617Sobrien } 12218334Speter else 12350617Sobrien fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX, 12418334Speter TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node)); 12518334Speter } 12618334Speter if (TREE_CODE (node) == REAL_CST) 12718334Speter { 12818334Speter REAL_VALUE_TYPE d; 12918334Speter 13018334Speter if (TREE_OVERFLOW (node)) 13118334Speter fprintf (file, " overflow"); 13218334Speter 13318334Speter#if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC) 13418334Speter d = TREE_REAL_CST (node); 13518334Speter if (REAL_VALUE_ISINF (d)) 13618334Speter fprintf (file, " Inf"); 13718334Speter else if (REAL_VALUE_ISNAN (d)) 13818334Speter fprintf (file, " Nan"); 13918334Speter else 14018334Speter { 14118334Speter char string[100]; 14218334Speter 14318334Speter REAL_VALUE_TO_DECIMAL (d, "%e", string); 14418334Speter fprintf (file, " %s", string); 14518334Speter } 14618334Speter#else 14718334Speter { 14818334Speter int i; 14918334Speter unsigned char *p = (unsigned char *) &TREE_REAL_CST (node); 15018334Speter fprintf (file, " 0x"); 15118334Speter for (i = 0; i < sizeof TREE_REAL_CST (node); i++) 15218334Speter fprintf (file, "%02x", *p++); 15318334Speter fprintf (file, ""); 15418334Speter } 15518334Speter#endif 15618334Speter } 15718334Speter 15818334Speter fprintf (file, ">"); 15918334Speter} 16018334Speter 16118334Spetervoid 16218334Speterindent_to (file, column) 16318334Speter FILE *file; 16418334Speter int column; 16518334Speter{ 16618334Speter int i; 16718334Speter 16818334Speter /* Since this is the long way, indent to desired column. */ 16918334Speter if (column > 0) 17018334Speter fprintf (file, "\n"); 17118334Speter for (i = 0; i < column; i++) 17218334Speter fprintf (file, " "); 17318334Speter} 17418334Speter 17518334Speter/* Print the node NODE in full on file FILE, preceded by PREFIX, 17618334Speter starting in column INDENT. */ 17718334Speter 17818334Spetervoid 17918334Speterprint_node (file, prefix, node, indent) 18018334Speter FILE *file; 18152521Sobrien const char *prefix; 18218334Speter tree node; 18318334Speter int indent; 18418334Speter{ 18518334Speter int hash; 18618334Speter struct bucket *b; 18718334Speter enum machine_mode mode; 18818334Speter char class; 18918334Speter int len; 19018334Speter int first_rtl; 19118334Speter int i; 19218334Speter 19318334Speter if (node == 0) 19418334Speter return; 19518334Speter 19618334Speter class = TREE_CODE_CLASS (TREE_CODE (node)); 19718334Speter 19818334Speter /* Don't get too deep in nesting. If the user wants to see deeper, 19918334Speter it is easy to use the address of a lowest-level node 20018334Speter as an argument in another call to debug_tree. */ 20118334Speter 20218334Speter if (indent > 24) 20318334Speter { 20418334Speter print_node_brief (file, prefix, node, indent); 20518334Speter return; 20618334Speter } 20718334Speter 20818334Speter if (indent > 8 && (class == 't' || class == 'd')) 20918334Speter { 21018334Speter print_node_brief (file, prefix, node, indent); 21118334Speter return; 21218334Speter } 21318334Speter 21450617Sobrien /* It is unsafe to look at any other filds of an ERROR_MARK node. */ 21518334Speter if (TREE_CODE (node) == ERROR_MARK) 21618334Speter { 21718334Speter print_node_brief (file, prefix, node, indent); 21818334Speter return; 21918334Speter } 22018334Speter 22150617Sobrien hash = ((unsigned long) node) % HASH_SIZE; 22218334Speter 22318334Speter /* If node is in the table, just mention its address. */ 22418334Speter for (b = table[hash]; b; b = b->next) 22518334Speter if (b->node == node) 22618334Speter { 22718334Speter print_node_brief (file, prefix, node, indent); 22818334Speter return; 22918334Speter } 23018334Speter 23118334Speter /* Add this node to the table. */ 23218334Speter b = (struct bucket *) oballoc (sizeof (struct bucket)); 23318334Speter b->node = node; 23418334Speter b->next = table[hash]; 23518334Speter table[hash] = b; 23618334Speter 23718334Speter /* Indent to the specified column, since this is the long form. */ 23818334Speter indent_to (file, indent); 23918334Speter 24018334Speter /* Print the slot this node is in, and its code, and address. */ 24118334Speter fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]); 24250617Sobrien fprintf (file, HOST_PTR_PRINTF, (char *) node); 24318334Speter 24418334Speter /* Print the name, if any. */ 24518334Speter if (class == 'd') 24618334Speter { 24718334Speter if (DECL_NAME (node)) 24818334Speter fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node))); 24918334Speter } 25018334Speter else if (class == 't') 25118334Speter { 25218334Speter if (TYPE_NAME (node)) 25318334Speter { 25418334Speter if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE) 25518334Speter fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node))); 25618334Speter else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL 25718334Speter && DECL_NAME (TYPE_NAME (node))) 25818334Speter fprintf (file, " %s", 25918334Speter IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node)))); 26018334Speter } 26118334Speter } 26218334Speter if (TREE_CODE (node) == IDENTIFIER_NODE) 26318334Speter fprintf (file, " %s", IDENTIFIER_POINTER (node)); 26418334Speter 26518334Speter if (TREE_CODE (node) == INTEGER_CST) 26618334Speter { 26718334Speter if (indent <= 4) 26818334Speter print_node_brief (file, "type", TREE_TYPE (node), indent + 4); 26918334Speter } 27018334Speter else 27118334Speter { 27218334Speter print_node (file, "type", TREE_TYPE (node), indent + 4); 27318334Speter if (TREE_TYPE (node)) 27418334Speter indent_to (file, indent + 3); 27518334Speter 27618334Speter print_obstack_name ((char *) node, file, ""); 27718334Speter indent_to (file, indent + 3); 27818334Speter } 27918334Speter 28018334Speter /* If a permanent object is in the wrong obstack, or the reverse, warn. */ 28118334Speter if (object_permanent_p (node) != TREE_PERMANENT (node)) 28218334Speter { 28318334Speter if (TREE_PERMANENT (node)) 28418334Speter fputs (" !!permanent object in non-permanent obstack!!", file); 28518334Speter else 28618334Speter fputs (" !!non-permanent object in permanent obstack!!", file); 28718334Speter indent_to (file, indent + 3); 28818334Speter } 28918334Speter 29018334Speter if (TREE_SIDE_EFFECTS (node)) 29118334Speter fputs (" side-effects", file); 29218334Speter if (TREE_READONLY (node)) 29318334Speter fputs (" readonly", file); 29418334Speter if (TREE_CONSTANT (node)) 29518334Speter fputs (" constant", file); 29618334Speter if (TREE_ADDRESSABLE (node)) 29718334Speter fputs (" addressable", file); 29818334Speter if (TREE_THIS_VOLATILE (node)) 29918334Speter fputs (" volatile", file); 30018334Speter if (TREE_UNSIGNED (node)) 30118334Speter fputs (" unsigned", file); 30218334Speter if (TREE_ASM_WRITTEN (node)) 30318334Speter fputs (" asm_written", file); 30418334Speter if (TREE_USED (node)) 30518334Speter fputs (" used", file); 30618334Speter if (TREE_RAISES (node)) 30718334Speter fputs (" raises", file); 30818334Speter if (TREE_PERMANENT (node)) 30918334Speter fputs (" permanent", file); 31018334Speter if (TREE_PUBLIC (node)) 31118334Speter fputs (" public", file); 31218334Speter if (TREE_STATIC (node)) 31318334Speter fputs (" static", file); 31418334Speter if (TREE_LANG_FLAG_0 (node)) 31518334Speter fputs (" tree_0", file); 31618334Speter if (TREE_LANG_FLAG_1 (node)) 31718334Speter fputs (" tree_1", file); 31818334Speter if (TREE_LANG_FLAG_2 (node)) 31918334Speter fputs (" tree_2", file); 32018334Speter if (TREE_LANG_FLAG_3 (node)) 32118334Speter fputs (" tree_3", file); 32218334Speter if (TREE_LANG_FLAG_4 (node)) 32318334Speter fputs (" tree_4", file); 32418334Speter if (TREE_LANG_FLAG_5 (node)) 32518334Speter fputs (" tree_5", file); 32618334Speter if (TREE_LANG_FLAG_6 (node)) 32718334Speter fputs (" tree_6", file); 32818334Speter 32918334Speter /* DECL_ nodes have additional attributes. */ 33018334Speter 33118334Speter switch (TREE_CODE_CLASS (TREE_CODE (node))) 33218334Speter { 33318334Speter case 'd': 33418334Speter mode = DECL_MODE (node); 33518334Speter 33618334Speter if (DECL_IGNORED_P (node)) 33718334Speter fputs (" ignored", file); 33818334Speter if (DECL_ABSTRACT (node)) 33918334Speter fputs (" abstract", file); 34018334Speter if (DECL_IN_SYSTEM_HEADER (node)) 34118334Speter fputs (" in_system_header", file); 34218334Speter if (DECL_COMMON (node)) 34318334Speter fputs (" common", file); 34418334Speter if (DECL_EXTERNAL (node)) 34518334Speter fputs (" external", file); 34618334Speter if (DECL_REGISTER (node)) 34718334Speter fputs (" regdecl", file); 34818334Speter if (DECL_PACKED (node)) 34918334Speter fputs (" packed", file); 35018334Speter if (DECL_NONLOCAL (node)) 35118334Speter fputs (" nonlocal", file); 35218334Speter if (DECL_INLINE (node)) 35318334Speter fputs (" inline", file); 35418334Speter 35518334Speter if (TREE_CODE (node) == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node)) 35618334Speter fputs (" suppress-debug", file); 35718334Speter 35818334Speter if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN (node)) 35918334Speter fputs (" built-in", file); 36018334Speter if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN_NONANSI (node)) 36118334Speter fputs (" built-in-nonansi", file); 36218334Speter 36318334Speter if (TREE_CODE (node) == FIELD_DECL && DECL_BIT_FIELD (node)) 36418334Speter fputs (" bit-field", file); 36518334Speter if (TREE_CODE (node) == LABEL_DECL && DECL_TOO_LATE (node)) 36618334Speter fputs (" too-late", file); 36718334Speter if (TREE_CODE (node) == VAR_DECL && DECL_IN_TEXT_SECTION (node)) 36818334Speter fputs (" in-text-section", file); 36918334Speter 37018334Speter if (DECL_VIRTUAL_P (node)) 37118334Speter fputs (" virtual", file); 37218334Speter if (DECL_DEFER_OUTPUT (node)) 37318334Speter fputs (" defer-output", file); 37418334Speter if (DECL_TRANSPARENT_UNION (node)) 37518334Speter fputs (" transparent-union", file); 37618334Speter 37718334Speter if (DECL_LANG_FLAG_0 (node)) 37818334Speter fputs (" decl_0", file); 37918334Speter if (DECL_LANG_FLAG_1 (node)) 38018334Speter fputs (" decl_1", file); 38118334Speter if (DECL_LANG_FLAG_2 (node)) 38218334Speter fputs (" decl_2", file); 38318334Speter if (DECL_LANG_FLAG_3 (node)) 38418334Speter fputs (" decl_3", file); 38518334Speter if (DECL_LANG_FLAG_4 (node)) 38618334Speter fputs (" decl_4", file); 38718334Speter if (DECL_LANG_FLAG_5 (node)) 38818334Speter fputs (" decl_5", file); 38918334Speter if (DECL_LANG_FLAG_6 (node)) 39018334Speter fputs (" decl_6", file); 39118334Speter if (DECL_LANG_FLAG_7 (node)) 39218334Speter fputs (" decl_7", file); 39318334Speter 39418334Speter fprintf (file, " %s", mode_name[(int) mode]); 39518334Speter 39618334Speter fprintf (file, " file %s line %d", 39718334Speter DECL_SOURCE_FILE (node), DECL_SOURCE_LINE (node)); 39818334Speter 39918334Speter print_node (file, "size", DECL_SIZE (node), indent + 4); 40018334Speter indent_to (file, indent + 3); 40118334Speter if (TREE_CODE (node) != FUNCTION_DECL) 40218334Speter fprintf (file, " align %d", DECL_ALIGN (node)); 40318334Speter else if (DECL_INLINE (node)) 40418334Speter fprintf (file, " frame_size %d", DECL_FRAME_SIZE (node)); 40518334Speter else if (DECL_BUILT_IN (node)) 40618334Speter fprintf (file, " built-in code %d", DECL_FUNCTION_CODE (node)); 40718334Speter if (TREE_CODE (node) == FIELD_DECL) 40818334Speter print_node (file, "bitpos", DECL_FIELD_BITPOS (node), indent + 4); 40952521Sobrien if (DECL_POINTER_ALIAS_SET_KNOWN_P (node)) 41052521Sobrien fprintf (file, " alias set %d", DECL_POINTER_ALIAS_SET (node)); 41118334Speter print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4); 41218334Speter print_node_brief (file, "machine_attributes", DECL_MACHINE_ATTRIBUTES (node), indent + 4); 41318334Speter print_node_brief (file, "abstract_origin", 41418334Speter DECL_ABSTRACT_ORIGIN (node), indent + 4); 41518334Speter 41618334Speter print_node (file, "arguments", DECL_ARGUMENTS (node), indent + 4); 41718334Speter print_node (file, "result", DECL_RESULT (node), indent + 4); 41818334Speter print_node_brief (file, "initial", DECL_INITIAL (node), indent + 4); 41918334Speter 42018334Speter print_lang_decl (file, node, indent); 42118334Speter 42218334Speter if (DECL_RTL (node) != 0) 42318334Speter { 42418334Speter indent_to (file, indent + 4); 42518334Speter print_rtl (file, DECL_RTL (node)); 42618334Speter } 42718334Speter 42818334Speter if (DECL_SAVED_INSNS (node) != 0) 42918334Speter { 43018334Speter indent_to (file, indent + 4); 43118334Speter if (TREE_CODE (node) == PARM_DECL) 43218334Speter { 43318334Speter fprintf (file, "incoming-rtl "); 43418334Speter print_rtl (file, DECL_INCOMING_RTL (node)); 43518334Speter } 43618334Speter else if (TREE_CODE (node) == FUNCTION_DECL) 43718334Speter { 43818334Speter fprintf (file, "saved-insns "); 43918334Speter fprintf (file, HOST_PTR_PRINTF, 44050617Sobrien (char *) DECL_SAVED_INSNS (node)); 44118334Speter } 44218334Speter } 44318334Speter 44418334Speter /* Print the decl chain only if decl is at second level. */ 44518334Speter if (indent == 4) 44618334Speter print_node (file, "chain", TREE_CHAIN (node), indent + 4); 44718334Speter else 44818334Speter print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4); 44918334Speter break; 45018334Speter 45118334Speter case 't': 45218334Speter if (TYPE_NO_FORCE_BLK (node)) 45318334Speter fputs (" no-force-blk", file); 45418334Speter if (TYPE_STRING_FLAG (node)) 45518334Speter fputs (" string-flag", file); 45618334Speter if (TYPE_NEEDS_CONSTRUCTING (node)) 45718334Speter fputs (" needs-constructing", file); 45818334Speter if (TYPE_TRANSPARENT_UNION (node)) 45918334Speter fputs (" transparent-union", file); 46018334Speter if (TYPE_PACKED (node)) 46118334Speter fputs (" packed", file); 46218334Speter 46318334Speter if (TYPE_LANG_FLAG_0 (node)) 46418334Speter fputs (" type_0", file); 46518334Speter if (TYPE_LANG_FLAG_1 (node)) 46618334Speter fputs (" type_1", file); 46718334Speter if (TYPE_LANG_FLAG_2 (node)) 46818334Speter fputs (" type_2", file); 46918334Speter if (TYPE_LANG_FLAG_3 (node)) 47018334Speter fputs (" type_3", file); 47118334Speter if (TYPE_LANG_FLAG_4 (node)) 47218334Speter fputs (" type_4", file); 47318334Speter if (TYPE_LANG_FLAG_5 (node)) 47418334Speter fputs (" type_5", file); 47518334Speter if (TYPE_LANG_FLAG_6 (node)) 47618334Speter fputs (" type_6", file); 47718334Speter 47818334Speter mode = TYPE_MODE (node); 47918334Speter fprintf (file, " %s", mode_name[(int) mode]); 48018334Speter 48118334Speter print_node (file, "size", TYPE_SIZE (node), indent + 4); 48218334Speter indent_to (file, indent + 3); 48318334Speter 48418334Speter fprintf (file, " align %d", TYPE_ALIGN (node)); 48518334Speter fprintf (file, " symtab %d", TYPE_SYMTAB_ADDRESS (node)); 48650617Sobrien fprintf (file, " alias set %d", TYPE_ALIAS_SET (node)); 48718334Speter 48818334Speter print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4); 48918334Speter 49018334Speter if (TREE_CODE (node) == ARRAY_TYPE || TREE_CODE (node) == SET_TYPE) 49118334Speter print_node (file, "domain", TYPE_DOMAIN (node), indent + 4); 49218334Speter else if (TREE_CODE (node) == INTEGER_TYPE 49318334Speter || TREE_CODE (node) == BOOLEAN_TYPE 49418334Speter || TREE_CODE (node) == CHAR_TYPE) 49518334Speter { 49618334Speter fprintf (file, " precision %d", TYPE_PRECISION (node)); 49718334Speter print_node (file, "min", TYPE_MIN_VALUE (node), indent + 4); 49818334Speter print_node (file, "max", TYPE_MAX_VALUE (node), indent + 4); 49918334Speter } 50018334Speter else if (TREE_CODE (node) == ENUMERAL_TYPE) 50118334Speter { 50218334Speter fprintf (file, " precision %d", TYPE_PRECISION (node)); 50318334Speter print_node (file, "min", TYPE_MIN_VALUE (node), indent + 4); 50418334Speter print_node (file, "max", TYPE_MAX_VALUE (node), indent + 4); 50518334Speter print_node (file, "values", TYPE_VALUES (node), indent + 4); 50618334Speter } 50718334Speter else if (TREE_CODE (node) == REAL_TYPE) 50818334Speter fprintf (file, " precision %d", TYPE_PRECISION (node)); 50918334Speter else if (TREE_CODE (node) == RECORD_TYPE 51018334Speter || TREE_CODE (node) == UNION_TYPE 51118334Speter || TREE_CODE (node) == QUAL_UNION_TYPE) 51218334Speter print_node (file, "fields", TYPE_FIELDS (node), indent + 4); 51318334Speter else if (TREE_CODE (node) == FUNCTION_TYPE || TREE_CODE (node) == METHOD_TYPE) 51418334Speter { 51518334Speter if (TYPE_METHOD_BASETYPE (node)) 51618334Speter print_node_brief (file, "method basetype", TYPE_METHOD_BASETYPE (node), indent + 4); 51718334Speter print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4); 51818334Speter } 51918334Speter if (TYPE_CONTEXT (node)) 52018334Speter print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4); 52118334Speter 52218334Speter print_lang_type (file, node, indent); 52318334Speter 52418334Speter if (TYPE_POINTER_TO (node) || TREE_CHAIN (node)) 52518334Speter indent_to (file, indent + 3); 52618334Speter print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node), indent + 4); 52718334Speter print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node), indent + 4); 52818334Speter print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4); 52918334Speter break; 53018334Speter 53118334Speter case 'b': 53218334Speter print_node (file, "vars", BLOCK_VARS (node), indent + 4); 53318334Speter print_node (file, "tags", BLOCK_TYPE_TAGS (node), indent + 4); 53418334Speter print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node), indent + 4); 53518334Speter print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4); 53618334Speter print_node (file, "chain", BLOCK_CHAIN (node), indent + 4); 53718334Speter print_node (file, "abstract_origin", 53818334Speter BLOCK_ABSTRACT_ORIGIN (node), indent + 4); 53952521Sobrien break; 54018334Speter 54118334Speter case 'e': 54218334Speter case '<': 54318334Speter case '1': 54418334Speter case '2': 54518334Speter case 'r': 54618334Speter case 's': 54750617Sobrien if (TREE_CODE (node) == BIND_EXPR) 54818334Speter { 54918334Speter print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4); 55018334Speter print_node (file, "body", TREE_OPERAND (node, 1), indent + 4); 55118334Speter print_node (file, "block", TREE_OPERAND (node, 2), indent + 4); 55252521Sobrien break; 55318334Speter } 55418334Speter 55550617Sobrien len = tree_code_length[(int) TREE_CODE (node)]; 55650617Sobrien /* Some nodes contain rtx's, not trees, 55718334Speter after a certain point. Print the rtx's as rtx's. */ 55850617Sobrien first_rtl = first_rtl_op (TREE_CODE (node)); 55918334Speter for (i = 0; i < len; i++) 56018334Speter { 56118334Speter if (i >= first_rtl) 56218334Speter { 56318334Speter indent_to (file, indent + 4); 56418334Speter fprintf (file, "rtl %d ", i); 56518334Speter if (TREE_OPERAND (node, i)) 56618334Speter print_rtl (file, (struct rtx_def *) TREE_OPERAND (node, i)); 56718334Speter else 56818334Speter fprintf (file, "(nil)"); 56918334Speter fprintf (file, "\n"); 57018334Speter } 57118334Speter else 57218334Speter { 57318334Speter char temp[10]; 57418334Speter 57518334Speter sprintf (temp, "arg %d", i); 57618334Speter print_node (file, temp, TREE_OPERAND (node, i), indent + 4); 57718334Speter } 57818334Speter } 57950617Sobrien 58050617Sobrien if (TREE_CODE (node) == EXPR_WITH_FILE_LOCATION) 58150617Sobrien { 58250617Sobrien indent_to (file, indent+4); 58350617Sobrien fprintf (file, "%s:%d:%d", 58450617Sobrien (EXPR_WFL_FILENAME_NODE (node ) ? 58550617Sobrien EXPR_WFL_FILENAME (node) : "(no file info)"), 58650617Sobrien EXPR_WFL_LINENO (node), EXPR_WFL_COLNO (node)); 58750617Sobrien } 58818334Speter break; 58918334Speter 59018334Speter case 'c': 59118334Speter case 'x': 59218334Speter switch (TREE_CODE (node)) 59318334Speter { 59418334Speter case INTEGER_CST: 59518334Speter if (TREE_CONSTANT_OVERFLOW (node)) 59618334Speter fprintf (file, " overflow"); 59718334Speter 59850617Sobrien fprintf (file, " "); 59918334Speter if (TREE_INT_CST_HIGH (node) == 0) 60050617Sobrien fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, 60118334Speter TREE_INT_CST_LOW (node)); 60218334Speter else if (TREE_INT_CST_HIGH (node) == -1 60318334Speter && TREE_INT_CST_LOW (node) != 0) 60450617Sobrien { 60550617Sobrien fprintf (file, "-"); 60650617Sobrien fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, 60750617Sobrien -TREE_INT_CST_LOW (node)); 60850617Sobrien } 60918334Speter else 61050617Sobrien fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX, 61118334Speter TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node)); 61218334Speter break; 61318334Speter 61418334Speter case REAL_CST: 61518334Speter { 61618334Speter REAL_VALUE_TYPE d; 61718334Speter 61818334Speter if (TREE_OVERFLOW (node)) 61918334Speter fprintf (file, " overflow"); 62018334Speter 62118334Speter#if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC) 62218334Speter d = TREE_REAL_CST (node); 62318334Speter if (REAL_VALUE_ISINF (d)) 62418334Speter fprintf (file, " Inf"); 62518334Speter else if (REAL_VALUE_ISNAN (d)) 62618334Speter fprintf (file, " Nan"); 62718334Speter else 62818334Speter { 62918334Speter char string[100]; 63018334Speter 63118334Speter REAL_VALUE_TO_DECIMAL (d, "%e", string); 63218334Speter fprintf (file, " %s", string); 63318334Speter } 63418334Speter#else 63518334Speter { 63618334Speter int i; 63718334Speter unsigned char *p = (unsigned char *) &TREE_REAL_CST (node); 63818334Speter fprintf (file, " 0x"); 63918334Speter for (i = 0; i < sizeof TREE_REAL_CST (node); i++) 64018334Speter fprintf (file, "%02x", *p++); 64118334Speter fprintf (file, ""); 64218334Speter } 64318334Speter#endif 64418334Speter } 64518334Speter break; 64618334Speter 64718334Speter case COMPLEX_CST: 64818334Speter print_node (file, "real", TREE_REALPART (node), indent + 4); 64918334Speter print_node (file, "imag", TREE_IMAGPART (node), indent + 4); 65018334Speter break; 65118334Speter 65218334Speter case STRING_CST: 65318334Speter fprintf (file, " \"%s\"", TREE_STRING_POINTER (node)); 65418334Speter /* Print the chain at second level. */ 65518334Speter if (indent == 4) 65618334Speter print_node (file, "chain", TREE_CHAIN (node), indent + 4); 65718334Speter else 65818334Speter print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4); 65918334Speter break; 66018334Speter 66118334Speter case IDENTIFIER_NODE: 66218334Speter print_lang_identifier (file, node, indent); 66318334Speter break; 66418334Speter 66518334Speter case TREE_LIST: 66618334Speter print_node (file, "purpose", TREE_PURPOSE (node), indent + 4); 66718334Speter print_node (file, "value", TREE_VALUE (node), indent + 4); 66818334Speter print_node (file, "chain", TREE_CHAIN (node), indent + 4); 66918334Speter break; 67018334Speter 67118334Speter case TREE_VEC: 67218334Speter len = TREE_VEC_LENGTH (node); 67318334Speter for (i = 0; i < len; i++) 67418334Speter if (TREE_VEC_ELT (node, i)) 67518334Speter { 67618334Speter char temp[10]; 67718334Speter sprintf (temp, "elt %d", i); 67818334Speter indent_to (file, indent + 4); 67918334Speter print_node_brief (file, temp, TREE_VEC_ELT (node, i), 0); 68018334Speter } 68118334Speter break; 68218334Speter 68318334Speter case OP_IDENTIFIER: 68418334Speter print_node (file, "op1", TREE_PURPOSE (node), indent + 4); 68518334Speter print_node (file, "op2", TREE_VALUE (node), indent + 4); 68650617Sobrien break; 68750617Sobrien 68850617Sobrien default: 68950617Sobrien if (TREE_CODE_CLASS (TREE_CODE (node)) == 'x') 69050617Sobrien lang_print_xnode (file, node, indent); 69150617Sobrien break; 69218334Speter } 69318334Speter 69418334Speter break; 69518334Speter } 69618334Speter 69718334Speter fprintf (file, ">"); 69818334Speter} 699