1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
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"
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 "fixed-value.h"
37 #include "value-prof.h"
40 /* Local functions, macros and variables. */
41 static const char *op_symbol (const_tree
);
42 static void pretty_print_string (pretty_printer
*, const char*);
43 static void print_call_name (pretty_printer
*, const_tree
);
44 static void newline_and_indent (pretty_printer
*, int);
45 static void maybe_init_pretty_print (FILE *);
46 static void print_struct_decl (pretty_printer
*, const_tree
, int, int);
47 static void do_niy (pretty_printer
*, const_tree
);
49 #define INDENT(SPACE) do { \
50 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
52 #define NIY do_niy(buffer,node)
54 #define PRINT_FUNCTION_NAME(NODE) pp_printf \
55 (buffer, "%s", TREE_CODE (NODE) == NOP_EXPR ? \
56 lang_hooks.decl_printable_name (TREE_OPERAND (NODE, 0), 1) : \
57 lang_hooks.decl_printable_name (NODE, 1))
59 static pretty_printer buffer
;
60 static int initialized
= 0;
62 /* Try to print something for an unknown tree code. */
65 do_niy (pretty_printer
*buffer
, const_tree node
)
69 pp_string (buffer
, "<<< Unknown tree: ");
70 pp_string (buffer
, tree_code_name
[(int) TREE_CODE (node
)]);
74 len
= TREE_OPERAND_LENGTH (node
);
75 for (i
= 0; i
< len
; ++i
)
77 newline_and_indent (buffer
, 2);
78 dump_generic_node (buffer
, TREE_OPERAND (node
, i
), 2, 0, false);
82 pp_string (buffer
, " >>>\n");
85 /* Debugging function to print out a generic expression. */
88 debug_generic_expr (tree t
)
90 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
91 fprintf (stderr
, "\n");
94 /* Debugging function to print out a generic statement. */
97 debug_generic_stmt (tree t
)
99 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
100 fprintf (stderr
, "\n");
103 /* Debugging function to print out a chain of trees . */
106 debug_tree_chain (tree t
)
110 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
111 fprintf(stderr
, " ");
114 fprintf (stderr
, "\n");
117 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
119 print_generic_decl (FILE *file
, tree decl
, int flags
)
121 maybe_init_pretty_print (file
);
122 print_declaration (&buffer
, decl
, 2, flags
);
123 pp_write_text_to_stream (&buffer
);
126 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
127 to show in the dump. See TDF_* in tree-pass.h. */
130 print_generic_stmt (FILE *file
, tree t
, int flags
)
132 maybe_init_pretty_print (file
);
133 dump_generic_node (&buffer
, t
, 0, flags
, true);
137 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
138 to show in the dump. See TDF_* in tree-pass.h. The output is indented by
142 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
146 maybe_init_pretty_print (file
);
148 for (i
= 0; i
< indent
; i
++)
150 dump_generic_node (&buffer
, t
, indent
, flags
, true);
154 /* Print a single expression T on file FILE. FLAGS specifies details to show
155 in the dump. See TDF_* in tree-pass.h. */
158 print_generic_expr (FILE *file
, tree t
, int flags
)
160 maybe_init_pretty_print (file
);
161 dump_generic_node (&buffer
, t
, 0, flags
, false);
164 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
168 dump_decl_name (pretty_printer
*buffer
, tree node
, int flags
)
173 pp_tree_identifier (buffer
, DECL_NAME (t
));
174 if ((flags
& TDF_UID
)
175 || DECL_NAME (t
) == NULL_TREE
)
177 if (TREE_CODE (t
) == LABEL_DECL
178 && LABEL_DECL_UID (t
) != -1)
179 pp_printf (buffer
, "L.%d", (int) LABEL_DECL_UID (t
));
182 char c
= TREE_CODE (t
) == CONST_DECL
? 'C' : 'D';
183 pp_printf (buffer
, "%c.%u", c
, DECL_UID (t
));
188 /* Like the above, but used for pretty printing function calls. */
191 dump_function_name (pretty_printer
*buffer
, tree node
)
193 if (DECL_NAME (node
))
194 PRINT_FUNCTION_NAME (node
);
196 dump_decl_name (buffer
, node
, 0);
199 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
200 FLAGS are as in dump_generic_node. */
203 dump_function_declaration (pretty_printer
*buffer
, tree node
,
206 bool wrote_arg
= false;
210 pp_character (buffer
, '(');
212 /* Print the argument types. The last element in the list is a VOID_TYPE.
213 The following avoids printing the last element. */
214 arg
= TYPE_ARG_TYPES (node
);
215 while (arg
&& TREE_CHAIN (arg
) && arg
!= error_mark_node
)
218 dump_generic_node (buffer
, TREE_VALUE (arg
), spc
, flags
, false);
219 arg
= TREE_CHAIN (arg
);
220 if (TREE_CHAIN (arg
) && TREE_CODE (TREE_CHAIN (arg
)) == TREE_LIST
)
222 pp_character (buffer
, ',');
228 pp_string (buffer
, "void");
230 pp_character (buffer
, ')');
233 /* Dump the domain associated with an array. */
236 dump_array_domain (pretty_printer
*buffer
, tree domain
, int spc
, int flags
)
238 pp_character (buffer
, '[');
241 tree min
= TYPE_MIN_VALUE (domain
);
242 tree max
= TYPE_MAX_VALUE (domain
);
245 && integer_zerop (min
)
246 && host_integerp (max
, 0))
247 pp_wide_integer (buffer
, TREE_INT_CST_LOW (max
) + 1);
251 dump_generic_node (buffer
, min
, spc
, flags
, false);
252 pp_character (buffer
, ':');
254 dump_generic_node (buffer
, max
, spc
, flags
, false);
258 pp_string (buffer
, "<unknown>");
259 pp_character (buffer
, ']');
263 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
264 dump_generic_node. */
267 dump_omp_clause (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
271 switch (OMP_CLAUSE_CODE (clause
))
273 case OMP_CLAUSE_PRIVATE
:
276 case OMP_CLAUSE_SHARED
:
279 case OMP_CLAUSE_FIRSTPRIVATE
:
280 name
= "firstprivate";
282 case OMP_CLAUSE_LASTPRIVATE
:
283 name
= "lastprivate";
285 case OMP_CLAUSE_COPYIN
:
288 case OMP_CLAUSE_COPYPRIVATE
:
289 name
= "copyprivate";
292 pp_string (buffer
, name
);
293 pp_character (buffer
, '(');
294 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
296 pp_character (buffer
, ')');
299 case OMP_CLAUSE_REDUCTION
:
300 pp_string (buffer
, "reduction(");
301 pp_string (buffer
, op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
302 pp_character (buffer
, ':');
303 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
305 pp_character (buffer
, ')');
309 pp_string (buffer
, "if(");
310 dump_generic_node (buffer
, OMP_CLAUSE_IF_EXPR (clause
),
312 pp_character (buffer
, ')');
315 case OMP_CLAUSE_NUM_THREADS
:
316 pp_string (buffer
, "num_threads(");
317 dump_generic_node (buffer
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
319 pp_character (buffer
, ')');
322 case OMP_CLAUSE_NOWAIT
:
323 pp_string (buffer
, "nowait");
325 case OMP_CLAUSE_ORDERED
:
326 pp_string (buffer
, "ordered");
329 case OMP_CLAUSE_DEFAULT
:
330 pp_string (buffer
, "default(");
331 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
333 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
335 case OMP_CLAUSE_DEFAULT_SHARED
:
336 pp_string (buffer
, "shared");
338 case OMP_CLAUSE_DEFAULT_NONE
:
339 pp_string (buffer
, "none");
341 case OMP_CLAUSE_DEFAULT_PRIVATE
:
342 pp_string (buffer
, "private");
344 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
345 pp_string (buffer
, "firstprivate");
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");
369 case OMP_CLAUSE_SCHEDULE_AUTO
:
370 pp_string (buffer
, "auto");
375 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
377 pp_character (buffer
, ',');
378 dump_generic_node (buffer
,
379 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
382 pp_character (buffer
, ')');
385 case OMP_CLAUSE_UNTIED
:
386 pp_string (buffer
, "untied");
389 case OMP_CLAUSE_COLLAPSE
:
390 pp_string (buffer
, "collapse(");
391 dump_generic_node (buffer
,
392 OMP_CLAUSE_COLLAPSE_EXPR (clause
),
394 pp_character (buffer
, ')');
398 /* Should never happen. */
399 dump_generic_node (buffer
, clause
, spc
, flags
, false);
405 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
406 dump_generic_node. */
409 dump_omp_clauses (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
417 dump_omp_clause (buffer
, clause
, spc
, flags
);
418 clause
= OMP_CLAUSE_CHAIN (clause
);
426 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
427 indent. FLAGS specifies details to show in the dump (see TDF_* in
428 tree-pass.h). If IS_STMT is true, the object printed is considered
429 to be a statement and it is terminated by ';' if appropriate. */
432 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
440 if (node
== NULL_TREE
)
443 is_expr
= EXPR_P (node
);
445 if (is_stmt
&& (flags
& TDF_STMTADDR
))
446 pp_printf (buffer
, "<&%p> ", (void *)node
);
448 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
450 expanded_location xloc
= expand_location (EXPR_LOCATION (node
));
451 pp_character (buffer
, '[');
454 pp_string (buffer
, xloc
.file
);
455 pp_string (buffer
, " : ");
457 pp_decimal_int (buffer
, xloc
.line
);
458 pp_string (buffer
, "] ");
461 switch (TREE_CODE (node
))
464 pp_string (buffer
, "<<< error >>>");
467 case IDENTIFIER_NODE
:
468 pp_tree_identifier (buffer
, node
);
472 while (node
&& node
!= error_mark_node
)
474 if (TREE_PURPOSE (node
))
476 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
479 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
480 node
= TREE_CHAIN (node
);
481 if (node
&& TREE_CODE (node
) == TREE_LIST
)
483 pp_character (buffer
, ',');
490 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
496 if (TREE_VEC_LENGTH (node
) > 0)
498 size_t len
= TREE_VEC_LENGTH (node
);
499 for (i
= 0; i
< len
- 1; i
++)
501 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
503 pp_character (buffer
, ',');
506 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
515 case FIXED_POINT_TYPE
:
521 unsigned int quals
= TYPE_QUALS (node
);
522 enum tree_code_class tclass
;
524 if (quals
& TYPE_QUAL_CONST
)
525 pp_string (buffer
, "const ");
526 else if (quals
& TYPE_QUAL_VOLATILE
)
527 pp_string (buffer
, "volatile ");
528 else if (quals
& TYPE_QUAL_RESTRICT
)
529 pp_string (buffer
, "restrict ");
531 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
533 if (tclass
== tcc_declaration
)
535 if (DECL_NAME (node
))
536 dump_decl_name (buffer
, node
, flags
);
538 pp_string (buffer
, "<unnamed type decl>");
540 else if (tclass
== tcc_type
)
542 if (TYPE_NAME (node
))
544 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
545 pp_tree_identifier (buffer
, TYPE_NAME (node
));
546 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
547 && DECL_NAME (TYPE_NAME (node
)))
548 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
550 pp_string (buffer
, "<unnamed type>");
552 else if (TREE_CODE (node
) == VECTOR_TYPE
)
554 pp_string (buffer
, "vector ");
555 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
557 else if (TREE_CODE (node
) == INTEGER_TYPE
)
559 pp_string (buffer
, (TYPE_UNSIGNED (node
)
560 ? "<unnamed-unsigned:"
561 : "<unnamed-signed:"));
562 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
563 pp_string (buffer
, ">");
565 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
567 pp_string (buffer
, "__complex__ ");
568 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
570 else if (TREE_CODE (node
) == REAL_TYPE
)
572 pp_string (buffer
, "<float:");
573 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
574 pp_string (buffer
, ">");
576 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
578 pp_string (buffer
, "<fixed-point-");
579 pp_string (buffer
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
580 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
581 pp_string (buffer
, ">");
584 pp_string (buffer
, "<unnamed type>");
591 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
593 if (TREE_TYPE (node
) == NULL
)
595 pp_string (buffer
, str
);
596 pp_string (buffer
, "<null type>");
598 else 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 if (quals
& TYPE_QUAL_VOLATILE
)
625 pp_string (buffer
, " volatile");
626 if (quals
& TYPE_QUAL_RESTRICT
)
627 pp_string (buffer
, " restrict");
629 if (TYPE_REF_CAN_ALIAS_ALL (node
))
630 pp_string (buffer
, " {ref-all}");
640 const char *sep
= "";
643 pp_string (buffer
, "MEM[");
645 tmp
= TMR_SYMBOL (node
);
648 pp_string (buffer
, sep
);
650 pp_string (buffer
, "symbol: ");
651 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
653 tmp
= TMR_BASE (node
);
656 pp_string (buffer
, sep
);
658 pp_string (buffer
, "base: ");
659 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
661 tmp
= TMR_INDEX (node
);
664 pp_string (buffer
, sep
);
666 pp_string (buffer
, "index: ");
667 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
669 tmp
= TMR_STEP (node
);
672 pp_string (buffer
, sep
);
674 pp_string (buffer
, "step: ");
675 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
677 tmp
= TMR_OFFSET (node
);
680 pp_string (buffer
, sep
);
682 pp_string (buffer
, "offset: ");
683 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
685 pp_string (buffer
, "]");
686 if (flags
& TDF_DETAILS
)
688 pp_string (buffer
, "{");
689 dump_generic_node (buffer
, TMR_ORIGINAL (node
), spc
, flags
,
691 pp_string (buffer
, "}");
700 /* Print the innermost component type. */
701 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
702 tmp
= TREE_TYPE (tmp
))
704 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
706 /* Print the dimensions. */
707 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
708 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
714 case QUAL_UNION_TYPE
:
716 unsigned int quals
= TYPE_QUALS (node
);
718 if (quals
& TYPE_QUAL_CONST
)
719 pp_string (buffer
, "const ");
720 if (quals
& TYPE_QUAL_VOLATILE
)
721 pp_string (buffer
, "volatile ");
723 /* Print the name of the structure. */
724 if (TREE_CODE (node
) == RECORD_TYPE
)
725 pp_string (buffer
, "struct ");
726 else if (TREE_CODE (node
) == UNION_TYPE
)
727 pp_string (buffer
, "union ");
729 if (TYPE_NAME (node
))
730 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
731 else if (!(flags
& TDF_SLIM
))
732 /* FIXME: If we eliminate the 'else' above and attempt
733 to show the fields for named types, we may get stuck
734 following a cycle of pointers to structs. The alleged
735 self-reference check in print_struct_decl will not detect
736 cycles involving more than one pointer or struct type. */
737 print_struct_decl (buffer
, node
, spc
, flags
);
746 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
748 /* In the case of a pointer, one may want to divide by the
749 size of the pointed-to type. Unfortunately, this not
750 straightforward. The C front-end maps expressions
755 in such a way that the two INTEGER_CST nodes for "5" have
756 different values but identical types. In the latter
757 case, the 5 is multiplied by sizeof (int) in c-common.c
758 (pointer_int_sum) to convert it to a byte address, and
759 yet the type of the node is left unchanged. Argh. What
760 is consistent though is that the number value corresponds
761 to bytes (UNITS) offset.
763 NB: Neither of the following divisors can be trivially
764 used to recover the original literal:
766 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
767 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
768 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
769 pp_string (buffer
, "B"); /* pseudo-unit */
771 else if (! host_integerp (node
, 0))
774 unsigned HOST_WIDE_INT low
= TREE_INT_CST_LOW (val
);
775 HOST_WIDE_INT high
= TREE_INT_CST_HIGH (val
);
777 if (tree_int_cst_sgn (val
) < 0)
779 pp_character (buffer
, '-');
783 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
785 sprintf (pp_buffer (buffer
)->digit_buffer
,
786 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
787 (unsigned HOST_WIDE_INT
) high
, low
);
788 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
791 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
795 /* Code copied from print_node. */
798 if (TREE_OVERFLOW (node
))
799 pp_string (buffer
, " overflow");
801 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
802 d
= TREE_REAL_CST (node
);
803 if (REAL_VALUE_ISINF (d
))
804 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
805 else if (REAL_VALUE_ISNAN (d
))
806 pp_string (buffer
, " Nan");
810 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
811 pp_string (buffer
, string
);
816 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
817 pp_string (buffer
, "0x");
818 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
819 output_formatted_integer (buffer
, "%02x", *p
++);
828 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
829 pp_string (buffer
, string
);
834 pp_string (buffer
, "__complex__ (");
835 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
836 pp_string (buffer
, ", ");
837 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
838 pp_string (buffer
, ")");
842 pp_string (buffer
, "\"");
843 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
844 pp_string (buffer
, "\"");
850 pp_string (buffer
, "{ ");
851 for (elt
= TREE_VECTOR_CST_ELTS (node
); elt
; elt
= TREE_CHAIN (elt
))
853 dump_generic_node (buffer
, TREE_VALUE (elt
), spc
, flags
, false);
854 if (TREE_CHAIN (elt
))
855 pp_string (buffer
, ", ");
857 pp_string (buffer
, " }");
863 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
865 if (TREE_CODE (node
) == METHOD_TYPE
)
867 if (TYPE_METHOD_BASETYPE (node
))
868 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
871 pp_string (buffer
, "<null method basetype>");
872 pp_string (buffer
, "::");
874 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
875 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
877 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
878 dump_function_declaration (buffer
, node
, spc
, flags
);
883 dump_decl_name (buffer
, node
, flags
);
887 if (DECL_NAME (node
))
888 dump_decl_name (buffer
, node
, flags
);
889 else if (LABEL_DECL_UID (node
) != -1)
890 pp_printf (buffer
, "<L%d>", (int) LABEL_DECL_UID (node
));
892 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
896 if (DECL_IS_BUILTIN (node
))
898 /* Don't print the declaration of built-in types. */
901 if (DECL_NAME (node
))
902 dump_decl_name (buffer
, node
, flags
);
905 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
906 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
907 && TYPE_METHODS (TREE_TYPE (node
)))
909 /* The type is a c++ class: all structures have at least
911 pp_string (buffer
, "class ");
912 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
917 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
918 ? "union" : "struct "));
919 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
928 dump_decl_name (buffer
, node
, flags
);
932 pp_string (buffer
, "<retval>");
936 op0
= TREE_OPERAND (node
, 0);
938 if (TREE_CODE (op0
) == INDIRECT_REF
)
940 op0
= TREE_OPERAND (op0
, 0);
943 if (op_prio (op0
) < op_prio (node
))
944 pp_character (buffer
, '(');
945 dump_generic_node (buffer
, op0
, spc
, flags
, false);
946 if (op_prio (op0
) < op_prio (node
))
947 pp_character (buffer
, ')');
948 pp_string (buffer
, str
);
949 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
950 op0
= component_ref_field_offset (node
);
951 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
953 pp_string (buffer
, "{off: ");
954 dump_generic_node (buffer
, op0
, spc
, flags
, false);
955 pp_character (buffer
, '}');
960 pp_string (buffer
, "BIT_FIELD_REF <");
961 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
962 pp_string (buffer
, ", ");
963 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
964 pp_string (buffer
, ", ");
965 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
966 pp_string (buffer
, ">");
970 case ARRAY_RANGE_REF
:
971 op0
= TREE_OPERAND (node
, 0);
972 if (op_prio (op0
) < op_prio (node
))
973 pp_character (buffer
, '(');
974 dump_generic_node (buffer
, op0
, spc
, flags
, false);
975 if (op_prio (op0
) < op_prio (node
))
976 pp_character (buffer
, ')');
977 pp_character (buffer
, '[');
978 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
979 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
980 pp_string (buffer
, " ...");
981 pp_character (buffer
, ']');
983 op0
= array_ref_low_bound (node
);
984 op1
= array_ref_element_size (node
);
986 if (!integer_zerop (op0
)
987 || TREE_OPERAND (node
, 2)
988 || TREE_OPERAND (node
, 3))
990 pp_string (buffer
, "{lb: ");
991 dump_generic_node (buffer
, op0
, spc
, flags
, false);
992 pp_string (buffer
, " sz: ");
993 dump_generic_node (buffer
, op1
, spc
, flags
, false);
994 pp_character (buffer
, '}');
1000 unsigned HOST_WIDE_INT ix
;
1002 bool is_struct_init
= FALSE
;
1003 pp_character (buffer
, '{');
1004 if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1005 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1006 is_struct_init
= TRUE
;
1007 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1009 if (field
&& is_struct_init
)
1011 pp_character (buffer
, '.');
1012 dump_generic_node (buffer
, field
, spc
, flags
, false);
1013 pp_string (buffer
, "=");
1015 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1016 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1017 val
= TREE_OPERAND (val
, 0);
1018 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1019 dump_decl_name (buffer
, val
, flags
);
1021 dump_generic_node (buffer
, val
, spc
, flags
, false);
1022 if (ix
!= VEC_length (constructor_elt
, CONSTRUCTOR_ELTS (node
)) - 1)
1024 pp_character (buffer
, ',');
1028 pp_character (buffer
, '}');
1035 if (flags
& TDF_SLIM
)
1037 pp_string (buffer
, "<COMPOUND_EXPR>");
1041 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1042 spc
, flags
, !(flags
& TDF_SLIM
));
1043 if (flags
& TDF_SLIM
)
1044 newline_and_indent (buffer
, spc
);
1047 pp_character (buffer
, ',');
1051 for (tp
= &TREE_OPERAND (node
, 1);
1052 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1053 tp
= &TREE_OPERAND (*tp
, 1))
1055 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1056 spc
, flags
, !(flags
& TDF_SLIM
));
1057 if (flags
& TDF_SLIM
)
1058 newline_and_indent (buffer
, spc
);
1061 pp_character (buffer
, ',');
1066 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1070 case STATEMENT_LIST
:
1072 tree_stmt_iterator si
;
1075 if (flags
& TDF_SLIM
)
1077 pp_string (buffer
, "<STATEMENT_LIST>");
1081 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1084 newline_and_indent (buffer
, spc
);
1087 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1094 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
,
1097 pp_character (buffer
, '=');
1098 if (TREE_CODE (node
) == MODIFY_EXPR
1099 && MOVE_NONTEMPORAL (node
))
1100 pp_string (buffer
, "{nt}");
1102 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
,
1107 pp_string (buffer
, "TARGET_EXPR <");
1108 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1109 pp_character (buffer
, ',');
1111 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1112 pp_character (buffer
, '>');
1116 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1121 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1123 pp_string (buffer
, "if (");
1124 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1125 pp_character (buffer
, ')');
1126 /* The lowered cond_exprs should always be printed in full. */
1127 if (COND_EXPR_THEN (node
)
1128 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1129 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1130 && COND_EXPR_ELSE (node
)
1131 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1132 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1135 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1137 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1139 pp_string (buffer
, " else ");
1140 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1144 else if (!(flags
& TDF_SLIM
))
1146 /* Output COND_EXPR_THEN. */
1147 if (COND_EXPR_THEN (node
))
1149 newline_and_indent (buffer
, spc
+2);
1150 pp_character (buffer
, '{');
1151 newline_and_indent (buffer
, spc
+4);
1152 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1154 newline_and_indent (buffer
, spc
+2);
1155 pp_character (buffer
, '}');
1158 /* Output COND_EXPR_ELSE. */
1159 if (COND_EXPR_ELSE (node
)
1160 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1162 newline_and_indent (buffer
, spc
);
1163 pp_string (buffer
, "else");
1164 newline_and_indent (buffer
, spc
+2);
1165 pp_character (buffer
, '{');
1166 newline_and_indent (buffer
, spc
+4);
1167 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1169 newline_and_indent (buffer
, spc
+2);
1170 pp_character (buffer
, '}');
1177 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1179 pp_character (buffer
, '?');
1181 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1183 pp_character (buffer
, ':');
1185 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1190 pp_character (buffer
, '{');
1191 if (!(flags
& TDF_SLIM
))
1193 if (BIND_EXPR_VARS (node
))
1195 pp_newline (buffer
);
1197 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= TREE_CHAIN (op0
))
1199 print_declaration (buffer
, op0
, spc
+2, flags
);
1200 pp_newline (buffer
);
1204 newline_and_indent (buffer
, spc
+2);
1205 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1206 newline_and_indent (buffer
, spc
);
1207 pp_character (buffer
, '}');
1213 print_call_name (buffer
, node
);
1215 /* Print parameters. */
1217 pp_character (buffer
, '(');
1220 call_expr_arg_iterator iter
;
1221 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1223 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1224 if (more_call_expr_args_p (&iter
))
1226 pp_character (buffer
, ',');
1231 if (CALL_EXPR_VA_ARG_PACK (node
))
1233 if (call_expr_nargs (node
) > 0)
1235 pp_character (buffer
, ',');
1238 pp_string (buffer
, "__builtin_va_arg_pack ()");
1240 pp_character (buffer
, ')');
1242 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1245 pp_string (buffer
, " [static-chain: ");
1246 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1247 pp_character (buffer
, ']');
1250 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1251 pp_string (buffer
, " [return slot optimization]");
1252 if (CALL_EXPR_TAILCALL (node
))
1253 pp_string (buffer
, " [tail call]");
1256 case WITH_CLEANUP_EXPR
:
1260 case CLEANUP_POINT_EXPR
:
1261 pp_string (buffer
, "<<cleanup_point ");
1262 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1263 pp_string (buffer
, ">>");
1266 case PLACEHOLDER_EXPR
:
1267 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1268 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1269 pp_character (buffer
, '>');
1272 /* Binary arithmetic and logic expressions. */
1273 case WIDEN_SUM_EXPR
:
1274 case WIDEN_MULT_EXPR
:
1277 case POINTER_PLUS_EXPR
:
1279 case TRUNC_DIV_EXPR
:
1281 case FLOOR_DIV_EXPR
:
1282 case ROUND_DIV_EXPR
:
1283 case TRUNC_MOD_EXPR
:
1285 case FLOOR_MOD_EXPR
:
1286 case ROUND_MOD_EXPR
:
1288 case EXACT_DIV_EXPR
:
1293 case VEC_LSHIFT_EXPR
:
1294 case VEC_RSHIFT_EXPR
:
1298 case TRUTH_ANDIF_EXPR
:
1299 case TRUTH_ORIF_EXPR
:
1300 case TRUTH_AND_EXPR
:
1302 case TRUTH_XOR_EXPR
:
1316 case UNORDERED_EXPR
:
1318 const char *op
= op_symbol (node
);
1319 op0
= TREE_OPERAND (node
, 0);
1320 op1
= TREE_OPERAND (node
, 1);
1322 /* When the operands are expressions with less priority,
1323 keep semantics of the tree representation. */
1324 if (op_prio (op0
) <= op_prio (node
))
1326 pp_character (buffer
, '(');
1327 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1328 pp_character (buffer
, ')');
1331 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1334 pp_string (buffer
, op
);
1337 /* When the operands are expressions with less priority,
1338 keep semantics of the tree representation. */
1339 if (op_prio (op1
) <= op_prio (node
))
1341 pp_character (buffer
, '(');
1342 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1343 pp_character (buffer
, ')');
1346 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1350 /* Unary arithmetic and logic expressions. */
1353 case TRUTH_NOT_EXPR
:
1355 case PREDECREMENT_EXPR
:
1356 case PREINCREMENT_EXPR
:
1357 case ALIGN_INDIRECT_REF
:
1358 case MISALIGNED_INDIRECT_REF
:
1360 if (TREE_CODE (node
) == ADDR_EXPR
1361 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
1362 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
1363 ; /* Do not output '&' for strings and function pointers. */
1365 pp_string (buffer
, op_symbol (node
));
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);
1376 if (TREE_CODE (node
) == MISALIGNED_INDIRECT_REF
)
1378 pp_string (buffer
, "{misalignment: ");
1379 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1380 pp_character (buffer
, '}');
1384 case POSTDECREMENT_EXPR
:
1385 case POSTINCREMENT_EXPR
:
1386 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1388 pp_character (buffer
, '(');
1389 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1390 pp_character (buffer
, ')');
1393 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1394 pp_string (buffer
, op_symbol (node
));
1398 pp_string (buffer
, "MIN_EXPR <");
1399 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1400 pp_string (buffer
, ", ");
1401 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1402 pp_character (buffer
, '>');
1406 pp_string (buffer
, "MAX_EXPR <");
1407 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1408 pp_string (buffer
, ", ");
1409 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1410 pp_character (buffer
, '>');
1414 pp_string (buffer
, "ABS_EXPR <");
1415 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1416 pp_character (buffer
, '>');
1423 case FIXED_CONVERT_EXPR
:
1424 case FIX_TRUNC_EXPR
:
1427 type
= TREE_TYPE (node
);
1428 op0
= TREE_OPERAND (node
, 0);
1429 if (type
!= TREE_TYPE (op0
))
1431 pp_character (buffer
, '(');
1432 dump_generic_node (buffer
, type
, spc
, flags
, false);
1433 pp_string (buffer
, ") ");
1435 if (op_prio (op0
) < op_prio (node
))
1436 pp_character (buffer
, '(');
1437 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1438 if (op_prio (op0
) < op_prio (node
))
1439 pp_character (buffer
, ')');
1442 case VIEW_CONVERT_EXPR
:
1443 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
1444 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1445 pp_string (buffer
, ">(");
1446 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1447 pp_character (buffer
, ')');
1451 pp_string (buffer
, "((");
1452 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1453 pp_string (buffer
, "))");
1456 case NON_LVALUE_EXPR
:
1457 pp_string (buffer
, "NON_LVALUE_EXPR <");
1458 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1459 pp_character (buffer
, '>');
1463 pp_string (buffer
, "SAVE_EXPR <");
1464 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1465 pp_character (buffer
, '>');
1469 pp_string (buffer
, "COMPLEX_EXPR <");
1470 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1471 pp_string (buffer
, ", ");
1472 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1473 pp_string (buffer
, ">");
1477 pp_string (buffer
, "CONJ_EXPR <");
1478 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1479 pp_string (buffer
, ">");
1483 pp_string (buffer
, "REALPART_EXPR <");
1484 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1485 pp_string (buffer
, ">");
1489 pp_string (buffer
, "IMAGPART_EXPR <");
1490 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1491 pp_string (buffer
, ">");
1495 pp_string (buffer
, "VA_ARG_EXPR <");
1496 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1497 pp_string (buffer
, ">");
1500 case TRY_FINALLY_EXPR
:
1501 case TRY_CATCH_EXPR
:
1502 pp_string (buffer
, "try");
1503 newline_and_indent (buffer
, spc
+2);
1504 pp_string (buffer
, "{");
1505 newline_and_indent (buffer
, spc
+4);
1506 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
1507 newline_and_indent (buffer
, spc
+2);
1508 pp_string (buffer
, "}");
1509 newline_and_indent (buffer
, spc
);
1511 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
1512 newline_and_indent (buffer
, spc
+2);
1513 pp_string (buffer
, "{");
1514 newline_and_indent (buffer
, spc
+4);
1515 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
1516 newline_and_indent (buffer
, spc
+2);
1517 pp_string (buffer
, "}");
1522 pp_string (buffer
, "catch (");
1523 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
1524 pp_string (buffer
, ")");
1525 newline_and_indent (buffer
, spc
+2);
1526 pp_string (buffer
, "{");
1527 newline_and_indent (buffer
, spc
+4);
1528 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
1529 newline_and_indent (buffer
, spc
+2);
1530 pp_string (buffer
, "}");
1534 case EH_FILTER_EXPR
:
1535 pp_string (buffer
, "<<<eh_filter (");
1536 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
1537 pp_string (buffer
, ")>>>");
1538 newline_and_indent (buffer
, spc
+2);
1539 pp_string (buffer
, "{");
1540 newline_and_indent (buffer
, spc
+4);
1541 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
1542 newline_and_indent (buffer
, spc
+2);
1543 pp_string (buffer
, "}");
1547 case CHANGE_DYNAMIC_TYPE_EXPR
:
1548 pp_string (buffer
, "<<<change_dynamic_type (");
1549 dump_generic_node (buffer
, CHANGE_DYNAMIC_TYPE_NEW_TYPE (node
), spc
+ 2,
1551 pp_string (buffer
, ") ");
1552 dump_generic_node (buffer
, CHANGE_DYNAMIC_TYPE_LOCATION (node
), spc
+ 2,
1554 pp_string (buffer
, ")>>>");
1559 op0
= TREE_OPERAND (node
, 0);
1560 /* If this is for break or continue, don't bother printing it. */
1561 if (DECL_NAME (op0
))
1563 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1564 if (strcmp (name
, "break") == 0
1565 || strcmp (name
, "continue") == 0)
1568 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1569 pp_character (buffer
, ':');
1570 if (DECL_NONLOCAL (op0
))
1571 pp_string (buffer
, " [non-local]");
1575 pp_string (buffer
, "<<<exception object>>>");
1579 pp_string (buffer
, "<<<filter object>>>");
1583 pp_string (buffer
, "while (1)");
1584 if (!(flags
& TDF_SLIM
))
1586 newline_and_indent (buffer
, spc
+2);
1587 pp_character (buffer
, '{');
1588 newline_and_indent (buffer
, spc
+4);
1589 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
1590 newline_and_indent (buffer
, spc
+2);
1591 pp_character (buffer
, '}');
1597 pp_string (buffer
, "// predicted ");
1598 if (PREDICT_EXPR_OUTCOME (node
))
1599 pp_string (buffer
, "likely by ");
1601 pp_string (buffer
, "unlikely by ");
1602 pp_string (buffer
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
1603 pp_string (buffer
, " predictor.");
1607 pp_string (buffer
, "return");
1608 op0
= TREE_OPERAND (node
, 0);
1612 if (TREE_CODE (op0
) == MODIFY_EXPR
)
1613 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1),
1616 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1621 pp_string (buffer
, "if (");
1622 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1623 pp_string (buffer
, ") break");
1627 pp_string (buffer
, "switch (");
1628 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
1629 pp_character (buffer
, ')');
1630 if (!(flags
& TDF_SLIM
))
1632 newline_and_indent (buffer
, spc
+2);
1633 pp_character (buffer
, '{');
1634 if (SWITCH_BODY (node
))
1636 newline_and_indent (buffer
, spc
+4);
1637 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
1642 tree vec
= SWITCH_LABELS (node
);
1643 size_t i
, n
= TREE_VEC_LENGTH (vec
);
1644 for (i
= 0; i
< n
; ++i
)
1646 tree elt
= TREE_VEC_ELT (vec
, i
);
1647 newline_and_indent (buffer
, spc
+4);
1650 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
1651 pp_string (buffer
, " goto ");
1652 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
1654 pp_semicolon (buffer
);
1657 pp_string (buffer
, "case ???: goto ???;");
1660 newline_and_indent (buffer
, spc
+2);
1661 pp_character (buffer
, '}');
1667 op0
= GOTO_DESTINATION (node
);
1668 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
1670 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1671 if (strcmp (name
, "break") == 0
1672 || strcmp (name
, "continue") == 0)
1674 pp_string (buffer
, name
);
1678 pp_string (buffer
, "goto ");
1679 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1683 pp_string (buffer
, "resx ");
1684 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1688 pp_string (buffer
, "__asm__");
1689 if (ASM_VOLATILE_P (node
))
1690 pp_string (buffer
, " __volatile__");
1691 pp_character (buffer
, '(');
1692 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
1693 pp_character (buffer
, ':');
1694 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
1695 pp_character (buffer
, ':');
1696 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
1697 if (ASM_CLOBBERS (node
))
1699 pp_character (buffer
, ':');
1700 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
1702 pp_string (buffer
, ")");
1705 case CASE_LABEL_EXPR
:
1706 if (CASE_LOW (node
) && CASE_HIGH (node
))
1708 pp_string (buffer
, "case ");
1709 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1710 pp_string (buffer
, " ... ");
1711 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
1713 else if (CASE_LOW (node
))
1715 pp_string (buffer
, "case ");
1716 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1719 pp_string (buffer
, "default");
1720 pp_character (buffer
, ':');
1724 pp_string (buffer
, "OBJ_TYPE_REF(");
1725 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
1726 pp_character (buffer
, ';');
1727 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
1728 pp_character (buffer
, '-');
1729 pp_character (buffer
, '>');
1730 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
1731 pp_character (buffer
, ')');
1735 dump_generic_node (buffer
, SSA_NAME_VAR (node
), spc
, flags
, false);
1736 pp_string (buffer
, "_");
1737 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
1738 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
1739 pp_string (buffer
, "(ab)");
1740 else if (SSA_NAME_IS_DEFAULT_DEF (node
))
1741 pp_string (buffer
, "(D)");
1744 case WITH_SIZE_EXPR
:
1745 pp_string (buffer
, "WITH_SIZE_EXPR <");
1746 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1747 pp_string (buffer
, ", ");
1748 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1749 pp_string (buffer
, ">");
1753 pp_string (buffer
, "ASSERT_EXPR <");
1754 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
1755 pp_string (buffer
, ", ");
1756 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
1757 pp_string (buffer
, ">");
1761 pp_string (buffer
, "scev_known");
1764 case SCEV_NOT_KNOWN
:
1765 pp_string (buffer
, "scev_not_known");
1768 case POLYNOMIAL_CHREC
:
1769 pp_string (buffer
, "{");
1770 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
1771 pp_string (buffer
, ", +, ");
1772 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
1773 pp_string (buffer
, "}_");
1774 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
1778 case REALIGN_LOAD_EXPR
:
1779 pp_string (buffer
, "REALIGN_LOAD <");
1780 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1781 pp_string (buffer
, ", ");
1782 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1783 pp_string (buffer
, ", ");
1784 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1785 pp_string (buffer
, ">");
1789 pp_string (buffer
, " VEC_COND_EXPR < ");
1790 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1791 pp_string (buffer
, " , ");
1792 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1793 pp_string (buffer
, " , ");
1794 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1795 pp_string (buffer
, " > ");
1799 pp_string (buffer
, " DOT_PROD_EXPR < ");
1800 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1801 pp_string (buffer
, ", ");
1802 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1803 pp_string (buffer
, ", ");
1804 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1805 pp_string (buffer
, " > ");
1809 pp_string (buffer
, "#pragma omp parallel");
1810 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
1813 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
1815 newline_and_indent (buffer
, spc
+ 2);
1816 pp_character (buffer
, '{');
1817 newline_and_indent (buffer
, spc
+ 4);
1818 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
1819 newline_and_indent (buffer
, spc
+ 2);
1820 pp_character (buffer
, '}');
1826 pp_string (buffer
, "#pragma omp task");
1827 dump_omp_clauses (buffer
, OMP_TASK_CLAUSES (node
), spc
, flags
);
1831 pp_string (buffer
, "#pragma omp for");
1832 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
1834 if (!(flags
& TDF_SLIM
))
1838 if (OMP_FOR_PRE_BODY (node
))
1840 newline_and_indent (buffer
, spc
+ 2);
1841 pp_character (buffer
, '{');
1843 newline_and_indent (buffer
, spc
);
1844 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
1848 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
1851 newline_and_indent (buffer
, spc
);
1852 pp_string (buffer
, "for (");
1853 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
1855 pp_string (buffer
, "; ");
1856 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
1858 pp_string (buffer
, "; ");
1859 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
1861 pp_string (buffer
, ")");
1863 if (OMP_FOR_BODY (node
))
1865 newline_and_indent (buffer
, spc
+ 2);
1866 pp_character (buffer
, '{');
1867 newline_and_indent (buffer
, spc
+ 4);
1868 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
1870 newline_and_indent (buffer
, spc
+ 2);
1871 pp_character (buffer
, '}');
1873 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
1874 if (OMP_FOR_PRE_BODY (node
))
1877 newline_and_indent (buffer
, spc
+ 2);
1878 pp_character (buffer
, '}');
1885 pp_string (buffer
, "#pragma omp sections");
1886 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
1890 pp_string (buffer
, "#pragma omp section");
1894 pp_string (buffer
, "#pragma omp master");
1898 pp_string (buffer
, "#pragma omp ordered");
1902 pp_string (buffer
, "#pragma omp critical");
1903 if (OMP_CRITICAL_NAME (node
))
1906 pp_character (buffer
, '(');
1907 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
1909 pp_character (buffer
, ')');
1914 pp_string (buffer
, "#pragma omp atomic");
1915 newline_and_indent (buffer
, spc
+ 2);
1916 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1918 pp_character (buffer
, '=');
1920 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1924 pp_string (buffer
, "#pragma omp single");
1925 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
1929 dump_omp_clause (buffer
, node
, spc
, flags
);
1933 case REDUC_MAX_EXPR
:
1934 pp_string (buffer
, " REDUC_MAX_EXPR < ");
1935 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1936 pp_string (buffer
, " > ");
1939 case REDUC_MIN_EXPR
:
1940 pp_string (buffer
, " REDUC_MIN_EXPR < ");
1941 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1942 pp_string (buffer
, " > ");
1945 case REDUC_PLUS_EXPR
:
1946 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
1947 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1948 pp_string (buffer
, " > ");
1951 case VEC_WIDEN_MULT_HI_EXPR
:
1952 pp_string (buffer
, " VEC_WIDEN_MULT_HI_EXPR < ");
1953 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1954 pp_string (buffer
, ", ");
1955 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1956 pp_string (buffer
, " > ");
1959 case VEC_WIDEN_MULT_LO_EXPR
:
1960 pp_string (buffer
, " VEC_WIDEN_MULT_LO_EXPR < ");
1961 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1962 pp_string (buffer
, ", ");
1963 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1964 pp_string (buffer
, " > ");
1967 case VEC_UNPACK_HI_EXPR
:
1968 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
1969 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1970 pp_string (buffer
, " > ");
1973 case VEC_UNPACK_LO_EXPR
:
1974 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
1975 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1976 pp_string (buffer
, " > ");
1979 case VEC_UNPACK_FLOAT_HI_EXPR
:
1980 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
1981 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1982 pp_string (buffer
, " > ");
1985 case VEC_UNPACK_FLOAT_LO_EXPR
:
1986 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
1987 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1988 pp_string (buffer
, " > ");
1991 case VEC_PACK_TRUNC_EXPR
:
1992 pp_string (buffer
, " VEC_PACK_TRUNC_EXPR < ");
1993 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1994 pp_string (buffer
, ", ");
1995 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1996 pp_string (buffer
, " > ");
1999 case VEC_PACK_SAT_EXPR
:
2000 pp_string (buffer
, " VEC_PACK_SAT_EXPR < ");
2001 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2002 pp_string (buffer
, ", ");
2003 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2004 pp_string (buffer
, " > ");
2007 case VEC_PACK_FIX_TRUNC_EXPR
:
2008 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2009 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2010 pp_string (buffer
, ", ");
2011 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2012 pp_string (buffer
, " > ");
2018 pp_string (buffer
, "BLOCK");
2020 if (BLOCK_ABSTRACT (node
))
2021 pp_string (buffer
, " [abstract]");
2023 if (TREE_ASM_WRITTEN (node
))
2024 pp_string (buffer
, " [written]");
2026 newline_and_indent (buffer
, spc
+ 2);
2028 if (BLOCK_SUPERCONTEXT (node
))
2030 pp_string (buffer
, "SUPERCONTEXT: ");
2031 if (TREE_CODE (BLOCK_SUPERCONTEXT (node
)) == BLOCK
)
2032 pp_printf (buffer
, "BLOCK %p",
2033 (void *)BLOCK_SUPERCONTEXT (node
));
2035 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (node
), 0, flags
,
2037 newline_and_indent (buffer
, spc
+ 2);
2040 if (BLOCK_SUBBLOCKS (node
))
2042 pp_string (buffer
, "SUBBLOCKS: ");
2043 for (t
= BLOCK_SUBBLOCKS (node
); t
; t
= BLOCK_CHAIN (t
))
2044 pp_printf (buffer
, "%p ", (void *)t
);
2045 newline_and_indent (buffer
, spc
+ 2);
2048 if (BLOCK_VARS (node
))
2050 pp_string (buffer
, "VARS: ");
2051 for (t
= BLOCK_VARS (node
); t
; t
= TREE_CHAIN (t
))
2053 dump_generic_node (buffer
, t
, 0, flags
, false);
2054 pp_string (buffer
, " ");
2056 newline_and_indent (buffer
, spc
+ 2);
2059 if (BLOCK_ABSTRACT_ORIGIN (node
))
2061 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
2062 if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node
)) == BLOCK
)
2063 pp_printf (buffer
, "BLOCK %p",
2064 (void *)BLOCK_ABSTRACT_ORIGIN (node
));
2066 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (node
), 0, flags
,
2068 newline_and_indent (buffer
, spc
+ 2);
2073 case VEC_EXTRACT_EVEN_EXPR
:
2074 pp_string (buffer
, " VEC_EXTRACT_EVEN_EXPR < ");
2075 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2076 pp_string (buffer
, ", ");
2077 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2078 pp_string (buffer
, " > ");
2081 case VEC_EXTRACT_ODD_EXPR
:
2082 pp_string (buffer
, " VEC_EXTRACT_ODD_EXPR < ");
2083 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2084 pp_string (buffer
, ", ");
2085 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2086 pp_string (buffer
, " > ");
2089 case VEC_INTERLEAVE_HIGH_EXPR
:
2090 pp_string (buffer
, " VEC_INTERLEAVE_HIGH_EXPR < ");
2091 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2092 pp_string (buffer
, ", ");
2093 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2094 pp_string (buffer
, " > ");
2097 case VEC_INTERLEAVE_LOW_EXPR
:
2098 pp_string (buffer
, " VEC_INTERLEAVE_LOW_EXPR < ");
2099 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2100 pp_string (buffer
, ", ");
2101 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2102 pp_string (buffer
, " > ");
2109 if (is_stmt
&& is_expr
)
2110 pp_semicolon (buffer
);
2112 /* If we're building a diagnostic, the formatted text will be written
2113 into BUFFER's stream by the caller; otherwise, write it now. */
2114 if (!(flags
& TDF_DIAGNOSTIC
))
2115 pp_write_text_to_stream (buffer
);
2120 /* Print the declaration of a variable. */
2123 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2127 if (TREE_CODE (t
) == TYPE_DECL
)
2128 pp_string (buffer
, "typedef ");
2130 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2131 pp_string (buffer
, "register ");
2133 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2134 pp_string (buffer
, "extern ");
2135 else if (TREE_STATIC (t
))
2136 pp_string (buffer
, "static ");
2138 /* Print the type and name. */
2139 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2143 /* Print array's type. */
2144 tmp
= TREE_TYPE (t
);
2145 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2146 tmp
= TREE_TYPE (tmp
);
2147 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2149 /* Print variable's name. */
2151 dump_generic_node (buffer
, t
, spc
, flags
, false);
2153 /* Print the dimensions. */
2154 tmp
= TREE_TYPE (t
);
2155 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2157 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2158 tmp
= TREE_TYPE (tmp
);
2161 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2163 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2165 dump_decl_name (buffer
, t
, flags
);
2166 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2170 /* Print type declaration. */
2171 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2173 /* Print variable's name. */
2175 dump_generic_node (buffer
, t
, spc
, flags
, false);
2178 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2180 pp_string (buffer
, " __asm__ ");
2181 pp_character (buffer
, '(');
2182 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2183 pp_character (buffer
, ')');
2186 /* The initial value of a function serves to determine whether the function
2187 is declared or defined. So the following does not apply to function
2189 if (TREE_CODE (t
) != FUNCTION_DECL
)
2191 /* Print the initial value. */
2192 if (DECL_INITIAL (t
))
2195 pp_character (buffer
, '=');
2197 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2201 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2203 pp_string (buffer
, " [value-expr: ");
2204 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2205 pp_character (buffer
, ']');
2208 pp_character (buffer
, ';');
2212 /* Prints a structure: name, fields, and methods.
2213 FIXME: Still incomplete. */
2216 print_struct_decl (pretty_printer
*buffer
, const_tree node
, int spc
, int flags
)
2218 /* Print the name of the structure. */
2219 if (TYPE_NAME (node
))
2222 if (TREE_CODE (node
) == RECORD_TYPE
)
2223 pp_string (buffer
, "struct ");
2224 else if ((TREE_CODE (node
) == UNION_TYPE
2225 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
2226 pp_string (buffer
, "union ");
2228 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
2231 /* Print the contents of the structure. */
2232 pp_newline (buffer
);
2234 pp_character (buffer
, '{');
2235 pp_newline (buffer
);
2237 /* Print the fields of the structure. */
2240 tmp
= TYPE_FIELDS (node
);
2243 /* Avoid to print recursively the structure. */
2244 /* FIXME : Not implemented correctly...,
2245 what about the case when we have a cycle in the contain graph? ...
2246 Maybe this could be solved by looking at the scope in which the
2247 structure was declared. */
2248 if (TREE_TYPE (tmp
) != node
2249 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
2250 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
2252 print_declaration (buffer
, tmp
, spc
+2, flags
);
2253 pp_newline (buffer
);
2255 tmp
= TREE_CHAIN (tmp
);
2259 pp_character (buffer
, '}');
2262 /* Return the priority of the operator CODE.
2264 From lowest to highest precedence with either left-to-right (L-R)
2265 or right-to-left (R-L) associativity]:
2268 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2280 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2281 15 [L-R] fn() [] -> .
2283 unary +, - and * have higher precedence than the corresponding binary
2287 op_code_prio (enum tree_code code
)
2304 case TRUTH_ORIF_EXPR
:
2307 case TRUTH_AND_EXPR
:
2308 case TRUTH_ANDIF_EXPR
:
2315 case TRUTH_XOR_EXPR
:
2332 case UNORDERED_EXPR
:
2345 case WIDEN_SUM_EXPR
:
2347 case POINTER_PLUS_EXPR
:
2351 case VEC_WIDEN_MULT_HI_EXPR
:
2352 case VEC_WIDEN_MULT_LO_EXPR
:
2353 case WIDEN_MULT_EXPR
:
2356 case TRUNC_DIV_EXPR
:
2358 case FLOOR_DIV_EXPR
:
2359 case ROUND_DIV_EXPR
:
2361 case EXACT_DIV_EXPR
:
2362 case TRUNC_MOD_EXPR
:
2364 case FLOOR_MOD_EXPR
:
2365 case ROUND_MOD_EXPR
:
2368 case TRUTH_NOT_EXPR
:
2370 case POSTINCREMENT_EXPR
:
2371 case POSTDECREMENT_EXPR
:
2372 case PREINCREMENT_EXPR
:
2373 case PREDECREMENT_EXPR
:
2375 case ALIGN_INDIRECT_REF
:
2376 case MISALIGNED_INDIRECT_REF
:
2381 case FIX_TRUNC_EXPR
:
2387 case ARRAY_RANGE_REF
:
2391 /* Special expressions. */
2397 case REDUC_MAX_EXPR
:
2398 case REDUC_MIN_EXPR
:
2399 case REDUC_PLUS_EXPR
:
2400 case VEC_LSHIFT_EXPR
:
2401 case VEC_RSHIFT_EXPR
:
2402 case VEC_UNPACK_HI_EXPR
:
2403 case VEC_UNPACK_LO_EXPR
:
2404 case VEC_UNPACK_FLOAT_HI_EXPR
:
2405 case VEC_UNPACK_FLOAT_LO_EXPR
:
2406 case VEC_PACK_TRUNC_EXPR
:
2407 case VEC_PACK_SAT_EXPR
:
2411 /* Return an arbitrarily high precedence to avoid surrounding single
2412 VAR_DECLs in ()s. */
2417 /* Return the priority of the operator OP. */
2420 op_prio (const_tree op
)
2422 enum tree_code code
;
2427 code
= TREE_CODE (op
);
2428 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
2429 return op_prio (TREE_OPERAND (op
, 0));
2431 return op_code_prio (code
);
2434 /* Return the symbol associated with operator CODE. */
2437 op_symbol_code (enum tree_code code
)
2445 case TRUTH_ORIF_EXPR
:
2448 case TRUTH_AND_EXPR
:
2449 case TRUTH_ANDIF_EXPR
:
2455 case TRUTH_XOR_EXPR
:
2465 case UNORDERED_EXPR
:
2511 case VEC_LSHIFT_EXPR
:
2514 case VEC_RSHIFT_EXPR
:
2517 case POINTER_PLUS_EXPR
:
2523 case REDUC_PLUS_EXPR
:
2526 case WIDEN_SUM_EXPR
:
2529 case WIDEN_MULT_EXPR
:
2539 case TRUTH_NOT_EXPR
:
2546 case ALIGN_INDIRECT_REF
:
2549 case MISALIGNED_INDIRECT_REF
:
2552 case TRUNC_DIV_EXPR
:
2559 case FLOOR_DIV_EXPR
:
2562 case ROUND_DIV_EXPR
:
2565 case EXACT_DIV_EXPR
:
2568 case TRUNC_MOD_EXPR
:
2574 case FLOOR_MOD_EXPR
:
2577 case ROUND_MOD_EXPR
:
2580 case PREDECREMENT_EXPR
:
2583 case PREINCREMENT_EXPR
:
2586 case POSTDECREMENT_EXPR
:
2589 case POSTINCREMENT_EXPR
:
2599 return "<<< ??? >>>";
2603 /* Return the symbol associated with operator OP. */
2606 op_symbol (const_tree op
)
2608 return op_symbol_code (TREE_CODE (op
));
2611 /* Prints the name of a CALL_EXPR. */
2614 print_call_name (pretty_printer
*buffer
, const_tree node
)
2618 gcc_assert (TREE_CODE (node
) == CALL_EXPR
);
2620 op0
= CALL_EXPR_FN (node
);
2622 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
2623 op0
= TREE_OPERAND (op0
, 0);
2625 switch (TREE_CODE (op0
))
2629 dump_function_name (buffer
, op0
);
2635 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2639 pp_string (buffer
, "(");
2640 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2641 pp_string (buffer
, ") ? ");
2642 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, 0, false);
2643 pp_string (buffer
, " : ");
2644 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, 0, false);
2648 /* The function is a pointer contained in a structure. */
2649 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == INDIRECT_REF
||
2650 TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2651 dump_function_name (buffer
, TREE_OPERAND (op0
, 1));
2653 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2655 We can have several levels of structures and a function
2656 pointer inside. This is not implemented yet... */
2661 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2662 dump_function_name (buffer
, TREE_OPERAND (op0
, 0));
2664 dump_generic_node (buffer
, op0
, 0, 0, false);
2669 dump_generic_node (buffer
, op0
, 0, 0, false);
2677 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2680 pretty_print_string (pretty_printer
*buffer
, const char *str
)
2690 pp_string (buffer
, "\\b");
2694 pp_string (buffer
, "\\f");
2698 pp_string (buffer
, "\\n");
2702 pp_string (buffer
, "\\r");
2706 pp_string (buffer
, "\\t");
2710 pp_string (buffer
, "\\v");
2714 pp_string (buffer
, "\\\\");
2718 pp_string (buffer
, "\\\"");
2722 pp_string (buffer
, "\\'");
2725 /* No need to handle \0; the loop terminates on \0. */
2728 pp_string (buffer
, "\\1");
2732 pp_string (buffer
, "\\2");
2736 pp_string (buffer
, "\\3");
2740 pp_string (buffer
, "\\4");
2744 pp_string (buffer
, "\\5");
2748 pp_string (buffer
, "\\6");
2752 pp_string (buffer
, "\\7");
2756 pp_character (buffer
, str
[0]);
2764 maybe_init_pretty_print (FILE *file
)
2768 pp_construct (&buffer
, /* prefix */NULL
, /* line-width */0);
2769 pp_needs_newline (&buffer
) = true;
2773 buffer
.buffer
->stream
= file
;
2777 newline_and_indent (pretty_printer
*buffer
, int spc
)
2779 pp_newline (buffer
);