1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
3 Adapted from c-pretty-print.c by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24 #include "coretypes.h"
28 #include "diagnostic.h"
31 #include "tree-flow.h"
32 #include "langhooks.h"
33 #include "tree-iterator.h"
35 /* Local functions, macros and variables. */
36 static int op_prio (tree);
37 static const char *op_symbol (tree);
38 static void pretty_print_string (pretty_printer *, const char*);
39 static void print_call_name (pretty_printer *, tree);
40 static void newline_and_indent (pretty_printer *, int);
41 static void maybe_init_pretty_print (FILE *);
42 static void print_declaration (pretty_printer *, tree, int, int);
43 static void print_struct_decl (pretty_printer *, tree, int, int);
44 static void do_niy (pretty_printer *, tree);
45 static void dump_vops (pretty_printer *, tree, int, int);
46 static void dump_generic_bb_buff (pretty_printer *, basic_block, int, int);
48 #define INDENT(SPACE) do { \
49 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
51 #define NIY do_niy(buffer,node)
53 #define PRINT_FUNCTION_NAME(NODE) pp_printf \
54 (buffer, "%s", TREE_CODE (NODE) == NOP_EXPR ? \
55 lang_hooks.decl_printable_name (TREE_OPERAND (NODE, 0), 1) : \
56 lang_hooks.decl_printable_name (NODE, 1))
58 static pretty_printer buffer;
59 static int initialized = 0;
60 static bool dumping_stmts;
62 /* Try to print something for an unknown tree code. */
65 do_niy (pretty_printer *buffer, tree node)
69 pp_string (buffer, "<<< Unknown tree: ");
70 pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
72 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (node))))
74 len = first_rtl_op (TREE_CODE (node));
75 for (i = 0; i < len; ++i)
77 newline_and_indent (buffer, 2);
78 dump_generic_node (buffer, TREE_OPERAND (node, i), 2, 0, false);
82 pp_string (buffer, " >>>\n");
86 debug_generic_expr (tree t)
88 print_generic_expr (stderr, t, TDF_VOPS|TDF_UID);
89 fprintf (stderr, "\n");
93 debug_generic_stmt (tree t)
95 print_generic_stmt (stderr, t, TDF_VOPS|TDF_UID);
96 fprintf (stderr, "\n");
99 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
101 print_generic_decl (FILE *file, tree decl, int flags)
103 maybe_init_pretty_print (file);
104 dumping_stmts = true;
105 print_declaration (&buffer, decl, 2, flags);
106 pp_write_text_to_stream (&buffer);
109 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
110 to show in the dump. See TDF_* in tree.h. */
113 print_generic_stmt (FILE *file, tree t, int flags)
115 maybe_init_pretty_print (file);
116 dumping_stmts = true;
117 dump_generic_node (&buffer, t, 0, flags, true);
121 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
122 to show in the dump. See TDF_* in tree.h. The output is indented by
126 print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
130 maybe_init_pretty_print (file);
131 dumping_stmts = true;
133 for (i = 0; i < indent; i++)
135 dump_generic_node (&buffer, t, indent, flags, true);
139 /* Print a single expression T on file FILE. FLAGS specifies details to show
140 in the dump. See TDF_* in tree.h. */
143 print_generic_expr (FILE *file, tree t, int flags)
145 maybe_init_pretty_print (file);
146 dumping_stmts = false;
147 dump_generic_node (&buffer, t, 0, flags, false);
150 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
154 dump_decl_name (pretty_printer *buffer, tree node, int flags)
156 if (DECL_NAME (node))
157 pp_tree_identifier (buffer, DECL_NAME (node));
159 if ((flags & TDF_UID)
160 || DECL_NAME (node) == NULL_TREE)
162 if (TREE_CODE (node) == LABEL_DECL
163 && LABEL_DECL_UID (node) != -1)
164 pp_printf (buffer, "<L" HOST_WIDE_INT_PRINT_DEC ">",
165 LABEL_DECL_UID (node));
167 pp_printf (buffer, "<D%u>", DECL_UID (node));
171 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
172 FLAGS are as in dump_generic_node. */
175 dump_function_declaration (pretty_printer *buffer, tree node,
178 bool wrote_arg = false;
182 pp_character (buffer, '(');
184 /* Print the argument types. The last element in the list is a VOID_TYPE.
185 The following avoids printing the last element. */
186 arg = TYPE_ARG_TYPES (node);
187 while (arg && TREE_CHAIN (arg) && arg != error_mark_node)
190 dump_generic_node (buffer, TREE_VALUE (arg), spc, flags, false);
191 arg = TREE_CHAIN (arg);
192 if (TREE_CHAIN (arg) && TREE_CODE (TREE_CHAIN (arg)) == TREE_LIST)
194 pp_character (buffer, ',');
200 pp_string (buffer, "void");
202 pp_character (buffer, ')');
205 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of indent.
206 FLAGS specifies details to show in the dump (see TDF_* in tree.h). If
207 IS_STMT is true, the object printed is considered to be a statement
208 and it is terminated by ';' if appropriate. */
211 dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
219 if (node == NULL_TREE)
222 is_expr = EXPR_P (node);
224 if (TREE_CODE (node) != ERROR_MARK
225 && is_gimple_stmt (node)
226 && (flags & TDF_VOPS)
228 dump_vops (buffer, node, spc, flags);
231 && (flags & TDF_LINENO)
232 && EXPR_HAS_LOCATION (node))
234 pp_character (buffer, '[');
235 if (EXPR_FILENAME (node))
237 pp_string (buffer, EXPR_FILENAME (node));
238 pp_string (buffer, " : ");
240 pp_decimal_int (buffer, EXPR_LINENO (node));
241 pp_string (buffer, "] ");
244 switch (TREE_CODE (node))
247 pp_string (buffer, "<<< error >>>");
250 case IDENTIFIER_NODE:
251 pp_tree_identifier (buffer, node);
255 while (node && node != error_mark_node)
257 if (TREE_PURPOSE (node))
259 dump_generic_node (buffer, TREE_PURPOSE (node), spc, flags, false);
262 dump_generic_node (buffer, TREE_VALUE (node), spc, flags, false);
263 node = TREE_CHAIN (node);
264 if (node && TREE_CODE (node) == TREE_LIST)
266 pp_character (buffer, ',');
273 dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
289 unsigned int quals = TYPE_QUALS (node);
292 if (quals & TYPE_QUAL_CONST)
293 pp_string (buffer, "const ");
294 else if (quals & TYPE_QUAL_VOLATILE)
295 pp_string (buffer, "volatile ");
296 else if (quals & TYPE_QUAL_RESTRICT)
297 pp_string (buffer, "restrict ");
299 class = TREE_CODE_CLASS (TREE_CODE (node));
303 if (DECL_NAME (node))
304 dump_decl_name (buffer, node, flags);
306 pp_string (buffer, "<unnamed type decl>");
308 else if (class == 't')
310 if (TYPE_NAME (node))
312 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
313 pp_tree_identifier (buffer, TYPE_NAME (node));
314 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
315 && DECL_NAME (TYPE_NAME (node)))
316 dump_decl_name (buffer, TYPE_NAME (node), flags);
318 pp_string (buffer, "<unnamed type>");
321 pp_string (buffer, "<unnamed type>");
328 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
330 if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
332 tree fnode = TREE_TYPE (node);
334 dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false);
336 pp_character (buffer, '(');
337 pp_string (buffer, str);
338 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
339 dump_decl_name (buffer, TYPE_NAME (node), flags);
341 pp_printf (buffer, "<T%x>", TYPE_UID (node));
343 pp_character (buffer, ')');
344 dump_function_declaration (buffer, fnode, spc, flags);
348 unsigned int quals = TYPE_QUALS (node);
350 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
352 pp_string (buffer, str);
354 if (quals & TYPE_QUAL_CONST)
355 pp_string (buffer, " const");
356 else if (quals & TYPE_QUAL_VOLATILE)
357 pp_string (buffer, "volatile");
358 else if (quals & TYPE_QUAL_RESTRICT)
359 pp_string (buffer, " restrict");
368 dump_decl_name (buffer, TYPE_NAME (TYPE_METHOD_BASETYPE (node)), flags);
369 pp_string (buffer, "::");
380 /* Print the array type. */
381 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
383 /* Print the dimensions. */
385 while (tmp && TREE_CODE (tmp) == ARRAY_TYPE)
387 pp_character (buffer, '[');
390 tree size = TYPE_SIZE (tmp);
391 if (TREE_CODE (size) == INTEGER_CST)
392 pp_wide_integer (buffer,
393 TREE_INT_CST_LOW (TYPE_SIZE (tmp)) /
394 TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (tmp))));
395 else if (TREE_CODE (size) == MULT_EXPR)
396 dump_generic_node (buffer, TREE_OPERAND (size, 0), spc, flags, false);
399 pp_character (buffer, ']');
400 tmp = TREE_TYPE (tmp);
411 case QUAL_UNION_TYPE:
412 /* Print the name of the structure. */
413 if (TREE_CODE (node) == RECORD_TYPE)
414 pp_string (buffer, "struct ");
415 else if (TREE_CODE (node) == UNION_TYPE)
416 pp_string (buffer, "union ");
418 if (TYPE_NAME (node))
419 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
421 print_struct_decl (buffer, node, spc, flags);
429 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
431 /* In the case of a pointer, one may want to divide by the
432 size of the pointed-to type. Unfortunately, this not
433 straightforward. The C front-end maps expressions
438 in such a way that the two INTEGER_CST nodes for "5" have
439 different values but identical types. In the latter
440 case, the 5 is multiplied by sizeof (int) in c-common.c
441 (pointer_int_sum) to convert it to a byte address, and
442 yet the type of the node is left unchanged. Argh. What
443 is consistent though is that the number value corresponds
444 to bytes (UNITS) offset.
446 NB: Neither of the following divisors can be trivially
447 used to recover the original literal:
449 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
450 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
451 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
452 pp_string (buffer, "B"); /* pseudo-unit */
454 else if (! host_integerp (node, 0))
458 if (tree_int_cst_sgn (val) < 0)
460 pp_character (buffer, '-');
461 val = build_int_2 (-TREE_INT_CST_LOW (val),
462 ~TREE_INT_CST_HIGH (val)
463 + !TREE_INT_CST_LOW (val));
465 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
468 static char format[10]; /* "%x%09999x\0" */
470 sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
471 sprintf (pp_buffer (buffer)->digit_buffer, format,
472 TREE_INT_CST_HIGH (val),
473 TREE_INT_CST_LOW (val));
474 pp_string (buffer, pp_buffer (buffer)->digit_buffer);
478 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
482 /* Code copied from print_node. */
485 if (TREE_OVERFLOW (node))
486 pp_string (buffer, " overflow");
488 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
489 d = TREE_REAL_CST (node);
490 if (REAL_VALUE_ISINF (d))
491 pp_string (buffer, " Inf");
492 else if (REAL_VALUE_ISNAN (d))
493 pp_string (buffer, " Nan");
497 real_to_decimal (string, &d, sizeof (string), 0, 1);
498 pp_string (buffer, string);
503 unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
504 pp_string (buffer, "0x");
505 for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
506 output_formatted_integer (buffer, "%02x", *p++);
513 pp_string (buffer, "__complex__ (");
514 dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
515 pp_string (buffer, ", ");
516 dump_generic_node (buffer, TREE_IMAGPART (node), spc, flags, false);
517 pp_string (buffer, ")");
521 pp_string (buffer, "\"");
522 pretty_print_string (buffer, TREE_STRING_POINTER (node));
523 pp_string (buffer, "\"");
529 pp_string (buffer, "{ ");
530 for (elt = TREE_VECTOR_CST_ELTS (node); elt; elt = TREE_CHAIN (elt))
532 dump_generic_node (buffer, TREE_VALUE (elt), spc, flags, false);
533 if (TREE_CHAIN (elt))
534 pp_string (buffer, ", ");
536 pp_string (buffer, " }");
545 dump_decl_name (buffer, node, flags);
549 if (DECL_NAME (node))
550 dump_decl_name (buffer, node, flags);
551 else if (LABEL_DECL_UID (node) != -1)
552 pp_printf (buffer, "<L" HOST_WIDE_INT_PRINT_DEC ">",
553 LABEL_DECL_UID (node));
555 pp_printf (buffer, "<D%u>", DECL_UID (node));
559 if (strcmp (DECL_SOURCE_FILE (node), "<built-in>") == 0)
561 /* Don't print the declaration of built-in types. */
564 if (DECL_NAME (node))
565 dump_decl_name (buffer, node, flags);
568 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
569 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
570 && TYPE_METHODS (TREE_TYPE (node)))
572 /* The type is a c++ class: all structures have at least
574 pp_string (buffer, "class ");
575 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
580 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
581 ? "union" : "struct "));
582 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
591 dump_decl_name (buffer, node, flags);
595 pp_string (buffer, "<retval>");
599 op0 = TREE_OPERAND (node, 0);
601 if (TREE_CODE (op0) == INDIRECT_REF)
603 op0 = TREE_OPERAND (op0, 0);
606 if (op_prio (op0) < op_prio (node))
607 pp_character (buffer, '(');
608 dump_generic_node (buffer, op0, spc, flags, false);
609 if (op_prio (op0) < op_prio (node))
610 pp_character (buffer, ')');
611 pp_string (buffer, str);
612 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
613 if (TREE_OPERAND (node, 2)
614 && TREE_CODE (TREE_OPERAND (node, 2)) != INTEGER_CST)
616 pp_string (buffer, "{off: ");
617 dump_generic_node (buffer, TREE_OPERAND (node, 2),
619 pp_character (buffer, '}');
624 pp_string (buffer, "BIT_FIELD_REF <");
625 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
626 pp_string (buffer, ", ");
627 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
628 pp_string (buffer, ", ");
629 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
630 pp_string (buffer, ">");
638 case ARRAY_RANGE_REF:
639 op0 = TREE_OPERAND (node, 0);
640 if (op_prio (op0) < op_prio (node))
641 pp_character (buffer, '(');
642 dump_generic_node (buffer, op0, spc, flags, false);
643 if (op_prio (op0) < op_prio (node))
644 pp_character (buffer, ')');
645 pp_character (buffer, '[');
646 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
647 if (TREE_CODE (node) == ARRAY_RANGE_REF)
648 pp_string (buffer, " ...");
649 pp_character (buffer, ']');
651 if ((TREE_OPERAND (node, 2)
652 && TREE_CODE (TREE_OPERAND (node, 2)) != INTEGER_CST)
653 || (TREE_OPERAND (node, 3)
654 && TREE_CODE (TREE_OPERAND (node, 3)) != INTEGER_CST))
656 pp_string (buffer, "{lb: ");
657 dump_generic_node (buffer, TREE_OPERAND (node, 2),
659 pp_string (buffer, " sz: ");
660 dump_generic_node (buffer, TREE_OPERAND (node, 3),
662 pp_character (buffer, '}');
669 bool is_struct_init = FALSE;
670 pp_character (buffer, '{');
671 lnode = CONSTRUCTOR_ELTS (node);
672 if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
673 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
674 is_struct_init = TRUE;
675 while (lnode && lnode != error_mark_node)
678 if (TREE_PURPOSE (lnode) && is_struct_init)
680 pp_character (buffer, '.');
681 dump_generic_node (buffer, TREE_PURPOSE (lnode), spc, flags, false);
682 pp_string (buffer, "=");
684 val = TREE_VALUE (lnode);
685 if (val && TREE_CODE (val) == ADDR_EXPR)
686 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
687 val = TREE_OPERAND (val, 0);
688 if (val && TREE_CODE (val) == FUNCTION_DECL)
690 dump_decl_name (buffer, val, flags);
694 dump_generic_node (buffer, TREE_VALUE (lnode), spc, flags, false);
696 lnode = TREE_CHAIN (lnode);
697 if (lnode && TREE_CODE (lnode) == TREE_LIST)
699 pp_character (buffer, ',');
703 pp_character (buffer, '}');
710 if (flags & TDF_SLIM)
712 pp_string (buffer, "<COMPOUND_EXPR>");
716 dump_generic_node (buffer, TREE_OPERAND (node, 0),
717 spc, flags, dumping_stmts);
719 newline_and_indent (buffer, spc);
722 pp_character (buffer, ',');
726 for (tp = &TREE_OPERAND (node, 1);
727 TREE_CODE (*tp) == COMPOUND_EXPR;
728 tp = &TREE_OPERAND (*tp, 1))
730 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
731 spc, flags, dumping_stmts);
733 newline_and_indent (buffer, spc);
736 pp_character (buffer, ',');
741 dump_generic_node (buffer, *tp, spc, flags, dumping_stmts);
747 tree_stmt_iterator si;
750 if ((flags & TDF_SLIM) || !dumping_stmts)
752 pp_string (buffer, "<STATEMENT_LIST>");
756 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
759 newline_and_indent (buffer, spc);
762 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
769 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
771 pp_character (buffer, '=');
773 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
777 pp_string (buffer, "TARGET_EXPR <");
778 dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false);
779 pp_character (buffer, ',');
781 dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false);
782 pp_character (buffer, '>');
786 print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags);
791 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
793 pp_string (buffer, "if (");
794 dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false);
795 pp_character (buffer, ')');
796 /* The lowered cond_exprs should always be printed in full. */
797 if (COND_EXPR_THEN (node)
798 && TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR
799 && COND_EXPR_ELSE (node)
800 && TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR)
803 dump_generic_node (buffer, COND_EXPR_THEN (node), 0, flags, true);
804 pp_string (buffer, " else ");
805 dump_generic_node (buffer, COND_EXPR_ELSE (node), 0, flags, true);
807 else if (!(flags & TDF_SLIM))
809 /* Output COND_EXPR_THEN. */
810 if (COND_EXPR_THEN (node))
812 newline_and_indent (buffer, spc+2);
813 pp_character (buffer, '{');
814 newline_and_indent (buffer, spc+4);
815 dump_generic_node (buffer, COND_EXPR_THEN (node), spc+4,
817 newline_and_indent (buffer, spc+2);
818 pp_character (buffer, '}');
821 /* Output COND_EXPR_ELSE. */
822 if (COND_EXPR_ELSE (node))
824 newline_and_indent (buffer, spc);
825 pp_string (buffer, "else");
826 newline_and_indent (buffer, spc+2);
827 pp_character (buffer, '{');
828 newline_and_indent (buffer, spc+4);
829 dump_generic_node (buffer, COND_EXPR_ELSE (node), spc+4,
831 newline_and_indent (buffer, spc+2);
832 pp_character (buffer, '}');
839 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
841 pp_character (buffer, '?');
843 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
845 pp_character (buffer, ':');
847 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
852 pp_character (buffer, '{');
853 if (!(flags & TDF_SLIM))
855 if (BIND_EXPR_VARS (node))
859 for (op0 = BIND_EXPR_VARS (node); op0; op0 = TREE_CHAIN (op0))
861 print_declaration (buffer, op0, spc+2, flags);
866 newline_and_indent (buffer, spc+2);
867 dump_generic_node (buffer, BIND_EXPR_BODY (node), spc+2, flags, true);
868 newline_and_indent (buffer, spc);
869 pp_character (buffer, '}');
875 print_call_name (buffer, node);
877 /* Print parameters. */
879 pp_character (buffer, '(');
880 op1 = TREE_OPERAND (node, 1);
882 dump_generic_node (buffer, op1, spc, flags, false);
883 pp_character (buffer, ')');
885 op1 = TREE_OPERAND (node, 2);
888 pp_string (buffer, " [static-chain: ");
889 dump_generic_node (buffer, op1, spc, flags, false);
890 pp_character (buffer, ']');
893 if (CALL_EXPR_TAILCALL (node))
894 pp_string (buffer, " [tail call]");
897 case WITH_CLEANUP_EXPR:
901 case CLEANUP_POINT_EXPR:
902 pp_string (buffer, "<<cleanup_point ");
903 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
904 pp_string (buffer, ">>");
907 case PLACEHOLDER_EXPR:
908 pp_string (buffer, "<PLACEHOLDER_EXPR ");
909 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
910 pp_character (buffer, '>');
913 /* Binary arithmetic and logic expressions. */
934 case TRUTH_ANDIF_EXPR:
935 case TRUTH_ORIF_EXPR:
954 const char *op = op_symbol (node);
955 op0 = TREE_OPERAND (node, 0);
956 op1 = TREE_OPERAND (node, 1);
958 /* When the operands are expressions with less priority,
959 keep semantics of the tree representation. */
960 if (op_prio (op0) < op_prio (node))
962 pp_character (buffer, '(');
963 dump_generic_node (buffer, op0, spc, flags, false);
964 pp_character (buffer, ')');
967 dump_generic_node (buffer, op0, spc, flags, false);
970 pp_string (buffer, op);
973 /* When the operands are expressions with less priority,
974 keep semantics of the tree representation. */
975 if (op_prio (op1) < op_prio (node))
977 pp_character (buffer, '(');
978 dump_generic_node (buffer, op1, spc, flags, false);
979 pp_character (buffer, ')');
982 dump_generic_node (buffer, op1, spc, flags, false);
986 /* Unary arithmetic and logic expressions. */
992 case PREDECREMENT_EXPR:
993 case PREINCREMENT_EXPR:
995 if (TREE_CODE (node) == ADDR_EXPR
996 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
997 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
998 ; /* Do not output '&' for strings and function pointers. */
1000 pp_string (buffer, op_symbol (node));
1002 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1004 pp_character (buffer, '(');
1005 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1006 pp_character (buffer, ')');
1009 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1012 case POSTDECREMENT_EXPR:
1013 case POSTINCREMENT_EXPR:
1014 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1016 pp_character (buffer, '(');
1017 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1018 pp_character (buffer, ')');
1021 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1022 pp_string (buffer, op_symbol (node));
1026 pp_string (buffer, "MIN_EXPR <");
1027 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1028 pp_string (buffer, ", ");
1029 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1030 pp_character (buffer, '>');
1034 pp_string (buffer, "MAX_EXPR <");
1035 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1036 pp_string (buffer, ", ");
1037 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1038 pp_character (buffer, '>');
1042 pp_string (buffer, "ABS_EXPR <");
1043 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1044 pp_character (buffer, '>');
1063 case FIX_TRUNC_EXPR:
1065 case FIX_FLOOR_EXPR:
1066 case FIX_ROUND_EXPR:
1070 type = TREE_TYPE (node);
1071 op0 = TREE_OPERAND (node, 0);
1072 if (type != TREE_TYPE (op0))
1074 pp_character (buffer, '(');
1075 dump_generic_node (buffer, type, spc, flags, false);
1076 pp_string (buffer, ")");
1078 if (op_prio (op0) < op_prio (node))
1079 pp_character (buffer, '(');
1080 dump_generic_node (buffer, op0, spc, flags, false);
1081 if (op_prio (op0) < op_prio (node))
1082 pp_character (buffer, ')');
1085 case VIEW_CONVERT_EXPR:
1086 pp_string (buffer, "VIEW_CONVERT_EXPR<");
1087 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1088 pp_string (buffer, ">(");
1089 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1090 pp_character (buffer, ')');
1093 case NON_LVALUE_EXPR:
1094 pp_string (buffer, "NON_LVALUE_EXPR <");
1095 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1096 pp_character (buffer, '>');
1100 pp_string (buffer, "SAVE_EXPR <");
1101 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1102 pp_character (buffer, '>');
1106 pp_string (buffer, "UNSAVE_EXPR <");
1107 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1108 pp_character (buffer, '>');
1115 case ENTRY_VALUE_EXPR:
1120 pp_string (buffer, "COMPLEX_EXPR <");
1121 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1122 pp_string (buffer, ", ");
1123 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1124 pp_string (buffer, ">");
1128 pp_string (buffer, "CONJ_EXPR <");
1129 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1130 pp_string (buffer, ">");
1134 pp_string (buffer, "REALPART_EXPR <");
1135 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1136 pp_string (buffer, ">");
1140 pp_string (buffer, "IMAGPART_EXPR <");
1141 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1142 pp_string (buffer, ">");
1146 pp_string (buffer, "VA_ARG_EXPR <");
1147 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1148 pp_string (buffer, ">");
1151 case TRY_FINALLY_EXPR:
1152 case TRY_CATCH_EXPR:
1153 pp_string (buffer, "try");
1154 newline_and_indent (buffer, spc+2);
1155 pp_string (buffer, "{");
1156 newline_and_indent (buffer, spc+4);
1157 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc+4, flags, true);
1158 newline_and_indent (buffer, spc+2);
1159 pp_string (buffer, "}");
1160 newline_and_indent (buffer, spc);
1162 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
1163 newline_and_indent (buffer, spc+2);
1164 pp_string (buffer, "{");
1165 newline_and_indent (buffer, spc+4);
1166 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
1167 newline_and_indent (buffer, spc+2);
1168 pp_string (buffer, "}");
1173 pp_string (buffer, "catch (");
1174 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
1175 pp_string (buffer, ")");
1176 newline_and_indent (buffer, spc+2);
1177 pp_string (buffer, "{");
1178 newline_and_indent (buffer, spc+4);
1179 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
1180 newline_and_indent (buffer, spc+2);
1181 pp_string (buffer, "}");
1185 case EH_FILTER_EXPR:
1186 pp_string (buffer, "<<<eh_filter (");
1187 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
1188 pp_string (buffer, ")>>>");
1189 newline_and_indent (buffer, spc+2);
1190 pp_string (buffer, "{");
1191 newline_and_indent (buffer, spc+4);
1192 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
1193 newline_and_indent (buffer, spc+2);
1194 pp_string (buffer, "}");
1198 case GOTO_SUBROUTINE_EXPR:
1203 op0 = TREE_OPERAND (node, 0);
1204 /* If this is for break or continue, don't bother printing it. */
1205 if (DECL_NAME (op0))
1207 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1208 if (strcmp (name, "break") == 0
1209 || strcmp (name, "continue") == 0)
1212 dump_generic_node (buffer, op0, spc, flags, false);
1213 pp_character (buffer, ':');
1214 if (DECL_NONLOCAL (op0))
1215 pp_string (buffer, " [non-local]");
1218 case LABELED_BLOCK_EXPR:
1219 op0 = LABELED_BLOCK_LABEL (node);
1220 /* If this is for break or continue, don't bother printing it. */
1221 if (DECL_NAME (op0))
1223 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1224 if (strcmp (name, "break") == 0
1225 || strcmp (name, "continue") == 0)
1227 dump_generic_node (buffer, LABELED_BLOCK_BODY (node), spc, flags, false);
1231 dump_generic_node (buffer, LABELED_BLOCK_LABEL (node), spc, flags, false);
1232 pp_string (buffer, ": {");
1233 if (!(flags & TDF_SLIM))
1234 newline_and_indent (buffer, spc+2);
1235 dump_generic_node (buffer, LABELED_BLOCK_BODY (node), spc+2, flags, true);
1237 newline_and_indent (buffer, spc);
1238 pp_character (buffer, '}');
1242 case EXIT_BLOCK_EXPR:
1243 op0 = LABELED_BLOCK_LABEL (EXIT_BLOCK_LABELED_BLOCK (node));
1244 /* If this is for a break or continue, print it accordingly. */
1245 if (DECL_NAME (op0))
1247 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1248 if (strcmp (name, "break") == 0
1249 || strcmp (name, "continue") == 0)
1251 pp_string (buffer, name);
1255 pp_string (buffer, "<<<exit block ");
1256 dump_generic_node (buffer, op0, spc, flags, false);
1257 pp_string (buffer, ">>>");
1261 pp_string (buffer, "<<<exception object>>>");
1265 pp_string (buffer, "<<<filter object>>>");
1269 pp_string (buffer, "while (1)");
1270 if (!(flags & TDF_SLIM))
1272 newline_and_indent (buffer, spc+2);
1273 pp_character (buffer, '{');
1274 newline_and_indent (buffer, spc+4);
1275 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
1276 newline_and_indent (buffer, spc+2);
1277 pp_character (buffer, '}');
1283 pp_string (buffer, "return");
1284 op0 = TREE_OPERAND (node, 0);
1288 if (TREE_CODE (op0) == MODIFY_EXPR)
1289 dump_generic_node (buffer, TREE_OPERAND (op0, 1), spc, flags, false);
1291 dump_generic_node (buffer, op0, spc, flags, false);
1296 pp_string (buffer, "if (");
1297 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1298 pp_string (buffer, ") break");
1302 pp_string (buffer, "switch (");
1303 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
1304 pp_character (buffer, ')');
1305 if (!(flags & TDF_SLIM))
1307 newline_and_indent (buffer, spc+2);
1308 pp_character (buffer, '{');
1309 if (SWITCH_BODY (node))
1311 newline_and_indent (buffer, spc+4);
1312 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags, true);
1316 tree vec = SWITCH_LABELS (node);
1317 size_t i, n = TREE_VEC_LENGTH (vec);
1318 for (i = 0; i < n; ++i)
1320 tree elt = TREE_VEC_ELT (vec, i);
1321 newline_and_indent (buffer, spc+4);
1322 dump_generic_node (buffer, elt, spc+4, flags, false);
1323 pp_string (buffer, " goto ");
1324 dump_generic_node (buffer, CASE_LABEL (elt), spc+4, flags, true);
1325 pp_semicolon (buffer);
1328 newline_and_indent (buffer, spc+2);
1329 pp_character (buffer, '}');
1335 op0 = GOTO_DESTINATION (node);
1336 if (TREE_CODE (op0) != SSA_NAME
1340 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1341 if (strcmp (name, "break") == 0
1342 || strcmp (name, "continue") == 0)
1344 pp_string (buffer, name);
1348 pp_string (buffer, "goto ");
1349 dump_generic_node (buffer, op0, spc, flags, false);
1353 pp_string (buffer, "resx");
1354 /* ??? Any sensible way to present the eh region? */
1358 pp_string (buffer, "__asm__");
1359 if (ASM_VOLATILE_P (node))
1360 pp_string (buffer, " __volatile__");
1361 pp_character (buffer, '(');
1362 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
1363 pp_character (buffer, ':');
1364 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
1365 pp_character (buffer, ':');
1366 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
1367 if (ASM_CLOBBERS (node))
1369 pp_character (buffer, ':');
1370 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
1372 pp_string (buffer, ")");
1375 case CASE_LABEL_EXPR:
1376 if (CASE_LOW (node) && CASE_HIGH (node))
1378 pp_string (buffer, "case ");
1379 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1380 pp_string (buffer, " ... ");
1381 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
1383 else if (CASE_LOW (node))
1385 pp_string (buffer, "case ");
1386 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1389 pp_string (buffer, "default ");
1390 pp_character (buffer, ':');
1394 pp_string (buffer, "OBJ_TYPE_REF(");
1395 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
1396 pp_character (buffer, ';');
1397 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
1398 pp_character (buffer, '-');
1399 pp_character (buffer, '>');
1400 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
1401 pp_character (buffer, ')');
1408 dump_generic_node (buffer, PHI_RESULT (node), spc, flags, false);
1409 pp_string (buffer, " = PHI <");
1410 for (i = 0; i < PHI_NUM_ARGS (node); i++)
1412 dump_generic_node (buffer, PHI_ARG_DEF (node, i), spc, flags, false);
1413 pp_string (buffer, "(");
1414 pp_decimal_int (buffer, PHI_ARG_EDGE (node, i)->src->index);
1415 pp_string (buffer, ")");
1416 if (i < PHI_NUM_ARGS (node) - 1)
1417 pp_string (buffer, ", ");
1419 pp_string (buffer, ">;");
1424 dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
1425 pp_string (buffer, "_");
1426 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
1430 pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node));
1437 if (is_stmt && is_expr)
1438 pp_semicolon (buffer);
1439 pp_write_text_to_stream (buffer);
1444 /* Print the declaration of a variable. */
1447 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
1451 if (TREE_CODE (t) == TYPE_DECL)
1452 pp_string (buffer, "typedef ");
1454 if (DECL_REGISTER (t))
1455 pp_string (buffer, "register ");
1457 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
1458 pp_string (buffer, "extern ");
1459 else if (TREE_STATIC (t))
1460 pp_string (buffer, "static ");
1462 /* Print the type and name. */
1463 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1467 /* Print array's type. */
1468 tmp = TREE_TYPE (t);
1469 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
1470 tmp = TREE_TYPE (tmp);
1471 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
1473 /* Print variable's name. */
1475 dump_generic_node (buffer, t, spc, flags, false);
1477 /* Print the dimensions. */
1478 tmp = TREE_TYPE (t);
1479 while (TREE_CODE (tmp) == ARRAY_TYPE)
1481 pp_character (buffer, '[');
1482 if (TYPE_DOMAIN (tmp))
1484 if (TREE_CODE (TYPE_SIZE (tmp)) == INTEGER_CST)
1485 pp_wide_integer (buffer,
1486 TREE_INT_CST_LOW (TYPE_SIZE (tmp)) /
1487 TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (tmp))));
1489 dump_generic_node (buffer, TYPE_SIZE_UNIT (tmp), spc, flags,
1492 pp_character (buffer, ']');
1493 tmp = TREE_TYPE (tmp);
1496 else if (TREE_CODE (t) == FUNCTION_DECL)
1498 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
1500 dump_decl_name (buffer, t, flags);
1501 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
1505 /* Print type declaration. */
1506 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
1508 /* Print variable's name. */
1510 dump_generic_node (buffer, t, spc, flags, false);
1513 /* The initial value of a function serves to determine wether the function
1514 is declared or defined. So the following does not apply to function
1516 if (TREE_CODE (t) != FUNCTION_DECL)
1518 /* Print the initial value. */
1519 if (DECL_INITIAL (t))
1522 pp_character (buffer, '=');
1524 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
1528 pp_character (buffer, ';');
1532 /* Prints a structure: name, fields, and methods.
1533 FIXME: Still incomplete. */
1536 print_struct_decl (pretty_printer *buffer, tree node, int spc, int flags)
1538 /* Print the name of the structure. */
1539 if (TYPE_NAME (node))
1542 if (TREE_CODE (node) == RECORD_TYPE)
1543 pp_string (buffer, "struct ");
1544 else if ((TREE_CODE (node) == UNION_TYPE
1545 || TREE_CODE (node) == QUAL_UNION_TYPE))
1546 pp_string (buffer, "union ");
1548 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
1551 /* Print the contents of the structure. */
1552 pp_newline (buffer);
1554 pp_character (buffer, '{');
1555 pp_newline (buffer);
1557 /* Print the fields of the structure. */
1560 tmp = TYPE_FIELDS (node);
1563 /* Avoid to print recursively the structure. */
1564 /* FIXME : Not implemented correctly...,
1565 what about the case when we have a cycle in the contain graph? ...
1566 Maybe this could be solved by looking at the scope in which the
1567 structure was declared. */
1568 if (TREE_TYPE (tmp) != node
1569 || (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
1570 && TREE_TYPE (TREE_TYPE (tmp)) != node))
1572 print_declaration (buffer, tmp, spc+2, flags);
1573 pp_newline (buffer);
1575 tmp = TREE_CHAIN (tmp);
1579 pp_character (buffer, '}');
1582 /* Return the priority of the operator OP.
1584 From lowest to highest precedence with either left-to-right (L-R)
1585 or right-to-left (R-L) associativity]:
1588 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
1600 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
1601 15 [L-R] fn() [] -> .
1603 unary +, - and * have higher precedence than the corresponding binary
1612 switch (TREE_CODE (op))
1627 case TRUTH_ORIF_EXPR:
1630 case TRUTH_AND_EXPR:
1631 case TRUTH_ANDIF_EXPR:
1638 case TRUTH_XOR_EXPR:
1655 case UNORDERED_EXPR:
1673 case TRUNC_DIV_EXPR:
1675 case FLOOR_DIV_EXPR:
1676 case ROUND_DIV_EXPR:
1678 case EXACT_DIV_EXPR:
1679 case TRUNC_MOD_EXPR:
1681 case FLOOR_MOD_EXPR:
1682 case ROUND_MOD_EXPR:
1685 case TRUTH_NOT_EXPR:
1687 case POSTINCREMENT_EXPR:
1688 case POSTDECREMENT_EXPR:
1689 case PREINCREMENT_EXPR:
1690 case PREDECREMENT_EXPR:
1697 case FIX_TRUNC_EXPR:
1699 case FIX_FLOOR_EXPR:
1700 case FIX_ROUND_EXPR:
1706 case ARRAY_RANGE_REF:
1710 /* Special expressions. */
1719 case NON_LVALUE_EXPR:
1720 return op_prio (TREE_OPERAND (op, 0));
1723 /* Return an arbitrarily high precedence to avoid surrounding single
1724 VAR_DECLs in ()s. */
1730 /* Return the symbol associated with operator OP. */
1738 switch (TREE_CODE (op))
1744 case TRUTH_ORIF_EXPR:
1747 case TRUTH_AND_EXPR:
1748 case TRUTH_ANDIF_EXPR:
1754 case TRUTH_XOR_EXPR:
1764 case UNORDERED_EXPR:
1814 case TRUTH_NOT_EXPR:
1821 case TRUNC_DIV_EXPR:
1823 case FLOOR_DIV_EXPR:
1824 case ROUND_DIV_EXPR:
1826 case EXACT_DIV_EXPR:
1829 case TRUNC_MOD_EXPR:
1831 case FLOOR_MOD_EXPR:
1832 case ROUND_MOD_EXPR:
1835 case PREDECREMENT_EXPR:
1838 case PREINCREMENT_EXPR:
1841 case POSTDECREMENT_EXPR:
1844 case POSTINCREMENT_EXPR:
1847 case REFERENCE_EXPR:
1851 return "<<< ??? >>>";
1855 /* Prints the name of a CALL_EXPR. */
1858 print_call_name (pretty_printer *buffer, tree node)
1862 if (TREE_CODE (node) != CALL_EXPR)
1865 op0 = TREE_OPERAND (node, 0);
1867 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
1868 op0 = TREE_OPERAND (op0, 0);
1870 switch (TREE_CODE (op0))
1874 PRINT_FUNCTION_NAME (op0);
1880 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
1884 pp_string (buffer, "(");
1885 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
1886 pp_string (buffer, ") ? ");
1887 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, 0, false);
1888 pp_string (buffer, " : ");
1889 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, 0, false);
1893 /* The function is a pointer contained in a structure. */
1894 if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
1895 TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
1896 PRINT_FUNCTION_NAME (TREE_OPERAND (op0, 1));
1898 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
1900 We can have several levels of structures and a function
1901 pointer inside. This is not implemented yet... */
1906 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
1907 PRINT_FUNCTION_NAME (TREE_OPERAND (op0, 0));
1909 dump_generic_node (buffer, op0, 0, 0, false);
1914 dump_generic_node (buffer, op0, 0, 0, false);
1922 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
1925 pretty_print_string (pretty_printer *buffer, const char *str)
1935 pp_string (buffer, "\\b");
1939 pp_string (buffer, "\\f");
1943 pp_string (buffer, "\\n");
1947 pp_string (buffer, "\\r");
1951 pp_string (buffer, "\\t");
1955 pp_string (buffer, "\\v");
1959 pp_string (buffer, "\\\\");
1963 pp_string (buffer, "\\\"");
1967 pp_string (buffer, "\\'");
1971 pp_string (buffer, "\\0");
1975 pp_string (buffer, "\\1");
1979 pp_string (buffer, "\\2");
1983 pp_string (buffer, "\\3");
1987 pp_string (buffer, "\\4");
1991 pp_string (buffer, "\\5");
1995 pp_string (buffer, "\\6");
1999 pp_string (buffer, "\\7");
2003 pp_character (buffer, str[0]);
2011 maybe_init_pretty_print (FILE *file)
2015 pp_construct (&buffer, /* prefix */NULL, /* line-width */0);
2016 pp_needs_newline (&buffer) = true;
2020 buffer.buffer->stream = file;
2024 newline_and_indent (pretty_printer *buffer, int spc)
2026 pp_newline (buffer);
2031 dump_vops (pretty_printer *buffer, tree stmt, int spc, int flags)
2034 stmt_ann_t ann = stmt_ann (stmt);
2035 v_may_def_optype v_may_defs = V_MAY_DEF_OPS (ann);
2036 v_must_def_optype v_must_defs = V_MUST_DEF_OPS (ann);
2037 vuse_optype vuses = VUSE_OPS (ann);
2039 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
2041 pp_string (buffer, "# ");
2042 dump_generic_node (buffer, V_MAY_DEF_RESULT (v_may_defs, i),
2043 spc + 2, flags, false);
2044 pp_string (buffer, " = V_MAY_DEF <");
2045 dump_generic_node (buffer, V_MAY_DEF_OP (v_may_defs, i),
2046 spc + 2, flags, false);
2047 pp_string (buffer, ">;");
2048 newline_and_indent (buffer, spc);
2051 for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
2053 tree v_must_def = V_MUST_DEF_OP (v_must_defs, i);
2054 pp_string (buffer, "# V_MUST_DEF <");
2055 dump_generic_node (buffer, v_must_def, spc + 2, flags, false);
2056 pp_string (buffer, ">;");
2057 newline_and_indent (buffer, spc);
2060 for (i = 0; i < NUM_VUSES (vuses); i++)
2062 tree vuse = VUSE_OP (vuses, i);
2063 pp_string (buffer, "# VUSE <");
2064 dump_generic_node (buffer, vuse, spc + 2, flags, false);
2065 pp_string (buffer, ">;");
2066 newline_and_indent (buffer, spc);
2070 /* Dumps basic block BB to FILE with details described by FLAGS and
2071 indented by INDENT spaces. */
2074 dump_generic_bb (FILE *file, basic_block bb, int indent, int flags)
2076 maybe_init_pretty_print (file);
2077 dumping_stmts = true;
2078 dump_generic_bb_buff (&buffer, bb, indent, flags);
2082 /* Dumps header of basic block BB to buffer BUFFER indented by INDENT
2083 spaces and details described by flags. */
2086 dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
2091 if (flags & TDF_BLOCKS)
2094 pp_string (buffer, "# BLOCK ");
2095 pp_decimal_int (buffer, bb->index);
2097 if (flags & TDF_LINENO)
2099 block_stmt_iterator bsi;
2101 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2102 if (get_lineno (bsi_stmt (bsi)) != -1)
2104 pp_string (buffer, ", starting at line ");
2105 pp_decimal_int (buffer, get_lineno (bsi_stmt (bsi)));
2109 newline_and_indent (buffer, indent);
2111 pp_string (buffer, "# PRED:");
2112 pp_write_text_to_stream (buffer);
2113 for (e = bb->pred; e; e = e->pred_next)
2114 if (flags & TDF_SLIM)
2116 pp_string (buffer, " ");
2117 if (e->src == ENTRY_BLOCK_PTR)
2118 pp_string (buffer, "ENTRY");
2120 pp_decimal_int (buffer, e->src->index);
2123 dump_edge_info (buffer->buffer->stream, e, 0);
2124 pp_newline (buffer);
2128 stmt = first_stmt (bb);
2129 if (!stmt || TREE_CODE (stmt) != LABEL_EXPR)
2131 INDENT (indent - 2);
2132 pp_string (buffer, "<bb ");
2133 pp_decimal_int (buffer, bb->index);
2134 pp_string (buffer, ">:");
2135 pp_newline (buffer);
2140 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
2144 dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
2149 pp_string (buffer, "# SUCC:");
2150 pp_write_text_to_stream (buffer);
2151 for (e = bb->succ; e; e = e->succ_next)
2152 if (flags & TDF_SLIM)
2154 pp_string (buffer, " ");
2155 if (e->dest == EXIT_BLOCK_PTR)
2156 pp_string (buffer, "EXIT");
2158 pp_decimal_int (buffer, e->dest->index);
2161 dump_edge_info (buffer->buffer->stream, e, 1);
2162 pp_newline (buffer);
2165 /* Dumps phi nodes of basic block BB to buffer BUFFER with details described by
2166 FLAGS indented by INDENT spaces. */
2169 dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags)
2171 tree phi = phi_nodes (bb);
2175 for (; phi; phi = PHI_CHAIN (phi))
2177 if (is_gimple_reg (PHI_RESULT (phi)) || (flags & TDF_VOPS))
2180 pp_string (buffer, "# ");
2181 dump_generic_node (buffer, phi, indent, flags, false);
2182 pp_newline (buffer);
2187 /* Dump jump to basic block BB that is represented implicitly in the cfg
2191 pp_cfg_jump (pretty_printer *buffer, basic_block bb)
2195 stmt = first_stmt (bb);
2197 pp_string (buffer, "goto <bb ");
2198 pp_decimal_int (buffer, bb->index);
2199 pp_string (buffer, ">");
2200 if (stmt && TREE_CODE (stmt) == LABEL_EXPR)
2202 pp_string (buffer, " (");
2203 dump_generic_node (buffer, LABEL_EXPR_LABEL (stmt), 0, 0, false);
2204 pp_string (buffer, ")");
2206 pp_semicolon (buffer);
2209 /* Dump edges represented implicitly in basic block BB to BUFFER, indented
2210 by INDENT spaces, with details given by FLAGS. */
2213 dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent,
2218 /* If there is a fallthru edge, we may need to add an artificial goto to the
2220 for (e = bb->succ; e; e = e->succ_next)
2221 if (e->flags & EDGE_FALLTHRU)
2223 if (e && e->dest != bb->next_bb)
2227 if ((flags & TDF_LINENO) && e->goto_locus)
2229 pp_character (buffer, '[');
2230 if (e->goto_locus->file)
2232 pp_string (buffer, e->goto_locus->file);
2233 pp_string (buffer, " : ");
2235 pp_decimal_int (buffer, e->goto_locus->line);
2236 pp_string (buffer, "] ");
2239 pp_cfg_jump (buffer, e->dest);
2240 pp_newline (buffer);
2244 /* Dumps basic block BB to buffer BUFFER with details described by FLAGS and
2245 indented by INDENT spaces. */
2248 dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
2249 int indent, int flags)
2251 block_stmt_iterator bsi;
2253 int label_indent = indent - 2;
2255 if (label_indent < 0)
2258 dump_bb_header (buffer, bb, indent, flags);
2261 dump_phi_nodes (buffer, bb, indent, flags);
2263 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2267 stmt = bsi_stmt (bsi);
2269 curr_indent = TREE_CODE (stmt) == LABEL_EXPR ? label_indent : indent;
2271 INDENT (curr_indent);
2272 dump_generic_node (buffer, stmt, curr_indent, flags, true);
2273 pp_newline (buffer);
2276 dump_implicit_edges (buffer, bb, indent, flags);
2278 if (flags & TDF_BLOCKS)
2279 dump_bb_end (buffer, bb, indent, flags);