1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001, 2002, 2003, 2004 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, "::");
452 /* Print the innermost component type. */
453 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
454 tmp = TREE_TYPE (tmp))
456 dump_generic_node (buffer, tmp, spc, flags, false);
458 /* Print the dimensions. */
459 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
460 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
470 case QUAL_UNION_TYPE:
471 /* Print the name of the structure. */
472 if (TREE_CODE (node) == RECORD_TYPE)
473 pp_string (buffer, "struct ");
474 else if (TREE_CODE (node) == UNION_TYPE)
475 pp_string (buffer, "union ");
477 if (TYPE_NAME (node))
478 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
480 print_struct_decl (buffer, node, spc, flags);
488 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
490 /* In the case of a pointer, one may want to divide by the
491 size of the pointed-to type. Unfortunately, this not
492 straightforward. The C front-end maps expressions
497 in such a way that the two INTEGER_CST nodes for "5" have
498 different values but identical types. In the latter
499 case, the 5 is multiplied by sizeof (int) in c-common.c
500 (pointer_int_sum) to convert it to a byte address, and
501 yet the type of the node is left unchanged. Argh. What
502 is consistent though is that the number value corresponds
503 to bytes (UNITS) offset.
505 NB: Neither of the following divisors can be trivially
506 used to recover the original literal:
508 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
509 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
510 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
511 pp_string (buffer, "B"); /* pseudo-unit */
513 else if (! host_integerp (node, 0))
517 if (tree_int_cst_sgn (val) < 0)
519 pp_character (buffer, '-');
520 val = build_int_cst_wide (NULL_TREE,
521 -TREE_INT_CST_LOW (val),
522 ~TREE_INT_CST_HIGH (val)
523 + !TREE_INT_CST_LOW (val));
525 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
528 static char format[10]; /* "%x%09999x\0" */
530 sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
531 sprintf (pp_buffer (buffer)->digit_buffer, format,
532 TREE_INT_CST_HIGH (val),
533 TREE_INT_CST_LOW (val));
534 pp_string (buffer, pp_buffer (buffer)->digit_buffer);
538 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
542 /* Code copied from print_node. */
545 if (TREE_OVERFLOW (node))
546 pp_string (buffer, " overflow");
548 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
549 d = TREE_REAL_CST (node);
550 if (REAL_VALUE_ISINF (d))
551 pp_string (buffer, " Inf");
552 else if (REAL_VALUE_ISNAN (d))
553 pp_string (buffer, " Nan");
557 real_to_decimal (string, &d, sizeof (string), 0, 1);
558 pp_string (buffer, string);
563 unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
564 pp_string (buffer, "0x");
565 for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
566 output_formatted_integer (buffer, "%02x", *p++);
573 pp_string (buffer, "__complex__ (");
574 dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
575 pp_string (buffer, ", ");
576 dump_generic_node (buffer, TREE_IMAGPART (node), spc, flags, false);
577 pp_string (buffer, ")");
581 pp_string (buffer, "\"");
582 pretty_print_string (buffer, TREE_STRING_POINTER (node));
583 pp_string (buffer, "\"");
589 pp_string (buffer, "{ ");
590 for (elt = TREE_VECTOR_CST_ELTS (node); elt; elt = TREE_CHAIN (elt))
592 dump_generic_node (buffer, TREE_VALUE (elt), spc, flags, false);
593 if (TREE_CHAIN (elt))
594 pp_string (buffer, ", ");
596 pp_string (buffer, " }");
605 dump_decl_name (buffer, node, flags);
609 if (DECL_NAME (node))
610 dump_decl_name (buffer, node, flags);
611 else if (LABEL_DECL_UID (node) != -1)
612 pp_printf (buffer, "<L" HOST_WIDE_INT_PRINT_DEC ">",
613 LABEL_DECL_UID (node));
615 pp_printf (buffer, "<D%u>", DECL_UID (node));
619 if (DECL_IS_BUILTIN (node))
621 /* Don't print the declaration of built-in types. */
624 if (DECL_NAME (node))
625 dump_decl_name (buffer, node, flags);
628 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
629 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
630 && TYPE_METHODS (TREE_TYPE (node)))
632 /* The type is a c++ class: all structures have at least
634 pp_string (buffer, "class ");
635 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
640 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
641 ? "union" : "struct "));
642 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
651 dump_decl_name (buffer, node, flags);
655 pp_string (buffer, "<retval>");
659 op0 = TREE_OPERAND (node, 0);
661 if (TREE_CODE (op0) == INDIRECT_REF)
663 op0 = TREE_OPERAND (op0, 0);
666 if (op_prio (op0) < op_prio (node))
667 pp_character (buffer, '(');
668 dump_generic_node (buffer, op0, spc, flags, false);
669 if (op_prio (op0) < op_prio (node))
670 pp_character (buffer, ')');
671 pp_string (buffer, str);
672 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
674 if (TREE_CODE (op0) != VALUE_HANDLE)
676 op0 = component_ref_field_offset (node);
677 if (op0 && TREE_CODE (op0) != INTEGER_CST)
679 pp_string (buffer, "{off: ");
680 dump_generic_node (buffer, op0, spc, flags, false);
681 pp_character (buffer, '}');
687 pp_string (buffer, "BIT_FIELD_REF <");
688 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
689 pp_string (buffer, ", ");
690 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
691 pp_string (buffer, ", ");
692 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
693 pp_string (buffer, ">");
697 case ARRAY_RANGE_REF:
698 op0 = TREE_OPERAND (node, 0);
699 if (op_prio (op0) < op_prio (node))
700 pp_character (buffer, '(');
701 dump_generic_node (buffer, op0, spc, flags, false);
702 if (op_prio (op0) < op_prio (node))
703 pp_character (buffer, ')');
704 pp_character (buffer, '[');
705 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
706 if (TREE_CODE (node) == ARRAY_RANGE_REF)
707 pp_string (buffer, " ...");
708 pp_character (buffer, ']');
710 op0 = array_ref_low_bound (node);
711 op1 = array_ref_element_size (node);
713 if (!integer_zerop (op0)
714 || (TYPE_SIZE_UNIT (TREE_TYPE (node))
715 && !operand_equal_p (op1, TYPE_SIZE_UNIT (TREE_TYPE (node)), 0)))
717 pp_string (buffer, "{lb: ");
718 dump_generic_node (buffer, op0, spc, flags, false);
719 pp_string (buffer, " sz: ");
720 dump_generic_node (buffer, op1, spc, flags, false);
721 pp_character (buffer, '}');
728 bool is_struct_init = FALSE;
729 pp_character (buffer, '{');
730 lnode = CONSTRUCTOR_ELTS (node);
731 if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
732 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
733 is_struct_init = TRUE;
734 while (lnode && lnode != error_mark_node)
737 if (TREE_PURPOSE (lnode) && is_struct_init)
739 pp_character (buffer, '.');
740 dump_generic_node (buffer, TREE_PURPOSE (lnode), spc, flags, false);
741 pp_string (buffer, "=");
743 val = TREE_VALUE (lnode);
744 if (val && TREE_CODE (val) == ADDR_EXPR)
745 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
746 val = TREE_OPERAND (val, 0);
747 if (val && TREE_CODE (val) == FUNCTION_DECL)
749 dump_decl_name (buffer, val, flags);
753 dump_generic_node (buffer, TREE_VALUE (lnode), spc, flags, false);
755 lnode = TREE_CHAIN (lnode);
756 if (lnode && TREE_CODE (lnode) == TREE_LIST)
758 pp_character (buffer, ',');
762 pp_character (buffer, '}');
769 if (flags & TDF_SLIM)
771 pp_string (buffer, "<COMPOUND_EXPR>");
775 dump_generic_node (buffer, TREE_OPERAND (node, 0),
776 spc, flags, dumping_stmts);
778 newline_and_indent (buffer, spc);
781 pp_character (buffer, ',');
785 for (tp = &TREE_OPERAND (node, 1);
786 TREE_CODE (*tp) == COMPOUND_EXPR;
787 tp = &TREE_OPERAND (*tp, 1))
789 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
790 spc, flags, dumping_stmts);
792 newline_and_indent (buffer, spc);
795 pp_character (buffer, ',');
800 dump_generic_node (buffer, *tp, spc, flags, dumping_stmts);
806 tree_stmt_iterator si;
809 if ((flags & TDF_SLIM) || !dumping_stmts)
811 pp_string (buffer, "<STATEMENT_LIST>");
815 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
818 newline_and_indent (buffer, spc);
821 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
828 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
830 pp_character (buffer, '=');
832 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
836 pp_string (buffer, "TARGET_EXPR <");
837 dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false);
838 pp_character (buffer, ',');
840 dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false);
841 pp_character (buffer, '>');
845 print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags);
850 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
852 pp_string (buffer, "if (");
853 dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false);
854 pp_character (buffer, ')');
855 /* The lowered cond_exprs should always be printed in full. */
856 if (COND_EXPR_THEN (node)
857 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
858 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
859 && COND_EXPR_ELSE (node)
860 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
861 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
864 dump_generic_node (buffer, COND_EXPR_THEN (node), 0, flags, true);
865 pp_string (buffer, " else ");
866 dump_generic_node (buffer, COND_EXPR_ELSE (node), 0, flags, true);
868 else if (!(flags & TDF_SLIM))
870 /* Output COND_EXPR_THEN. */
871 if (COND_EXPR_THEN (node))
873 newline_and_indent (buffer, spc+2);
874 pp_character (buffer, '{');
875 newline_and_indent (buffer, spc+4);
876 dump_generic_node (buffer, COND_EXPR_THEN (node), spc+4,
878 newline_and_indent (buffer, spc+2);
879 pp_character (buffer, '}');
882 /* Output COND_EXPR_ELSE. */
883 if (COND_EXPR_ELSE (node))
885 newline_and_indent (buffer, spc);
886 pp_string (buffer, "else");
887 newline_and_indent (buffer, spc+2);
888 pp_character (buffer, '{');
889 newline_and_indent (buffer, spc+4);
890 dump_generic_node (buffer, COND_EXPR_ELSE (node), spc+4,
892 newline_and_indent (buffer, spc+2);
893 pp_character (buffer, '}');
900 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
902 pp_character (buffer, '?');
904 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
906 pp_character (buffer, ':');
908 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
913 pp_character (buffer, '{');
914 if (!(flags & TDF_SLIM))
916 if (BIND_EXPR_VARS (node))
920 for (op0 = BIND_EXPR_VARS (node); op0; op0 = TREE_CHAIN (op0))
922 print_declaration (buffer, op0, spc+2, flags);
927 newline_and_indent (buffer, spc+2);
928 dump_generic_node (buffer, BIND_EXPR_BODY (node), spc+2, flags, true);
929 newline_and_indent (buffer, spc);
930 pp_character (buffer, '}');
936 print_call_name (buffer, node);
938 /* Print parameters. */
940 pp_character (buffer, '(');
941 op1 = TREE_OPERAND (node, 1);
943 dump_generic_node (buffer, op1, spc, flags, false);
944 pp_character (buffer, ')');
946 op1 = TREE_OPERAND (node, 2);
949 pp_string (buffer, " [static-chain: ");
950 dump_generic_node (buffer, op1, spc, flags, false);
951 pp_character (buffer, ']');
954 if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (node))
955 pp_string (buffer, " [return slot addr]");
956 if (CALL_EXPR_TAILCALL (node))
957 pp_string (buffer, " [tail call]");
960 case WITH_CLEANUP_EXPR:
964 case CLEANUP_POINT_EXPR:
965 pp_string (buffer, "<<cleanup_point ");
966 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
967 pp_string (buffer, ">>");
970 case PLACEHOLDER_EXPR:
971 pp_string (buffer, "<PLACEHOLDER_EXPR ");
972 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
973 pp_character (buffer, '>');
976 /* Binary arithmetic and logic expressions. */
997 case TRUTH_ANDIF_EXPR:
998 case TRUTH_ORIF_EXPR:
1001 case TRUTH_XOR_EXPR:
1015 case UNORDERED_EXPR:
1017 const char *op = op_symbol (node);
1018 op0 = TREE_OPERAND (node, 0);
1019 op1 = TREE_OPERAND (node, 1);
1021 /* When the operands are expressions with less priority,
1022 keep semantics of the tree representation. */
1023 if (op_prio (op0) < op_prio (node))
1025 pp_character (buffer, '(');
1026 dump_generic_node (buffer, op0, spc, flags, false);
1027 pp_character (buffer, ')');
1030 dump_generic_node (buffer, op0, spc, flags, false);
1033 pp_string (buffer, op);
1036 /* When the operands are expressions with less priority,
1037 keep semantics of the tree representation. */
1038 if (op_prio (op1) < op_prio (node))
1040 pp_character (buffer, '(');
1041 dump_generic_node (buffer, op1, spc, flags, false);
1042 pp_character (buffer, ')');
1045 dump_generic_node (buffer, op1, spc, flags, false);
1049 /* Unary arithmetic and logic expressions. */
1052 case TRUTH_NOT_EXPR:
1054 case PREDECREMENT_EXPR:
1055 case PREINCREMENT_EXPR:
1056 case ALIGN_INDIRECT_REF:
1057 case MISALIGNED_INDIRECT_REF:
1059 if (TREE_CODE (node) == ADDR_EXPR
1060 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
1061 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
1062 ; /* Do not output '&' for strings and function pointers. */
1064 pp_string (buffer, op_symbol (node));
1066 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1068 pp_character (buffer, '(');
1069 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1070 pp_character (buffer, ')');
1073 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1075 if (TREE_CODE (node) == MISALIGNED_INDIRECT_REF)
1077 pp_string (buffer, "{misalignment: ");
1078 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1079 pp_character (buffer, '}');
1083 case POSTDECREMENT_EXPR:
1084 case POSTINCREMENT_EXPR:
1085 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1087 pp_character (buffer, '(');
1088 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1089 pp_character (buffer, ')');
1092 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1093 pp_string (buffer, op_symbol (node));
1097 pp_string (buffer, "MIN_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, "MAX_EXPR <");
1106 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1107 pp_string (buffer, ", ");
1108 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1109 pp_character (buffer, '>');
1113 pp_string (buffer, "ABS_EXPR <");
1114 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1115 pp_character (buffer, '>');
1122 case FIX_TRUNC_EXPR:
1124 case FIX_FLOOR_EXPR:
1125 case FIX_ROUND_EXPR:
1129 type = TREE_TYPE (node);
1130 op0 = TREE_OPERAND (node, 0);
1131 if (type != TREE_TYPE (op0))
1133 pp_character (buffer, '(');
1134 dump_generic_node (buffer, type, spc, flags, false);
1135 pp_string (buffer, ") ");
1137 if (op_prio (op0) < op_prio (node))
1138 pp_character (buffer, '(');
1139 dump_generic_node (buffer, op0, spc, flags, false);
1140 if (op_prio (op0) < op_prio (node))
1141 pp_character (buffer, ')');
1144 case VIEW_CONVERT_EXPR:
1145 pp_string (buffer, "VIEW_CONVERT_EXPR<");
1146 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1147 pp_string (buffer, ">(");
1148 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1149 pp_character (buffer, ')');
1152 case NON_LVALUE_EXPR:
1153 pp_string (buffer, "NON_LVALUE_EXPR <");
1154 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1155 pp_character (buffer, '>');
1159 pp_string (buffer, "SAVE_EXPR <");
1160 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1161 pp_character (buffer, '>');
1165 pp_string (buffer, "COMPLEX_EXPR <");
1166 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1167 pp_string (buffer, ", ");
1168 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1169 pp_string (buffer, ">");
1173 pp_string (buffer, "CONJ_EXPR <");
1174 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1175 pp_string (buffer, ">");
1179 pp_string (buffer, "REALPART_EXPR <");
1180 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1181 pp_string (buffer, ">");
1185 pp_string (buffer, "IMAGPART_EXPR <");
1186 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1187 pp_string (buffer, ">");
1191 pp_string (buffer, "VA_ARG_EXPR <");
1192 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1193 pp_string (buffer, ">");
1196 case TRY_FINALLY_EXPR:
1197 case TRY_CATCH_EXPR:
1198 pp_string (buffer, "try");
1199 newline_and_indent (buffer, spc+2);
1200 pp_string (buffer, "{");
1201 newline_and_indent (buffer, spc+4);
1202 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc+4, flags, true);
1203 newline_and_indent (buffer, spc+2);
1204 pp_string (buffer, "}");
1205 newline_and_indent (buffer, spc);
1207 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
1208 newline_and_indent (buffer, spc+2);
1209 pp_string (buffer, "{");
1210 newline_and_indent (buffer, spc+4);
1211 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
1212 newline_and_indent (buffer, spc+2);
1213 pp_string (buffer, "}");
1218 pp_string (buffer, "catch (");
1219 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
1220 pp_string (buffer, ")");
1221 newline_and_indent (buffer, spc+2);
1222 pp_string (buffer, "{");
1223 newline_and_indent (buffer, spc+4);
1224 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
1225 newline_and_indent (buffer, spc+2);
1226 pp_string (buffer, "}");
1230 case EH_FILTER_EXPR:
1231 pp_string (buffer, "<<<eh_filter (");
1232 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
1233 pp_string (buffer, ")>>>");
1234 newline_and_indent (buffer, spc+2);
1235 pp_string (buffer, "{");
1236 newline_and_indent (buffer, spc+4);
1237 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
1238 newline_and_indent (buffer, spc+2);
1239 pp_string (buffer, "}");
1244 op0 = TREE_OPERAND (node, 0);
1245 /* If this is for break or continue, don't bother printing it. */
1246 if (DECL_NAME (op0))
1248 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1249 if (strcmp (name, "break") == 0
1250 || strcmp (name, "continue") == 0)
1253 dump_generic_node (buffer, op0, spc, flags, false);
1254 pp_character (buffer, ':');
1255 if (DECL_NONLOCAL (op0))
1256 pp_string (buffer, " [non-local]");
1260 pp_string (buffer, "<<<exception object>>>");
1264 pp_string (buffer, "<<<filter object>>>");
1268 pp_string (buffer, "while (1)");
1269 if (!(flags & TDF_SLIM))
1271 newline_and_indent (buffer, spc+2);
1272 pp_character (buffer, '{');
1273 newline_and_indent (buffer, spc+4);
1274 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
1275 newline_and_indent (buffer, spc+2);
1276 pp_character (buffer, '}');
1282 pp_string (buffer, "return");
1283 op0 = TREE_OPERAND (node, 0);
1287 if (TREE_CODE (op0) == MODIFY_EXPR)
1288 dump_generic_node (buffer, TREE_OPERAND (op0, 1), spc, flags, false);
1290 dump_generic_node (buffer, op0, spc, flags, false);
1295 pp_string (buffer, "if (");
1296 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1297 pp_string (buffer, ") break");
1301 pp_string (buffer, "switch (");
1302 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
1303 pp_character (buffer, ')');
1304 if (!(flags & TDF_SLIM))
1306 newline_and_indent (buffer, spc+2);
1307 pp_character (buffer, '{');
1308 if (SWITCH_BODY (node))
1310 newline_and_indent (buffer, spc+4);
1311 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags, true);
1315 tree vec = SWITCH_LABELS (node);
1316 size_t i, n = TREE_VEC_LENGTH (vec);
1317 for (i = 0; i < n; ++i)
1319 tree elt = TREE_VEC_ELT (vec, i);
1320 newline_and_indent (buffer, spc+4);
1321 dump_generic_node (buffer, elt, spc+4, flags, false);
1322 pp_string (buffer, " goto ");
1323 dump_generic_node (buffer, CASE_LABEL (elt), spc+4, flags, true);
1324 pp_semicolon (buffer);
1327 newline_and_indent (buffer, spc+2);
1328 pp_character (buffer, '}');
1334 op0 = GOTO_DESTINATION (node);
1335 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
1337 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1338 if (strcmp (name, "break") == 0
1339 || strcmp (name, "continue") == 0)
1341 pp_string (buffer, name);
1345 pp_string (buffer, "goto ");
1346 dump_generic_node (buffer, op0, spc, flags, false);
1350 pp_string (buffer, "resx");
1351 /* ??? Any sensible way to present the eh region? */
1355 pp_string (buffer, "__asm__");
1356 if (ASM_VOLATILE_P (node))
1357 pp_string (buffer, " __volatile__");
1358 pp_character (buffer, '(');
1359 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
1360 pp_character (buffer, ':');
1361 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
1362 pp_character (buffer, ':');
1363 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
1364 if (ASM_CLOBBERS (node))
1366 pp_character (buffer, ':');
1367 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
1369 pp_string (buffer, ")");
1372 case CASE_LABEL_EXPR:
1373 if (CASE_LOW (node) && CASE_HIGH (node))
1375 pp_string (buffer, "case ");
1376 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1377 pp_string (buffer, " ... ");
1378 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
1380 else if (CASE_LOW (node))
1382 pp_string (buffer, "case ");
1383 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1386 pp_string (buffer, "default ");
1387 pp_character (buffer, ':');
1391 pp_string (buffer, "OBJ_TYPE_REF(");
1392 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
1393 pp_character (buffer, ';');
1394 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
1395 pp_character (buffer, '-');
1396 pp_character (buffer, '>');
1397 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
1398 pp_character (buffer, ')');
1405 dump_generic_node (buffer, PHI_RESULT (node), spc, flags, false);
1406 pp_string (buffer, " = PHI <");
1407 for (i = 0; i < PHI_NUM_ARGS (node); i++)
1409 dump_generic_node (buffer, PHI_ARG_DEF (node, i), spc, flags, false);
1410 pp_string (buffer, "(");
1411 pp_decimal_int (buffer, PHI_ARG_EDGE (node, i)->src->index);
1412 pp_string (buffer, ")");
1413 if (i < PHI_NUM_ARGS (node) - 1)
1414 pp_string (buffer, ", ");
1416 pp_string (buffer, ">;");
1421 dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
1422 pp_string (buffer, "_");
1423 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
1426 case WITH_SIZE_EXPR:
1427 pp_string (buffer, "WITH_SIZE_EXPR <");
1428 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1429 pp_string (buffer, ", ");
1430 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1431 pp_string (buffer, ">");
1435 pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node));
1439 pp_string (buffer, "scev_known");
1442 case SCEV_NOT_KNOWN:
1443 pp_string (buffer, "scev_not_known");
1446 case POLYNOMIAL_CHREC:
1447 pp_string (buffer, "{");
1448 dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
1449 pp_string (buffer, ", +, ");
1450 dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
1451 pp_string (buffer, "}_");
1452 dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
1456 case REALIGN_LOAD_EXPR:
1457 pp_string (buffer, "REALIGN_LOAD <");
1458 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1459 pp_string (buffer, ", ");
1460 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1461 pp_string (buffer, ", ");
1462 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1463 pp_string (buffer, ">");
1467 pp_string (buffer, " VEC_COND_EXPR < ");
1468 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1469 pp_string (buffer, " , ");
1470 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1471 pp_string (buffer, " , ");
1472 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1473 pp_string (buffer, " > ");
1480 if (is_stmt && is_expr)
1481 pp_semicolon (buffer);
1482 pp_write_text_to_stream (buffer);
1487 /* Print the declaration of a variable. */
1490 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
1494 if (TREE_CODE (t) == TYPE_DECL)
1495 pp_string (buffer, "typedef ");
1497 if (DECL_REGISTER (t))
1498 pp_string (buffer, "register ");
1500 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
1501 pp_string (buffer, "extern ");
1502 else if (TREE_STATIC (t))
1503 pp_string (buffer, "static ");
1505 /* Print the type and name. */
1506 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
1510 /* Print array's type. */
1511 tmp = TREE_TYPE (t);
1512 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
1513 tmp = TREE_TYPE (tmp);
1514 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
1516 /* Print variable's name. */
1518 dump_generic_node (buffer, t, spc, flags, false);
1520 /* Print the dimensions. */
1521 tmp = TREE_TYPE (t);
1522 while (TREE_CODE (tmp) == ARRAY_TYPE)
1524 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
1525 tmp = TREE_TYPE (tmp);
1528 else if (TREE_CODE (t) == FUNCTION_DECL)
1530 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
1532 dump_decl_name (buffer, t, flags);
1533 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
1537 /* Print type declaration. */
1538 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
1540 /* Print variable's name. */
1542 dump_generic_node (buffer, t, spc, flags, false);
1545 if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
1547 pp_string (buffer, " __asm__ ");
1548 pp_character (buffer, '(');
1549 dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
1550 pp_character (buffer, ')');
1553 /* The initial value of a function serves to determine wether the function
1554 is declared or defined. So the following does not apply to function
1556 if (TREE_CODE (t) != FUNCTION_DECL)
1558 /* Print the initial value. */
1559 if (DECL_INITIAL (t))
1562 pp_character (buffer, '=');
1564 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
1568 pp_character (buffer, ';');
1572 /* Prints a structure: name, fields, and methods.
1573 FIXME: Still incomplete. */
1576 print_struct_decl (pretty_printer *buffer, tree node, int spc, int flags)
1578 /* Print the name of the structure. */
1579 if (TYPE_NAME (node))
1582 if (TREE_CODE (node) == RECORD_TYPE)
1583 pp_string (buffer, "struct ");
1584 else if ((TREE_CODE (node) == UNION_TYPE
1585 || TREE_CODE (node) == QUAL_UNION_TYPE))
1586 pp_string (buffer, "union ");
1588 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
1591 /* Print the contents of the structure. */
1592 pp_newline (buffer);
1594 pp_character (buffer, '{');
1595 pp_newline (buffer);
1597 /* Print the fields of the structure. */
1600 tmp = TYPE_FIELDS (node);
1603 /* Avoid to print recursively the structure. */
1604 /* FIXME : Not implemented correctly...,
1605 what about the case when we have a cycle in the contain graph? ...
1606 Maybe this could be solved by looking at the scope in which the
1607 structure was declared. */
1608 if (TREE_TYPE (tmp) != node
1609 || (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
1610 && TREE_TYPE (TREE_TYPE (tmp)) != node))
1612 print_declaration (buffer, tmp, spc+2, flags);
1613 pp_newline (buffer);
1615 tmp = TREE_CHAIN (tmp);
1619 pp_character (buffer, '}');
1622 /* Return the priority of the operator OP.
1624 From lowest to highest precedence with either left-to-right (L-R)
1625 or right-to-left (R-L) associativity]:
1628 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
1640 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
1641 15 [L-R] fn() [] -> .
1643 unary +, - and * have higher precedence than the corresponding binary
1652 switch (TREE_CODE (op))
1667 case TRUTH_ORIF_EXPR:
1670 case TRUTH_AND_EXPR:
1671 case TRUTH_ANDIF_EXPR:
1678 case TRUTH_XOR_EXPR:
1695 case UNORDERED_EXPR:
1713 case TRUNC_DIV_EXPR:
1715 case FLOOR_DIV_EXPR:
1716 case ROUND_DIV_EXPR:
1718 case EXACT_DIV_EXPR:
1719 case TRUNC_MOD_EXPR:
1721 case FLOOR_MOD_EXPR:
1722 case ROUND_MOD_EXPR:
1725 case TRUTH_NOT_EXPR:
1727 case POSTINCREMENT_EXPR:
1728 case POSTDECREMENT_EXPR:
1729 case PREINCREMENT_EXPR:
1730 case PREDECREMENT_EXPR:
1732 case ALIGN_INDIRECT_REF:
1733 case MISALIGNED_INDIRECT_REF:
1739 case FIX_TRUNC_EXPR:
1741 case FIX_FLOOR_EXPR:
1742 case FIX_ROUND_EXPR:
1748 case ARRAY_RANGE_REF:
1752 /* Special expressions. */
1761 case NON_LVALUE_EXPR:
1762 return op_prio (TREE_OPERAND (op, 0));
1765 /* Return an arbitrarily high precedence to avoid surrounding single
1766 VAR_DECLs in ()s. */
1772 /* Return the symbol associated with operator OP. */
1779 switch (TREE_CODE (op))
1785 case TRUTH_ORIF_EXPR:
1788 case TRUTH_AND_EXPR:
1789 case TRUTH_ANDIF_EXPR:
1795 case TRUTH_XOR_EXPR:
1805 case UNORDERED_EXPR:
1855 case TRUTH_NOT_EXPR:
1862 case ALIGN_INDIRECT_REF:
1865 case MISALIGNED_INDIRECT_REF:
1868 case TRUNC_DIV_EXPR:
1875 case FLOOR_DIV_EXPR:
1878 case ROUND_DIV_EXPR:
1881 case EXACT_DIV_EXPR:
1884 case TRUNC_MOD_EXPR:
1890 case FLOOR_MOD_EXPR:
1893 case ROUND_MOD_EXPR:
1896 case PREDECREMENT_EXPR:
1899 case PREINCREMENT_EXPR:
1902 case POSTDECREMENT_EXPR:
1905 case POSTINCREMENT_EXPR:
1909 return "<<< ??? >>>";
1913 /* Prints the name of a CALL_EXPR. */
1916 print_call_name (pretty_printer *buffer, tree node)
1920 gcc_assert (TREE_CODE (node) == CALL_EXPR);
1922 op0 = TREE_OPERAND (node, 0);
1924 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
1925 op0 = TREE_OPERAND (op0, 0);
1927 switch (TREE_CODE (op0))
1931 dump_function_name (buffer, op0);
1937 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
1941 pp_string (buffer, "(");
1942 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
1943 pp_string (buffer, ") ? ");
1944 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, 0, false);
1945 pp_string (buffer, " : ");
1946 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, 0, false);
1950 /* The function is a pointer contained in a structure. */
1951 if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
1952 TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
1953 dump_function_name (buffer, TREE_OPERAND (op0, 1));
1955 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
1957 We can have several levels of structures and a function
1958 pointer inside. This is not implemented yet... */
1963 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
1964 dump_function_name (buffer, TREE_OPERAND (op0, 0));
1966 dump_generic_node (buffer, op0, 0, 0, false);
1971 dump_generic_node (buffer, op0, 0, 0, false);
1979 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
1982 pretty_print_string (pretty_printer *buffer, const char *str)
1992 pp_string (buffer, "\\b");
1996 pp_string (buffer, "\\f");
2000 pp_string (buffer, "\\n");
2004 pp_string (buffer, "\\r");
2008 pp_string (buffer, "\\t");
2012 pp_string (buffer, "\\v");
2016 pp_string (buffer, "\\\\");
2020 pp_string (buffer, "\\\"");
2024 pp_string (buffer, "\\'");
2028 pp_string (buffer, "\\0");
2032 pp_string (buffer, "\\1");
2036 pp_string (buffer, "\\2");
2040 pp_string (buffer, "\\3");
2044 pp_string (buffer, "\\4");
2048 pp_string (buffer, "\\5");
2052 pp_string (buffer, "\\6");
2056 pp_string (buffer, "\\7");
2060 pp_character (buffer, str[0]);
2068 maybe_init_pretty_print (FILE *file)
2072 pp_construct (&buffer, /* prefix */NULL, /* line-width */0);
2073 pp_needs_newline (&buffer) = true;
2077 buffer.buffer->stream = file;
2081 newline_and_indent (pretty_printer *buffer, int spc)
2083 pp_newline (buffer);
2088 dump_vops (pretty_printer *buffer, tree stmt, int spc, int flags)
2091 use_operand_p use_p;
2092 def_operand_p def_p;
2093 use_operand_p kill_p;
2096 FOR_EACH_SSA_MAYDEF_OPERAND (def_p, use_p, stmt, iter)
2098 pp_string (buffer, "# ");
2099 dump_generic_node (buffer, DEF_FROM_PTR (def_p),
2100 spc + 2, flags, false);
2101 pp_string (buffer, " = V_MAY_DEF <");
2102 dump_generic_node (buffer, USE_FROM_PTR (use_p),
2103 spc + 2, flags, false);
2104 pp_string (buffer, ">;");
2105 newline_and_indent (buffer, spc);
2108 FOR_EACH_SSA_MUSTDEF_OPERAND (def_p, kill_p, stmt, iter)
2110 pp_string (buffer, "# ");
2111 dump_generic_node (buffer, DEF_FROM_PTR (def_p),
2112 spc + 2, flags, false);
2113 pp_string (buffer, " = V_MUST_DEF <");
2114 dump_generic_node (buffer, USE_FROM_PTR (kill_p),
2115 spc + 2, flags, false);
2116 pp_string (buffer, ">;");
2117 newline_and_indent (buffer, spc);
2120 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_VUSE)
2122 pp_string (buffer, "# VUSE <");
2123 dump_generic_node (buffer, use, spc + 2, flags, false);
2124 pp_string (buffer, ">;");
2125 newline_and_indent (buffer, spc);
2129 /* Dumps basic block BB to FILE with details described by FLAGS and
2130 indented by INDENT spaces. */
2133 dump_generic_bb (FILE *file, basic_block bb, int indent, int flags)
2135 maybe_init_pretty_print (file);
2136 dumping_stmts = true;
2137 dump_generic_bb_buff (&buffer, bb, indent, flags);
2141 /* Dumps header of basic block BB to buffer BUFFER indented by INDENT
2142 spaces and details described by flags. */
2145 dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
2151 if (flags & TDF_BLOCKS)
2154 pp_string (buffer, "# BLOCK ");
2155 pp_decimal_int (buffer, bb->index);
2157 if (flags & TDF_LINENO)
2159 block_stmt_iterator bsi;
2161 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2162 if (get_lineno (bsi_stmt (bsi)) != -1)
2164 pp_string (buffer, ", starting at line ");
2165 pp_decimal_int (buffer, get_lineno (bsi_stmt (bsi)));
2169 newline_and_indent (buffer, indent);
2171 pp_string (buffer, "# PRED:");
2172 pp_write_text_to_stream (buffer);
2173 FOR_EACH_EDGE (e, ei, bb->preds)
2174 if (flags & TDF_SLIM)
2176 pp_string (buffer, " ");
2177 if (e->src == ENTRY_BLOCK_PTR)
2178 pp_string (buffer, "ENTRY");
2180 pp_decimal_int (buffer, e->src->index);
2183 dump_edge_info (buffer->buffer->stream, e, 0);
2184 pp_newline (buffer);
2188 stmt = first_stmt (bb);
2189 if (!stmt || TREE_CODE (stmt) != LABEL_EXPR)
2191 INDENT (indent - 2);
2192 pp_string (buffer, "<bb ");
2193 pp_decimal_int (buffer, bb->index);
2194 pp_string (buffer, ">:");
2195 pp_newline (buffer);
2198 pp_write_text_to_stream (buffer);
2199 check_bb_profile (bb, buffer->buffer->stream);
2202 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
2206 dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
2212 pp_string (buffer, "# SUCC:");
2213 pp_write_text_to_stream (buffer);
2214 FOR_EACH_EDGE (e, ei, bb->succs)
2215 if (flags & TDF_SLIM)
2217 pp_string (buffer, " ");
2218 if (e->dest == EXIT_BLOCK_PTR)
2219 pp_string (buffer, "EXIT");
2221 pp_decimal_int (buffer, e->dest->index);
2224 dump_edge_info (buffer->buffer->stream, e, 1);
2225 pp_newline (buffer);
2228 /* Dumps phi nodes of basic block BB to buffer BUFFER with details described by
2229 FLAGS indented by INDENT spaces. */
2232 dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags)
2234 tree phi = phi_nodes (bb);
2238 for (; phi; phi = PHI_CHAIN (phi))
2240 if (is_gimple_reg (PHI_RESULT (phi)) || (flags & TDF_VOPS))
2243 pp_string (buffer, "# ");
2244 dump_generic_node (buffer, phi, indent, flags, false);
2245 pp_newline (buffer);
2250 /* Dump jump to basic block BB that is represented implicitly in the cfg
2254 pp_cfg_jump (pretty_printer *buffer, basic_block bb)
2258 stmt = first_stmt (bb);
2260 pp_string (buffer, "goto <bb ");
2261 pp_decimal_int (buffer, bb->index);
2262 pp_string (buffer, ">");
2263 if (stmt && TREE_CODE (stmt) == LABEL_EXPR)
2265 pp_string (buffer, " (");
2266 dump_generic_node (buffer, LABEL_EXPR_LABEL (stmt), 0, 0, false);
2267 pp_string (buffer, ")");
2269 pp_semicolon (buffer);
2272 /* Dump edges represented implicitly in basic block BB to BUFFER, indented
2273 by INDENT spaces, with details given by FLAGS. */
2276 dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent,
2282 /* If there is a fallthru edge, we may need to add an artificial goto to the
2284 FOR_EACH_EDGE (e, ei, bb->succs)
2285 if (e->flags & EDGE_FALLTHRU)
2287 if (e && e->dest != bb->next_bb)
2291 if ((flags & TDF_LINENO)
2292 #ifdef USE_MAPPED_LOCATION
2293 && e->goto_locus != UNKNOWN_LOCATION
2299 expanded_location goto_xloc;
2300 #ifdef USE_MAPPED_LOCATION
2301 goto_xloc = expand_location (e->goto_locus);
2303 goto_xloc = *e->goto_locus;
2305 pp_character (buffer, '[');
2308 pp_string (buffer, goto_xloc.file);
2309 pp_string (buffer, " : ");
2311 pp_decimal_int (buffer, goto_xloc.line);
2312 pp_string (buffer, "] ");
2315 pp_cfg_jump (buffer, e->dest);
2316 pp_newline (buffer);
2320 /* Dumps basic block BB to buffer BUFFER with details described by FLAGS and
2321 indented by INDENT spaces. */
2324 dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
2325 int indent, int flags)
2327 block_stmt_iterator bsi;
2329 int label_indent = indent - 2;
2331 if (label_indent < 0)
2334 dump_bb_header (buffer, bb, indent, flags);
2337 dump_phi_nodes (buffer, bb, indent, flags);
2339 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2343 stmt = bsi_stmt (bsi);
2345 curr_indent = TREE_CODE (stmt) == LABEL_EXPR ? label_indent : indent;
2347 INDENT (curr_indent);
2348 dump_generic_node (buffer, stmt, curr_indent, flags, true);
2349 pp_newline (buffer);
2352 dump_implicit_edges (buffer, bb, indent, flags);
2354 if (flags & TDF_BLOCKS)
2355 dump_bb_end (buffer, bb, indent, flags);