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, 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"
34 #include "tree-chrec.h"
36 /* Local functions, macros and variables. */
37 static int op_prio (tree);
38 static const char *op_symbol (tree);
39 static void pretty_print_string (pretty_printer *, const char*);
40 static void print_call_name (pretty_printer *, tree);
41 static void newline_and_indent (pretty_printer *, int);
42 static void maybe_init_pretty_print (FILE *);
43 static void print_declaration (pretty_printer *, tree, int, int);
44 static void print_struct_decl (pretty_printer *, tree, int, int);
45 static void do_niy (pretty_printer *, tree);
46 static void dump_vops (pretty_printer *, tree, int, int);
47 static void dump_generic_bb_buff (pretty_printer *, basic_block, int, int);
49 #define INDENT(SPACE) do { \
50 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
52 #define NIY do_niy(buffer,node)
54 #define PRINT_FUNCTION_NAME(NODE) pp_printf \
55 (buffer, "%s", TREE_CODE (NODE) == NOP_EXPR ? \
56 lang_hooks.decl_printable_name (TREE_OPERAND (NODE, 0), 1) : \
57 lang_hooks.decl_printable_name (NODE, 1))
59 static pretty_printer buffer;
60 static int initialized = 0;
61 static bool dumping_stmts;
63 /* Try to print something for an unknown tree code. */
66 do_niy (pretty_printer *buffer, tree node)
70 pp_string (buffer, "<<< Unknown tree: ");
71 pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
75 len = TREE_CODE_LENGTH (TREE_CODE (node));
76 for (i = 0; i < len; ++i)
78 newline_and_indent (buffer, 2);
79 dump_generic_node (buffer, TREE_OPERAND (node, i), 2, 0, false);
83 pp_string (buffer, " >>>\n");
87 debug_generic_expr (tree t)
89 print_generic_expr (stderr, t, TDF_VOPS|TDF_UID);
90 fprintf (stderr, "\n");
94 debug_generic_stmt (tree t)
96 print_generic_stmt (stderr, t, TDF_VOPS|TDF_UID);
97 fprintf (stderr, "\n");
100 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
102 print_generic_decl (FILE *file, tree decl, int flags)
104 maybe_init_pretty_print (file);
105 dumping_stmts = true;
106 print_declaration (&buffer, decl, 2, flags);
107 pp_write_text_to_stream (&buffer);
110 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
111 to show in the dump. See TDF_* in tree.h. */
114 print_generic_stmt (FILE *file, tree t, int flags)
116 maybe_init_pretty_print (file);
117 dumping_stmts = true;
118 dump_generic_node (&buffer, t, 0, flags, true);
122 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
123 to show in the dump. See TDF_* in tree.h. The output is indented by
127 print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
131 maybe_init_pretty_print (file);
132 dumping_stmts = true;
134 for (i = 0; i < indent; i++)
136 dump_generic_node (&buffer, t, indent, flags, true);
140 /* Print a single expression T on file FILE. FLAGS specifies details to show
141 in the dump. See TDF_* in tree.h. */
144 print_generic_expr (FILE *file, tree t, int flags)
146 maybe_init_pretty_print (file);
147 dumping_stmts = false;
148 dump_generic_node (&buffer, t, 0, flags, false);
151 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
155 dump_decl_name (pretty_printer *buffer, tree node, int flags)
157 if (DECL_NAME (node))
158 pp_tree_identifier (buffer, DECL_NAME (node));
160 if ((flags & TDF_UID)
161 || DECL_NAME (node) == NULL_TREE)
163 if (TREE_CODE (node) == LABEL_DECL
164 && LABEL_DECL_UID (node) != -1)
165 pp_printf (buffer, "L." HOST_WIDE_INT_PRINT_DEC,
166 LABEL_DECL_UID (node));
169 char c = TREE_CODE (node) == CONST_DECL ? 'C' : 'D';
170 pp_printf (buffer, "%c.%u", c, DECL_UID (node));
175 /* Like the above, but used for pretty printing function calls. */
178 dump_function_name (pretty_printer *buffer, tree node)
180 if (DECL_NAME (node))
181 PRINT_FUNCTION_NAME (node);
183 dump_decl_name (buffer, node, 0);
186 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
187 FLAGS are as in dump_generic_node. */
190 dump_function_declaration (pretty_printer *buffer, tree node,
193 bool wrote_arg = false;
197 pp_character (buffer, '(');
199 /* Print the argument types. The last element in the list is a VOID_TYPE.
200 The following avoids printing the last element. */
201 arg = TYPE_ARG_TYPES (node);
202 while (arg && TREE_CHAIN (arg) && arg != error_mark_node)
205 dump_generic_node (buffer, TREE_VALUE (arg), spc, flags, false);
206 arg = TREE_CHAIN (arg);
207 if (TREE_CHAIN (arg) && TREE_CODE (TREE_CHAIN (arg)) == TREE_LIST)
209 pp_character (buffer, ',');
215 pp_string (buffer, "void");
217 pp_character (buffer, ')');
220 /* Dump the domain associated with an array. */
223 dump_array_domain (pretty_printer *buffer, tree domain, int spc, int flags)
225 pp_character (buffer, '[');
228 tree min = TYPE_MIN_VALUE (domain);
229 tree max = TYPE_MAX_VALUE (domain);
232 && integer_zerop (min)
233 && host_integerp (max, 0))
234 pp_wide_integer (buffer, TREE_INT_CST_LOW (max) + 1);
238 dump_generic_node (buffer, min, spc, flags, false);
239 pp_character (buffer, ':');
241 dump_generic_node (buffer, max, spc, flags, false);
245 pp_string (buffer, "<unknown>");
246 pp_character (buffer, ']');
249 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of indent.
250 FLAGS specifies details to show in the dump (see TDF_* in tree.h). If
251 IS_STMT is true, the object printed is considered to be a statement
252 and it is terminated by ';' if appropriate. */
255 dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
263 if (node == NULL_TREE)
266 is_expr = EXPR_P (node);
268 if (TREE_CODE (node) != ERROR_MARK
269 && is_gimple_stmt (node)
270 && (flags & TDF_VOPS)
272 dump_vops (buffer, node, spc, flags);
275 && (flags & TDF_LINENO)
276 && EXPR_HAS_LOCATION (node))
278 expanded_location xloc = expand_location (EXPR_LOCATION (node));
279 pp_character (buffer, '[');
282 pp_string (buffer, xloc.file);
283 pp_string (buffer, " : ");
285 pp_decimal_int (buffer, xloc.line);
286 pp_string (buffer, "] ");
289 switch (TREE_CODE (node))
292 pp_string (buffer, "<<< error >>>");
295 case IDENTIFIER_NODE:
296 pp_tree_identifier (buffer, node);
300 while (node && node != error_mark_node)
302 if (TREE_PURPOSE (node))
304 dump_generic_node (buffer, TREE_PURPOSE (node), spc, flags, false);
307 dump_generic_node (buffer, TREE_VALUE (node), spc, flags, false);
308 node = TREE_CHAIN (node);
309 if (node && TREE_CODE (node) == TREE_LIST)
311 pp_character (buffer, ',');
318 dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
323 if (TREE_VEC_LENGTH (node) > 0)
325 size_t len = TREE_VEC_LENGTH (node);
326 for (i = 0; i < len - 1; i++)
328 dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags,
330 pp_character (buffer, ',');
333 dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc,
352 unsigned int quals = TYPE_QUALS (node);
353 enum tree_code_class class;
355 if (quals & TYPE_QUAL_CONST)
356 pp_string (buffer, "const ");
357 else if (quals & TYPE_QUAL_VOLATILE)
358 pp_string (buffer, "volatile ");
359 else if (quals & TYPE_QUAL_RESTRICT)
360 pp_string (buffer, "restrict ");
362 class = TREE_CODE_CLASS (TREE_CODE (node));
364 if (class == tcc_declaration)
366 if (DECL_NAME (node))
367 dump_decl_name (buffer, node, flags);
369 pp_string (buffer, "<unnamed type decl>");
371 else if (class == tcc_type)
373 if (TYPE_NAME (node))
375 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
376 pp_tree_identifier (buffer, TYPE_NAME (node));
377 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
378 && DECL_NAME (TYPE_NAME (node)))
379 dump_decl_name (buffer, TYPE_NAME (node), flags);
381 pp_string (buffer, "<unnamed type>");
383 else if (TREE_CODE (node) == VECTOR_TYPE)
385 pp_string (buffer, "vector ");
386 dump_generic_node (buffer, TREE_TYPE (node),
390 pp_string (buffer, "<unnamed type>");
397 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
399 if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
401 tree fnode = TREE_TYPE (node);
403 dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false);
405 pp_character (buffer, '(');
406 pp_string (buffer, str);
407 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
408 dump_decl_name (buffer, TYPE_NAME (node), flags);
410 pp_printf (buffer, "<T%x>", TYPE_UID (node));
412 pp_character (buffer, ')');
413 dump_function_declaration (buffer, fnode, spc, flags);
417 unsigned int quals = TYPE_QUALS (node);
419 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
421 pp_string (buffer, str);
423 if (quals & TYPE_QUAL_CONST)
424 pp_string (buffer, " const");
425 else if (quals & TYPE_QUAL_VOLATILE)
426 pp_string (buffer, "volatile");
427 else if (quals & TYPE_QUAL_RESTRICT)
428 pp_string (buffer, " restrict");
430 if (TYPE_REF_CAN_ALIAS_ALL (node))
431 pp_string (buffer, " {ref-all}");
440 dump_decl_name (buffer, TYPE_NAME (TYPE_METHOD_BASETYPE (node)), flags);
441 pp_string (buffer, "::");
448 /* Print the innermost component type. */
449 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
450 tmp = TREE_TYPE (tmp))
452 dump_generic_node (buffer, tmp, spc, flags, false);
454 /* Print the dimensions. */
455 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
456 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
462 case QUAL_UNION_TYPE:
463 /* Print the name of the structure. */
464 if (TREE_CODE (node) == RECORD_TYPE)
465 pp_string (buffer, "struct ");
466 else if (TREE_CODE (node) == UNION_TYPE)
467 pp_string (buffer, "union ");
469 if (TYPE_NAME (node))
470 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
472 print_struct_decl (buffer, node, spc, flags);
480 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
482 /* In the case of a pointer, one may want to divide by the
483 size of the pointed-to type. Unfortunately, this not
484 straightforward. The C front-end maps expressions
489 in such a way that the two INTEGER_CST nodes for "5" have
490 different values but identical types. In the latter
491 case, the 5 is multiplied by sizeof (int) in c-common.c
492 (pointer_int_sum) to convert it to a byte address, and
493 yet the type of the node is left unchanged. Argh. What
494 is consistent though is that the number value corresponds
495 to bytes (UNITS) offset.
497 NB: Neither of the following divisors can be trivially
498 used to recover the original literal:
500 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
501 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
502 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
503 pp_string (buffer, "B"); /* pseudo-unit */
505 else if (! host_integerp (node, 0))
509 if (tree_int_cst_sgn (val) < 0)
511 pp_character (buffer, '-');
512 val = build_int_cst_wide (NULL_TREE,
513 -TREE_INT_CST_LOW (val),
514 ~TREE_INT_CST_HIGH (val)
515 + !TREE_INT_CST_LOW (val));
517 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
520 static char format[10]; /* "%x%09999x\0" */
522 sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
523 sprintf (pp_buffer (buffer)->digit_buffer, format,
524 TREE_INT_CST_HIGH (val),
525 TREE_INT_CST_LOW (val));
526 pp_string (buffer, pp_buffer (buffer)->digit_buffer);
530 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
534 /* Code copied from print_node. */
537 if (TREE_OVERFLOW (node))
538 pp_string (buffer, " overflow");
540 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
541 d = TREE_REAL_CST (node);
542 if (REAL_VALUE_ISINF (d))
543 pp_string (buffer, " Inf");
544 else if (REAL_VALUE_ISNAN (d))
545 pp_string (buffer, " Nan");
549 real_to_decimal (string, &d, sizeof (string), 0, 1);
550 pp_string (buffer, string);
555 unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
556 pp_string (buffer, "0x");
557 for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
558 output_formatted_integer (buffer, "%02x", *p++);
565 pp_string (buffer, "__complex__ (");
566 dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
567 pp_string (buffer, ", ");
568 dump_generic_node (buffer, TREE_IMAGPART (node), spc, flags, false);
569 pp_string (buffer, ")");
573 pp_string (buffer, "\"");
574 pretty_print_string (buffer, TREE_STRING_POINTER (node));
575 pp_string (buffer, "\"");
581 pp_string (buffer, "{ ");
582 for (elt = TREE_VECTOR_CST_ELTS (node); elt; elt = TREE_CHAIN (elt))
584 dump_generic_node (buffer, TREE_VALUE (elt), spc, flags, false);
585 if (TREE_CHAIN (elt))
586 pp_string (buffer, ", ");
588 pp_string (buffer, " }");
597 dump_decl_name (buffer, node, flags);
601 if (DECL_NAME (node))
602 dump_decl_name (buffer, node, flags);
603 else if (LABEL_DECL_UID (node) != -1)
604 pp_printf (buffer, "<L" HOST_WIDE_INT_PRINT_DEC ">",
605 LABEL_DECL_UID (node));
607 pp_printf (buffer, "<D%u>", DECL_UID (node));
611 if (DECL_IS_BUILTIN (node))
613 /* Don't print the declaration of built-in types. */
616 if (DECL_NAME (node))
617 dump_decl_name (buffer, node, flags);
620 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
621 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
622 && TYPE_METHODS (TREE_TYPE (node)))
624 /* The type is a c++ class: all structures have at least
626 pp_string (buffer, "class ");
627 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
632 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
633 ? "union" : "struct "));
634 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
643 dump_decl_name (buffer, node, flags);
647 pp_string (buffer, "<retval>");
651 op0 = TREE_OPERAND (node, 0);
653 if (TREE_CODE (op0) == INDIRECT_REF)
655 op0 = TREE_OPERAND (op0, 0);
658 if (op_prio (op0) < op_prio (node))
659 pp_character (buffer, '(');
660 dump_generic_node (buffer, op0, spc, flags, false);
661 if (op_prio (op0) < op_prio (node))
662 pp_character (buffer, ')');
663 pp_string (buffer, str);
664 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
666 if (TREE_CODE (op0) != VALUE_HANDLE)
668 op0 = component_ref_field_offset (node);
669 if (op0 && TREE_CODE (op0) != INTEGER_CST)
671 pp_string (buffer, "{off: ");
672 dump_generic_node (buffer, op0, spc, flags, false);
673 pp_character (buffer, '}');
679 pp_string (buffer, "BIT_FIELD_REF <");
680 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
681 pp_string (buffer, ", ");
682 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
683 pp_string (buffer, ", ");
684 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
685 pp_string (buffer, ">");
689 case ARRAY_RANGE_REF:
690 op0 = TREE_OPERAND (node, 0);
691 if (op_prio (op0) < op_prio (node))
692 pp_character (buffer, '(');
693 dump_generic_node (buffer, op0, spc, flags, false);
694 if (op_prio (op0) < op_prio (node))
695 pp_character (buffer, ')');
696 pp_character (buffer, '[');
697 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
698 if (TREE_CODE (node) == ARRAY_RANGE_REF)
699 pp_string (buffer, " ...");
700 pp_character (buffer, ']');
702 op0 = array_ref_low_bound (node);
703 op1 = array_ref_element_size (node);
705 if (!integer_zerop (op0)
706 || (TYPE_SIZE_UNIT (TREE_TYPE (node))
707 && !operand_equal_p (op1, TYPE_SIZE_UNIT (TREE_TYPE (node)), 0)))
709 pp_string (buffer, "{lb: ");
710 dump_generic_node (buffer, op0, spc, flags, false);
711 pp_string (buffer, " sz: ");
712 dump_generic_node (buffer, op1, spc, flags, false);
713 pp_character (buffer, '}');
720 bool is_struct_init = FALSE;
721 pp_character (buffer, '{');
722 lnode = CONSTRUCTOR_ELTS (node);
723 if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
724 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
725 is_struct_init = TRUE;
726 while (lnode && lnode != error_mark_node)
729 if (TREE_PURPOSE (lnode) && is_struct_init)
731 pp_character (buffer, '.');
732 dump_generic_node (buffer, TREE_PURPOSE (lnode), spc, flags, false);
733 pp_string (buffer, "=");
735 val = TREE_VALUE (lnode);
736 if (val && TREE_CODE (val) == ADDR_EXPR)
737 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
738 val = TREE_OPERAND (val, 0);
739 if (val && TREE_CODE (val) == FUNCTION_DECL)
741 dump_decl_name (buffer, val, flags);
745 dump_generic_node (buffer, TREE_VALUE (lnode), spc, flags, false);
747 lnode = TREE_CHAIN (lnode);
748 if (lnode && TREE_CODE (lnode) == TREE_LIST)
750 pp_character (buffer, ',');
754 pp_character (buffer, '}');
761 if (flags & TDF_SLIM)
763 pp_string (buffer, "<COMPOUND_EXPR>");
767 dump_generic_node (buffer, TREE_OPERAND (node, 0),
768 spc, flags, dumping_stmts);
770 newline_and_indent (buffer, spc);
773 pp_character (buffer, ',');
777 for (tp = &TREE_OPERAND (node, 1);
778 TREE_CODE (*tp) == COMPOUND_EXPR;
779 tp = &TREE_OPERAND (*tp, 1))
781 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
782 spc, flags, dumping_stmts);
784 newline_and_indent (buffer, spc);
787 pp_character (buffer, ',');
792 dump_generic_node (buffer, *tp, spc, flags, dumping_stmts);
798 tree_stmt_iterator si;
801 if ((flags & TDF_SLIM) || !dumping_stmts)
803 pp_string (buffer, "<STATEMENT_LIST>");
807 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
810 newline_and_indent (buffer, spc);
813 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
820 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
822 pp_character (buffer, '=');
824 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
828 pp_string (buffer, "TARGET_EXPR <");
829 dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false);
830 pp_character (buffer, ',');
832 dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false);
833 pp_character (buffer, '>');
837 print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags);
842 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
844 pp_string (buffer, "if (");
845 dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false);
846 pp_character (buffer, ')');
847 /* The lowered cond_exprs should always be printed in full. */
848 if (COND_EXPR_THEN (node)
849 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
850 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
851 && COND_EXPR_ELSE (node)
852 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
853 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
856 dump_generic_node (buffer, COND_EXPR_THEN (node), 0, flags, true);
857 pp_string (buffer, " else ");
858 dump_generic_node (buffer, COND_EXPR_ELSE (node), 0, flags, true);
860 else if (!(flags & TDF_SLIM))
862 /* Output COND_EXPR_THEN. */
863 if (COND_EXPR_THEN (node))
865 newline_and_indent (buffer, spc+2);
866 pp_character (buffer, '{');
867 newline_and_indent (buffer, spc+4);
868 dump_generic_node (buffer, COND_EXPR_THEN (node), spc+4,
870 newline_and_indent (buffer, spc+2);
871 pp_character (buffer, '}');
874 /* Output COND_EXPR_ELSE. */
875 if (COND_EXPR_ELSE (node))
877 newline_and_indent (buffer, spc);
878 pp_string (buffer, "else");
879 newline_and_indent (buffer, spc+2);
880 pp_character (buffer, '{');
881 newline_and_indent (buffer, spc+4);
882 dump_generic_node (buffer, COND_EXPR_ELSE (node), spc+4,
884 newline_and_indent (buffer, spc+2);
885 pp_character (buffer, '}');
892 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
894 pp_character (buffer, '?');
896 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
898 pp_character (buffer, ':');
900 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
905 pp_character (buffer, '{');
906 if (!(flags & TDF_SLIM))
908 if (BIND_EXPR_VARS (node))
912 for (op0 = BIND_EXPR_VARS (node); op0; op0 = TREE_CHAIN (op0))
914 print_declaration (buffer, op0, spc+2, flags);
919 newline_and_indent (buffer, spc+2);
920 dump_generic_node (buffer, BIND_EXPR_BODY (node), spc+2, flags, true);
921 newline_and_indent (buffer, spc);
922 pp_character (buffer, '}');
928 print_call_name (buffer, node);
930 /* Print parameters. */
932 pp_character (buffer, '(');
933 op1 = TREE_OPERAND (node, 1);
935 dump_generic_node (buffer, op1, spc, flags, false);
936 pp_character (buffer, ')');
938 op1 = TREE_OPERAND (node, 2);
941 pp_string (buffer, " [static-chain: ");
942 dump_generic_node (buffer, op1, spc, flags, false);
943 pp_character (buffer, ']');
946 if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (node))
947 pp_string (buffer, " [return slot addr]");
948 if (CALL_EXPR_TAILCALL (node))
949 pp_string (buffer, " [tail call]");
952 case WITH_CLEANUP_EXPR:
956 case CLEANUP_POINT_EXPR:
957 pp_string (buffer, "<<cleanup_point ");
958 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
959 pp_string (buffer, ">>");
962 case PLACEHOLDER_EXPR:
963 pp_string (buffer, "<PLACEHOLDER_EXPR ");
964 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
965 pp_character (buffer, '>');
968 /* Binary arithmetic and logic expressions. */
989 case TRUTH_ANDIF_EXPR:
990 case TRUTH_ORIF_EXPR:
1007 case UNORDERED_EXPR:
1009 const char *op = op_symbol (node);
1010 op0 = TREE_OPERAND (node, 0);
1011 op1 = TREE_OPERAND (node, 1);
1013 /* When the operands are expressions with less priority,
1014 keep semantics of the tree representation. */
1015 if (op_prio (op0) < op_prio (node))
1017 pp_character (buffer, '(');
1018 dump_generic_node (buffer, op0, spc, flags, false);
1019 pp_character (buffer, ')');
1022 dump_generic_node (buffer, op0, spc, flags, false);
1025 pp_string (buffer, op);
1028 /* When the operands are expressions with less priority,
1029 keep semantics of the tree representation. */
1030 if (op_prio (op1) < op_prio (node))
1032 pp_character (buffer, '(');
1033 dump_generic_node (buffer, op1, spc, flags, false);
1034 pp_character (buffer, ')');
1037 dump_generic_node (buffer, op1, spc, flags, false);
1041 /* Unary arithmetic and logic expressions. */
1044 case TRUTH_NOT_EXPR:
1046 case PREDECREMENT_EXPR:
1047 case PREINCREMENT_EXPR:
1048 case ALIGN_INDIRECT_REF:
1049 case MISALIGNED_INDIRECT_REF:
1051 if (TREE_CODE (node) == ADDR_EXPR
1052 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
1053 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
1054 ; /* Do not output '&' for strings and function pointers. */
1056 pp_string (buffer, op_symbol (node));
1058 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1060 pp_character (buffer, '(');
1061 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1062 pp_character (buffer, ')');
1065 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1067 if (TREE_CODE (node) == MISALIGNED_INDIRECT_REF)
1069 pp_string (buffer, "{misalignment: ");
1070 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1071 pp_character (buffer, '}');
1075 case POSTDECREMENT_EXPR:
1076 case POSTINCREMENT_EXPR:
1077 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1079 pp_character (buffer, '(');
1080 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1081 pp_character (buffer, ')');
1084 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1085 pp_string (buffer, op_symbol (node));
1089 pp_string (buffer, "MIN_EXPR <");
1090 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1091 pp_string (buffer, ", ");
1092 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1093 pp_character (buffer, '>');
1097 pp_string (buffer, "MAX_EXPR <");
1098 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1099 pp_string (buffer, ", ");
1100 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1101 pp_character (buffer, '>');
1105 pp_string (buffer, "ABS_EXPR <");
1106 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1107 pp_character (buffer, '>');
1114 case FIX_TRUNC_EXPR:
1116 case FIX_FLOOR_EXPR:
1117 case FIX_ROUND_EXPR:
1121 type = TREE_TYPE (node);
1122 op0 = TREE_OPERAND (node, 0);
1123 if (type != TREE_TYPE (op0))
1125 pp_character (buffer, '(');
1126 dump_generic_node (buffer, type, spc, flags, false);
1127 pp_string (buffer, ") ");
1129 if (op_prio (op0) < op_prio (node))
1130 pp_character (buffer, '(');
1131 dump_generic_node (buffer, op0, spc, flags, false);
1132 if (op_prio (op0) < op_prio (node))
1133 pp_character (buffer, ')');
1136 case VIEW_CONVERT_EXPR:
1137 pp_string (buffer, "VIEW_CONVERT_EXPR<");
1138 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1139 pp_string (buffer, ">(");
1140 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1141 pp_character (buffer, ')');
1144 case NON_LVALUE_EXPR:
1145 pp_string (buffer, "NON_LVALUE_EXPR <");
1146 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1147 pp_character (buffer, '>');
1151 pp_string (buffer, "SAVE_EXPR <");
1152 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1153 pp_character (buffer, '>');
1157 pp_string (buffer, "COMPLEX_EXPR <");
1158 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1159 pp_string (buffer, ", ");
1160 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1161 pp_string (buffer, ">");
1165 pp_string (buffer, "CONJ_EXPR <");
1166 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1167 pp_string (buffer, ">");
1171 pp_string (buffer, "REALPART_EXPR <");
1172 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1173 pp_string (buffer, ">");
1177 pp_string (buffer, "IMAGPART_EXPR <");
1178 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1179 pp_string (buffer, ">");
1183 pp_string (buffer, "VA_ARG_EXPR <");
1184 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1185 pp_string (buffer, ">");
1188 case TRY_FINALLY_EXPR:
1189 case TRY_CATCH_EXPR:
1190 pp_string (buffer, "try");
1191 newline_and_indent (buffer, spc+2);
1192 pp_string (buffer, "{");
1193 newline_and_indent (buffer, spc+4);
1194 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc+4, flags, true);
1195 newline_and_indent (buffer, spc+2);
1196 pp_string (buffer, "}");
1197 newline_and_indent (buffer, spc);
1199 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
1200 newline_and_indent (buffer, spc+2);
1201 pp_string (buffer, "{");
1202 newline_and_indent (buffer, spc+4);
1203 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
1204 newline_and_indent (buffer, spc+2);
1205 pp_string (buffer, "}");
1210 pp_string (buffer, "catch (");
1211 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
1212 pp_string (buffer, ")");
1213 newline_and_indent (buffer, spc+2);
1214 pp_string (buffer, "{");
1215 newline_and_indent (buffer, spc+4);
1216 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
1217 newline_and_indent (buffer, spc+2);
1218 pp_string (buffer, "}");
1222 case EH_FILTER_EXPR:
1223 pp_string (buffer, "<<<eh_filter (");
1224 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
1225 pp_string (buffer, ")>>>");
1226 newline_and_indent (buffer, spc+2);
1227 pp_string (buffer, "{");
1228 newline_and_indent (buffer, spc+4);
1229 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
1230 newline_and_indent (buffer, spc+2);
1231 pp_string (buffer, "}");
1236 op0 = TREE_OPERAND (node, 0);
1237 /* If this is for break or continue, don't bother printing it. */
1238 if (DECL_NAME (op0))
1240 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1241 if (strcmp (name, "break") == 0
1242 || strcmp (name, "continue") == 0)
1245 dump_generic_node (buffer, op0, spc, flags, false);
1246 pp_character (buffer, ':');
1247 if (DECL_NONLOCAL (op0))
1248 pp_string (buffer, " [non-local]");
1252 pp_string (buffer, "<<<exception object>>>");
1256 pp_string (buffer, "<<<filter object>>>");
1260 pp_string (buffer, "while (1)");
1261 if (!(flags & TDF_SLIM))
1263 newline_and_indent (buffer, spc+2);
1264 pp_character (buffer, '{');
1265 newline_and_indent (buffer, spc+4);
1266 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
1267 newline_and_indent (buffer, spc+2);
1268 pp_character (buffer, '}');
1274 pp_string (buffer, "return");
1275 op0 = TREE_OPERAND (node, 0);
1279 if (TREE_CODE (op0) == MODIFY_EXPR)
1280 dump_generic_node (buffer, TREE_OPERAND (op0, 1), spc, flags, false);
1282 dump_generic_node (buffer, op0, spc, flags, false);
1287 pp_string (buffer, "if (");
1288 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1289 pp_string (buffer, ") break");
1293 pp_string (buffer, "switch (");
1294 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
1295 pp_character (buffer, ')');
1296 if (!(flags & TDF_SLIM))
1298 newline_and_indent (buffer, spc+2);
1299 pp_character (buffer, '{');
1300 if (SWITCH_BODY (node))
1302 newline_and_indent (buffer, spc+4);
1303 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags, true);
1307 tree vec = SWITCH_LABELS (node);
1308 size_t i, n = TREE_VEC_LENGTH (vec);
1309 for (i = 0; i < n; ++i)
1311 tree elt = TREE_VEC_ELT (vec, i);
1312 newline_and_indent (buffer, spc+4);
1313 dump_generic_node (buffer, elt, spc+4, flags, false);
1314 pp_string (buffer, " goto ");
1315 dump_generic_node (buffer, CASE_LABEL (elt), spc+4, flags, true);
1316 pp_semicolon (buffer);
1319 newline_and_indent (buffer, spc+2);
1320 pp_character (buffer, '}');
1326 op0 = GOTO_DESTINATION (node);
1327 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
1329 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1330 if (strcmp (name, "break") == 0
1331 || strcmp (name, "continue") == 0)
1333 pp_string (buffer, name);
1337 pp_string (buffer, "goto ");
1338 dump_generic_node (buffer, op0, spc, flags, false);
1342 pp_string (buffer, "resx");
1343 /* ??? Any sensible way to present the eh region? */
1347 pp_string (buffer, "__asm__");
1348 if (ASM_VOLATILE_P (node))
1349 pp_string (buffer, " __volatile__");
1350 pp_character (buffer, '(');
1351 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
1352 pp_character (buffer, ':');
1353 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
1354 pp_character (buffer, ':');
1355 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
1356 if (ASM_CLOBBERS (node))
1358 pp_character (buffer, ':');
1359 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
1361 pp_string (buffer, ")");
1364 case CASE_LABEL_EXPR:
1365 if (CASE_LOW (node) && CASE_HIGH (node))
1367 pp_string (buffer, "case ");
1368 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1369 pp_string (buffer, " ... ");
1370 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
1372 else if (CASE_LOW (node))
1374 pp_string (buffer, "case ");
1375 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1378 pp_string (buffer, "default ");
1379 pp_character (buffer, ':');
1383 pp_string (buffer, "OBJ_TYPE_REF(");
1384 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
1385 pp_character (buffer, ';');
1386 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
1387 pp_character (buffer, '-');
1388 pp_character (buffer, '>');
1389 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
1390 pp_character (buffer, ')');
1397 dump_generic_node (buffer, PHI_RESULT (node), spc, flags, false);
1398 pp_string (buffer, " = PHI <");
1399 for (i = 0; i < PHI_NUM_ARGS (node); i++)
1401 dump_generic_node (buffer, PHI_ARG_DEF (node, i), spc, flags, false);
1402 pp_string (buffer, "(");
1403 pp_decimal_int (buffer, PHI_ARG_EDGE (node, i)->src->index);
1404 pp_string (buffer, ")");
1405 if (i < PHI_NUM_ARGS (node) - 1)
1406 pp_string (buffer, ", ");
1408 pp_string (buffer, ">;");
1413 dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
1414 pp_string (buffer, "_");
1415 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
1418 case WITH_SIZE_EXPR:
1419 pp_string (buffer, "WITH_SIZE_EXPR <");
1420 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1421 pp_string (buffer, ", ");
1422 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1423 pp_string (buffer, ">");
1427 pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node));
1431 pp_string (buffer, "scev_known");
1434 case SCEV_NOT_KNOWN:
1435 pp_string (buffer, "scev_not_known");
1438 case POLYNOMIAL_CHREC:
1439 pp_string (buffer, "{");
1440 dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
1441 pp_string (buffer, ", +, ");
1442 dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
1443 pp_string (buffer, "}_");
1444 dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
1448 case REALIGN_LOAD_EXPR:
1449 pp_string (buffer, "REALIGN_LOAD <");
1450 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1451 pp_string (buffer, ", ");
1452 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1453 pp_string (buffer, ", ");
1454 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1455 pp_string (buffer, ">");
1459 pp_string (buffer, " VEC_COND_EXPR < ");
1460 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1461 pp_string (buffer, " , ");
1462 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1463 pp_string (buffer, " , ");
1464 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1465 pp_string (buffer, " > ");
1472 if (is_stmt && is_expr)
1473 pp_semicolon (buffer);
1474 pp_write_text_to_stream (buffer);
1479 /* Print the declaration of a variable. */
1482 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
1486 if (TREE_CODE (t) == TYPE_DECL)
1487 pp_string (buffer, "typedef ");
1489 if (DECL_REGISTER (t))
1490 pp_string (buffer, "register ");
1492 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
1493 pp_string (buffer, "extern ");
1494 else if (TREE_STATIC (t))
1495 pp_string (buffer, "static ");
1497 /* Print the type and name. */
1498 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1502 /* Print array's type. */
1503 tmp = TREE_TYPE (t);
1504 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
1505 tmp = TREE_TYPE (tmp);
1506 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
1508 /* Print variable's name. */
1510 dump_generic_node (buffer, t, spc, flags, false);
1512 /* Print the dimensions. */
1513 tmp = TREE_TYPE (t);
1514 while (TREE_CODE (tmp) == ARRAY_TYPE)
1516 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
1517 tmp = TREE_TYPE (tmp);
1520 else if (TREE_CODE (t) == FUNCTION_DECL)
1522 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
1524 dump_decl_name (buffer, t, flags);
1525 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
1529 /* Print type declaration. */
1530 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
1532 /* Print variable's name. */
1534 dump_generic_node (buffer, t, spc, flags, false);
1537 if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
1539 pp_string (buffer, " __asm__ ");
1540 pp_character (buffer, '(');
1541 dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
1542 pp_character (buffer, ')');
1545 /* The initial value of a function serves to determine wether the function
1546 is declared or defined. So the following does not apply to function
1548 if (TREE_CODE (t) != FUNCTION_DECL)
1550 /* Print the initial value. */
1551 if (DECL_INITIAL (t))
1554 pp_character (buffer, '=');
1556 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
1560 pp_character (buffer, ';');
1564 /* Prints a structure: name, fields, and methods.
1565 FIXME: Still incomplete. */
1568 print_struct_decl (pretty_printer *buffer, tree node, int spc, int flags)
1570 /* Print the name of the structure. */
1571 if (TYPE_NAME (node))
1574 if (TREE_CODE (node) == RECORD_TYPE)
1575 pp_string (buffer, "struct ");
1576 else if ((TREE_CODE (node) == UNION_TYPE
1577 || TREE_CODE (node) == QUAL_UNION_TYPE))
1578 pp_string (buffer, "union ");
1580 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
1583 /* Print the contents of the structure. */
1584 pp_newline (buffer);
1586 pp_character (buffer, '{');
1587 pp_newline (buffer);
1589 /* Print the fields of the structure. */
1592 tmp = TYPE_FIELDS (node);
1595 /* Avoid to print recursively the structure. */
1596 /* FIXME : Not implemented correctly...,
1597 what about the case when we have a cycle in the contain graph? ...
1598 Maybe this could be solved by looking at the scope in which the
1599 structure was declared. */
1600 if (TREE_TYPE (tmp) != node
1601 || (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
1602 && TREE_TYPE (TREE_TYPE (tmp)) != node))
1604 print_declaration (buffer, tmp, spc+2, flags);
1605 pp_newline (buffer);
1607 tmp = TREE_CHAIN (tmp);
1611 pp_character (buffer, '}');
1614 /* Return the priority of the operator OP.
1616 From lowest to highest precedence with either left-to-right (L-R)
1617 or right-to-left (R-L) associativity]:
1620 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
1632 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
1633 15 [L-R] fn() [] -> .
1635 unary +, - and * have higher precedence than the corresponding binary
1644 switch (TREE_CODE (op))
1659 case TRUTH_ORIF_EXPR:
1662 case TRUTH_AND_EXPR:
1663 case TRUTH_ANDIF_EXPR:
1670 case TRUTH_XOR_EXPR:
1687 case UNORDERED_EXPR:
1705 case TRUNC_DIV_EXPR:
1707 case FLOOR_DIV_EXPR:
1708 case ROUND_DIV_EXPR:
1710 case EXACT_DIV_EXPR:
1711 case TRUNC_MOD_EXPR:
1713 case FLOOR_MOD_EXPR:
1714 case ROUND_MOD_EXPR:
1717 case TRUTH_NOT_EXPR:
1719 case POSTINCREMENT_EXPR:
1720 case POSTDECREMENT_EXPR:
1721 case PREINCREMENT_EXPR:
1722 case PREDECREMENT_EXPR:
1724 case ALIGN_INDIRECT_REF:
1725 case MISALIGNED_INDIRECT_REF:
1731 case FIX_TRUNC_EXPR:
1733 case FIX_FLOOR_EXPR:
1734 case FIX_ROUND_EXPR:
1740 case ARRAY_RANGE_REF:
1744 /* Special expressions. */
1753 case NON_LVALUE_EXPR:
1754 return op_prio (TREE_OPERAND (op, 0));
1757 /* Return an arbitrarily high precedence to avoid surrounding single
1758 VAR_DECLs in ()s. */
1764 /* Return the symbol associated with operator OP. */
1771 switch (TREE_CODE (op))
1777 case TRUTH_ORIF_EXPR:
1780 case TRUTH_AND_EXPR:
1781 case TRUTH_ANDIF_EXPR:
1787 case TRUTH_XOR_EXPR:
1797 case UNORDERED_EXPR:
1847 case TRUTH_NOT_EXPR:
1854 case ALIGN_INDIRECT_REF:
1857 case MISALIGNED_INDIRECT_REF:
1860 case TRUNC_DIV_EXPR:
1867 case FLOOR_DIV_EXPR:
1870 case ROUND_DIV_EXPR:
1873 case EXACT_DIV_EXPR:
1876 case TRUNC_MOD_EXPR:
1882 case FLOOR_MOD_EXPR:
1885 case ROUND_MOD_EXPR:
1888 case PREDECREMENT_EXPR:
1891 case PREINCREMENT_EXPR:
1894 case POSTDECREMENT_EXPR:
1897 case POSTINCREMENT_EXPR:
1901 return "<<< ??? >>>";
1905 /* Prints the name of a CALL_EXPR. */
1908 print_call_name (pretty_printer *buffer, tree node)
1912 gcc_assert (TREE_CODE (node) == CALL_EXPR);
1914 op0 = TREE_OPERAND (node, 0);
1916 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
1917 op0 = TREE_OPERAND (op0, 0);
1919 switch (TREE_CODE (op0))
1923 dump_function_name (buffer, op0);
1929 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
1933 pp_string (buffer, "(");
1934 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
1935 pp_string (buffer, ") ? ");
1936 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, 0, false);
1937 pp_string (buffer, " : ");
1938 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, 0, false);
1942 /* The function is a pointer contained in a structure. */
1943 if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
1944 TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
1945 dump_function_name (buffer, TREE_OPERAND (op0, 1));
1947 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
1949 We can have several levels of structures and a function
1950 pointer inside. This is not implemented yet... */
1955 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
1956 dump_function_name (buffer, TREE_OPERAND (op0, 0));
1958 dump_generic_node (buffer, op0, 0, 0, false);
1963 dump_generic_node (buffer, op0, 0, 0, false);
1971 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
1974 pretty_print_string (pretty_printer *buffer, const char *str)
1984 pp_string (buffer, "\\b");
1988 pp_string (buffer, "\\f");
1992 pp_string (buffer, "\\n");
1996 pp_string (buffer, "\\r");
2000 pp_string (buffer, "\\t");
2004 pp_string (buffer, "\\v");
2008 pp_string (buffer, "\\\\");
2012 pp_string (buffer, "\\\"");
2016 pp_string (buffer, "\\'");
2020 pp_string (buffer, "\\0");
2024 pp_string (buffer, "\\1");
2028 pp_string (buffer, "\\2");
2032 pp_string (buffer, "\\3");
2036 pp_string (buffer, "\\4");
2040 pp_string (buffer, "\\5");
2044 pp_string (buffer, "\\6");
2048 pp_string (buffer, "\\7");
2052 pp_character (buffer, str[0]);
2060 maybe_init_pretty_print (FILE *file)
2064 pp_construct (&buffer, /* prefix */NULL, /* line-width */0);
2065 pp_needs_newline (&buffer) = true;
2069 buffer.buffer->stream = file;
2073 newline_and_indent (pretty_printer *buffer, int spc)
2075 pp_newline (buffer);
2080 dump_vops (pretty_printer *buffer, tree stmt, int spc, int flags)
2083 use_operand_p use_p;
2084 def_operand_p def_p;
2085 use_operand_p kill_p;
2088 FOR_EACH_SSA_MAYDEF_OPERAND (def_p, use_p, stmt, iter)
2090 pp_string (buffer, "# ");
2091 dump_generic_node (buffer, DEF_FROM_PTR (def_p),
2092 spc + 2, flags, false);
2093 pp_string (buffer, " = V_MAY_DEF <");
2094 dump_generic_node (buffer, USE_FROM_PTR (use_p),
2095 spc + 2, flags, false);
2096 pp_string (buffer, ">;");
2097 newline_and_indent (buffer, spc);
2100 FOR_EACH_SSA_MUSTDEF_OPERAND (def_p, kill_p, stmt, iter)
2102 pp_string (buffer, "# ");
2103 dump_generic_node (buffer, DEF_FROM_PTR (def_p),
2104 spc + 2, flags, false);
2105 pp_string (buffer, " = V_MUST_DEF <");
2106 dump_generic_node (buffer, USE_FROM_PTR (kill_p),
2107 spc + 2, flags, false);
2108 pp_string (buffer, ">;");
2109 newline_and_indent (buffer, spc);
2112 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_VUSE)
2114 pp_string (buffer, "# VUSE <");
2115 dump_generic_node (buffer, use, spc + 2, flags, false);
2116 pp_string (buffer, ">;");
2117 newline_and_indent (buffer, spc);
2121 /* Dumps basic block BB to FILE with details described by FLAGS and
2122 indented by INDENT spaces. */
2125 dump_generic_bb (FILE *file, basic_block bb, int indent, int flags)
2127 maybe_init_pretty_print (file);
2128 dumping_stmts = true;
2129 dump_generic_bb_buff (&buffer, bb, indent, flags);
2133 /* Dumps header of basic block BB to buffer BUFFER indented by INDENT
2134 spaces and details described by flags. */
2137 dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
2143 if (flags & TDF_BLOCKS)
2146 pp_string (buffer, "# BLOCK ");
2147 pp_decimal_int (buffer, bb->index);
2149 if (flags & TDF_LINENO)
2151 block_stmt_iterator bsi;
2153 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2154 if (get_lineno (bsi_stmt (bsi)) != -1)
2156 pp_string (buffer, ", starting at line ");
2157 pp_decimal_int (buffer, get_lineno (bsi_stmt (bsi)));
2161 newline_and_indent (buffer, indent);
2163 pp_string (buffer, "# PRED:");
2164 pp_write_text_to_stream (buffer);
2165 FOR_EACH_EDGE (e, ei, bb->preds)
2166 if (flags & TDF_SLIM)
2168 pp_string (buffer, " ");
2169 if (e->src == ENTRY_BLOCK_PTR)
2170 pp_string (buffer, "ENTRY");
2172 pp_decimal_int (buffer, e->src->index);
2175 dump_edge_info (buffer->buffer->stream, e, 0);
2176 pp_newline (buffer);
2180 stmt = first_stmt (bb);
2181 if (!stmt || TREE_CODE (stmt) != LABEL_EXPR)
2183 INDENT (indent - 2);
2184 pp_string (buffer, "<bb ");
2185 pp_decimal_int (buffer, bb->index);
2186 pp_string (buffer, ">:");
2187 pp_newline (buffer);
2190 pp_write_text_to_stream (buffer);
2191 check_bb_profile (bb, buffer->buffer->stream);
2194 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
2198 dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
2204 pp_string (buffer, "# SUCC:");
2205 pp_write_text_to_stream (buffer);
2206 FOR_EACH_EDGE (e, ei, bb->succs)
2207 if (flags & TDF_SLIM)
2209 pp_string (buffer, " ");
2210 if (e->dest == EXIT_BLOCK_PTR)
2211 pp_string (buffer, "EXIT");
2213 pp_decimal_int (buffer, e->dest->index);
2216 dump_edge_info (buffer->buffer->stream, e, 1);
2217 pp_newline (buffer);
2220 /* Dumps phi nodes of basic block BB to buffer BUFFER with details described by
2221 FLAGS indented by INDENT spaces. */
2224 dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags)
2226 tree phi = phi_nodes (bb);
2230 for (; phi; phi = PHI_CHAIN (phi))
2232 if (is_gimple_reg (PHI_RESULT (phi)) || (flags & TDF_VOPS))
2235 pp_string (buffer, "# ");
2236 dump_generic_node (buffer, phi, indent, flags, false);
2237 pp_newline (buffer);
2242 /* Dump jump to basic block BB that is represented implicitly in the cfg
2246 pp_cfg_jump (pretty_printer *buffer, basic_block bb)
2250 stmt = first_stmt (bb);
2252 pp_string (buffer, "goto <bb ");
2253 pp_decimal_int (buffer, bb->index);
2254 pp_string (buffer, ">");
2255 if (stmt && TREE_CODE (stmt) == LABEL_EXPR)
2257 pp_string (buffer, " (");
2258 dump_generic_node (buffer, LABEL_EXPR_LABEL (stmt), 0, 0, false);
2259 pp_string (buffer, ")");
2261 pp_semicolon (buffer);
2264 /* Dump edges represented implicitly in basic block BB to BUFFER, indented
2265 by INDENT spaces, with details given by FLAGS. */
2268 dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent,
2274 /* If there is a fallthru edge, we may need to add an artificial goto to the
2276 FOR_EACH_EDGE (e, ei, bb->succs)
2277 if (e->flags & EDGE_FALLTHRU)
2279 if (e && e->dest != bb->next_bb)
2283 if ((flags & TDF_LINENO)
2284 #ifdef USE_MAPPED_LOCATION
2285 && e->goto_locus != UNKNOWN_LOCATION
2291 expanded_location goto_xloc;
2292 #ifdef USE_MAPPED_LOCATION
2293 goto_xloc = expand_location (e->goto_locus);
2295 goto_xloc = *e->goto_locus;
2297 pp_character (buffer, '[');
2300 pp_string (buffer, goto_xloc.file);
2301 pp_string (buffer, " : ");
2303 pp_decimal_int (buffer, goto_xloc.line);
2304 pp_string (buffer, "] ");
2307 pp_cfg_jump (buffer, e->dest);
2308 pp_newline (buffer);
2312 /* Dumps basic block BB to buffer BUFFER with details described by FLAGS and
2313 indented by INDENT spaces. */
2316 dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
2317 int indent, int flags)
2319 block_stmt_iterator bsi;
2321 int label_indent = indent - 2;
2323 if (label_indent < 0)
2326 dump_bb_header (buffer, bb, indent, flags);
2329 dump_phi_nodes (buffer, bb, indent, flags);
2331 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2335 stmt = bsi_stmt (bsi);
2337 curr_indent = TREE_CODE (stmt) == LABEL_EXPR ? label_indent : indent;
2339 INDENT (curr_indent);
2340 dump_generic_node (buffer, stmt, curr_indent, flags, true);
2341 pp_newline (buffer);
2344 dump_implicit_edges (buffer, bb, indent, flags);
2346 if (flags & TDF_BLOCKS)
2347 dump_bb_end (buffer, bb, indent, flags);