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