00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023 #include "system.h"
00024 #include "coretypes.h"
00025 #include "tm.h"
00026 #include "errors.h"
00027 #include "tree.h"
00028 #include "diagnostic.h"
00029 #include "real.h"
00030 #include "hashtab.h"
00031 #include "tree-flow.h"
00032 #include "langhooks.h"
00033 #include "tree-iterator.h"
00034 #include "tree-chrec.h"
00035
00036
00037 static int op_prio (tree);
00038 static const char *op_symbol (tree);
00039 static void pretty_print_string (pretty_printer *, const char*);
00040 static void print_call_name (pretty_printer *, tree);
00041 static void newline_and_indent (pretty_printer *, int);
00042 static void maybe_init_pretty_print (FILE *);
00043 static void print_declaration (pretty_printer *, tree, int, int);
00044 static void print_struct_decl (pretty_printer *, tree, int, int);
00045 static void do_niy (pretty_printer *, tree);
00046 static void dump_vops (pretty_printer *, tree, int, int);
00047 static void dump_generic_bb_buff (pretty_printer *, basic_block, int, int);
00048
00049 #define INDENT(SPACE) do { \
00050 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
00051
00052 #define NIY do_niy(buffer,node)
00053
00054 #define PRINT_FUNCTION_NAME(NODE) pp_printf \
00055 (buffer, "%s", TREE_CODE (NODE) == NOP_EXPR ? \
00056 lang_hooks.decl_printable_name (TREE_OPERAND (NODE, 0), 1) : \
00057 lang_hooks.decl_printable_name (NODE, 1))
00058
00059 static pretty_printer buffer;
00060 static int initialized = 0;
00061 static bool dumping_stmts;
00062
00063
00064
00065 static void
00066 do_niy (pretty_printer *buffer, tree node)
00067 {
00068 int i, len;
00069
00070 pp_string (buffer, "<<< Unknown tree: ");
00071 pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
00072
00073 if (EXPR_P (node))
00074 {
00075 len = TREE_CODE_LENGTH (TREE_CODE (node));
00076 for (i = 0; i < len; ++i)
00077 {
00078 newline_and_indent (buffer, 2);
00079 dump_generic_node (buffer, TREE_OPERAND (node, i), 2, 0, false);
00080 }
00081 }
00082
00083 pp_string (buffer, " >>>\n");
00084 }
00085
00086 void
00087 debug_generic_expr (tree t)
00088 {
00089 print_generic_expr (stderr, t, TDF_VOPS|TDF_UID);
00090 fprintf (stderr, "\n");
00091 }
00092
00093 void
00094 debug_generic_stmt (tree t)
00095 {
00096 print_generic_stmt (stderr, t, TDF_VOPS|TDF_UID);
00097 fprintf (stderr, "\n");
00098 }
00099
00100
00101 void
00102 print_generic_decl (FILE *file, tree decl, int flags)
00103 {
00104 maybe_init_pretty_print (file);
00105 dumping_stmts = true;
00106 print_declaration (&buffer, decl, 2, flags);
00107 pp_write_text_to_stream (&buffer);
00108 }
00109
00110
00111
00112
00113 void
00114 print_generic_stmt (FILE *file, tree t, int flags)
00115 {
00116 maybe_init_pretty_print (file);
00117 dumping_stmts = true;
00118 dump_generic_node (&buffer, t, 0, flags, true);
00119 pp_flush (&buffer);
00120 }
00121
00122
00123
00124
00125
00126 void
00127 print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
00128 {
00129 int i;
00130
00131 maybe_init_pretty_print (file);
00132 dumping_stmts = true;
00133
00134 for (i = 0; i < indent; i++)
00135 pp_space (&buffer);
00136 dump_generic_node (&buffer, t, indent, flags, true);
00137 pp_flush (&buffer);
00138 }
00139
00140
00141
00142
00143 void
00144 print_generic_expr (FILE *file, tree t, int flags)
00145 {
00146 maybe_init_pretty_print (file);
00147 dumping_stmts = false;
00148 dump_generic_node (&buffer, t, 0, flags, false);
00149 }
00150
00151
00152
00153
00154 static void
00155 dump_decl_name (pretty_printer *buffer, tree node, int flags)
00156 {
00157 if (DECL_NAME (node))
00158 pp_tree_identifier (buffer, DECL_NAME (node));
00159
00160 if ((flags & TDF_UID)
00161 || DECL_NAME (node) == NULL_TREE)
00162 {
00163 if (TREE_CODE (node) == LABEL_DECL
00164 && LABEL_DECL_UID (node) != -1)
00165 pp_printf (buffer, "L." HOST_WIDE_INT_PRINT_DEC,
00166 LABEL_DECL_UID (node));
00167 else
00168 {
00169 char c = TREE_CODE (node) == CONST_DECL ? 'C' : 'D';
00170 pp_printf (buffer, "%c.%u", c, DECL_UID (node));
00171 }
00172 }
00173 }
00174
00175
00176
00177 static void
00178 dump_function_name (pretty_printer *buffer, tree node)
00179 {
00180 if (DECL_NAME (node))
00181 PRINT_FUNCTION_NAME (node);
00182 else
00183 dump_decl_name (buffer, node, 0);
00184 }
00185
00186
00187
00188
00189 static void
00190 dump_function_declaration (pretty_printer *buffer, tree node,
00191 int spc, int flags)
00192 {
00193 bool wrote_arg = false;
00194 tree arg;
00195
00196 pp_space (buffer);
00197 pp_character (buffer, '(');
00198
00199
00200
00201 arg = TYPE_ARG_TYPES (node);
00202 while (arg && TREE_CHAIN (arg) && arg != error_mark_node)
00203 {
00204 wrote_arg = true;
00205 dump_generic_node (buffer, TREE_VALUE (arg), spc, flags, false);
00206 arg = TREE_CHAIN (arg);
00207 if (TREE_CHAIN (arg) && TREE_CODE (TREE_CHAIN (arg)) == TREE_LIST)
00208 {
00209 pp_character (buffer, ',');
00210 pp_space (buffer);
00211 }
00212 }
00213
00214 if (!wrote_arg)
00215 pp_string (buffer, "void");
00216
00217 pp_character (buffer, ')');
00218 }
00219
00220
00221
00222 static void
00223 dump_array_domain (pretty_printer *buffer, tree domain, int spc, int flags)
00224 {
00225 pp_character (buffer, '[');
00226 if (domain)
00227 {
00228 tree min = TYPE_MIN_VALUE (domain);
00229 tree max = TYPE_MAX_VALUE (domain);
00230
00231 if (min && max
00232 && integer_zerop (min)
00233 && host_integerp (max, 0))
00234 pp_wide_integer (buffer, TREE_INT_CST_LOW (max) + 1);
00235 else
00236 {
00237 if (min)
00238 dump_generic_node (buffer, min, spc, flags, false);
00239 pp_character (buffer, ':');
00240 if (max)
00241 dump_generic_node (buffer, max, spc, flags, false);
00242 }
00243 }
00244 else
00245 pp_string (buffer, "<unknown>");
00246 pp_character (buffer, ']');
00247 }
00248
00249
00250
00251
00252
00253
00254 int
00255 dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
00256 bool is_stmt)
00257 {
00258 tree type;
00259 tree op0, op1;
00260 const char *str;
00261 bool is_expr;
00262
00263 if (node == NULL_TREE)
00264 return spc;
00265
00266 is_expr = EXPR_P (node);
00267
00268 if (TREE_CODE (node) != ERROR_MARK
00269 && is_gimple_stmt (node)
00270 && (flags & TDF_VOPS)
00271 && stmt_ann (node))
00272 dump_vops (buffer, node, spc, flags);
00273
00274 if (dumping_stmts
00275 && (flags & TDF_LINENO)
00276 && EXPR_HAS_LOCATION (node))
00277 {
00278 expanded_location xloc = expand_location (EXPR_LOCATION (node));
00279 pp_character (buffer, '[');
00280 if (xloc.file)
00281 {
00282 pp_string (buffer, xloc.file);
00283 pp_string (buffer, " : ");
00284 }
00285 pp_decimal_int (buffer, xloc.line);
00286 pp_string (buffer, "] ");
00287 }
00288
00289 switch (TREE_CODE (node))
00290 {
00291 case ERROR_MARK:
00292 pp_string (buffer, "<<< error >>>");
00293 break;
00294
00295 case IDENTIFIER_NODE:
00296 pp_tree_identifier (buffer, node);
00297 break;
00298
00299 case TREE_LIST:
00300 while (node && node != error_mark_node)
00301 {
00302 if (TREE_PURPOSE (node))
00303 {
00304 dump_generic_node (buffer, TREE_PURPOSE (node), spc, flags, false);
00305 pp_space (buffer);
00306 }
00307 dump_generic_node (buffer, TREE_VALUE (node), spc, flags, false);
00308 node = TREE_CHAIN (node);
00309 if (node && TREE_CODE (node) == TREE_LIST)
00310 {
00311 pp_character (buffer, ',');
00312 pp_space (buffer);
00313 }
00314 }
00315 break;
00316
00317 case TREE_BINFO:
00318 dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
00319
00320 case TREE_VEC:
00321 {
00322 size_t i;
00323 if (TREE_VEC_LENGTH (node) > 0)
00324 {
00325 size_t len = TREE_VEC_LENGTH (node);
00326 for (i = 0; i < len - 1; i++)
00327 {
00328 dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags,
00329 false);
00330 pp_character (buffer, ',');
00331 pp_space (buffer);
00332 }
00333 dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc,
00334 flags, false);
00335 }
00336 }
00337 break;
00338
00339 case BLOCK:
00340 NIY;
00341 break;
00342
00343 case VOID_TYPE:
00344 case INTEGER_TYPE:
00345 case REAL_TYPE:
00346 case COMPLEX_TYPE:
00347 case VECTOR_TYPE:
00348 case ENUMERAL_TYPE:
00349 case BOOLEAN_TYPE:
00350 case CHAR_TYPE:
00351 {
00352 unsigned int quals = TYPE_QUALS (node);
00353 enum tree_code_class class;
00354
00355 if (quals & TYPE_QUAL_CONST)
00356 pp_string (buffer, "const ");
00357 else if (quals & TYPE_QUAL_VOLATILE)
00358 pp_string (buffer, "volatile ");
00359 else if (quals & TYPE_QUAL_RESTRICT)
00360 pp_string (buffer, "restrict ");
00361
00362 class = TREE_CODE_CLASS (TREE_CODE (node));
00363
00364 if (class == tcc_declaration)
00365 {
00366 if (DECL_NAME (node))
00367 dump_decl_name (buffer, node, flags);
00368 else
00369 pp_string (buffer, "<unnamed type decl>");
00370 }
00371 else if (class == tcc_type)
00372 {
00373 if (TYPE_NAME (node))
00374 {
00375 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
00376 pp_tree_identifier (buffer, TYPE_NAME (node));
00377 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
00378 && DECL_NAME (TYPE_NAME (node)))
00379 dump_decl_name (buffer, TYPE_NAME (node), flags);
00380 else
00381 pp_string (buffer, "<unnamed type>");
00382 }
00383 else if (TREE_CODE (node) == VECTOR_TYPE)
00384 {
00385 pp_string (buffer, "vector ");
00386 dump_generic_node (buffer, TREE_TYPE (node),
00387 spc, flags, false);
00388 }
00389 else
00390 pp_string (buffer, "<unnamed type>");
00391 }
00392 break;
00393 }
00394
00395 case POINTER_TYPE:
00396 case REFERENCE_TYPE:
00397 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
00398
00399 if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
00400 {
00401 tree fnode = TREE_TYPE (node);
00402
00403 dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false);
00404 pp_space (buffer);
00405 pp_character (buffer, '(');
00406 pp_string (buffer, str);
00407 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
00408 dump_decl_name (buffer, TYPE_NAME (node), flags);
00409 else
00410 pp_printf (buffer, "<T%x>", TYPE_UID (node));
00411
00412 pp_character (buffer, ')');
00413 dump_function_declaration (buffer, fnode, spc, flags);
00414 }
00415 else
00416 {
00417 unsigned int quals = TYPE_QUALS (node);
00418
00419 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
00420 pp_space (buffer);
00421 pp_string (buffer, str);
00422
00423 if (quals & TYPE_QUAL_CONST)
00424 pp_string (buffer, " const");
00425 else if (quals & TYPE_QUAL_VOLATILE)
00426 pp_string (buffer, "volatile");
00427 else if (quals & TYPE_QUAL_RESTRICT)
00428 pp_string (buffer, " restrict");
00429
00430 if (TYPE_REF_CAN_ALIAS_ALL (node))
00431 pp_string (buffer, " {ref-all}");
00432 }
00433 break;
00434
00435 case OFFSET_TYPE:
00436 NIY;
00437 break;
00438
00439 case METHOD_TYPE:
00440 dump_decl_name (buffer, TYPE_NAME (TYPE_METHOD_BASETYPE (node)), flags);
00441 pp_string (buffer, "::");
00442 break;
00443
00444 case FILE_TYPE:
00445 NIY;
00446 break;
00447
00448 case ARRAY_TYPE:
00449 {
00450 tree tmp;
00451
00452
00453 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
00454 tmp = TREE_TYPE (tmp))
00455 ;
00456 dump_generic_node (buffer, tmp, spc, flags, false);
00457
00458
00459 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
00460 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
00461 break;
00462 }
00463
00464 case RECORD_TYPE:
00465 case UNION_TYPE:
00466 case QUAL_UNION_TYPE:
00467
00468 if (TREE_CODE (node) == RECORD_TYPE)
00469 pp_string (buffer, "struct ");
00470 else if (TREE_CODE (node) == UNION_TYPE)
00471 pp_string (buffer, "union ");
00472
00473 if (TYPE_NAME (node))
00474 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
00475 else
00476 print_struct_decl (buffer, node, spc, flags);
00477 break;
00478
00479 case LANG_TYPE:
00480 NIY;
00481 break;
00482
00483 case INTEGER_CST:
00484 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
00485 {
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
00507 pp_string (buffer, "B");
00508 }
00509 else if (! host_integerp (node, 0))
00510 {
00511 tree val = node;
00512
00513 if (tree_int_cst_sgn (val) < 0)
00514 {
00515 pp_character (buffer, '-');
00516 val = build_int_cst_wide (NULL_TREE,
00517 -TREE_INT_CST_LOW (val),
00518 ~TREE_INT_CST_HIGH (val)
00519 + !TREE_INT_CST_LOW (val));
00520 }
00521
00522
00523 {
00524 static char format[10];
00525 if (!format[0])
00526 sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
00527 sprintf (pp_buffer (buffer)->digit_buffer, format,
00528 TREE_INT_CST_HIGH (val),
00529 TREE_INT_CST_LOW (val));
00530 pp_string (buffer, pp_buffer (buffer)->digit_buffer);
00531 }
00532 }
00533 else
00534 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
00535 break;
00536
00537 case REAL_CST:
00538
00539 {
00540 REAL_VALUE_TYPE d;
00541 if (TREE_OVERFLOW (node))
00542 pp_string (buffer, " overflow");
00543
00544 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
00545 d = TREE_REAL_CST (node);
00546 if (REAL_VALUE_ISINF (d))
00547 pp_string (buffer, " Inf");
00548 else if (REAL_VALUE_ISNAN (d))
00549 pp_string (buffer, " Nan");
00550 else
00551 {
00552 char string[100];
00553 real_to_decimal (string, &d, sizeof (string), 0, 1);
00554 pp_string (buffer, string);
00555 }
00556 #else
00557 {
00558 HOST_WIDE_INT i;
00559 unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
00560 pp_string (buffer, "0x");
00561 for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
00562 output_formatted_integer (buffer, "%02x", *p++);
00563 }
00564 #endif
00565 break;
00566 }
00567
00568 case COMPLEX_CST:
00569 pp_string (buffer, "__complex__ (");
00570 dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
00571 pp_string (buffer, ", ");
00572 dump_generic_node (buffer, TREE_IMAGPART (node), spc, flags, false);
00573 pp_string (buffer, ")");
00574 break;
00575
00576 case STRING_CST:
00577 pp_string (buffer, "\"");
00578 pretty_print_string (buffer, TREE_STRING_POINTER (node));
00579 pp_string (buffer, "\"");
00580 break;
00581
00582 case VECTOR_CST:
00583 {
00584 tree elt;
00585 pp_string (buffer, "{ ");
00586 for (elt = TREE_VECTOR_CST_ELTS (node); elt; elt = TREE_CHAIN (elt))
00587 {
00588 dump_generic_node (buffer, TREE_VALUE (elt), spc, flags, false);
00589 if (TREE_CHAIN (elt))
00590 pp_string (buffer, ", ");
00591 }
00592 pp_string (buffer, " }");
00593 }
00594 break;
00595
00596 case FUNCTION_TYPE:
00597 break;
00598
00599 case FUNCTION_DECL:
00600 case CONST_DECL:
00601 dump_decl_name (buffer, node, flags);
00602 break;
00603
00604 case LABEL_DECL:
00605 if (DECL_NAME (node))
00606 dump_decl_name (buffer, node, flags);
00607 else if (LABEL_DECL_UID (node) != -1)
00608 pp_printf (buffer, "<L" HOST_WIDE_INT_PRINT_DEC ">",
00609 LABEL_DECL_UID (node));
00610 else
00611 pp_printf (buffer, "<D%u>", DECL_UID (node));
00612 break;
00613
00614 case TYPE_DECL:
00615 if (DECL_IS_BUILTIN (node))
00616 {
00617
00618 break;
00619 }
00620 if (DECL_NAME (node))
00621 dump_decl_name (buffer, node, flags);
00622 else
00623 {
00624 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
00625 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
00626 && TYPE_METHODS (TREE_TYPE (node)))
00627 {
00628
00629
00630 pp_string (buffer, "class ");
00631 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
00632 }
00633 else
00634 {
00635 pp_string (buffer,
00636 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
00637 ? "union" : "struct "));
00638 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
00639 }
00640 }
00641 break;
00642
00643 case VAR_DECL:
00644 case PARM_DECL:
00645 case FIELD_DECL:
00646 case NAMESPACE_DECL:
00647 dump_decl_name (buffer, node, flags);
00648 break;
00649
00650 case RESULT_DECL:
00651 pp_string (buffer, "<retval>");
00652 break;
00653
00654 case COMPONENT_REF:
00655 op0 = TREE_OPERAND (node, 0);
00656 str = ".";
00657 if (TREE_CODE (op0) == INDIRECT_REF)
00658 {
00659 op0 = TREE_OPERAND (op0, 0);
00660 str = "->";
00661 }
00662 if (op_prio (op0) < op_prio (node))
00663 pp_character (buffer, '(');
00664 dump_generic_node (buffer, op0, spc, flags, false);
00665 if (op_prio (op0) < op_prio (node))
00666 pp_character (buffer, ')');
00667 pp_string (buffer, str);
00668 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
00669
00670 if (TREE_CODE (op0) != VALUE_HANDLE)
00671 {
00672 op0 = component_ref_field_offset (node);
00673 if (op0 && TREE_CODE (op0) != INTEGER_CST)
00674 {
00675 pp_string (buffer, "{off: ");
00676 dump_generic_node (buffer, op0, spc, flags, false);
00677 pp_character (buffer, '}');
00678 }
00679 }
00680 break;
00681
00682 case BIT_FIELD_REF:
00683 pp_string (buffer, "BIT_FIELD_REF <");
00684 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
00685 pp_string (buffer, ", ");
00686 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
00687 pp_string (buffer, ", ");
00688 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
00689 pp_string (buffer, ">");
00690 break;
00691
00692 case ARRAY_REF:
00693 case ARRAY_RANGE_REF:
00694 op0 = TREE_OPERAND (node, 0);
00695 if (op_prio (op0) < op_prio (node))
00696 pp_character (buffer, '(');
00697 dump_generic_node (buffer, op0, spc, flags, false);
00698 if (op_prio (op0) < op_prio (node))
00699 pp_character (buffer, ')');
00700 pp_character (buffer, '[');
00701 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
00702 if (TREE_CODE (node) == ARRAY_RANGE_REF)
00703 pp_string (buffer, " ...");
00704 pp_character (buffer, ']');
00705
00706 op0 = array_ref_low_bound (node);
00707 op1 = array_ref_element_size (node);
00708
00709 if (!integer_zerop (op0)
00710 || (TYPE_SIZE_UNIT (TREE_TYPE (node))
00711 && !operand_equal_p (op1, TYPE_SIZE_UNIT (TREE_TYPE (node)), 0)))
00712 {
00713 pp_string (buffer, "{lb: ");
00714 dump_generic_node (buffer, op0, spc, flags, false);
00715 pp_string (buffer, " sz: ");
00716 dump_generic_node (buffer, op1, spc, flags, false);
00717 pp_character (buffer, '}');
00718 }
00719 break;
00720
00721 case CONSTRUCTOR:
00722 {
00723 tree lnode;
00724 bool is_struct_init = FALSE;
00725 pp_character (buffer, '{');
00726 lnode = CONSTRUCTOR_ELTS (node);
00727 if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
00728 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
00729 is_struct_init = TRUE;
00730 while (lnode && lnode != error_mark_node)
00731 {
00732 tree val;
00733 if (TREE_PURPOSE (lnode) && is_struct_init)
00734 {
00735 pp_character (buffer, '.');
00736 dump_generic_node (buffer, TREE_PURPOSE (lnode), spc, flags, false);
00737 pp_string (buffer, "=");
00738 }
00739 val = TREE_VALUE (lnode);
00740 if (val && TREE_CODE (val) == ADDR_EXPR)
00741 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
00742 val = TREE_OPERAND (val, 0);
00743 if (val && TREE_CODE (val) == FUNCTION_DECL)
00744 {
00745 dump_decl_name (buffer, val, flags);
00746 }
00747 else
00748 {
00749 dump_generic_node (buffer, TREE_VALUE (lnode), spc, flags, false);
00750 }
00751 lnode = TREE_CHAIN (lnode);
00752 if (lnode && TREE_CODE (lnode) == TREE_LIST)
00753 {
00754 pp_character (buffer, ',');
00755 pp_space (buffer);
00756 }
00757 }
00758 pp_character (buffer, '}');
00759 }
00760 break;
00761
00762 case COMPOUND_EXPR:
00763 {
00764 tree *tp;
00765 if (flags & TDF_SLIM)
00766 {
00767 pp_string (buffer, "<COMPOUND_EXPR>");
00768 break;
00769 }
00770
00771 dump_generic_node (buffer, TREE_OPERAND (node, 0),
00772 spc, flags, dumping_stmts);
00773 if (dumping_stmts)
00774 newline_and_indent (buffer, spc);
00775 else
00776 {
00777 pp_character (buffer, ',');
00778 pp_space (buffer);
00779 }
00780
00781 for (tp = &TREE_OPERAND (node, 1);
00782 TREE_CODE (*tp) == COMPOUND_EXPR;
00783 tp = &TREE_OPERAND (*tp, 1))
00784 {
00785 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
00786 spc, flags, dumping_stmts);
00787 if (dumping_stmts)
00788 newline_and_indent (buffer, spc);
00789 else
00790 {
00791 pp_character (buffer, ',');
00792 pp_space (buffer);
00793 }
00794 }
00795
00796 dump_generic_node (buffer, *tp, spc, flags, dumping_stmts);
00797 }
00798 break;
00799
00800 case STATEMENT_LIST:
00801 {
00802 tree_stmt_iterator si;
00803 bool first = true;
00804
00805 if ((flags & TDF_SLIM) || !dumping_stmts)
00806 {
00807 pp_string (buffer, "<STATEMENT_LIST>");
00808 break;
00809 }
00810
00811 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
00812 {
00813 if (!first)
00814 newline_and_indent (buffer, spc);
00815 else
00816 first = false;
00817 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
00818 }
00819 }
00820 break;
00821
00822 case MODIFY_EXPR:
00823 case INIT_EXPR:
00824 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
00825 pp_space (buffer);
00826 pp_character (buffer, '=');
00827 pp_space (buffer);
00828 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
00829 break;
00830
00831 case TARGET_EXPR:
00832 pp_string (buffer, "TARGET_EXPR <");
00833 dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false);
00834 pp_character (buffer, ',');
00835 pp_space (buffer);
00836 dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false);
00837 pp_character (buffer, '>');
00838 break;
00839
00840 case DECL_EXPR:
00841 print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags);
00842 is_stmt = false;
00843 break;
00844
00845 case COND_EXPR:
00846 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
00847 {
00848 pp_string (buffer, "if (");
00849 dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false);
00850 pp_character (buffer, ')');
00851
00852 if (COND_EXPR_THEN (node)
00853 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
00854 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
00855 && COND_EXPR_ELSE (node)
00856 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
00857 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
00858 {
00859 pp_space (buffer);
00860 dump_generic_node (buffer, COND_EXPR_THEN (node), 0, flags, true);
00861 pp_string (buffer, " else ");
00862 dump_generic_node (buffer, COND_EXPR_ELSE (node), 0, flags, true);
00863 }
00864 else if (!(flags & TDF_SLIM))
00865 {
00866
00867 if (COND_EXPR_THEN (node))
00868 {
00869 newline_and_indent (buffer, spc+2);
00870 pp_character (buffer, '{');
00871 newline_and_indent (buffer, spc+4);
00872 dump_generic_node (buffer, COND_EXPR_THEN (node), spc+4,
00873 flags, true);
00874 newline_and_indent (buffer, spc+2);
00875 pp_character (buffer, '}');
00876 }
00877
00878
00879 if (COND_EXPR_ELSE (node))
00880 {
00881 newline_and_indent (buffer, spc);
00882 pp_string (buffer, "else");
00883 newline_and_indent (buffer, spc+2);
00884 pp_character (buffer, '{');
00885 newline_and_indent (buffer, spc+4);
00886 dump_generic_node (buffer, COND_EXPR_ELSE (node), spc+4,
00887 flags, true);
00888 newline_and_indent (buffer, spc+2);
00889 pp_character (buffer, '}');
00890 }
00891 }
00892 is_expr = false;
00893 }
00894 else
00895 {
00896 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
00897 pp_space (buffer);
00898 pp_character (buffer, '?');
00899 pp_space (buffer);
00900 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
00901 pp_space (buffer);
00902 pp_character (buffer, ':');
00903 pp_space (buffer);
00904 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
00905 }
00906 break;
00907
00908 case BIND_EXPR:
00909 pp_character (buffer, '{');
00910 if (!(flags & TDF_SLIM))
00911 {
00912 if (BIND_EXPR_VARS (node))
00913 {
00914 pp_newline (buffer);
00915
00916 for (op0 = BIND_EXPR_VARS (node); op0; op0 = TREE_CHAIN (op0))
00917 {
00918 print_declaration (buffer, op0, spc+2, flags);
00919 pp_newline (buffer);
00920 }
00921 }
00922
00923 newline_and_indent (buffer, spc+2);
00924 dump_generic_node (buffer, BIND_EXPR_BODY (node), spc+2, flags, true);
00925 newline_and_indent (buffer, spc);
00926 pp_character (buffer, '}');
00927 }
00928 is_expr = false;
00929 break;
00930
00931 case CALL_EXPR:
00932 print_call_name (buffer, node);
00933
00934
00935 pp_space (buffer);
00936 pp_character (buffer, '(');
00937 op1 = TREE_OPERAND (node, 1);
00938 if (op1)
00939 dump_generic_node (buffer, op1, spc, flags, false);
00940 pp_character (buffer, ')');
00941
00942 op1 = TREE_OPERAND (node, 2);
00943 if (op1)
00944 {
00945 pp_string (buffer, " [static-chain: ");
00946 dump_generic_node (buffer, op1, spc, flags, false);
00947 pp_character (buffer, ']');
00948 }
00949
00950 if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (node))
00951 pp_string (buffer, " [return slot addr]");
00952 if (CALL_EXPR_TAILCALL (node))
00953 pp_string (buffer, " [tail call]");
00954 break;
00955
00956 case WITH_CLEANUP_EXPR:
00957 NIY;
00958 break;
00959
00960 case CLEANUP_POINT_EXPR:
00961 pp_string (buffer, "<<cleanup_point ");
00962 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
00963 pp_string (buffer, ">>");
00964 break;
00965
00966 case PLACEHOLDER_EXPR:
00967 pp_string (buffer, "<PLACEHOLDER_EXPR ");
00968 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
00969 pp_character (buffer, '>');
00970 break;
00971
00972
00973 case MULT_EXPR:
00974 case PLUS_EXPR:
00975 case MINUS_EXPR:
00976 case TRUNC_DIV_EXPR:
00977 case CEIL_DIV_EXPR:
00978 case FLOOR_DIV_EXPR:
00979 case ROUND_DIV_EXPR:
00980 case TRUNC_MOD_EXPR:
00981 case CEIL_MOD_EXPR:
00982 case FLOOR_MOD_EXPR:
00983 case ROUND_MOD_EXPR:
00984 case RDIV_EXPR:
00985 case EXACT_DIV_EXPR:
00986 case LSHIFT_EXPR:
00987 case RSHIFT_EXPR:
00988 case LROTATE_EXPR:
00989 case RROTATE_EXPR:
00990 case BIT_IOR_EXPR:
00991 case BIT_XOR_EXPR:
00992 case BIT_AND_EXPR:
00993 case TRUTH_ANDIF_EXPR:
00994 case TRUTH_ORIF_EXPR:
00995 case TRUTH_AND_EXPR:
00996 case TRUTH_OR_EXPR:
00997 case TRUTH_XOR_EXPR:
00998 case LT_EXPR:
00999 case LE_EXPR:
01000 case GT_EXPR:
01001 case GE_EXPR:
01002 case EQ_EXPR:
01003 case NE_EXPR:
01004 case UNLT_EXPR:
01005 case UNLE_EXPR:
01006 case UNGT_EXPR:
01007 case UNGE_EXPR:
01008 case UNEQ_EXPR:
01009 case LTGT_EXPR:
01010 case ORDERED_EXPR:
01011 case UNORDERED_EXPR:
01012 {
01013 const char *op = op_symbol (node);
01014 op0 = TREE_OPERAND (node, 0);
01015 op1 = TREE_OPERAND (node, 1);
01016
01017
01018
01019 if (op_prio (op0) < op_prio (node))
01020 {
01021 pp_character (buffer, '(');
01022 dump_generic_node (buffer, op0, spc, flags, false);
01023 pp_character (buffer, ')');
01024 }
01025 else
01026 dump_generic_node (buffer, op0, spc, flags, false);
01027
01028 pp_space (buffer);
01029 pp_string (buffer, op);
01030 pp_space (buffer);
01031
01032
01033
01034 if (op_prio (op1) < op_prio (node))
01035 {
01036 pp_character (buffer, '(');
01037 dump_generic_node (buffer, op1, spc, flags, false);
01038 pp_character (buffer, ')');
01039 }
01040 else
01041 dump_generic_node (buffer, op1, spc, flags, false);
01042 }
01043 break;
01044
01045
01046 case NEGATE_EXPR:
01047 case BIT_NOT_EXPR:
01048 case TRUTH_NOT_EXPR:
01049 case ADDR_EXPR:
01050 case PREDECREMENT_EXPR:
01051 case PREINCREMENT_EXPR:
01052 case ALIGN_INDIRECT_REF:
01053 case MISALIGNED_INDIRECT_REF:
01054 case INDIRECT_REF:
01055 if (TREE_CODE (node) == ADDR_EXPR
01056 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
01057 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
01058 ;
01059 else
01060 pp_string (buffer, op_symbol (node));
01061
01062 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
01063 {
01064 pp_character (buffer, '(');
01065 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01066 pp_character (buffer, ')');
01067 }
01068 else
01069 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01070
01071 if (TREE_CODE (node) == MISALIGNED_INDIRECT_REF)
01072 {
01073 pp_string (buffer, "{misalignment: ");
01074 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
01075 pp_character (buffer, '}');
01076 }
01077 break;
01078
01079 case POSTDECREMENT_EXPR:
01080 case POSTINCREMENT_EXPR:
01081 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
01082 {
01083 pp_character (buffer, '(');
01084 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01085 pp_character (buffer, ')');
01086 }
01087 else
01088 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01089 pp_string (buffer, op_symbol (node));
01090 break;
01091
01092 case MIN_EXPR:
01093 pp_string (buffer, "MIN_EXPR <");
01094 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01095 pp_string (buffer, ", ");
01096 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
01097 pp_character (buffer, '>');
01098 break;
01099
01100 case MAX_EXPR:
01101 pp_string (buffer, "MAX_EXPR <");
01102 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01103 pp_string (buffer, ", ");
01104 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
01105 pp_character (buffer, '>');
01106 break;
01107
01108 case ABS_EXPR:
01109 pp_string (buffer, "ABS_EXPR <");
01110 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01111 pp_character (buffer, '>');
01112 break;
01113
01114 case RANGE_EXPR:
01115 NIY;
01116 break;
01117
01118 case FIX_TRUNC_EXPR:
01119 case FIX_CEIL_EXPR:
01120 case FIX_FLOOR_EXPR:
01121 case FIX_ROUND_EXPR:
01122 case FLOAT_EXPR:
01123 case CONVERT_EXPR:
01124 case NOP_EXPR:
01125 type = TREE_TYPE (node);
01126 op0 = TREE_OPERAND (node, 0);
01127 if (type != TREE_TYPE (op0))
01128 {
01129 pp_character (buffer, '(');
01130 dump_generic_node (buffer, type, spc, flags, false);
01131 pp_string (buffer, ") ");
01132 }
01133 if (op_prio (op0) < op_prio (node))
01134 pp_character (buffer, '(');
01135 dump_generic_node (buffer, op0, spc, flags, false);
01136 if (op_prio (op0) < op_prio (node))
01137 pp_character (buffer, ')');
01138 break;
01139
01140 case VIEW_CONVERT_EXPR:
01141 pp_string (buffer, "VIEW_CONVERT_EXPR<");
01142 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
01143 pp_string (buffer, ">(");
01144 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01145 pp_character (buffer, ')');
01146 break;
01147
01148 case NON_LVALUE_EXPR:
01149 pp_string (buffer, "NON_LVALUE_EXPR <");
01150 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01151 pp_character (buffer, '>');
01152 break;
01153
01154 case SAVE_EXPR:
01155 pp_string (buffer, "SAVE_EXPR <");
01156 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01157 pp_character (buffer, '>');
01158 break;
01159
01160 case COMPLEX_EXPR:
01161 pp_string (buffer, "COMPLEX_EXPR <");
01162 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01163 pp_string (buffer, ", ");
01164 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
01165 pp_string (buffer, ">");
01166 break;
01167
01168 case CONJ_EXPR:
01169 pp_string (buffer, "CONJ_EXPR <");
01170 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01171 pp_string (buffer, ">");
01172 break;
01173
01174 case REALPART_EXPR:
01175 pp_string (buffer, "REALPART_EXPR <");
01176 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01177 pp_string (buffer, ">");
01178 break;
01179
01180 case IMAGPART_EXPR:
01181 pp_string (buffer, "IMAGPART_EXPR <");
01182 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01183 pp_string (buffer, ">");
01184 break;
01185
01186 case VA_ARG_EXPR:
01187 pp_string (buffer, "VA_ARG_EXPR <");
01188 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01189 pp_string (buffer, ">");
01190 break;
01191
01192 case TRY_FINALLY_EXPR:
01193 case TRY_CATCH_EXPR:
01194 pp_string (buffer, "try");
01195 newline_and_indent (buffer, spc+2);
01196 pp_string (buffer, "{");
01197 newline_and_indent (buffer, spc+4);
01198 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc+4, flags, true);
01199 newline_and_indent (buffer, spc+2);
01200 pp_string (buffer, "}");
01201 newline_and_indent (buffer, spc);
01202 pp_string (buffer,
01203 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
01204 newline_and_indent (buffer, spc+2);
01205 pp_string (buffer, "{");
01206 newline_and_indent (buffer, spc+4);
01207 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
01208 newline_and_indent (buffer, spc+2);
01209 pp_string (buffer, "}");
01210 is_expr = false;
01211 break;
01212
01213 case CATCH_EXPR:
01214 pp_string (buffer, "catch (");
01215 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
01216 pp_string (buffer, ")");
01217 newline_and_indent (buffer, spc+2);
01218 pp_string (buffer, "{");
01219 newline_and_indent (buffer, spc+4);
01220 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
01221 newline_and_indent (buffer, spc+2);
01222 pp_string (buffer, "}");
01223 is_expr = false;
01224 break;
01225
01226 case EH_FILTER_EXPR:
01227 pp_string (buffer, "<<<eh_filter (");
01228 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
01229 pp_string (buffer, ")>>>");
01230 newline_and_indent (buffer, spc+2);
01231 pp_string (buffer, "{");
01232 newline_and_indent (buffer, spc+4);
01233 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
01234 newline_and_indent (buffer, spc+2);
01235 pp_string (buffer, "}");
01236 is_expr = false;
01237 break;
01238
01239 case LABEL_EXPR:
01240 op0 = TREE_OPERAND (node, 0);
01241
01242 if (DECL_NAME (op0))
01243 {
01244 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
01245 if (strcmp (name, "break") == 0
01246 || strcmp (name, "continue") == 0)
01247 break;
01248 }
01249 dump_generic_node (buffer, op0, spc, flags, false);
01250 pp_character (buffer, ':');
01251 if (DECL_NONLOCAL (op0))
01252 pp_string (buffer, " [non-local]");
01253 break;
01254
01255 case EXC_PTR_EXPR:
01256 pp_string (buffer, "<<<exception object>>>");
01257 break;
01258
01259 case FILTER_EXPR:
01260 pp_string (buffer, "<<<filter object>>>");
01261 break;
01262
01263 case LOOP_EXPR:
01264 pp_string (buffer, "while (1)");
01265 if (!(flags & TDF_SLIM))
01266 {
01267 newline_and_indent (buffer, spc+2);
01268 pp_character (buffer, '{');
01269 newline_and_indent (buffer, spc+4);
01270 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
01271 newline_and_indent (buffer, spc+2);
01272 pp_character (buffer, '}');
01273 }
01274 is_expr = false;
01275 break;
01276
01277 case RETURN_EXPR:
01278 pp_string (buffer, "return");
01279 op0 = TREE_OPERAND (node, 0);
01280 if (op0)
01281 {
01282 pp_space (buffer);
01283 if (TREE_CODE (op0) == MODIFY_EXPR)
01284 dump_generic_node (buffer, TREE_OPERAND (op0, 1), spc, flags, false);
01285 else
01286 dump_generic_node (buffer, op0, spc, flags, false);
01287 }
01288 break;
01289
01290 case EXIT_EXPR:
01291 pp_string (buffer, "if (");
01292 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01293 pp_string (buffer, ") break");
01294 break;
01295
01296 case SWITCH_EXPR:
01297 pp_string (buffer, "switch (");
01298 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
01299 pp_character (buffer, ')');
01300 if (!(flags & TDF_SLIM))
01301 {
01302 newline_and_indent (buffer, spc+2);
01303 pp_character (buffer, '{');
01304 if (SWITCH_BODY (node))
01305 {
01306 newline_and_indent (buffer, spc+4);
01307 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags, true);
01308 }
01309 else
01310 {
01311 tree vec = SWITCH_LABELS (node);
01312 size_t i, n = TREE_VEC_LENGTH (vec);
01313 for (i = 0; i < n; ++i)
01314 {
01315 tree elt = TREE_VEC_ELT (vec, i);
01316 newline_and_indent (buffer, spc+4);
01317 dump_generic_node (buffer, elt, spc+4, flags, false);
01318 pp_string (buffer, " goto ");
01319 dump_generic_node (buffer, CASE_LABEL (elt), spc+4, flags, true);
01320 pp_semicolon (buffer);
01321 }
01322 }
01323 newline_and_indent (buffer, spc+2);
01324 pp_character (buffer, '}');
01325 }
01326 is_expr = false;
01327 break;
01328
01329 case GOTO_EXPR:
01330 op0 = GOTO_DESTINATION (node);
01331 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
01332 {
01333 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
01334 if (strcmp (name, "break") == 0
01335 || strcmp (name, "continue") == 0)
01336 {
01337 pp_string (buffer, name);
01338 break;
01339 }
01340 }
01341 pp_string (buffer, "goto ");
01342 dump_generic_node (buffer, op0, spc, flags, false);
01343 break;
01344
01345 case RESX_EXPR:
01346 pp_string (buffer, "resx");
01347
01348 break;
01349
01350 case ASM_EXPR:
01351 pp_string (buffer, "__asm__");
01352 if (ASM_VOLATILE_P (node))
01353 pp_string (buffer, " __volatile__");
01354 pp_character (buffer, '(');
01355 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
01356 pp_character (buffer, ':');
01357 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
01358 pp_character (buffer, ':');
01359 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
01360 if (ASM_CLOBBERS (node))
01361 {
01362 pp_character (buffer, ':');
01363 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
01364 }
01365 pp_string (buffer, ")");
01366 break;
01367
01368 case CASE_LABEL_EXPR:
01369 if (CASE_LOW (node) && CASE_HIGH (node))
01370 {
01371 pp_string (buffer, "case ");
01372 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
01373 pp_string (buffer, " ... ");
01374 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
01375 }
01376 else if (CASE_LOW (node))
01377 {
01378 pp_string (buffer, "case ");
01379 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
01380 }
01381 else
01382 pp_string (buffer, "default ");
01383 pp_character (buffer, ':');
01384 break;
01385
01386 case OBJ_TYPE_REF:
01387 pp_string (buffer, "OBJ_TYPE_REF(");
01388 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
01389 pp_character (buffer, ';');
01390 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
01391 pp_character (buffer, '-');
01392 pp_character (buffer, '>');
01393 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
01394 pp_character (buffer, ')');
01395 break;
01396
01397 case PHI_NODE:
01398 {
01399 int i;
01400
01401 dump_generic_node (buffer, PHI_RESULT (node), spc, flags, false);
01402 pp_string (buffer, " = PHI <");
01403 for (i = 0; i < PHI_NUM_ARGS (node); i++)
01404 {
01405 dump_generic_node (buffer, PHI_ARG_DEF (node, i), spc, flags, false);
01406 pp_string (buffer, "(");
01407 pp_decimal_int (buffer, PHI_ARG_EDGE (node, i)->src->index);
01408 pp_string (buffer, ")");
01409 if (i < PHI_NUM_ARGS (node) - 1)
01410 pp_string (buffer, ", ");
01411 }
01412 pp_string (buffer, ">;");
01413 }
01414 break;
01415
01416 case SSA_NAME:
01417 dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
01418 pp_string (buffer, "_");
01419 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
01420 break;
01421
01422 case WITH_SIZE_EXPR:
01423 pp_string (buffer, "WITH_SIZE_EXPR <");
01424 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01425 pp_string (buffer, ", ");
01426 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
01427 pp_string (buffer, ">");
01428 break;
01429
01430 case VALUE_HANDLE:
01431 pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node));
01432 break;
01433
01434 case SCEV_KNOWN:
01435 pp_string (buffer, "scev_known");
01436 break;
01437
01438 case SCEV_NOT_KNOWN:
01439 pp_string (buffer, "scev_not_known");
01440 break;
01441
01442 case POLYNOMIAL_CHREC:
01443 pp_string (buffer, "{");
01444 dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
01445 pp_string (buffer, ", +, ");
01446 dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
01447 pp_string (buffer, "}_");
01448 dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
01449 is_stmt = false;
01450 break;
01451
01452 case REALIGN_LOAD_EXPR:
01453 pp_string (buffer, "REALIGN_LOAD <");
01454 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01455 pp_string (buffer, ", ");
01456 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
01457 pp_string (buffer, ", ");
01458 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
01459 pp_string (buffer, ">");
01460 break;
01461
01462 case VEC_COND_EXPR:
01463 pp_string (buffer, " VEC_COND_EXPR < ");
01464 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
01465 pp_string (buffer, " , ");
01466 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
01467 pp_string (buffer, " , ");
01468 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
01469 pp_string (buffer, " > ");
01470 break;
01471
01472 default:
01473 NIY;
01474 }
01475
01476 if (is_stmt && is_expr)
01477 pp_semicolon (buffer);
01478 pp_write_text_to_stream (buffer);
01479
01480 return spc;
01481 }
01482
01483
01484
01485 static void
01486 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
01487 {
01488 INDENT (spc);
01489
01490 if (TREE_CODE (t) == TYPE_DECL)
01491 pp_string (buffer, "typedef ");
01492
01493 if (DECL_REGISTER (t))
01494 pp_string (buffer, "register ");
01495
01496 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
01497 pp_string (buffer, "extern ");
01498 else if (TREE_STATIC (t))
01499 pp_string (buffer, "static ");
01500
01501
01502 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
01503 {
01504 tree tmp;
01505
01506
01507 tmp = TREE_TYPE (t);
01508 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
01509 tmp = TREE_TYPE (tmp);
01510 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
01511
01512
01513 pp_space (buffer);
01514 dump_generic_node (buffer, t, spc, flags, false);
01515
01516
01517 tmp = TREE_TYPE (t);
01518 while (TREE_CODE (tmp) == ARRAY_TYPE)
01519 {
01520 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
01521 tmp = TREE_TYPE (tmp);
01522 }
01523 }
01524 else if (TREE_CODE (t) == FUNCTION_DECL)
01525 {
01526 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
01527 pp_space (buffer);
01528 dump_decl_name (buffer, t, flags);
01529 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
01530 }
01531 else
01532 {
01533
01534 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
01535
01536
01537 pp_space (buffer);
01538 dump_generic_node (buffer, t, spc, flags, false);
01539 }
01540
01541 if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
01542 {
01543 pp_string (buffer, " __asm__ ");
01544 pp_character (buffer, '(');
01545 dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
01546 pp_character (buffer, ')');
01547 }
01548
01549
01550
01551
01552 if (TREE_CODE (t) != FUNCTION_DECL)
01553 {
01554
01555 if (DECL_INITIAL (t))
01556 {
01557 pp_space (buffer);
01558 pp_character (buffer, '=');
01559 pp_space (buffer);
01560 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
01561 }
01562 }
01563
01564 pp_character (buffer, ';');
01565 }
01566
01567
01568
01569
01570
01571 static void
01572 print_struct_decl (pretty_printer *buffer, tree node, int spc, int flags)
01573 {
01574
01575 if (TYPE_NAME (node))
01576 {
01577 INDENT (spc);
01578 if (TREE_CODE (node) == RECORD_TYPE)
01579 pp_string (buffer, "struct ");
01580 else if ((TREE_CODE (node) == UNION_TYPE
01581 || TREE_CODE (node) == QUAL_UNION_TYPE))
01582 pp_string (buffer, "union ");
01583
01584 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
01585 }
01586
01587
01588 pp_newline (buffer);
01589 INDENT (spc);
01590 pp_character (buffer, '{');
01591 pp_newline (buffer);
01592
01593
01594 {
01595 tree tmp;
01596 tmp = TYPE_FIELDS (node);
01597 while (tmp)
01598 {
01599
01600
01601
01602
01603
01604 if (TREE_TYPE (tmp) != node
01605 || (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
01606 && TREE_TYPE (TREE_TYPE (tmp)) != node))
01607 {
01608 print_declaration (buffer, tmp, spc+2, flags);
01609 pp_newline (buffer);
01610 }
01611 tmp = TREE_CHAIN (tmp);
01612 }
01613 }
01614 INDENT (spc);
01615 pp_character (buffer, '}');
01616 }
01617
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628
01629
01630
01631
01632
01633
01634
01635
01636
01637
01638
01639
01640
01641
01642 static int
01643 op_prio (tree op)
01644 {
01645 if (op == NULL)
01646 return 9999;
01647
01648 switch (TREE_CODE (op))
01649 {
01650 case TREE_LIST:
01651 case COMPOUND_EXPR:
01652 case BIND_EXPR:
01653 return 1;
01654
01655 case MODIFY_EXPR:
01656 case INIT_EXPR:
01657 return 2;
01658
01659 case COND_EXPR:
01660 return 3;
01661
01662 case TRUTH_OR_EXPR:
01663 case TRUTH_ORIF_EXPR:
01664 return 4;
01665
01666 case TRUTH_AND_EXPR:
01667 case TRUTH_ANDIF_EXPR:
01668 return 5;
01669
01670 case BIT_IOR_EXPR:
01671 return 6;
01672
01673 case BIT_XOR_EXPR:
01674 case TRUTH_XOR_EXPR:
01675 return 7;
01676
01677 case BIT_AND_EXPR:
01678 return 8;
01679
01680 case EQ_EXPR:
01681 case NE_EXPR:
01682 return 9;
01683
01684 case UNLT_EXPR:
01685 case UNLE_EXPR:
01686 case UNGT_EXPR:
01687 case UNGE_EXPR:
01688 case UNEQ_EXPR:
01689 case LTGT_EXPR:
01690 case ORDERED_EXPR:
01691 case UNORDERED_EXPR:
01692 case LT_EXPR:
01693 case LE_EXPR:
01694 case GT_EXPR:
01695 case GE_EXPR:
01696 return 10;
01697
01698 case LSHIFT_EXPR:
01699 case RSHIFT_EXPR:
01700 case LROTATE_EXPR:
01701 case RROTATE_EXPR:
01702 return 11;
01703
01704 case PLUS_EXPR:
01705 case MINUS_EXPR:
01706 return 12;
01707
01708 case MULT_EXPR:
01709 case TRUNC_DIV_EXPR:
01710 case CEIL_DIV_EXPR:
01711 case FLOOR_DIV_EXPR:
01712 case ROUND_DIV_EXPR:
01713 case RDIV_EXPR:
01714 case EXACT_DIV_EXPR:
01715 case TRUNC_MOD_EXPR:
01716 case CEIL_MOD_EXPR:
01717 case FLOOR_MOD_EXPR:
01718 case ROUND_MOD_EXPR:
01719 return 13;
01720
01721 case TRUTH_NOT_EXPR:
01722 case BIT_NOT_EXPR:
01723 case POSTINCREMENT_EXPR:
01724 case POSTDECREMENT_EXPR:
01725 case PREINCREMENT_EXPR:
01726 case PREDECREMENT_EXPR:
01727 case NEGATE_EXPR:
01728 case ALIGN_INDIRECT_REF:
01729 case MISALIGNED_INDIRECT_REF:
01730 case INDIRECT_REF:
01731 case ADDR_EXPR:
01732 case FLOAT_EXPR:
01733 case NOP_EXPR:
01734 case CONVERT_EXPR:
01735 case FIX_TRUNC_EXPR:
01736 case FIX_CEIL_EXPR:
01737 case FIX_FLOOR_EXPR:
01738 case FIX_ROUND_EXPR:
01739 case TARGET_EXPR:
01740 return 14;
01741
01742 case CALL_EXPR:
01743 case ARRAY_REF:
01744 case ARRAY_RANGE_REF:
01745 case COMPONENT_REF:
01746 return 15;
01747
01748
01749 case MIN_EXPR:
01750 case MAX_EXPR:
01751 case ABS_EXPR:
01752 case REALPART_EXPR:
01753 case IMAGPART_EXPR:
01754 return 16;
01755
01756 case SAVE_EXPR:
01757 case NON_LVALUE_EXPR:
01758 return op_prio (TREE_OPERAND (op, 0));
01759
01760 default:
01761
01762
01763 return 9999;
01764 }
01765 }
01766
01767
01768
01769
01770 static const char *
01771 op_symbol (tree op)
01772 {
01773 gcc_assert (op);
01774
01775 switch (TREE_CODE (op))
01776 {
01777 case MODIFY_EXPR:
01778 return "=";
01779
01780 case TRUTH_OR_EXPR:
01781 case TRUTH_ORIF_EXPR:
01782 return "||";
01783
01784 case TRUTH_AND_EXPR:
01785 case TRUTH_ANDIF_EXPR:
01786 return "&&";
01787
01788 case BIT_IOR_EXPR:
01789 return "|";
01790
01791 case TRUTH_XOR_EXPR:
01792 case BIT_XOR_EXPR:
01793 return "^";
01794
01795 case ADDR_EXPR:
01796 case BIT_AND_EXPR:
01797 return "&";
01798
01799 case ORDERED_EXPR:
01800 return "ord";
01801 case UNORDERED_EXPR:
01802 return "unord";
01803
01804 case EQ_EXPR:
01805 return "==";
01806 case UNEQ_EXPR:
01807 return "u==";
01808
01809 case NE_EXPR:
01810 return "!=";
01811
01812 case LT_EXPR:
01813 return "<";
01814 case UNLT_EXPR:
01815 return "u<";
01816
01817 case LE_EXPR:
01818 return "<=";
01819 case UNLE_EXPR:
01820 return "u<=";
01821
01822 case GT_EXPR:
01823 return ">";
01824 case UNGT_EXPR:
01825 return "u>";
01826
01827 case GE_EXPR:
01828 return ">=";
01829 case UNGE_EXPR:
01830 return "u>=";
01831
01832 case LTGT_EXPR:
01833 return "<>";
01834
01835 case LSHIFT_EXPR:
01836 return "<<";
01837
01838 case RSHIFT_EXPR:
01839 return ">>";
01840
01841 case PLUS_EXPR:
01842 return "+";
01843
01844 case NEGATE_EXPR:
01845 case MINUS_EXPR:
01846 return "-";
01847
01848 case BIT_NOT_EXPR:
01849 return "~";
01850
01851 case TRUTH_NOT_EXPR:
01852 return "!";
01853
01854 case MULT_EXPR:
01855 case INDIRECT_REF:
01856 return "*";
01857
01858 case ALIGN_INDIRECT_REF:
01859 return "A*";
01860
01861 case MISALIGNED_INDIRECT_REF:
01862 return "M*";
01863
01864 case TRUNC_DIV_EXPR:
01865 case RDIV_EXPR:
01866 return "/";
01867
01868 case CEIL_DIV_EXPR:
01869 return "/[cl]";
01870
01871 case FLOOR_DIV_EXPR:
01872 return "/[fl]";
01873
01874 case ROUND_DIV_EXPR:
01875 return "/[rd]";
01876
01877 case EXACT_DIV_EXPR:
01878 return "/[ex]";
01879
01880 case TRUNC_MOD_EXPR:
01881 return "%";
01882
01883 case CEIL_MOD_EXPR:
01884 return "%[cl]";
01885
01886 case FLOOR_MOD_EXPR:
01887 return "%[fl]";
01888
01889 case ROUND_MOD_EXPR:
01890 return "%[rd]";
01891
01892 case PREDECREMENT_EXPR:
01893 return " --";
01894
01895 case PREINCREMENT_EXPR:
01896 return " ++";
01897
01898 case POSTDECREMENT_EXPR:
01899 return "-- ";
01900
01901 case POSTINCREMENT_EXPR:
01902 return "++ ";
01903
01904 default:
01905 return "<<< ??? >>>";
01906 }
01907 }
01908
01909
01910
01911 static void
01912 print_call_name (pretty_printer *buffer, tree node)
01913 {
01914 tree op0;
01915
01916 gcc_assert (TREE_CODE (node) == CALL_EXPR);
01917
01918 op0 = TREE_OPERAND (node, 0);
01919
01920 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
01921 op0 = TREE_OPERAND (op0, 0);
01922
01923 switch (TREE_CODE (op0))
01924 {
01925 case VAR_DECL:
01926 case PARM_DECL:
01927 dump_function_name (buffer, op0);
01928 break;
01929
01930 case ADDR_EXPR:
01931 case INDIRECT_REF:
01932 case NOP_EXPR:
01933 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
01934 break;
01935
01936 case COND_EXPR:
01937 pp_string (buffer, "(");
01938 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
01939 pp_string (buffer, ") ? ");
01940 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, 0, false);
01941 pp_string (buffer, " : ");
01942 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, 0, false);
01943 break;
01944
01945 case COMPONENT_REF:
01946
01947 if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
01948 TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
01949 dump_function_name (buffer, TREE_OPERAND (op0, 1));
01950 else
01951 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
01952
01953
01954
01955
01956 break;
01957
01958 case ARRAY_REF:
01959 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
01960 dump_function_name (buffer, TREE_OPERAND (op0, 0));
01961 else
01962 dump_generic_node (buffer, op0, 0, 0, false);
01963 break;
01964
01965 case SSA_NAME:
01966 case OBJ_TYPE_REF:
01967 dump_generic_node (buffer, op0, 0, 0, false);
01968 break;
01969
01970 default:
01971 NIY;
01972 }
01973 }
01974
01975
01976
01977 static void
01978 pretty_print_string (pretty_printer *buffer, const char *str)
01979 {
01980 if (str == NULL)
01981 return;
01982
01983 while (*str)
01984 {
01985 switch (str[0])
01986 {
01987 case '\b':
01988 pp_string (buffer, "\\b");
01989 break;
01990
01991 case '\f':
01992 pp_string (buffer, "\\f");
01993 break;
01994
01995 case '\n':
01996 pp_string (buffer, "\\n");
01997 break;
01998
01999 case '\r':
02000 pp_string (buffer, "\\r");
02001 break;
02002
02003 case '\t':
02004 pp_string (buffer, "\\t");
02005 break;
02006
02007 case '\v':
02008 pp_string (buffer, "\\v");
02009 break;
02010
02011 case '\\':
02012 pp_string (buffer, "\\\\");
02013 break;
02014
02015 case '\"':
02016 pp_string (buffer, "\\\"");
02017 break;
02018
02019 case '\'':
02020 pp_string (buffer, "\\'");
02021 break;
02022
02023 case '\0':
02024 pp_string (buffer, "\\0");
02025 break;
02026
02027 case '\1':
02028 pp_string (buffer, "\\1");
02029 break;
02030
02031 case '\2':
02032 pp_string (buffer, "\\2");
02033 break;
02034
02035 case '\3':
02036 pp_string (buffer, "\\3");
02037 break;
02038
02039 case '\4':
02040 pp_string (buffer, "\\4");
02041 break;
02042
02043 case '\5':
02044 pp_string (buffer, "\\5");
02045 break;
02046
02047 case '\6':
02048 pp_string (buffer, "\\6");
02049 break;
02050
02051 case '\7':
02052 pp_string (buffer, "\\7");
02053 break;
02054
02055 default:
02056 pp_character (buffer, str[0]);
02057 break;
02058 }
02059 str++;
02060 }
02061 }
02062
02063 static void
02064 maybe_init_pretty_print (FILE *file)
02065 {
02066 if (!initialized)
02067 {
02068 pp_construct (&buffer, NULL, 0);
02069 pp_needs_newline (&buffer) = true;
02070 initialized = 1;
02071 }
02072
02073 buffer.buffer->stream = file;
02074 }
02075
02076 static void
02077 newline_and_indent (pretty_printer *buffer, int spc)
02078 {
02079 pp_newline (buffer);
02080 INDENT (spc);
02081 }
02082
02083 static void
02084 dump_vops (pretty_printer *buffer, tree stmt, int spc, int flags)
02085 {
02086 tree use;
02087 use_operand_p use_p;
02088 def_operand_p def_p;
02089 use_operand_p kill_p;
02090 ssa_op_iter iter;
02091
02092 FOR_EACH_SSA_MAYDEF_OPERAND (def_p, use_p, stmt, iter)
02093 {
02094 pp_string (buffer, "# ");
02095 dump_generic_node (buffer, DEF_FROM_PTR (def_p),
02096 spc + 2, flags, false);
02097 pp_string (buffer, " = V_MAY_DEF <");
02098 dump_generic_node (buffer, USE_FROM_PTR (use_p),
02099 spc + 2, flags, false);
02100 pp_string (buffer, ">;");
02101 newline_and_indent (buffer, spc);
02102 }
02103
02104 FOR_EACH_SSA_MUSTDEF_OPERAND (def_p, kill_p, stmt, iter)
02105 {
02106 pp_string (buffer, "# ");
02107 dump_generic_node (buffer, DEF_FROM_PTR (def_p),
02108 spc + 2, flags, false);
02109 pp_string (buffer, " = V_MUST_DEF <");
02110 dump_generic_node (buffer, USE_FROM_PTR (kill_p),
02111 spc + 2, flags, false);
02112 pp_string (buffer, ">;");
02113 newline_and_indent (buffer, spc);
02114 }
02115
02116 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_VUSE)
02117 {
02118 pp_string (buffer, "# VUSE <");
02119 dump_generic_node (buffer, use, spc + 2, flags, false);
02120 pp_string (buffer, ">;");
02121 newline_and_indent (buffer, spc);
02122 }
02123 }
02124
02125
02126
02127
02128 void
02129 dump_generic_bb (FILE *file, basic_block bb, int indent, int flags)
02130 {
02131 maybe_init_pretty_print (file);
02132 dumping_stmts = true;
02133 dump_generic_bb_buff (&buffer, bb, indent, flags);
02134 pp_flush (&buffer);
02135 }
02136
02137
02138
02139
02140 static void
02141 dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
02142 {
02143 edge e;
02144 tree stmt;
02145 edge_iterator ei;
02146
02147 if (flags & TDF_BLOCKS)
02148 {
02149 INDENT (indent);
02150 pp_string (buffer, "# BLOCK ");
02151 pp_decimal_int (buffer, bb->index);
02152
02153 if (flags & TDF_LINENO)
02154 {
02155 block_stmt_iterator bsi;
02156
02157 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
02158 if (get_lineno (bsi_stmt (bsi)) != -1)
02159 {
02160 pp_string (buffer, ", starting at line ");
02161 pp_decimal_int (buffer, get_lineno (bsi_stmt (bsi)));
02162 break;
02163 }
02164 }
02165 newline_and_indent (buffer, indent);
02166
02167 pp_string (buffer, "# PRED:");
02168 pp_write_text_to_stream (buffer);
02169 FOR_EACH_EDGE (e, ei, bb->preds)
02170 if (flags & TDF_SLIM)
02171 {
02172 pp_string (buffer, " ");
02173 if (e->src == ENTRY_BLOCK_PTR)
02174 pp_string (buffer, "ENTRY");
02175 else
02176 pp_decimal_int (buffer, e->src->index);
02177 }
02178 else
02179 dump_edge_info (buffer->buffer->stream, e, 0);
02180 pp_newline (buffer);
02181 }
02182 else
02183 {
02184 stmt = first_stmt (bb);
02185 if (!stmt || TREE_CODE (stmt) != LABEL_EXPR)
02186 {
02187 INDENT (indent - 2);
02188 pp_string (buffer, "<bb ");
02189 pp_decimal_int (buffer, bb->index);
02190 pp_string (buffer, ">:");
02191 pp_newline (buffer);
02192 }
02193 }
02194 pp_write_text_to_stream (buffer);
02195 check_bb_profile (bb, buffer->buffer->stream);
02196 }
02197
02198
02199
02200
02201 static void
02202 dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
02203 {
02204 edge e;
02205 edge_iterator ei;
02206
02207 INDENT (indent);
02208 pp_string (buffer, "# SUCC:");
02209 pp_write_text_to_stream (buffer);
02210 FOR_EACH_EDGE (e, ei, bb->succs)
02211 if (flags & TDF_SLIM)
02212 {
02213 pp_string (buffer, " ");
02214 if (e->dest == EXIT_BLOCK_PTR)
02215 pp_string (buffer, "EXIT");
02216 else
02217 pp_decimal_int (buffer, e->dest->index);
02218 }
02219 else
02220 dump_edge_info (buffer->buffer->stream, e, 1);
02221 pp_newline (buffer);
02222 }
02223
02224
02225
02226
02227 static void
02228 dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags)
02229 {
02230 tree phi = phi_nodes (bb);
02231 if (!phi)
02232 return;
02233
02234 for (; phi; phi = PHI_CHAIN (phi))
02235 {
02236 if (is_gimple_reg (PHI_RESULT (phi)) || (flags & TDF_VOPS))
02237 {
02238 INDENT (indent);
02239 pp_string (buffer, "# ");
02240 dump_generic_node (buffer, phi, indent, flags, false);
02241 pp_newline (buffer);
02242 }
02243 }
02244 }
02245
02246
02247
02248
02249 static void
02250 pp_cfg_jump (pretty_printer *buffer, basic_block bb)
02251 {
02252 tree stmt;
02253
02254 stmt = first_stmt (bb);
02255
02256 pp_string (buffer, "goto <bb ");
02257 pp_decimal_int (buffer, bb->index);
02258 pp_string (buffer, ">");
02259 if (stmt && TREE_CODE (stmt) == LABEL_EXPR)
02260 {
02261 pp_string (buffer, " (");
02262 dump_generic_node (buffer, LABEL_EXPR_LABEL (stmt), 0, 0, false);
02263 pp_string (buffer, ")");
02264 }
02265 pp_semicolon (buffer);
02266 }
02267
02268
02269
02270
02271 static void
02272 dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent,
02273 int flags)
02274 {
02275 edge e;
02276 edge_iterator ei;
02277
02278
02279
02280 FOR_EACH_EDGE (e, ei, bb->succs)
02281 if (e->flags & EDGE_FALLTHRU)
02282 break;
02283 if (e && e->dest != bb->next_bb)
02284 {
02285 INDENT (indent);
02286
02287 if ((flags & TDF_LINENO)
02288 #ifdef USE_MAPPED_LOCATION
02289 && e->goto_locus != UNKNOWN_LOCATION
02290 #else
02291 && e->goto_locus
02292 #endif
02293 )
02294 {
02295 expanded_location goto_xloc;
02296 #ifdef USE_MAPPED_LOCATION
02297 goto_xloc = expand_location (e->goto_locus);
02298 #else
02299 goto_xloc = *e->goto_locus;
02300 #endif
02301 pp_character (buffer, '[');
02302 if (goto_xloc.file)
02303 {
02304 pp_string (buffer, goto_xloc.file);
02305 pp_string (buffer, " : ");
02306 }
02307 pp_decimal_int (buffer, goto_xloc.line);
02308 pp_string (buffer, "] ");
02309 }
02310
02311 pp_cfg_jump (buffer, e->dest);
02312 pp_newline (buffer);
02313 }
02314 }
02315
02316
02317
02318
02319 static void
02320 dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
02321 int indent, int flags)
02322 {
02323 block_stmt_iterator bsi;
02324 tree stmt;
02325 int label_indent = indent - 2;
02326
02327 if (label_indent < 0)
02328 label_indent = 0;
02329
02330 dump_bb_header (buffer, bb, indent, flags);
02331
02332 if (bb_ann (bb))
02333 dump_phi_nodes (buffer, bb, indent, flags);
02334
02335 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
02336 {
02337 int curr_indent;
02338
02339 stmt = bsi_stmt (bsi);
02340
02341 curr_indent = TREE_CODE (stmt) == LABEL_EXPR ? label_indent : indent;
02342
02343 INDENT (curr_indent);
02344 dump_generic_node (buffer, stmt, curr_indent, flags, true);
02345 pp_newline (buffer);
02346 }
02347
02348 dump_implicit_edges (buffer, bb, indent, flags);
02349
02350 if (flags & TDF_BLOCKS)
02351 dump_bb_end (buffer, bb, indent, flags);
02352 }