1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
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 3, 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 COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
27 #include "diagnostic.h"
30 #include "tree-flow.h"
31 #include "langhooks.h"
32 #include "tree-iterator.h"
33 #include "tree-chrec.h"
34 #include "tree-pass.h"
35 #include "fixed-value.h"
36 #include "value-prof.h"
38 /* Local functions, macros and variables. */
39 static int op_prio (const_tree
);
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_OPERAND_LENGTH (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");
87 /* Debugging function to print out a generic expression. */
90 debug_generic_expr (tree t
)
92 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
93 fprintf (stderr
, "\n");
96 /* Debugging function to print out a generic statement. */
99 debug_generic_stmt (tree t
)
101 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
102 fprintf (stderr
, "\n");
105 /* Debugging function to print out a chain of trees . */
108 debug_tree_chain (tree t
)
112 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
113 fprintf(stderr
, " ");
116 fprintf (stderr
, "\n");
119 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
121 print_generic_decl (FILE *file
, tree decl
, int flags
)
123 maybe_init_pretty_print (file
);
124 print_declaration (&buffer
, decl
, 2, flags
);
125 pp_write_text_to_stream (&buffer
);
128 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
129 to show in the dump. See TDF_* in tree.h. */
132 print_generic_stmt (FILE *file
, tree t
, int flags
)
134 maybe_init_pretty_print (file
);
135 dump_generic_node (&buffer
, t
, 0, flags
, true);
139 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
140 to show in the dump. See TDF_* in tree.h. The output is indented by
144 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
148 maybe_init_pretty_print (file
);
150 for (i
= 0; i
< indent
; i
++)
152 dump_generic_node (&buffer
, t
, indent
, flags
, true);
156 /* Print a single expression T on file FILE. FLAGS specifies details to show
157 in the dump. See TDF_* in tree.h. */
160 print_generic_expr (FILE *file
, tree t
, int flags
)
162 maybe_init_pretty_print (file
);
163 dump_generic_node (&buffer
, t
, 0, flags
, false);
166 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
170 dump_decl_name (pretty_printer
*buffer
, tree node
, int flags
)
175 pp_tree_identifier (buffer
, DECL_NAME (t
));
176 if ((flags
& TDF_UID
)
177 || DECL_NAME (t
) == NULL_TREE
)
179 if (TREE_CODE (t
) == LABEL_DECL
180 && LABEL_DECL_UID (t
) != -1)
181 pp_printf (buffer
, "L." HOST_WIDE_INT_PRINT_DEC
,
185 char c
= TREE_CODE (t
) == CONST_DECL
? 'C' : 'D';
186 pp_printf (buffer
, "%c.%u", c
, DECL_UID (t
));
191 /* Like the above, but used for pretty printing function calls. */
194 dump_function_name (pretty_printer
*buffer
, tree node
)
196 if (DECL_NAME (node
))
197 PRINT_FUNCTION_NAME (node
);
199 dump_decl_name (buffer
, node
, 0);
202 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
203 FLAGS are as in dump_generic_node. */
206 dump_function_declaration (pretty_printer
*buffer
, tree node
,
209 bool wrote_arg
= false;
213 pp_character (buffer
, '(');
215 /* Print the argument types. The last element in the list is a VOID_TYPE.
216 The following avoids printing the last element. */
217 arg
= TYPE_ARG_TYPES (node
);
218 while (arg
&& TREE_CHAIN (arg
) && arg
!= error_mark_node
)
221 dump_generic_node (buffer
, TREE_VALUE (arg
), spc
, flags
, false);
222 arg
= TREE_CHAIN (arg
);
223 if (TREE_CHAIN (arg
) && TREE_CODE (TREE_CHAIN (arg
)) == TREE_LIST
)
225 pp_character (buffer
, ',');
231 pp_string (buffer
, "void");
233 pp_character (buffer
, ')');
236 /* Dump the domain associated with an array. */
239 dump_array_domain (pretty_printer
*buffer
, tree domain
, int spc
, int flags
)
241 pp_character (buffer
, '[');
244 tree min
= TYPE_MIN_VALUE (domain
);
245 tree max
= TYPE_MAX_VALUE (domain
);
248 && integer_zerop (min
)
249 && host_integerp (max
, 0))
250 pp_wide_integer (buffer
, TREE_INT_CST_LOW (max
) + 1);
254 dump_generic_node (buffer
, min
, spc
, flags
, false);
255 pp_character (buffer
, ':');
257 dump_generic_node (buffer
, max
, spc
, flags
, false);
261 pp_string (buffer
, "<unknown>");
262 pp_character (buffer
, ']');
266 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
267 dump_generic_node. */
270 dump_omp_clause (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
274 switch (OMP_CLAUSE_CODE (clause
))
276 case OMP_CLAUSE_PRIVATE
:
279 case OMP_CLAUSE_SHARED
:
282 case OMP_CLAUSE_FIRSTPRIVATE
:
283 name
= "firstprivate";
285 case OMP_CLAUSE_LASTPRIVATE
:
286 name
= "lastprivate";
288 case OMP_CLAUSE_COPYIN
:
291 case OMP_CLAUSE_COPYPRIVATE
:
292 name
= "copyprivate";
295 pp_string (buffer
, name
);
296 pp_character (buffer
, '(');
297 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
299 pp_character (buffer
, ')');
302 case OMP_CLAUSE_REDUCTION
:
303 pp_string (buffer
, "reduction(");
304 pp_string (buffer
, op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
305 pp_character (buffer
, ':');
306 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
308 pp_character (buffer
, ')');
312 pp_string (buffer
, "if(");
313 dump_generic_node (buffer
, OMP_CLAUSE_IF_EXPR (clause
),
315 pp_character (buffer
, ')');
318 case OMP_CLAUSE_NUM_THREADS
:
319 pp_string (buffer
, "num_threads(");
320 dump_generic_node (buffer
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
322 pp_character (buffer
, ')');
325 case OMP_CLAUSE_NOWAIT
:
326 pp_string (buffer
, "nowait");
328 case OMP_CLAUSE_ORDERED
:
329 pp_string (buffer
, "ordered");
332 case OMP_CLAUSE_DEFAULT
:
333 pp_string (buffer
, "default(");
334 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
336 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
338 case OMP_CLAUSE_DEFAULT_SHARED
:
339 pp_string (buffer
, "shared");
341 case OMP_CLAUSE_DEFAULT_NONE
:
342 pp_string (buffer
, "none");
344 case OMP_CLAUSE_DEFAULT_PRIVATE
:
345 pp_string (buffer
, "private");
350 pp_character (buffer
, ')');
353 case OMP_CLAUSE_SCHEDULE
:
354 pp_string (buffer
, "schedule(");
355 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
357 case OMP_CLAUSE_SCHEDULE_STATIC
:
358 pp_string (buffer
, "static");
360 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
361 pp_string (buffer
, "dynamic");
363 case OMP_CLAUSE_SCHEDULE_GUIDED
:
364 pp_string (buffer
, "guided");
366 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
367 pp_string (buffer
, "runtime");
372 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
374 pp_character (buffer
, ',');
375 dump_generic_node (buffer
,
376 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
379 pp_character (buffer
, ')');
383 /* Should never happen. */
384 dump_generic_node (buffer
, clause
, spc
, flags
, false);
390 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
391 dump_generic_node. */
394 dump_omp_clauses (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
402 dump_omp_clause (buffer
, clause
, spc
, flags
);
403 clause
= OMP_CLAUSE_CHAIN (clause
);
411 /* Dump the set of decls SYMS. BUFFER, SPC and FLAGS are as in
412 dump_generic_node. */
415 dump_symbols (pretty_printer
*buffer
, bitmap syms
, int flags
)
421 pp_string (buffer
, "NIL");
424 pp_string (buffer
, " { ");
426 EXECUTE_IF_SET_IN_BITMAP (syms
, 0, i
, bi
)
428 tree sym
= referenced_var_lookup (i
);
429 dump_generic_node (buffer
, sym
, 0, flags
, false);
430 pp_string (buffer
, " ");
433 pp_string (buffer
, "}");
438 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of indent.
439 FLAGS specifies details to show in the dump (see TDF_* in tree-pass.h).
440 If IS_STMT is true, the object printed is considered to be a statement
441 and it is terminated by ';' if appropriate. */
444 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
452 if (node
== NULL_TREE
)
455 is_expr
= EXPR_P (node
) || GIMPLE_STMT_P (node
);
457 /* We use has_stmt_ann because CALL_EXPR can be both an expression
458 and a statement, and we have no guarantee that it will have a
459 stmt_ann when it is used as an RHS expression. stmt_ann will assert
460 if you call it on something with a non-stmt annotation attached. */
461 if (TREE_CODE (node
) != ERROR_MARK
462 && is_gimple_stmt (node
)
463 && (flags
& (TDF_VOPS
|TDF_MEMSYMS
))
464 && has_stmt_ann (node
)
465 && TREE_CODE (node
) != PHI_NODE
)
466 dump_vops (buffer
, node
, spc
, flags
);
468 if (is_stmt
&& (flags
& TDF_STMTADDR
))
469 pp_printf (buffer
, "<&%p> ", (void *)node
);
471 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
473 expanded_location xloc
= expand_location (EXPR_LOCATION (node
));
474 pp_character (buffer
, '[');
477 pp_string (buffer
, xloc
.file
);
478 pp_string (buffer
, " : ");
480 pp_decimal_int (buffer
, xloc
.line
);
481 pp_string (buffer
, "] ");
484 switch (TREE_CODE (node
))
487 pp_string (buffer
, "<<< error >>>");
490 case IDENTIFIER_NODE
:
491 pp_tree_identifier (buffer
, node
);
495 while (node
&& node
!= error_mark_node
)
497 if (TREE_PURPOSE (node
))
499 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
502 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
503 node
= TREE_CHAIN (node
);
504 if (node
&& TREE_CODE (node
) == TREE_LIST
)
506 pp_character (buffer
, ',');
513 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
518 if (TREE_VEC_LENGTH (node
) > 0)
520 size_t len
= TREE_VEC_LENGTH (node
);
521 for (i
= 0; i
< len
- 1; i
++)
523 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
525 pp_character (buffer
, ',');
528 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
537 case FIXED_POINT_TYPE
:
543 unsigned int quals
= TYPE_QUALS (node
);
544 enum tree_code_class
class;
546 if (quals
& TYPE_QUAL_CONST
)
547 pp_string (buffer
, "const ");
548 else if (quals
& TYPE_QUAL_VOLATILE
)
549 pp_string (buffer
, "volatile ");
550 else if (quals
& TYPE_QUAL_RESTRICT
)
551 pp_string (buffer
, "restrict ");
553 class = TREE_CODE_CLASS (TREE_CODE (node
));
555 if (class == tcc_declaration
)
557 if (DECL_NAME (node
))
558 dump_decl_name (buffer
, node
, flags
);
560 pp_string (buffer
, "<unnamed type decl>");
562 else if (class == tcc_type
)
564 if (TYPE_NAME (node
))
566 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
567 pp_tree_identifier (buffer
, TYPE_NAME (node
));
568 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
569 && DECL_NAME (TYPE_NAME (node
)))
570 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
572 pp_string (buffer
, "<unnamed type>");
574 else if (TREE_CODE (node
) == VECTOR_TYPE
)
576 pp_string (buffer
, "vector ");
577 dump_generic_node (buffer
, TREE_TYPE (node
),
580 else if (TREE_CODE (node
) == INTEGER_TYPE
)
582 pp_string (buffer
, (TYPE_UNSIGNED (node
)
583 ? "<unnamed-unsigned:"
584 : "<unnamed-signed:"));
585 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
586 pp_string (buffer
, ">");
589 pp_string (buffer
, "<unnamed type>");
596 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
598 if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
600 tree fnode
= TREE_TYPE (node
);
602 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
604 pp_character (buffer
, '(');
605 pp_string (buffer
, str
);
606 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
607 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
609 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
611 pp_character (buffer
, ')');
612 dump_function_declaration (buffer
, fnode
, spc
, flags
);
616 unsigned int quals
= TYPE_QUALS (node
);
618 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
620 pp_string (buffer
, str
);
622 if (quals
& TYPE_QUAL_CONST
)
623 pp_string (buffer
, " const");
624 else if (quals
& TYPE_QUAL_VOLATILE
)
625 pp_string (buffer
, "volatile");
626 else if (quals
& TYPE_QUAL_RESTRICT
)
627 pp_string (buffer
, " restrict");
629 if (TYPE_REF_CAN_ALIAS_ALL (node
))
630 pp_string (buffer
, " {ref-all}");
639 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)), flags
);
640 pp_string (buffer
, "::");
645 const char *sep
= "";
648 pp_string (buffer
, "MEM[");
650 tmp
= TMR_SYMBOL (node
);
653 pp_string (buffer
, sep
);
655 pp_string (buffer
, "symbol: ");
656 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
658 tmp
= TMR_BASE (node
);
661 pp_string (buffer
, sep
);
663 pp_string (buffer
, "base: ");
664 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
666 tmp
= TMR_INDEX (node
);
669 pp_string (buffer
, sep
);
671 pp_string (buffer
, "index: ");
672 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
674 tmp
= TMR_STEP (node
);
677 pp_string (buffer
, sep
);
679 pp_string (buffer
, "step: ");
680 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
682 tmp
= TMR_OFFSET (node
);
685 pp_string (buffer
, sep
);
687 pp_string (buffer
, "offset: ");
688 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
690 pp_string (buffer
, "]");
691 if (flags
& TDF_DETAILS
)
693 pp_string (buffer
, "{");
694 dump_generic_node (buffer
, TMR_ORIGINAL (node
), spc
, flags
,
696 pp_string (buffer
, "}");
705 /* Print the innermost component type. */
706 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
707 tmp
= TREE_TYPE (tmp
))
709 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
711 /* Print the dimensions. */
712 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
713 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
719 case QUAL_UNION_TYPE
:
720 /* Print the name of the structure. */
721 if (TREE_CODE (node
) == RECORD_TYPE
)
722 pp_string (buffer
, "struct ");
723 else if (TREE_CODE (node
) == UNION_TYPE
)
724 pp_string (buffer
, "union ");
726 if (TYPE_NAME (node
))
727 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
729 print_struct_decl (buffer
, node
, spc
, flags
);
737 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
739 /* In the case of a pointer, one may want to divide by the
740 size of the pointed-to type. Unfortunately, this not
741 straightforward. The C front-end maps expressions
746 in such a way that the two INTEGER_CST nodes for "5" have
747 different values but identical types. In the latter
748 case, the 5 is multiplied by sizeof (int) in c-common.c
749 (pointer_int_sum) to convert it to a byte address, and
750 yet the type of the node is left unchanged. Argh. What
751 is consistent though is that the number value corresponds
752 to bytes (UNITS) offset.
754 NB: Neither of the following divisors can be trivially
755 used to recover the original literal:
757 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
758 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
759 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
760 pp_string (buffer
, "B"); /* pseudo-unit */
762 else if (! host_integerp (node
, 0))
765 unsigned HOST_WIDE_INT low
= TREE_INT_CST_LOW (val
);
766 HOST_WIDE_INT high
= TREE_INT_CST_HIGH (val
);
768 if (tree_int_cst_sgn (val
) < 0)
770 pp_character (buffer
, '-');
774 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
776 sprintf (pp_buffer (buffer
)->digit_buffer
,
777 HOST_WIDE_INT_PRINT_DOUBLE_HEX
, high
, low
);
778 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
781 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
785 /* Code copied from print_node. */
788 if (TREE_OVERFLOW (node
))
789 pp_string (buffer
, " overflow");
791 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
792 d
= TREE_REAL_CST (node
);
793 if (REAL_VALUE_ISINF (d
))
794 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
795 else if (REAL_VALUE_ISNAN (d
))
796 pp_string (buffer
, " Nan");
800 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
801 pp_string (buffer
, string
);
806 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
807 pp_string (buffer
, "0x");
808 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
809 output_formatted_integer (buffer
, "%02x", *p
++);
818 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
819 pp_string (buffer
, string
);
824 pp_string (buffer
, "__complex__ (");
825 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
826 pp_string (buffer
, ", ");
827 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
828 pp_string (buffer
, ")");
832 pp_string (buffer
, "\"");
833 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
834 pp_string (buffer
, "\"");
840 pp_string (buffer
, "{ ");
841 for (elt
= TREE_VECTOR_CST_ELTS (node
); elt
; elt
= TREE_CHAIN (elt
))
843 dump_generic_node (buffer
, TREE_VALUE (elt
), spc
, flags
, false);
844 if (TREE_CHAIN (elt
))
845 pp_string (buffer
, ", ");
847 pp_string (buffer
, " }");
856 dump_decl_name (buffer
, node
, flags
);
860 if (DECL_NAME (node
))
861 dump_decl_name (buffer
, node
, flags
);
862 else if (LABEL_DECL_UID (node
) != -1)
863 pp_printf (buffer
, "<L" HOST_WIDE_INT_PRINT_DEC
">",
864 LABEL_DECL_UID (node
));
866 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
870 if (DECL_IS_BUILTIN (node
))
872 /* Don't print the declaration of built-in types. */
875 if (DECL_NAME (node
))
876 dump_decl_name (buffer
, node
, flags
);
879 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
880 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
881 && TYPE_METHODS (TREE_TYPE (node
)))
883 /* The type is a c++ class: all structures have at least
885 pp_string (buffer
, "class ");
886 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
891 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
892 ? "union" : "struct "));
893 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
898 case SYMBOL_MEMORY_TAG
:
899 case NAME_MEMORY_TAG
:
900 case STRUCT_FIELD_TAG
:
905 case MEMORY_PARTITION_TAG
:
906 dump_decl_name (buffer
, node
, flags
);
910 pp_string (buffer
, "<retval>");
914 op0
= TREE_OPERAND (node
, 0);
916 if (TREE_CODE (op0
) == INDIRECT_REF
)
918 op0
= TREE_OPERAND (op0
, 0);
921 if (op_prio (op0
) < op_prio (node
))
922 pp_character (buffer
, '(');
923 dump_generic_node (buffer
, op0
, spc
, flags
, false);
924 if (op_prio (op0
) < op_prio (node
))
925 pp_character (buffer
, ')');
926 pp_string (buffer
, str
);
927 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
929 if (TREE_CODE (op0
) != VALUE_HANDLE
)
931 op0
= component_ref_field_offset (node
);
932 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
934 pp_string (buffer
, "{off: ");
935 dump_generic_node (buffer
, op0
, spc
, flags
, false);
936 pp_character (buffer
, '}');
942 pp_string (buffer
, "BIT_FIELD_REF <");
943 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
944 pp_string (buffer
, ", ");
945 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
946 pp_string (buffer
, ", ");
947 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
948 pp_string (buffer
, ">");
952 case ARRAY_RANGE_REF
:
953 op0
= TREE_OPERAND (node
, 0);
954 if (op_prio (op0
) < op_prio (node
))
955 pp_character (buffer
, '(');
956 dump_generic_node (buffer
, op0
, spc
, flags
, false);
957 if (op_prio (op0
) < op_prio (node
))
958 pp_character (buffer
, ')');
959 pp_character (buffer
, '[');
960 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
961 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
962 pp_string (buffer
, " ...");
963 pp_character (buffer
, ']');
965 op0
= array_ref_low_bound (node
);
966 op1
= array_ref_element_size (node
);
968 if (!integer_zerop (op0
)
969 || TREE_OPERAND (node
, 2)
970 || TREE_OPERAND (node
, 3))
972 pp_string (buffer
, "{lb: ");
973 dump_generic_node (buffer
, op0
, spc
, flags
, false);
974 pp_string (buffer
, " sz: ");
975 dump_generic_node (buffer
, op1
, spc
, flags
, false);
976 pp_character (buffer
, '}');
982 unsigned HOST_WIDE_INT ix
;
984 bool is_struct_init
= FALSE
;
985 pp_character (buffer
, '{');
986 if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
987 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
988 is_struct_init
= TRUE
;
989 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
991 if (field
&& is_struct_init
)
993 pp_character (buffer
, '.');
994 dump_generic_node (buffer
, field
, spc
, flags
, false);
995 pp_string (buffer
, "=");
997 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
998 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
999 val
= TREE_OPERAND (val
, 0);
1000 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1001 dump_decl_name (buffer
, val
, flags
);
1003 dump_generic_node (buffer
, val
, spc
, flags
, false);
1004 if (ix
!= VEC_length (constructor_elt
, CONSTRUCTOR_ELTS (node
)) - 1)
1006 pp_character (buffer
, ',');
1010 pp_character (buffer
, '}');
1017 if (flags
& TDF_SLIM
)
1019 pp_string (buffer
, "<COMPOUND_EXPR>");
1023 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1024 spc
, flags
, !(flags
& TDF_SLIM
));
1025 if (flags
& TDF_SLIM
)
1026 newline_and_indent (buffer
, spc
);
1029 pp_character (buffer
, ',');
1033 for (tp
= &TREE_OPERAND (node
, 1);
1034 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1035 tp
= &TREE_OPERAND (*tp
, 1))
1037 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1038 spc
, flags
, !(flags
& TDF_SLIM
));
1039 if (flags
& TDF_SLIM
)
1040 newline_and_indent (buffer
, spc
);
1043 pp_character (buffer
, ',');
1048 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1052 case STATEMENT_LIST
:
1054 tree_stmt_iterator si
;
1057 if (flags
& TDF_SLIM
)
1059 pp_string (buffer
, "<STATEMENT_LIST>");
1063 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1066 newline_and_indent (buffer
, spc
);
1069 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1075 case GIMPLE_MODIFY_STMT
:
1077 dump_generic_node (buffer
, GENERIC_TREE_OPERAND (node
, 0), spc
, flags
,
1080 pp_character (buffer
, '=');
1081 if (TREE_CODE (node
) == GIMPLE_MODIFY_STMT
1082 && MOVE_NONTEMPORAL (node
))
1083 pp_string (buffer
, "{nt}");
1084 if (TREE_CODE (node
) == GIMPLE_MODIFY_STMT
)
1087 if ((ann
= stmt_ann (node
))
1088 && ann
->has_volatile_ops
)
1089 pp_string (buffer
, "{v}");
1092 dump_generic_node (buffer
, GENERIC_TREE_OPERAND (node
, 1), spc
, flags
,
1097 pp_string (buffer
, "TARGET_EXPR <");
1098 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1099 pp_character (buffer
, ',');
1101 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1102 pp_character (buffer
, '>');
1106 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1111 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1113 pp_string (buffer
, "if (");
1114 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1115 pp_character (buffer
, ')');
1116 /* The lowered cond_exprs should always be printed in full. */
1117 if (COND_EXPR_THEN (node
)
1118 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1119 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1120 && COND_EXPR_ELSE (node
)
1121 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1122 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1125 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1127 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1129 pp_string (buffer
, " else ");
1130 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1134 else if (!(flags
& TDF_SLIM
))
1136 /* Output COND_EXPR_THEN. */
1137 if (COND_EXPR_THEN (node
))
1139 newline_and_indent (buffer
, spc
+2);
1140 pp_character (buffer
, '{');
1141 newline_and_indent (buffer
, spc
+4);
1142 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1144 newline_and_indent (buffer
, spc
+2);
1145 pp_character (buffer
, '}');
1148 /* Output COND_EXPR_ELSE. */
1149 if (COND_EXPR_ELSE (node
)
1150 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1152 newline_and_indent (buffer
, spc
);
1153 pp_string (buffer
, "else");
1154 newline_and_indent (buffer
, spc
+2);
1155 pp_character (buffer
, '{');
1156 newline_and_indent (buffer
, spc
+4);
1157 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1159 newline_and_indent (buffer
, spc
+2);
1160 pp_character (buffer
, '}');
1167 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1169 pp_character (buffer
, '?');
1171 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1173 pp_character (buffer
, ':');
1175 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1180 pp_character (buffer
, '{');
1181 if (!(flags
& TDF_SLIM
))
1183 if (BIND_EXPR_VARS (node
))
1185 pp_newline (buffer
);
1187 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= TREE_CHAIN (op0
))
1189 print_declaration (buffer
, op0
, spc
+2, flags
);
1190 pp_newline (buffer
);
1194 newline_and_indent (buffer
, spc
+2);
1195 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1196 newline_and_indent (buffer
, spc
);
1197 pp_character (buffer
, '}');
1203 print_call_name (buffer
, node
);
1205 /* Print parameters. */
1207 pp_character (buffer
, '(');
1210 call_expr_arg_iterator iter
;
1211 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1213 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1214 if (more_call_expr_args_p (&iter
))
1216 pp_character (buffer
, ',');
1221 pp_character (buffer
, ')');
1223 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1226 pp_string (buffer
, " [static-chain: ");
1227 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1228 pp_character (buffer
, ']');
1231 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1232 pp_string (buffer
, " [return slot optimization]");
1233 if (CALL_EXPR_TAILCALL (node
))
1234 pp_string (buffer
, " [tail call]");
1237 case WITH_CLEANUP_EXPR
:
1241 case CLEANUP_POINT_EXPR
:
1242 pp_string (buffer
, "<<cleanup_point ");
1243 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1244 pp_string (buffer
, ">>");
1247 case PLACEHOLDER_EXPR
:
1248 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1249 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1250 pp_character (buffer
, '>');
1253 /* Binary arithmetic and logic expressions. */
1254 case WIDEN_SUM_EXPR
:
1255 case WIDEN_MULT_EXPR
:
1258 case POINTER_PLUS_EXPR
:
1260 case TRUNC_DIV_EXPR
:
1262 case FLOOR_DIV_EXPR
:
1263 case ROUND_DIV_EXPR
:
1264 case TRUNC_MOD_EXPR
:
1266 case FLOOR_MOD_EXPR
:
1267 case ROUND_MOD_EXPR
:
1269 case EXACT_DIV_EXPR
:
1274 case VEC_LSHIFT_EXPR
:
1275 case VEC_RSHIFT_EXPR
:
1279 case TRUTH_ANDIF_EXPR
:
1280 case TRUTH_ORIF_EXPR
:
1281 case TRUTH_AND_EXPR
:
1283 case TRUTH_XOR_EXPR
:
1297 case UNORDERED_EXPR
:
1299 const char *op
= op_symbol (node
);
1300 op0
= TREE_OPERAND (node
, 0);
1301 op1
= TREE_OPERAND (node
, 1);
1303 /* When the operands are expressions with less priority,
1304 keep semantics of the tree representation. */
1305 if (op_prio (op0
) <= op_prio (node
))
1307 pp_character (buffer
, '(');
1308 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1309 pp_character (buffer
, ')');
1312 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1315 pp_string (buffer
, op
);
1318 /* When the operands are expressions with less priority,
1319 keep semantics of the tree representation. */
1320 if (op_prio (op1
) <= op_prio (node
))
1322 pp_character (buffer
, '(');
1323 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1324 pp_character (buffer
, ')');
1327 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1331 /* Unary arithmetic and logic expressions. */
1334 case TRUTH_NOT_EXPR
:
1336 case PREDECREMENT_EXPR
:
1337 case PREINCREMENT_EXPR
:
1338 case ALIGN_INDIRECT_REF
:
1339 case MISALIGNED_INDIRECT_REF
:
1341 if (TREE_CODE (node
) == ADDR_EXPR
1342 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
1343 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
1344 ; /* Do not output '&' for strings and function pointers. */
1346 pp_string (buffer
, op_symbol (node
));
1348 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1350 pp_character (buffer
, '(');
1351 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1352 pp_character (buffer
, ')');
1355 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1357 if (TREE_CODE (node
) == MISALIGNED_INDIRECT_REF
)
1359 pp_string (buffer
, "{misalignment: ");
1360 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1361 pp_character (buffer
, '}');
1365 case POSTDECREMENT_EXPR
:
1366 case POSTINCREMENT_EXPR
:
1367 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1369 pp_character (buffer
, '(');
1370 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1371 pp_character (buffer
, ')');
1374 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1375 pp_string (buffer
, op_symbol (node
));
1379 pp_string (buffer
, "MIN_EXPR <");
1380 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1381 pp_string (buffer
, ", ");
1382 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1383 pp_character (buffer
, '>');
1387 pp_string (buffer
, "MAX_EXPR <");
1388 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1389 pp_string (buffer
, ", ");
1390 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1391 pp_character (buffer
, '>');
1395 pp_string (buffer
, "ABS_EXPR <");
1396 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1397 pp_character (buffer
, '>');
1404 case FIXED_CONVERT_EXPR
:
1405 case FIX_TRUNC_EXPR
:
1409 type
= TREE_TYPE (node
);
1410 op0
= TREE_OPERAND (node
, 0);
1411 if (type
!= TREE_TYPE (op0
))
1413 pp_character (buffer
, '(');
1414 dump_generic_node (buffer
, type
, spc
, flags
, false);
1415 pp_string (buffer
, ") ");
1417 if (op_prio (op0
) < op_prio (node
))
1418 pp_character (buffer
, '(');
1419 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1420 if (op_prio (op0
) < op_prio (node
))
1421 pp_character (buffer
, ')');
1424 case VIEW_CONVERT_EXPR
:
1425 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
1426 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1427 pp_string (buffer
, ">(");
1428 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1429 pp_character (buffer
, ')');
1432 case NON_LVALUE_EXPR
:
1433 pp_string (buffer
, "NON_LVALUE_EXPR <");
1434 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1435 pp_character (buffer
, '>');
1439 pp_string (buffer
, "SAVE_EXPR <");
1440 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1441 pp_character (buffer
, '>');
1445 pp_string (buffer
, "COMPLEX_EXPR <");
1446 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1447 pp_string (buffer
, ", ");
1448 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1449 pp_string (buffer
, ">");
1453 pp_string (buffer
, "CONJ_EXPR <");
1454 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1455 pp_string (buffer
, ">");
1459 pp_string (buffer
, "REALPART_EXPR <");
1460 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1461 pp_string (buffer
, ">");
1465 pp_string (buffer
, "IMAGPART_EXPR <");
1466 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1467 pp_string (buffer
, ">");
1471 pp_string (buffer
, "VA_ARG_EXPR <");
1472 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1473 pp_string (buffer
, ">");
1476 case TRY_FINALLY_EXPR
:
1477 case TRY_CATCH_EXPR
:
1478 pp_string (buffer
, "try");
1479 newline_and_indent (buffer
, spc
+2);
1480 pp_string (buffer
, "{");
1481 newline_and_indent (buffer
, spc
+4);
1482 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
1483 newline_and_indent (buffer
, spc
+2);
1484 pp_string (buffer
, "}");
1485 newline_and_indent (buffer
, spc
);
1487 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
1488 newline_and_indent (buffer
, spc
+2);
1489 pp_string (buffer
, "{");
1490 newline_and_indent (buffer
, spc
+4);
1491 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
1492 newline_and_indent (buffer
, spc
+2);
1493 pp_string (buffer
, "}");
1498 pp_string (buffer
, "catch (");
1499 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
1500 pp_string (buffer
, ")");
1501 newline_and_indent (buffer
, spc
+2);
1502 pp_string (buffer
, "{");
1503 newline_and_indent (buffer
, spc
+4);
1504 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
1505 newline_and_indent (buffer
, spc
+2);
1506 pp_string (buffer
, "}");
1510 case EH_FILTER_EXPR
:
1511 pp_string (buffer
, "<<<eh_filter (");
1512 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
1513 pp_string (buffer
, ")>>>");
1514 newline_and_indent (buffer
, spc
+2);
1515 pp_string (buffer
, "{");
1516 newline_and_indent (buffer
, spc
+4);
1517 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
1518 newline_and_indent (buffer
, spc
+2);
1519 pp_string (buffer
, "}");
1523 case CHANGE_DYNAMIC_TYPE_EXPR
:
1524 pp_string (buffer
, "<<<change_dynamic_type (");
1525 dump_generic_node (buffer
, CHANGE_DYNAMIC_TYPE_NEW_TYPE (node
), spc
+ 2,
1527 pp_string (buffer
, ") ");
1528 dump_generic_node (buffer
, CHANGE_DYNAMIC_TYPE_LOCATION (node
), spc
+ 2,
1530 pp_string (buffer
, ")>>>");
1535 op0
= TREE_OPERAND (node
, 0);
1536 /* If this is for break or continue, don't bother printing it. */
1537 if (DECL_NAME (op0
))
1539 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1540 if (strcmp (name
, "break") == 0
1541 || strcmp (name
, "continue") == 0)
1544 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1545 pp_character (buffer
, ':');
1546 if (DECL_NONLOCAL (op0
))
1547 pp_string (buffer
, " [non-local]");
1551 pp_string (buffer
, "<<<exception object>>>");
1555 pp_string (buffer
, "<<<filter object>>>");
1559 pp_string (buffer
, "while (1)");
1560 if (!(flags
& TDF_SLIM
))
1562 newline_and_indent (buffer
, spc
+2);
1563 pp_character (buffer
, '{');
1564 newline_and_indent (buffer
, spc
+4);
1565 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
1566 newline_and_indent (buffer
, spc
+2);
1567 pp_character (buffer
, '}');
1573 pp_string (buffer
, "return");
1574 op0
= TREE_OPERAND (node
, 0);
1578 if (TREE_CODE (op0
) == MODIFY_EXPR
1579 || TREE_CODE (op0
) == GIMPLE_MODIFY_STMT
)
1580 dump_generic_node (buffer
, GENERIC_TREE_OPERAND (op0
, 1),
1583 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1588 pp_string (buffer
, "if (");
1589 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1590 pp_string (buffer
, ") break");
1594 pp_string (buffer
, "switch (");
1595 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
1596 pp_character (buffer
, ')');
1597 if (!(flags
& TDF_SLIM
))
1599 newline_and_indent (buffer
, spc
+2);
1600 pp_character (buffer
, '{');
1601 if (SWITCH_BODY (node
))
1603 newline_and_indent (buffer
, spc
+4);
1604 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
1609 tree vec
= SWITCH_LABELS (node
);
1610 size_t i
, n
= TREE_VEC_LENGTH (vec
);
1611 for (i
= 0; i
< n
; ++i
)
1613 tree elt
= TREE_VEC_ELT (vec
, i
);
1614 newline_and_indent (buffer
, spc
+4);
1617 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
1618 pp_string (buffer
, " goto ");
1619 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
1621 pp_semicolon (buffer
);
1624 pp_string (buffer
, "case ???: goto ???;");
1627 newline_and_indent (buffer
, spc
+2);
1628 pp_character (buffer
, '}');
1634 op0
= GOTO_DESTINATION (node
);
1635 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
1637 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1638 if (strcmp (name
, "break") == 0
1639 || strcmp (name
, "continue") == 0)
1641 pp_string (buffer
, name
);
1645 pp_string (buffer
, "goto ");
1646 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1650 pp_string (buffer
, "resx ");
1651 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1655 pp_string (buffer
, "__asm__");
1656 if (ASM_VOLATILE_P (node
))
1657 pp_string (buffer
, " __volatile__");
1658 pp_character (buffer
, '(');
1659 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
1660 pp_character (buffer
, ':');
1661 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
1662 pp_character (buffer
, ':');
1663 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
1664 if (ASM_CLOBBERS (node
))
1666 pp_character (buffer
, ':');
1667 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
1669 pp_string (buffer
, ")");
1672 case CASE_LABEL_EXPR
:
1673 if (CASE_LOW (node
) && CASE_HIGH (node
))
1675 pp_string (buffer
, "case ");
1676 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1677 pp_string (buffer
, " ... ");
1678 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
1680 else if (CASE_LOW (node
))
1682 pp_string (buffer
, "case ");
1683 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1686 pp_string (buffer
, "default ");
1687 pp_character (buffer
, ':');
1691 pp_string (buffer
, "OBJ_TYPE_REF(");
1692 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
1693 pp_character (buffer
, ';');
1694 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
1695 pp_character (buffer
, '-');
1696 pp_character (buffer
, '>');
1697 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
1698 pp_character (buffer
, ')');
1705 dump_generic_node (buffer
, PHI_RESULT (node
), spc
, flags
, false);
1706 pp_string (buffer
, " = PHI <");
1707 for (i
= 0; i
< PHI_NUM_ARGS (node
); i
++)
1709 dump_generic_node (buffer
, PHI_ARG_DEF (node
, i
), spc
, flags
, false);
1710 pp_string (buffer
, "(");
1711 pp_decimal_int (buffer
, PHI_ARG_EDGE (node
, i
)->src
->index
);
1712 pp_string (buffer
, ")");
1713 if (i
< PHI_NUM_ARGS (node
) - 1)
1714 pp_string (buffer
, ", ");
1716 pp_string (buffer
, ">");
1718 if (stmt_references_memory_p (node
) && (flags
& TDF_MEMSYMS
))
1719 dump_symbols (buffer
, STORED_SYMS (node
), flags
);
1724 dump_generic_node (buffer
, SSA_NAME_VAR (node
), spc
, flags
, false);
1725 pp_string (buffer
, "_");
1726 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
1727 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
1728 pp_string (buffer
, "(ab)");
1729 else if (SSA_NAME_IS_DEFAULT_DEF (node
))
1730 pp_string (buffer
, "(D)");
1733 case WITH_SIZE_EXPR
:
1734 pp_string (buffer
, "WITH_SIZE_EXPR <");
1735 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1736 pp_string (buffer
, ", ");
1737 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1738 pp_string (buffer
, ">");
1742 pp_printf (buffer
, "VH.%d", VALUE_HANDLE_ID (node
));
1746 pp_string (buffer
, "ASSERT_EXPR <");
1747 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
1748 pp_string (buffer
, ", ");
1749 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
1750 pp_string (buffer
, ">");
1754 pp_string (buffer
, "scev_known");
1757 case SCEV_NOT_KNOWN
:
1758 pp_string (buffer
, "scev_not_known");
1761 case POLYNOMIAL_CHREC
:
1762 pp_string (buffer
, "{");
1763 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
1764 pp_string (buffer
, ", +, ");
1765 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
1766 pp_string (buffer
, "}_");
1767 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
1771 case REALIGN_LOAD_EXPR
:
1772 pp_string (buffer
, "REALIGN_LOAD <");
1773 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1774 pp_string (buffer
, ", ");
1775 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1776 pp_string (buffer
, ", ");
1777 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1778 pp_string (buffer
, ">");
1782 pp_string (buffer
, " VEC_COND_EXPR < ");
1783 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1784 pp_string (buffer
, " , ");
1785 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1786 pp_string (buffer
, " , ");
1787 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1788 pp_string (buffer
, " > ");
1792 pp_string (buffer
, " DOT_PROD_EXPR < ");
1793 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1794 pp_string (buffer
, ", ");
1795 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1796 pp_string (buffer
, ", ");
1797 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1798 pp_string (buffer
, " > ");
1802 pp_string (buffer
, "#pragma omp parallel");
1803 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
1804 if (OMP_PARALLEL_FN (node
))
1806 pp_string (buffer
, " [child fn: ");
1807 dump_generic_node (buffer
, OMP_PARALLEL_FN (node
), spc
, flags
, false);
1809 pp_string (buffer
, " (");
1811 if (OMP_PARALLEL_DATA_ARG (node
))
1812 dump_generic_node (buffer
, OMP_PARALLEL_DATA_ARG (node
), spc
, flags
,
1815 pp_string (buffer
, "???");
1817 pp_string (buffer
, ")]");
1821 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
1823 newline_and_indent (buffer
, spc
+ 2);
1824 pp_character (buffer
, '{');
1825 newline_and_indent (buffer
, spc
+ 4);
1826 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
1827 newline_and_indent (buffer
, spc
+ 2);
1828 pp_character (buffer
, '}');
1834 pp_string (buffer
, "#pragma omp for");
1835 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
1837 if (!(flags
& TDF_SLIM
))
1839 if (OMP_FOR_PRE_BODY (node
))
1841 newline_and_indent (buffer
, spc
+ 2);
1842 pp_character (buffer
, '{');
1844 newline_and_indent (buffer
, spc
);
1845 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
1848 newline_and_indent (buffer
, spc
);
1849 pp_string (buffer
, "for (");
1850 dump_generic_node (buffer
, OMP_FOR_INIT (node
), spc
, flags
, false);
1851 pp_string (buffer
, "; ");
1852 dump_generic_node (buffer
, OMP_FOR_COND (node
), spc
, flags
, false);
1853 pp_string (buffer
, "; ");
1854 dump_generic_node (buffer
, OMP_FOR_INCR (node
), spc
, flags
, false);
1855 pp_string (buffer
, ")");
1856 if (OMP_FOR_BODY (node
))
1858 newline_and_indent (buffer
, spc
+ 2);
1859 pp_character (buffer
, '{');
1860 newline_and_indent (buffer
, spc
+ 4);
1861 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
1863 newline_and_indent (buffer
, spc
+ 2);
1864 pp_character (buffer
, '}');
1866 if (OMP_FOR_PRE_BODY (node
))
1869 newline_and_indent (buffer
, spc
+ 2);
1870 pp_character (buffer
, '}');
1877 pp_string (buffer
, "#pragma omp sections");
1878 if (OMP_SECTIONS_CONTROL (node
))
1880 pp_string (buffer
, " <");
1881 dump_generic_node (buffer
, OMP_SECTIONS_CONTROL (node
), spc
,
1883 pp_string (buffer
, ">");
1885 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
1888 case OMP_SECTIONS_SWITCH
:
1889 pp_string (buffer
, "OMP_SECTIONS_SWITCH");
1894 pp_string (buffer
, "#pragma omp section");
1898 pp_string (buffer
, "#pragma omp master");
1902 pp_string (buffer
, "#pragma omp ordered");
1906 pp_string (buffer
, "#pragma omp critical");
1907 if (OMP_CRITICAL_NAME (node
))
1910 pp_character (buffer
, '(');
1911 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
1913 pp_character (buffer
, ')');
1918 pp_string (buffer
, "#pragma omp atomic");
1919 newline_and_indent (buffer
, spc
+ 2);
1920 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1922 pp_character (buffer
, '=');
1924 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1928 pp_string (buffer
, "#pragma omp single");
1929 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
1933 pp_string (buffer
, "OMP_RETURN");
1934 if (OMP_RETURN_NOWAIT (node
))
1935 pp_string (buffer
, " [nowait]");
1940 pp_string (buffer
, "OMP_CONTINUE <");
1941 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1942 pp_string (buffer
, " <- ");
1943 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1944 pp_string (buffer
, ">");
1949 dump_omp_clause (buffer
, node
, spc
, flags
);
1953 case REDUC_MAX_EXPR
:
1954 pp_string (buffer
, " REDUC_MAX_EXPR < ");
1955 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1956 pp_string (buffer
, " > ");
1959 case REDUC_MIN_EXPR
:
1960 pp_string (buffer
, " REDUC_MIN_EXPR < ");
1961 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1962 pp_string (buffer
, " > ");
1965 case REDUC_PLUS_EXPR
:
1966 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
1967 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1968 pp_string (buffer
, " > ");
1971 case VEC_WIDEN_MULT_HI_EXPR
:
1972 pp_string (buffer
, " VEC_WIDEN_MULT_HI_EXPR < ");
1973 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1974 pp_string (buffer
, ", ");
1975 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1976 pp_string (buffer
, " > ");
1979 case VEC_WIDEN_MULT_LO_EXPR
:
1980 pp_string (buffer
, " VEC_WIDEN_MULT_LO_EXPR < ");
1981 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1982 pp_string (buffer
, ", ");
1983 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1984 pp_string (buffer
, " > ");
1987 case VEC_UNPACK_HI_EXPR
:
1988 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
1989 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1990 pp_string (buffer
, " > ");
1993 case VEC_UNPACK_LO_EXPR
:
1994 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
1995 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1996 pp_string (buffer
, " > ");
1999 case VEC_UNPACK_FLOAT_HI_EXPR
:
2000 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2001 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2002 pp_string (buffer
, " > ");
2005 case VEC_UNPACK_FLOAT_LO_EXPR
:
2006 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2007 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2008 pp_string (buffer
, " > ");
2011 case VEC_PACK_TRUNC_EXPR
:
2012 pp_string (buffer
, " VEC_PACK_TRUNC_EXPR < ");
2013 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2014 pp_string (buffer
, ", ");
2015 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2016 pp_string (buffer
, " > ");
2019 case VEC_PACK_SAT_EXPR
:
2020 pp_string (buffer
, " VEC_PACK_SAT_EXPR < ");
2021 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2022 pp_string (buffer
, ", ");
2023 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2024 pp_string (buffer
, " > ");
2027 case VEC_PACK_FIX_TRUNC_EXPR
:
2028 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2029 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2030 pp_string (buffer
, ", ");
2031 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2032 pp_string (buffer
, " > ");
2038 pp_string (buffer
, "BLOCK");
2040 if (BLOCK_ABSTRACT (node
))
2041 pp_string (buffer
, " [abstract]");
2043 if (TREE_ASM_WRITTEN (node
))
2044 pp_string (buffer
, " [written]");
2046 newline_and_indent (buffer
, spc
+ 2);
2048 if (BLOCK_SUPERCONTEXT (node
))
2050 pp_string (buffer
, "SUPERCONTEXT: ");
2051 if (TREE_CODE (BLOCK_SUPERCONTEXT (node
)) == BLOCK
)
2052 pp_printf (buffer
, "BLOCK %p",
2053 (void *)BLOCK_SUPERCONTEXT (node
));
2055 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (node
), 0, flags
,
2057 newline_and_indent (buffer
, spc
+ 2);
2060 if (BLOCK_SUBBLOCKS (node
))
2062 pp_string (buffer
, "SUBBLOCKS: ");
2063 for (t
= BLOCK_SUBBLOCKS (node
); t
; t
= BLOCK_CHAIN (t
))
2064 pp_printf (buffer
, "%p ", (void *)t
);
2065 newline_and_indent (buffer
, spc
+ 2);
2068 if (BLOCK_VARS (node
))
2070 pp_string (buffer
, "VARS: ");
2071 for (t
= BLOCK_VARS (node
); t
; t
= TREE_CHAIN (t
))
2073 dump_generic_node (buffer
, t
, 0, flags
, false);
2074 pp_string (buffer
, " ");
2076 newline_and_indent (buffer
, spc
+ 2);
2079 if (BLOCK_ABSTRACT_ORIGIN (node
))
2081 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
2082 if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node
)) == BLOCK
)
2083 pp_printf (buffer
, "BLOCK %p",
2084 (void *)BLOCK_ABSTRACT_ORIGIN (node
));
2086 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (node
), 0, flags
,
2088 newline_and_indent (buffer
, spc
+ 2);
2093 case VEC_EXTRACT_EVEN_EXPR
:
2094 pp_string (buffer
, " VEC_EXTRACT_EVEN_EXPR < ");
2095 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2096 pp_string (buffer
, ", ");
2097 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2098 pp_string (buffer
, " > ");
2101 case VEC_EXTRACT_ODD_EXPR
:
2102 pp_string (buffer
, " VEC_EXTRACT_ODD_EXPR < ");
2103 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2104 pp_string (buffer
, ", ");
2105 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2106 pp_string (buffer
, " > ");
2109 case VEC_INTERLEAVE_HIGH_EXPR
:
2110 pp_string (buffer
, " VEC_INTERLEAVE_HIGH_EXPR < ");
2111 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2112 pp_string (buffer
, ", ");
2113 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2114 pp_string (buffer
, " > ");
2117 case VEC_INTERLEAVE_LOW_EXPR
:
2118 pp_string (buffer
, " VEC_INTERLEAVE_LOW_EXPR < ");
2119 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2120 pp_string (buffer
, ", ");
2121 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2122 pp_string (buffer
, " > ");
2129 if (is_stmt
&& is_expr
)
2130 pp_semicolon (buffer
);
2132 /* If we're building a diagnostic, the formatted text will be written
2133 into BUFFER's stream by the caller; otherwise, write it now. */
2134 if (!(flags
& TDF_DIAGNOSTIC
))
2135 pp_write_text_to_stream (buffer
);
2140 /* Print the declaration of a variable. */
2143 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2147 if (TREE_CODE (t
) == TYPE_DECL
)
2148 pp_string (buffer
, "typedef ");
2150 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2151 pp_string (buffer
, "register ");
2153 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2154 pp_string (buffer
, "extern ");
2155 else if (TREE_STATIC (t
))
2156 pp_string (buffer
, "static ");
2158 /* Print the type and name. */
2159 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2163 /* Print array's type. */
2164 tmp
= TREE_TYPE (t
);
2165 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2166 tmp
= TREE_TYPE (tmp
);
2167 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2169 /* Print variable's name. */
2171 dump_generic_node (buffer
, t
, spc
, flags
, false);
2173 /* Print the dimensions. */
2174 tmp
= TREE_TYPE (t
);
2175 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2177 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2178 tmp
= TREE_TYPE (tmp
);
2181 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2183 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2185 dump_decl_name (buffer
, t
, flags
);
2186 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2190 /* Print type declaration. */
2191 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2193 /* Print variable's name. */
2195 dump_generic_node (buffer
, t
, spc
, flags
, false);
2198 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2200 pp_string (buffer
, " __asm__ ");
2201 pp_character (buffer
, '(');
2202 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2203 pp_character (buffer
, ')');
2206 /* The initial value of a function serves to determine wether the function
2207 is declared or defined. So the following does not apply to function
2209 if (TREE_CODE (t
) != FUNCTION_DECL
)
2211 /* Print the initial value. */
2212 if (DECL_INITIAL (t
))
2215 pp_character (buffer
, '=');
2217 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2221 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2223 pp_string (buffer
, " [value-expr: ");
2224 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2225 pp_character (buffer
, ']');
2228 pp_character (buffer
, ';');
2232 /* Prints a structure: name, fields, and methods.
2233 FIXME: Still incomplete. */
2236 print_struct_decl (pretty_printer
*buffer
, tree node
, int spc
, int flags
)
2238 /* Print the name of the structure. */
2239 if (TYPE_NAME (node
))
2242 if (TREE_CODE (node
) == RECORD_TYPE
)
2243 pp_string (buffer
, "struct ");
2244 else if ((TREE_CODE (node
) == UNION_TYPE
2245 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
2246 pp_string (buffer
, "union ");
2248 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
2251 /* Print the contents of the structure. */
2252 pp_newline (buffer
);
2254 pp_character (buffer
, '{');
2255 pp_newline (buffer
);
2257 /* Print the fields of the structure. */
2260 tmp
= TYPE_FIELDS (node
);
2263 /* Avoid to print recursively the structure. */
2264 /* FIXME : Not implemented correctly...,
2265 what about the case when we have a cycle in the contain graph? ...
2266 Maybe this could be solved by looking at the scope in which the
2267 structure was declared. */
2268 if (TREE_TYPE (tmp
) != node
2269 || (TREE_CODE (TREE_TYPE (tmp
)) == POINTER_TYPE
2270 && TREE_TYPE (TREE_TYPE (tmp
)) != node
))
2272 print_declaration (buffer
, tmp
, spc
+2, flags
);
2273 pp_newline (buffer
);
2275 tmp
= TREE_CHAIN (tmp
);
2279 pp_character (buffer
, '}');
2282 /* Return the priority of the operator OP.
2284 From lowest to highest precedence with either left-to-right (L-R)
2285 or right-to-left (R-L) associativity]:
2288 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2300 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2301 15 [L-R] fn() [] -> .
2303 unary +, - and * have higher precedence than the corresponding binary
2307 op_prio (const_tree op
)
2312 switch (TREE_CODE (op
))
2320 case GIMPLE_MODIFY_STMT
:
2328 case TRUTH_ORIF_EXPR
:
2331 case TRUTH_AND_EXPR
:
2332 case TRUTH_ANDIF_EXPR
:
2339 case TRUTH_XOR_EXPR
:
2356 case UNORDERED_EXPR
:
2369 case WIDEN_SUM_EXPR
:
2371 case POINTER_PLUS_EXPR
:
2375 case VEC_WIDEN_MULT_HI_EXPR
:
2376 case VEC_WIDEN_MULT_LO_EXPR
:
2377 case WIDEN_MULT_EXPR
:
2380 case TRUNC_DIV_EXPR
:
2382 case FLOOR_DIV_EXPR
:
2383 case ROUND_DIV_EXPR
:
2385 case EXACT_DIV_EXPR
:
2386 case TRUNC_MOD_EXPR
:
2388 case FLOOR_MOD_EXPR
:
2389 case ROUND_MOD_EXPR
:
2392 case TRUTH_NOT_EXPR
:
2394 case POSTINCREMENT_EXPR
:
2395 case POSTDECREMENT_EXPR
:
2396 case PREINCREMENT_EXPR
:
2397 case PREDECREMENT_EXPR
:
2399 case ALIGN_INDIRECT_REF
:
2400 case MISALIGNED_INDIRECT_REF
:
2406 case FIX_TRUNC_EXPR
:
2412 case ARRAY_RANGE_REF
:
2416 /* Special expressions. */
2422 case REDUC_MAX_EXPR
:
2423 case REDUC_MIN_EXPR
:
2424 case REDUC_PLUS_EXPR
:
2425 case VEC_LSHIFT_EXPR
:
2426 case VEC_RSHIFT_EXPR
:
2427 case VEC_UNPACK_HI_EXPR
:
2428 case VEC_UNPACK_LO_EXPR
:
2429 case VEC_UNPACK_FLOAT_HI_EXPR
:
2430 case VEC_UNPACK_FLOAT_LO_EXPR
:
2431 case VEC_PACK_TRUNC_EXPR
:
2432 case VEC_PACK_SAT_EXPR
:
2436 case NON_LVALUE_EXPR
:
2437 return op_prio (TREE_OPERAND (op
, 0));
2440 /* Return an arbitrarily high precedence to avoid surrounding single
2441 VAR_DECLs in ()s. */
2447 /* Return the symbol associated with operator CODE. */
2450 op_symbol_code (enum tree_code code
)
2455 case GIMPLE_MODIFY_STMT
:
2459 case TRUTH_ORIF_EXPR
:
2462 case TRUTH_AND_EXPR
:
2463 case TRUTH_ANDIF_EXPR
:
2469 case TRUTH_XOR_EXPR
:
2479 case UNORDERED_EXPR
:
2525 case VEC_LSHIFT_EXPR
:
2528 case VEC_RSHIFT_EXPR
:
2531 case POINTER_PLUS_EXPR
:
2537 case REDUC_PLUS_EXPR
:
2540 case WIDEN_SUM_EXPR
:
2543 case WIDEN_MULT_EXPR
:
2553 case TRUTH_NOT_EXPR
:
2560 case ALIGN_INDIRECT_REF
:
2563 case MISALIGNED_INDIRECT_REF
:
2566 case TRUNC_DIV_EXPR
:
2573 case FLOOR_DIV_EXPR
:
2576 case ROUND_DIV_EXPR
:
2579 case EXACT_DIV_EXPR
:
2582 case TRUNC_MOD_EXPR
:
2588 case FLOOR_MOD_EXPR
:
2591 case ROUND_MOD_EXPR
:
2594 case PREDECREMENT_EXPR
:
2597 case PREINCREMENT_EXPR
:
2600 case POSTDECREMENT_EXPR
:
2603 case POSTINCREMENT_EXPR
:
2613 return "<<< ??? >>>";
2617 /* Return the symbol associated with operator OP. */
2622 return op_symbol_code (TREE_CODE (op
));
2625 /* Prints the name of a CALL_EXPR. */
2628 print_call_name (pretty_printer
*buffer
, tree node
)
2632 gcc_assert (TREE_CODE (node
) == CALL_EXPR
);
2634 op0
= CALL_EXPR_FN (node
);
2636 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
2637 op0
= TREE_OPERAND (op0
, 0);
2639 switch (TREE_CODE (op0
))
2643 dump_function_name (buffer
, op0
);
2649 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2653 pp_string (buffer
, "(");
2654 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2655 pp_string (buffer
, ") ? ");
2656 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, 0, false);
2657 pp_string (buffer
, " : ");
2658 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, 0, false);
2662 /* The function is a pointer contained in a structure. */
2663 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == INDIRECT_REF
||
2664 TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2665 dump_function_name (buffer
, TREE_OPERAND (op0
, 1));
2667 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2669 We can have several levels of structures and a function
2670 pointer inside. This is not implemented yet... */
2675 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2676 dump_function_name (buffer
, TREE_OPERAND (op0
, 0));
2678 dump_generic_node (buffer
, op0
, 0, 0, false);
2683 dump_generic_node (buffer
, op0
, 0, 0, false);
2691 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2694 pretty_print_string (pretty_printer
*buffer
, const char *str
)
2704 pp_string (buffer
, "\\b");
2708 pp_string (buffer
, "\\f");
2712 pp_string (buffer
, "\\n");
2716 pp_string (buffer
, "\\r");
2720 pp_string (buffer
, "\\t");
2724 pp_string (buffer
, "\\v");
2728 pp_string (buffer
, "\\\\");
2732 pp_string (buffer
, "\\\"");
2736 pp_string (buffer
, "\\'");
2739 /* No need to handle \0; the loop terminates on \0. */
2742 pp_string (buffer
, "\\1");
2746 pp_string (buffer
, "\\2");
2750 pp_string (buffer
, "\\3");
2754 pp_string (buffer
, "\\4");
2758 pp_string (buffer
, "\\5");
2762 pp_string (buffer
, "\\6");
2766 pp_string (buffer
, "\\7");
2770 pp_character (buffer
, str
[0]);
2778 maybe_init_pretty_print (FILE *file
)
2782 pp_construct (&buffer
, /* prefix */NULL
, /* line-width */0);
2783 pp_needs_newline (&buffer
) = true;
2787 buffer
.buffer
->stream
= file
;
2791 newline_and_indent (pretty_printer
*buffer
, int spc
)
2793 pp_newline (buffer
);
2799 dump_vops (pretty_printer
*buffer
, tree stmt
, int spc
, int flags
)
2801 struct voptype_d
*vdefs
;
2802 struct voptype_d
*vuses
;
2805 if (!ssa_operands_active () || !stmt_references_memory_p (stmt
))
2808 /* Even if the statement doesn't have virtual operators yet, it may
2809 contain symbol information (this happens before aliases have been
2811 if ((flags
& TDF_MEMSYMS
)
2812 && VUSE_OPS (stmt
) == NULL
2813 && VDEF_OPS (stmt
) == NULL
)
2815 if (LOADED_SYMS (stmt
))
2817 pp_string (buffer
, "# LOADS: ");
2818 dump_symbols (buffer
, LOADED_SYMS (stmt
), flags
);
2819 newline_and_indent (buffer
, spc
);
2822 if (STORED_SYMS (stmt
))
2824 pp_string (buffer
, "# STORES: ");
2825 dump_symbols (buffer
, STORED_SYMS (stmt
), flags
);
2826 newline_and_indent (buffer
, spc
);
2832 vuses
= VUSE_OPS (stmt
);
2835 pp_string (buffer
, "# VUSE <");
2837 n
= VUSE_NUM (vuses
);
2838 for (i
= 0; i
< n
; i
++)
2840 dump_generic_node (buffer
, VUSE_OP (vuses
, i
), spc
+ 2, flags
, false);
2842 pp_string (buffer
, ", ");
2845 pp_string (buffer
, ">");
2847 if (flags
& TDF_MEMSYMS
)
2848 dump_symbols (buffer
, LOADED_SYMS (stmt
), flags
);
2850 newline_and_indent (buffer
, spc
);
2851 vuses
= vuses
->next
;
2854 vdefs
= VDEF_OPS (stmt
);
2857 pp_string (buffer
, "# ");
2858 dump_generic_node (buffer
, VDEF_RESULT (vdefs
), spc
+ 2, flags
, false);
2859 pp_string (buffer
, " = VDEF <");
2861 n
= VDEF_NUM (vdefs
);
2862 for (i
= 0; i
< n
; i
++)
2864 dump_generic_node (buffer
, VDEF_OP (vdefs
, i
), spc
+ 2, flags
, 0);
2866 pp_string (buffer
, ", ");
2869 pp_string (buffer
, ">");
2871 if ((flags
& TDF_MEMSYMS
) && vdefs
->next
== NULL
)
2872 dump_symbols (buffer
, STORED_SYMS (stmt
), flags
);
2874 newline_and_indent (buffer
, spc
);
2875 vdefs
= vdefs
->next
;
2880 /* Dumps basic block BB to FILE with details described by FLAGS and
2881 indented by INDENT spaces. */
2884 dump_generic_bb (FILE *file
, basic_block bb
, int indent
, int flags
)
2886 maybe_init_pretty_print (file
);
2887 dump_generic_bb_buff (&buffer
, bb
, indent
, flags
);
2891 /* Dumps header of basic block BB to buffer BUFFER indented by INDENT
2892 spaces and details described by flags. */
2895 dump_bb_header (pretty_printer
*buffer
, basic_block bb
, int indent
, int flags
)
2901 if (flags
& TDF_BLOCKS
)
2904 pp_string (buffer
, "# BLOCK ");
2905 pp_decimal_int (buffer
, bb
->index
);
2908 pp_string (buffer
, " freq:");
2909 pp_decimal_int (buffer
, bb
->frequency
);
2913 pp_string (buffer
, " count:");
2914 pp_widest_integer (buffer
, bb
->count
);
2917 if (flags
& TDF_LINENO
)
2919 block_stmt_iterator bsi
;
2921 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
2922 if (get_lineno (bsi_stmt (bsi
)) != -1)
2924 pp_string (buffer
, ", starting at line ");
2925 pp_decimal_int (buffer
, get_lineno (bsi_stmt (bsi
)));
2929 newline_and_indent (buffer
, indent
);
2931 pp_string (buffer
, "# PRED:");
2932 pp_write_text_to_stream (buffer
);
2933 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
2934 if (flags
& TDF_SLIM
)
2936 pp_string (buffer
, " ");
2937 if (e
->src
== ENTRY_BLOCK_PTR
)
2938 pp_string (buffer
, "ENTRY");
2940 pp_decimal_int (buffer
, e
->src
->index
);
2943 dump_edge_info (buffer
->buffer
->stream
, e
, 0);
2944 pp_newline (buffer
);
2948 stmt
= first_stmt (bb
);
2949 if (!stmt
|| TREE_CODE (stmt
) != LABEL_EXPR
)
2951 INDENT (indent
- 2);
2952 pp_string (buffer
, "<bb ");
2953 pp_decimal_int (buffer
, bb
->index
);
2954 pp_string (buffer
, ">:");
2955 pp_newline (buffer
);
2958 pp_write_text_to_stream (buffer
);
2959 check_bb_profile (bb
, buffer
->buffer
->stream
);
2962 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
2966 dump_bb_end (pretty_printer
*buffer
, basic_block bb
, int indent
, int flags
)
2972 pp_string (buffer
, "# SUCC:");
2973 pp_write_text_to_stream (buffer
);
2974 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
2975 if (flags
& TDF_SLIM
)
2977 pp_string (buffer
, " ");
2978 if (e
->dest
== EXIT_BLOCK_PTR
)
2979 pp_string (buffer
, "EXIT");
2981 pp_decimal_int (buffer
, e
->dest
->index
);
2984 dump_edge_info (buffer
->buffer
->stream
, e
, 1);
2985 pp_newline (buffer
);
2988 /* Dump PHI nodes of basic block BB to BUFFER with details described
2989 by FLAGS and indented by INDENT spaces. */
2992 dump_phi_nodes (pretty_printer
*buffer
, basic_block bb
, int indent
, int flags
)
2994 tree phi
= phi_nodes (bb
);
2998 for (; phi
; phi
= PHI_CHAIN (phi
))
3000 if (is_gimple_reg (PHI_RESULT (phi
)) || (flags
& TDF_VOPS
))
3003 pp_string (buffer
, "# ");
3004 dump_generic_node (buffer
, phi
, indent
, flags
, false);
3005 pp_newline (buffer
);
3011 /* Dump jump to basic block BB that is represented implicitly in the cfg
3015 pp_cfg_jump (pretty_printer
*buffer
, basic_block bb
)
3019 stmt
= first_stmt (bb
);
3021 pp_string (buffer
, "goto <bb ");
3022 pp_decimal_int (buffer
, bb
->index
);
3023 pp_string (buffer
, ">");
3024 if (stmt
&& TREE_CODE (stmt
) == LABEL_EXPR
)
3026 pp_string (buffer
, " (");
3027 dump_generic_node (buffer
, LABEL_EXPR_LABEL (stmt
), 0, 0, false);
3028 pp_string (buffer
, ")");
3030 pp_semicolon (buffer
);
3033 /* Dump edges represented implicitly in basic block BB to BUFFER, indented
3034 by INDENT spaces, with details given by FLAGS. */
3037 dump_implicit_edges (pretty_printer
*buffer
, basic_block bb
, int indent
,
3044 stmt
= last_stmt (bb
);
3045 if (stmt
&& TREE_CODE (stmt
) == COND_EXPR
)
3047 edge true_edge
, false_edge
;
3049 /* When we are emitting the code or changing CFG, it is possible that
3050 the edges are not yet created. When we are using debug_bb in such
3051 a situation, we do not want it to crash. */
3052 if (EDGE_COUNT (bb
->succs
) != 2)
3054 extract_true_false_edges_from_block (bb
, &true_edge
, &false_edge
);
3056 INDENT (indent
+ 2);
3057 pp_cfg_jump (buffer
, true_edge
->dest
);
3058 newline_and_indent (buffer
, indent
);
3059 pp_string (buffer
, "else");
3060 newline_and_indent (buffer
, indent
+ 2);
3061 pp_cfg_jump (buffer
, false_edge
->dest
);
3062 pp_newline (buffer
);
3066 /* If there is a fallthru edge, we may need to add an artificial goto to the
3068 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
3069 if (e
->flags
& EDGE_FALLTHRU
)
3071 if (e
&& e
->dest
!= bb
->next_bb
)
3075 if ((flags
& TDF_LINENO
)
3076 #ifdef USE_MAPPED_LOCATION
3077 && e
->goto_locus
!= UNKNOWN_LOCATION
3083 expanded_location goto_xloc
;
3084 #ifdef USE_MAPPED_LOCATION
3085 goto_xloc
= expand_location (e
->goto_locus
);
3087 goto_xloc
= *e
->goto_locus
;
3089 pp_character (buffer
, '[');
3092 pp_string (buffer
, goto_xloc
.file
);
3093 pp_string (buffer
, " : ");
3095 pp_decimal_int (buffer
, goto_xloc
.line
);
3096 pp_string (buffer
, "] ");
3099 pp_cfg_jump (buffer
, e
->dest
);
3100 pp_newline (buffer
);
3104 /* Dumps basic block BB to buffer BUFFER with details described by FLAGS and
3105 indented by INDENT spaces. */
3108 dump_generic_bb_buff (pretty_printer
*buffer
, basic_block bb
,
3109 int indent
, int flags
)
3111 block_stmt_iterator bsi
;
3113 int label_indent
= indent
- 2;
3115 if (label_indent
< 0)
3118 dump_bb_header (buffer
, bb
, indent
, flags
);
3120 dump_phi_nodes (buffer
, bb
, indent
, flags
);
3122 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
3126 stmt
= bsi_stmt (bsi
);
3128 curr_indent
= TREE_CODE (stmt
) == LABEL_EXPR
? label_indent
: indent
;
3130 INDENT (curr_indent
);
3131 dump_generic_node (buffer
, stmt
, curr_indent
, flags
, true);
3132 pp_newline (buffer
);
3133 dump_histograms_for_stmt (cfun
, buffer
->buffer
->stream
, stmt
);
3136 dump_implicit_edges (buffer
, bb
, indent
, flags
);
3138 if (flags
& TDF_BLOCKS
)
3139 dump_bb_end (buffer
, bb
, indent
, flags
);