X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-pretty-print.c;h=743e1592e4de08c0dd42e227b414f0920fec86d7;hb=e33f65d4665df285e8b5137ece2a6893458cec96;hp=7eea529f06387fb9dbe9781c90047b26a4aacbfc;hpb=4ee9c6840ad3fc92a9034343278a1e476ad6872a;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c index 7eea529f063..743e1592e4d 100644 --- a/gcc/tree-pretty-print.c +++ b/gcc/tree-pretty-print.c @@ -1,5 +1,5 @@ /* Pretty formatting of GENERIC trees in C syntax. - Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Adapted from c-pretty-print.c by Diego Novillo This file is part of GCC. @@ -31,6 +31,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "tree-flow.h" #include "langhooks.h" #include "tree-iterator.h" +#include "tree-chrec.h" /* Local functions, macros and variables. */ static int op_prio (tree); @@ -52,10 +53,8 @@ static void dump_generic_bb_buff (pretty_printer *, basic_block, int, int); #define PRINT_FUNCTION_NAME(NODE) pp_printf \ (buffer, "%s", TREE_CODE (NODE) == NOP_EXPR ? \ - (*lang_hooks.decl_printable_name) (TREE_OPERAND (NODE, 0), 1) : \ - (*lang_hooks.decl_printable_name) (NODE, 1)) - -#define MASK_POINTER(P) ((unsigned)((unsigned long)(P) & 0xffff)) + lang_hooks.decl_printable_name (TREE_OPERAND (NODE, 0), 1) : \ + lang_hooks.decl_printable_name (NODE, 1)) static pretty_printer buffer; static int initialized = 0; @@ -71,9 +70,9 @@ do_niy (pretty_printer *buffer, tree node) pp_string (buffer, "<<< Unknown tree: "); pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]); - if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (node)))) + if (EXPR_P (node)) { - len = first_rtl_op (TREE_CODE (node)); + len = TREE_CODE_LENGTH (TREE_CODE (node)); for (i = 0; i < len; ++i) { newline_and_indent (buffer, 2); @@ -163,11 +162,88 @@ dump_decl_name (pretty_printer *buffer, tree node, int flags) { if (TREE_CODE (node) == LABEL_DECL && LABEL_DECL_UID (node) != -1) - pp_printf (buffer, "", + pp_printf (buffer, "L." HOST_WIDE_INT_PRINT_DEC, LABEL_DECL_UID (node)); else - pp_printf (buffer, "", DECL_UID (node)); + { + char c = TREE_CODE (node) == CONST_DECL ? 'C' : 'D'; + pp_printf (buffer, "%c.%u", c, DECL_UID (node)); + } + } +} + +/* Like the above, but used for pretty printing function calls. */ + +static void +dump_function_name (pretty_printer *buffer, tree node) +{ + if (DECL_NAME (node)) + PRINT_FUNCTION_NAME (node); + else + dump_decl_name (buffer, node, 0); +} + +/* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and + FLAGS are as in dump_generic_node. */ + +static void +dump_function_declaration (pretty_printer *buffer, tree node, + int spc, int flags) +{ + bool wrote_arg = false; + tree arg; + + pp_space (buffer); + pp_character (buffer, '('); + + /* Print the argument types. The last element in the list is a VOID_TYPE. + The following avoids printing the last element. */ + arg = TYPE_ARG_TYPES (node); + while (arg && TREE_CHAIN (arg) && arg != error_mark_node) + { + wrote_arg = true; + dump_generic_node (buffer, TREE_VALUE (arg), spc, flags, false); + arg = TREE_CHAIN (arg); + if (TREE_CHAIN (arg) && TREE_CODE (TREE_CHAIN (arg)) == TREE_LIST) + { + pp_character (buffer, ','); + pp_space (buffer); + } + } + + if (!wrote_arg) + pp_string (buffer, "void"); + + pp_character (buffer, ')'); +} + +/* Dump the domain associated with an array. */ + +static void +dump_array_domain (pretty_printer *buffer, tree domain, int spc, int flags) +{ + pp_character (buffer, '['); + if (domain) + { + tree min = TYPE_MIN_VALUE (domain); + tree max = TYPE_MAX_VALUE (domain); + + if (min && max + && integer_zerop (min) + && host_integerp (max, 0)) + pp_wide_integer (buffer, TREE_INT_CST_LOW (max) + 1); + else + { + if (min) + dump_generic_node (buffer, min, spc, flags, false); + pp_character (buffer, ':'); + if (max) + dump_generic_node (buffer, max, spc, flags, false); + } } + else + pp_string (buffer, ""); + pp_character (buffer, ']'); } /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of indent. @@ -181,7 +257,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, { tree type; tree op0, op1; - const char* str; + const char *str; bool is_expr; if (node == NULL_TREE) @@ -199,13 +275,14 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, && (flags & TDF_LINENO) && EXPR_HAS_LOCATION (node)) { + expanded_location xloc = expand_location (EXPR_LOCATION (node)); pp_character (buffer, '['); - if (EXPR_FILENAME (node)) + if (xloc.file) { - pp_string (buffer, EXPR_FILENAME (node)); + pp_string (buffer, xloc.file); pp_string (buffer, " : "); } - pp_decimal_int (buffer, EXPR_LINENO (node)); + pp_decimal_int (buffer, xloc.line); pp_string (buffer, "] "); } @@ -237,8 +314,26 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, } break; - case TREE_VEC: + case TREE_BINFO: dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false); + + case TREE_VEC: + { + size_t i; + if (TREE_VEC_LENGTH (node) > 0) + { + size_t len = TREE_VEC_LENGTH (node); + for (i = 0; i < len - 1; i++) + { + dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags, + false); + pp_character (buffer, ','); + pp_space (buffer); + } + dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc, + flags, false); + } + } break; case BLOCK: @@ -255,7 +350,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, case CHAR_TYPE: { unsigned int quals = TYPE_QUALS (node); - char class; + enum tree_code_class class; if (quals & TYPE_QUAL_CONST) pp_string (buffer, "const "); @@ -266,14 +361,14 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, class = TREE_CODE_CLASS (TREE_CODE (node)); - if (class == 'd') + if (class == tcc_declaration) { if (DECL_NAME (node)) dump_decl_name (buffer, node, flags); else pp_string (buffer, ""); } - else if (class == 't') + else if (class == tcc_type) { if (TYPE_NAME (node)) { @@ -283,7 +378,13 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, && DECL_NAME (TYPE_NAME (node))) dump_decl_name (buffer, TYPE_NAME (node), flags); else - pp_string (buffer, ""); + pp_string (buffer, ""); + } + else if (TREE_CODE (node) == VECTOR_TYPE) + { + pp_string (buffer, "vector "); + dump_generic_node (buffer, TREE_TYPE (node), + spc, flags, false); } else pp_string (buffer, ""); @@ -298,6 +399,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE) { tree fnode = TREE_TYPE (node); + dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false); pp_space (buffer); pp_character (buffer, '('); @@ -308,24 +410,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, pp_printf (buffer, "", TYPE_UID (node)); pp_character (buffer, ')'); - pp_space (buffer); - pp_character (buffer, '('); - /* Print the argument types. The last element in the list is a - VOID_TYPE. The following avoid to print the last element. */ - { - tree tmp = TYPE_ARG_TYPES (fnode); - while (tmp && TREE_CHAIN (tmp) && tmp != error_mark_node) - { - dump_generic_node (buffer, TREE_VALUE (tmp), spc, flags, false); - tmp = TREE_CHAIN (tmp); - if (TREE_CHAIN (tmp) && TREE_CODE (TREE_CHAIN (tmp)) == TREE_LIST) - { - pp_character (buffer, ','); - pp_space (buffer); - } - } - } - pp_character (buffer, ')'); + dump_function_declaration (buffer, fnode, spc, flags); } else { @@ -341,6 +426,9 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, pp_string (buffer, "volatile"); else if (quals & TYPE_QUAL_RESTRICT) pp_string (buffer, " restrict"); + + if (TYPE_REF_CAN_ALIAS_ALL (node)) + pp_string (buffer, " {ref-all}"); } break; @@ -353,45 +441,25 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, pp_string (buffer, "::"); break; - case FILE_TYPE: - NIY; - break; - case ARRAY_TYPE: { tree tmp; - /* Print the array type. */ - dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false); + /* Print the innermost component type. */ + for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE; + tmp = TREE_TYPE (tmp)) + ; + dump_generic_node (buffer, tmp, spc, flags, false); /* Print the dimensions. */ - tmp = node; - while (tmp && TREE_CODE (tmp) == ARRAY_TYPE) - { - pp_character (buffer, '['); - if (TYPE_SIZE (tmp)) - { - tree size = TYPE_SIZE (tmp); - if (TREE_CODE (size) == INTEGER_CST) - pp_wide_integer (buffer, - TREE_INT_CST_LOW (TYPE_SIZE (tmp)) / - TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (tmp)))); - else if (TREE_CODE (size) == MULT_EXPR) - dump_generic_node (buffer, TREE_OPERAND (size, 0), spc, flags, false); - /* else punt. */ - } - pp_character (buffer, ']'); - tmp = TREE_TYPE (tmp); - } + for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp)) + dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags); break; } - case SET_TYPE: - NIY; - break; - case RECORD_TYPE: case UNION_TYPE: + case QUAL_UNION_TYPE: /* Print the name of the structure. */ if (TREE_CODE (node) == RECORD_TYPE) pp_string (buffer, "struct "); @@ -404,11 +472,6 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, print_struct_decl (buffer, node, spc, flags); break; - case QUAL_UNION_TYPE: - NIY; - break; - - case LANG_TYPE: NIY; break; @@ -446,9 +509,10 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, if (tree_int_cst_sgn (val) < 0) { pp_character (buffer, '-'); - val = build_int_2 (-TREE_INT_CST_LOW (val), - ~TREE_INT_CST_HIGH (val) - + !TREE_INT_CST_LOW (val)); + val = build_int_cst_wide (NULL_TREE, + -TREE_INT_CST_LOW (val), + ~TREE_INT_CST_HIGH (val) + + !TREE_INT_CST_LOW (val)); } /* Would "%x%0*x" or "%x%*0x" get zero-padding on all systems? */ @@ -544,30 +608,30 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, break; case TYPE_DECL: - if (strcmp (DECL_SOURCE_FILE (node), "") == 0) + if (DECL_IS_BUILTIN (node)) { /* Don't print the declaration of built-in types. */ break; } if (DECL_NAME (node)) - { - dump_decl_name (buffer, node, flags); - } + dump_decl_name (buffer, node, flags); else { - if (TYPE_METHODS (TREE_TYPE (node))) + if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE + || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE) + && TYPE_METHODS (TREE_TYPE (node))) { /* The type is a c++ class: all structures have at least - 4 methods. */ + 4 methods. */ pp_string (buffer, "class "); dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false); } else { - pp_string (buffer, "struct "); + pp_string (buffer, + (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE + ? "union" : "struct ")); dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false); - pp_character (buffer, ';'); - pp_newline (buffer); } } break; @@ -598,6 +662,17 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, pp_character (buffer, ')'); pp_string (buffer, str); dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false); + + if (TREE_CODE (op0) != VALUE_HANDLE) + { + op0 = component_ref_field_offset (node); + if (op0 && TREE_CODE (op0) != INTEGER_CST) + { + pp_string (buffer, "{off: "); + dump_generic_node (buffer, op0, spc, flags, false); + pp_character (buffer, '}'); + } + } break; case BIT_FIELD_REF: @@ -610,11 +685,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, pp_string (buffer, ">"); break; - case BUFFER_REF: - NIY; - break; - case ARRAY_REF: + case ARRAY_RANGE_REF: op0 = TREE_OPERAND (node, 0); if (op_prio (op0) < op_prio (node)) pp_character (buffer, '('); @@ -623,11 +695,23 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, pp_character (buffer, ')'); pp_character (buffer, '['); dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false); + if (TREE_CODE (node) == ARRAY_RANGE_REF) + pp_string (buffer, " ..."); pp_character (buffer, ']'); - break; - case ARRAY_RANGE_REF: - NIY; + op0 = array_ref_low_bound (node); + op1 = array_ref_element_size (node); + + if (!integer_zerop (op0) + || (TYPE_SIZE_UNIT (TREE_TYPE (node)) + && !operand_equal_p (op1, TYPE_SIZE_UNIT (TREE_TYPE (node)), 0))) + { + pp_string (buffer, "{lb: "); + dump_generic_node (buffer, op0, spc, flags, false); + pp_string (buffer, " sz: "); + dump_generic_node (buffer, op1, spc, flags, false); + pp_character (buffer, '}'); + } break; case CONSTRUCTOR: @@ -713,7 +797,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, { tree_stmt_iterator si; bool first = true; - + if ((flags & TDF_SLIM) || !dumping_stmts) { pp_string (buffer, ""); @@ -741,23 +825,32 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, break; case TARGET_EXPR: - dump_generic_node (buffer, TYPE_NAME (TREE_TYPE (node)), spc, flags, false); - pp_character (buffer, '('); + pp_string (buffer, "TARGET_EXPR <"); + dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false); + pp_character (buffer, ','); + pp_space (buffer); dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false); - pp_character (buffer, ')'); + pp_character (buffer, '>'); + break; + + case DECL_EXPR: + print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags); + is_stmt = false; break; case COND_EXPR: - if (TREE_TYPE (node) == void_type_node) + if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node) { pp_string (buffer, "if ("); dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false); pp_character (buffer, ')'); /* The lowered cond_exprs should always be printed in full. */ if (COND_EXPR_THEN (node) - && TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR + && (IS_EMPTY_STMT (COND_EXPR_THEN (node)) + || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR) && COND_EXPR_ELSE (node) - && TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR) + && (IS_EMPTY_STMT (COND_EXPR_ELSE (node)) + || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR)) { pp_space (buffer); dump_generic_node (buffer, COND_EXPR_THEN (node), 0, flags, true); @@ -850,6 +943,8 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, pp_character (buffer, ']'); } + if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (node)) + pp_string (buffer, " [return slot addr]"); if (CALL_EXPR_TAILCALL (node)) pp_string (buffer, " [tail call]"); break; @@ -865,7 +960,9 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, break; case PLACEHOLDER_EXPR: - NIY; + pp_string (buffer, "'); break; /* Binary arithmetic and logic expressions. */ @@ -905,6 +1002,9 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, case UNGT_EXPR: case UNGE_EXPR: case UNEQ_EXPR: + case LTGT_EXPR: + case ORDERED_EXPR: + case UNORDERED_EXPR: { const char *op = op_symbol (node); op0 = TREE_OPERAND (node, 0); @@ -943,9 +1043,10 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, case BIT_NOT_EXPR: case TRUTH_NOT_EXPR: case ADDR_EXPR: - case REFERENCE_EXPR: case PREDECREMENT_EXPR: case PREINCREMENT_EXPR: + case ALIGN_INDIRECT_REF: + case MISALIGNED_INDIRECT_REF: case INDIRECT_REF: if (TREE_CODE (node) == ADDR_EXPR && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST @@ -962,6 +1063,13 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, } else dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false); + + if (TREE_CODE (node) == MISALIGNED_INDIRECT_REF) + { + pp_string (buffer, "{misalignment: "); + dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false); + pp_character (buffer, '}'); + } break; case POSTDECREMENT_EXPR: @@ -999,26 +1107,6 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, pp_character (buffer, '>'); break; - case UNORDERED_EXPR: - NIY; - break; - - case ORDERED_EXPR: - NIY; - break; - - case IN_EXPR: - NIY; - break; - - case SET_LE_EXPR: - NIY; - break; - - case CARD_EXPR: - NIY; - break; - case RANGE_EXPR: NIY; break; @@ -1036,7 +1124,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, { pp_character (buffer, '('); dump_generic_node (buffer, type, spc, flags, false); - pp_string (buffer, ")"); + pp_string (buffer, ") "); } if (op_prio (op0) < op_prio (node)) pp_character (buffer, '('); @@ -1065,20 +1153,6 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, pp_character (buffer, '>'); break; - case UNSAVE_EXPR: - pp_string (buffer, "UNSAVE_EXPR <"); - dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false); - pp_character (buffer, '>'); - break; - - case RTL_EXPR: - NIY; - break; - - case ENTRY_VALUE_EXPR: - NIY; - break; - case COMPLEX_EXPR: pp_string (buffer, "COMPLEX_EXPR <"); dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false); @@ -1158,10 +1232,6 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, is_expr = false; break; - case GOTO_SUBROUTINE_EXPR: - NIY; - break; - case LABEL_EXPR: op0 = TREE_OPERAND (node, 0); /* If this is for break or continue, don't bother printing it. */ @@ -1178,48 +1248,6 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, pp_string (buffer, " [non-local]"); break; - case LABELED_BLOCK_EXPR: - op0 = LABELED_BLOCK_LABEL (node); - /* If this is for break or continue, don't bother printing it. */ - if (DECL_NAME (op0)) - { - const char *name = IDENTIFIER_POINTER (DECL_NAME (op0)); - if (strcmp (name, "break") == 0 - || strcmp (name, "continue") == 0) - { - dump_generic_node (buffer, LABELED_BLOCK_BODY (node), spc, flags, false); - break; - } - } - dump_generic_node (buffer, LABELED_BLOCK_LABEL (node), spc, flags, false); - pp_string (buffer, ": {"); - if (!(flags & TDF_SLIM)) - newline_and_indent (buffer, spc+2); - dump_generic_node (buffer, LABELED_BLOCK_BODY (node), spc+2, flags, true); - if (!flags) - newline_and_indent (buffer, spc); - pp_character (buffer, '}'); - is_expr = false; - break; - - case EXIT_BLOCK_EXPR: - op0 = LABELED_BLOCK_LABEL (EXIT_BLOCK_LABELED_BLOCK (node)); - /* If this is for a break or continue, print it accordingly. */ - if (DECL_NAME (op0)) - { - const char *name = IDENTIFIER_POINTER (DECL_NAME (op0)); - if (strcmp (name, "break") == 0 - || strcmp (name, "continue") == 0) - { - pp_string (buffer, name); - break; - } - } - pp_string (buffer, "<<>>"); - break; - case EXC_PTR_EXPR: pp_string (buffer, "<<>>"); break; @@ -1296,9 +1324,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, case GOTO_EXPR: op0 = GOTO_DESTINATION (node); - if (TREE_CODE (op0) != SSA_NAME - && DECL_P (op0) - && DECL_NAME (op0)) + if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0)) { const char *name = IDENTIFIER_POINTER (DECL_NAME (op0)); if (strcmp (name, "break") == 0 @@ -1353,96 +1379,17 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, pp_character (buffer, ':'); break; - case VTABLE_REF: - pp_string (buffer, "VTABLE_REF <("); - dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false); - pp_string (buffer, "),"); - dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false); - pp_character (buffer, ','); - dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false); + case OBJ_TYPE_REF: + pp_string (buffer, "OBJ_TYPE_REF("); + dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false); + pp_character (buffer, ';'); + dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false); + pp_character (buffer, '-'); pp_character (buffer, '>'); + dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false); + pp_character (buffer, ')'); break; - case EPHI_NODE: - { - int i; - - pp_string (buffer, " EPHI ("); - dump_generic_node (buffer, EREF_NAME (node), spc, flags, false); - pp_string (buffer, ") "); - pp_character (buffer, '['); - pp_string (buffer, " class:"); - pp_decimal_int (buffer, EREF_CLASS (node)); - if (EPHI_DOWNSAFE (node)) - pp_string (buffer, " downsafe"); - if (EPHI_CANT_BE_AVAIL (node)) - pp_string (buffer, " cant_be_avail"); - if (EPHI_STOPS (node)) - pp_string (buffer, " stops"); - pp_string (buffer, " bb:"); - pp_decimal_int (buffer, bb_for_stmt (node)->index); - pp_character (buffer, ']'); - if (! (flags & TDF_SLIM)) - { - pp_string (buffer, " <"); - for (i = 0; i < EPHI_NUM_ARGS (node); i++) - { - if (EPHI_ARG_DEF (node, i)) - { - newline_and_indent (buffer, spc + 2); - pp_string (buffer, " edge "); - pp_decimal_int (buffer, EPHI_ARG_EDGE (node, i)->src->index); - pp_string (buffer, "->"); - pp_decimal_int (buffer, EPHI_ARG_EDGE (node, i)->dest->index); - pp_string (buffer, " [ "); - if (EPHI_ARG_HAS_REAL_USE (node, i)) - pp_string (buffer, " real use"); - if (EPHI_ARG_INJURED (node, i)) - pp_string (buffer, " injured"); - if (EPHI_ARG_STOPS (node, i)) - pp_string (buffer, " stops"); - pp_string (buffer, " ] "); - pp_string (buffer, " defined by:"); - dump_generic_node (buffer, EPHI_ARG_DEF (node, i), - spc + 4, flags | TDF_SLIM, false); - } - } - } - pp_string (buffer, " >"); - } - break; - case EEXIT_NODE: - case EKILL_NODE: - if (TREE_CODE (node) == EEXIT_NODE) - pp_string (buffer, "EEXIT ("); - else if (TREE_CODE (node) == EKILL_NODE) - pp_string (buffer, "EKILL ("); - dump_generic_node (buffer, EREF_NAME (node), spc, flags, false); - pp_string (buffer, ") "); - pp_character (buffer, '['); - pp_string (buffer, "class:"); - pp_decimal_int (buffer, EREF_CLASS (node)); - pp_string (buffer, " bb:"); - pp_decimal_int (buffer, bb_for_stmt (node)->index); - pp_character (buffer, ']'); - break; - case EUSE_NODE: - pp_string (buffer, " EUSE ("); - dump_generic_node (buffer, EREF_NAME (node), spc, flags, false); - - pp_string (buffer, ") "); - pp_character (buffer, '['); - pp_string (buffer, "class:"); - pp_decimal_int (buffer, EREF_CLASS (node)); - pp_string (buffer, " phiop:"); - pp_decimal_int (buffer, EUSE_PHIOP (node)); - pp_string (buffer, " bb:"); - pp_decimal_int (buffer, bb_for_stmt (node)->index); - if (EUSE_LVAL (node)) - pp_string (buffer, " left-occurrence"); - pp_string (buffer, " ]"); - - break; case PHI_NODE: { int i; @@ -1468,6 +1415,56 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, pp_decimal_int (buffer, SSA_NAME_VERSION (node)); break; + case WITH_SIZE_EXPR: + pp_string (buffer, "WITH_SIZE_EXPR <"); + dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false); + pp_string (buffer, ", "); + dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false); + pp_string (buffer, ">"); + break; + + case VALUE_HANDLE: + pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node)); + break; + + case SCEV_KNOWN: + pp_string (buffer, "scev_known"); + break; + + case SCEV_NOT_KNOWN: + pp_string (buffer, "scev_not_known"); + break; + + case POLYNOMIAL_CHREC: + pp_string (buffer, "{"); + dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false); + pp_string (buffer, ", +, "); + dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false); + pp_string (buffer, "}_"); + dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false); + is_stmt = false; + break; + + case REALIGN_LOAD_EXPR: + pp_string (buffer, "REALIGN_LOAD <"); + dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false); + pp_string (buffer, ", "); + dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false); + pp_string (buffer, ", "); + dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false); + pp_string (buffer, ">"); + break; + + case VEC_COND_EXPR: + pp_string (buffer, " VEC_COND_EXPR < "); + dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false); + pp_string (buffer, " , "); + dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false); + pp_string (buffer, " , "); + dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false); + pp_string (buffer, " > "); + break; + default: NIY; } @@ -1484,12 +1481,11 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, static void print_declaration (pretty_printer *buffer, tree t, int spc, int flags) { - /* Don't print type declarations. */ - if (TREE_CODE (t) == TYPE_DECL) - return; - INDENT (spc); + if (TREE_CODE (t) == TYPE_DECL) + pp_string (buffer, "typedef "); + if (DECL_REGISTER (t)) pp_string (buffer, "register "); @@ -1517,21 +1513,17 @@ print_declaration (pretty_printer *buffer, tree t, int spc, int flags) tmp = TREE_TYPE (t); while (TREE_CODE (tmp) == ARRAY_TYPE) { - pp_character (buffer, '['); - if (TYPE_DOMAIN (tmp)) - { - if (TREE_CODE (TYPE_SIZE (tmp)) == INTEGER_CST) - pp_wide_integer (buffer, - TREE_INT_CST_LOW (TYPE_SIZE (tmp)) / - TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (tmp)))); - else - dump_generic_node (buffer, TYPE_SIZE_UNIT (tmp), spc, flags, - false); - } - pp_character (buffer, ']'); + dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags); tmp = TREE_TYPE (tmp); } } + else if (TREE_CODE (t) == FUNCTION_DECL) + { + dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false); + pp_space (buffer); + dump_decl_name (buffer, t, flags); + dump_function_declaration (buffer, TREE_TYPE (t), spc, flags); + } else { /* Print type declaration. */ @@ -1542,6 +1534,14 @@ print_declaration (pretty_printer *buffer, tree t, int spc, int flags) dump_generic_node (buffer, t, spc, flags, false); } + if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t)) + { + pp_string (buffer, " __asm__ "); + pp_character (buffer, '('); + dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false); + pp_character (buffer, ')'); + } + /* The initial value of a function serves to determine wether the function is declared or defined. So the following does not apply to function nodes. */ @@ -1573,10 +1573,10 @@ print_struct_decl (pretty_printer *buffer, tree node, int spc, int flags) INDENT (spc); if (TREE_CODE (node) == RECORD_TYPE) pp_string (buffer, "struct "); - else if (TREE_CODE (node) == UNION_TYPE) + else if ((TREE_CODE (node) == UNION_TYPE + || TREE_CODE (node) == QUAL_UNION_TYPE)) pp_string (buffer, "union "); - else - NIY; + dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false); } @@ -1598,16 +1598,12 @@ print_struct_decl (pretty_printer *buffer, tree node, int spc, int flags) Maybe this could be solved by looking at the scope in which the structure was declared. */ if (TREE_TYPE (tmp) != node - || (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE && - TREE_TYPE (TREE_TYPE (tmp)) != node)) + || (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE + && TREE_TYPE (TREE_TYPE (tmp)) != node)) { print_declaration (buffer, tmp, spc+2, flags); pp_newline (buffer); } - else - { - - } tmp = TREE_CHAIN (tmp); } } @@ -1681,6 +1677,14 @@ op_prio (tree op) case NE_EXPR: return 9; + case UNLT_EXPR: + case UNLE_EXPR: + case UNGT_EXPR: + case UNGE_EXPR: + case UNEQ_EXPR: + case LTGT_EXPR: + case ORDERED_EXPR: + case UNORDERED_EXPR: case LT_EXPR: case LE_EXPR: case GT_EXPR: @@ -1717,6 +1721,8 @@ op_prio (tree op) case PREINCREMENT_EXPR: case PREDECREMENT_EXPR: case NEGATE_EXPR: + case ALIGN_INDIRECT_REF: + case MISALIGNED_INDIRECT_REF: case INDIRECT_REF: case ADDR_EXPR: case FLOAT_EXPR: @@ -1731,6 +1737,7 @@ op_prio (tree op) case CALL_EXPR: case ARRAY_REF: + case ARRAY_RANGE_REF: case COMPONENT_REF: return 15; @@ -1759,8 +1766,7 @@ op_prio (tree op) static const char * op_symbol (tree op) { - if (op == NULL) - abort (); + gcc_assert (op); switch (TREE_CODE (op)) { @@ -1786,28 +1792,41 @@ op_symbol (tree op) case BIT_AND_EXPR: return "&"; + case ORDERED_EXPR: + return "ord"; + case UNORDERED_EXPR: + return "unord"; + case EQ_EXPR: - case UNEQ_EXPR: return "=="; + case UNEQ_EXPR: + return "u=="; case NE_EXPR: return "!="; case LT_EXPR: - case UNLT_EXPR: return "<"; + case UNLT_EXPR: + return "u<"; case LE_EXPR: - case UNLE_EXPR: return "<="; + case UNLE_EXPR: + return "u<="; case GT_EXPR: - case UNGT_EXPR: return ">"; + case UNGT_EXPR: + return "u>"; case GE_EXPR: - case UNGE_EXPR: return ">="; + case UNGE_EXPR: + return "u>="; + + case LTGT_EXPR: + return "<>"; case LSHIFT_EXPR: return "<<"; @@ -1832,19 +1851,39 @@ op_symbol (tree op) case INDIRECT_REF: return "*"; + case ALIGN_INDIRECT_REF: + return "A*"; + + case MISALIGNED_INDIRECT_REF: + return "M*"; + case TRUNC_DIV_EXPR: + case RDIV_EXPR: + return "/"; + case CEIL_DIV_EXPR: + return "/[cl]"; + case FLOOR_DIV_EXPR: + return "/[fl]"; + case ROUND_DIV_EXPR: - case RDIV_EXPR: + return "/[rd]"; + case EXACT_DIV_EXPR: - return "/"; + return "/[ex]"; case TRUNC_MOD_EXPR: + return "%"; + case CEIL_MOD_EXPR: + return "%[cl]"; + case FLOOR_MOD_EXPR: + return "%[fl]"; + case ROUND_MOD_EXPR: - return "%"; + return "%[rd]"; case PREDECREMENT_EXPR: return " --"; @@ -1858,9 +1897,6 @@ op_symbol (tree op) case POSTINCREMENT_EXPR: return "++ "; - case REFERENCE_EXPR: - return ""; - default: return "<<< ??? >>>"; } @@ -1873,8 +1909,7 @@ print_call_name (pretty_printer *buffer, tree node) { tree op0; - if (TREE_CODE (node) != CALL_EXPR) - abort (); + gcc_assert (TREE_CODE (node) == CALL_EXPR); op0 = TREE_OPERAND (node, 0); @@ -1885,7 +1920,7 @@ print_call_name (pretty_printer *buffer, tree node) { case VAR_DECL: case PARM_DECL: - PRINT_FUNCTION_NAME (op0); + dump_function_name (buffer, op0); break; case ADDR_EXPR: @@ -1907,7 +1942,7 @@ print_call_name (pretty_printer *buffer, tree node) /* The function is a pointer contained in a structure. */ if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF || TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL) - PRINT_FUNCTION_NAME (TREE_OPERAND (op0, 1)); + dump_function_name (buffer, TREE_OPERAND (op0, 1)); else dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false); /* else @@ -1918,12 +1953,13 @@ print_call_name (pretty_printer *buffer, tree node) case ARRAY_REF: if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL) - PRINT_FUNCTION_NAME (TREE_OPERAND (op0, 0)); + dump_function_name (buffer, TREE_OPERAND (op0, 0)); else dump_generic_node (buffer, op0, 0, 0, false); break; case SSA_NAME: + case OBJ_TYPE_REF: dump_generic_node (buffer, op0, 0, 0, false); break; @@ -2043,26 +2079,40 @@ newline_and_indent (pretty_printer *buffer, int spc) static void dump_vops (pretty_printer *buffer, tree stmt, int spc, int flags) { - size_t i; - stmt_ann_t ann = stmt_ann (stmt); - vdef_optype vdefs = VDEF_OPS (ann); - vuse_optype vuses = VUSE_OPS (ann); + tree use; + use_operand_p use_p; + def_operand_p def_p; + use_operand_p kill_p; + ssa_op_iter iter; - for (i = 0; i < NUM_VDEFS (vdefs); i++) + FOR_EACH_SSA_MAYDEF_OPERAND (def_p, use_p, stmt, iter) { pp_string (buffer, "# "); - dump_generic_node (buffer, VDEF_RESULT (vdefs, i), spc + 2, flags, false); - pp_string (buffer, " = VDEF <"); - dump_generic_node (buffer, VDEF_OP (vdefs, i), spc + 2, flags, false); + dump_generic_node (buffer, DEF_FROM_PTR (def_p), + spc + 2, flags, false); + pp_string (buffer, " = V_MAY_DEF <"); + dump_generic_node (buffer, USE_FROM_PTR (use_p), + spc + 2, flags, false); pp_string (buffer, ">;"); newline_and_indent (buffer, spc); } - for (i = 0; i < NUM_VUSES (vuses); i++) + FOR_EACH_SSA_MUSTDEF_OPERAND (def_p, kill_p, stmt, iter) + { + pp_string (buffer, "# "); + dump_generic_node (buffer, DEF_FROM_PTR (def_p), + spc + 2, flags, false); + pp_string (buffer, " = V_MUST_DEF <"); + dump_generic_node (buffer, USE_FROM_PTR (kill_p), + spc + 2, flags, false); + pp_string (buffer, ">;"); + newline_and_indent (buffer, spc); + } + + FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_VUSE) { - tree vuse = VUSE_OP (vuses, i); pp_string (buffer, "# VUSE <"); - dump_generic_node (buffer, vuse, spc + 2, flags, false); + dump_generic_node (buffer, use, spc + 2, flags, false); pp_string (buffer, ">;"); newline_and_indent (buffer, spc); } @@ -2088,6 +2138,7 @@ dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags) { edge e; tree stmt; + edge_iterator ei; if (flags & TDF_BLOCKS) { @@ -2111,8 +2162,8 @@ dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags) pp_string (buffer, "# PRED:"); pp_write_text_to_stream (buffer); - for (e = bb->pred; e; e = e->pred_next) - if (flags & TDF_SLIM) + FOR_EACH_EDGE (e, ei, bb->preds) + if (flags & TDF_SLIM) { pp_string (buffer, " "); if (e->src == ENTRY_BLOCK_PTR) @@ -2136,6 +2187,8 @@ dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags) pp_newline (buffer); } } + pp_write_text_to_stream (buffer); + check_bb_profile (bb, buffer->buffer->stream); } /* Dumps end of basic block BB to buffer BUFFER indented by INDENT @@ -2145,11 +2198,12 @@ static void dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags) { edge e; + edge_iterator ei; INDENT (indent); pp_string (buffer, "# SUCC:"); pp_write_text_to_stream (buffer); - for (e = bb->succ; e; e = e->succ_next) + FOR_EACH_EDGE (e, ei, bb->succs) if (flags & TDF_SLIM) { pp_string (buffer, " "); @@ -2173,7 +2227,7 @@ dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags) if (!phi) return; - for (; phi; phi = TREE_CHAIN (phi)) + for (; phi; phi = PHI_CHAIN (phi)) { if (is_gimple_reg (PHI_RESULT (phi)) || (flags & TDF_VOPS)) { @@ -2211,18 +2265,45 @@ pp_cfg_jump (pretty_printer *buffer, basic_block bb) by INDENT spaces, with details given by FLAGS. */ static void -dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent) +dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent, + int flags) { edge e; + edge_iterator ei; /* If there is a fallthru edge, we may need to add an artificial goto to the dump. */ - for (e = bb->succ; e; e = e->succ_next) + FOR_EACH_EDGE (e, ei, bb->succs) if (e->flags & EDGE_FALLTHRU) break; if (e && e->dest != bb->next_bb) { INDENT (indent); + + if ((flags & TDF_LINENO) +#ifdef USE_MAPPED_LOCATION + && e->goto_locus != UNKNOWN_LOCATION +#else + && e->goto_locus +#endif + ) + { + expanded_location goto_xloc; +#ifdef USE_MAPPED_LOCATION + goto_xloc = expand_location (e->goto_locus); +#else + goto_xloc = *e->goto_locus; +#endif + pp_character (buffer, '['); + if (goto_xloc.file) + { + pp_string (buffer, goto_xloc.file); + pp_string (buffer, " : "); + } + pp_decimal_int (buffer, goto_xloc.line); + pp_string (buffer, "] "); + } + pp_cfg_jump (buffer, e->dest); pp_newline (buffer); } @@ -2246,7 +2327,7 @@ dump_generic_bb_buff (pretty_printer *buffer, basic_block bb, if (bb_ann (bb)) dump_phi_nodes (buffer, bb, indent, flags); - + for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) { int curr_indent; @@ -2260,7 +2341,7 @@ dump_generic_bb_buff (pretty_printer *buffer, basic_block bb, pp_newline (buffer); } - dump_implicit_edges (buffer, bb, indent); + dump_implicit_edges (buffer, bb, indent, flags); if (flags & TDF_BLOCKS) dump_bb_end (buffer, bb, indent, flags);