X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fprint-tree.c;h=16ba3929fabd548d15e8be27c174ccac597e3665;hb=86ef5128849be159f90035f6318653989477fb07;hp=dad7e59e00225abe962c7501dae668da3413e37d;hpb=4c36ffe68d981c213d168cf07f42dcc558bc7f1b;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/print-tree.c b/gcc/print-tree.c index dad7e59e002..16ba3929fab 100644 --- a/gcc/print-tree.c +++ b/gcc/print-tree.c @@ -1,12 +1,12 @@ /* Prints out tree in human readable form - GCC Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later +Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY @@ -15,9 +15,8 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301, USA. */ +along with GCC; see the file COPYING3. If not see +. */ #include "config.h" @@ -26,9 +25,12 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #include "tm.h" #include "tree.h" #include "real.h" +#include "fixed-value.h" #include "ggc.h" #include "langhooks.h" #include "tree-iterator.h" +#include "diagnostic.h" +#include "tree-flow.h" /* Define the hash table of nodes already seen. Such nodes are not repeated; brief cross-references are used. */ @@ -57,37 +59,47 @@ debug_tree (tree node) putc ('\n', stderr); } +/* Print PREFIX and ADDR to FILE. */ +void +dump_addr (FILE *file, const char *prefix, const void *addr) +{ + if (flag_dump_noaddr || flag_dump_unnumbered) + fprintf (file, "%s#", prefix); + else + fprintf (file, "%s%p", prefix, addr); +} + /* Print a node in brief fashion, with just the code, address and name. */ void -print_node_brief (FILE *file, const char *prefix, tree node, int indent) +print_node_brief (FILE *file, const char *prefix, const_tree node, int indent) { - enum tree_code_class class; + enum tree_code_class tclass; if (node == 0) return; - class = TREE_CODE_CLASS (TREE_CODE (node)); + tclass = TREE_CODE_CLASS (TREE_CODE (node)); /* Always print the slot this node is in, and its code, address and name if any. */ if (indent > 0) fprintf (file, " "); - fprintf (file, "%s <%s %p", - prefix, tree_code_name[(int) TREE_CODE (node)], (char *) node); + fprintf (file, "%s <%s", prefix, tree_code_name[(int) TREE_CODE (node)]); + dump_addr (file, " ", node); - if (class == tcc_declaration) + if (tclass == tcc_declaration) { if (DECL_NAME (node)) fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node))); else if (TREE_CODE (node) == LABEL_DECL && LABEL_DECL_UID (node) != -1) - fprintf (file, " L." HOST_WIDE_INT_PRINT_DEC, LABEL_DECL_UID (node)); + fprintf (file, " L.%d", (int) LABEL_DECL_UID (node)); else fprintf (file, " %c.%u", TREE_CODE (node) == CONST_DECL ? 'C' : 'D', DECL_UID (node)); } - else if (class == tcc_type) + else if (tclass == tcc_type) { if (TYPE_NAME (node)) { @@ -105,7 +117,7 @@ print_node_brief (FILE *file, const char *prefix, tree node, int indent) /* We might as well always print the value of an integer or real. */ if (TREE_CODE (node) == INTEGER_CST) { - if (TREE_CONSTANT_OVERFLOW (node)) + if (TREE_OVERFLOW (node)) fprintf (file, " overflow"); fprintf (file, " "); @@ -117,7 +129,8 @@ print_node_brief (FILE *file, const char *prefix, tree node, int indent) -TREE_INT_CST_LOW (node)); else fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX, - TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node)); + (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (node), + (unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (node)); } if (TREE_CODE (node) == REAL_CST) { @@ -128,7 +141,7 @@ print_node_brief (FILE *file, const char *prefix, tree node, int indent) d = TREE_REAL_CST (node); if (REAL_VALUE_ISINF (d)) - fprintf (file, " Inf"); + fprintf (file, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf"); else if (REAL_VALUE_ISNAN (d)) fprintf (file, " Nan"); else @@ -138,6 +151,18 @@ print_node_brief (FILE *file, const char *prefix, tree node, int indent) fprintf (file, " %s", string); } } + if (TREE_CODE (node) == FIXED_CST) + { + FIXED_VALUE_TYPE f; + char string[60]; + + if (TREE_OVERFLOW (node)) + fprintf (file, " overflow"); + + f = TREE_FIXED_CST (node); + fixed_to_decimal (string, &f, sizeof (string)); + fprintf (file, " %s", string); + } fprintf (file, ">"); } @@ -163,7 +188,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent) int hash; struct bucket *b; enum machine_mode mode; - enum tree_code_class class; + enum tree_code_class tclass; int len; int i; expanded_location xloc; @@ -173,7 +198,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent) return; code = TREE_CODE (node); - class = TREE_CODE_CLASS (code); + tclass = TREE_CODE_CLASS (code); /* Don't get too deep in nesting. If the user wants to see deeper, it is easy to use the address of a lowest-level node @@ -185,7 +210,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent) return; } - if (indent > 8 && (class == tcc_type || class == tcc_declaration)) + if (indent > 8 && (tclass == tcc_type || tclass == tcc_declaration)) { print_node_brief (file, prefix, node, indent); return; @@ -198,42 +223,46 @@ print_node (FILE *file, const char *prefix, tree node, int indent) return; } - hash = ((unsigned long) node) % HASH_SIZE; - - /* If node is in the table, just mention its address. */ - for (b = table[hash]; b; b = b->next) - if (b->node == node) - { - print_node_brief (file, prefix, node, indent); - return; - } - - /* Add this node to the table. */ - b = XNEW (struct bucket); - b->node = node; - b->next = table[hash]; - table[hash] = b; + /* Allow this function to be called if the table is not there. */ + if (table) + { + hash = ((unsigned long) node) % HASH_SIZE; + + /* If node is in the table, just mention its address. */ + for (b = table[hash]; b; b = b->next) + if (b->node == node) + { + print_node_brief (file, prefix, node, indent); + return; + } + + /* Add this node to the table. */ + b = XNEW (struct bucket); + b->node = node; + b->next = table[hash]; + table[hash] = b; + } /* Indent to the specified column, since this is the long form. */ indent_to (file, indent); /* Print the slot this node is in, and its code, and address. */ - fprintf (file, "%s <%s %p", - prefix, tree_code_name[(int) TREE_CODE (node)], (void *) node); + fprintf (file, "%s <%s", prefix, tree_code_name[(int) TREE_CODE (node)]); + dump_addr (file, " ", node); /* Print the name, if any. */ - if (class == tcc_declaration) + if (tclass == tcc_declaration) { if (DECL_NAME (node)) fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node))); else if (TREE_CODE (node) == LABEL_DECL && LABEL_DECL_UID (node) != -1) - fprintf (file, " L." HOST_WIDE_INT_PRINT_DEC, LABEL_DECL_UID (node)); + fprintf (file, " L.%d", (int) LABEL_DECL_UID (node)); else fprintf (file, " %c.%u", TREE_CODE (node) == CONST_DECL ? 'C' : 'D', DECL_UID (node)); } - else if (class == tcc_type) + else if (tclass == tcc_type) { if (TYPE_NAME (node)) { @@ -270,8 +299,6 @@ print_node (FILE *file, const char *prefix, tree node, int indent) else if (TYPE_P (node) && TYPE_SIZES_GIMPLIFIED (node)) fputs (" sizes-gimplified", file); - if (TREE_INVARIANT (node)) - fputs (" invariant", file); if (TREE_ADDRESSABLE (node)) fputs (" addressable", file); if (TREE_THIS_VOLATILE (node)) @@ -343,8 +370,14 @@ print_node (FILE *file, const char *prefix, tree node, int indent) if (TREE_CODE (node) == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node)) fputs (" suppress-debug", file); - if (TREE_CODE (node) == FUNCTION_DECL && DECL_INLINE (node)) - fputs (DECL_DECLARED_INLINE_P (node) ? " inline" : " autoinline", file); + if (TREE_CODE (node) == FUNCTION_DECL + && DECL_FUNCTION_SPECIFIC_TARGET (node)) + fputs (" function-specific-target", file); + if (TREE_CODE (node) == FUNCTION_DECL + && DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node)) + fputs (" function-specific-opt", file); + if (TREE_CODE (node) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (node)) + fputs (" autoinline", file); if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN (node)) fputs (" built-in", file); if (TREE_CODE (node) == FUNCTION_DECL && DECL_NO_STATIC_CHAIN (node)) @@ -391,7 +424,9 @@ print_node (FILE *file, const char *prefix, tree node, int indent) if (DECL_VIRTUAL_P (node)) fputs (" virtual", file); if (DECL_PRESERVE_P (node)) - fputs (" preserve", file); + fputs (" preserve", file); + if (DECL_NO_TBAA_P (node)) + fputs (" no-tbaa", file); if (DECL_LANG_FLAG_0 (node)) fputs (" decl_0", file); if (DECL_LANG_FLAG_1 (node)) @@ -418,28 +453,26 @@ print_node (FILE *file, const char *prefix, tree node, int indent) xloc = expand_location (DECL_SOURCE_LOCATION (node)); - fprintf (file, " file %s line %d", xloc.file, xloc.line); + fprintf (file, " file %s line %d col %d", xloc.file, xloc.line, + xloc.column); if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON)) { print_node (file, "size", DECL_SIZE (node), indent + 4); print_node (file, "unit size", DECL_SIZE_UNIT (node), indent + 4); - if (TREE_CODE (node) != FUNCTION_DECL - || DECL_INLINE (node) || DECL_BUILT_IN (node)) + if (TREE_CODE (node) != FUNCTION_DECL || DECL_BUILT_IN (node)) indent_to (file, indent + 3); - if (TREE_CODE (node) != FUNCTION_DECL) - { - if (DECL_USER_ALIGN (node)) - fprintf (file, " user"); - - fprintf (file, " align %d", DECL_ALIGN (node)); - if (TREE_CODE (node) == FIELD_DECL) - fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED, - DECL_OFFSET_ALIGN (node)); - } - else if (DECL_BUILT_IN (node)) + if (DECL_USER_ALIGN (node)) + fprintf (file, " user"); + + fprintf (file, " align %d", DECL_ALIGN (node)); + if (TREE_CODE (node) == FIELD_DECL) + fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED, + DECL_OFFSET_ALIGN (node)); + + if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN (node)) { if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD) fprintf (file, " built-in BUILT_IN_MD %d", DECL_FUNCTION_CODE (node)); @@ -451,13 +484,16 @@ print_node (FILE *file, const char *prefix, tree node, int indent) if (DECL_POINTER_ALIAS_SET_KNOWN_P (node)) fprintf (file, " alias set " HOST_WIDE_INT_PRINT_DEC, - DECL_POINTER_ALIAS_SET (node)); + (HOST_WIDE_INT) DECL_POINTER_ALIAS_SET (node)); } if (TREE_CODE (node) == FIELD_DECL) { print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4); print_node (file, "bit offset", DECL_FIELD_BIT_OFFSET (node), indent + 4); + if (DECL_BIT_FIELD_TYPE (node)) + print_node (file, "bit_field_type", DECL_BIT_FIELD_TYPE (node), + indent + 4); } print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4); @@ -502,8 +538,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent) && DECL_STRUCT_FUNCTION (node) != 0) { indent_to (file, indent + 4); - fprintf (file, "saved-insns %p", - (void *) DECL_STRUCT_FUNCTION (node)); + dump_addr (file, "saved-insns ", DECL_STRUCT_FUNCTION (node)); } if ((TREE_CODE (node) == VAR_DECL || TREE_CODE (node) == PARM_DECL) @@ -531,9 +566,6 @@ print_node (FILE *file, const char *prefix, tree node, int indent) else if (TREE_CODE (node) == INTEGER_TYPE && TYPE_IS_SIZETYPE (node)) fputs (" sizetype", file); - else if (TREE_CODE (node) == FUNCTION_TYPE - && TYPE_RETURNS_STACK_DEPRESSED (node)) - fputs (" returns-stack-depressed", file); if (TYPE_STRING_FLAG (node)) fputs (" string-flag", file); @@ -581,11 +613,17 @@ print_node (FILE *file, const char *prefix, tree node, int indent) fprintf (file, " align %d symtab %d alias set " HOST_WIDE_INT_PRINT_DEC, TYPE_ALIGN (node), TYPE_SYMTAB_ADDRESS (node), - TYPE_ALIAS_SET (node)); + (HOST_WIDE_INT) TYPE_ALIAS_SET (node)); + if (TYPE_STRUCTURAL_EQUALITY_P (node)) + fprintf (file, " structural equality"); + else + dump_addr (file, " canonical type ", TYPE_CANONICAL (node)); + print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4); - if (INTEGRAL_TYPE_P (node) || TREE_CODE (node) == REAL_TYPE) + if (INTEGRAL_TYPE_P (node) || TREE_CODE (node) == REAL_TYPE + || TREE_CODE (node) == FIXED_POINT_TYPE) { fprintf (file, " precision %d", TYPE_PRECISION (node)); print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4); @@ -635,8 +673,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent) case tcc_binary: case tcc_reference: case tcc_statement: - if (TREE_CODE (node) == BIT_FIELD_REF && BIT_FIELD_REF_UNSIGNED (node)) - fputs (" unsigned", file); + case tcc_vl_exp: if (TREE_CODE (node) == BIND_EXPR) { print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4); @@ -644,17 +681,34 @@ print_node (FILE *file, const char *prefix, tree node, int indent) print_node (file, "block", TREE_OPERAND (node, 2), indent + 4); break; } - - len = TREE_CODE_LENGTH (TREE_CODE (node)); - - for (i = 0; i < len; i++) + if (TREE_CODE (node) == CALL_EXPR) { - char temp[10]; - - sprintf (temp, "arg %d", i); - print_node (file, temp, TREE_OPERAND (node, i), indent + 4); + call_expr_arg_iterator iter; + tree arg; + print_node (file, "fn", CALL_EXPR_FN (node), indent + 4); + print_node (file, "static_chain", CALL_EXPR_STATIC_CHAIN (node), + indent + 4); + i = 0; + FOR_EACH_CALL_EXPR_ARG (arg, iter, node) + { + char temp[10]; + sprintf (temp, "arg %d", i); + print_node (file, temp, arg, indent + 4); + i++; + } } + else + { + len = TREE_OPERAND_LENGTH (node); + for (i = 0; i < len; i++) + { + char temp[10]; + + sprintf (temp, "arg %d", i); + print_node (file, temp, TREE_OPERAND (node, i), indent + 4); + } + } print_node (file, "chain", TREE_CHAIN (node), indent + 4); break; @@ -663,7 +717,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent) switch (TREE_CODE (node)) { case INTEGER_CST: - if (TREE_CONSTANT_OVERFLOW (node)) + if (TREE_OVERFLOW (node)) fprintf (file, " overflow"); fprintf (file, " "); @@ -676,7 +730,8 @@ print_node (FILE *file, const char *prefix, tree node, int indent) -TREE_INT_CST_LOW (node)); else fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX, - TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node)); + (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (node), + (unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (node)); break; case REAL_CST: @@ -688,7 +743,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent) d = TREE_REAL_CST (node); if (REAL_VALUE_ISINF (d)) - fprintf (file, " Inf"); + fprintf (file, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf"); else if (REAL_VALUE_ISNAN (d)) fprintf (file, " Nan"); else @@ -700,6 +755,20 @@ print_node (FILE *file, const char *prefix, tree node, int indent) } break; + case FIXED_CST: + { + FIXED_VALUE_TYPE f; + char string[64]; + + if (TREE_OVERFLOW (node)) + fprintf (file, " overflow"); + + f = TREE_FIXED_CST (node); + fixed_to_decimal (string, &f, sizeof (string)); + fprintf (file, " %s", string); + } + break; + case VECTOR_CST: { tree vals = TREE_VECTOR_CST_ELTS (node); @@ -765,16 +834,32 @@ print_node (FILE *file, const char *prefix, tree node, int indent) } break; + case CONSTRUCTOR: + { + unsigned HOST_WIDE_INT cnt; + tree index, value; + len = VEC_length (constructor_elt, CONSTRUCTOR_ELTS (node)); + fprintf (file, " lngt %d", len); + FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), + cnt, index, value) + { + print_node (file, "idx", index, indent + 4); + print_node (file, "val", value, indent + 4); + } + } + break; + case STATEMENT_LIST: - fprintf (file, " head %p tail %p stmts", - (void *) node->stmt_list.head, (void *) node->stmt_list.tail); + dump_addr (file, " head ", node->stmt_list.head); + dump_addr (file, " tail ", node->stmt_list.tail); + fprintf (file, " stmts"); { tree_stmt_iterator i; for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i)) { /* Not printing the addresses of the (not-a-tree) 'struct tree_stmt_list_node's. */ - fprintf (file, " %p", (void *)tsi_stmt (i)); + dump_addr (file, " ", tsi_stmt (i)); } fprintf (file, "\n"); for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i)) @@ -799,8 +884,8 @@ print_node (FILE *file, const char *prefix, tree node, int indent) case SSA_NAME: print_node_brief (file, "var", SSA_NAME_VAR (node), indent + 4); - print_node_brief (file, "def_stmt", - SSA_NAME_DEF_STMT (node), indent + 4); + fprintf (file, "def_stmt "); + print_gimple_stmt (file, SSA_NAME_DEF_STMT (node), indent + 4, 0); indent_to (file, indent + 4); fprintf (file, "version %u", SSA_NAME_VERSION (node)); @@ -810,18 +895,13 @@ print_node (FILE *file, const char *prefix, tree node, int indent) fprintf (file, " in-free-list"); if (SSA_NAME_PTR_INFO (node) - || SSA_NAME_VALUE (node) - || SSA_NAME_AUX (node)) + || SSA_NAME_VALUE (node)) { indent_to (file, indent + 3); if (SSA_NAME_PTR_INFO (node)) - fprintf (file, " ptr-info %p", - (void *) SSA_NAME_PTR_INFO (node)); + dump_addr (file, " ptr-info ", SSA_NAME_PTR_INFO (node)); if (SSA_NAME_VALUE (node)) - fprintf (file, " value %p", - (void *) SSA_NAME_VALUE (node)); - if (SSA_NAME_AUX (node)) - fprintf (file, " aux %p", SSA_NAME_AUX (node)); + dump_addr (file, " value ", SSA_NAME_VALUE (node)); } break; @@ -839,6 +919,14 @@ print_node (FILE *file, const char *prefix, tree node, int indent) } break; + case OPTIMIZATION_NODE: + cl_optimization_print (file, indent + 4, TREE_OPTIMIZATION (node)); + break; + + case TARGET_OPTION_NODE: + cl_target_option_print (file, indent + 4, TREE_TARGET_OPTION (node)); + break; + default: if (EXCEPTIONAL_CLASS_P (node)) lang_hooks.print_xnode (file, node, indent); @@ -852,7 +940,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent) { expanded_location xloc = expand_location (EXPR_LOCATION (node)); indent_to (file, indent+4); - fprintf (file, "%s:%d", xloc.file, xloc.line); + fprintf (file, "%s:%d:%d", xloc.file, xloc.line, xloc.column); } fprintf (file, ">");