1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
3 Free Software Foundation, Inc.
4 Adapted from c-pretty-print.c by Diego Novillo <dnovillo@redhat.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
25 #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"
35 #include "tree-pass.h"
37 /* Local functions, macros and variables. */
38 static int op_prio (tree
);
39 static const char *op_symbol_1 (enum tree_code
);
40 static const char *op_symbol (tree
);
41 static void pretty_print_string (pretty_printer
*, const char*);
42 static void print_call_name (pretty_printer
*, tree
);
43 static void newline_and_indent (pretty_printer
*, int);
44 static void maybe_init_pretty_print (FILE *);
45 static void print_declaration (pretty_printer
*, tree
, int, int);
46 static void print_struct_decl (pretty_printer
*, tree
, int, int);
47 static void do_niy (pretty_printer
*, tree
);
48 static void dump_vops (pretty_printer
*, tree
, int, int);
49 static void dump_generic_bb_buff (pretty_printer
*, basic_block
, int, int);
51 #define INDENT(SPACE) do { \
52 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
54 #define NIY do_niy(buffer,node)
56 #define PRINT_FUNCTION_NAME(NODE) pp_printf \
57 (buffer, "%s", TREE_CODE (NODE) == NOP_EXPR ? \
58 lang_hooks.decl_printable_name (TREE_OPERAND (NODE, 0), 1) : \
59 lang_hooks.decl_printable_name (NODE, 1))
61 static pretty_printer buffer
;
62 static int initialized
= 0;
64 /* Try to print something for an unknown tree code. */
67 do_niy (pretty_printer
*buffer
, tree node
)
71 pp_string (buffer
, "<<< Unknown tree: ");
72 pp_string (buffer
, tree_code_name
[(int) TREE_CODE (node
)]);
76 len
= TREE_CODE_LENGTH (TREE_CODE (node
));
77 for (i
= 0; i
< len
; ++i
)
79 newline_and_indent (buffer
, 2);
80 dump_generic_node (buffer
, TREE_OPERAND (node
, i
), 2, 0, false);
84 pp_string (buffer
, " >>>\n");
88 debug_generic_expr (tree t
)
90 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_UID
);
91 fprintf (stderr
, "\n");
95 debug_generic_stmt (tree t
)
97 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_UID
);
98 fprintf (stderr
, "\n");
102 debug_tree_chain (tree t
)
106 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_UID
);
107 fprintf(stderr
, " ");
110 fprintf (stderr
, "\n");
113 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
115 print_generic_decl (FILE *file
, tree decl
, int flags
)
117 maybe_init_pretty_print (file
);
118 print_declaration (&buffer
, decl
, 2, flags
);
119 pp_write_text_to_stream (&buffer
);
122 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
123 to show in the dump. See TDF_* in tree.h. */
126 print_generic_stmt (FILE *file
, tree t
, int flags
)
128 maybe_init_pretty_print (file
);
129 dump_generic_node (&buffer
, t
, 0, flags
, true);
133 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
134 to show in the dump. See TDF_* in tree.h. The output is indented by
138 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
142 maybe_init_pretty_print (file
);
144 for (i
= 0; i
< indent
; i
++)
146 dump_generic_node (&buffer
, t
, indent
, flags
, true);
150 /* Print a single expression T on file FILE. FLAGS specifies details to show
151 in the dump. See TDF_* in tree.h. */
154 print_generic_expr (FILE *file
, tree t
, int flags
)
156 maybe_init_pretty_print (file
);
157 dump_generic_node (&buffer
, t
, 0, flags
, false);
160 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
164 dump_decl_name (pretty_printer
*buffer
, tree node
, int flags
)
169 pp_tree_identifier (buffer
, DECL_NAME (t
));
170 if ((flags
& TDF_UID
)
171 || DECL_NAME (t
) == NULL_TREE
)
173 if (TREE_CODE (t
) == LABEL_DECL
174 && LABEL_DECL_UID (t
) != -1)
175 pp_printf (buffer
, "L." HOST_WIDE_INT_PRINT_DEC
,
179 char c
= TREE_CODE (t
) == CONST_DECL
? 'C' : 'D';
180 pp_printf (buffer
, "%c.%u", c
, DECL_UID (t
));
185 /* Like the above, but used for pretty printing function calls. */
188 dump_function_name (pretty_printer
*buffer
, tree node
)
190 if (DECL_NAME (node
))
191 PRINT_FUNCTION_NAME (node
);
193 dump_decl_name (buffer
, node
, 0);
196 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
197 FLAGS are as in dump_generic_node. */
200 dump_function_declaration (pretty_printer
*buffer
, tree node
,
203 bool wrote_arg
= false;
207 pp_character (buffer
, '(');
209 /* Print the argument types. The last element in the list is a VOID_TYPE.
210 The following avoids printing the last element. */
211 arg
= TYPE_ARG_TYPES (node
);
212 while (arg
&& TREE_CHAIN (arg
) && arg
!= error_mark_node
)
215 dump_generic_node (buffer
, TREE_VALUE (arg
), spc
, flags
, false);
216 arg
= TREE_CHAIN (arg
);
217 if (TREE_CHAIN (arg
) && TREE_CODE (TREE_CHAIN (arg
)) == TREE_LIST
)
219 pp_character (buffer
, ',');
225 pp_string (buffer
, "void");
227 pp_character (buffer
, ')');
230 /* Dump the domain associated with an array. */
233 dump_array_domain (pretty_printer
*buffer
, tree domain
, int spc
, int flags
)
235 pp_character (buffer
, '[');
238 tree min
= TYPE_MIN_VALUE (domain
);
239 tree max
= TYPE_MAX_VALUE (domain
);
242 && integer_zerop (min
)
243 && host_integerp (max
, 0))
244 pp_wide_integer (buffer
, TREE_INT_CST_LOW (max
) + 1);
248 dump_generic_node (buffer
, min
, spc
, flags
, false);
249 pp_character (buffer
, ':');
251 dump_generic_node (buffer
, max
, spc
, flags
, false);
255 pp_string (buffer
, "<unknown>");
256 pp_character (buffer
, ']');
260 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
261 dump_generic_node. */
264 dump_omp_clause (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
268 switch (OMP_CLAUSE_CODE (clause
))
270 case OMP_CLAUSE_PRIVATE
:
273 case OMP_CLAUSE_SHARED
:
276 case OMP_CLAUSE_FIRSTPRIVATE
:
277 name
= "firstprivate";
279 case OMP_CLAUSE_LASTPRIVATE
:
280 name
= "lastprivate";
282 case OMP_CLAUSE_COPYIN
:
285 case OMP_CLAUSE_COPYPRIVATE
:
286 name
= "copyprivate";
289 pp_string (buffer
, name
);
290 pp_character (buffer
, '(');
291 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
293 pp_character (buffer
, ')');
296 case OMP_CLAUSE_REDUCTION
:
297 pp_string (buffer
, "reduction(");
298 pp_string (buffer
, op_symbol_1 (OMP_CLAUSE_REDUCTION_CODE (clause
)));
299 pp_character (buffer
, ':');
300 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
302 pp_character (buffer
, ')');
306 pp_string (buffer
, "if(");
307 dump_generic_node (buffer
, OMP_CLAUSE_IF_EXPR (clause
),
309 pp_character (buffer
, ')');
312 case OMP_CLAUSE_NUM_THREADS
:
313 pp_string (buffer
, "num_threads(");
314 dump_generic_node (buffer
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
316 pp_character (buffer
, ')');
319 case OMP_CLAUSE_NOWAIT
:
320 pp_string (buffer
, "nowait");
322 case OMP_CLAUSE_ORDERED
:
323 pp_string (buffer
, "ordered");
326 case OMP_CLAUSE_DEFAULT
:
327 pp_string (buffer
, "default(");
328 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
330 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
332 case OMP_CLAUSE_DEFAULT_SHARED
:
333 pp_string (buffer
, "shared");
335 case OMP_CLAUSE_DEFAULT_NONE
:
336 pp_string (buffer
, "none");
338 case OMP_CLAUSE_DEFAULT_PRIVATE
:
339 pp_string (buffer
, "private");
344 pp_character (buffer
, ')');
347 case OMP_CLAUSE_SCHEDULE
:
348 pp_string (buffer
, "schedule(");
349 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
351 case OMP_CLAUSE_SCHEDULE_STATIC
:
352 pp_string (buffer
, "static");
354 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
355 pp_string (buffer
, "dynamic");
357 case OMP_CLAUSE_SCHEDULE_GUIDED
:
358 pp_string (buffer
, "guided");
360 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
361 pp_string (buffer
, "runtime");
366 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
368 pp_character (buffer
, ',');
369 dump_generic_node (buffer
,
370 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
373 pp_character (buffer
, ')');
377 /* Should never happen. */
378 dump_generic_node (buffer
, clause
, spc
, flags
, false);
384 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
385 dump_generic_node. */
388 dump_omp_clauses (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
396 dump_omp_clause (buffer
, clause
, spc
, flags
);
397 clause
= OMP_CLAUSE_CHAIN (clause
);
405 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of indent.
406 FLAGS specifies details to show in the dump (see TDF_* in tree.h). If
407 IS_STMT is true, the object printed is considered to be a statement
408 and it is terminated by ';' if appropriate. */
411 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
419 if (node
== NULL_TREE
)
422 is_expr
= EXPR_P (node
);
424 if (TREE_CODE (node
) != ERROR_MARK
425 && is_gimple_stmt (node
)
426 && (flags
& TDF_VOPS
)
428 && TREE_CODE (node
) != PHI_NODE
)
429 dump_vops (buffer
, node
, spc
, flags
);
431 if (is_stmt
&& (flags
& TDF_STMTADDR
))
432 pp_printf (buffer
, "<&%p> ", (void *)node
);
434 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
436 expanded_location xloc
= expand_location (EXPR_LOCATION (node
));
437 pp_character (buffer
, '[');
440 pp_string (buffer
, xloc
.file
);
441 pp_string (buffer
, " : ");
443 pp_decimal_int (buffer
, xloc
.line
);
444 pp_string (buffer
, "] ");
447 switch (TREE_CODE (node
))
450 pp_string (buffer
, "<<< error >>>");
453 case IDENTIFIER_NODE
:
454 pp_tree_identifier (buffer
, node
);
458 while (node
&& node
!= error_mark_node
)
460 if (TREE_PURPOSE (node
))
462 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
465 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
466 node
= TREE_CHAIN (node
);
467 if (node
&& TREE_CODE (node
) == TREE_LIST
)
469 pp_character (buffer
, ',');
476 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
481 if (TREE_VEC_LENGTH (node
) > 0)
483 size_t len
= TREE_VEC_LENGTH (node
);
484 for (i
= 0; i
< len
- 1; i
++)
486 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
488 pp_character (buffer
, ',');
491 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
505 unsigned int quals
= TYPE_QUALS (node
);
506 enum tree_code_class
class;
508 if (quals
& TYPE_QUAL_CONST
)
509 pp_string (buffer
, "const ");
510 else if (quals
& TYPE_QUAL_VOLATILE
)
511 pp_string (buffer
, "volatile ");
512 else if (quals
& TYPE_QUAL_RESTRICT
)
513 pp_string (buffer
, "restrict ");
515 class = TREE_CODE_CLASS (TREE_CODE (node
));
517 if (class == tcc_declaration
)
519 if (DECL_NAME (node
))
520 dump_decl_name (buffer
, node
, flags
);
522 pp_string (buffer
, "<unnamed type decl>");
524 else if (class == tcc_type
)
526 if (TYPE_NAME (node
))
528 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
529 pp_tree_identifier (buffer
, TYPE_NAME (node
));
530 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
531 && DECL_NAME (TYPE_NAME (node
)))
532 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
534 pp_string (buffer
, "<unnamed type>");
536 else if (TREE_CODE (node
) == VECTOR_TYPE
)
538 pp_string (buffer
, "vector ");
539 dump_generic_node (buffer
, TREE_TYPE (node
),
543 pp_string (buffer
, "<unnamed type>");
550 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
552 if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
554 tree fnode
= TREE_TYPE (node
);
556 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
558 pp_character (buffer
, '(');
559 pp_string (buffer
, str
);
560 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
561 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
563 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
565 pp_character (buffer
, ')');
566 dump_function_declaration (buffer
, fnode
, spc
, flags
);
570 unsigned int quals
= TYPE_QUALS (node
);
572 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
574 pp_string (buffer
, str
);
576 if (quals
& TYPE_QUAL_CONST
)
577 pp_string (buffer
, " const");
578 else if (quals
& TYPE_QUAL_VOLATILE
)
579 pp_string (buffer
, "volatile");
580 else if (quals
& TYPE_QUAL_RESTRICT
)
581 pp_string (buffer
, " restrict");
583 if (TYPE_REF_CAN_ALIAS_ALL (node
))
584 pp_string (buffer
, " {ref-all}");
593 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)), flags
);
594 pp_string (buffer
, "::");
599 const char *sep
= "";
602 pp_string (buffer
, "MEM[");
604 tmp
= TMR_SYMBOL (node
);
607 pp_string (buffer
, sep
);
609 pp_string (buffer
, "symbol: ");
610 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
612 tmp
= TMR_BASE (node
);
615 pp_string (buffer
, sep
);
617 pp_string (buffer
, "base: ");
618 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
620 tmp
= TMR_INDEX (node
);
623 pp_string (buffer
, sep
);
625 pp_string (buffer
, "index: ");
626 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
628 tmp
= TMR_STEP (node
);
631 pp_string (buffer
, sep
);
633 pp_string (buffer
, "step: ");
634 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
636 tmp
= TMR_OFFSET (node
);
639 pp_string (buffer
, sep
);
641 pp_string (buffer
, "offset: ");
642 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
644 pp_string (buffer
, "]");
645 if (flags
& TDF_DETAILS
)
647 pp_string (buffer
, "{");
648 dump_generic_node (buffer
, TMR_ORIGINAL (node
), spc
, flags
,
650 pp_string (buffer
, "}");
659 /* Print the innermost component type. */
660 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
661 tmp
= TREE_TYPE (tmp
))
663 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
665 /* Print the dimensions. */
666 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
667 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
673 case QUAL_UNION_TYPE
:
674 /* Print the name of the structure. */
675 if (TREE_CODE (node
) == RECORD_TYPE
)
676 pp_string (buffer
, "struct ");
677 else if (TREE_CODE (node
) == UNION_TYPE
)
678 pp_string (buffer
, "union ");
680 if (TYPE_NAME (node
))
681 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
683 print_struct_decl (buffer
, node
, spc
, flags
);
691 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
693 /* In the case of a pointer, one may want to divide by the
694 size of the pointed-to type. Unfortunately, this not
695 straightforward. The C front-end maps expressions
700 in such a way that the two INTEGER_CST nodes for "5" have
701 different values but identical types. In the latter
702 case, the 5 is multiplied by sizeof (int) in c-common.c
703 (pointer_int_sum) to convert it to a byte address, and
704 yet the type of the node is left unchanged. Argh. What
705 is consistent though is that the number value corresponds
706 to bytes (UNITS) offset.
708 NB: Neither of the following divisors can be trivially
709 used to recover the original literal:
711 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
712 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
713 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
714 pp_string (buffer
, "B"); /* pseudo-unit */
716 else if (! host_integerp (node
, 0))
720 if (tree_int_cst_sgn (val
) < 0)
722 pp_character (buffer
, '-');
723 val
= build_int_cst_wide (NULL_TREE
,
724 -TREE_INT_CST_LOW (val
),
725 ~TREE_INT_CST_HIGH (val
)
726 + !TREE_INT_CST_LOW (val
));
728 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
731 static char format
[10]; /* "%x%09999x\0" */
733 sprintf (format
, "%%x%%0%dx", HOST_BITS_PER_INT
/ 4);
734 sprintf (pp_buffer (buffer
)->digit_buffer
, format
,
735 TREE_INT_CST_HIGH (val
),
736 TREE_INT_CST_LOW (val
));
737 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
741 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
745 /* Code copied from print_node. */
748 if (TREE_OVERFLOW (node
))
749 pp_string (buffer
, " overflow");
751 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
752 d
= TREE_REAL_CST (node
);
753 if (REAL_VALUE_ISINF (d
))
754 pp_string (buffer
, " Inf");
755 else if (REAL_VALUE_ISNAN (d
))
756 pp_string (buffer
, " Nan");
760 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
761 pp_string (buffer
, string
);
766 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
767 pp_string (buffer
, "0x");
768 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
769 output_formatted_integer (buffer
, "%02x", *p
++);
776 pp_string (buffer
, "__complex__ (");
777 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
778 pp_string (buffer
, ", ");
779 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
780 pp_string (buffer
, ")");
784 pp_string (buffer
, "\"");
785 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
786 pp_string (buffer
, "\"");
792 pp_string (buffer
, "{ ");
793 for (elt
= TREE_VECTOR_CST_ELTS (node
); elt
; elt
= TREE_CHAIN (elt
))
795 dump_generic_node (buffer
, TREE_VALUE (elt
), spc
, flags
, false);
796 if (TREE_CHAIN (elt
))
797 pp_string (buffer
, ", ");
799 pp_string (buffer
, " }");
808 dump_decl_name (buffer
, node
, flags
);
812 if (DECL_NAME (node
))
813 dump_decl_name (buffer
, node
, flags
);
814 else if (LABEL_DECL_UID (node
) != -1)
815 pp_printf (buffer
, "<L" HOST_WIDE_INT_PRINT_DEC
">",
816 LABEL_DECL_UID (node
));
818 pp_printf (buffer
, "<D%u>", DECL_UID (node
));
822 if (DECL_IS_BUILTIN (node
))
824 /* Don't print the declaration of built-in types. */
827 if (DECL_NAME (node
))
828 dump_decl_name (buffer
, node
, flags
);
831 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
832 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
833 && TYPE_METHODS (TREE_TYPE (node
)))
835 /* The type is a c++ class: all structures have at least
837 pp_string (buffer
, "class ");
838 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
843 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
844 ? "union" : "struct "));
845 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
850 case SYMBOL_MEMORY_TAG
:
851 case NAME_MEMORY_TAG
:
852 case STRUCT_FIELD_TAG
:
857 dump_decl_name (buffer
, node
, flags
);
861 pp_string (buffer
, "<retval>");
865 op0
= TREE_OPERAND (node
, 0);
867 if (TREE_CODE (op0
) == INDIRECT_REF
)
869 op0
= TREE_OPERAND (op0
, 0);
872 if (op_prio (op0
) < op_prio (node
))
873 pp_character (buffer
, '(');
874 dump_generic_node (buffer
, op0
, spc
, flags
, false);
875 if (op_prio (op0
) < op_prio (node
))
876 pp_character (buffer
, ')');
877 pp_string (buffer
, str
);
878 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
880 if (TREE_CODE (op0
) != VALUE_HANDLE
)
882 op0
= component_ref_field_offset (node
);
883 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
885 pp_string (buffer
, "{off: ");
886 dump_generic_node (buffer
, op0
, spc
, flags
, false);
887 pp_character (buffer
, '}');
893 pp_string (buffer
, "BIT_FIELD_REF <");
894 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
895 pp_string (buffer
, ", ");
896 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
897 pp_string (buffer
, ", ");
898 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
899 pp_string (buffer
, ">");
903 case ARRAY_RANGE_REF
:
904 op0
= TREE_OPERAND (node
, 0);
905 if (op_prio (op0
) < op_prio (node
))
906 pp_character (buffer
, '(');
907 dump_generic_node (buffer
, op0
, spc
, flags
, false);
908 if (op_prio (op0
) < op_prio (node
))
909 pp_character (buffer
, ')');
910 pp_character (buffer
, '[');
911 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
912 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
913 pp_string (buffer
, " ...");
914 pp_character (buffer
, ']');
916 op0
= array_ref_low_bound (node
);
917 op1
= array_ref_element_size (node
);
919 if (!integer_zerop (op0
)
920 || (TYPE_SIZE_UNIT (TREE_TYPE (node
))
921 && !operand_equal_p (op1
, TYPE_SIZE_UNIT (TREE_TYPE (node
)), 0)))
923 pp_string (buffer
, "{lb: ");
924 dump_generic_node (buffer
, op0
, spc
, flags
, false);
925 pp_string (buffer
, " sz: ");
926 dump_generic_node (buffer
, op1
, spc
, flags
, false);
927 pp_character (buffer
, '}');
933 unsigned HOST_WIDE_INT ix
;
935 bool is_struct_init
= FALSE
;
936 pp_character (buffer
, '{');
937 if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
938 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
939 is_struct_init
= TRUE
;
940 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
942 if (field
&& is_struct_init
)
944 pp_character (buffer
, '.');
945 dump_generic_node (buffer
, field
, spc
, flags
, false);
946 pp_string (buffer
, "=");
948 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
949 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
950 val
= TREE_OPERAND (val
, 0);
951 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
952 dump_decl_name (buffer
, val
, flags
);
954 dump_generic_node (buffer
, val
, spc
, flags
, false);
955 if (ix
!= VEC_length (constructor_elt
, CONSTRUCTOR_ELTS (node
)) - 1)
957 pp_character (buffer
, ',');
961 pp_character (buffer
, '}');
968 if (flags
& TDF_SLIM
)
970 pp_string (buffer
, "<COMPOUND_EXPR>");
974 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
975 spc
, flags
, !(flags
& TDF_SLIM
));
976 if (flags
& TDF_SLIM
)
977 newline_and_indent (buffer
, spc
);
980 pp_character (buffer
, ',');
984 for (tp
= &TREE_OPERAND (node
, 1);
985 TREE_CODE (*tp
) == COMPOUND_EXPR
;
986 tp
= &TREE_OPERAND (*tp
, 1))
988 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
989 spc
, flags
, !(flags
& TDF_SLIM
));
990 if (flags
& TDF_SLIM
)
991 newline_and_indent (buffer
, spc
);
994 pp_character (buffer
, ',');
999 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1003 case STATEMENT_LIST
:
1005 tree_stmt_iterator si
;
1008 if (flags
& TDF_SLIM
)
1010 pp_string (buffer
, "<STATEMENT_LIST>");
1014 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1017 newline_and_indent (buffer
, spc
);
1020 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1027 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1029 pp_character (buffer
, '=');
1031 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1035 pp_string (buffer
, "TARGET_EXPR <");
1036 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1037 pp_character (buffer
, ',');
1039 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1040 pp_character (buffer
, '>');
1044 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1049 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1051 pp_string (buffer
, "if (");
1052 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1053 pp_character (buffer
, ')');
1054 /* The lowered cond_exprs should always be printed in full. */
1055 if (COND_EXPR_THEN (node
)
1056 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1057 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1058 && COND_EXPR_ELSE (node
)
1059 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1060 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1063 dump_generic_node (buffer
, COND_EXPR_THEN (node
), 0, flags
, true);
1064 pp_string (buffer
, " else ");
1065 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), 0, flags
, true);
1067 else if (!(flags
& TDF_SLIM
))
1069 /* Output COND_EXPR_THEN. */
1070 if (COND_EXPR_THEN (node
))
1072 newline_and_indent (buffer
, spc
+2);
1073 pp_character (buffer
, '{');
1074 newline_and_indent (buffer
, spc
+4);
1075 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1077 newline_and_indent (buffer
, spc
+2);
1078 pp_character (buffer
, '}');
1081 /* Output COND_EXPR_ELSE. */
1082 if (COND_EXPR_ELSE (node
))
1084 newline_and_indent (buffer
, spc
);
1085 pp_string (buffer
, "else");
1086 newline_and_indent (buffer
, spc
+2);
1087 pp_character (buffer
, '{');
1088 newline_and_indent (buffer
, spc
+4);
1089 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1091 newline_and_indent (buffer
, spc
+2);
1092 pp_character (buffer
, '}');
1099 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1101 pp_character (buffer
, '?');
1103 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1105 pp_character (buffer
, ':');
1107 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1112 pp_character (buffer
, '{');
1113 if (!(flags
& TDF_SLIM
))
1115 if (BIND_EXPR_VARS (node
))
1117 pp_newline (buffer
);
1119 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= TREE_CHAIN (op0
))
1121 print_declaration (buffer
, op0
, spc
+2, flags
);
1122 pp_newline (buffer
);
1126 newline_and_indent (buffer
, spc
+2);
1127 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1128 newline_and_indent (buffer
, spc
);
1129 pp_character (buffer
, '}');
1135 print_call_name (buffer
, node
);
1137 /* Print parameters. */
1139 pp_character (buffer
, '(');
1140 op1
= TREE_OPERAND (node
, 1);
1142 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1143 pp_character (buffer
, ')');
1145 op1
= TREE_OPERAND (node
, 2);
1148 pp_string (buffer
, " [static-chain: ");
1149 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1150 pp_character (buffer
, ']');
1153 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1154 pp_string (buffer
, " [return slot optimization]");
1155 if (CALL_EXPR_TAILCALL (node
))
1156 pp_string (buffer
, " [tail call]");
1159 case WITH_CLEANUP_EXPR
:
1163 case CLEANUP_POINT_EXPR
:
1164 pp_string (buffer
, "<<cleanup_point ");
1165 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1166 pp_string (buffer
, ">>");
1169 case PLACEHOLDER_EXPR
:
1170 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1171 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1172 pp_character (buffer
, '>');
1175 /* Binary arithmetic and logic expressions. */
1176 case WIDEN_SUM_EXPR
:
1177 case WIDEN_MULT_EXPR
:
1181 case TRUNC_DIV_EXPR
:
1183 case FLOOR_DIV_EXPR
:
1184 case ROUND_DIV_EXPR
:
1185 case TRUNC_MOD_EXPR
:
1187 case FLOOR_MOD_EXPR
:
1188 case ROUND_MOD_EXPR
:
1190 case EXACT_DIV_EXPR
:
1195 case VEC_LSHIFT_EXPR
:
1196 case VEC_RSHIFT_EXPR
:
1200 case TRUTH_ANDIF_EXPR
:
1201 case TRUTH_ORIF_EXPR
:
1202 case TRUTH_AND_EXPR
:
1204 case TRUTH_XOR_EXPR
:
1218 case UNORDERED_EXPR
:
1220 const char *op
= op_symbol (node
);
1221 op0
= TREE_OPERAND (node
, 0);
1222 op1
= TREE_OPERAND (node
, 1);
1224 /* When the operands are expressions with less priority,
1225 keep semantics of the tree representation. */
1226 if (op_prio (op0
) < op_prio (node
))
1228 pp_character (buffer
, '(');
1229 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1230 pp_character (buffer
, ')');
1233 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1236 pp_string (buffer
, op
);
1239 /* When the operands are expressions with less priority,
1240 keep semantics of the tree representation. */
1241 if (op_prio (op1
) < op_prio (node
))
1243 pp_character (buffer
, '(');
1244 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1245 pp_character (buffer
, ')');
1248 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1252 /* Unary arithmetic and logic expressions. */
1255 case TRUTH_NOT_EXPR
:
1257 case PREDECREMENT_EXPR
:
1258 case PREINCREMENT_EXPR
:
1259 case ALIGN_INDIRECT_REF
:
1260 case MISALIGNED_INDIRECT_REF
:
1262 if (TREE_CODE (node
) == ADDR_EXPR
1263 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
1264 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
1265 ; /* Do not output '&' for strings and function pointers. */
1267 pp_string (buffer
, op_symbol (node
));
1269 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1271 pp_character (buffer
, '(');
1272 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1273 pp_character (buffer
, ')');
1276 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1278 if (TREE_CODE (node
) == MISALIGNED_INDIRECT_REF
)
1280 pp_string (buffer
, "{misalignment: ");
1281 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1282 pp_character (buffer
, '}');
1286 case POSTDECREMENT_EXPR
:
1287 case POSTINCREMENT_EXPR
:
1288 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1290 pp_character (buffer
, '(');
1291 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1292 pp_character (buffer
, ')');
1295 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1296 pp_string (buffer
, op_symbol (node
));
1300 pp_string (buffer
, "MIN_EXPR <");
1301 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1302 pp_string (buffer
, ", ");
1303 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1304 pp_character (buffer
, '>');
1308 pp_string (buffer
, "MAX_EXPR <");
1309 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1310 pp_string (buffer
, ", ");
1311 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1312 pp_character (buffer
, '>');
1316 pp_string (buffer
, "ABS_EXPR <");
1317 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1318 pp_character (buffer
, '>');
1325 case FIX_TRUNC_EXPR
:
1327 case FIX_FLOOR_EXPR
:
1328 case FIX_ROUND_EXPR
:
1332 type
= TREE_TYPE (node
);
1333 op0
= TREE_OPERAND (node
, 0);
1334 if (type
!= TREE_TYPE (op0
))
1336 pp_character (buffer
, '(');
1337 dump_generic_node (buffer
, type
, spc
, flags
, false);
1338 pp_string (buffer
, ") ");
1340 if (op_prio (op0
) < op_prio (node
))
1341 pp_character (buffer
, '(');
1342 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1343 if (op_prio (op0
) < op_prio (node
))
1344 pp_character (buffer
, ')');
1347 case VIEW_CONVERT_EXPR
:
1348 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
1349 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1350 pp_string (buffer
, ">(");
1351 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1352 pp_character (buffer
, ')');
1355 case NON_LVALUE_EXPR
:
1356 pp_string (buffer
, "NON_LVALUE_EXPR <");
1357 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1358 pp_character (buffer
, '>');
1362 pp_string (buffer
, "SAVE_EXPR <");
1363 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1364 pp_character (buffer
, '>');
1368 pp_string (buffer
, "COMPLEX_EXPR <");
1369 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1370 pp_string (buffer
, ", ");
1371 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1372 pp_string (buffer
, ">");
1376 pp_string (buffer
, "CONJ_EXPR <");
1377 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1378 pp_string (buffer
, ">");
1382 pp_string (buffer
, "REALPART_EXPR <");
1383 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1384 pp_string (buffer
, ">");
1388 pp_string (buffer
, "IMAGPART_EXPR <");
1389 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1390 pp_string (buffer
, ">");
1394 pp_string (buffer
, "VA_ARG_EXPR <");
1395 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1396 pp_string (buffer
, ">");
1399 case TRY_FINALLY_EXPR
:
1400 case TRY_CATCH_EXPR
:
1401 pp_string (buffer
, "try");
1402 newline_and_indent (buffer
, spc
+2);
1403 pp_string (buffer
, "{");
1404 newline_and_indent (buffer
, spc
+4);
1405 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
1406 newline_and_indent (buffer
, spc
+2);
1407 pp_string (buffer
, "}");
1408 newline_and_indent (buffer
, spc
);
1410 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
1411 newline_and_indent (buffer
, spc
+2);
1412 pp_string (buffer
, "{");
1413 newline_and_indent (buffer
, spc
+4);
1414 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
1415 newline_and_indent (buffer
, spc
+2);
1416 pp_string (buffer
, "}");
1421 pp_string (buffer
, "catch (");
1422 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
1423 pp_string (buffer
, ")");
1424 newline_and_indent (buffer
, spc
+2);
1425 pp_string (buffer
, "{");
1426 newline_and_indent (buffer
, spc
+4);
1427 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
1428 newline_and_indent (buffer
, spc
+2);
1429 pp_string (buffer
, "}");
1433 case EH_FILTER_EXPR
:
1434 pp_string (buffer
, "<<<eh_filter (");
1435 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
1436 pp_string (buffer
, ")>>>");
1437 newline_and_indent (buffer
, spc
+2);
1438 pp_string (buffer
, "{");
1439 newline_and_indent (buffer
, spc
+4);
1440 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
1441 newline_and_indent (buffer
, spc
+2);
1442 pp_string (buffer
, "}");
1447 op0
= TREE_OPERAND (node
, 0);
1448 /* If this is for break or continue, don't bother printing it. */
1449 if (DECL_NAME (op0
))
1451 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1452 if (strcmp (name
, "break") == 0
1453 || strcmp (name
, "continue") == 0)
1456 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1457 pp_character (buffer
, ':');
1458 if (DECL_NONLOCAL (op0
))
1459 pp_string (buffer
, " [non-local]");
1463 pp_string (buffer
, "<<<exception object>>>");
1467 pp_string (buffer
, "<<<filter object>>>");
1471 pp_string (buffer
, "while (1)");
1472 if (!(flags
& TDF_SLIM
))
1474 newline_and_indent (buffer
, spc
+2);
1475 pp_character (buffer
, '{');
1476 newline_and_indent (buffer
, spc
+4);
1477 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
1478 newline_and_indent (buffer
, spc
+2);
1479 pp_character (buffer
, '}');
1485 pp_string (buffer
, "return");
1486 op0
= TREE_OPERAND (node
, 0);
1490 if (TREE_CODE (op0
) == MODIFY_EXPR
)
1491 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), spc
, flags
, false);
1493 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1498 pp_string (buffer
, "if (");
1499 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1500 pp_string (buffer
, ") break");
1504 pp_string (buffer
, "switch (");
1505 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
1506 pp_character (buffer
, ')');
1507 if (!(flags
& TDF_SLIM
))
1509 newline_and_indent (buffer
, spc
+2);
1510 pp_character (buffer
, '{');
1511 if (SWITCH_BODY (node
))
1513 newline_and_indent (buffer
, spc
+4);
1514 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
1519 tree vec
= SWITCH_LABELS (node
);
1520 size_t i
, n
= TREE_VEC_LENGTH (vec
);
1521 for (i
= 0; i
< n
; ++i
)
1523 tree elt
= TREE_VEC_ELT (vec
, i
);
1524 newline_and_indent (buffer
, spc
+4);
1527 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
1528 pp_string (buffer
, " goto ");
1529 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
1531 pp_semicolon (buffer
);
1534 pp_string (buffer
, "case ???: goto ???;");
1537 newline_and_indent (buffer
, spc
+2);
1538 pp_character (buffer
, '}');
1544 op0
= GOTO_DESTINATION (node
);
1545 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
1547 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1548 if (strcmp (name
, "break") == 0
1549 || strcmp (name
, "continue") == 0)
1551 pp_string (buffer
, name
);
1555 pp_string (buffer
, "goto ");
1556 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1560 pp_string (buffer
, "resx ");
1561 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1565 pp_string (buffer
, "__asm__");
1566 if (ASM_VOLATILE_P (node
))
1567 pp_string (buffer
, " __volatile__");
1568 pp_character (buffer
, '(');
1569 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
1570 pp_character (buffer
, ':');
1571 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
1572 pp_character (buffer
, ':');
1573 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
1574 if (ASM_CLOBBERS (node
))
1576 pp_character (buffer
, ':');
1577 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
1579 pp_string (buffer
, ")");
1582 case CASE_LABEL_EXPR
:
1583 if (CASE_LOW (node
) && CASE_HIGH (node
))
1585 pp_string (buffer
, "case ");
1586 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1587 pp_string (buffer
, " ... ");
1588 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
1590 else if (CASE_LOW (node
))
1592 pp_string (buffer
, "case ");
1593 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1596 pp_string (buffer
, "default ");
1597 pp_character (buffer
, ':');
1601 pp_string (buffer
, "OBJ_TYPE_REF(");
1602 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
1603 pp_character (buffer
, ';');
1604 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
1605 pp_character (buffer
, '-');
1606 pp_character (buffer
, '>');
1607 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
1608 pp_character (buffer
, ')');
1615 dump_generic_node (buffer
, PHI_RESULT (node
), spc
, flags
, false);
1616 pp_string (buffer
, " = PHI <");
1617 for (i
= 0; i
< PHI_NUM_ARGS (node
); i
++)
1619 dump_generic_node (buffer
, PHI_ARG_DEF (node
, i
), spc
, flags
, false);
1620 pp_string (buffer
, "(");
1621 pp_decimal_int (buffer
, PHI_ARG_EDGE (node
, i
)->src
->index
);
1622 pp_string (buffer
, ")");
1623 if (i
< PHI_NUM_ARGS (node
) - 1)
1624 pp_string (buffer
, ", ");
1626 pp_string (buffer
, ">;");
1631 dump_generic_node (buffer
, SSA_NAME_VAR (node
), spc
, flags
, false);
1632 pp_string (buffer
, "_");
1633 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
1634 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
1635 pp_string (buffer
, "(ab)");
1638 case WITH_SIZE_EXPR
:
1639 pp_string (buffer
, "WITH_SIZE_EXPR <");
1640 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1641 pp_string (buffer
, ", ");
1642 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1643 pp_string (buffer
, ">");
1647 pp_printf (buffer
, "VH.%d", VALUE_HANDLE_ID (node
));
1651 pp_string (buffer
, "ASSERT_EXPR <");
1652 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
1653 pp_string (buffer
, ", ");
1654 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
1655 pp_string (buffer
, ">");
1659 pp_string (buffer
, "scev_known");
1662 case SCEV_NOT_KNOWN
:
1663 pp_string (buffer
, "scev_not_known");
1666 case POLYNOMIAL_CHREC
:
1667 pp_string (buffer
, "{");
1668 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
1669 pp_string (buffer
, ", +, ");
1670 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
1671 pp_string (buffer
, "}_");
1672 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
1676 case REALIGN_LOAD_EXPR
:
1677 pp_string (buffer
, "REALIGN_LOAD <");
1678 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1679 pp_string (buffer
, ", ");
1680 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1681 pp_string (buffer
, ", ");
1682 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1683 pp_string (buffer
, ">");
1687 pp_string (buffer
, " VEC_COND_EXPR < ");
1688 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1689 pp_string (buffer
, " , ");
1690 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1691 pp_string (buffer
, " , ");
1692 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1693 pp_string (buffer
, " > ");
1697 pp_string (buffer
, " DOT_PROD_EXPR < ");
1698 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1699 pp_string (buffer
, " , ");
1700 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1701 pp_string (buffer
, " , ");
1702 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1703 pp_string (buffer
, " > ");
1707 pp_string (buffer
, "#pragma omp parallel");
1708 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
1709 if (OMP_PARALLEL_FN (node
))
1711 pp_string (buffer
, " [child fn: ");
1712 dump_generic_node (buffer
, OMP_PARALLEL_FN (node
), spc
, flags
, false);
1714 pp_string (buffer
, " (");
1716 if (OMP_PARALLEL_DATA_ARG (node
))
1717 dump_generic_node (buffer
, OMP_PARALLEL_DATA_ARG (node
), spc
, flags
,
1720 pp_string (buffer
, "???");
1722 pp_string (buffer
, ")]");
1726 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
1728 newline_and_indent (buffer
, spc
+ 2);
1729 pp_character (buffer
, '{');
1730 newline_and_indent (buffer
, spc
+ 4);
1731 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
1732 newline_and_indent (buffer
, spc
+ 2);
1733 pp_character (buffer
, '}');
1739 pp_string (buffer
, "#pragma omp for");
1740 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
1742 if (!(flags
& TDF_SLIM
))
1744 if (OMP_FOR_PRE_BODY (node
))
1746 newline_and_indent (buffer
, spc
+ 2);
1747 pp_character (buffer
, '{');
1749 newline_and_indent (buffer
, spc
);
1750 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
1753 newline_and_indent (buffer
, spc
);
1754 pp_string (buffer
, "for (");
1755 dump_generic_node (buffer
, OMP_FOR_INIT (node
), spc
, flags
, false);
1756 pp_string (buffer
, "; ");
1757 dump_generic_node (buffer
, OMP_FOR_COND (node
), spc
, flags
, false);
1758 pp_string (buffer
, "; ");
1759 dump_generic_node (buffer
, OMP_FOR_INCR (node
), spc
, flags
, false);
1760 pp_string (buffer
, ")");
1761 if (OMP_FOR_BODY (node
))
1763 newline_and_indent (buffer
, spc
+ 2);
1764 pp_character (buffer
, '{');
1765 newline_and_indent (buffer
, spc
+ 4);
1766 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
1768 newline_and_indent (buffer
, spc
+ 2);
1769 pp_character (buffer
, '}');
1771 if (OMP_FOR_PRE_BODY (node
))
1774 newline_and_indent (buffer
, spc
+ 2);
1775 pp_character (buffer
, '}');
1782 pp_string (buffer
, "#pragma omp sections");
1783 if (OMP_SECTIONS_CONTROL (node
))
1785 pp_string (buffer
, " (");
1786 dump_generic_node (buffer
, OMP_SECTIONS_CONTROL (node
), spc
,
1788 pp_string (buffer
, ")");
1790 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
1793 case OMP_SECTIONS_SWITCH
:
1794 pp_string (buffer
, "OMP_SECTIONS_SWITCH");
1799 pp_string (buffer
, "#pragma omp section");
1803 pp_string (buffer
, "#pragma omp master");
1807 pp_string (buffer
, "#pragma omp ordered");
1811 pp_string (buffer
, "#pragma omp critical");
1812 if (OMP_CRITICAL_NAME (node
))
1815 pp_character (buffer
, '(');
1816 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
1818 pp_character (buffer
, ')');
1823 pp_string (buffer
, "#pragma omp atomic");
1824 newline_and_indent (buffer
, spc
+ 2);
1825 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1827 pp_character (buffer
, '=');
1829 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1833 pp_string (buffer
, "#pragma omp single");
1834 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
1838 pp_string (buffer
, "OMP_RETURN");
1839 if (OMP_RETURN_NOWAIT (node
))
1840 pp_string (buffer
, " [nowait]");
1845 pp_string (buffer
, "OMP_CONTINUE (");
1846 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1847 pp_string (buffer
, " <- ");
1848 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1849 pp_string (buffer
, ")");
1854 dump_omp_clause (buffer
, node
, spc
, flags
);
1858 case REDUC_MAX_EXPR
:
1859 pp_string (buffer
, " REDUC_MAX_EXPR < ");
1860 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1861 pp_string (buffer
, " > ");
1864 case REDUC_MIN_EXPR
:
1865 pp_string (buffer
, " REDUC_MIN_EXPR < ");
1866 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1867 pp_string (buffer
, " > ");
1870 case REDUC_PLUS_EXPR
:
1871 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
1872 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1873 pp_string (buffer
, " > ");
1879 pp_string (buffer
, "BLOCK");
1881 if (BLOCK_ABSTRACT (node
))
1882 pp_string (buffer
, " [abstract]");
1884 if (TREE_ASM_WRITTEN (node
))
1885 pp_string (buffer
, " [written]");
1887 newline_and_indent (buffer
, spc
+ 2);
1889 if (BLOCK_SUPERCONTEXT (node
))
1891 pp_string (buffer
, "SUPERCONTEXT: ");
1892 if (TREE_CODE (BLOCK_SUPERCONTEXT (node
)) == BLOCK
)
1893 pp_printf (buffer
, "BLOCK %p",
1894 (void *)BLOCK_SUPERCONTEXT (node
));
1896 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (node
), 0, flags
,
1898 newline_and_indent (buffer
, spc
+ 2);
1901 if (BLOCK_SUBBLOCKS (node
))
1903 pp_string (buffer
, "SUBBLOCKS: ");
1904 for (t
= BLOCK_SUBBLOCKS (node
); t
; t
= BLOCK_CHAIN (t
))
1905 pp_printf (buffer
, "%p ", (void *)t
);
1906 newline_and_indent (buffer
, spc
+ 2);
1909 if (BLOCK_VARS (node
))
1911 pp_string (buffer
, "VARS: ");
1912 for (t
= BLOCK_VARS (node
); t
; t
= TREE_CHAIN (t
))
1914 dump_generic_node (buffer
, t
, 0, flags
, false);
1915 pp_string (buffer
, " ");
1917 newline_and_indent (buffer
, spc
+ 2);
1920 if (BLOCK_ABSTRACT_ORIGIN (node
))
1922 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
1923 if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node
)) == BLOCK
)
1924 pp_printf (buffer
, "BLOCK %p",
1925 (void *)BLOCK_ABSTRACT_ORIGIN (node
));
1927 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (node
), 0, flags
,
1929 newline_and_indent (buffer
, spc
+ 2);
1938 if (is_stmt
&& is_expr
)
1939 pp_semicolon (buffer
);
1940 pp_write_text_to_stream (buffer
);
1945 /* Print the declaration of a variable. */
1948 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
1952 if (TREE_CODE (t
) == TYPE_DECL
)
1953 pp_string (buffer
, "typedef ");
1955 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
1956 pp_string (buffer
, "register ");
1958 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
1959 pp_string (buffer
, "extern ");
1960 else if (TREE_STATIC (t
))
1961 pp_string (buffer
, "static ");
1963 /* Print the type and name. */
1964 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
1968 /* Print array's type. */
1969 tmp
= TREE_TYPE (t
);
1970 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
1971 tmp
= TREE_TYPE (tmp
);
1972 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
1974 /* Print variable's name. */
1976 dump_generic_node (buffer
, t
, spc
, flags
, false);
1978 /* Print the dimensions. */
1979 tmp
= TREE_TYPE (t
);
1980 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
1982 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
1983 tmp
= TREE_TYPE (tmp
);
1986 else if (TREE_CODE (t
) == FUNCTION_DECL
)
1988 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
1990 dump_decl_name (buffer
, t
, flags
);
1991 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
1995 /* Print type declaration. */
1996 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
1998 /* Print variable's name. */
2000 dump_generic_node (buffer
, t
, spc
, flags
, false);
2003 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2005 pp_string (buffer
, " __asm__ ");
2006 pp_character (buffer
, '(');
2007 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2008 pp_character (buffer
, ')');
2011 /* The initial value of a function serves to determine wether the function
2012 is declared or defined. So the following does not apply to function
2014 if (TREE_CODE (t
) != FUNCTION_DECL
)
2016 /* Print the initial value. */
2017 if (DECL_INITIAL (t
))
2020 pp_character (buffer
, '=');
2022 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2026 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2028 pp_string (buffer
, " [value-expr: ");
2029 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2030 pp_character (buffer
, ']');
2033 pp_character (buffer
, ';');
2037 /* Prints a structure: name, fields, and methods.
2038 FIXME: Still incomplete. */
2041 print_struct_decl (pretty_printer
*buffer
, tree node
, int spc
, int flags
)
2043 /* Print the name of the structure. */
2044 if (TYPE_NAME (node
))
2047 if (TREE_CODE (node
) == RECORD_TYPE
)
2048 pp_string (buffer
, "struct ");
2049 else if ((TREE_CODE (node
) == UNION_TYPE
2050 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
2051 pp_string (buffer
, "union ");
2053 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
2056 /* Print the contents of the structure. */
2057 pp_newline (buffer
);
2059 pp_character (buffer
, '{');
2060 pp_newline (buffer
);
2062 /* Print the fields of the structure. */
2065 tmp
= TYPE_FIELDS (node
);
2068 /* Avoid to print recursively the structure. */
2069 /* FIXME : Not implemented correctly...,
2070 what about the case when we have a cycle in the contain graph? ...
2071 Maybe this could be solved by looking at the scope in which the
2072 structure was declared. */
2073 if (TREE_TYPE (tmp
) != node
2074 || (TREE_CODE (TREE_TYPE (tmp
)) == POINTER_TYPE
2075 && TREE_TYPE (TREE_TYPE (tmp
)) != node
))
2077 print_declaration (buffer
, tmp
, spc
+2, flags
);
2078 pp_newline (buffer
);
2080 tmp
= TREE_CHAIN (tmp
);
2084 pp_character (buffer
, '}');
2087 /* Return the priority of the operator OP.
2089 From lowest to highest precedence with either left-to-right (L-R)
2090 or right-to-left (R-L) associativity]:
2093 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2105 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2106 15 [L-R] fn() [] -> .
2108 unary +, - and * have higher precedence than the corresponding binary
2117 switch (TREE_CODE (op
))
2132 case TRUTH_ORIF_EXPR
:
2135 case TRUTH_AND_EXPR
:
2136 case TRUTH_ANDIF_EXPR
:
2143 case TRUTH_XOR_EXPR
:
2160 case UNORDERED_EXPR
:
2173 case WIDEN_SUM_EXPR
:
2178 case WIDEN_MULT_EXPR
:
2181 case TRUNC_DIV_EXPR
:
2183 case FLOOR_DIV_EXPR
:
2184 case ROUND_DIV_EXPR
:
2186 case EXACT_DIV_EXPR
:
2187 case TRUNC_MOD_EXPR
:
2189 case FLOOR_MOD_EXPR
:
2190 case ROUND_MOD_EXPR
:
2193 case TRUTH_NOT_EXPR
:
2195 case POSTINCREMENT_EXPR
:
2196 case POSTDECREMENT_EXPR
:
2197 case PREINCREMENT_EXPR
:
2198 case PREDECREMENT_EXPR
:
2200 case ALIGN_INDIRECT_REF
:
2201 case MISALIGNED_INDIRECT_REF
:
2207 case FIX_TRUNC_EXPR
:
2209 case FIX_FLOOR_EXPR
:
2210 case FIX_ROUND_EXPR
:
2216 case ARRAY_RANGE_REF
:
2220 /* Special expressions. */
2226 case REDUC_MAX_EXPR
:
2227 case REDUC_MIN_EXPR
:
2228 case REDUC_PLUS_EXPR
:
2229 case VEC_LSHIFT_EXPR
:
2230 case VEC_RSHIFT_EXPR
:
2234 case NON_LVALUE_EXPR
:
2235 return op_prio (TREE_OPERAND (op
, 0));
2238 /* Return an arbitrarily high precedence to avoid surrounding single
2239 VAR_DECLs in ()s. */
2245 /* Return the symbol associated with operator OP. */
2248 op_symbol_1 (enum tree_code code
)
2256 case TRUTH_ORIF_EXPR
:
2259 case TRUTH_AND_EXPR
:
2260 case TRUTH_ANDIF_EXPR
:
2266 case TRUTH_XOR_EXPR
:
2276 case UNORDERED_EXPR
:
2322 case VEC_LSHIFT_EXPR
:
2325 case VEC_RSHIFT_EXPR
:
2331 case REDUC_PLUS_EXPR
:
2334 case WIDEN_SUM_EXPR
:
2337 case WIDEN_MULT_EXPR
:
2347 case TRUTH_NOT_EXPR
:
2354 case ALIGN_INDIRECT_REF
:
2357 case MISALIGNED_INDIRECT_REF
:
2360 case TRUNC_DIV_EXPR
:
2367 case FLOOR_DIV_EXPR
:
2370 case ROUND_DIV_EXPR
:
2373 case EXACT_DIV_EXPR
:
2376 case TRUNC_MOD_EXPR
:
2382 case FLOOR_MOD_EXPR
:
2385 case ROUND_MOD_EXPR
:
2388 case PREDECREMENT_EXPR
:
2391 case PREINCREMENT_EXPR
:
2394 case POSTDECREMENT_EXPR
:
2397 case POSTINCREMENT_EXPR
:
2407 return "<<< ??? >>>";
2414 return op_symbol_1 (TREE_CODE (op
));
2417 /* Prints the name of a CALL_EXPR. */
2420 print_call_name (pretty_printer
*buffer
, tree node
)
2424 gcc_assert (TREE_CODE (node
) == CALL_EXPR
);
2426 op0
= TREE_OPERAND (node
, 0);
2428 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
2429 op0
= TREE_OPERAND (op0
, 0);
2431 switch (TREE_CODE (op0
))
2435 dump_function_name (buffer
, op0
);
2441 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2445 pp_string (buffer
, "(");
2446 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2447 pp_string (buffer
, ") ? ");
2448 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, 0, false);
2449 pp_string (buffer
, " : ");
2450 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, 0, false);
2454 /* The function is a pointer contained in a structure. */
2455 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == INDIRECT_REF
||
2456 TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2457 dump_function_name (buffer
, TREE_OPERAND (op0
, 1));
2459 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2461 We can have several levels of structures and a function
2462 pointer inside. This is not implemented yet... */
2467 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2468 dump_function_name (buffer
, TREE_OPERAND (op0
, 0));
2470 dump_generic_node (buffer
, op0
, 0, 0, false);
2475 dump_generic_node (buffer
, op0
, 0, 0, false);
2483 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2486 pretty_print_string (pretty_printer
*buffer
, const char *str
)
2496 pp_string (buffer
, "\\b");
2500 pp_string (buffer
, "\\f");
2504 pp_string (buffer
, "\\n");
2508 pp_string (buffer
, "\\r");
2512 pp_string (buffer
, "\\t");
2516 pp_string (buffer
, "\\v");
2520 pp_string (buffer
, "\\\\");
2524 pp_string (buffer
, "\\\"");
2528 pp_string (buffer
, "\\'");
2531 /* No need to handle \0; the loop terminates on \0. */
2534 pp_string (buffer
, "\\1");
2538 pp_string (buffer
, "\\2");
2542 pp_string (buffer
, "\\3");
2546 pp_string (buffer
, "\\4");
2550 pp_string (buffer
, "\\5");
2554 pp_string (buffer
, "\\6");
2558 pp_string (buffer
, "\\7");
2562 pp_character (buffer
, str
[0]);
2570 maybe_init_pretty_print (FILE *file
)
2574 pp_construct (&buffer
, /* prefix */NULL
, /* line-width */0);
2575 pp_needs_newline (&buffer
) = true;
2579 buffer
.buffer
->stream
= file
;
2583 newline_and_indent (pretty_printer
*buffer
, int spc
)
2585 pp_newline (buffer
);
2590 dump_vops (pretty_printer
*buffer
, tree stmt
, int spc
, int flags
)
2593 use_operand_p use_p
;
2594 def_operand_p def_p
;
2595 use_operand_p kill_p
;
2598 if (!ssa_operands_active ())
2601 FOR_EACH_SSA_MAYDEF_OPERAND (def_p
, use_p
, stmt
, iter
)
2603 pp_string (buffer
, "# ");
2604 dump_generic_node (buffer
, DEF_FROM_PTR (def_p
),
2605 spc
+ 2, flags
, false);
2606 pp_string (buffer
, " = V_MAY_DEF <");
2607 dump_generic_node (buffer
, USE_FROM_PTR (use_p
),
2608 spc
+ 2, flags
, false);
2609 pp_string (buffer
, ">;");
2610 newline_and_indent (buffer
, spc
);
2613 FOR_EACH_SSA_MUSTDEF_OPERAND (def_p
, kill_p
, stmt
, iter
)
2615 pp_string (buffer
, "# ");
2616 dump_generic_node (buffer
, DEF_FROM_PTR (def_p
),
2617 spc
+ 2, flags
, false);
2618 pp_string (buffer
, " = V_MUST_DEF <");
2619 dump_generic_node (buffer
, USE_FROM_PTR (kill_p
),
2620 spc
+ 2, flags
, false);
2621 pp_string (buffer
, ">;");
2622 newline_and_indent (buffer
, spc
);
2625 FOR_EACH_SSA_TREE_OPERAND (use
, stmt
, iter
, SSA_OP_VUSE
)
2627 pp_string (buffer
, "# VUSE <");
2628 dump_generic_node (buffer
, use
, spc
+ 2, flags
, false);
2629 pp_string (buffer
, ">;");
2630 newline_and_indent (buffer
, spc
);
2634 /* Dumps basic block BB to FILE with details described by FLAGS and
2635 indented by INDENT spaces. */
2638 dump_generic_bb (FILE *file
, basic_block bb
, int indent
, int flags
)
2640 maybe_init_pretty_print (file
);
2641 dump_generic_bb_buff (&buffer
, bb
, indent
, flags
);
2645 /* Dumps header of basic block BB to buffer BUFFER indented by INDENT
2646 spaces and details described by flags. */
2649 dump_bb_header (pretty_printer
*buffer
, basic_block bb
, int indent
, int flags
)
2655 if (flags
& TDF_BLOCKS
)
2658 pp_string (buffer
, "# BLOCK ");
2659 pp_decimal_int (buffer
, bb
->index
);
2662 pp_string (buffer
, " freq:");
2663 pp_decimal_int (buffer
, bb
->frequency
);
2667 pp_string (buffer
, " count:");
2668 pp_widest_integer (buffer
, bb
->count
);
2671 if (flags
& TDF_LINENO
)
2673 block_stmt_iterator bsi
;
2675 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
2676 if (get_lineno (bsi_stmt (bsi
)) != -1)
2678 pp_string (buffer
, ", starting at line ");
2679 pp_decimal_int (buffer
, get_lineno (bsi_stmt (bsi
)));
2683 newline_and_indent (buffer
, indent
);
2685 pp_string (buffer
, "# PRED:");
2686 pp_write_text_to_stream (buffer
);
2687 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
2688 if (flags
& TDF_SLIM
)
2690 pp_string (buffer
, " ");
2691 if (e
->src
== ENTRY_BLOCK_PTR
)
2692 pp_string (buffer
, "ENTRY");
2694 pp_decimal_int (buffer
, e
->src
->index
);
2697 dump_edge_info (buffer
->buffer
->stream
, e
, 0);
2698 pp_newline (buffer
);
2702 stmt
= first_stmt (bb
);
2703 if (!stmt
|| TREE_CODE (stmt
) != LABEL_EXPR
)
2705 INDENT (indent
- 2);
2706 pp_string (buffer
, "<bb ");
2707 pp_decimal_int (buffer
, bb
->index
);
2708 pp_string (buffer
, ">:");
2709 pp_newline (buffer
);
2712 pp_write_text_to_stream (buffer
);
2713 check_bb_profile (bb
, buffer
->buffer
->stream
);
2716 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
2720 dump_bb_end (pretty_printer
*buffer
, basic_block bb
, int indent
, int flags
)
2726 pp_string (buffer
, "# SUCC:");
2727 pp_write_text_to_stream (buffer
);
2728 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
2729 if (flags
& TDF_SLIM
)
2731 pp_string (buffer
, " ");
2732 if (e
->dest
== EXIT_BLOCK_PTR
)
2733 pp_string (buffer
, "EXIT");
2735 pp_decimal_int (buffer
, e
->dest
->index
);
2738 dump_edge_info (buffer
->buffer
->stream
, e
, 1);
2739 pp_newline (buffer
);
2742 /* Dumps phi nodes of basic block BB to buffer BUFFER with details described by
2743 FLAGS indented by INDENT spaces. */
2746 dump_phi_nodes (pretty_printer
*buffer
, basic_block bb
, int indent
, int flags
)
2748 tree phi
= phi_nodes (bb
);
2752 for (; phi
; phi
= PHI_CHAIN (phi
))
2754 if (is_gimple_reg (PHI_RESULT (phi
)) || (flags
& TDF_VOPS
))
2757 pp_string (buffer
, "# ");
2758 dump_generic_node (buffer
, phi
, indent
, flags
, false);
2759 pp_newline (buffer
);
2764 /* Dump jump to basic block BB that is represented implicitly in the cfg
2768 pp_cfg_jump (pretty_printer
*buffer
, basic_block bb
)
2772 stmt
= first_stmt (bb
);
2774 pp_string (buffer
, "goto <bb ");
2775 pp_decimal_int (buffer
, bb
->index
);
2776 pp_string (buffer
, ">");
2777 if (stmt
&& TREE_CODE (stmt
) == LABEL_EXPR
)
2779 pp_string (buffer
, " (");
2780 dump_generic_node (buffer
, LABEL_EXPR_LABEL (stmt
), 0, 0, false);
2781 pp_string (buffer
, ")");
2783 pp_semicolon (buffer
);
2786 /* Dump edges represented implicitly in basic block BB to BUFFER, indented
2787 by INDENT spaces, with details given by FLAGS. */
2790 dump_implicit_edges (pretty_printer
*buffer
, basic_block bb
, int indent
,
2796 /* If there is a fallthru edge, we may need to add an artificial goto to the
2798 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
2799 if (e
->flags
& EDGE_FALLTHRU
)
2801 if (e
&& e
->dest
!= bb
->next_bb
)
2805 if ((flags
& TDF_LINENO
)
2806 #ifdef USE_MAPPED_LOCATION
2807 && e
->goto_locus
!= UNKNOWN_LOCATION
2813 expanded_location goto_xloc
;
2814 #ifdef USE_MAPPED_LOCATION
2815 goto_xloc
= expand_location (e
->goto_locus
);
2817 goto_xloc
= *e
->goto_locus
;
2819 pp_character (buffer
, '[');
2822 pp_string (buffer
, goto_xloc
.file
);
2823 pp_string (buffer
, " : ");
2825 pp_decimal_int (buffer
, goto_xloc
.line
);
2826 pp_string (buffer
, "] ");
2829 pp_cfg_jump (buffer
, e
->dest
);
2830 pp_newline (buffer
);
2834 /* Dumps basic block BB to buffer BUFFER with details described by FLAGS and
2835 indented by INDENT spaces. */
2838 dump_generic_bb_buff (pretty_printer
*buffer
, basic_block bb
,
2839 int indent
, int flags
)
2841 block_stmt_iterator bsi
;
2843 int label_indent
= indent
- 2;
2845 if (label_indent
< 0)
2848 dump_bb_header (buffer
, bb
, indent
, flags
);
2850 dump_phi_nodes (buffer
, bb
, indent
, flags
);
2852 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
2856 stmt
= bsi_stmt (bsi
);
2858 curr_indent
= TREE_CODE (stmt
) == LABEL_EXPR
? label_indent
: indent
;
2860 INDENT (curr_indent
);
2861 dump_generic_node (buffer
, stmt
, curr_indent
, flags
, true);
2862 pp_newline (buffer
);
2865 dump_implicit_edges (buffer
, bb
, indent
, flags
);
2867 if (flags
& TDF_BLOCKS
)
2868 dump_bb_end (buffer
, bb
, indent
, flags
);