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);
495 if (TREE_VEC_LENGTH (node
) > 0)
497 size_t len
= TREE_VEC_LENGTH (node
);
498 for (i
= 0; i
< len
- 1; i
++)
500 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
502 pp_character (buffer
, ',');
505 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
514 case FIXED_POINT_TYPE
:
520 unsigned int quals
= TYPE_QUALS (node
);
521 enum tree_code_class tclass
;
523 if (quals
& TYPE_QUAL_CONST
)
524 pp_string (buffer
, "const ");
525 else if (quals
& TYPE_QUAL_VOLATILE
)
526 pp_string (buffer
, "volatile ");
527 else if (quals
& TYPE_QUAL_RESTRICT
)
528 pp_string (buffer
, "restrict ");
530 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
532 if (tclass
== tcc_declaration
)
534 if (DECL_NAME (node
))
535 dump_decl_name (buffer
, node
, flags
);
537 pp_string (buffer
, "<unnamed type decl>");
539 else if (tclass
== tcc_type
)
541 if (TYPE_NAME (node
))
543 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
544 pp_tree_identifier (buffer
, TYPE_NAME (node
));
545 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
546 && DECL_NAME (TYPE_NAME (node
)))
547 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
549 pp_string (buffer
, "<unnamed type>");
551 else if (TREE_CODE (node
) == VECTOR_TYPE
)
553 pp_string (buffer
, "vector ");
554 dump_generic_node (buffer
, TREE_TYPE (node
),
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
, ">");
566 pp_string (buffer
, "<unnamed type>");
573 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
575 if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
577 tree fnode
= TREE_TYPE (node
);
579 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
581 pp_character (buffer
, '(');
582 pp_string (buffer
, str
);
583 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
584 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
586 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
588 pp_character (buffer
, ')');
589 dump_function_declaration (buffer
, fnode
, spc
, flags
);
593 unsigned int quals
= TYPE_QUALS (node
);
595 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
597 pp_string (buffer
, str
);
599 if (quals
& TYPE_QUAL_CONST
)
600 pp_string (buffer
, " const");
601 if (quals
& TYPE_QUAL_VOLATILE
)
602 pp_string (buffer
, " volatile");
603 if (quals
& TYPE_QUAL_RESTRICT
)
604 pp_string (buffer
, " restrict");
606 if (TYPE_REF_CAN_ALIAS_ALL (node
))
607 pp_string (buffer
, " {ref-all}");
616 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)), flags
);
617 pp_string (buffer
, "::");
622 const char *sep
= "";
625 pp_string (buffer
, "MEM[");
627 tmp
= TMR_SYMBOL (node
);
630 pp_string (buffer
, sep
);
632 pp_string (buffer
, "symbol: ");
633 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
635 tmp
= TMR_BASE (node
);
638 pp_string (buffer
, sep
);
640 pp_string (buffer
, "base: ");
641 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
643 tmp
= TMR_INDEX (node
);
646 pp_string (buffer
, sep
);
648 pp_string (buffer
, "index: ");
649 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
651 tmp
= TMR_STEP (node
);
654 pp_string (buffer
, sep
);
656 pp_string (buffer
, "step: ");
657 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
659 tmp
= TMR_OFFSET (node
);
662 pp_string (buffer
, sep
);
664 pp_string (buffer
, "offset: ");
665 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
667 pp_string (buffer
, "]");
668 if (flags
& TDF_DETAILS
)
670 pp_string (buffer
, "{");
671 dump_generic_node (buffer
, TMR_ORIGINAL (node
), spc
, flags
,
673 pp_string (buffer
, "}");
682 /* Print the innermost component type. */
683 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
684 tmp
= TREE_TYPE (tmp
))
686 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
688 /* Print the dimensions. */
689 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
690 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
696 case QUAL_UNION_TYPE
:
698 unsigned int quals
= TYPE_QUALS (node
);
700 if (quals
& TYPE_QUAL_CONST
)
701 pp_string (buffer
, "const ");
702 if (quals
& TYPE_QUAL_VOLATILE
)
703 pp_string (buffer
, "volatile ");
705 /* Print the name of the structure. */
706 if (TREE_CODE (node
) == RECORD_TYPE
)
707 pp_string (buffer
, "struct ");
708 else if (TREE_CODE (node
) == UNION_TYPE
)
709 pp_string (buffer
, "union ");
711 if (TYPE_NAME (node
))
712 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
714 print_struct_decl (buffer
, node
, spc
, flags
);
723 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
725 /* In the case of a pointer, one may want to divide by the
726 size of the pointed-to type. Unfortunately, this not
727 straightforward. The C front-end maps expressions
732 in such a way that the two INTEGER_CST nodes for "5" have
733 different values but identical types. In the latter
734 case, the 5 is multiplied by sizeof (int) in c-common.c
735 (pointer_int_sum) to convert it to a byte address, and
736 yet the type of the node is left unchanged. Argh. What
737 is consistent though is that the number value corresponds
738 to bytes (UNITS) offset.
740 NB: Neither of the following divisors can be trivially
741 used to recover the original literal:
743 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
744 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
745 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
746 pp_string (buffer
, "B"); /* pseudo-unit */
748 else if (! host_integerp (node
, 0))
751 unsigned HOST_WIDE_INT low
= TREE_INT_CST_LOW (val
);
752 HOST_WIDE_INT high
= TREE_INT_CST_HIGH (val
);
754 if (tree_int_cst_sgn (val
) < 0)
756 pp_character (buffer
, '-');
760 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
762 sprintf (pp_buffer (buffer
)->digit_buffer
,
763 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
764 (unsigned HOST_WIDE_INT
) high
, low
);
765 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
768 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
772 /* Code copied from print_node. */
775 if (TREE_OVERFLOW (node
))
776 pp_string (buffer
, " overflow");
778 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
779 d
= TREE_REAL_CST (node
);
780 if (REAL_VALUE_ISINF (d
))
781 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
782 else if (REAL_VALUE_ISNAN (d
))
783 pp_string (buffer
, " Nan");
787 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
788 pp_string (buffer
, string
);
793 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
794 pp_string (buffer
, "0x");
795 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
796 output_formatted_integer (buffer
, "%02x", *p
++);
805 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
806 pp_string (buffer
, string
);
811 pp_string (buffer
, "__complex__ (");
812 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
813 pp_string (buffer
, ", ");
814 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
815 pp_string (buffer
, ")");
819 pp_string (buffer
, "\"");
820 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
821 pp_string (buffer
, "\"");
827 pp_string (buffer
, "{ ");
828 for (elt
= TREE_VECTOR_CST_ELTS (node
); elt
; elt
= TREE_CHAIN (elt
))
830 dump_generic_node (buffer
, TREE_VALUE (elt
), spc
, flags
, false);
831 if (TREE_CHAIN (elt
))
832 pp_string (buffer
, ", ");
834 pp_string (buffer
, " }");
843 dump_decl_name (buffer
, node
, flags
);
847 if (DECL_NAME (node
))
848 dump_decl_name (buffer
, node
, flags
);
849 else if (LABEL_DECL_UID (node
) != -1)
850 pp_printf (buffer
, "<L%d>", (int) LABEL_DECL_UID (node
));
852 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
856 if (DECL_IS_BUILTIN (node
))
858 /* Don't print the declaration of built-in types. */
861 if (DECL_NAME (node
))
862 dump_decl_name (buffer
, node
, flags
);
865 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
866 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
867 && TYPE_METHODS (TREE_TYPE (node
)))
869 /* The type is a c++ class: all structures have at least
871 pp_string (buffer
, "class ");
872 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
877 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
878 ? "union" : "struct "));
879 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
888 dump_decl_name (buffer
, node
, flags
);
892 pp_string (buffer
, "<retval>");
896 op0
= TREE_OPERAND (node
, 0);
898 if (TREE_CODE (op0
) == INDIRECT_REF
)
900 op0
= TREE_OPERAND (op0
, 0);
903 if (op_prio (op0
) < op_prio (node
))
904 pp_character (buffer
, '(');
905 dump_generic_node (buffer
, op0
, spc
, flags
, false);
906 if (op_prio (op0
) < op_prio (node
))
907 pp_character (buffer
, ')');
908 pp_string (buffer
, str
);
909 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
910 op0
= component_ref_field_offset (node
);
911 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
913 pp_string (buffer
, "{off: ");
914 dump_generic_node (buffer
, op0
, spc
, flags
, false);
915 pp_character (buffer
, '}');
920 pp_string (buffer
, "BIT_FIELD_REF <");
921 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
922 pp_string (buffer
, ", ");
923 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
924 pp_string (buffer
, ", ");
925 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
926 pp_string (buffer
, ">");
930 case ARRAY_RANGE_REF
:
931 op0
= TREE_OPERAND (node
, 0);
932 if (op_prio (op0
) < op_prio (node
))
933 pp_character (buffer
, '(');
934 dump_generic_node (buffer
, op0
, spc
, flags
, false);
935 if (op_prio (op0
) < op_prio (node
))
936 pp_character (buffer
, ')');
937 pp_character (buffer
, '[');
938 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
939 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
940 pp_string (buffer
, " ...");
941 pp_character (buffer
, ']');
943 op0
= array_ref_low_bound (node
);
944 op1
= array_ref_element_size (node
);
946 if (!integer_zerop (op0
)
947 || TREE_OPERAND (node
, 2)
948 || TREE_OPERAND (node
, 3))
950 pp_string (buffer
, "{lb: ");
951 dump_generic_node (buffer
, op0
, spc
, flags
, false);
952 pp_string (buffer
, " sz: ");
953 dump_generic_node (buffer
, op1
, spc
, flags
, false);
954 pp_character (buffer
, '}');
960 unsigned HOST_WIDE_INT ix
;
962 bool is_struct_init
= FALSE
;
963 pp_character (buffer
, '{');
964 if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
965 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
966 is_struct_init
= TRUE
;
967 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
969 if (field
&& is_struct_init
)
971 pp_character (buffer
, '.');
972 dump_generic_node (buffer
, field
, spc
, flags
, false);
973 pp_string (buffer
, "=");
975 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
976 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
977 val
= TREE_OPERAND (val
, 0);
978 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
979 dump_decl_name (buffer
, val
, flags
);
981 dump_generic_node (buffer
, val
, spc
, flags
, false);
982 if (ix
!= VEC_length (constructor_elt
, CONSTRUCTOR_ELTS (node
)) - 1)
984 pp_character (buffer
, ',');
988 pp_character (buffer
, '}');
995 if (flags
& TDF_SLIM
)
997 pp_string (buffer
, "<COMPOUND_EXPR>");
1001 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1002 spc
, flags
, !(flags
& TDF_SLIM
));
1003 if (flags
& TDF_SLIM
)
1004 newline_and_indent (buffer
, spc
);
1007 pp_character (buffer
, ',');
1011 for (tp
= &TREE_OPERAND (node
, 1);
1012 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1013 tp
= &TREE_OPERAND (*tp
, 1))
1015 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1016 spc
, flags
, !(flags
& TDF_SLIM
));
1017 if (flags
& TDF_SLIM
)
1018 newline_and_indent (buffer
, spc
);
1021 pp_character (buffer
, ',');
1026 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1030 case STATEMENT_LIST
:
1032 tree_stmt_iterator si
;
1035 if (flags
& TDF_SLIM
)
1037 pp_string (buffer
, "<STATEMENT_LIST>");
1041 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1044 newline_and_indent (buffer
, spc
);
1047 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1054 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
,
1057 pp_character (buffer
, '=');
1058 if (TREE_CODE (node
) == MODIFY_EXPR
1059 && MOVE_NONTEMPORAL (node
))
1060 pp_string (buffer
, "{nt}");
1062 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
,
1067 pp_string (buffer
, "TARGET_EXPR <");
1068 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1069 pp_character (buffer
, ',');
1071 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1072 pp_character (buffer
, '>');
1076 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1081 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1083 pp_string (buffer
, "if (");
1084 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1085 pp_character (buffer
, ')');
1086 /* The lowered cond_exprs should always be printed in full. */
1087 if (COND_EXPR_THEN (node
)
1088 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1089 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1090 && COND_EXPR_ELSE (node
)
1091 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1092 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1095 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1097 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1099 pp_string (buffer
, " else ");
1100 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1104 else if (!(flags
& TDF_SLIM
))
1106 /* Output COND_EXPR_THEN. */
1107 if (COND_EXPR_THEN (node
))
1109 newline_and_indent (buffer
, spc
+2);
1110 pp_character (buffer
, '{');
1111 newline_and_indent (buffer
, spc
+4);
1112 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1114 newline_and_indent (buffer
, spc
+2);
1115 pp_character (buffer
, '}');
1118 /* Output COND_EXPR_ELSE. */
1119 if (COND_EXPR_ELSE (node
)
1120 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1122 newline_and_indent (buffer
, spc
);
1123 pp_string (buffer
, "else");
1124 newline_and_indent (buffer
, spc
+2);
1125 pp_character (buffer
, '{');
1126 newline_and_indent (buffer
, spc
+4);
1127 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1129 newline_and_indent (buffer
, spc
+2);
1130 pp_character (buffer
, '}');
1137 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1139 pp_character (buffer
, '?');
1141 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1143 pp_character (buffer
, ':');
1145 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1150 pp_character (buffer
, '{');
1151 if (!(flags
& TDF_SLIM
))
1153 if (BIND_EXPR_VARS (node
))
1155 pp_newline (buffer
);
1157 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= TREE_CHAIN (op0
))
1159 print_declaration (buffer
, op0
, spc
+2, flags
);
1160 pp_newline (buffer
);
1164 newline_and_indent (buffer
, spc
+2);
1165 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1166 newline_and_indent (buffer
, spc
);
1167 pp_character (buffer
, '}');
1173 print_call_name (buffer
, node
);
1175 /* Print parameters. */
1177 pp_character (buffer
, '(');
1180 call_expr_arg_iterator iter
;
1181 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1183 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1184 if (more_call_expr_args_p (&iter
))
1186 pp_character (buffer
, ',');
1191 if (CALL_EXPR_VA_ARG_PACK (node
))
1193 if (call_expr_nargs (node
) > 0)
1195 pp_character (buffer
, ',');
1198 pp_string (buffer
, "__builtin_va_arg_pack ()");
1200 pp_character (buffer
, ')');
1202 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1205 pp_string (buffer
, " [static-chain: ");
1206 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1207 pp_character (buffer
, ']');
1210 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1211 pp_string (buffer
, " [return slot optimization]");
1212 if (CALL_EXPR_TAILCALL (node
))
1213 pp_string (buffer
, " [tail call]");
1216 case WITH_CLEANUP_EXPR
:
1220 case CLEANUP_POINT_EXPR
:
1221 pp_string (buffer
, "<<cleanup_point ");
1222 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1223 pp_string (buffer
, ">>");
1226 case PLACEHOLDER_EXPR
:
1227 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1228 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1229 pp_character (buffer
, '>');
1232 /* Binary arithmetic and logic expressions. */
1233 case WIDEN_SUM_EXPR
:
1234 case WIDEN_MULT_EXPR
:
1237 case POINTER_PLUS_EXPR
:
1239 case TRUNC_DIV_EXPR
:
1241 case FLOOR_DIV_EXPR
:
1242 case ROUND_DIV_EXPR
:
1243 case TRUNC_MOD_EXPR
:
1245 case FLOOR_MOD_EXPR
:
1246 case ROUND_MOD_EXPR
:
1248 case EXACT_DIV_EXPR
:
1253 case VEC_LSHIFT_EXPR
:
1254 case VEC_RSHIFT_EXPR
:
1258 case TRUTH_ANDIF_EXPR
:
1259 case TRUTH_ORIF_EXPR
:
1260 case TRUTH_AND_EXPR
:
1262 case TRUTH_XOR_EXPR
:
1276 case UNORDERED_EXPR
:
1278 const char *op
= op_symbol (node
);
1279 op0
= TREE_OPERAND (node
, 0);
1280 op1
= TREE_OPERAND (node
, 1);
1282 /* When the operands are expressions with less priority,
1283 keep semantics of the tree representation. */
1284 if (op_prio (op0
) <= op_prio (node
))
1286 pp_character (buffer
, '(');
1287 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1288 pp_character (buffer
, ')');
1291 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1294 pp_string (buffer
, op
);
1297 /* When the operands are expressions with less priority,
1298 keep semantics of the tree representation. */
1299 if (op_prio (op1
) <= op_prio (node
))
1301 pp_character (buffer
, '(');
1302 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1303 pp_character (buffer
, ')');
1306 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1310 /* Unary arithmetic and logic expressions. */
1313 case TRUTH_NOT_EXPR
:
1315 case PREDECREMENT_EXPR
:
1316 case PREINCREMENT_EXPR
:
1317 case ALIGN_INDIRECT_REF
:
1318 case MISALIGNED_INDIRECT_REF
:
1320 if (TREE_CODE (node
) == ADDR_EXPR
1321 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
1322 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
1323 ; /* Do not output '&' for strings and function pointers. */
1325 pp_string (buffer
, op_symbol (node
));
1327 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1329 pp_character (buffer
, '(');
1330 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1331 pp_character (buffer
, ')');
1334 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1336 if (TREE_CODE (node
) == MISALIGNED_INDIRECT_REF
)
1338 pp_string (buffer
, "{misalignment: ");
1339 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1340 pp_character (buffer
, '}');
1344 case POSTDECREMENT_EXPR
:
1345 case POSTINCREMENT_EXPR
:
1346 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1348 pp_character (buffer
, '(');
1349 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1350 pp_character (buffer
, ')');
1353 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1354 pp_string (buffer
, op_symbol (node
));
1358 pp_string (buffer
, "MIN_EXPR <");
1359 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1360 pp_string (buffer
, ", ");
1361 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1362 pp_character (buffer
, '>');
1366 pp_string (buffer
, "MAX_EXPR <");
1367 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1368 pp_string (buffer
, ", ");
1369 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1370 pp_character (buffer
, '>');
1374 pp_string (buffer
, "ABS_EXPR <");
1375 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1376 pp_character (buffer
, '>');
1383 case FIXED_CONVERT_EXPR
:
1384 case FIX_TRUNC_EXPR
:
1387 type
= TREE_TYPE (node
);
1388 op0
= TREE_OPERAND (node
, 0);
1389 if (type
!= TREE_TYPE (op0
))
1391 pp_character (buffer
, '(');
1392 dump_generic_node (buffer
, type
, spc
, flags
, false);
1393 pp_string (buffer
, ") ");
1395 if (op_prio (op0
) < op_prio (node
))
1396 pp_character (buffer
, '(');
1397 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1398 if (op_prio (op0
) < op_prio (node
))
1399 pp_character (buffer
, ')');
1402 case VIEW_CONVERT_EXPR
:
1403 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
1404 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1405 pp_string (buffer
, ">(");
1406 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1407 pp_character (buffer
, ')');
1411 pp_string (buffer
, "((");
1412 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1413 pp_string (buffer
, "))");
1416 case NON_LVALUE_EXPR
:
1417 pp_string (buffer
, "NON_LVALUE_EXPR <");
1418 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1419 pp_character (buffer
, '>');
1423 pp_string (buffer
, "SAVE_EXPR <");
1424 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1425 pp_character (buffer
, '>');
1429 pp_string (buffer
, "COMPLEX_EXPR <");
1430 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1431 pp_string (buffer
, ", ");
1432 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1433 pp_string (buffer
, ">");
1437 pp_string (buffer
, "CONJ_EXPR <");
1438 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1439 pp_string (buffer
, ">");
1443 pp_string (buffer
, "REALPART_EXPR <");
1444 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1445 pp_string (buffer
, ">");
1449 pp_string (buffer
, "IMAGPART_EXPR <");
1450 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1451 pp_string (buffer
, ">");
1455 pp_string (buffer
, "VA_ARG_EXPR <");
1456 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1457 pp_string (buffer
, ">");
1460 case TRY_FINALLY_EXPR
:
1461 case TRY_CATCH_EXPR
:
1462 pp_string (buffer
, "try");
1463 newline_and_indent (buffer
, spc
+2);
1464 pp_string (buffer
, "{");
1465 newline_and_indent (buffer
, spc
+4);
1466 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
1467 newline_and_indent (buffer
, spc
+2);
1468 pp_string (buffer
, "}");
1469 newline_and_indent (buffer
, spc
);
1471 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
1472 newline_and_indent (buffer
, spc
+2);
1473 pp_string (buffer
, "{");
1474 newline_and_indent (buffer
, spc
+4);
1475 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
1476 newline_and_indent (buffer
, spc
+2);
1477 pp_string (buffer
, "}");
1482 pp_string (buffer
, "catch (");
1483 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
1484 pp_string (buffer
, ")");
1485 newline_and_indent (buffer
, spc
+2);
1486 pp_string (buffer
, "{");
1487 newline_and_indent (buffer
, spc
+4);
1488 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
1489 newline_and_indent (buffer
, spc
+2);
1490 pp_string (buffer
, "}");
1494 case EH_FILTER_EXPR
:
1495 pp_string (buffer
, "<<<eh_filter (");
1496 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
1497 pp_string (buffer
, ")>>>");
1498 newline_and_indent (buffer
, spc
+2);
1499 pp_string (buffer
, "{");
1500 newline_and_indent (buffer
, spc
+4);
1501 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
1502 newline_and_indent (buffer
, spc
+2);
1503 pp_string (buffer
, "}");
1507 case CHANGE_DYNAMIC_TYPE_EXPR
:
1508 pp_string (buffer
, "<<<change_dynamic_type (");
1509 dump_generic_node (buffer
, CHANGE_DYNAMIC_TYPE_NEW_TYPE (node
), spc
+ 2,
1511 pp_string (buffer
, ") ");
1512 dump_generic_node (buffer
, CHANGE_DYNAMIC_TYPE_LOCATION (node
), spc
+ 2,
1514 pp_string (buffer
, ")>>>");
1519 op0
= TREE_OPERAND (node
, 0);
1520 /* If this is for break or continue, don't bother printing it. */
1521 if (DECL_NAME (op0
))
1523 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1524 if (strcmp (name
, "break") == 0
1525 || strcmp (name
, "continue") == 0)
1528 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1529 pp_character (buffer
, ':');
1530 if (DECL_NONLOCAL (op0
))
1531 pp_string (buffer
, " [non-local]");
1535 pp_string (buffer
, "<<<exception object>>>");
1539 pp_string (buffer
, "<<<filter object>>>");
1543 pp_string (buffer
, "while (1)");
1544 if (!(flags
& TDF_SLIM
))
1546 newline_and_indent (buffer
, spc
+2);
1547 pp_character (buffer
, '{');
1548 newline_and_indent (buffer
, spc
+4);
1549 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
1550 newline_and_indent (buffer
, spc
+2);
1551 pp_character (buffer
, '}');
1557 pp_string (buffer
, "// predicted ");
1558 if (PREDICT_EXPR_OUTCOME (node
))
1559 pp_string (buffer
, "likely by ");
1561 pp_string (buffer
, "unlikely by ");
1562 pp_string (buffer
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
1563 pp_string (buffer
, " predictor.");
1567 pp_string (buffer
, "return");
1568 op0
= TREE_OPERAND (node
, 0);
1572 if (TREE_CODE (op0
) == MODIFY_EXPR
)
1573 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1),
1576 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1581 pp_string (buffer
, "if (");
1582 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1583 pp_string (buffer
, ") break");
1587 pp_string (buffer
, "switch (");
1588 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
1589 pp_character (buffer
, ')');
1590 if (!(flags
& TDF_SLIM
))
1592 newline_and_indent (buffer
, spc
+2);
1593 pp_character (buffer
, '{');
1594 if (SWITCH_BODY (node
))
1596 newline_and_indent (buffer
, spc
+4);
1597 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
1602 tree vec
= SWITCH_LABELS (node
);
1603 size_t i
, n
= TREE_VEC_LENGTH (vec
);
1604 for (i
= 0; i
< n
; ++i
)
1606 tree elt
= TREE_VEC_ELT (vec
, i
);
1607 newline_and_indent (buffer
, spc
+4);
1610 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
1611 pp_string (buffer
, " goto ");
1612 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
1614 pp_semicolon (buffer
);
1617 pp_string (buffer
, "case ???: goto ???;");
1620 newline_and_indent (buffer
, spc
+2);
1621 pp_character (buffer
, '}');
1627 op0
= GOTO_DESTINATION (node
);
1628 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
1630 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1631 if (strcmp (name
, "break") == 0
1632 || strcmp (name
, "continue") == 0)
1634 pp_string (buffer
, name
);
1638 pp_string (buffer
, "goto ");
1639 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1643 pp_string (buffer
, "resx ");
1644 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1648 pp_string (buffer
, "__asm__");
1649 if (ASM_VOLATILE_P (node
))
1650 pp_string (buffer
, " __volatile__");
1651 pp_character (buffer
, '(');
1652 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
1653 pp_character (buffer
, ':');
1654 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
1655 pp_character (buffer
, ':');
1656 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
1657 if (ASM_CLOBBERS (node
))
1659 pp_character (buffer
, ':');
1660 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
1662 pp_string (buffer
, ")");
1665 case CASE_LABEL_EXPR
:
1666 if (CASE_LOW (node
) && CASE_HIGH (node
))
1668 pp_string (buffer
, "case ");
1669 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1670 pp_string (buffer
, " ... ");
1671 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
1673 else if (CASE_LOW (node
))
1675 pp_string (buffer
, "case ");
1676 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1679 pp_string (buffer
, "default");
1680 pp_character (buffer
, ':');
1684 pp_string (buffer
, "OBJ_TYPE_REF(");
1685 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
1686 pp_character (buffer
, ';');
1687 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
1688 pp_character (buffer
, '-');
1689 pp_character (buffer
, '>');
1690 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
1691 pp_character (buffer
, ')');
1695 dump_generic_node (buffer
, SSA_NAME_VAR (node
), spc
, flags
, false);
1696 pp_string (buffer
, "_");
1697 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
1698 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
1699 pp_string (buffer
, "(ab)");
1700 else if (SSA_NAME_IS_DEFAULT_DEF (node
))
1701 pp_string (buffer
, "(D)");
1704 case WITH_SIZE_EXPR
:
1705 pp_string (buffer
, "WITH_SIZE_EXPR <");
1706 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1707 pp_string (buffer
, ", ");
1708 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1709 pp_string (buffer
, ">");
1713 pp_string (buffer
, "ASSERT_EXPR <");
1714 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
1715 pp_string (buffer
, ", ");
1716 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
1717 pp_string (buffer
, ">");
1721 pp_string (buffer
, "scev_known");
1724 case SCEV_NOT_KNOWN
:
1725 pp_string (buffer
, "scev_not_known");
1728 case POLYNOMIAL_CHREC
:
1729 pp_string (buffer
, "{");
1730 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
1731 pp_string (buffer
, ", +, ");
1732 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
1733 pp_string (buffer
, "}_");
1734 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
1738 case REALIGN_LOAD_EXPR
:
1739 pp_string (buffer
, "REALIGN_LOAD <");
1740 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1741 pp_string (buffer
, ", ");
1742 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1743 pp_string (buffer
, ", ");
1744 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1745 pp_string (buffer
, ">");
1749 pp_string (buffer
, " VEC_COND_EXPR < ");
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
, " DOT_PROD_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
, "#pragma omp parallel");
1770 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
1773 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
1775 newline_and_indent (buffer
, spc
+ 2);
1776 pp_character (buffer
, '{');
1777 newline_and_indent (buffer
, spc
+ 4);
1778 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
1779 newline_and_indent (buffer
, spc
+ 2);
1780 pp_character (buffer
, '}');
1786 pp_string (buffer
, "#pragma omp task");
1787 dump_omp_clauses (buffer
, OMP_TASK_CLAUSES (node
), spc
, flags
);
1791 pp_string (buffer
, "#pragma omp for");
1792 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
1794 if (!(flags
& TDF_SLIM
))
1798 if (OMP_FOR_PRE_BODY (node
))
1800 newline_and_indent (buffer
, spc
+ 2);
1801 pp_character (buffer
, '{');
1803 newline_and_indent (buffer
, spc
);
1804 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
1808 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
1811 newline_and_indent (buffer
, spc
);
1812 pp_string (buffer
, "for (");
1813 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
1815 pp_string (buffer
, "; ");
1816 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
1818 pp_string (buffer
, "; ");
1819 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
1821 pp_string (buffer
, ")");
1823 if (OMP_FOR_BODY (node
))
1825 newline_and_indent (buffer
, spc
+ 2);
1826 pp_character (buffer
, '{');
1827 newline_and_indent (buffer
, spc
+ 4);
1828 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
1830 newline_and_indent (buffer
, spc
+ 2);
1831 pp_character (buffer
, '}');
1833 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
1834 if (OMP_FOR_PRE_BODY (node
))
1837 newline_and_indent (buffer
, spc
+ 2);
1838 pp_character (buffer
, '}');
1845 pp_string (buffer
, "#pragma omp sections");
1846 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
1850 pp_string (buffer
, "#pragma omp section");
1854 pp_string (buffer
, "#pragma omp master");
1858 pp_string (buffer
, "#pragma omp ordered");
1862 pp_string (buffer
, "#pragma omp critical");
1863 if (OMP_CRITICAL_NAME (node
))
1866 pp_character (buffer
, '(');
1867 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
1869 pp_character (buffer
, ')');
1874 pp_string (buffer
, "#pragma omp atomic");
1875 newline_and_indent (buffer
, spc
+ 2);
1876 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1878 pp_character (buffer
, '=');
1880 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1884 pp_string (buffer
, "#pragma omp single");
1885 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
1889 dump_omp_clause (buffer
, node
, spc
, flags
);
1893 case REDUC_MAX_EXPR
:
1894 pp_string (buffer
, " REDUC_MAX_EXPR < ");
1895 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1896 pp_string (buffer
, " > ");
1899 case REDUC_MIN_EXPR
:
1900 pp_string (buffer
, " REDUC_MIN_EXPR < ");
1901 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1902 pp_string (buffer
, " > ");
1905 case REDUC_PLUS_EXPR
:
1906 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
1907 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1908 pp_string (buffer
, " > ");
1911 case VEC_WIDEN_MULT_HI_EXPR
:
1912 pp_string (buffer
, " VEC_WIDEN_MULT_HI_EXPR < ");
1913 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1914 pp_string (buffer
, ", ");
1915 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1916 pp_string (buffer
, " > ");
1919 case VEC_WIDEN_MULT_LO_EXPR
:
1920 pp_string (buffer
, " VEC_WIDEN_MULT_LO_EXPR < ");
1921 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1922 pp_string (buffer
, ", ");
1923 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1924 pp_string (buffer
, " > ");
1927 case VEC_UNPACK_HI_EXPR
:
1928 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
1929 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1930 pp_string (buffer
, " > ");
1933 case VEC_UNPACK_LO_EXPR
:
1934 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
1935 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1936 pp_string (buffer
, " > ");
1939 case VEC_UNPACK_FLOAT_HI_EXPR
:
1940 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
1941 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1942 pp_string (buffer
, " > ");
1945 case VEC_UNPACK_FLOAT_LO_EXPR
:
1946 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
1947 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1948 pp_string (buffer
, " > ");
1951 case VEC_PACK_TRUNC_EXPR
:
1952 pp_string (buffer
, " VEC_PACK_TRUNC_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_PACK_SAT_EXPR
:
1960 pp_string (buffer
, " VEC_PACK_SAT_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_PACK_FIX_TRUNC_EXPR
:
1968 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
1969 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1970 pp_string (buffer
, ", ");
1971 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1972 pp_string (buffer
, " > ");
1978 pp_string (buffer
, "BLOCK");
1980 if (BLOCK_ABSTRACT (node
))
1981 pp_string (buffer
, " [abstract]");
1983 if (TREE_ASM_WRITTEN (node
))
1984 pp_string (buffer
, " [written]");
1986 newline_and_indent (buffer
, spc
+ 2);
1988 if (BLOCK_SUPERCONTEXT (node
))
1990 pp_string (buffer
, "SUPERCONTEXT: ");
1991 if (TREE_CODE (BLOCK_SUPERCONTEXT (node
)) == BLOCK
)
1992 pp_printf (buffer
, "BLOCK %p",
1993 (void *)BLOCK_SUPERCONTEXT (node
));
1995 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (node
), 0, flags
,
1997 newline_and_indent (buffer
, spc
+ 2);
2000 if (BLOCK_SUBBLOCKS (node
))
2002 pp_string (buffer
, "SUBBLOCKS: ");
2003 for (t
= BLOCK_SUBBLOCKS (node
); t
; t
= BLOCK_CHAIN (t
))
2004 pp_printf (buffer
, "%p ", (void *)t
);
2005 newline_and_indent (buffer
, spc
+ 2);
2008 if (BLOCK_VARS (node
))
2010 pp_string (buffer
, "VARS: ");
2011 for (t
= BLOCK_VARS (node
); t
; t
= TREE_CHAIN (t
))
2013 dump_generic_node (buffer
, t
, 0, flags
, false);
2014 pp_string (buffer
, " ");
2016 newline_and_indent (buffer
, spc
+ 2);
2019 if (BLOCK_ABSTRACT_ORIGIN (node
))
2021 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
2022 if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node
)) == BLOCK
)
2023 pp_printf (buffer
, "BLOCK %p",
2024 (void *)BLOCK_ABSTRACT_ORIGIN (node
));
2026 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (node
), 0, flags
,
2028 newline_and_indent (buffer
, spc
+ 2);
2033 case VEC_EXTRACT_EVEN_EXPR
:
2034 pp_string (buffer
, " VEC_EXTRACT_EVEN_EXPR < ");
2035 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2036 pp_string (buffer
, ", ");
2037 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2038 pp_string (buffer
, " > ");
2041 case VEC_EXTRACT_ODD_EXPR
:
2042 pp_string (buffer
, " VEC_EXTRACT_ODD_EXPR < ");
2043 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2044 pp_string (buffer
, ", ");
2045 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2046 pp_string (buffer
, " > ");
2049 case VEC_INTERLEAVE_HIGH_EXPR
:
2050 pp_string (buffer
, " VEC_INTERLEAVE_HIGH_EXPR < ");
2051 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2052 pp_string (buffer
, ", ");
2053 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2054 pp_string (buffer
, " > ");
2057 case VEC_INTERLEAVE_LOW_EXPR
:
2058 pp_string (buffer
, " VEC_INTERLEAVE_LOW_EXPR < ");
2059 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2060 pp_string (buffer
, ", ");
2061 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2062 pp_string (buffer
, " > ");
2069 if (is_stmt
&& is_expr
)
2070 pp_semicolon (buffer
);
2072 /* If we're building a diagnostic, the formatted text will be written
2073 into BUFFER's stream by the caller; otherwise, write it now. */
2074 if (!(flags
& TDF_DIAGNOSTIC
))
2075 pp_write_text_to_stream (buffer
);
2080 /* Print the declaration of a variable. */
2083 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2087 if (TREE_CODE (t
) == TYPE_DECL
)
2088 pp_string (buffer
, "typedef ");
2090 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2091 pp_string (buffer
, "register ");
2093 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2094 pp_string (buffer
, "extern ");
2095 else if (TREE_STATIC (t
))
2096 pp_string (buffer
, "static ");
2098 /* Print the type and name. */
2099 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2103 /* Print array's type. */
2104 tmp
= TREE_TYPE (t
);
2105 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2106 tmp
= TREE_TYPE (tmp
);
2107 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2109 /* Print variable's name. */
2111 dump_generic_node (buffer
, t
, spc
, flags
, false);
2113 /* Print the dimensions. */
2114 tmp
= TREE_TYPE (t
);
2115 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2117 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2118 tmp
= TREE_TYPE (tmp
);
2121 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2123 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2125 dump_decl_name (buffer
, t
, flags
);
2126 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2130 /* Print type declaration. */
2131 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2133 /* Print variable's name. */
2135 dump_generic_node (buffer
, t
, spc
, flags
, false);
2138 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2140 pp_string (buffer
, " __asm__ ");
2141 pp_character (buffer
, '(');
2142 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2143 pp_character (buffer
, ')');
2146 /* The initial value of a function serves to determine whether the function
2147 is declared or defined. So the following does not apply to function
2149 if (TREE_CODE (t
) != FUNCTION_DECL
)
2151 /* Print the initial value. */
2152 if (DECL_INITIAL (t
))
2155 pp_character (buffer
, '=');
2157 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2161 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2163 pp_string (buffer
, " [value-expr: ");
2164 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2165 pp_character (buffer
, ']');
2168 pp_character (buffer
, ';');
2172 /* Prints a structure: name, fields, and methods.
2173 FIXME: Still incomplete. */
2176 print_struct_decl (pretty_printer
*buffer
, const_tree node
, int spc
, int flags
)
2178 /* Print the name of the structure. */
2179 if (TYPE_NAME (node
))
2182 if (TREE_CODE (node
) == RECORD_TYPE
)
2183 pp_string (buffer
, "struct ");
2184 else if ((TREE_CODE (node
) == UNION_TYPE
2185 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
2186 pp_string (buffer
, "union ");
2188 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
2191 /* Print the contents of the structure. */
2192 pp_newline (buffer
);
2194 pp_character (buffer
, '{');
2195 pp_newline (buffer
);
2197 /* Print the fields of the structure. */
2200 tmp
= TYPE_FIELDS (node
);
2203 /* Avoid to print recursively the structure. */
2204 /* FIXME : Not implemented correctly...,
2205 what about the case when we have a cycle in the contain graph? ...
2206 Maybe this could be solved by looking at the scope in which the
2207 structure was declared. */
2208 if (TREE_TYPE (tmp
) != node
2209 || (TREE_CODE (TREE_TYPE (tmp
)) == POINTER_TYPE
2210 && TREE_TYPE (TREE_TYPE (tmp
)) != node
))
2212 print_declaration (buffer
, tmp
, spc
+2, flags
);
2213 pp_newline (buffer
);
2215 tmp
= TREE_CHAIN (tmp
);
2219 pp_character (buffer
, '}');
2222 /* Return the priority of the operator CODE.
2224 From lowest to highest precedence with either left-to-right (L-R)
2225 or right-to-left (R-L) associativity]:
2228 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2240 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2241 15 [L-R] fn() [] -> .
2243 unary +, - and * have higher precedence than the corresponding binary
2247 op_code_prio (enum tree_code code
)
2264 case TRUTH_ORIF_EXPR
:
2267 case TRUTH_AND_EXPR
:
2268 case TRUTH_ANDIF_EXPR
:
2275 case TRUTH_XOR_EXPR
:
2292 case UNORDERED_EXPR
:
2305 case WIDEN_SUM_EXPR
:
2307 case POINTER_PLUS_EXPR
:
2311 case VEC_WIDEN_MULT_HI_EXPR
:
2312 case VEC_WIDEN_MULT_LO_EXPR
:
2313 case WIDEN_MULT_EXPR
:
2316 case TRUNC_DIV_EXPR
:
2318 case FLOOR_DIV_EXPR
:
2319 case ROUND_DIV_EXPR
:
2321 case EXACT_DIV_EXPR
:
2322 case TRUNC_MOD_EXPR
:
2324 case FLOOR_MOD_EXPR
:
2325 case ROUND_MOD_EXPR
:
2328 case TRUTH_NOT_EXPR
:
2330 case POSTINCREMENT_EXPR
:
2331 case POSTDECREMENT_EXPR
:
2332 case PREINCREMENT_EXPR
:
2333 case PREDECREMENT_EXPR
:
2335 case ALIGN_INDIRECT_REF
:
2336 case MISALIGNED_INDIRECT_REF
:
2341 case FIX_TRUNC_EXPR
:
2347 case ARRAY_RANGE_REF
:
2351 /* Special expressions. */
2357 case REDUC_MAX_EXPR
:
2358 case REDUC_MIN_EXPR
:
2359 case REDUC_PLUS_EXPR
:
2360 case VEC_LSHIFT_EXPR
:
2361 case VEC_RSHIFT_EXPR
:
2362 case VEC_UNPACK_HI_EXPR
:
2363 case VEC_UNPACK_LO_EXPR
:
2364 case VEC_UNPACK_FLOAT_HI_EXPR
:
2365 case VEC_UNPACK_FLOAT_LO_EXPR
:
2366 case VEC_PACK_TRUNC_EXPR
:
2367 case VEC_PACK_SAT_EXPR
:
2371 /* Return an arbitrarily high precedence to avoid surrounding single
2372 VAR_DECLs in ()s. */
2377 /* Return the priority of the operator OP. */
2380 op_prio (const_tree op
)
2382 enum tree_code code
;
2387 code
= TREE_CODE (op
);
2388 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
2389 return op_prio (TREE_OPERAND (op
, 0));
2391 return op_code_prio (code
);
2394 /* Return the symbol associated with operator CODE. */
2397 op_symbol_code (enum tree_code code
)
2405 case TRUTH_ORIF_EXPR
:
2408 case TRUTH_AND_EXPR
:
2409 case TRUTH_ANDIF_EXPR
:
2415 case TRUTH_XOR_EXPR
:
2425 case UNORDERED_EXPR
:
2471 case VEC_LSHIFT_EXPR
:
2474 case VEC_RSHIFT_EXPR
:
2477 case POINTER_PLUS_EXPR
:
2483 case REDUC_PLUS_EXPR
:
2486 case WIDEN_SUM_EXPR
:
2489 case WIDEN_MULT_EXPR
:
2499 case TRUTH_NOT_EXPR
:
2506 case ALIGN_INDIRECT_REF
:
2509 case MISALIGNED_INDIRECT_REF
:
2512 case TRUNC_DIV_EXPR
:
2519 case FLOOR_DIV_EXPR
:
2522 case ROUND_DIV_EXPR
:
2525 case EXACT_DIV_EXPR
:
2528 case TRUNC_MOD_EXPR
:
2534 case FLOOR_MOD_EXPR
:
2537 case ROUND_MOD_EXPR
:
2540 case PREDECREMENT_EXPR
:
2543 case PREINCREMENT_EXPR
:
2546 case POSTDECREMENT_EXPR
:
2549 case POSTINCREMENT_EXPR
:
2559 return "<<< ??? >>>";
2563 /* Return the symbol associated with operator OP. */
2566 op_symbol (const_tree op
)
2568 return op_symbol_code (TREE_CODE (op
));
2571 /* Prints the name of a CALL_EXPR. */
2574 print_call_name (pretty_printer
*buffer
, const_tree node
)
2578 gcc_assert (TREE_CODE (node
) == CALL_EXPR
);
2580 op0
= CALL_EXPR_FN (node
);
2582 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
2583 op0
= TREE_OPERAND (op0
, 0);
2585 switch (TREE_CODE (op0
))
2589 dump_function_name (buffer
, op0
);
2595 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2599 pp_string (buffer
, "(");
2600 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2601 pp_string (buffer
, ") ? ");
2602 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, 0, false);
2603 pp_string (buffer
, " : ");
2604 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, 0, false);
2608 /* The function is a pointer contained in a structure. */
2609 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == INDIRECT_REF
||
2610 TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2611 dump_function_name (buffer
, TREE_OPERAND (op0
, 1));
2613 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2615 We can have several levels of structures and a function
2616 pointer inside. This is not implemented yet... */
2621 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2622 dump_function_name (buffer
, TREE_OPERAND (op0
, 0));
2624 dump_generic_node (buffer
, op0
, 0, 0, false);
2629 dump_generic_node (buffer
, op0
, 0, 0, false);
2637 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2640 pretty_print_string (pretty_printer
*buffer
, const char *str
)
2650 pp_string (buffer
, "\\b");
2654 pp_string (buffer
, "\\f");
2658 pp_string (buffer
, "\\n");
2662 pp_string (buffer
, "\\r");
2666 pp_string (buffer
, "\\t");
2670 pp_string (buffer
, "\\v");
2674 pp_string (buffer
, "\\\\");
2678 pp_string (buffer
, "\\\"");
2682 pp_string (buffer
, "\\'");
2685 /* No need to handle \0; the loop terminates on \0. */
2688 pp_string (buffer
, "\\1");
2692 pp_string (buffer
, "\\2");
2696 pp_string (buffer
, "\\3");
2700 pp_string (buffer
, "\\4");
2704 pp_string (buffer
, "\\5");
2708 pp_string (buffer
, "\\6");
2712 pp_string (buffer
, "\\7");
2716 pp_character (buffer
, str
[0]);
2724 maybe_init_pretty_print (FILE *file
)
2728 pp_construct (&buffer
, /* prefix */NULL
, /* line-width */0);
2729 pp_needs_newline (&buffer
) = true;
2733 buffer
.buffer
->stream
= file
;
2737 newline_and_indent (pretty_printer
*buffer
, int spc
)
2739 pp_newline (buffer
);