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 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"
36 #include "value-prof.h"
38 /* Local functions, macros and variables. */
39 static int op_prio (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");
88 debug_generic_expr (tree t
)
90 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
91 fprintf (stderr
, "\n");
95 debug_generic_stmt (tree t
)
97 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
98 fprintf (stderr
, "\n");
102 debug_tree_chain (tree t
)
106 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|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_code (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 set of decls SYMS. BUFFER, SPC and FLAGS are as in
406 dump_generic_node. */
409 dump_symbols (pretty_printer
*buffer
, bitmap syms
, int flags
)
415 pp_string (buffer
, "NIL");
418 pp_string (buffer
, " { ");
420 EXECUTE_IF_SET_IN_BITMAP (syms
, 0, i
, bi
)
422 tree sym
= referenced_var_lookup (i
);
423 dump_generic_node (buffer
, sym
, 0, flags
, false);
424 pp_string (buffer
, " ");
427 pp_string (buffer
, "}");
432 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of indent.
433 FLAGS specifies details to show in the dump (see TDF_* in tree-pass.h).
434 If IS_STMT is true, the object printed is considered to be a statement
435 and it is terminated by ';' if appropriate. */
438 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
446 if (node
== NULL_TREE
)
449 is_expr
= EXPR_P (node
) || GIMPLE_STMT_P (node
);
451 /* We use has_stmt_ann because CALL_EXPR can be both an expression
452 and a statement, and we have no guarantee that it will have a
453 stmt_ann when it is used as an RHS expression. stmt_ann will assert
454 if you call it on something with a non-stmt annotation attached. */
455 if (TREE_CODE (node
) != ERROR_MARK
456 && is_gimple_stmt (node
)
457 && (flags
& (TDF_VOPS
|TDF_MEMSYMS
))
458 && has_stmt_ann (node
)
459 && TREE_CODE (node
) != PHI_NODE
)
460 dump_vops (buffer
, node
, spc
, flags
);
462 if (is_stmt
&& (flags
& TDF_STMTADDR
))
463 pp_printf (buffer
, "<&%p> ", (void *)node
);
465 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
467 expanded_location xloc
= expand_location (EXPR_LOCATION (node
));
468 pp_character (buffer
, '[');
471 pp_string (buffer
, xloc
.file
);
472 pp_string (buffer
, " : ");
474 pp_decimal_int (buffer
, xloc
.line
);
475 pp_string (buffer
, "] ");
478 switch (TREE_CODE (node
))
481 pp_string (buffer
, "<<< error >>>");
484 case IDENTIFIER_NODE
:
485 pp_tree_identifier (buffer
, node
);
489 while (node
&& node
!= error_mark_node
)
491 if (TREE_PURPOSE (node
))
493 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
496 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
497 node
= TREE_CHAIN (node
);
498 if (node
&& TREE_CODE (node
) == TREE_LIST
)
500 pp_character (buffer
, ',');
507 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
512 if (TREE_VEC_LENGTH (node
) > 0)
514 size_t len
= TREE_VEC_LENGTH (node
);
515 for (i
= 0; i
< len
- 1; i
++)
517 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
519 pp_character (buffer
, ',');
522 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
536 unsigned int quals
= TYPE_QUALS (node
);
537 enum tree_code_class
class;
539 if (quals
& TYPE_QUAL_CONST
)
540 pp_string (buffer
, "const ");
541 else if (quals
& TYPE_QUAL_VOLATILE
)
542 pp_string (buffer
, "volatile ");
543 else if (quals
& TYPE_QUAL_RESTRICT
)
544 pp_string (buffer
, "restrict ");
546 class = TREE_CODE_CLASS (TREE_CODE (node
));
548 if (class == tcc_declaration
)
550 if (DECL_NAME (node
))
551 dump_decl_name (buffer
, node
, flags
);
553 pp_string (buffer
, "<unnamed type decl>");
555 else if (class == tcc_type
)
557 if (TYPE_NAME (node
))
559 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
560 pp_tree_identifier (buffer
, TYPE_NAME (node
));
561 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
562 && DECL_NAME (TYPE_NAME (node
)))
563 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
565 pp_string (buffer
, "<unnamed type>");
567 else if (TREE_CODE (node
) == VECTOR_TYPE
)
569 pp_string (buffer
, "vector ");
570 dump_generic_node (buffer
, TREE_TYPE (node
),
573 else if (TREE_CODE (node
) == INTEGER_TYPE
)
575 pp_string (buffer
, (TYPE_UNSIGNED (node
)
576 ? "<unnamed-unsigned:"
577 : "<unnamed-signed:"));
578 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
579 pp_string (buffer
, ">");
582 pp_string (buffer
, "<unnamed type>");
589 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
591 if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
593 tree fnode
= TREE_TYPE (node
);
595 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
597 pp_character (buffer
, '(');
598 pp_string (buffer
, str
);
599 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
600 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
602 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
604 pp_character (buffer
, ')');
605 dump_function_declaration (buffer
, fnode
, spc
, flags
);
609 unsigned int quals
= TYPE_QUALS (node
);
611 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
613 pp_string (buffer
, str
);
615 if (quals
& TYPE_QUAL_CONST
)
616 pp_string (buffer
, " const");
617 else if (quals
& TYPE_QUAL_VOLATILE
)
618 pp_string (buffer
, "volatile");
619 else if (quals
& TYPE_QUAL_RESTRICT
)
620 pp_string (buffer
, " restrict");
622 if (TYPE_REF_CAN_ALIAS_ALL (node
))
623 pp_string (buffer
, " {ref-all}");
632 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)), flags
);
633 pp_string (buffer
, "::");
638 const char *sep
= "";
641 pp_string (buffer
, "MEM[");
643 tmp
= TMR_SYMBOL (node
);
646 pp_string (buffer
, sep
);
648 pp_string (buffer
, "symbol: ");
649 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
651 tmp
= TMR_BASE (node
);
654 pp_string (buffer
, sep
);
656 pp_string (buffer
, "base: ");
657 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
659 tmp
= TMR_INDEX (node
);
662 pp_string (buffer
, sep
);
664 pp_string (buffer
, "index: ");
665 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
667 tmp
= TMR_STEP (node
);
670 pp_string (buffer
, sep
);
672 pp_string (buffer
, "step: ");
673 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
675 tmp
= TMR_OFFSET (node
);
678 pp_string (buffer
, sep
);
680 pp_string (buffer
, "offset: ");
681 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
683 pp_string (buffer
, "]");
684 if (flags
& TDF_DETAILS
)
686 pp_string (buffer
, "{");
687 dump_generic_node (buffer
, TMR_ORIGINAL (node
), spc
, flags
,
689 pp_string (buffer
, "}");
698 /* Print the innermost component type. */
699 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
700 tmp
= TREE_TYPE (tmp
))
702 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
704 /* Print the dimensions. */
705 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
706 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
712 case QUAL_UNION_TYPE
:
713 /* Print the name of the structure. */
714 if (TREE_CODE (node
) == RECORD_TYPE
)
715 pp_string (buffer
, "struct ");
716 else if (TREE_CODE (node
) == UNION_TYPE
)
717 pp_string (buffer
, "union ");
719 if (TYPE_NAME (node
))
720 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
722 print_struct_decl (buffer
, node
, spc
, flags
);
730 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
732 /* In the case of a pointer, one may want to divide by the
733 size of the pointed-to type. Unfortunately, this not
734 straightforward. The C front-end maps expressions
739 in such a way that the two INTEGER_CST nodes for "5" have
740 different values but identical types. In the latter
741 case, the 5 is multiplied by sizeof (int) in c-common.c
742 (pointer_int_sum) to convert it to a byte address, and
743 yet the type of the node is left unchanged. Argh. What
744 is consistent though is that the number value corresponds
745 to bytes (UNITS) offset.
747 NB: Neither of the following divisors can be trivially
748 used to recover the original literal:
750 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
751 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
752 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
753 pp_string (buffer
, "B"); /* pseudo-unit */
755 else if (! host_integerp (node
, 0))
758 unsigned HOST_WIDE_INT low
= TREE_INT_CST_LOW (val
);
759 HOST_WIDE_INT high
= TREE_INT_CST_HIGH (val
);
761 if (tree_int_cst_sgn (val
) < 0)
763 pp_character (buffer
, '-');
767 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
769 sprintf (pp_buffer (buffer
)->digit_buffer
,
770 HOST_WIDE_INT_PRINT_DOUBLE_HEX
, high
, low
);
771 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
774 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
778 /* Code copied from print_node. */
781 if (TREE_OVERFLOW (node
))
782 pp_string (buffer
, " overflow");
784 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
785 d
= TREE_REAL_CST (node
);
786 if (REAL_VALUE_ISINF (d
))
787 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
788 else if (REAL_VALUE_ISNAN (d
))
789 pp_string (buffer
, " Nan");
793 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
794 pp_string (buffer
, string
);
799 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
800 pp_string (buffer
, "0x");
801 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
802 output_formatted_integer (buffer
, "%02x", *p
++);
809 pp_string (buffer
, "__complex__ (");
810 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
811 pp_string (buffer
, ", ");
812 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
813 pp_string (buffer
, ")");
817 pp_string (buffer
, "\"");
818 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
819 pp_string (buffer
, "\"");
825 pp_string (buffer
, "{ ");
826 for (elt
= TREE_VECTOR_CST_ELTS (node
); elt
; elt
= TREE_CHAIN (elt
))
828 dump_generic_node (buffer
, TREE_VALUE (elt
), spc
, flags
, false);
829 if (TREE_CHAIN (elt
))
830 pp_string (buffer
, ", ");
832 pp_string (buffer
, " }");
841 dump_decl_name (buffer
, node
, flags
);
845 if (DECL_NAME (node
))
846 dump_decl_name (buffer
, node
, flags
);
847 else if (LABEL_DECL_UID (node
) != -1)
848 pp_printf (buffer
, "<L" HOST_WIDE_INT_PRINT_DEC
">",
849 LABEL_DECL_UID (node
));
851 pp_printf (buffer
, "<D%u>", DECL_UID (node
));
855 if (DECL_IS_BUILTIN (node
))
857 /* Don't print the declaration of built-in types. */
860 if (DECL_NAME (node
))
861 dump_decl_name (buffer
, node
, flags
);
864 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
865 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
866 && TYPE_METHODS (TREE_TYPE (node
)))
868 /* The type is a c++ class: all structures have at least
870 pp_string (buffer
, "class ");
871 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
876 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
877 ? "union" : "struct "));
878 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
883 case SYMBOL_MEMORY_TAG
:
884 case NAME_MEMORY_TAG
:
885 case STRUCT_FIELD_TAG
:
890 case MEMORY_PARTITION_TAG
:
891 dump_decl_name (buffer
, node
, flags
);
895 pp_string (buffer
, "<retval>");
899 op0
= TREE_OPERAND (node
, 0);
901 if (TREE_CODE (op0
) == INDIRECT_REF
)
903 op0
= TREE_OPERAND (op0
, 0);
906 if (op_prio (op0
) < op_prio (node
))
907 pp_character (buffer
, '(');
908 dump_generic_node (buffer
, op0
, spc
, flags
, false);
909 if (op_prio (op0
) < op_prio (node
))
910 pp_character (buffer
, ')');
911 pp_string (buffer
, str
);
912 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
914 if (TREE_CODE (op0
) != VALUE_HANDLE
)
916 op0
= component_ref_field_offset (node
);
917 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
919 pp_string (buffer
, "{off: ");
920 dump_generic_node (buffer
, op0
, spc
, flags
, false);
921 pp_character (buffer
, '}');
927 pp_string (buffer
, "BIT_FIELD_REF <");
928 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
929 pp_string (buffer
, ", ");
930 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
931 pp_string (buffer
, ", ");
932 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
933 pp_string (buffer
, ">");
937 case ARRAY_RANGE_REF
:
938 op0
= TREE_OPERAND (node
, 0);
939 if (op_prio (op0
) < op_prio (node
))
940 pp_character (buffer
, '(');
941 dump_generic_node (buffer
, op0
, spc
, flags
, false);
942 if (op_prio (op0
) < op_prio (node
))
943 pp_character (buffer
, ')');
944 pp_character (buffer
, '[');
945 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
946 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
947 pp_string (buffer
, " ...");
948 pp_character (buffer
, ']');
950 op0
= array_ref_low_bound (node
);
951 op1
= array_ref_element_size (node
);
953 if (!integer_zerop (op0
)
954 || TREE_OPERAND (node
, 2)
955 || TREE_OPERAND (node
, 3))
957 pp_string (buffer
, "{lb: ");
958 dump_generic_node (buffer
, op0
, spc
, flags
, false);
959 pp_string (buffer
, " sz: ");
960 dump_generic_node (buffer
, op1
, spc
, flags
, false);
961 pp_character (buffer
, '}');
967 unsigned HOST_WIDE_INT ix
;
969 bool is_struct_init
= FALSE
;
970 pp_character (buffer
, '{');
971 if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
972 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
973 is_struct_init
= TRUE
;
974 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
976 if (field
&& is_struct_init
)
978 pp_character (buffer
, '.');
979 dump_generic_node (buffer
, field
, spc
, flags
, false);
980 pp_string (buffer
, "=");
982 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
983 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
984 val
= TREE_OPERAND (val
, 0);
985 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
986 dump_decl_name (buffer
, val
, flags
);
988 dump_generic_node (buffer
, val
, spc
, flags
, false);
989 if (ix
!= VEC_length (constructor_elt
, CONSTRUCTOR_ELTS (node
)) - 1)
991 pp_character (buffer
, ',');
995 pp_character (buffer
, '}');
1002 if (flags
& TDF_SLIM
)
1004 pp_string (buffer
, "<COMPOUND_EXPR>");
1008 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1009 spc
, flags
, !(flags
& TDF_SLIM
));
1010 if (flags
& TDF_SLIM
)
1011 newline_and_indent (buffer
, spc
);
1014 pp_character (buffer
, ',');
1018 for (tp
= &TREE_OPERAND (node
, 1);
1019 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1020 tp
= &TREE_OPERAND (*tp
, 1))
1022 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1023 spc
, flags
, !(flags
& TDF_SLIM
));
1024 if (flags
& TDF_SLIM
)
1025 newline_and_indent (buffer
, spc
);
1028 pp_character (buffer
, ',');
1033 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1037 case STATEMENT_LIST
:
1039 tree_stmt_iterator si
;
1042 if (flags
& TDF_SLIM
)
1044 pp_string (buffer
, "<STATEMENT_LIST>");
1048 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1051 newline_and_indent (buffer
, spc
);
1054 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1060 case GIMPLE_MODIFY_STMT
:
1062 dump_generic_node (buffer
, GENERIC_TREE_OPERAND (node
, 0), spc
, flags
,
1065 pp_character (buffer
, '=');
1066 if (TREE_CODE (node
) == GIMPLE_MODIFY_STMT
1067 && MOVE_NONTEMPORAL (node
))
1068 pp_string (buffer
, "{nt}");
1070 dump_generic_node (buffer
, GENERIC_TREE_OPERAND (node
, 1), spc
, flags
,
1075 pp_string (buffer
, "TARGET_EXPR <");
1076 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1077 pp_character (buffer
, ',');
1079 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1080 pp_character (buffer
, '>');
1084 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1089 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1091 pp_string (buffer
, "if (");
1092 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1093 pp_character (buffer
, ')');
1094 /* The lowered cond_exprs should always be printed in full. */
1095 if (COND_EXPR_THEN (node
)
1096 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1097 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1098 && COND_EXPR_ELSE (node
)
1099 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1100 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1103 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1105 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1107 pp_string (buffer
, " else ");
1108 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1112 else if (!(flags
& TDF_SLIM
))
1114 /* Output COND_EXPR_THEN. */
1115 if (COND_EXPR_THEN (node
))
1117 newline_and_indent (buffer
, spc
+2);
1118 pp_character (buffer
, '{');
1119 newline_and_indent (buffer
, spc
+4);
1120 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1122 newline_and_indent (buffer
, spc
+2);
1123 pp_character (buffer
, '}');
1126 /* Output COND_EXPR_ELSE. */
1127 if (COND_EXPR_ELSE (node
)
1128 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1130 newline_and_indent (buffer
, spc
);
1131 pp_string (buffer
, "else");
1132 newline_and_indent (buffer
, spc
+2);
1133 pp_character (buffer
, '{');
1134 newline_and_indent (buffer
, spc
+4);
1135 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1137 newline_and_indent (buffer
, spc
+2);
1138 pp_character (buffer
, '}');
1145 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1147 pp_character (buffer
, '?');
1149 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1151 pp_character (buffer
, ':');
1153 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1158 pp_character (buffer
, '{');
1159 if (!(flags
& TDF_SLIM
))
1161 if (BIND_EXPR_VARS (node
))
1163 pp_newline (buffer
);
1165 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= TREE_CHAIN (op0
))
1167 print_declaration (buffer
, op0
, spc
+2, flags
);
1168 pp_newline (buffer
);
1172 newline_and_indent (buffer
, spc
+2);
1173 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1174 newline_and_indent (buffer
, spc
);
1175 pp_character (buffer
, '}');
1181 print_call_name (buffer
, node
);
1183 /* Print parameters. */
1185 pp_character (buffer
, '(');
1188 call_expr_arg_iterator iter
;
1189 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1191 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1192 if (more_call_expr_args_p (&iter
))
1194 pp_character (buffer
, ',');
1199 pp_character (buffer
, ')');
1201 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1204 pp_string (buffer
, " [static-chain: ");
1205 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1206 pp_character (buffer
, ']');
1209 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1210 pp_string (buffer
, " [return slot optimization]");
1211 if (CALL_EXPR_TAILCALL (node
))
1212 pp_string (buffer
, " [tail call]");
1215 case WITH_CLEANUP_EXPR
:
1219 case CLEANUP_POINT_EXPR
:
1220 pp_string (buffer
, "<<cleanup_point ");
1221 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1222 pp_string (buffer
, ">>");
1225 case PLACEHOLDER_EXPR
:
1226 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1227 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1228 pp_character (buffer
, '>');
1231 /* Binary arithmetic and logic expressions. */
1232 case WIDEN_SUM_EXPR
:
1233 case WIDEN_MULT_EXPR
:
1236 case POINTER_PLUS_EXPR
:
1238 case TRUNC_DIV_EXPR
:
1240 case FLOOR_DIV_EXPR
:
1241 case ROUND_DIV_EXPR
:
1242 case TRUNC_MOD_EXPR
:
1244 case FLOOR_MOD_EXPR
:
1245 case ROUND_MOD_EXPR
:
1247 case EXACT_DIV_EXPR
:
1252 case VEC_LSHIFT_EXPR
:
1253 case VEC_RSHIFT_EXPR
:
1257 case TRUTH_ANDIF_EXPR
:
1258 case TRUTH_ORIF_EXPR
:
1259 case TRUTH_AND_EXPR
:
1261 case TRUTH_XOR_EXPR
:
1275 case UNORDERED_EXPR
:
1277 const char *op
= op_symbol (node
);
1278 op0
= TREE_OPERAND (node
, 0);
1279 op1
= TREE_OPERAND (node
, 1);
1281 /* When the operands are expressions with less priority,
1282 keep semantics of the tree representation. */
1283 if (op_prio (op0
) <= op_prio (node
))
1285 pp_character (buffer
, '(');
1286 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1287 pp_character (buffer
, ')');
1290 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1293 pp_string (buffer
, op
);
1296 /* When the operands are expressions with less priority,
1297 keep semantics of the tree representation. */
1298 if (op_prio (op1
) <= op_prio (node
))
1300 pp_character (buffer
, '(');
1301 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1302 pp_character (buffer
, ')');
1305 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1309 /* Unary arithmetic and logic expressions. */
1312 case TRUTH_NOT_EXPR
:
1314 case PREDECREMENT_EXPR
:
1315 case PREINCREMENT_EXPR
:
1316 case ALIGN_INDIRECT_REF
:
1317 case MISALIGNED_INDIRECT_REF
:
1319 if (TREE_CODE (node
) == ADDR_EXPR
1320 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
1321 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
1322 ; /* Do not output '&' for strings and function pointers. */
1324 pp_string (buffer
, op_symbol (node
));
1326 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1328 pp_character (buffer
, '(');
1329 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1330 pp_character (buffer
, ')');
1333 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1335 if (TREE_CODE (node
) == MISALIGNED_INDIRECT_REF
)
1337 pp_string (buffer
, "{misalignment: ");
1338 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1339 pp_character (buffer
, '}');
1343 case POSTDECREMENT_EXPR
:
1344 case POSTINCREMENT_EXPR
:
1345 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1347 pp_character (buffer
, '(');
1348 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1349 pp_character (buffer
, ')');
1352 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1353 pp_string (buffer
, op_symbol (node
));
1357 pp_string (buffer
, "MIN_EXPR <");
1358 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1359 pp_string (buffer
, ", ");
1360 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1361 pp_character (buffer
, '>');
1365 pp_string (buffer
, "MAX_EXPR <");
1366 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1367 pp_string (buffer
, ", ");
1368 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1369 pp_character (buffer
, '>');
1373 pp_string (buffer
, "ABS_EXPR <");
1374 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1375 pp_character (buffer
, '>');
1382 case FIX_TRUNC_EXPR
:
1386 type
= TREE_TYPE (node
);
1387 op0
= TREE_OPERAND (node
, 0);
1388 if (type
!= TREE_TYPE (op0
))
1390 pp_character (buffer
, '(');
1391 dump_generic_node (buffer
, type
, spc
, flags
, false);
1392 pp_string (buffer
, ") ");
1394 if (op_prio (op0
) < op_prio (node
))
1395 pp_character (buffer
, '(');
1396 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1397 if (op_prio (op0
) < op_prio (node
))
1398 pp_character (buffer
, ')');
1401 case VIEW_CONVERT_EXPR
:
1402 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
1403 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1404 pp_string (buffer
, ">(");
1405 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1406 pp_character (buffer
, ')');
1409 case NON_LVALUE_EXPR
:
1410 pp_string (buffer
, "NON_LVALUE_EXPR <");
1411 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1412 pp_character (buffer
, '>');
1416 pp_string (buffer
, "SAVE_EXPR <");
1417 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1418 pp_character (buffer
, '>');
1422 pp_string (buffer
, "COMPLEX_EXPR <");
1423 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1424 pp_string (buffer
, ", ");
1425 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1426 pp_string (buffer
, ">");
1430 pp_string (buffer
, "CONJ_EXPR <");
1431 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1432 pp_string (buffer
, ">");
1436 pp_string (buffer
, "REALPART_EXPR <");
1437 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1438 pp_string (buffer
, ">");
1442 pp_string (buffer
, "IMAGPART_EXPR <");
1443 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1444 pp_string (buffer
, ">");
1448 pp_string (buffer
, "VA_ARG_EXPR <");
1449 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1450 pp_string (buffer
, ">");
1453 case TRY_FINALLY_EXPR
:
1454 case TRY_CATCH_EXPR
:
1455 pp_string (buffer
, "try");
1456 newline_and_indent (buffer
, spc
+2);
1457 pp_string (buffer
, "{");
1458 newline_and_indent (buffer
, spc
+4);
1459 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
1460 newline_and_indent (buffer
, spc
+2);
1461 pp_string (buffer
, "}");
1462 newline_and_indent (buffer
, spc
);
1464 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
1465 newline_and_indent (buffer
, spc
+2);
1466 pp_string (buffer
, "{");
1467 newline_and_indent (buffer
, spc
+4);
1468 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
1469 newline_and_indent (buffer
, spc
+2);
1470 pp_string (buffer
, "}");
1475 pp_string (buffer
, "catch (");
1476 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
1477 pp_string (buffer
, ")");
1478 newline_and_indent (buffer
, spc
+2);
1479 pp_string (buffer
, "{");
1480 newline_and_indent (buffer
, spc
+4);
1481 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
1482 newline_and_indent (buffer
, spc
+2);
1483 pp_string (buffer
, "}");
1487 case EH_FILTER_EXPR
:
1488 pp_string (buffer
, "<<<eh_filter (");
1489 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
1490 pp_string (buffer
, ")>>>");
1491 newline_and_indent (buffer
, spc
+2);
1492 pp_string (buffer
, "{");
1493 newline_and_indent (buffer
, spc
+4);
1494 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
1495 newline_and_indent (buffer
, spc
+2);
1496 pp_string (buffer
, "}");
1500 case CHANGE_DYNAMIC_TYPE_EXPR
:
1501 pp_string (buffer
, "<<<change_dynamic_type (");
1502 dump_generic_node (buffer
, CHANGE_DYNAMIC_TYPE_NEW_TYPE (node
), spc
+ 2,
1504 pp_string (buffer
, ") ");
1505 dump_generic_node (buffer
, CHANGE_DYNAMIC_TYPE_LOCATION (node
), spc
+ 2,
1507 pp_string (buffer
, ")>>>");
1512 op0
= TREE_OPERAND (node
, 0);
1513 /* If this is for break or continue, don't bother printing it. */
1514 if (DECL_NAME (op0
))
1516 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1517 if (strcmp (name
, "break") == 0
1518 || strcmp (name
, "continue") == 0)
1521 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1522 pp_character (buffer
, ':');
1523 if (DECL_NONLOCAL (op0
))
1524 pp_string (buffer
, " [non-local]");
1528 pp_string (buffer
, "<<<exception object>>>");
1532 pp_string (buffer
, "<<<filter object>>>");
1536 pp_string (buffer
, "while (1)");
1537 if (!(flags
& TDF_SLIM
))
1539 newline_and_indent (buffer
, spc
+2);
1540 pp_character (buffer
, '{');
1541 newline_and_indent (buffer
, spc
+4);
1542 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
1543 newline_and_indent (buffer
, spc
+2);
1544 pp_character (buffer
, '}');
1550 pp_string (buffer
, "return");
1551 op0
= TREE_OPERAND (node
, 0);
1555 if (TREE_CODE (op0
) == MODIFY_EXPR
1556 || TREE_CODE (op0
) == GIMPLE_MODIFY_STMT
)
1557 dump_generic_node (buffer
, GENERIC_TREE_OPERAND (op0
, 1),
1560 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1565 pp_string (buffer
, "if (");
1566 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1567 pp_string (buffer
, ") break");
1571 pp_string (buffer
, "switch (");
1572 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
1573 pp_character (buffer
, ')');
1574 if (!(flags
& TDF_SLIM
))
1576 newline_and_indent (buffer
, spc
+2);
1577 pp_character (buffer
, '{');
1578 if (SWITCH_BODY (node
))
1580 newline_and_indent (buffer
, spc
+4);
1581 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
1586 tree vec
= SWITCH_LABELS (node
);
1587 size_t i
, n
= TREE_VEC_LENGTH (vec
);
1588 for (i
= 0; i
< n
; ++i
)
1590 tree elt
= TREE_VEC_ELT (vec
, i
);
1591 newline_and_indent (buffer
, spc
+4);
1594 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
1595 pp_string (buffer
, " goto ");
1596 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
1598 pp_semicolon (buffer
);
1601 pp_string (buffer
, "case ???: goto ???;");
1604 newline_and_indent (buffer
, spc
+2);
1605 pp_character (buffer
, '}');
1611 op0
= GOTO_DESTINATION (node
);
1612 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
1614 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1615 if (strcmp (name
, "break") == 0
1616 || strcmp (name
, "continue") == 0)
1618 pp_string (buffer
, name
);
1622 pp_string (buffer
, "goto ");
1623 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1627 pp_string (buffer
, "resx ");
1628 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1632 pp_string (buffer
, "__asm__");
1633 if (ASM_VOLATILE_P (node
))
1634 pp_string (buffer
, " __volatile__");
1635 pp_character (buffer
, '(');
1636 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
1637 pp_character (buffer
, ':');
1638 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
1639 pp_character (buffer
, ':');
1640 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
1641 if (ASM_CLOBBERS (node
))
1643 pp_character (buffer
, ':');
1644 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
1646 pp_string (buffer
, ")");
1649 case CASE_LABEL_EXPR
:
1650 if (CASE_LOW (node
) && CASE_HIGH (node
))
1652 pp_string (buffer
, "case ");
1653 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1654 pp_string (buffer
, " ... ");
1655 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
1657 else if (CASE_LOW (node
))
1659 pp_string (buffer
, "case ");
1660 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1663 pp_string (buffer
, "default ");
1664 pp_character (buffer
, ':');
1668 pp_string (buffer
, "OBJ_TYPE_REF(");
1669 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
1670 pp_character (buffer
, ';');
1671 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
1672 pp_character (buffer
, '-');
1673 pp_character (buffer
, '>');
1674 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
1675 pp_character (buffer
, ')');
1682 dump_generic_node (buffer
, PHI_RESULT (node
), spc
, flags
, false);
1683 pp_string (buffer
, " = PHI <");
1684 for (i
= 0; i
< PHI_NUM_ARGS (node
); i
++)
1686 dump_generic_node (buffer
, PHI_ARG_DEF (node
, i
), spc
, flags
, false);
1687 pp_string (buffer
, "(");
1688 pp_decimal_int (buffer
, PHI_ARG_EDGE (node
, i
)->src
->index
);
1689 pp_string (buffer
, ")");
1690 if (i
< PHI_NUM_ARGS (node
) - 1)
1691 pp_string (buffer
, ", ");
1693 pp_string (buffer
, ">");
1695 if (stmt_references_memory_p (node
) && (flags
& TDF_MEMSYMS
))
1696 dump_symbols (buffer
, STORED_SYMS (node
), flags
);
1701 dump_generic_node (buffer
, SSA_NAME_VAR (node
), spc
, flags
, false);
1702 pp_string (buffer
, "_");
1703 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
1704 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
1705 pp_string (buffer
, "(ab)");
1706 else if (SSA_NAME_IS_DEFAULT_DEF (node
))
1707 pp_string (buffer
, "(D)");
1710 case WITH_SIZE_EXPR
:
1711 pp_string (buffer
, "WITH_SIZE_EXPR <");
1712 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1713 pp_string (buffer
, ", ");
1714 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1715 pp_string (buffer
, ">");
1719 pp_printf (buffer
, "VH.%d", VALUE_HANDLE_ID (node
));
1723 pp_string (buffer
, "ASSERT_EXPR <");
1724 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
1725 pp_string (buffer
, ", ");
1726 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
1727 pp_string (buffer
, ">");
1731 pp_string (buffer
, "scev_known");
1734 case SCEV_NOT_KNOWN
:
1735 pp_string (buffer
, "scev_not_known");
1738 case POLYNOMIAL_CHREC
:
1739 pp_string (buffer
, "{");
1740 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
1741 pp_string (buffer
, ", +, ");
1742 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
1743 pp_string (buffer
, "}_");
1744 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
1748 case REALIGN_LOAD_EXPR
:
1749 pp_string (buffer
, "REALIGN_LOAD <");
1750 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1751 pp_string (buffer
, ", ");
1752 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1753 pp_string (buffer
, ", ");
1754 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1755 pp_string (buffer
, ">");
1759 pp_string (buffer
, " VEC_COND_EXPR < ");
1760 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1761 pp_string (buffer
, " , ");
1762 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1763 pp_string (buffer
, " , ");
1764 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1765 pp_string (buffer
, " > ");
1769 pp_string (buffer
, " DOT_PROD_EXPR < ");
1770 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1771 pp_string (buffer
, ", ");
1772 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1773 pp_string (buffer
, ", ");
1774 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1775 pp_string (buffer
, " > ");
1779 pp_string (buffer
, "#pragma omp parallel");
1780 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
1781 if (OMP_PARALLEL_FN (node
))
1783 pp_string (buffer
, " [child fn: ");
1784 dump_generic_node (buffer
, OMP_PARALLEL_FN (node
), spc
, flags
, false);
1786 pp_string (buffer
, " (");
1788 if (OMP_PARALLEL_DATA_ARG (node
))
1789 dump_generic_node (buffer
, OMP_PARALLEL_DATA_ARG (node
), spc
, flags
,
1792 pp_string (buffer
, "???");
1794 pp_string (buffer
, ")]");
1798 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
1800 newline_and_indent (buffer
, spc
+ 2);
1801 pp_character (buffer
, '{');
1802 newline_and_indent (buffer
, spc
+ 4);
1803 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
1804 newline_and_indent (buffer
, spc
+ 2);
1805 pp_character (buffer
, '}');
1811 pp_string (buffer
, "#pragma omp for");
1812 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
1814 if (!(flags
& TDF_SLIM
))
1816 if (OMP_FOR_PRE_BODY (node
))
1818 newline_and_indent (buffer
, spc
+ 2);
1819 pp_character (buffer
, '{');
1821 newline_and_indent (buffer
, spc
);
1822 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
1825 newline_and_indent (buffer
, spc
);
1826 pp_string (buffer
, "for (");
1827 dump_generic_node (buffer
, OMP_FOR_INIT (node
), spc
, flags
, false);
1828 pp_string (buffer
, "; ");
1829 dump_generic_node (buffer
, OMP_FOR_COND (node
), spc
, flags
, false);
1830 pp_string (buffer
, "; ");
1831 dump_generic_node (buffer
, OMP_FOR_INCR (node
), spc
, flags
, false);
1832 pp_string (buffer
, ")");
1833 if (OMP_FOR_BODY (node
))
1835 newline_and_indent (buffer
, spc
+ 2);
1836 pp_character (buffer
, '{');
1837 newline_and_indent (buffer
, spc
+ 4);
1838 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
1840 newline_and_indent (buffer
, spc
+ 2);
1841 pp_character (buffer
, '}');
1843 if (OMP_FOR_PRE_BODY (node
))
1846 newline_and_indent (buffer
, spc
+ 2);
1847 pp_character (buffer
, '}');
1854 pp_string (buffer
, "#pragma omp sections");
1855 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
1859 pp_string (buffer
, "#pragma omp section");
1863 pp_string (buffer
, "#pragma omp master");
1867 pp_string (buffer
, "#pragma omp ordered");
1871 pp_string (buffer
, "#pragma omp critical");
1872 if (OMP_CRITICAL_NAME (node
))
1875 pp_character (buffer
, '(');
1876 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
1878 pp_character (buffer
, ')');
1883 pp_string (buffer
, "#pragma omp atomic");
1884 newline_and_indent (buffer
, spc
+ 2);
1885 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1887 pp_character (buffer
, '=');
1889 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1893 pp_string (buffer
, "#pragma omp single");
1894 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
1898 pp_string (buffer
, "OMP_RETURN");
1899 if (OMP_RETURN_NOWAIT (node
))
1900 pp_string (buffer
, " [nowait]");
1905 pp_string (buffer
, "OMP_CONTINUE");
1910 dump_omp_clause (buffer
, node
, spc
, flags
);
1914 case REDUC_MAX_EXPR
:
1915 pp_string (buffer
, " REDUC_MAX_EXPR < ");
1916 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1917 pp_string (buffer
, " > ");
1920 case REDUC_MIN_EXPR
:
1921 pp_string (buffer
, " REDUC_MIN_EXPR < ");
1922 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1923 pp_string (buffer
, " > ");
1926 case REDUC_PLUS_EXPR
:
1927 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
1928 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1929 pp_string (buffer
, " > ");
1932 case VEC_WIDEN_MULT_HI_EXPR
:
1933 pp_string (buffer
, " VEC_WIDEN_MULT_HI_EXPR < ");
1934 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1935 pp_string (buffer
, ", ");
1936 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1937 pp_string (buffer
, " > ");
1940 case VEC_WIDEN_MULT_LO_EXPR
:
1941 pp_string (buffer
, " VEC_WIDEN_MULT_LO_EXPR < ");
1942 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1943 pp_string (buffer
, ", ");
1944 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1945 pp_string (buffer
, " > ");
1948 case VEC_UNPACK_HI_EXPR
:
1949 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
1950 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1951 pp_string (buffer
, " > ");
1954 case VEC_UNPACK_LO_EXPR
:
1955 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
1956 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1957 pp_string (buffer
, " > ");
1960 case VEC_UNPACK_FLOAT_HI_EXPR
:
1961 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
1962 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1963 pp_string (buffer
, " > ");
1966 case VEC_UNPACK_FLOAT_LO_EXPR
:
1967 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
1968 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1969 pp_string (buffer
, " > ");
1972 case VEC_PACK_TRUNC_EXPR
:
1973 pp_string (buffer
, " VEC_PACK_TRUNC_EXPR < ");
1974 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1975 pp_string (buffer
, ", ");
1976 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1977 pp_string (buffer
, " > ");
1980 case VEC_PACK_SAT_EXPR
:
1981 pp_string (buffer
, " VEC_PACK_SAT_EXPR < ");
1982 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1983 pp_string (buffer
, ", ");
1984 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1985 pp_string (buffer
, " > ");
1988 case VEC_PACK_FIX_TRUNC_EXPR
:
1989 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
1990 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1991 pp_string (buffer
, ", ");
1992 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1993 pp_string (buffer
, " > ");
1999 pp_string (buffer
, "BLOCK");
2001 if (BLOCK_ABSTRACT (node
))
2002 pp_string (buffer
, " [abstract]");
2004 if (TREE_ASM_WRITTEN (node
))
2005 pp_string (buffer
, " [written]");
2007 newline_and_indent (buffer
, spc
+ 2);
2009 if (BLOCK_SUPERCONTEXT (node
))
2011 pp_string (buffer
, "SUPERCONTEXT: ");
2012 if (TREE_CODE (BLOCK_SUPERCONTEXT (node
)) == BLOCK
)
2013 pp_printf (buffer
, "BLOCK %p",
2014 (void *)BLOCK_SUPERCONTEXT (node
));
2016 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (node
), 0, flags
,
2018 newline_and_indent (buffer
, spc
+ 2);
2021 if (BLOCK_SUBBLOCKS (node
))
2023 pp_string (buffer
, "SUBBLOCKS: ");
2024 for (t
= BLOCK_SUBBLOCKS (node
); t
; t
= BLOCK_CHAIN (t
))
2025 pp_printf (buffer
, "%p ", (void *)t
);
2026 newline_and_indent (buffer
, spc
+ 2);
2029 if (BLOCK_VARS (node
))
2031 pp_string (buffer
, "VARS: ");
2032 for (t
= BLOCK_VARS (node
); t
; t
= TREE_CHAIN (t
))
2034 dump_generic_node (buffer
, t
, 0, flags
, false);
2035 pp_string (buffer
, " ");
2037 newline_and_indent (buffer
, spc
+ 2);
2040 if (BLOCK_ABSTRACT_ORIGIN (node
))
2042 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
2043 if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node
)) == BLOCK
)
2044 pp_printf (buffer
, "BLOCK %p",
2045 (void *)BLOCK_ABSTRACT_ORIGIN (node
));
2047 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (node
), 0, flags
,
2049 newline_and_indent (buffer
, spc
+ 2);
2054 case VEC_EXTRACT_EVEN_EXPR
:
2055 pp_string (buffer
, " VEC_EXTRACT_EVEN_EXPR < ");
2056 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2057 pp_string (buffer
, ", ");
2058 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2059 pp_string (buffer
, " > ");
2062 case VEC_EXTRACT_ODD_EXPR
:
2063 pp_string (buffer
, " VEC_EXTRACT_ODD_EXPR < ");
2064 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2065 pp_string (buffer
, ", ");
2066 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2067 pp_string (buffer
, " > ");
2070 case VEC_INTERLEAVE_HIGH_EXPR
:
2071 pp_string (buffer
, " VEC_INTERLEAVE_HIGH_EXPR < ");
2072 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2073 pp_string (buffer
, ", ");
2074 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2075 pp_string (buffer
, " > ");
2078 case VEC_INTERLEAVE_LOW_EXPR
:
2079 pp_string (buffer
, " VEC_INTERLEAVE_LOW_EXPR < ");
2080 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2081 pp_string (buffer
, ", ");
2082 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2083 pp_string (buffer
, " > ");
2090 if (is_stmt
&& is_expr
)
2091 pp_semicolon (buffer
);
2093 /* If we're building a diagnostic, the formatted text will be written
2094 into BUFFER's stream by the caller; otherwise, write it now. */
2095 if (!(flags
& TDF_DIAGNOSTIC
))
2096 pp_write_text_to_stream (buffer
);
2101 /* Print the declaration of a variable. */
2104 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2108 if (TREE_CODE (t
) == TYPE_DECL
)
2109 pp_string (buffer
, "typedef ");
2111 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2112 pp_string (buffer
, "register ");
2114 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2115 pp_string (buffer
, "extern ");
2116 else if (TREE_STATIC (t
))
2117 pp_string (buffer
, "static ");
2119 /* Print the type and name. */
2120 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2124 /* Print array's type. */
2125 tmp
= TREE_TYPE (t
);
2126 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2127 tmp
= TREE_TYPE (tmp
);
2128 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2130 /* Print variable's name. */
2132 dump_generic_node (buffer
, t
, spc
, flags
, false);
2134 /* Print the dimensions. */
2135 tmp
= TREE_TYPE (t
);
2136 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2138 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2139 tmp
= TREE_TYPE (tmp
);
2142 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2144 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2146 dump_decl_name (buffer
, t
, flags
);
2147 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2151 /* Print type declaration. */
2152 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2154 /* Print variable's name. */
2156 dump_generic_node (buffer
, t
, spc
, flags
, false);
2159 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2161 pp_string (buffer
, " __asm__ ");
2162 pp_character (buffer
, '(');
2163 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2164 pp_character (buffer
, ')');
2167 /* The initial value of a function serves to determine wether the function
2168 is declared or defined. So the following does not apply to function
2170 if (TREE_CODE (t
) != FUNCTION_DECL
)
2172 /* Print the initial value. */
2173 if (DECL_INITIAL (t
))
2176 pp_character (buffer
, '=');
2178 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2182 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2184 pp_string (buffer
, " [value-expr: ");
2185 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2186 pp_character (buffer
, ']');
2189 pp_character (buffer
, ';');
2193 /* Prints a structure: name, fields, and methods.
2194 FIXME: Still incomplete. */
2197 print_struct_decl (pretty_printer
*buffer
, tree node
, int spc
, int flags
)
2199 /* Print the name of the structure. */
2200 if (TYPE_NAME (node
))
2203 if (TREE_CODE (node
) == RECORD_TYPE
)
2204 pp_string (buffer
, "struct ");
2205 else if ((TREE_CODE (node
) == UNION_TYPE
2206 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
2207 pp_string (buffer
, "union ");
2209 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
2212 /* Print the contents of the structure. */
2213 pp_newline (buffer
);
2215 pp_character (buffer
, '{');
2216 pp_newline (buffer
);
2218 /* Print the fields of the structure. */
2221 tmp
= TYPE_FIELDS (node
);
2224 /* Avoid to print recursively the structure. */
2225 /* FIXME : Not implemented correctly...,
2226 what about the case when we have a cycle in the contain graph? ...
2227 Maybe this could be solved by looking at the scope in which the
2228 structure was declared. */
2229 if (TREE_TYPE (tmp
) != node
2230 || (TREE_CODE (TREE_TYPE (tmp
)) == POINTER_TYPE
2231 && TREE_TYPE (TREE_TYPE (tmp
)) != node
))
2233 print_declaration (buffer
, tmp
, spc
+2, flags
);
2234 pp_newline (buffer
);
2236 tmp
= TREE_CHAIN (tmp
);
2240 pp_character (buffer
, '}');
2243 /* Return the priority of the operator OP.
2245 From lowest to highest precedence with either left-to-right (L-R)
2246 or right-to-left (R-L) associativity]:
2249 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2261 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2262 15 [L-R] fn() [] -> .
2264 unary +, - and * have higher precedence than the corresponding binary
2273 switch (TREE_CODE (op
))
2281 case GIMPLE_MODIFY_STMT
:
2289 case TRUTH_ORIF_EXPR
:
2292 case TRUTH_AND_EXPR
:
2293 case TRUTH_ANDIF_EXPR
:
2300 case TRUTH_XOR_EXPR
:
2317 case UNORDERED_EXPR
:
2330 case WIDEN_SUM_EXPR
:
2332 case POINTER_PLUS_EXPR
:
2336 case VEC_WIDEN_MULT_HI_EXPR
:
2337 case VEC_WIDEN_MULT_LO_EXPR
:
2338 case WIDEN_MULT_EXPR
:
2341 case TRUNC_DIV_EXPR
:
2343 case FLOOR_DIV_EXPR
:
2344 case ROUND_DIV_EXPR
:
2346 case EXACT_DIV_EXPR
:
2347 case TRUNC_MOD_EXPR
:
2349 case FLOOR_MOD_EXPR
:
2350 case ROUND_MOD_EXPR
:
2353 case TRUTH_NOT_EXPR
:
2355 case POSTINCREMENT_EXPR
:
2356 case POSTDECREMENT_EXPR
:
2357 case PREINCREMENT_EXPR
:
2358 case PREDECREMENT_EXPR
:
2360 case ALIGN_INDIRECT_REF
:
2361 case MISALIGNED_INDIRECT_REF
:
2367 case FIX_TRUNC_EXPR
:
2373 case ARRAY_RANGE_REF
:
2377 /* Special expressions. */
2383 case REDUC_MAX_EXPR
:
2384 case REDUC_MIN_EXPR
:
2385 case REDUC_PLUS_EXPR
:
2386 case VEC_LSHIFT_EXPR
:
2387 case VEC_RSHIFT_EXPR
:
2388 case VEC_UNPACK_HI_EXPR
:
2389 case VEC_UNPACK_LO_EXPR
:
2390 case VEC_UNPACK_FLOAT_HI_EXPR
:
2391 case VEC_UNPACK_FLOAT_LO_EXPR
:
2392 case VEC_PACK_TRUNC_EXPR
:
2393 case VEC_PACK_SAT_EXPR
:
2397 case NON_LVALUE_EXPR
:
2398 return op_prio (TREE_OPERAND (op
, 0));
2401 /* Return an arbitrarily high precedence to avoid surrounding single
2402 VAR_DECLs in ()s. */
2408 /* Return the symbol associated with operator CODE. */
2411 op_symbol_code (enum tree_code code
)
2416 case GIMPLE_MODIFY_STMT
:
2420 case TRUTH_ORIF_EXPR
:
2423 case TRUTH_AND_EXPR
:
2424 case TRUTH_ANDIF_EXPR
:
2430 case TRUTH_XOR_EXPR
:
2440 case UNORDERED_EXPR
:
2486 case VEC_LSHIFT_EXPR
:
2489 case VEC_RSHIFT_EXPR
:
2492 case POINTER_PLUS_EXPR
:
2498 case REDUC_PLUS_EXPR
:
2501 case WIDEN_SUM_EXPR
:
2504 case WIDEN_MULT_EXPR
:
2514 case TRUTH_NOT_EXPR
:
2521 case ALIGN_INDIRECT_REF
:
2524 case MISALIGNED_INDIRECT_REF
:
2527 case TRUNC_DIV_EXPR
:
2534 case FLOOR_DIV_EXPR
:
2537 case ROUND_DIV_EXPR
:
2540 case EXACT_DIV_EXPR
:
2543 case TRUNC_MOD_EXPR
:
2549 case FLOOR_MOD_EXPR
:
2552 case ROUND_MOD_EXPR
:
2555 case PREDECREMENT_EXPR
:
2558 case PREINCREMENT_EXPR
:
2561 case POSTDECREMENT_EXPR
:
2564 case POSTINCREMENT_EXPR
:
2574 return "<<< ??? >>>";
2578 /* Return the symbol associated with operator OP. */
2583 return op_symbol_code (TREE_CODE (op
));
2586 /* Prints the name of a CALL_EXPR. */
2589 print_call_name (pretty_printer
*buffer
, tree node
)
2593 gcc_assert (TREE_CODE (node
) == CALL_EXPR
);
2595 op0
= CALL_EXPR_FN (node
);
2597 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
2598 op0
= TREE_OPERAND (op0
, 0);
2600 switch (TREE_CODE (op0
))
2604 dump_function_name (buffer
, op0
);
2610 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2614 pp_string (buffer
, "(");
2615 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2616 pp_string (buffer
, ") ? ");
2617 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, 0, false);
2618 pp_string (buffer
, " : ");
2619 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, 0, false);
2623 /* The function is a pointer contained in a structure. */
2624 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == INDIRECT_REF
||
2625 TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2626 dump_function_name (buffer
, TREE_OPERAND (op0
, 1));
2628 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2630 We can have several levels of structures and a function
2631 pointer inside. This is not implemented yet... */
2636 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2637 dump_function_name (buffer
, TREE_OPERAND (op0
, 0));
2639 dump_generic_node (buffer
, op0
, 0, 0, false);
2644 dump_generic_node (buffer
, op0
, 0, 0, false);
2652 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2655 pretty_print_string (pretty_printer
*buffer
, const char *str
)
2665 pp_string (buffer
, "\\b");
2669 pp_string (buffer
, "\\f");
2673 pp_string (buffer
, "\\n");
2677 pp_string (buffer
, "\\r");
2681 pp_string (buffer
, "\\t");
2685 pp_string (buffer
, "\\v");
2689 pp_string (buffer
, "\\\\");
2693 pp_string (buffer
, "\\\"");
2697 pp_string (buffer
, "\\'");
2700 /* No need to handle \0; the loop terminates on \0. */
2703 pp_string (buffer
, "\\1");
2707 pp_string (buffer
, "\\2");
2711 pp_string (buffer
, "\\3");
2715 pp_string (buffer
, "\\4");
2719 pp_string (buffer
, "\\5");
2723 pp_string (buffer
, "\\6");
2727 pp_string (buffer
, "\\7");
2731 pp_character (buffer
, str
[0]);
2739 maybe_init_pretty_print (FILE *file
)
2743 pp_construct (&buffer
, /* prefix */NULL
, /* line-width */0);
2744 pp_needs_newline (&buffer
) = true;
2748 buffer
.buffer
->stream
= file
;
2752 newline_and_indent (pretty_printer
*buffer
, int spc
)
2754 pp_newline (buffer
);
2760 dump_vops (pretty_printer
*buffer
, tree stmt
, int spc
, int flags
)
2762 struct voptype_d
*vdefs
;
2763 struct voptype_d
*vuses
;
2766 if (!ssa_operands_active () || !stmt_references_memory_p (stmt
))
2769 /* Even if the statement doesn't have virtual operators yet, it may
2770 contain symbol information (this happens before aliases have been
2772 if ((flags
& TDF_MEMSYMS
)
2773 && VUSE_OPS (stmt
) == NULL
2774 && VDEF_OPS (stmt
) == NULL
)
2776 if (LOADED_SYMS (stmt
))
2778 pp_string (buffer
, "# LOADS: ");
2779 dump_symbols (buffer
, LOADED_SYMS (stmt
), flags
);
2780 newline_and_indent (buffer
, spc
);
2783 if (STORED_SYMS (stmt
))
2785 pp_string (buffer
, "# STORES: ");
2786 dump_symbols (buffer
, STORED_SYMS (stmt
), flags
);
2787 newline_and_indent (buffer
, spc
);
2793 vuses
= VUSE_OPS (stmt
);
2796 pp_string (buffer
, "# VUSE <");
2798 n
= VUSE_NUM (vuses
);
2799 for (i
= 0; i
< n
; i
++)
2801 dump_generic_node (buffer
, VUSE_OP (vuses
, i
), spc
+ 2, flags
, false);
2803 pp_string (buffer
, ", ");
2806 pp_string (buffer
, ">");
2808 if (flags
& TDF_MEMSYMS
)
2809 dump_symbols (buffer
, LOADED_SYMS (stmt
), flags
);
2811 newline_and_indent (buffer
, spc
);
2812 vuses
= vuses
->next
;
2815 vdefs
= VDEF_OPS (stmt
);
2818 pp_string (buffer
, "# ");
2819 dump_generic_node (buffer
, VDEF_RESULT (vdefs
), spc
+ 2, flags
, false);
2820 pp_string (buffer
, " = VDEF <");
2822 n
= VDEF_NUM (vdefs
);
2823 for (i
= 0; i
< n
; i
++)
2825 dump_generic_node (buffer
, VDEF_OP (vdefs
, i
), spc
+ 2, flags
, 0);
2827 pp_string (buffer
, ", ");
2830 pp_string (buffer
, ">");
2832 if ((flags
& TDF_MEMSYMS
) && vdefs
->next
== NULL
)
2833 dump_symbols (buffer
, STORED_SYMS (stmt
), flags
);
2835 newline_and_indent (buffer
, spc
);
2836 vdefs
= vdefs
->next
;
2841 /* Dumps basic block BB to FILE with details described by FLAGS and
2842 indented by INDENT spaces. */
2845 dump_generic_bb (FILE *file
, basic_block bb
, int indent
, int flags
)
2847 maybe_init_pretty_print (file
);
2848 dump_generic_bb_buff (&buffer
, bb
, indent
, flags
);
2852 /* Dumps header of basic block BB to buffer BUFFER indented by INDENT
2853 spaces and details described by flags. */
2856 dump_bb_header (pretty_printer
*buffer
, basic_block bb
, int indent
, int flags
)
2862 if (flags
& TDF_BLOCKS
)
2865 pp_string (buffer
, "# BLOCK ");
2866 pp_decimal_int (buffer
, bb
->index
);
2869 pp_string (buffer
, " freq:");
2870 pp_decimal_int (buffer
, bb
->frequency
);
2874 pp_string (buffer
, " count:");
2875 pp_widest_integer (buffer
, bb
->count
);
2878 if (flags
& TDF_LINENO
)
2880 block_stmt_iterator bsi
;
2882 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
2883 if (get_lineno (bsi_stmt (bsi
)) != -1)
2885 pp_string (buffer
, ", starting at line ");
2886 pp_decimal_int (buffer
, get_lineno (bsi_stmt (bsi
)));
2890 newline_and_indent (buffer
, indent
);
2892 pp_string (buffer
, "# PRED:");
2893 pp_write_text_to_stream (buffer
);
2894 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
2895 if (flags
& TDF_SLIM
)
2897 pp_string (buffer
, " ");
2898 if (e
->src
== ENTRY_BLOCK_PTR
)
2899 pp_string (buffer
, "ENTRY");
2901 pp_decimal_int (buffer
, e
->src
->index
);
2904 dump_edge_info (buffer
->buffer
->stream
, e
, 0);
2905 pp_newline (buffer
);
2909 stmt
= first_stmt (bb
);
2910 if (!stmt
|| TREE_CODE (stmt
) != LABEL_EXPR
)
2912 INDENT (indent
- 2);
2913 pp_string (buffer
, "<bb ");
2914 pp_decimal_int (buffer
, bb
->index
);
2915 pp_string (buffer
, ">:");
2916 pp_newline (buffer
);
2919 pp_write_text_to_stream (buffer
);
2920 check_bb_profile (bb
, buffer
->buffer
->stream
);
2923 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
2927 dump_bb_end (pretty_printer
*buffer
, basic_block bb
, int indent
, int flags
)
2933 pp_string (buffer
, "# SUCC:");
2934 pp_write_text_to_stream (buffer
);
2935 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
2936 if (flags
& TDF_SLIM
)
2938 pp_string (buffer
, " ");
2939 if (e
->dest
== EXIT_BLOCK_PTR
)
2940 pp_string (buffer
, "EXIT");
2942 pp_decimal_int (buffer
, e
->dest
->index
);
2945 dump_edge_info (buffer
->buffer
->stream
, e
, 1);
2946 pp_newline (buffer
);
2949 /* Dump PHI nodes of basic block BB to BUFFER with details described
2950 by FLAGS and indented by INDENT spaces. */
2953 dump_phi_nodes (pretty_printer
*buffer
, basic_block bb
, int indent
, int flags
)
2955 tree phi
= phi_nodes (bb
);
2959 for (; phi
; phi
= PHI_CHAIN (phi
))
2961 if (is_gimple_reg (PHI_RESULT (phi
)) || (flags
& TDF_VOPS
))
2964 pp_string (buffer
, "# ");
2965 dump_generic_node (buffer
, phi
, indent
, flags
, false);
2966 pp_newline (buffer
);
2972 /* Dump jump to basic block BB that is represented implicitly in the cfg
2976 pp_cfg_jump (pretty_printer
*buffer
, basic_block bb
)
2980 stmt
= first_stmt (bb
);
2982 pp_string (buffer
, "goto <bb ");
2983 pp_decimal_int (buffer
, bb
->index
);
2984 pp_string (buffer
, ">");
2985 if (stmt
&& TREE_CODE (stmt
) == LABEL_EXPR
)
2987 pp_string (buffer
, " (");
2988 dump_generic_node (buffer
, LABEL_EXPR_LABEL (stmt
), 0, 0, false);
2989 pp_string (buffer
, ")");
2991 pp_semicolon (buffer
);
2994 /* Dump edges represented implicitly in basic block BB to BUFFER, indented
2995 by INDENT spaces, with details given by FLAGS. */
2998 dump_implicit_edges (pretty_printer
*buffer
, basic_block bb
, int indent
,
3005 stmt
= last_stmt (bb
);
3006 if (stmt
&& TREE_CODE (stmt
) == COND_EXPR
)
3008 edge true_edge
, false_edge
;
3010 /* When we are emitting the code or changing CFG, it is possible that
3011 the edges are not yet created. When we are using debug_bb in such
3012 a situation, we do not want it to crash. */
3013 if (EDGE_COUNT (bb
->succs
) != 2)
3015 extract_true_false_edges_from_block (bb
, &true_edge
, &false_edge
);
3017 INDENT (indent
+ 2);
3018 pp_cfg_jump (buffer
, true_edge
->dest
);
3019 newline_and_indent (buffer
, indent
);
3020 pp_string (buffer
, "else");
3021 newline_and_indent (buffer
, indent
+ 2);
3022 pp_cfg_jump (buffer
, false_edge
->dest
);
3023 pp_newline (buffer
);
3027 /* If there is a fallthru edge, we may need to add an artificial goto to the
3029 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
3030 if (e
->flags
& EDGE_FALLTHRU
)
3032 if (e
&& e
->dest
!= bb
->next_bb
)
3036 if ((flags
& TDF_LINENO
)
3037 #ifdef USE_MAPPED_LOCATION
3038 && e
->goto_locus
!= UNKNOWN_LOCATION
3044 expanded_location goto_xloc
;
3045 #ifdef USE_MAPPED_LOCATION
3046 goto_xloc
= expand_location (e
->goto_locus
);
3048 goto_xloc
= *e
->goto_locus
;
3050 pp_character (buffer
, '[');
3053 pp_string (buffer
, goto_xloc
.file
);
3054 pp_string (buffer
, " : ");
3056 pp_decimal_int (buffer
, goto_xloc
.line
);
3057 pp_string (buffer
, "] ");
3060 pp_cfg_jump (buffer
, e
->dest
);
3061 pp_newline (buffer
);
3065 /* Dumps basic block BB to buffer BUFFER with details described by FLAGS and
3066 indented by INDENT spaces. */
3069 dump_generic_bb_buff (pretty_printer
*buffer
, basic_block bb
,
3070 int indent
, int flags
)
3072 block_stmt_iterator bsi
;
3074 int label_indent
= indent
- 2;
3076 if (label_indent
< 0)
3079 dump_bb_header (buffer
, bb
, indent
, flags
);
3081 dump_phi_nodes (buffer
, bb
, indent
, flags
);
3083 for (bsi
= bsi_start (bb
); !bsi_end_p (bsi
); bsi_next (&bsi
))
3087 stmt
= bsi_stmt (bsi
);
3089 curr_indent
= TREE_CODE (stmt
) == LABEL_EXPR
? label_indent
: indent
;
3091 INDENT (curr_indent
);
3092 dump_generic_node (buffer
, stmt
, curr_indent
, flags
, true);
3093 pp_newline (buffer
);
3094 dump_histograms_for_stmt (cfun
, buffer
->buffer
->stream
, stmt
);
3097 dump_implicit_edges (buffer
, bb
, indent
, flags
);
3099 if (flags
& TDF_BLOCKS
)
3100 dump_bb_end (buffer
, bb
, indent
, flags
);