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