print-tree.c revision 169699
1132727Skan/* Prints out tree in human readable form - GCC 290285Sobrien Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 3169699Skan 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 418334Speter 590285SobrienThis file is part of GCC. 618334Speter 790285SobrienGCC is free software; you can redistribute it and/or modify it under 890285Sobrienthe terms of the GNU General Public License as published by the Free 990285SobrienSoftware Foundation; either version 2, or (at your option) any later 1090285Sobrienversion. 1118334Speter 1290285SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY 1390285SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or 1490285SobrienFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1590285Sobrienfor more details. 1618334Speter 1718334SpeterYou should have received a copy of the GNU General Public License 1890285Sobrienalong with GCC; see the file COPYING. If not, write to the Free 19169699SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 20169699Skan02110-1301, USA. */ 2118334Speter 2218334Speter 2318334Speter#include "config.h" 2450617Sobrien#include "system.h" 25132727Skan#include "coretypes.h" 26132727Skan#include "tm.h" 2718334Speter#include "tree.h" 28117404Skan#include "real.h" 2990285Sobrien#include "ggc.h" 3090285Sobrien#include "langhooks.h" 31169699Skan#include "tree-iterator.h" 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 51132727Skandebug_tree (tree node) 5218334Speter{ 53169699Skan table = XCNEWVEC (struct bucket *, HASH_SIZE); 5418334Speter print_node (stderr, "", node, 0); 55132727Skan free (table); 5618334Speter table = 0; 57132727Skan putc ('\n', stderr); 5818334Speter} 5918334Speter 60169699Skan/* Print PREFIX and ADDR to FILE. */ 61169699Skanvoid 62169699Skandump_addr (FILE *file, const char *prefix, void *addr) 63169699Skan{ 64169699Skan if (flag_dump_noaddr || flag_dump_unnumbered) 65169699Skan fprintf (file, "%s#", prefix); 66169699Skan else 67169699Skan fprintf (file, "%s%p", prefix, addr); 68169699Skan} 69169699Skan 7018334Speter/* Print a node in brief fashion, with just the code, address and name. */ 7118334Speter 7218334Spetervoid 73132727Skanprint_node_brief (FILE *file, const char *prefix, tree node, int indent) 7418334Speter{ 75169699Skan enum tree_code_class class; 7618334Speter 7718334Speter if (node == 0) 7818334Speter return; 7918334Speter 8018334Speter class = TREE_CODE_CLASS (TREE_CODE (node)); 8118334Speter 8218334Speter /* Always print the slot this node is in, and its code, address and 8318334Speter name if any. */ 8418334Speter if (indent > 0) 8518334Speter fprintf (file, " "); 86169699Skan fprintf (file, "%s <%s", prefix, tree_code_name[(int) TREE_CODE (node)]); 87169699Skan dump_addr (file, " ", node); 8818334Speter 89169699Skan if (class == tcc_declaration) 9018334Speter { 9118334Speter if (DECL_NAME (node)) 9218334Speter fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node))); 93169699Skan else if (TREE_CODE (node) == LABEL_DECL 94169699Skan && LABEL_DECL_UID (node) != -1) 95169699Skan fprintf (file, " L." HOST_WIDE_INT_PRINT_DEC, LABEL_DECL_UID (node)); 96169699Skan else 97169699Skan fprintf (file, " %c.%u", TREE_CODE (node) == CONST_DECL ? 'C' : 'D', 98169699Skan DECL_UID (node)); 9918334Speter } 100169699Skan else if (class == tcc_type) 10118334Speter { 10218334Speter if (TYPE_NAME (node)) 10318334Speter { 10418334Speter if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE) 10518334Speter fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node))); 10618334Speter else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL 10718334Speter && DECL_NAME (TYPE_NAME (node))) 10818334Speter fprintf (file, " %s", 10918334Speter IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node)))); 11018334Speter } 11118334Speter } 11218334Speter if (TREE_CODE (node) == IDENTIFIER_NODE) 11318334Speter fprintf (file, " %s", IDENTIFIER_POINTER (node)); 11490285Sobrien 11590285Sobrien /* We might as well always print the value of an integer or real. */ 11618334Speter if (TREE_CODE (node) == INTEGER_CST) 11718334Speter { 11818334Speter if (TREE_CONSTANT_OVERFLOW (node)) 11918334Speter fprintf (file, " overflow"); 12018334Speter 12150617Sobrien fprintf (file, " "); 12218334Speter if (TREE_INT_CST_HIGH (node) == 0) 12350617Sobrien fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, TREE_INT_CST_LOW (node)); 12418334Speter else if (TREE_INT_CST_HIGH (node) == -1 12518334Speter && TREE_INT_CST_LOW (node) != 0) 126132727Skan fprintf (file, "-" HOST_WIDE_INT_PRINT_UNSIGNED, 127132727Skan -TREE_INT_CST_LOW (node)); 12818334Speter else 12950617Sobrien fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX, 13018334Speter TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node)); 13118334Speter } 13218334Speter if (TREE_CODE (node) == REAL_CST) 13318334Speter { 13418334Speter REAL_VALUE_TYPE d; 13518334Speter 13618334Speter if (TREE_OVERFLOW (node)) 13718334Speter fprintf (file, " overflow"); 13818334Speter 13918334Speter d = TREE_REAL_CST (node); 14018334Speter if (REAL_VALUE_ISINF (d)) 141169699Skan fprintf (file, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf"); 14218334Speter else if (REAL_VALUE_ISNAN (d)) 14318334Speter fprintf (file, " Nan"); 14418334Speter else 14518334Speter { 146117404Skan char string[60]; 147117404Skan real_to_decimal (string, &d, sizeof (string), 0, 1); 14818334Speter fprintf (file, " %s", string); 14918334Speter } 15018334Speter } 15118334Speter 15218334Speter fprintf (file, ">"); 15318334Speter} 15418334Speter 15518334Spetervoid 156132727Skanindent_to (FILE *file, int column) 15718334Speter{ 15818334Speter int i; 15918334Speter 16018334Speter /* Since this is the long way, indent to desired column. */ 16118334Speter if (column > 0) 16218334Speter fprintf (file, "\n"); 16318334Speter for (i = 0; i < column; i++) 16418334Speter fprintf (file, " "); 16518334Speter} 16618334Speter 16718334Speter/* Print the node NODE in full on file FILE, preceded by PREFIX, 16818334Speter starting in column INDENT. */ 16918334Speter 17018334Spetervoid 171132727Skanprint_node (FILE *file, const char *prefix, tree node, int indent) 17218334Speter{ 17318334Speter int hash; 17418334Speter struct bucket *b; 17518334Speter enum machine_mode mode; 176169699Skan enum tree_code_class class; 17718334Speter int len; 17818334Speter int i; 179169699Skan expanded_location xloc; 180169699Skan enum tree_code code; 18118334Speter 18218334Speter if (node == 0) 18318334Speter return; 184169699Skan 185169699Skan code = TREE_CODE (node); 186169699Skan class = TREE_CODE_CLASS (code); 18718334Speter 18818334Speter /* Don't get too deep in nesting. If the user wants to see deeper, 18918334Speter it is easy to use the address of a lowest-level node 19018334Speter as an argument in another call to debug_tree. */ 19118334Speter 19218334Speter if (indent > 24) 19318334Speter { 19418334Speter print_node_brief (file, prefix, node, indent); 19518334Speter return; 19618334Speter } 19718334Speter 198169699Skan if (indent > 8 && (class == tcc_type || class == tcc_declaration)) 19918334Speter { 20018334Speter print_node_brief (file, prefix, node, indent); 20118334Speter return; 20218334Speter } 20318334Speter 204132727Skan /* It is unsafe to look at any other fields of an ERROR_MARK node. */ 20518334Speter if (TREE_CODE (node) == ERROR_MARK) 20618334Speter { 20718334Speter print_node_brief (file, prefix, node, indent); 20818334Speter return; 20918334Speter } 21018334Speter 21150617Sobrien hash = ((unsigned long) node) % HASH_SIZE; 21218334Speter 21318334Speter /* If node is in the table, just mention its address. */ 21418334Speter for (b = table[hash]; b; b = b->next) 21518334Speter if (b->node == node) 21618334Speter { 21718334Speter print_node_brief (file, prefix, node, indent); 21818334Speter return; 21918334Speter } 22018334Speter 22118334Speter /* Add this node to the table. */ 222169699Skan b = XNEW (struct bucket); 22318334Speter b->node = node; 22418334Speter b->next = table[hash]; 22518334Speter table[hash] = b; 22618334Speter 22718334Speter /* Indent to the specified column, since this is the long form. */ 22818334Speter indent_to (file, indent); 22918334Speter 23018334Speter /* Print the slot this node is in, and its code, and address. */ 231169699Skan fprintf (file, "%s <%s", prefix, tree_code_name[(int) TREE_CODE (node)]); 232169699Skan dump_addr (file, " ", node); 23318334Speter 23418334Speter /* Print the name, if any. */ 235169699Skan if (class == tcc_declaration) 23618334Speter { 23718334Speter if (DECL_NAME (node)) 23818334Speter fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node))); 239169699Skan else if (TREE_CODE (node) == LABEL_DECL 240169699Skan && LABEL_DECL_UID (node) != -1) 241169699Skan fprintf (file, " L." HOST_WIDE_INT_PRINT_DEC, LABEL_DECL_UID (node)); 242169699Skan else 243169699Skan fprintf (file, " %c.%u", TREE_CODE (node) == CONST_DECL ? 'C' : 'D', 244169699Skan DECL_UID (node)); 24518334Speter } 246169699Skan else if (class == tcc_type) 24718334Speter { 24818334Speter if (TYPE_NAME (node)) 24918334Speter { 25018334Speter if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE) 25118334Speter fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node))); 25218334Speter else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL 25318334Speter && DECL_NAME (TYPE_NAME (node))) 25418334Speter fprintf (file, " %s", 25518334Speter IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node)))); 25618334Speter } 25718334Speter } 25818334Speter if (TREE_CODE (node) == IDENTIFIER_NODE) 25918334Speter fprintf (file, " %s", IDENTIFIER_POINTER (node)); 26018334Speter 26118334Speter if (TREE_CODE (node) == INTEGER_CST) 26218334Speter { 26318334Speter if (indent <= 4) 26418334Speter print_node_brief (file, "type", TREE_TYPE (node), indent + 4); 26518334Speter } 26618334Speter else 26718334Speter { 26818334Speter print_node (file, "type", TREE_TYPE (node), indent + 4); 26918334Speter if (TREE_TYPE (node)) 27018334Speter indent_to (file, indent + 3); 27118334Speter } 27218334Speter 273169699Skan if (!TYPE_P (node) && TREE_SIDE_EFFECTS (node)) 27418334Speter fputs (" side-effects", file); 275169699Skan 276169699Skan if (TYPE_P (node) ? TYPE_READONLY (node) : TREE_READONLY (node)) 27718334Speter fputs (" readonly", file); 278169699Skan if (!TYPE_P (node) && TREE_CONSTANT (node)) 27918334Speter fputs (" constant", file); 280169699Skan else if (TYPE_P (node) && TYPE_SIZES_GIMPLIFIED (node)) 281169699Skan fputs (" sizes-gimplified", file); 282169699Skan 283169699Skan if (TREE_INVARIANT (node)) 284169699Skan fputs (" invariant", file); 28518334Speter if (TREE_ADDRESSABLE (node)) 28618334Speter fputs (" addressable", file); 28718334Speter if (TREE_THIS_VOLATILE (node)) 28818334Speter fputs (" volatile", file); 28918334Speter if (TREE_ASM_WRITTEN (node)) 29018334Speter fputs (" asm_written", file); 29118334Speter if (TREE_USED (node)) 29218334Speter fputs (" used", file); 29390285Sobrien if (TREE_NOTHROW (node)) 294132727Skan fputs (TYPE_P (node) ? " align-ok" : " nothrow", file); 29518334Speter if (TREE_PUBLIC (node)) 29618334Speter fputs (" public", file); 29790285Sobrien if (TREE_PRIVATE (node)) 29890285Sobrien fputs (" private", file); 29990285Sobrien if (TREE_PROTECTED (node)) 30090285Sobrien fputs (" protected", file); 30118334Speter if (TREE_STATIC (node)) 30218334Speter fputs (" static", file); 30390285Sobrien if (TREE_DEPRECATED (node)) 30490285Sobrien fputs (" deprecated", file); 305169699Skan if (TREE_VISITED (node)) 306169699Skan fputs (" visited", file); 30718334Speter if (TREE_LANG_FLAG_0 (node)) 30818334Speter fputs (" tree_0", file); 30918334Speter if (TREE_LANG_FLAG_1 (node)) 31018334Speter fputs (" tree_1", file); 31118334Speter if (TREE_LANG_FLAG_2 (node)) 31218334Speter fputs (" tree_2", file); 31318334Speter if (TREE_LANG_FLAG_3 (node)) 31418334Speter fputs (" tree_3", file); 31518334Speter if (TREE_LANG_FLAG_4 (node)) 31618334Speter fputs (" tree_4", file); 31718334Speter if (TREE_LANG_FLAG_5 (node)) 31818334Speter fputs (" tree_5", file); 31918334Speter if (TREE_LANG_FLAG_6 (node)) 32018334Speter fputs (" tree_6", file); 32118334Speter 32218334Speter /* DECL_ nodes have additional attributes. */ 32318334Speter 32418334Speter switch (TREE_CODE_CLASS (TREE_CODE (node))) 32518334Speter { 326169699Skan case tcc_declaration: 327169699Skan if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 328169699Skan { 329169699Skan if (DECL_UNSIGNED (node)) 330169699Skan fputs (" unsigned", file); 331169699Skan if (DECL_IGNORED_P (node)) 332169699Skan fputs (" ignored", file); 333169699Skan if (DECL_ABSTRACT (node)) 334169699Skan fputs (" abstract", file); 335169699Skan if (DECL_EXTERNAL (node)) 336169699Skan fputs (" external", file); 337169699Skan if (DECL_NONLOCAL (node)) 338169699Skan fputs (" nonlocal", file); 339169699Skan } 340169699Skan if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)) 341169699Skan { 342169699Skan if (DECL_WEAK (node)) 343169699Skan fputs (" weak", file); 344169699Skan if (DECL_IN_SYSTEM_HEADER (node)) 345169699Skan fputs (" in_system_header", file); 346169699Skan } 347169699Skan if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL) 348169699Skan && TREE_CODE (node) != LABEL_DECL 34990285Sobrien && TREE_CODE (node) != FUNCTION_DECL 350169699Skan && DECL_REGISTER (node)) 35118334Speter fputs (" regdecl", file); 35218334Speter 35318334Speter if (TREE_CODE (node) == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node)) 35418334Speter fputs (" suppress-debug", file); 35518334Speter 356132727Skan if (TREE_CODE (node) == FUNCTION_DECL && DECL_INLINE (node)) 357132727Skan fputs (DECL_DECLARED_INLINE_P (node) ? " inline" : " autoinline", file); 35818334Speter if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN (node)) 35918334Speter fputs (" built-in", file); 36090285Sobrien if (TREE_CODE (node) == FUNCTION_DECL && DECL_NO_STATIC_CHAIN (node)) 36190285Sobrien fputs (" no-static-chain", file); 36218334Speter 36390285Sobrien if (TREE_CODE (node) == FIELD_DECL && DECL_PACKED (node)) 36490285Sobrien fputs (" packed", file); 36518334Speter if (TREE_CODE (node) == FIELD_DECL && DECL_BIT_FIELD (node)) 36618334Speter fputs (" bit-field", file); 36790285Sobrien if (TREE_CODE (node) == FIELD_DECL && DECL_NONADDRESSABLE_P (node)) 36890285Sobrien fputs (" nonaddressable", file); 36990285Sobrien 37090285Sobrien if (TREE_CODE (node) == LABEL_DECL && DECL_ERROR_ISSUED (node)) 37190285Sobrien fputs (" error-issued", file); 37290285Sobrien 37318334Speter if (TREE_CODE (node) == VAR_DECL && DECL_IN_TEXT_SECTION (node)) 37418334Speter fputs (" in-text-section", file); 375169699Skan if (TREE_CODE (node) == VAR_DECL && DECL_COMMON (node)) 376169699Skan fputs (" common", file); 377169699Skan if (TREE_CODE (node) == VAR_DECL && DECL_THREAD_LOCAL_P (node)) 378169699Skan { 379169699Skan enum tls_model kind = DECL_TLS_MODEL (node); 380169699Skan switch (kind) 381169699Skan { 382169699Skan case TLS_MODEL_GLOBAL_DYNAMIC: 383169699Skan fputs (" tls-global-dynamic", file); 384169699Skan break; 385169699Skan case TLS_MODEL_LOCAL_DYNAMIC: 386169699Skan fputs (" tls-local-dynamic", file); 387169699Skan break; 388169699Skan case TLS_MODEL_INITIAL_EXEC: 389169699Skan fputs (" tls-initial-exec", file); 390169699Skan break; 391169699Skan case TLS_MODEL_LOCAL_EXEC: 392169699Skan fputs (" tls-local-exec", file); 393169699Skan break; 394169699Skan default: 395169699Skan gcc_unreachable (); 396169699Skan } 397169699Skan } 39818334Speter 399169699Skan if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 400169699Skan { 401169699Skan if (DECL_VIRTUAL_P (node)) 402169699Skan fputs (" virtual", file); 403169699Skan if (DECL_PRESERVE_P (node)) 404169699Skan fputs (" preserve", file); 405169699Skan if (DECL_LANG_FLAG_0 (node)) 406169699Skan fputs (" decl_0", file); 407169699Skan if (DECL_LANG_FLAG_1 (node)) 408169699Skan fputs (" decl_1", file); 409169699Skan if (DECL_LANG_FLAG_2 (node)) 410169699Skan fputs (" decl_2", file); 411169699Skan if (DECL_LANG_FLAG_3 (node)) 412169699Skan fputs (" decl_3", file); 413169699Skan if (DECL_LANG_FLAG_4 (node)) 414169699Skan fputs (" decl_4", file); 415169699Skan if (DECL_LANG_FLAG_5 (node)) 416169699Skan fputs (" decl_5", file); 417169699Skan if (DECL_LANG_FLAG_6 (node)) 418169699Skan fputs (" decl_6", file); 419169699Skan if (DECL_LANG_FLAG_7 (node)) 420169699Skan fputs (" decl_7", file); 421169699Skan 422169699Skan mode = DECL_MODE (node); 423169699Skan fprintf (file, " %s", GET_MODE_NAME (mode)); 424169699Skan } 42590285Sobrien 426169699Skan if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS) && DECL_DEFER_OUTPUT (node)) 42718334Speter fputs (" defer-output", file); 42818334Speter 42918334Speter 430169699Skan xloc = expand_location (DECL_SOURCE_LOCATION (node)); 431169699Skan fprintf (file, " file %s line %d", xloc.file, xloc.line); 43218334Speter 433169699Skan if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 434169699Skan { 435169699Skan print_node (file, "size", DECL_SIZE (node), indent + 4); 436169699Skan print_node (file, "unit size", DECL_SIZE_UNIT (node), indent + 4); 437169699Skan 438169699Skan if (TREE_CODE (node) != FUNCTION_DECL 439169699Skan || DECL_INLINE (node) || DECL_BUILT_IN (node)) 440169699Skan indent_to (file, indent + 3); 441169699Skan 442169699Skan if (TREE_CODE (node) != FUNCTION_DECL) 443169699Skan { 444169699Skan if (DECL_USER_ALIGN (node)) 445169699Skan fprintf (file, " user"); 446169699Skan 447169699Skan fprintf (file, " align %d", DECL_ALIGN (node)); 448169699Skan if (TREE_CODE (node) == FIELD_DECL) 449169699Skan fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED, 450169699Skan DECL_OFFSET_ALIGN (node)); 451169699Skan } 452169699Skan else if (DECL_BUILT_IN (node)) 453169699Skan { 454169699Skan if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD) 455169699Skan fprintf (file, " built-in BUILT_IN_MD %d", DECL_FUNCTION_CODE (node)); 456169699Skan else 457169699Skan fprintf (file, " built-in %s:%s", 458169699Skan built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)], 459169699Skan built_in_names[(int) DECL_FUNCTION_CODE (node)]); 460169699Skan } 461169699Skan 462169699Skan if (DECL_POINTER_ALIAS_SET_KNOWN_P (node)) 463169699Skan fprintf (file, " alias set " HOST_WIDE_INT_PRINT_DEC, 464169699Skan DECL_POINTER_ALIAS_SET (node)); 46590285Sobrien } 46618334Speter if (TREE_CODE (node) == FIELD_DECL) 46790285Sobrien { 46890285Sobrien print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4); 46990285Sobrien print_node (file, "bit offset", DECL_FIELD_BIT_OFFSET (node), 47090285Sobrien indent + 4); 471169699Skan if (DECL_BIT_FIELD_TYPE (node)) 472169699Skan print_node (file, "bit_field_type", DECL_BIT_FIELD_TYPE (node), 473169699Skan indent + 4); 47490285Sobrien } 47590285Sobrien 47618334Speter print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4); 47718334Speter 478169699Skan if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) 479169699Skan { 480169699Skan print_node_brief (file, "attributes", 481169699Skan DECL_ATTRIBUTES (node), indent + 4); 482169699Skan print_node_brief (file, "initial", DECL_INITIAL (node), indent + 4); 483169699Skan } 484169699Skan if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL)) 485169699Skan { 486169699Skan print_node_brief (file, "abstract_origin", 487169699Skan DECL_ABSTRACT_ORIGIN (node), indent + 4); 488169699Skan } 489169699Skan if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON)) 490169699Skan { 491169699Skan print_node (file, "arguments", DECL_ARGUMENT_FLD (node), indent + 4); 492169699Skan print_node (file, "result", DECL_RESULT_FLD (node), indent + 4); 493169699Skan } 49418334Speter 495169699Skan lang_hooks.print_decl (file, node, indent); 49618334Speter 49790285Sobrien if (DECL_RTL_SET_P (node)) 49818334Speter { 49918334Speter indent_to (file, indent + 4); 50018334Speter print_rtl (file, DECL_RTL (node)); 50118334Speter } 50218334Speter 50390285Sobrien if (TREE_CODE (node) == PARM_DECL) 50418334Speter { 50590285Sobrien print_node (file, "arg-type", DECL_ARG_TYPE (node), indent + 4); 50690285Sobrien 50790285Sobrien if (DECL_INCOMING_RTL (node) != 0) 50818334Speter { 50990285Sobrien indent_to (file, indent + 4); 51018334Speter fprintf (file, "incoming-rtl "); 51118334Speter print_rtl (file, DECL_INCOMING_RTL (node)); 51218334Speter } 51318334Speter } 51490285Sobrien else if (TREE_CODE (node) == FUNCTION_DECL 515169699Skan && DECL_STRUCT_FUNCTION (node) != 0) 51690285Sobrien { 51790285Sobrien indent_to (file, indent + 4); 518169699Skan dump_addr (file, "saved-insns ", DECL_STRUCT_FUNCTION (node)); 51990285Sobrien } 52018334Speter 521169699Skan if ((TREE_CODE (node) == VAR_DECL || TREE_CODE (node) == PARM_DECL) 522169699Skan && DECL_HAS_VALUE_EXPR_P (node)) 523169699Skan print_node (file, "value-expr", DECL_VALUE_EXPR (node), indent + 4); 524169699Skan 525169699Skan if (TREE_CODE (node) == STRUCT_FIELD_TAG) 526169699Skan { 527169699Skan fprintf (file, " sft size " HOST_WIDE_INT_PRINT_DEC, 528169699Skan SFT_SIZE (node)); 529169699Skan fprintf (file, " sft offset " HOST_WIDE_INT_PRINT_DEC, 530169699Skan SFT_OFFSET (node)); 531169699Skan print_node_brief (file, "parent var", SFT_PARENT_VAR (node), 532169699Skan indent + 4); 533169699Skan } 53418334Speter /* Print the decl chain only if decl is at second level. */ 53518334Speter if (indent == 4) 53618334Speter print_node (file, "chain", TREE_CHAIN (node), indent + 4); 53718334Speter else 53818334Speter print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4); 53918334Speter break; 54018334Speter 541169699Skan case tcc_type: 542169699Skan if (TYPE_UNSIGNED (node)) 543169699Skan fputs (" unsigned", file); 544169699Skan 54590285Sobrien /* The no-force-blk flag is used for different things in 54690285Sobrien different types. */ 54790285Sobrien if ((TREE_CODE (node) == RECORD_TYPE 54890285Sobrien || TREE_CODE (node) == UNION_TYPE 54990285Sobrien || TREE_CODE (node) == QUAL_UNION_TYPE) 55090285Sobrien && TYPE_NO_FORCE_BLK (node)) 55118334Speter fputs (" no-force-blk", file); 55290285Sobrien else if (TREE_CODE (node) == INTEGER_TYPE 55390285Sobrien && TYPE_IS_SIZETYPE (node)) 55490285Sobrien fputs (" sizetype", file); 55590285Sobrien else if (TREE_CODE (node) == FUNCTION_TYPE 55690285Sobrien && TYPE_RETURNS_STACK_DEPRESSED (node)) 55790285Sobrien fputs (" returns-stack-depressed", file); 55890285Sobrien 55918334Speter if (TYPE_STRING_FLAG (node)) 56018334Speter fputs (" string-flag", file); 56118334Speter if (TYPE_NEEDS_CONSTRUCTING (node)) 56218334Speter fputs (" needs-constructing", file); 56390285Sobrien 56490285Sobrien /* The transparent-union flag is used for different things in 56590285Sobrien different nodes. */ 56690285Sobrien if (TREE_CODE (node) == UNION_TYPE && TYPE_TRANSPARENT_UNION (node)) 56718334Speter fputs (" transparent-union", file); 56890285Sobrien else if (TREE_CODE (node) == ARRAY_TYPE 56990285Sobrien && TYPE_NONALIASED_COMPONENT (node)) 57090285Sobrien fputs (" nonaliased-component", file); 57190285Sobrien 57218334Speter if (TYPE_PACKED (node)) 57318334Speter fputs (" packed", file); 57418334Speter 575117404Skan if (TYPE_RESTRICT (node)) 576117404Skan fputs (" restrict", file); 577117404Skan 57818334Speter if (TYPE_LANG_FLAG_0 (node)) 57918334Speter fputs (" type_0", file); 58018334Speter if (TYPE_LANG_FLAG_1 (node)) 58118334Speter fputs (" type_1", file); 58218334Speter if (TYPE_LANG_FLAG_2 (node)) 58318334Speter fputs (" type_2", file); 58418334Speter if (TYPE_LANG_FLAG_3 (node)) 58518334Speter fputs (" type_3", file); 58618334Speter if (TYPE_LANG_FLAG_4 (node)) 58718334Speter fputs (" type_4", file); 58818334Speter if (TYPE_LANG_FLAG_5 (node)) 58918334Speter fputs (" type_5", file); 59018334Speter if (TYPE_LANG_FLAG_6 (node)) 59118334Speter fputs (" type_6", file); 59218334Speter 59318334Speter mode = TYPE_MODE (node); 59490285Sobrien fprintf (file, " %s", GET_MODE_NAME (mode)); 59518334Speter 59618334Speter print_node (file, "size", TYPE_SIZE (node), indent + 4); 59790285Sobrien print_node (file, "unit size", TYPE_SIZE_UNIT (node), indent + 4); 59818334Speter indent_to (file, indent + 3); 59918334Speter 60090285Sobrien if (TYPE_USER_ALIGN (node)) 60190285Sobrien fprintf (file, " user"); 60290285Sobrien 603132727Skan fprintf (file, " align %d symtab %d alias set " HOST_WIDE_INT_PRINT_DEC, 604132727Skan TYPE_ALIGN (node), TYPE_SYMTAB_ADDRESS (node), 605132727Skan TYPE_ALIAS_SET (node)); 60618334Speter 60718334Speter print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4); 60818334Speter 60990285Sobrien if (INTEGRAL_TYPE_P (node) || TREE_CODE (node) == REAL_TYPE) 61018334Speter { 61118334Speter fprintf (file, " precision %d", TYPE_PRECISION (node)); 61290285Sobrien print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4); 61390285Sobrien print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4); 61418334Speter } 61590285Sobrien 61690285Sobrien if (TREE_CODE (node) == ENUMERAL_TYPE) 61790285Sobrien print_node (file, "values", TYPE_VALUES (node), indent + 4); 618169699Skan else if (TREE_CODE (node) == ARRAY_TYPE) 61990285Sobrien print_node (file, "domain", TYPE_DOMAIN (node), indent + 4); 620169699Skan else if (TREE_CODE (node) == VECTOR_TYPE) 621169699Skan fprintf (file, " nunits %d", (int) TYPE_VECTOR_SUBPARTS (node)); 62218334Speter else if (TREE_CODE (node) == RECORD_TYPE 62318334Speter || TREE_CODE (node) == UNION_TYPE 62418334Speter || TREE_CODE (node) == QUAL_UNION_TYPE) 62518334Speter print_node (file, "fields", TYPE_FIELDS (node), indent + 4); 62690285Sobrien else if (TREE_CODE (node) == FUNCTION_TYPE 62790285Sobrien || TREE_CODE (node) == METHOD_TYPE) 62818334Speter { 62918334Speter if (TYPE_METHOD_BASETYPE (node)) 63090285Sobrien print_node_brief (file, "method basetype", 63190285Sobrien TYPE_METHOD_BASETYPE (node), indent + 4); 63218334Speter print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4); 63318334Speter } 63490285Sobrien else if (TREE_CODE (node) == OFFSET_TYPE) 63590285Sobrien print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node), 63690285Sobrien indent + 4); 63790285Sobrien 63818334Speter if (TYPE_CONTEXT (node)) 63918334Speter print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4); 64018334Speter 641169699Skan lang_hooks.print_type (file, node, indent); 64218334Speter 64318334Speter if (TYPE_POINTER_TO (node) || TREE_CHAIN (node)) 64418334Speter indent_to (file, indent + 3); 64590285Sobrien 64690285Sobrien print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node), 64790285Sobrien indent + 4); 64890285Sobrien print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node), 64990285Sobrien indent + 4); 65018334Speter print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4); 65118334Speter break; 65218334Speter 653169699Skan case tcc_expression: 654169699Skan case tcc_comparison: 655169699Skan case tcc_unary: 656169699Skan case tcc_binary: 657169699Skan case tcc_reference: 658169699Skan case tcc_statement: 659169699Skan if (TREE_CODE (node) == BIT_FIELD_REF && BIT_FIELD_REF_UNSIGNED (node)) 660169699Skan fputs (" unsigned", file); 66150617Sobrien if (TREE_CODE (node) == BIND_EXPR) 66218334Speter { 66318334Speter print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4); 66418334Speter print_node (file, "body", TREE_OPERAND (node, 1), indent + 4); 66518334Speter print_node (file, "block", TREE_OPERAND (node, 2), indent + 4); 66652521Sobrien break; 66718334Speter } 66818334Speter 66990285Sobrien len = TREE_CODE_LENGTH (TREE_CODE (node)); 67090285Sobrien 67118334Speter for (i = 0; i < len; i++) 67218334Speter { 673169699Skan char temp[10]; 67418334Speter 675169699Skan sprintf (temp, "arg %d", i); 676169699Skan print_node (file, temp, TREE_OPERAND (node, i), indent + 4); 67718334Speter } 67850617Sobrien 67990285Sobrien print_node (file, "chain", TREE_CHAIN (node), indent + 4); 68018334Speter break; 68118334Speter 682169699Skan case tcc_constant: 683169699Skan case tcc_exceptional: 68418334Speter switch (TREE_CODE (node)) 68518334Speter { 68618334Speter case INTEGER_CST: 68718334Speter if (TREE_CONSTANT_OVERFLOW (node)) 68818334Speter fprintf (file, " overflow"); 68918334Speter 69050617Sobrien fprintf (file, " "); 69118334Speter if (TREE_INT_CST_HIGH (node) == 0) 69250617Sobrien fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, 69318334Speter TREE_INT_CST_LOW (node)); 69418334Speter else if (TREE_INT_CST_HIGH (node) == -1 69518334Speter && TREE_INT_CST_LOW (node) != 0) 696132727Skan fprintf (file, "-" HOST_WIDE_INT_PRINT_UNSIGNED, 697132727Skan -TREE_INT_CST_LOW (node)); 69818334Speter else 69950617Sobrien fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX, 70018334Speter TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node)); 70118334Speter break; 70218334Speter 70318334Speter case REAL_CST: 70418334Speter { 70518334Speter REAL_VALUE_TYPE d; 70618334Speter 70718334Speter if (TREE_OVERFLOW (node)) 70818334Speter fprintf (file, " overflow"); 70918334Speter 71018334Speter d = TREE_REAL_CST (node); 71118334Speter if (REAL_VALUE_ISINF (d)) 712169699Skan fprintf (file, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf"); 71318334Speter else if (REAL_VALUE_ISNAN (d)) 71418334Speter fprintf (file, " Nan"); 71518334Speter else 71618334Speter { 717117404Skan char string[64]; 718117404Skan real_to_decimal (string, &d, sizeof (string), 0, 1); 71918334Speter fprintf (file, " %s", string); 72018334Speter } 72118334Speter } 72218334Speter break; 72318334Speter 72496287Sobrien case VECTOR_CST: 72596287Sobrien { 72696287Sobrien tree vals = TREE_VECTOR_CST_ELTS (node); 72796287Sobrien char buf[10]; 72896287Sobrien tree link; 72996287Sobrien int i; 73096287Sobrien 73196287Sobrien i = 0; 73296287Sobrien for (link = vals; link; link = TREE_CHAIN (link), ++i) 73396287Sobrien { 73496287Sobrien sprintf (buf, "elt%d: ", i); 73596287Sobrien print_node (file, buf, TREE_VALUE (link), indent + 4); 73696287Sobrien } 73796287Sobrien } 73896287Sobrien break; 73996287Sobrien 74018334Speter case COMPLEX_CST: 74118334Speter print_node (file, "real", TREE_REALPART (node), indent + 4); 74218334Speter print_node (file, "imag", TREE_IMAGPART (node), indent + 4); 74318334Speter break; 74418334Speter 74518334Speter case STRING_CST: 746117404Skan { 747117404Skan const char *p = TREE_STRING_POINTER (node); 748117404Skan int i = TREE_STRING_LENGTH (node); 749117404Skan fputs (" \"", file); 750117404Skan while (--i >= 0) 751117404Skan { 752117404Skan char ch = *p++; 753117404Skan if (ch >= ' ' && ch < 127) 754117404Skan putc (ch, file); 755117404Skan else 756117404Skan fprintf(file, "\\%03o", ch & 0xFF); 757117404Skan } 758117404Skan fputc ('\"', file); 759117404Skan } 76018334Speter /* Print the chain at second level. */ 76118334Speter if (indent == 4) 76218334Speter print_node (file, "chain", TREE_CHAIN (node), indent + 4); 76318334Speter else 76418334Speter print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4); 76518334Speter break; 76618334Speter 76718334Speter case IDENTIFIER_NODE: 768169699Skan lang_hooks.print_identifier (file, node, indent); 76918334Speter break; 77018334Speter 77118334Speter case TREE_LIST: 77218334Speter print_node (file, "purpose", TREE_PURPOSE (node), indent + 4); 77318334Speter print_node (file, "value", TREE_VALUE (node), indent + 4); 77418334Speter print_node (file, "chain", TREE_CHAIN (node), indent + 4); 77518334Speter break; 77618334Speter 77718334Speter case TREE_VEC: 77818334Speter len = TREE_VEC_LENGTH (node); 77918334Speter for (i = 0; i < len; i++) 78018334Speter if (TREE_VEC_ELT (node, i)) 78118334Speter { 78218334Speter char temp[10]; 78318334Speter sprintf (temp, "elt %d", i); 78418334Speter indent_to (file, indent + 4); 78518334Speter print_node_brief (file, temp, TREE_VEC_ELT (node, i), 0); 78618334Speter } 78718334Speter break; 78818334Speter 789169699Skan case STATEMENT_LIST: 790169699Skan dump_addr (file, " head ", node->stmt_list.head); 791169699Skan dump_addr (file, " tail ", node->stmt_list.tail); 792169699Skan fprintf (file, " stmts"); 793169699Skan { 794169699Skan tree_stmt_iterator i; 795169699Skan for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i)) 796169699Skan { 797169699Skan /* Not printing the addresses of the (not-a-tree) 798169699Skan 'struct tree_stmt_list_node's. */ 799169699Skan dump_addr (file, " ", tsi_stmt (i)); 800169699Skan } 801169699Skan fprintf (file, "\n"); 802169699Skan for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i)) 803169699Skan { 804169699Skan /* Not printing the addresses of the (not-a-tree) 805169699Skan 'struct tree_stmt_list_node's. */ 806169699Skan print_node (file, "stmt", tsi_stmt (i), indent + 4); 807169699Skan } 808169699Skan } 809169699Skan print_node (file, "chain", TREE_CHAIN (node), indent + 4); 810169699Skan break; 811169699Skan 812169699Skan case BLOCK: 813169699Skan print_node (file, "vars", BLOCK_VARS (node), indent + 4); 814169699Skan print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node), 815169699Skan indent + 4); 816169699Skan print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4); 817169699Skan print_node (file, "chain", BLOCK_CHAIN (node), indent + 4); 818169699Skan print_node (file, "abstract_origin", 819169699Skan BLOCK_ABSTRACT_ORIGIN (node), indent + 4); 820169699Skan break; 821169699Skan 822169699Skan case SSA_NAME: 823169699Skan print_node_brief (file, "var", SSA_NAME_VAR (node), indent + 4); 824169699Skan print_node_brief (file, "def_stmt", 825169699Skan SSA_NAME_DEF_STMT (node), indent + 4); 826169699Skan 827169699Skan indent_to (file, indent + 4); 828169699Skan fprintf (file, "version %u", SSA_NAME_VERSION (node)); 829169699Skan if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node)) 830169699Skan fprintf (file, " in-abnormal-phi"); 831169699Skan if (SSA_NAME_IN_FREE_LIST (node)) 832169699Skan fprintf (file, " in-free-list"); 833169699Skan 834169699Skan if (SSA_NAME_PTR_INFO (node) 835169699Skan || SSA_NAME_VALUE (node)) 836169699Skan { 837169699Skan indent_to (file, indent + 3); 838169699Skan if (SSA_NAME_PTR_INFO (node)) 839169699Skan dump_addr (file, " ptr-info ", SSA_NAME_PTR_INFO (node)); 840169699Skan if (SSA_NAME_VALUE (node)) 841169699Skan dump_addr (file, " value ", SSA_NAME_VALUE (node)); 842169699Skan } 843169699Skan break; 844169699Skan 845169699Skan case OMP_CLAUSE: 846169699Skan { 847169699Skan int i; 848169699Skan fprintf (file, " %s", 849169699Skan omp_clause_code_name[OMP_CLAUSE_CODE (node)]); 850169699Skan for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (node)]; i++) 851169699Skan { 852169699Skan indent_to (file, indent + 4); 853169699Skan fprintf (file, "op %d:", i); 854169699Skan print_node_brief (file, "", OMP_CLAUSE_OPERAND (node, i), 0); 855169699Skan } 856169699Skan } 857169699Skan break; 858169699Skan 85950617Sobrien default: 860169699Skan if (EXCEPTIONAL_CLASS_P (node)) 861169699Skan lang_hooks.print_xnode (file, node, indent); 86250617Sobrien break; 86318334Speter } 86418334Speter 86518334Speter break; 86618334Speter } 86718334Speter 868169699Skan if (EXPR_HAS_LOCATION (node)) 869169699Skan { 870169699Skan expanded_location xloc = expand_location (EXPR_LOCATION (node)); 871169699Skan indent_to (file, indent+4); 872169699Skan fprintf (file, "%s:%d", xloc.file, xloc.line); 873169699Skan } 874169699Skan 87518334Speter fprintf (file, ">"); 87618334Speter} 877