1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005 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, 51 Franklin Street, Fifth Floor, Boston, MA
24 #include "coretypes.h"
27 #include "diagnostic.h"
30 #include "tree-flow.h"
31 #include "langhooks.h"
32 #include "tree-iterator.h"
33 #include "tree-chrec.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)]);
74 len = TREE_CODE_LENGTH (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));
168 char c = TREE_CODE (node) == CONST_DECL ? 'C' : 'D';
169 pp_printf (buffer, "%c.%u", c, DECL_UID (node));
174 /* Like the above, but used for pretty printing function calls. */
177 dump_function_name (pretty_printer *buffer, tree node)
179 if (DECL_NAME (node))
180 PRINT_FUNCTION_NAME (node);
182 dump_decl_name (buffer, node, 0);
185 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
186 FLAGS are as in dump_generic_node. */
189 dump_function_declaration (pretty_printer *buffer, tree node,
192 bool wrote_arg = false;
196 pp_character (buffer, '(');
198 /* Print the argument types. The last element in the list is a VOID_TYPE.
199 The following avoids printing the last element. */
200 arg = TYPE_ARG_TYPES (node);
201 while (arg && TREE_CHAIN (arg) && arg != error_mark_node)
204 dump_generic_node (buffer, TREE_VALUE (arg), spc, flags, false);
205 arg = TREE_CHAIN (arg);
206 if (TREE_CHAIN (arg) && TREE_CODE (TREE_CHAIN (arg)) == TREE_LIST)
208 pp_character (buffer, ',');
214 pp_string (buffer, "void");
216 pp_character (buffer, ')');
219 /* Dump the domain associated with an array. */
222 dump_array_domain (pretty_printer *buffer, tree domain, int spc, int flags)
224 pp_character (buffer, '[');
227 tree min = TYPE_MIN_VALUE (domain);
228 tree max = TYPE_MAX_VALUE (domain);
231 && integer_zerop (min)
232 && host_integerp (max, 0))
233 pp_wide_integer (buffer, TREE_INT_CST_LOW (max) + 1);
237 dump_generic_node (buffer, min, spc, flags, false);
238 pp_character (buffer, ':');
240 dump_generic_node (buffer, max, spc, flags, false);
244 pp_string (buffer, "<unknown>");
245 pp_character (buffer, ']');
248 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of indent.
249 FLAGS specifies details to show in the dump (see TDF_* in tree.h). If
250 IS_STMT is true, the object printed is considered to be a statement
251 and it is terminated by ';' if appropriate. */
254 dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
262 if (node == NULL_TREE)
265 is_expr = EXPR_P (node);
267 if (TREE_CODE (node) != ERROR_MARK
268 && is_gimple_stmt (node)
269 && (flags & TDF_VOPS)
271 && TREE_CODE (node) != PHI_NODE)
272 dump_vops (buffer, node, spc, flags);
274 if (is_stmt && (flags & TDF_STMTADDR))
275 pp_printf (buffer, "<&%p> ", (void *)node);
278 && (flags & TDF_LINENO)
279 && EXPR_HAS_LOCATION (node))
281 expanded_location xloc = expand_location (EXPR_LOCATION (node));
282 pp_character (buffer, '[');
285 pp_string (buffer, xloc.file);
286 pp_string (buffer, " : ");
288 pp_decimal_int (buffer, xloc.line);
289 pp_string (buffer, "] ");
292 switch (TREE_CODE (node))
295 pp_string (buffer, "<<< error >>>");
298 case IDENTIFIER_NODE:
299 pp_tree_identifier (buffer, node);
303 while (node && node != error_mark_node)
305 if (TREE_PURPOSE (node))
307 dump_generic_node (buffer, TREE_PURPOSE (node), spc, flags, false);
310 dump_generic_node (buffer, TREE_VALUE (node), spc, flags, false);
311 node = TREE_CHAIN (node);
312 if (node && TREE_CODE (node) == TREE_LIST)
314 pp_character (buffer, ',');
321 dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
326 if (TREE_VEC_LENGTH (node) > 0)
328 size_t len = TREE_VEC_LENGTH (node);
329 for (i = 0; i < len - 1; i++)
331 dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags,
333 pp_character (buffer, ',');
336 dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc,
355 unsigned int quals = TYPE_QUALS (node);
356 enum tree_code_class class;
358 if (quals & TYPE_QUAL_CONST)
359 pp_string (buffer, "const ");
360 else if (quals & TYPE_QUAL_VOLATILE)
361 pp_string (buffer, "volatile ");
362 else if (quals & TYPE_QUAL_RESTRICT)
363 pp_string (buffer, "restrict ");
365 class = TREE_CODE_CLASS (TREE_CODE (node));
367 if (class == tcc_declaration)
369 if (DECL_NAME (node))
370 dump_decl_name (buffer, node, flags);
372 pp_string (buffer, "<unnamed type decl>");
374 else if (class == tcc_type)
376 if (TYPE_NAME (node))
378 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
379 pp_tree_identifier (buffer, TYPE_NAME (node));
380 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
381 && DECL_NAME (TYPE_NAME (node)))
382 dump_decl_name (buffer, TYPE_NAME (node), flags);
384 pp_string (buffer, "<unnamed type>");
386 else if (TREE_CODE (node) == VECTOR_TYPE)
388 pp_string (buffer, "vector ");
389 dump_generic_node (buffer, TREE_TYPE (node),
393 pp_string (buffer, "<unnamed type>");
400 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
402 if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
404 tree fnode = TREE_TYPE (node);
406 dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false);
408 pp_character (buffer, '(');
409 pp_string (buffer, str);
410 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
411 dump_decl_name (buffer, TYPE_NAME (node), flags);
413 pp_printf (buffer, "<T%x>", TYPE_UID (node));
415 pp_character (buffer, ')');
416 dump_function_declaration (buffer, fnode, spc, flags);
420 unsigned int quals = TYPE_QUALS (node);
422 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
424 pp_string (buffer, str);
426 if (quals & TYPE_QUAL_CONST)
427 pp_string (buffer, " const");
428 else if (quals & TYPE_QUAL_VOLATILE)
429 pp_string (buffer, "volatile");
430 else if (quals & TYPE_QUAL_RESTRICT)
431 pp_string (buffer, " restrict");
433 if (TYPE_REF_CAN_ALIAS_ALL (node))
434 pp_string (buffer, " {ref-all}");
443 dump_decl_name (buffer, TYPE_NAME (TYPE_METHOD_BASETYPE (node)), flags);
444 pp_string (buffer, "::");
449 const char *sep = "";
452 pp_string (buffer, "MEM[");
454 tmp = TMR_SYMBOL (node);
457 pp_string (buffer, sep);
459 pp_string (buffer, "symbol: ");
460 dump_generic_node (buffer, tmp, spc, flags, false);
462 tmp = TMR_BASE (node);
465 pp_string (buffer, sep);
467 pp_string (buffer, "base: ");
468 dump_generic_node (buffer, tmp, spc, flags, false);
470 tmp = TMR_INDEX (node);
473 pp_string (buffer, sep);
475 pp_string (buffer, "index: ");
476 dump_generic_node (buffer, tmp, spc, flags, false);
478 tmp = TMR_STEP (node);
481 pp_string (buffer, sep);
483 pp_string (buffer, "step: ");
484 dump_generic_node (buffer, tmp, spc, flags, false);
486 tmp = TMR_OFFSET (node);
489 pp_string (buffer, sep);
491 pp_string (buffer, "offset: ");
492 dump_generic_node (buffer, tmp, spc, flags, false);
494 pp_string (buffer, "]");
495 if (flags & TDF_DETAILS)
497 pp_string (buffer, "{");
498 dump_generic_node (buffer, TMR_ORIGINAL (node), spc, flags,
500 pp_string (buffer, "}");
509 /* Print the innermost component type. */
510 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
511 tmp = TREE_TYPE (tmp))
513 dump_generic_node (buffer, tmp, spc, flags, false);
515 /* Print the dimensions. */
516 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
517 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
523 case QUAL_UNION_TYPE:
524 /* Print the name of the structure. */
525 if (TREE_CODE (node) == RECORD_TYPE)
526 pp_string (buffer, "struct ");
527 else if (TREE_CODE (node) == UNION_TYPE)
528 pp_string (buffer, "union ");
530 if (TYPE_NAME (node))
531 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
533 print_struct_decl (buffer, node, spc, flags);
541 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
543 /* In the case of a pointer, one may want to divide by the
544 size of the pointed-to type. Unfortunately, this not
545 straightforward. The C front-end maps expressions
550 in such a way that the two INTEGER_CST nodes for "5" have
551 different values but identical types. In the latter
552 case, the 5 is multiplied by sizeof (int) in c-common.c
553 (pointer_int_sum) to convert it to a byte address, and
554 yet the type of the node is left unchanged. Argh. What
555 is consistent though is that the number value corresponds
556 to bytes (UNITS) offset.
558 NB: Neither of the following divisors can be trivially
559 used to recover the original literal:
561 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
562 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
563 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
564 pp_string (buffer, "B"); /* pseudo-unit */
566 else if (! host_integerp (node, 0))
570 if (tree_int_cst_sgn (val) < 0)
572 pp_character (buffer, '-');
573 val = build_int_cst_wide (NULL_TREE,
574 -TREE_INT_CST_LOW (val),
575 ~TREE_INT_CST_HIGH (val)
576 + !TREE_INT_CST_LOW (val));
578 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
581 static char format[10]; /* "%x%09999x\0" */
583 sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
584 sprintf (pp_buffer (buffer)->digit_buffer, format,
585 TREE_INT_CST_HIGH (val),
586 TREE_INT_CST_LOW (val));
587 pp_string (buffer, pp_buffer (buffer)->digit_buffer);
591 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
595 /* Code copied from print_node. */
598 if (TREE_OVERFLOW (node))
599 pp_string (buffer, " overflow");
601 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
602 d = TREE_REAL_CST (node);
603 if (REAL_VALUE_ISINF (d))
604 pp_string (buffer, " Inf");
605 else if (REAL_VALUE_ISNAN (d))
606 pp_string (buffer, " Nan");
610 real_to_decimal (string, &d, sizeof (string), 0, 1);
611 pp_string (buffer, string);
616 unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
617 pp_string (buffer, "0x");
618 for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
619 output_formatted_integer (buffer, "%02x", *p++);
626 pp_string (buffer, "__complex__ (");
627 dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
628 pp_string (buffer, ", ");
629 dump_generic_node (buffer, TREE_IMAGPART (node), spc, flags, false);
630 pp_string (buffer, ")");
634 pp_string (buffer, "\"");
635 pretty_print_string (buffer, TREE_STRING_POINTER (node));
636 pp_string (buffer, "\"");
642 pp_string (buffer, "{ ");
643 for (elt = TREE_VECTOR_CST_ELTS (node); elt; elt = TREE_CHAIN (elt))
645 dump_generic_node (buffer, TREE_VALUE (elt), spc, flags, false);
646 if (TREE_CHAIN (elt))
647 pp_string (buffer, ", ");
649 pp_string (buffer, " }");
658 dump_decl_name (buffer, node, flags);
662 if (DECL_NAME (node))
663 dump_decl_name (buffer, node, flags);
664 else if (LABEL_DECL_UID (node) != -1)
665 pp_printf (buffer, "<L" HOST_WIDE_INT_PRINT_DEC ">",
666 LABEL_DECL_UID (node));
668 pp_printf (buffer, "<D%u>", DECL_UID (node));
672 if (DECL_IS_BUILTIN (node))
674 /* Don't print the declaration of built-in types. */
677 if (DECL_NAME (node))
678 dump_decl_name (buffer, node, flags);
681 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
682 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
683 && TYPE_METHODS (TREE_TYPE (node)))
685 /* The type is a c++ class: all structures have at least
687 pp_string (buffer, "class ");
688 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
693 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
694 ? "union" : "struct "));
695 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
704 dump_decl_name (buffer, node, flags);
708 pp_string (buffer, "<retval>");
712 op0 = TREE_OPERAND (node, 0);
714 if (TREE_CODE (op0) == INDIRECT_REF)
716 op0 = TREE_OPERAND (op0, 0);
719 if (op_prio (op0) < op_prio (node))
720 pp_character (buffer, '(');
721 dump_generic_node (buffer, op0, spc, flags, false);
722 if (op_prio (op0) < op_prio (node))
723 pp_character (buffer, ')');
724 pp_string (buffer, str);
725 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
727 if (TREE_CODE (op0) != VALUE_HANDLE)
729 op0 = component_ref_field_offset (node);
730 if (op0 && TREE_CODE (op0) != INTEGER_CST)
732 pp_string (buffer, "{off: ");
733 dump_generic_node (buffer, op0, spc, flags, false);
734 pp_character (buffer, '}');
740 pp_string (buffer, "BIT_FIELD_REF <");
741 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
742 pp_string (buffer, ", ");
743 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
744 pp_string (buffer, ", ");
745 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
746 pp_string (buffer, ">");
750 case ARRAY_RANGE_REF:
751 op0 = TREE_OPERAND (node, 0);
752 if (op_prio (op0) < op_prio (node))
753 pp_character (buffer, '(');
754 dump_generic_node (buffer, op0, spc, flags, false);
755 if (op_prio (op0) < op_prio (node))
756 pp_character (buffer, ')');
757 pp_character (buffer, '[');
758 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
759 if (TREE_CODE (node) == ARRAY_RANGE_REF)
760 pp_string (buffer, " ...");
761 pp_character (buffer, ']');
763 op0 = array_ref_low_bound (node);
764 op1 = array_ref_element_size (node);
766 if (!integer_zerop (op0)
767 || (TYPE_SIZE_UNIT (TREE_TYPE (node))
768 && !operand_equal_p (op1, TYPE_SIZE_UNIT (TREE_TYPE (node)), 0)))
770 pp_string (buffer, "{lb: ");
771 dump_generic_node (buffer, op0, spc, flags, false);
772 pp_string (buffer, " sz: ");
773 dump_generic_node (buffer, op1, spc, flags, false);
774 pp_character (buffer, '}');
781 bool is_struct_init = FALSE;
782 pp_character (buffer, '{');
783 lnode = CONSTRUCTOR_ELTS (node);
784 if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
785 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
786 is_struct_init = TRUE;
787 while (lnode && lnode != error_mark_node)
790 if (TREE_PURPOSE (lnode) && is_struct_init)
792 pp_character (buffer, '.');
793 dump_generic_node (buffer, TREE_PURPOSE (lnode), spc, flags, false);
794 pp_string (buffer, "=");
796 val = TREE_VALUE (lnode);
797 if (val && TREE_CODE (val) == ADDR_EXPR)
798 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
799 val = TREE_OPERAND (val, 0);
800 if (val && TREE_CODE (val) == FUNCTION_DECL)
802 dump_decl_name (buffer, val, flags);
806 dump_generic_node (buffer, TREE_VALUE (lnode), spc, flags, false);
808 lnode = TREE_CHAIN (lnode);
809 if (lnode && TREE_CODE (lnode) == TREE_LIST)
811 pp_character (buffer, ',');
815 pp_character (buffer, '}');
822 if (flags & TDF_SLIM)
824 pp_string (buffer, "<COMPOUND_EXPR>");
828 dump_generic_node (buffer, TREE_OPERAND (node, 0),
829 spc, flags, dumping_stmts);
831 newline_and_indent (buffer, spc);
834 pp_character (buffer, ',');
838 for (tp = &TREE_OPERAND (node, 1);
839 TREE_CODE (*tp) == COMPOUND_EXPR;
840 tp = &TREE_OPERAND (*tp, 1))
842 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
843 spc, flags, dumping_stmts);
845 newline_and_indent (buffer, spc);
848 pp_character (buffer, ',');
853 dump_generic_node (buffer, *tp, spc, flags, dumping_stmts);
859 tree_stmt_iterator si;
862 if ((flags & TDF_SLIM) || !dumping_stmts)
864 pp_string (buffer, "<STATEMENT_LIST>");
868 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
871 newline_and_indent (buffer, spc);
874 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
881 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
883 pp_character (buffer, '=');
885 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
889 pp_string (buffer, "TARGET_EXPR <");
890 dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false);
891 pp_character (buffer, ',');
893 dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false);
894 pp_character (buffer, '>');
898 print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags);
903 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
905 pp_string (buffer, "if (");
906 dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false);
907 pp_character (buffer, ')');
908 /* The lowered cond_exprs should always be printed in full. */
909 if (COND_EXPR_THEN (node)
910 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
911 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
912 && COND_EXPR_ELSE (node)
913 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
914 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
917 dump_generic_node (buffer, COND_EXPR_THEN (node), 0, flags, true);
918 pp_string (buffer, " else ");
919 dump_generic_node (buffer, COND_EXPR_ELSE (node), 0, flags, true);
921 else if (!(flags & TDF_SLIM))
923 /* Output COND_EXPR_THEN. */
924 if (COND_EXPR_THEN (node))
926 newline_and_indent (buffer, spc+2);
927 pp_character (buffer, '{');
928 newline_and_indent (buffer, spc+4);
929 dump_generic_node (buffer, COND_EXPR_THEN (node), spc+4,
931 newline_and_indent (buffer, spc+2);
932 pp_character (buffer, '}');
935 /* Output COND_EXPR_ELSE. */
936 if (COND_EXPR_ELSE (node))
938 newline_and_indent (buffer, spc);
939 pp_string (buffer, "else");
940 newline_and_indent (buffer, spc+2);
941 pp_character (buffer, '{');
942 newline_and_indent (buffer, spc+4);
943 dump_generic_node (buffer, COND_EXPR_ELSE (node), spc+4,
945 newline_and_indent (buffer, spc+2);
946 pp_character (buffer, '}');
953 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
955 pp_character (buffer, '?');
957 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
959 pp_character (buffer, ':');
961 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
966 pp_character (buffer, '{');
967 if (!(flags & TDF_SLIM))
969 if (BIND_EXPR_VARS (node))
973 for (op0 = BIND_EXPR_VARS (node); op0; op0 = TREE_CHAIN (op0))
975 print_declaration (buffer, op0, spc+2, flags);
980 newline_and_indent (buffer, spc+2);
981 dump_generic_node (buffer, BIND_EXPR_BODY (node), spc+2, flags, true);
982 newline_and_indent (buffer, spc);
983 pp_character (buffer, '}');
989 print_call_name (buffer, node);
991 /* Print parameters. */
993 pp_character (buffer, '(');
994 op1 = TREE_OPERAND (node, 1);
996 dump_generic_node (buffer, op1, spc, flags, false);
997 pp_character (buffer, ')');
999 op1 = TREE_OPERAND (node, 2);
1002 pp_string (buffer, " [static-chain: ");
1003 dump_generic_node (buffer, op1, spc, flags, false);
1004 pp_character (buffer, ']');
1007 if (CALL_EXPR_RETURN_SLOT_OPT (node))
1008 pp_string (buffer, " [return slot optimization]");
1009 if (CALL_EXPR_TAILCALL (node))
1010 pp_string (buffer, " [tail call]");
1013 case WITH_CLEANUP_EXPR:
1017 case CLEANUP_POINT_EXPR:
1018 pp_string (buffer, "<<cleanup_point ");
1019 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1020 pp_string (buffer, ">>");
1023 case PLACEHOLDER_EXPR:
1024 pp_string (buffer, "<PLACEHOLDER_EXPR ");
1025 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1026 pp_character (buffer, '>');
1029 /* Binary arithmetic and logic expressions. */
1033 case TRUNC_DIV_EXPR:
1035 case FLOOR_DIV_EXPR:
1036 case ROUND_DIV_EXPR:
1037 case TRUNC_MOD_EXPR:
1039 case FLOOR_MOD_EXPR:
1040 case ROUND_MOD_EXPR:
1042 case EXACT_DIV_EXPR:
1047 case VEC_LSHIFT_EXPR:
1048 case VEC_RSHIFT_EXPR:
1052 case TRUTH_ANDIF_EXPR:
1053 case TRUTH_ORIF_EXPR:
1054 case TRUTH_AND_EXPR:
1056 case TRUTH_XOR_EXPR:
1070 case UNORDERED_EXPR:
1072 const char *op = op_symbol (node);
1073 op0 = TREE_OPERAND (node, 0);
1074 op1 = TREE_OPERAND (node, 1);
1076 /* When the operands are expressions with less priority,
1077 keep semantics of the tree representation. */
1078 if (op_prio (op0) < op_prio (node))
1080 pp_character (buffer, '(');
1081 dump_generic_node (buffer, op0, spc, flags, false);
1082 pp_character (buffer, ')');
1085 dump_generic_node (buffer, op0, spc, flags, false);
1088 pp_string (buffer, op);
1091 /* When the operands are expressions with less priority,
1092 keep semantics of the tree representation. */
1093 if (op_prio (op1) < op_prio (node))
1095 pp_character (buffer, '(');
1096 dump_generic_node (buffer, op1, spc, flags, false);
1097 pp_character (buffer, ')');
1100 dump_generic_node (buffer, op1, spc, flags, false);
1104 /* Unary arithmetic and logic expressions. */
1107 case TRUTH_NOT_EXPR:
1109 case PREDECREMENT_EXPR:
1110 case PREINCREMENT_EXPR:
1111 case ALIGN_INDIRECT_REF:
1112 case MISALIGNED_INDIRECT_REF:
1114 if (TREE_CODE (node) == ADDR_EXPR
1115 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
1116 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
1117 ; /* Do not output '&' for strings and function pointers. */
1119 pp_string (buffer, op_symbol (node));
1121 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1123 pp_character (buffer, '(');
1124 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1125 pp_character (buffer, ')');
1128 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1130 if (TREE_CODE (node) == MISALIGNED_INDIRECT_REF)
1132 pp_string (buffer, "{misalignment: ");
1133 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1134 pp_character (buffer, '}');
1138 case POSTDECREMENT_EXPR:
1139 case POSTINCREMENT_EXPR:
1140 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1142 pp_character (buffer, '(');
1143 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1144 pp_character (buffer, ')');
1147 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1148 pp_string (buffer, op_symbol (node));
1152 pp_string (buffer, "MIN_EXPR <");
1153 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1154 pp_string (buffer, ", ");
1155 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1156 pp_character (buffer, '>');
1160 pp_string (buffer, "MAX_EXPR <");
1161 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1162 pp_string (buffer, ", ");
1163 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1164 pp_character (buffer, '>');
1168 pp_string (buffer, "ABS_EXPR <");
1169 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1170 pp_character (buffer, '>');
1177 case FIX_TRUNC_EXPR:
1179 case FIX_FLOOR_EXPR:
1180 case FIX_ROUND_EXPR:
1184 type = TREE_TYPE (node);
1185 op0 = TREE_OPERAND (node, 0);
1186 if (type != TREE_TYPE (op0))
1188 pp_character (buffer, '(');
1189 dump_generic_node (buffer, type, spc, flags, false);
1190 pp_string (buffer, ") ");
1192 if (op_prio (op0) < op_prio (node))
1193 pp_character (buffer, '(');
1194 dump_generic_node (buffer, op0, spc, flags, false);
1195 if (op_prio (op0) < op_prio (node))
1196 pp_character (buffer, ')');
1199 case VIEW_CONVERT_EXPR:
1200 pp_string (buffer, "VIEW_CONVERT_EXPR<");
1201 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1202 pp_string (buffer, ">(");
1203 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1204 pp_character (buffer, ')');
1207 case NON_LVALUE_EXPR:
1208 pp_string (buffer, "NON_LVALUE_EXPR <");
1209 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1210 pp_character (buffer, '>');
1214 pp_string (buffer, "SAVE_EXPR <");
1215 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1216 pp_character (buffer, '>');
1220 pp_string (buffer, "COMPLEX_EXPR <");
1221 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1222 pp_string (buffer, ", ");
1223 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1224 pp_string (buffer, ">");
1228 pp_string (buffer, "CONJ_EXPR <");
1229 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1230 pp_string (buffer, ">");
1234 pp_string (buffer, "REALPART_EXPR <");
1235 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1236 pp_string (buffer, ">");
1240 pp_string (buffer, "IMAGPART_EXPR <");
1241 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1242 pp_string (buffer, ">");
1246 pp_string (buffer, "VA_ARG_EXPR <");
1247 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1248 pp_string (buffer, ">");
1251 case TRY_FINALLY_EXPR:
1252 case TRY_CATCH_EXPR:
1253 pp_string (buffer, "try");
1254 newline_and_indent (buffer, spc+2);
1255 pp_string (buffer, "{");
1256 newline_and_indent (buffer, spc+4);
1257 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc+4, flags, true);
1258 newline_and_indent (buffer, spc+2);
1259 pp_string (buffer, "}");
1260 newline_and_indent (buffer, spc);
1262 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
1263 newline_and_indent (buffer, spc+2);
1264 pp_string (buffer, "{");
1265 newline_and_indent (buffer, spc+4);
1266 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
1267 newline_and_indent (buffer, spc+2);
1268 pp_string (buffer, "}");
1273 pp_string (buffer, "catch (");
1274 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
1275 pp_string (buffer, ")");
1276 newline_and_indent (buffer, spc+2);
1277 pp_string (buffer, "{");
1278 newline_and_indent (buffer, spc+4);
1279 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
1280 newline_and_indent (buffer, spc+2);
1281 pp_string (buffer, "}");
1285 case EH_FILTER_EXPR:
1286 pp_string (buffer, "<<<eh_filter (");
1287 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
1288 pp_string (buffer, ")>>>");
1289 newline_and_indent (buffer, spc+2);
1290 pp_string (buffer, "{");
1291 newline_and_indent (buffer, spc+4);
1292 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
1293 newline_and_indent (buffer, spc+2);
1294 pp_string (buffer, "}");
1299 op0 = TREE_OPERAND (node, 0);
1300 /* If this is for break or continue, don't bother printing it. */
1301 if (DECL_NAME (op0))
1303 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1304 if (strcmp (name, "break") == 0
1305 || strcmp (name, "continue") == 0)
1308 dump_generic_node (buffer, op0, spc, flags, false);
1309 pp_character (buffer, ':');
1310 if (DECL_NONLOCAL (op0))
1311 pp_string (buffer, " [non-local]");
1315 pp_string (buffer, "<<<exception object>>>");
1319 pp_string (buffer, "<<<filter object>>>");
1323 pp_string (buffer, "while (1)");
1324 if (!(flags & TDF_SLIM))
1326 newline_and_indent (buffer, spc+2);
1327 pp_character (buffer, '{');
1328 newline_and_indent (buffer, spc+4);
1329 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
1330 newline_and_indent (buffer, spc+2);
1331 pp_character (buffer, '}');
1337 pp_string (buffer, "return");
1338 op0 = TREE_OPERAND (node, 0);
1342 if (TREE_CODE (op0) == MODIFY_EXPR)
1343 dump_generic_node (buffer, TREE_OPERAND (op0, 1), spc, flags, false);
1345 dump_generic_node (buffer, op0, spc, flags, false);
1350 pp_string (buffer, "if (");
1351 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1352 pp_string (buffer, ") break");
1356 pp_string (buffer, "switch (");
1357 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
1358 pp_character (buffer, ')');
1359 if (!(flags & TDF_SLIM))
1361 newline_and_indent (buffer, spc+2);
1362 pp_character (buffer, '{');
1363 if (SWITCH_BODY (node))
1365 newline_and_indent (buffer, spc+4);
1366 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags, true);
1370 tree vec = SWITCH_LABELS (node);
1371 size_t i, n = TREE_VEC_LENGTH (vec);
1372 for (i = 0; i < n; ++i)
1374 tree elt = TREE_VEC_ELT (vec, i);
1375 newline_and_indent (buffer, spc+4);
1376 dump_generic_node (buffer, elt, spc+4, flags, false);
1377 pp_string (buffer, " goto ");
1378 dump_generic_node (buffer, CASE_LABEL (elt), spc+4, flags, true);
1379 pp_semicolon (buffer);
1382 newline_and_indent (buffer, spc+2);
1383 pp_character (buffer, '}');
1389 op0 = GOTO_DESTINATION (node);
1390 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
1392 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1393 if (strcmp (name, "break") == 0
1394 || strcmp (name, "continue") == 0)
1396 pp_string (buffer, name);
1400 pp_string (buffer, "goto ");
1401 dump_generic_node (buffer, op0, spc, flags, false);
1405 pp_string (buffer, "resx");
1406 /* ??? Any sensible way to present the eh region? */
1410 pp_string (buffer, "__asm__");
1411 if (ASM_VOLATILE_P (node))
1412 pp_string (buffer, " __volatile__");
1413 pp_character (buffer, '(');
1414 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
1415 pp_character (buffer, ':');
1416 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
1417 pp_character (buffer, ':');
1418 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
1419 if (ASM_CLOBBERS (node))
1421 pp_character (buffer, ':');
1422 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
1424 pp_string (buffer, ")");
1427 case CASE_LABEL_EXPR:
1428 if (CASE_LOW (node) && CASE_HIGH (node))
1430 pp_string (buffer, "case ");
1431 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1432 pp_string (buffer, " ... ");
1433 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
1435 else if (CASE_LOW (node))
1437 pp_string (buffer, "case ");
1438 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1441 pp_string (buffer, "default ");
1442 pp_character (buffer, ':');
1446 pp_string (buffer, "OBJ_TYPE_REF(");
1447 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
1448 pp_character (buffer, ';');
1449 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
1450 pp_character (buffer, '-');
1451 pp_character (buffer, '>');
1452 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
1453 pp_character (buffer, ')');
1460 dump_generic_node (buffer, PHI_RESULT (node), spc, flags, false);
1461 pp_string (buffer, " = PHI <");
1462 for (i = 0; i < PHI_NUM_ARGS (node); i++)
1464 dump_generic_node (buffer, PHI_ARG_DEF (node, i), spc, flags, false);
1465 pp_string (buffer, "(");
1466 pp_decimal_int (buffer, PHI_ARG_EDGE (node, i)->src->index);
1467 pp_string (buffer, ")");
1468 if (i < PHI_NUM_ARGS (node) - 1)
1469 pp_string (buffer, ", ");
1471 pp_string (buffer, ">;");
1476 dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
1477 pp_string (buffer, "_");
1478 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
1479 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
1480 pp_string (buffer, "(ab)");
1483 case WITH_SIZE_EXPR:
1484 pp_string (buffer, "WITH_SIZE_EXPR <");
1485 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1486 pp_string (buffer, ", ");
1487 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1488 pp_string (buffer, ">");
1492 pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node));
1496 pp_string (buffer, "ASSERT_EXPR <");
1497 dump_generic_node (buffer, ASSERT_EXPR_VAR (node), spc, flags, false);
1498 pp_string (buffer, ", ");
1499 dump_generic_node (buffer, ASSERT_EXPR_COND (node), spc, flags, false);
1500 pp_string (buffer, ">");
1504 pp_string (buffer, "scev_known");
1507 case SCEV_NOT_KNOWN:
1508 pp_string (buffer, "scev_not_known");
1511 case POLYNOMIAL_CHREC:
1512 pp_string (buffer, "{");
1513 dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
1514 pp_string (buffer, ", +, ");
1515 dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
1516 pp_string (buffer, "}_");
1517 dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
1521 case REALIGN_LOAD_EXPR:
1522 pp_string (buffer, "REALIGN_LOAD <");
1523 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1524 pp_string (buffer, ", ");
1525 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1526 pp_string (buffer, ", ");
1527 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1528 pp_string (buffer, ">");
1532 pp_string (buffer, " VEC_COND_EXPR < ");
1533 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1534 pp_string (buffer, " , ");
1535 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1536 pp_string (buffer, " , ");
1537 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1538 pp_string (buffer, " > ");
1541 case REDUC_MAX_EXPR:
1542 pp_string (buffer, " REDUC_MAX_EXPR < ");
1543 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1544 pp_string (buffer, " > ");
1547 case REDUC_MIN_EXPR:
1548 pp_string (buffer, " REDUC_MIN_EXPR < ");
1549 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1550 pp_string (buffer, " > ");
1553 case REDUC_PLUS_EXPR:
1554 pp_string (buffer, " REDUC_PLUS_EXPR < ");
1555 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1556 pp_string (buffer, " > ");
1563 if (is_stmt && is_expr)
1564 pp_semicolon (buffer);
1565 pp_write_text_to_stream (buffer);
1570 /* Print the declaration of a variable. */
1573 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
1577 if (TREE_CODE (t) == TYPE_DECL)
1578 pp_string (buffer, "typedef ");
1580 if (DECL_REGISTER (t))
1581 pp_string (buffer, "register ");
1583 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
1584 pp_string (buffer, "extern ");
1585 else if (TREE_STATIC (t))
1586 pp_string (buffer, "static ");
1588 /* Print the type and name. */
1589 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1593 /* Print array's type. */
1594 tmp = TREE_TYPE (t);
1595 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
1596 tmp = TREE_TYPE (tmp);
1597 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
1599 /* Print variable's name. */
1601 dump_generic_node (buffer, t, spc, flags, false);
1603 /* Print the dimensions. */
1604 tmp = TREE_TYPE (t);
1605 while (TREE_CODE (tmp) == ARRAY_TYPE)
1607 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
1608 tmp = TREE_TYPE (tmp);
1611 else if (TREE_CODE (t) == FUNCTION_DECL)
1613 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
1615 dump_decl_name (buffer, t, flags);
1616 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
1620 /* Print type declaration. */
1621 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
1623 /* Print variable's name. */
1625 dump_generic_node (buffer, t, spc, flags, false);
1628 if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
1630 pp_string (buffer, " __asm__ ");
1631 pp_character (buffer, '(');
1632 dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
1633 pp_character (buffer, ')');
1636 /* The initial value of a function serves to determine wether the function
1637 is declared or defined. So the following does not apply to function
1639 if (TREE_CODE (t) != FUNCTION_DECL)
1641 /* Print the initial value. */
1642 if (DECL_INITIAL (t))
1645 pp_character (buffer, '=');
1647 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
1651 pp_character (buffer, ';');
1655 /* Prints a structure: name, fields, and methods.
1656 FIXME: Still incomplete. */
1659 print_struct_decl (pretty_printer *buffer, tree node, int spc, int flags)
1661 /* Print the name of the structure. */
1662 if (TYPE_NAME (node))
1665 if (TREE_CODE (node) == RECORD_TYPE)
1666 pp_string (buffer, "struct ");
1667 else if ((TREE_CODE (node) == UNION_TYPE
1668 || TREE_CODE (node) == QUAL_UNION_TYPE))
1669 pp_string (buffer, "union ");
1671 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
1674 /* Print the contents of the structure. */
1675 pp_newline (buffer);
1677 pp_character (buffer, '{');
1678 pp_newline (buffer);
1680 /* Print the fields of the structure. */
1683 tmp = TYPE_FIELDS (node);
1686 /* Avoid to print recursively the structure. */
1687 /* FIXME : Not implemented correctly...,
1688 what about the case when we have a cycle in the contain graph? ...
1689 Maybe this could be solved by looking at the scope in which the
1690 structure was declared. */
1691 if (TREE_TYPE (tmp) != node
1692 || (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
1693 && TREE_TYPE (TREE_TYPE (tmp)) != node))
1695 print_declaration (buffer, tmp, spc+2, flags);
1696 pp_newline (buffer);
1698 tmp = TREE_CHAIN (tmp);
1702 pp_character (buffer, '}');
1705 /* Return the priority of the operator OP.
1707 From lowest to highest precedence with either left-to-right (L-R)
1708 or right-to-left (R-L) associativity]:
1711 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
1723 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
1724 15 [L-R] fn() [] -> .
1726 unary +, - and * have higher precedence than the corresponding binary
1735 switch (TREE_CODE (op))
1750 case TRUTH_ORIF_EXPR:
1753 case TRUTH_AND_EXPR:
1754 case TRUTH_ANDIF_EXPR:
1761 case TRUTH_XOR_EXPR:
1778 case UNORDERED_EXPR:
1796 case TRUNC_DIV_EXPR:
1798 case FLOOR_DIV_EXPR:
1799 case ROUND_DIV_EXPR:
1801 case EXACT_DIV_EXPR:
1802 case TRUNC_MOD_EXPR:
1804 case FLOOR_MOD_EXPR:
1805 case ROUND_MOD_EXPR:
1808 case TRUTH_NOT_EXPR:
1810 case POSTINCREMENT_EXPR:
1811 case POSTDECREMENT_EXPR:
1812 case PREINCREMENT_EXPR:
1813 case PREDECREMENT_EXPR:
1815 case ALIGN_INDIRECT_REF:
1816 case MISALIGNED_INDIRECT_REF:
1822 case FIX_TRUNC_EXPR:
1824 case FIX_FLOOR_EXPR:
1825 case FIX_ROUND_EXPR:
1831 case ARRAY_RANGE_REF:
1835 /* Special expressions. */
1841 case REDUC_MAX_EXPR:
1842 case REDUC_MIN_EXPR:
1843 case REDUC_PLUS_EXPR:
1844 case VEC_LSHIFT_EXPR:
1845 case VEC_RSHIFT_EXPR:
1849 case NON_LVALUE_EXPR:
1850 return op_prio (TREE_OPERAND (op, 0));
1853 /* Return an arbitrarily high precedence to avoid surrounding single
1854 VAR_DECLs in ()s. */
1860 /* Return the symbol associated with operator OP. */
1867 switch (TREE_CODE (op))
1873 case TRUTH_ORIF_EXPR:
1876 case TRUTH_AND_EXPR:
1877 case TRUTH_ANDIF_EXPR:
1883 case TRUTH_XOR_EXPR:
1893 case UNORDERED_EXPR:
1933 case VEC_LSHIFT_EXPR:
1936 case VEC_RSHIFT_EXPR:
1942 case REDUC_PLUS_EXPR:
1952 case TRUTH_NOT_EXPR:
1959 case ALIGN_INDIRECT_REF:
1962 case MISALIGNED_INDIRECT_REF:
1965 case TRUNC_DIV_EXPR:
1972 case FLOOR_DIV_EXPR:
1975 case ROUND_DIV_EXPR:
1978 case EXACT_DIV_EXPR:
1981 case TRUNC_MOD_EXPR:
1987 case FLOOR_MOD_EXPR:
1990 case ROUND_MOD_EXPR:
1993 case PREDECREMENT_EXPR:
1996 case PREINCREMENT_EXPR:
1999 case POSTDECREMENT_EXPR:
2002 case POSTINCREMENT_EXPR:
2006 return "<<< ??? >>>";
2010 /* Prints the name of a CALL_EXPR. */
2013 print_call_name (pretty_printer *buffer, tree node)
2017 gcc_assert (TREE_CODE (node) == CALL_EXPR);
2019 op0 = TREE_OPERAND (node, 0);
2021 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
2022 op0 = TREE_OPERAND (op0, 0);
2024 switch (TREE_CODE (op0))
2028 dump_function_name (buffer, op0);
2034 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2038 pp_string (buffer, "(");
2039 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2040 pp_string (buffer, ") ? ");
2041 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, 0, false);
2042 pp_string (buffer, " : ");
2043 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, 0, false);
2047 /* The function is a pointer contained in a structure. */
2048 if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
2049 TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2050 dump_function_name (buffer, TREE_OPERAND (op0, 1));
2052 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2054 We can have several levels of structures and a function
2055 pointer inside. This is not implemented yet... */
2060 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2061 dump_function_name (buffer, TREE_OPERAND (op0, 0));
2063 dump_generic_node (buffer, op0, 0, 0, false);
2068 dump_generic_node (buffer, op0, 0, 0, false);
2076 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2079 pretty_print_string (pretty_printer *buffer, const char *str)
2089 pp_string (buffer, "\\b");
2093 pp_string (buffer, "\\f");
2097 pp_string (buffer, "\\n");
2101 pp_string (buffer, "\\r");
2105 pp_string (buffer, "\\t");
2109 pp_string (buffer, "\\v");
2113 pp_string (buffer, "\\\\");
2117 pp_string (buffer, "\\\"");
2121 pp_string (buffer, "\\'");
2125 pp_string (buffer, "\\0");
2129 pp_string (buffer, "\\1");
2133 pp_string (buffer, "\\2");
2137 pp_string (buffer, "\\3");
2141 pp_string (buffer, "\\4");
2145 pp_string (buffer, "\\5");
2149 pp_string (buffer, "\\6");
2153 pp_string (buffer, "\\7");
2157 pp_character (buffer, str[0]);
2165 maybe_init_pretty_print (FILE *file)
2169 pp_construct (&buffer, /* prefix */NULL, /* line-width */0);
2170 pp_needs_newline (&buffer) = true;
2174 buffer.buffer->stream = file;
2178 newline_and_indent (pretty_printer *buffer, int spc)
2180 pp_newline (buffer);
2185 dump_vops (pretty_printer *buffer, tree stmt, int spc, int flags)
2188 use_operand_p use_p;
2189 def_operand_p def_p;
2190 use_operand_p kill_p;
2193 if (!ssa_operands_active ())
2196 FOR_EACH_SSA_MAYDEF_OPERAND (def_p, use_p, stmt, iter)
2198 pp_string (buffer, "# ");
2199 dump_generic_node (buffer, DEF_FROM_PTR (def_p),
2200 spc + 2, flags, false);
2201 pp_string (buffer, " = V_MAY_DEF <");
2202 dump_generic_node (buffer, USE_FROM_PTR (use_p),
2203 spc + 2, flags, false);
2204 pp_string (buffer, ">;");
2205 newline_and_indent (buffer, spc);
2208 FOR_EACH_SSA_MUSTDEF_OPERAND (def_p, kill_p, stmt, iter)
2210 pp_string (buffer, "# ");
2211 dump_generic_node (buffer, DEF_FROM_PTR (def_p),
2212 spc + 2, flags, false);
2213 pp_string (buffer, " = V_MUST_DEF <");
2214 dump_generic_node (buffer, USE_FROM_PTR (kill_p),
2215 spc + 2, flags, false);
2216 pp_string (buffer, ">;");
2217 newline_and_indent (buffer, spc);
2220 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_VUSE)
2222 pp_string (buffer, "# VUSE <");
2223 dump_generic_node (buffer, use, spc + 2, flags, false);
2224 pp_string (buffer, ">;");
2225 newline_and_indent (buffer, spc);
2229 /* Dumps basic block BB to FILE with details described by FLAGS and
2230 indented by INDENT spaces. */
2233 dump_generic_bb (FILE *file, basic_block bb, int indent, int flags)
2235 maybe_init_pretty_print (file);
2236 dumping_stmts = true;
2237 dump_generic_bb_buff (&buffer, bb, indent, flags);
2241 /* Dumps header of basic block BB to buffer BUFFER indented by INDENT
2242 spaces and details described by flags. */
2245 dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
2251 if (flags & TDF_BLOCKS)
2254 pp_string (buffer, "# BLOCK ");
2255 pp_decimal_int (buffer, bb->index);
2257 if (flags & TDF_LINENO)
2259 block_stmt_iterator bsi;
2261 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2262 if (get_lineno (bsi_stmt (bsi)) != -1)
2264 pp_string (buffer, ", starting at line ");
2265 pp_decimal_int (buffer, get_lineno (bsi_stmt (bsi)));
2269 newline_and_indent (buffer, indent);
2271 pp_string (buffer, "# PRED:");
2272 pp_write_text_to_stream (buffer);
2273 FOR_EACH_EDGE (e, ei, bb->preds)
2274 if (flags & TDF_SLIM)
2276 pp_string (buffer, " ");
2277 if (e->src == ENTRY_BLOCK_PTR)
2278 pp_string (buffer, "ENTRY");
2280 pp_decimal_int (buffer, e->src->index);
2283 dump_edge_info (buffer->buffer->stream, e, 0);
2284 pp_newline (buffer);
2288 stmt = first_stmt (bb);
2289 if (!stmt || TREE_CODE (stmt) != LABEL_EXPR)
2291 INDENT (indent - 2);
2292 pp_string (buffer, "<bb ");
2293 pp_decimal_int (buffer, bb->index);
2294 pp_string (buffer, ">:");
2295 pp_newline (buffer);
2298 pp_write_text_to_stream (buffer);
2299 check_bb_profile (bb, buffer->buffer->stream);
2302 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
2306 dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
2312 pp_string (buffer, "# SUCC:");
2313 pp_write_text_to_stream (buffer);
2314 FOR_EACH_EDGE (e, ei, bb->succs)
2315 if (flags & TDF_SLIM)
2317 pp_string (buffer, " ");
2318 if (e->dest == EXIT_BLOCK_PTR)
2319 pp_string (buffer, "EXIT");
2321 pp_decimal_int (buffer, e->dest->index);
2324 dump_edge_info (buffer->buffer->stream, e, 1);
2325 pp_newline (buffer);
2328 /* Dumps phi nodes of basic block BB to buffer BUFFER with details described by
2329 FLAGS indented by INDENT spaces. */
2332 dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags)
2334 tree phi = phi_nodes (bb);
2338 for (; phi; phi = PHI_CHAIN (phi))
2340 if (is_gimple_reg (PHI_RESULT (phi)) || (flags & TDF_VOPS))
2343 pp_string (buffer, "# ");
2344 dump_generic_node (buffer, phi, indent, flags, false);
2345 pp_newline (buffer);
2350 /* Dump jump to basic block BB that is represented implicitly in the cfg
2354 pp_cfg_jump (pretty_printer *buffer, basic_block bb)
2358 stmt = first_stmt (bb);
2360 pp_string (buffer, "goto <bb ");
2361 pp_decimal_int (buffer, bb->index);
2362 pp_string (buffer, ">");
2363 if (stmt && TREE_CODE (stmt) == LABEL_EXPR)
2365 pp_string (buffer, " (");
2366 dump_generic_node (buffer, LABEL_EXPR_LABEL (stmt), 0, 0, false);
2367 pp_string (buffer, ")");
2369 pp_semicolon (buffer);
2372 /* Dump edges represented implicitly in basic block BB to BUFFER, indented
2373 by INDENT spaces, with details given by FLAGS. */
2376 dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent,
2382 /* If there is a fallthru edge, we may need to add an artificial goto to the
2384 FOR_EACH_EDGE (e, ei, bb->succs)
2385 if (e->flags & EDGE_FALLTHRU)
2387 if (e && e->dest != bb->next_bb)
2391 if ((flags & TDF_LINENO)
2392 #ifdef USE_MAPPED_LOCATION
2393 && e->goto_locus != UNKNOWN_LOCATION
2399 expanded_location goto_xloc;
2400 #ifdef USE_MAPPED_LOCATION
2401 goto_xloc = expand_location (e->goto_locus);
2403 goto_xloc = *e->goto_locus;
2405 pp_character (buffer, '[');
2408 pp_string (buffer, goto_xloc.file);
2409 pp_string (buffer, " : ");
2411 pp_decimal_int (buffer, goto_xloc.line);
2412 pp_string (buffer, "] ");
2415 pp_cfg_jump (buffer, e->dest);
2416 pp_newline (buffer);
2420 /* Dumps basic block BB to buffer BUFFER with details described by FLAGS and
2421 indented by INDENT spaces. */
2424 dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
2425 int indent, int flags)
2427 block_stmt_iterator bsi;
2429 int label_indent = indent - 2;
2431 if (label_indent < 0)
2434 dump_bb_header (buffer, bb, indent, flags);
2436 dump_phi_nodes (buffer, bb, indent, flags);
2438 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2442 stmt = bsi_stmt (bsi);
2444 curr_indent = TREE_CODE (stmt) == LABEL_EXPR ? label_indent : indent;
2446 INDENT (curr_indent);
2447 dump_generic_node (buffer, stmt, curr_indent, flags, true);
2448 pp_newline (buffer);
2451 dump_implicit_edges (buffer, bb, indent, flags);
2453 if (flags & TDF_BLOCKS)
2454 dump_bb_end (buffer, bb, indent, flags);