1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
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 int op_prio (const_tree
);
42 static const char *op_symbol (const_tree
);
43 static void pretty_print_string (pretty_printer
*, const char*);
44 static void print_call_name (pretty_printer
*, const_tree
);
45 static void newline_and_indent (pretty_printer
*, int);
46 static void maybe_init_pretty_print (FILE *);
47 static void print_struct_decl (pretty_printer
*, const_tree
, int, int);
48 static void do_niy (pretty_printer
*, const_tree
);
50 #define INDENT(SPACE) do { \
51 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
53 #define NIY do_niy(buffer,node)
55 #define PRINT_FUNCTION_NAME(NODE) pp_printf \
56 (buffer, "%s", TREE_CODE (NODE) == NOP_EXPR ? \
57 lang_hooks.decl_printable_name (TREE_OPERAND (NODE, 0), 1) : \
58 lang_hooks.decl_printable_name (NODE, 1))
60 static pretty_printer buffer
;
61 static int initialized
= 0;
63 /* Try to print something for an unknown tree code. */
66 do_niy (pretty_printer
*buffer
, const_tree node
)
70 pp_string (buffer
, "<<< Unknown tree: ");
71 pp_string (buffer
, tree_code_name
[(int) TREE_CODE (node
)]);
75 len
= TREE_OPERAND_LENGTH (node
);
76 for (i
= 0; i
< len
; ++i
)
78 newline_and_indent (buffer
, 2);
79 dump_generic_node (buffer
, TREE_OPERAND (node
, i
), 2, 0, false);
83 pp_string (buffer
, " >>>\n");
86 /* Debugging function to print out a generic expression. */
89 debug_generic_expr (tree t
)
91 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
92 fprintf (stderr
, "\n");
95 /* Debugging function to print out a generic statement. */
98 debug_generic_stmt (tree t
)
100 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
101 fprintf (stderr
, "\n");
104 /* Debugging function to print out a chain of trees . */
107 debug_tree_chain (tree t
)
111 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
112 fprintf(stderr
, " ");
115 fprintf (stderr
, "\n");
118 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
120 print_generic_decl (FILE *file
, tree decl
, int flags
)
122 maybe_init_pretty_print (file
);
123 print_declaration (&buffer
, decl
, 2, flags
);
124 pp_write_text_to_stream (&buffer
);
127 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
128 to show in the dump. See TDF_* in tree-pass.h. */
131 print_generic_stmt (FILE *file
, tree t
, int flags
)
133 maybe_init_pretty_print (file
);
134 dump_generic_node (&buffer
, t
, 0, flags
, true);
138 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
139 to show in the dump. See TDF_* in tree-pass.h. The output is indented by
143 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
147 maybe_init_pretty_print (file
);
149 for (i
= 0; i
< indent
; i
++)
151 dump_generic_node (&buffer
, t
, indent
, flags
, true);
155 /* Print a single expression T on file FILE. FLAGS specifies details to show
156 in the dump. See TDF_* in tree-pass.h. */
159 print_generic_expr (FILE *file
, tree t
, int flags
)
161 maybe_init_pretty_print (file
);
162 dump_generic_node (&buffer
, t
, 0, flags
, false);
165 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
169 dump_decl_name (pretty_printer
*buffer
, tree node
, int flags
)
174 pp_tree_identifier (buffer
, DECL_NAME (t
));
175 if ((flags
& TDF_UID
)
176 || DECL_NAME (t
) == NULL_TREE
)
178 if (TREE_CODE (t
) == LABEL_DECL
179 && LABEL_DECL_UID (t
) != -1)
180 pp_printf (buffer
, "L.%d", (int) LABEL_DECL_UID (t
));
183 char c
= TREE_CODE (t
) == CONST_DECL
? 'C' : 'D';
184 pp_printf (buffer
, "%c.%u", c
, DECL_UID (t
));
189 /* Like the above, but used for pretty printing function calls. */
192 dump_function_name (pretty_printer
*buffer
, tree node
)
194 if (DECL_NAME (node
))
195 PRINT_FUNCTION_NAME (node
);
197 dump_decl_name (buffer
, node
, 0);
200 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
201 FLAGS are as in dump_generic_node. */
204 dump_function_declaration (pretty_printer
*buffer
, tree node
,
207 bool wrote_arg
= false;
211 pp_character (buffer
, '(');
213 /* Print the argument types. The last element in the list is a VOID_TYPE.
214 The following avoids printing the last element. */
215 arg
= TYPE_ARG_TYPES (node
);
216 while (arg
&& TREE_CHAIN (arg
) && arg
!= error_mark_node
)
219 dump_generic_node (buffer
, TREE_VALUE (arg
), spc
, flags
, false);
220 arg
= TREE_CHAIN (arg
);
221 if (TREE_CHAIN (arg
) && TREE_CODE (TREE_CHAIN (arg
)) == TREE_LIST
)
223 pp_character (buffer
, ',');
229 pp_string (buffer
, "void");
231 pp_character (buffer
, ')');
234 /* Dump the domain associated with an array. */
237 dump_array_domain (pretty_printer
*buffer
, tree domain
, int spc
, int flags
)
239 pp_character (buffer
, '[');
242 tree min
= TYPE_MIN_VALUE (domain
);
243 tree max
= TYPE_MAX_VALUE (domain
);
246 && integer_zerop (min
)
247 && host_integerp (max
, 0))
248 pp_wide_integer (buffer
, TREE_INT_CST_LOW (max
) + 1);
252 dump_generic_node (buffer
, min
, spc
, flags
, false);
253 pp_character (buffer
, ':');
255 dump_generic_node (buffer
, max
, spc
, flags
, false);
259 pp_string (buffer
, "<unknown>");
260 pp_character (buffer
, ']');
264 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
265 dump_generic_node. */
268 dump_omp_clause (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
272 switch (OMP_CLAUSE_CODE (clause
))
274 case OMP_CLAUSE_PRIVATE
:
277 case OMP_CLAUSE_SHARED
:
280 case OMP_CLAUSE_FIRSTPRIVATE
:
281 name
= "firstprivate";
283 case OMP_CLAUSE_LASTPRIVATE
:
284 name
= "lastprivate";
286 case OMP_CLAUSE_COPYIN
:
289 case OMP_CLAUSE_COPYPRIVATE
:
290 name
= "copyprivate";
293 pp_string (buffer
, name
);
294 pp_character (buffer
, '(');
295 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
297 pp_character (buffer
, ')');
300 case OMP_CLAUSE_REDUCTION
:
301 pp_string (buffer
, "reduction(");
302 pp_string (buffer
, op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
303 pp_character (buffer
, ':');
304 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
306 pp_character (buffer
, ')');
310 pp_string (buffer
, "if(");
311 dump_generic_node (buffer
, OMP_CLAUSE_IF_EXPR (clause
),
313 pp_character (buffer
, ')');
316 case OMP_CLAUSE_NUM_THREADS
:
317 pp_string (buffer
, "num_threads(");
318 dump_generic_node (buffer
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
320 pp_character (buffer
, ')');
323 case OMP_CLAUSE_NOWAIT
:
324 pp_string (buffer
, "nowait");
326 case OMP_CLAUSE_ORDERED
:
327 pp_string (buffer
, "ordered");
330 case OMP_CLAUSE_DEFAULT
:
331 pp_string (buffer
, "default(");
332 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
334 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
336 case OMP_CLAUSE_DEFAULT_SHARED
:
337 pp_string (buffer
, "shared");
339 case OMP_CLAUSE_DEFAULT_NONE
:
340 pp_string (buffer
, "none");
342 case OMP_CLAUSE_DEFAULT_PRIVATE
:
343 pp_string (buffer
, "private");
345 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
346 pp_string (buffer
, "firstprivate");
351 pp_character (buffer
, ')');
354 case OMP_CLAUSE_SCHEDULE
:
355 pp_string (buffer
, "schedule(");
356 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
358 case OMP_CLAUSE_SCHEDULE_STATIC
:
359 pp_string (buffer
, "static");
361 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
362 pp_string (buffer
, "dynamic");
364 case OMP_CLAUSE_SCHEDULE_GUIDED
:
365 pp_string (buffer
, "guided");
367 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
368 pp_string (buffer
, "runtime");
370 case OMP_CLAUSE_SCHEDULE_AUTO
:
371 pp_string (buffer
, "auto");
376 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
378 pp_character (buffer
, ',');
379 dump_generic_node (buffer
,
380 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
383 pp_character (buffer
, ')');
386 case OMP_CLAUSE_UNTIED
:
387 pp_string (buffer
, "untied");
390 case OMP_CLAUSE_COLLAPSE
:
391 pp_string (buffer
, "collapse(");
392 dump_generic_node (buffer
,
393 OMP_CLAUSE_COLLAPSE_EXPR (clause
),
395 pp_character (buffer
, ')');
399 /* Should never happen. */
400 dump_generic_node (buffer
, clause
, spc
, flags
, false);
406 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
407 dump_generic_node. */
410 dump_omp_clauses (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
418 dump_omp_clause (buffer
, clause
, spc
, flags
);
419 clause
= OMP_CLAUSE_CHAIN (clause
);
427 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
428 indent. FLAGS specifies details to show in the dump (see TDF_* in
429 tree-pass.h). If IS_STMT is true, the object printed is considered
430 to be a statement and it is terminated by ';' if appropriate. */
433 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
441 if (node
== NULL_TREE
)
444 is_expr
= EXPR_P (node
);
446 if (is_stmt
&& (flags
& TDF_STMTADDR
))
447 pp_printf (buffer
, "<&%p> ", (void *)node
);
449 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
451 expanded_location xloc
= expand_location (EXPR_LOCATION (node
));
452 pp_character (buffer
, '[');
455 pp_string (buffer
, xloc
.file
);
456 pp_string (buffer
, " : ");
458 pp_decimal_int (buffer
, xloc
.line
);
459 pp_string (buffer
, "] ");
462 switch (TREE_CODE (node
))
465 pp_string (buffer
, "<<< error >>>");
468 case IDENTIFIER_NODE
:
469 pp_tree_identifier (buffer
, node
);
473 while (node
&& node
!= error_mark_node
)
475 if (TREE_PURPOSE (node
))
477 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
480 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
481 node
= TREE_CHAIN (node
);
482 if (node
&& TREE_CODE (node
) == TREE_LIST
)
484 pp_character (buffer
, ',');
491 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
),
558 else if (TREE_CODE (node
) == INTEGER_TYPE
)
560 pp_string (buffer
, (TYPE_UNSIGNED (node
)
561 ? "<unnamed-unsigned:"
562 : "<unnamed-signed:"));
563 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
564 pp_string (buffer
, ">");
567 pp_string (buffer
, "<unnamed type>");
574 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
576 if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
578 tree fnode
= TREE_TYPE (node
);
580 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
582 pp_character (buffer
, '(');
583 pp_string (buffer
, str
);
584 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
585 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
587 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
589 pp_character (buffer
, ')');
590 dump_function_declaration (buffer
, fnode
, spc
, flags
);
594 unsigned int quals
= TYPE_QUALS (node
);
596 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
598 pp_string (buffer
, str
);
600 if (quals
& TYPE_QUAL_CONST
)
601 pp_string (buffer
, " const");
602 if (quals
& TYPE_QUAL_VOLATILE
)
603 pp_string (buffer
, " volatile");
604 if (quals
& TYPE_QUAL_RESTRICT
)
605 pp_string (buffer
, " restrict");
607 if (TYPE_REF_CAN_ALIAS_ALL (node
))
608 pp_string (buffer
, " {ref-all}");
617 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)), flags
);
618 pp_string (buffer
, "::");
623 const char *sep
= "";
626 pp_string (buffer
, "MEM[");
628 tmp
= TMR_SYMBOL (node
);
631 pp_string (buffer
, sep
);
633 pp_string (buffer
, "symbol: ");
634 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
636 tmp
= TMR_BASE (node
);
639 pp_string (buffer
, sep
);
641 pp_string (buffer
, "base: ");
642 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
644 tmp
= TMR_INDEX (node
);
647 pp_string (buffer
, sep
);
649 pp_string (buffer
, "index: ");
650 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
652 tmp
= TMR_STEP (node
);
655 pp_string (buffer
, sep
);
657 pp_string (buffer
, "step: ");
658 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
660 tmp
= TMR_OFFSET (node
);
663 pp_string (buffer
, sep
);
665 pp_string (buffer
, "offset: ");
666 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
668 pp_string (buffer
, "]");
669 if (flags
& TDF_DETAILS
)
671 pp_string (buffer
, "{");
672 dump_generic_node (buffer
, TMR_ORIGINAL (node
), spc
, flags
,
674 pp_string (buffer
, "}");
683 /* Print the innermost component type. */
684 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
685 tmp
= TREE_TYPE (tmp
))
687 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
689 /* Print the dimensions. */
690 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
691 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
697 case QUAL_UNION_TYPE
:
699 unsigned int quals
= TYPE_QUALS (node
);
701 if (quals
& TYPE_QUAL_CONST
)
702 pp_string (buffer
, "const ");
703 if (quals
& TYPE_QUAL_VOLATILE
)
704 pp_string (buffer
, "volatile ");
706 /* Print the name of the structure. */
707 if (TREE_CODE (node
) == RECORD_TYPE
)
708 pp_string (buffer
, "struct ");
709 else if (TREE_CODE (node
) == UNION_TYPE
)
710 pp_string (buffer
, "union ");
712 if (TYPE_NAME (node
))
713 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
715 print_struct_decl (buffer
, node
, spc
, flags
);
724 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
726 /* In the case of a pointer, one may want to divide by the
727 size of the pointed-to type. Unfortunately, this not
728 straightforward. The C front-end maps expressions
733 in such a way that the two INTEGER_CST nodes for "5" have
734 different values but identical types. In the latter
735 case, the 5 is multiplied by sizeof (int) in c-common.c
736 (pointer_int_sum) to convert it to a byte address, and
737 yet the type of the node is left unchanged. Argh. What
738 is consistent though is that the number value corresponds
739 to bytes (UNITS) offset.
741 NB: Neither of the following divisors can be trivially
742 used to recover the original literal:
744 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
745 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
746 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
747 pp_string (buffer
, "B"); /* pseudo-unit */
749 else if (! host_integerp (node
, 0))
752 unsigned HOST_WIDE_INT low
= TREE_INT_CST_LOW (val
);
753 HOST_WIDE_INT high
= TREE_INT_CST_HIGH (val
);
755 if (tree_int_cst_sgn (val
) < 0)
757 pp_character (buffer
, '-');
761 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
763 sprintf (pp_buffer (buffer
)->digit_buffer
,
764 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
765 (unsigned HOST_WIDE_INT
) high
, low
);
766 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
769 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
773 /* Code copied from print_node. */
776 if (TREE_OVERFLOW (node
))
777 pp_string (buffer
, " overflow");
779 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
780 d
= TREE_REAL_CST (node
);
781 if (REAL_VALUE_ISINF (d
))
782 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
783 else if (REAL_VALUE_ISNAN (d
))
784 pp_string (buffer
, " Nan");
788 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
789 pp_string (buffer
, string
);
794 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
795 pp_string (buffer
, "0x");
796 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
797 output_formatted_integer (buffer
, "%02x", *p
++);
806 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
807 pp_string (buffer
, string
);
812 pp_string (buffer
, "__complex__ (");
813 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
814 pp_string (buffer
, ", ");
815 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
816 pp_string (buffer
, ")");
820 pp_string (buffer
, "\"");
821 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
822 pp_string (buffer
, "\"");
828 pp_string (buffer
, "{ ");
829 for (elt
= TREE_VECTOR_CST_ELTS (node
); elt
; elt
= TREE_CHAIN (elt
))
831 dump_generic_node (buffer
, TREE_VALUE (elt
), spc
, flags
, false);
832 if (TREE_CHAIN (elt
))
833 pp_string (buffer
, ", ");
835 pp_string (buffer
, " }");
844 dump_decl_name (buffer
, node
, flags
);
848 if (DECL_NAME (node
))
849 dump_decl_name (buffer
, node
, flags
);
850 else if (LABEL_DECL_UID (node
) != -1)
851 pp_printf (buffer
, "<L%d>", (int) LABEL_DECL_UID (node
));
853 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
857 if (DECL_IS_BUILTIN (node
))
859 /* Don't print the declaration of built-in types. */
862 if (DECL_NAME (node
))
863 dump_decl_name (buffer
, node
, flags
);
866 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
867 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
868 && TYPE_METHODS (TREE_TYPE (node
)))
870 /* The type is a c++ class: all structures have at least
872 pp_string (buffer
, "class ");
873 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
878 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
879 ? "union" : "struct "));
880 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
885 case SYMBOL_MEMORY_TAG
:
886 case NAME_MEMORY_TAG
:
891 case MEMORY_PARTITION_TAG
:
892 dump_decl_name (buffer
, node
, flags
);
896 pp_string (buffer
, "<retval>");
900 op0
= TREE_OPERAND (node
, 0);
902 if (TREE_CODE (op0
) == INDIRECT_REF
)
904 op0
= TREE_OPERAND (op0
, 0);
907 if (op_prio (op0
) < op_prio (node
))
908 pp_character (buffer
, '(');
909 dump_generic_node (buffer
, op0
, spc
, flags
, false);
910 if (op_prio (op0
) < op_prio (node
))
911 pp_character (buffer
, ')');
912 pp_string (buffer
, str
);
913 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
914 op0
= component_ref_field_offset (node
);
915 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
917 pp_string (buffer
, "{off: ");
918 dump_generic_node (buffer
, op0
, spc
, flags
, false);
919 pp_character (buffer
, '}');
924 pp_string (buffer
, "BIT_FIELD_REF <");
925 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
926 pp_string (buffer
, ", ");
927 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
928 pp_string (buffer
, ", ");
929 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
930 pp_string (buffer
, ">");
934 case ARRAY_RANGE_REF
:
935 op0
= TREE_OPERAND (node
, 0);
936 if (op_prio (op0
) < op_prio (node
))
937 pp_character (buffer
, '(');
938 dump_generic_node (buffer
, op0
, spc
, flags
, false);
939 if (op_prio (op0
) < op_prio (node
))
940 pp_character (buffer
, ')');
941 pp_character (buffer
, '[');
942 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
943 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
944 pp_string (buffer
, " ...");
945 pp_character (buffer
, ']');
947 op0
= array_ref_low_bound (node
);
948 op1
= array_ref_element_size (node
);
950 if (!integer_zerop (op0
)
951 || TREE_OPERAND (node
, 2)
952 || TREE_OPERAND (node
, 3))
954 pp_string (buffer
, "{lb: ");
955 dump_generic_node (buffer
, op0
, spc
, flags
, false);
956 pp_string (buffer
, " sz: ");
957 dump_generic_node (buffer
, op1
, spc
, flags
, false);
958 pp_character (buffer
, '}');
964 unsigned HOST_WIDE_INT ix
;
966 bool is_struct_init
= FALSE
;
967 pp_character (buffer
, '{');
968 if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
969 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
970 is_struct_init
= TRUE
;
971 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
973 if (field
&& is_struct_init
)
975 pp_character (buffer
, '.');
976 dump_generic_node (buffer
, field
, spc
, flags
, false);
977 pp_string (buffer
, "=");
979 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
980 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
981 val
= TREE_OPERAND (val
, 0);
982 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
983 dump_decl_name (buffer
, val
, flags
);
985 dump_generic_node (buffer
, val
, spc
, flags
, false);
986 if (ix
!= VEC_length (constructor_elt
, CONSTRUCTOR_ELTS (node
)) - 1)
988 pp_character (buffer
, ',');
992 pp_character (buffer
, '}');
999 if (flags
& TDF_SLIM
)
1001 pp_string (buffer
, "<COMPOUND_EXPR>");
1005 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1006 spc
, flags
, !(flags
& TDF_SLIM
));
1007 if (flags
& TDF_SLIM
)
1008 newline_and_indent (buffer
, spc
);
1011 pp_character (buffer
, ',');
1015 for (tp
= &TREE_OPERAND (node
, 1);
1016 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1017 tp
= &TREE_OPERAND (*tp
, 1))
1019 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1020 spc
, flags
, !(flags
& TDF_SLIM
));
1021 if (flags
& TDF_SLIM
)
1022 newline_and_indent (buffer
, spc
);
1025 pp_character (buffer
, ',');
1030 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1034 case STATEMENT_LIST
:
1036 tree_stmt_iterator si
;
1039 if (flags
& TDF_SLIM
)
1041 pp_string (buffer
, "<STATEMENT_LIST>");
1045 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1048 newline_and_indent (buffer
, spc
);
1051 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1058 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
,
1061 pp_character (buffer
, '=');
1062 if (TREE_CODE (node
) == MODIFY_EXPR
1063 && MOVE_NONTEMPORAL (node
))
1064 pp_string (buffer
, "{nt}");
1066 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
,
1071 pp_string (buffer
, "TARGET_EXPR <");
1072 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1073 pp_character (buffer
, ',');
1075 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1076 pp_character (buffer
, '>');
1080 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1085 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1087 pp_string (buffer
, "if (");
1088 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1089 pp_character (buffer
, ')');
1090 /* The lowered cond_exprs should always be printed in full. */
1091 if (COND_EXPR_THEN (node
)
1092 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1093 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1094 && COND_EXPR_ELSE (node
)
1095 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1096 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1099 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1101 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1103 pp_string (buffer
, " else ");
1104 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1108 else if (!(flags
& TDF_SLIM
))
1110 /* Output COND_EXPR_THEN. */
1111 if (COND_EXPR_THEN (node
))
1113 newline_and_indent (buffer
, spc
+2);
1114 pp_character (buffer
, '{');
1115 newline_and_indent (buffer
, spc
+4);
1116 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1118 newline_and_indent (buffer
, spc
+2);
1119 pp_character (buffer
, '}');
1122 /* Output COND_EXPR_ELSE. */
1123 if (COND_EXPR_ELSE (node
)
1124 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1126 newline_and_indent (buffer
, spc
);
1127 pp_string (buffer
, "else");
1128 newline_and_indent (buffer
, spc
+2);
1129 pp_character (buffer
, '{');
1130 newline_and_indent (buffer
, spc
+4);
1131 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1133 newline_and_indent (buffer
, spc
+2);
1134 pp_character (buffer
, '}');
1141 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1143 pp_character (buffer
, '?');
1145 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1147 pp_character (buffer
, ':');
1149 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1154 pp_character (buffer
, '{');
1155 if (!(flags
& TDF_SLIM
))
1157 if (BIND_EXPR_VARS (node
))
1159 pp_newline (buffer
);
1161 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= TREE_CHAIN (op0
))
1163 print_declaration (buffer
, op0
, spc
+2, flags
);
1164 pp_newline (buffer
);
1168 newline_and_indent (buffer
, spc
+2);
1169 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1170 newline_and_indent (buffer
, spc
);
1171 pp_character (buffer
, '}');
1177 print_call_name (buffer
, node
);
1179 /* Print parameters. */
1181 pp_character (buffer
, '(');
1184 call_expr_arg_iterator iter
;
1185 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1187 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1188 if (more_call_expr_args_p (&iter
))
1190 pp_character (buffer
, ',');
1195 if (CALL_EXPR_VA_ARG_PACK (node
))
1197 if (call_expr_nargs (node
) > 0)
1199 pp_character (buffer
, ',');
1202 pp_string (buffer
, "__builtin_va_arg_pack ()");
1204 pp_character (buffer
, ')');
1206 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1209 pp_string (buffer
, " [static-chain: ");
1210 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1211 pp_character (buffer
, ']');
1214 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1215 pp_string (buffer
, " [return slot optimization]");
1216 if (CALL_EXPR_TAILCALL (node
))
1217 pp_string (buffer
, " [tail call]");
1220 case WITH_CLEANUP_EXPR
:
1224 case CLEANUP_POINT_EXPR
:
1225 pp_string (buffer
, "<<cleanup_point ");
1226 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1227 pp_string (buffer
, ">>");
1230 case PLACEHOLDER_EXPR
:
1231 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1232 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1233 pp_character (buffer
, '>');
1236 /* Binary arithmetic and logic expressions. */
1237 case WIDEN_SUM_EXPR
:
1238 case WIDEN_MULT_EXPR
:
1241 case POINTER_PLUS_EXPR
:
1243 case TRUNC_DIV_EXPR
:
1245 case FLOOR_DIV_EXPR
:
1246 case ROUND_DIV_EXPR
:
1247 case TRUNC_MOD_EXPR
:
1249 case FLOOR_MOD_EXPR
:
1250 case ROUND_MOD_EXPR
:
1252 case EXACT_DIV_EXPR
:
1257 case VEC_LSHIFT_EXPR
:
1258 case VEC_RSHIFT_EXPR
:
1262 case TRUTH_ANDIF_EXPR
:
1263 case TRUTH_ORIF_EXPR
:
1264 case TRUTH_AND_EXPR
:
1266 case TRUTH_XOR_EXPR
:
1280 case UNORDERED_EXPR
:
1282 const char *op
= op_symbol (node
);
1283 op0
= TREE_OPERAND (node
, 0);
1284 op1
= TREE_OPERAND (node
, 1);
1286 /* When the operands are expressions with less priority,
1287 keep semantics of the tree representation. */
1288 if (op_prio (op0
) <= op_prio (node
))
1290 pp_character (buffer
, '(');
1291 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1292 pp_character (buffer
, ')');
1295 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1298 pp_string (buffer
, op
);
1301 /* When the operands are expressions with less priority,
1302 keep semantics of the tree representation. */
1303 if (op_prio (op1
) <= op_prio (node
))
1305 pp_character (buffer
, '(');
1306 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1307 pp_character (buffer
, ')');
1310 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1314 /* Unary arithmetic and logic expressions. */
1317 case TRUTH_NOT_EXPR
:
1319 case PREDECREMENT_EXPR
:
1320 case PREINCREMENT_EXPR
:
1321 case ALIGN_INDIRECT_REF
:
1322 case MISALIGNED_INDIRECT_REF
:
1324 if (TREE_CODE (node
) == ADDR_EXPR
1325 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
1326 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
1327 ; /* Do not output '&' for strings and function pointers. */
1329 pp_string (buffer
, op_symbol (node
));
1331 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1333 pp_character (buffer
, '(');
1334 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1335 pp_character (buffer
, ')');
1338 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1340 if (TREE_CODE (node
) == MISALIGNED_INDIRECT_REF
)
1342 pp_string (buffer
, "{misalignment: ");
1343 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1344 pp_character (buffer
, '}');
1348 case POSTDECREMENT_EXPR
:
1349 case POSTINCREMENT_EXPR
:
1350 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1352 pp_character (buffer
, '(');
1353 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1354 pp_character (buffer
, ')');
1357 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1358 pp_string (buffer
, op_symbol (node
));
1362 pp_string (buffer
, "MIN_EXPR <");
1363 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1364 pp_string (buffer
, ", ");
1365 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1366 pp_character (buffer
, '>');
1370 pp_string (buffer
, "MAX_EXPR <");
1371 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1372 pp_string (buffer
, ", ");
1373 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1374 pp_character (buffer
, '>');
1378 pp_string (buffer
, "ABS_EXPR <");
1379 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1380 pp_character (buffer
, '>');
1387 case FIXED_CONVERT_EXPR
:
1388 case FIX_TRUNC_EXPR
:
1391 type
= TREE_TYPE (node
);
1392 op0
= TREE_OPERAND (node
, 0);
1393 if (type
!= TREE_TYPE (op0
))
1395 pp_character (buffer
, '(');
1396 dump_generic_node (buffer
, type
, spc
, flags
, false);
1397 pp_string (buffer
, ") ");
1399 if (op_prio (op0
) < op_prio (node
))
1400 pp_character (buffer
, '(');
1401 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1402 if (op_prio (op0
) < op_prio (node
))
1403 pp_character (buffer
, ')');
1406 case VIEW_CONVERT_EXPR
:
1407 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
1408 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1409 pp_string (buffer
, ">(");
1410 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1411 pp_character (buffer
, ')');
1415 pp_string (buffer
, "((");
1416 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1417 pp_string (buffer
, "))");
1420 case NON_LVALUE_EXPR
:
1421 pp_string (buffer
, "NON_LVALUE_EXPR <");
1422 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1423 pp_character (buffer
, '>');
1427 pp_string (buffer
, "SAVE_EXPR <");
1428 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1429 pp_character (buffer
, '>');
1433 pp_string (buffer
, "COMPLEX_EXPR <");
1434 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1435 pp_string (buffer
, ", ");
1436 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1437 pp_string (buffer
, ">");
1441 pp_string (buffer
, "CONJ_EXPR <");
1442 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1443 pp_string (buffer
, ">");
1447 pp_string (buffer
, "REALPART_EXPR <");
1448 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1449 pp_string (buffer
, ">");
1453 pp_string (buffer
, "IMAGPART_EXPR <");
1454 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1455 pp_string (buffer
, ">");
1459 pp_string (buffer
, "VA_ARG_EXPR <");
1460 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1461 pp_string (buffer
, ">");
1464 case TRY_FINALLY_EXPR
:
1465 case TRY_CATCH_EXPR
:
1466 pp_string (buffer
, "try");
1467 newline_and_indent (buffer
, spc
+2);
1468 pp_string (buffer
, "{");
1469 newline_and_indent (buffer
, spc
+4);
1470 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
1471 newline_and_indent (buffer
, spc
+2);
1472 pp_string (buffer
, "}");
1473 newline_and_indent (buffer
, spc
);
1475 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
1476 newline_and_indent (buffer
, spc
+2);
1477 pp_string (buffer
, "{");
1478 newline_and_indent (buffer
, spc
+4);
1479 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
1480 newline_and_indent (buffer
, spc
+2);
1481 pp_string (buffer
, "}");
1486 pp_string (buffer
, "catch (");
1487 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
1488 pp_string (buffer
, ")");
1489 newline_and_indent (buffer
, spc
+2);
1490 pp_string (buffer
, "{");
1491 newline_and_indent (buffer
, spc
+4);
1492 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
1493 newline_and_indent (buffer
, spc
+2);
1494 pp_string (buffer
, "}");
1498 case EH_FILTER_EXPR
:
1499 pp_string (buffer
, "<<<eh_filter (");
1500 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
1501 pp_string (buffer
, ")>>>");
1502 newline_and_indent (buffer
, spc
+2);
1503 pp_string (buffer
, "{");
1504 newline_and_indent (buffer
, spc
+4);
1505 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
1506 newline_and_indent (buffer
, spc
+2);
1507 pp_string (buffer
, "}");
1511 case CHANGE_DYNAMIC_TYPE_EXPR
:
1512 pp_string (buffer
, "<<<change_dynamic_type (");
1513 dump_generic_node (buffer
, CHANGE_DYNAMIC_TYPE_NEW_TYPE (node
), spc
+ 2,
1515 pp_string (buffer
, ") ");
1516 dump_generic_node (buffer
, CHANGE_DYNAMIC_TYPE_LOCATION (node
), spc
+ 2,
1518 pp_string (buffer
, ")>>>");
1523 op0
= TREE_OPERAND (node
, 0);
1524 /* If this is for break or continue, don't bother printing it. */
1525 if (DECL_NAME (op0
))
1527 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1528 if (strcmp (name
, "break") == 0
1529 || strcmp (name
, "continue") == 0)
1532 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1533 pp_character (buffer
, ':');
1534 if (DECL_NONLOCAL (op0
))
1535 pp_string (buffer
, " [non-local]");
1539 pp_string (buffer
, "<<<exception object>>>");
1543 pp_string (buffer
, "<<<filter object>>>");
1547 pp_string (buffer
, "while (1)");
1548 if (!(flags
& TDF_SLIM
))
1550 newline_and_indent (buffer
, spc
+2);
1551 pp_character (buffer
, '{');
1552 newline_and_indent (buffer
, spc
+4);
1553 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
1554 newline_and_indent (buffer
, spc
+2);
1555 pp_character (buffer
, '}');
1561 pp_string (buffer
, "// predicted ");
1562 if (PREDICT_EXPR_OUTCOME (node
))
1563 pp_string (buffer
, "likely by ");
1565 pp_string (buffer
, "unlikely by ");
1566 pp_string (buffer
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
1567 pp_string (buffer
, " predictor.");
1571 pp_string (buffer
, "return");
1572 op0
= TREE_OPERAND (node
, 0);
1576 if (TREE_CODE (op0
) == MODIFY_EXPR
)
1577 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1),
1580 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1585 pp_string (buffer
, "if (");
1586 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1587 pp_string (buffer
, ") break");
1591 pp_string (buffer
, "switch (");
1592 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
1593 pp_character (buffer
, ')');
1594 if (!(flags
& TDF_SLIM
))
1596 newline_and_indent (buffer
, spc
+2);
1597 pp_character (buffer
, '{');
1598 if (SWITCH_BODY (node
))
1600 newline_and_indent (buffer
, spc
+4);
1601 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
1606 tree vec
= SWITCH_LABELS (node
);
1607 size_t i
, n
= TREE_VEC_LENGTH (vec
);
1608 for (i
= 0; i
< n
; ++i
)
1610 tree elt
= TREE_VEC_ELT (vec
, i
);
1611 newline_and_indent (buffer
, spc
+4);
1614 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
1615 pp_string (buffer
, " goto ");
1616 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
1618 pp_semicolon (buffer
);
1621 pp_string (buffer
, "case ???: goto ???;");
1624 newline_and_indent (buffer
, spc
+2);
1625 pp_character (buffer
, '}');
1631 op0
= GOTO_DESTINATION (node
);
1632 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
1634 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1635 if (strcmp (name
, "break") == 0
1636 || strcmp (name
, "continue") == 0)
1638 pp_string (buffer
, name
);
1642 pp_string (buffer
, "goto ");
1643 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1647 pp_string (buffer
, "resx ");
1648 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1652 pp_string (buffer
, "__asm__");
1653 if (ASM_VOLATILE_P (node
))
1654 pp_string (buffer
, " __volatile__");
1655 pp_character (buffer
, '(');
1656 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
1657 pp_character (buffer
, ':');
1658 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
1659 pp_character (buffer
, ':');
1660 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
1661 if (ASM_CLOBBERS (node
))
1663 pp_character (buffer
, ':');
1664 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
1666 pp_string (buffer
, ")");
1669 case CASE_LABEL_EXPR
:
1670 if (CASE_LOW (node
) && CASE_HIGH (node
))
1672 pp_string (buffer
, "case ");
1673 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1674 pp_string (buffer
, " ... ");
1675 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
1677 else if (CASE_LOW (node
))
1679 pp_string (buffer
, "case ");
1680 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1683 pp_string (buffer
, "default");
1684 pp_character (buffer
, ':');
1688 pp_string (buffer
, "OBJ_TYPE_REF(");
1689 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
1690 pp_character (buffer
, ';');
1691 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
1692 pp_character (buffer
, '-');
1693 pp_character (buffer
, '>');
1694 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
1695 pp_character (buffer
, ')');
1699 dump_generic_node (buffer
, SSA_NAME_VAR (node
), spc
, flags
, false);
1700 pp_string (buffer
, "_");
1701 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
1702 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
1703 pp_string (buffer
, "(ab)");
1704 else if (SSA_NAME_IS_DEFAULT_DEF (node
))
1705 pp_string (buffer
, "(D)");
1708 case WITH_SIZE_EXPR
:
1709 pp_string (buffer
, "WITH_SIZE_EXPR <");
1710 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1711 pp_string (buffer
, ", ");
1712 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1713 pp_string (buffer
, ">");
1717 pp_string (buffer
, "ASSERT_EXPR <");
1718 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
1719 pp_string (buffer
, ", ");
1720 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
1721 pp_string (buffer
, ">");
1725 pp_string (buffer
, "scev_known");
1728 case SCEV_NOT_KNOWN
:
1729 pp_string (buffer
, "scev_not_known");
1732 case POLYNOMIAL_CHREC
:
1733 pp_string (buffer
, "{");
1734 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
1735 pp_string (buffer
, ", +, ");
1736 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
1737 pp_string (buffer
, "}_");
1738 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
1742 case REALIGN_LOAD_EXPR
:
1743 pp_string (buffer
, "REALIGN_LOAD <");
1744 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1745 pp_string (buffer
, ", ");
1746 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1747 pp_string (buffer
, ", ");
1748 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1749 pp_string (buffer
, ">");
1753 pp_string (buffer
, " VEC_COND_EXPR < ");
1754 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1755 pp_string (buffer
, " , ");
1756 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1757 pp_string (buffer
, " , ");
1758 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1759 pp_string (buffer
, " > ");
1763 pp_string (buffer
, " DOT_PROD_EXPR < ");
1764 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1765 pp_string (buffer
, ", ");
1766 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1767 pp_string (buffer
, ", ");
1768 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1769 pp_string (buffer
, " > ");
1773 pp_string (buffer
, "#pragma omp parallel");
1774 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
1777 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
1779 newline_and_indent (buffer
, spc
+ 2);
1780 pp_character (buffer
, '{');
1781 newline_and_indent (buffer
, spc
+ 4);
1782 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
1783 newline_and_indent (buffer
, spc
+ 2);
1784 pp_character (buffer
, '}');
1790 pp_string (buffer
, "#pragma omp task");
1791 dump_omp_clauses (buffer
, OMP_TASK_CLAUSES (node
), spc
, flags
);
1795 pp_string (buffer
, "#pragma omp for");
1796 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
1798 if (!(flags
& TDF_SLIM
))
1802 if (OMP_FOR_PRE_BODY (node
))
1804 newline_and_indent (buffer
, spc
+ 2);
1805 pp_character (buffer
, '{');
1807 newline_and_indent (buffer
, spc
);
1808 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
1812 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
1815 newline_and_indent (buffer
, spc
);
1816 pp_string (buffer
, "for (");
1817 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
1819 pp_string (buffer
, "; ");
1820 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
1822 pp_string (buffer
, "; ");
1823 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
1825 pp_string (buffer
, ")");
1827 if (OMP_FOR_BODY (node
))
1829 newline_and_indent (buffer
, spc
+ 2);
1830 pp_character (buffer
, '{');
1831 newline_and_indent (buffer
, spc
+ 4);
1832 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
1834 newline_and_indent (buffer
, spc
+ 2);
1835 pp_character (buffer
, '}');
1837 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
1838 if (OMP_FOR_PRE_BODY (node
))
1841 newline_and_indent (buffer
, spc
+ 2);
1842 pp_character (buffer
, '}');
1849 pp_string (buffer
, "#pragma omp sections");
1850 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
1854 pp_string (buffer
, "#pragma omp section");
1858 pp_string (buffer
, "#pragma omp master");
1862 pp_string (buffer
, "#pragma omp ordered");
1866 pp_string (buffer
, "#pragma omp critical");
1867 if (OMP_CRITICAL_NAME (node
))
1870 pp_character (buffer
, '(');
1871 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
1873 pp_character (buffer
, ')');
1878 pp_string (buffer
, "#pragma omp atomic");
1879 newline_and_indent (buffer
, spc
+ 2);
1880 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1882 pp_character (buffer
, '=');
1884 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1888 pp_string (buffer
, "#pragma omp single");
1889 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
1893 dump_omp_clause (buffer
, node
, spc
, flags
);
1897 case REDUC_MAX_EXPR
:
1898 pp_string (buffer
, " REDUC_MAX_EXPR < ");
1899 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1900 pp_string (buffer
, " > ");
1903 case REDUC_MIN_EXPR
:
1904 pp_string (buffer
, " REDUC_MIN_EXPR < ");
1905 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1906 pp_string (buffer
, " > ");
1909 case REDUC_PLUS_EXPR
:
1910 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
1911 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1912 pp_string (buffer
, " > ");
1915 case VEC_WIDEN_MULT_HI_EXPR
:
1916 pp_string (buffer
, " VEC_WIDEN_MULT_HI_EXPR < ");
1917 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1918 pp_string (buffer
, ", ");
1919 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1920 pp_string (buffer
, " > ");
1923 case VEC_WIDEN_MULT_LO_EXPR
:
1924 pp_string (buffer
, " VEC_WIDEN_MULT_LO_EXPR < ");
1925 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1926 pp_string (buffer
, ", ");
1927 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1928 pp_string (buffer
, " > ");
1931 case VEC_UNPACK_HI_EXPR
:
1932 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
1933 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1934 pp_string (buffer
, " > ");
1937 case VEC_UNPACK_LO_EXPR
:
1938 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
1939 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1940 pp_string (buffer
, " > ");
1943 case VEC_UNPACK_FLOAT_HI_EXPR
:
1944 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
1945 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1946 pp_string (buffer
, " > ");
1949 case VEC_UNPACK_FLOAT_LO_EXPR
:
1950 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
1951 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1952 pp_string (buffer
, " > ");
1955 case VEC_PACK_TRUNC_EXPR
:
1956 pp_string (buffer
, " VEC_PACK_TRUNC_EXPR < ");
1957 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1958 pp_string (buffer
, ", ");
1959 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1960 pp_string (buffer
, " > ");
1963 case VEC_PACK_SAT_EXPR
:
1964 pp_string (buffer
, " VEC_PACK_SAT_EXPR < ");
1965 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1966 pp_string (buffer
, ", ");
1967 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1968 pp_string (buffer
, " > ");
1971 case VEC_PACK_FIX_TRUNC_EXPR
:
1972 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
1973 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1974 pp_string (buffer
, ", ");
1975 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1976 pp_string (buffer
, " > ");
1982 pp_string (buffer
, "BLOCK");
1984 if (BLOCK_ABSTRACT (node
))
1985 pp_string (buffer
, " [abstract]");
1987 if (TREE_ASM_WRITTEN (node
))
1988 pp_string (buffer
, " [written]");
1990 newline_and_indent (buffer
, spc
+ 2);
1992 if (BLOCK_SUPERCONTEXT (node
))
1994 pp_string (buffer
, "SUPERCONTEXT: ");
1995 if (TREE_CODE (BLOCK_SUPERCONTEXT (node
)) == BLOCK
)
1996 pp_printf (buffer
, "BLOCK %p",
1997 (void *)BLOCK_SUPERCONTEXT (node
));
1999 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (node
), 0, flags
,
2001 newline_and_indent (buffer
, spc
+ 2);
2004 if (BLOCK_SUBBLOCKS (node
))
2006 pp_string (buffer
, "SUBBLOCKS: ");
2007 for (t
= BLOCK_SUBBLOCKS (node
); t
; t
= BLOCK_CHAIN (t
))
2008 pp_printf (buffer
, "%p ", (void *)t
);
2009 newline_and_indent (buffer
, spc
+ 2);
2012 if (BLOCK_VARS (node
))
2014 pp_string (buffer
, "VARS: ");
2015 for (t
= BLOCK_VARS (node
); t
; t
= TREE_CHAIN (t
))
2017 dump_generic_node (buffer
, t
, 0, flags
, false);
2018 pp_string (buffer
, " ");
2020 newline_and_indent (buffer
, spc
+ 2);
2023 if (BLOCK_ABSTRACT_ORIGIN (node
))
2025 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
2026 if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node
)) == BLOCK
)
2027 pp_printf (buffer
, "BLOCK %p",
2028 (void *)BLOCK_ABSTRACT_ORIGIN (node
));
2030 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (node
), 0, flags
,
2032 newline_and_indent (buffer
, spc
+ 2);
2037 case VEC_EXTRACT_EVEN_EXPR
:
2038 pp_string (buffer
, " VEC_EXTRACT_EVEN_EXPR < ");
2039 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2040 pp_string (buffer
, ", ");
2041 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2042 pp_string (buffer
, " > ");
2045 case VEC_EXTRACT_ODD_EXPR
:
2046 pp_string (buffer
, " VEC_EXTRACT_ODD_EXPR < ");
2047 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2048 pp_string (buffer
, ", ");
2049 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2050 pp_string (buffer
, " > ");
2053 case VEC_INTERLEAVE_HIGH_EXPR
:
2054 pp_string (buffer
, " VEC_INTERLEAVE_HIGH_EXPR < ");
2055 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2056 pp_string (buffer
, ", ");
2057 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2058 pp_string (buffer
, " > ");
2061 case VEC_INTERLEAVE_LOW_EXPR
:
2062 pp_string (buffer
, " VEC_INTERLEAVE_LOW_EXPR < ");
2063 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2064 pp_string (buffer
, ", ");
2065 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2066 pp_string (buffer
, " > ");
2073 if (is_stmt
&& is_expr
)
2074 pp_semicolon (buffer
);
2076 /* If we're building a diagnostic, the formatted text will be written
2077 into BUFFER's stream by the caller; otherwise, write it now. */
2078 if (!(flags
& TDF_DIAGNOSTIC
))
2079 pp_write_text_to_stream (buffer
);
2084 /* Print the declaration of a variable. */
2087 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2091 if (TREE_CODE (t
) == TYPE_DECL
)
2092 pp_string (buffer
, "typedef ");
2094 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2095 pp_string (buffer
, "register ");
2097 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2098 pp_string (buffer
, "extern ");
2099 else if (TREE_STATIC (t
))
2100 pp_string (buffer
, "static ");
2102 /* Print the type and name. */
2103 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2107 /* Print array's type. */
2108 tmp
= TREE_TYPE (t
);
2109 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2110 tmp
= TREE_TYPE (tmp
);
2111 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2113 /* Print variable's name. */
2115 dump_generic_node (buffer
, t
, spc
, flags
, false);
2117 /* Print the dimensions. */
2118 tmp
= TREE_TYPE (t
);
2119 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2121 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2122 tmp
= TREE_TYPE (tmp
);
2125 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2127 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2129 dump_decl_name (buffer
, t
, flags
);
2130 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2134 /* Print type declaration. */
2135 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2137 /* Print variable's name. */
2139 dump_generic_node (buffer
, t
, spc
, flags
, false);
2142 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2144 pp_string (buffer
, " __asm__ ");
2145 pp_character (buffer
, '(');
2146 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2147 pp_character (buffer
, ')');
2150 /* The initial value of a function serves to determine whether the function
2151 is declared or defined. So the following does not apply to function
2153 if (TREE_CODE (t
) != FUNCTION_DECL
)
2155 /* Print the initial value. */
2156 if (DECL_INITIAL (t
))
2159 pp_character (buffer
, '=');
2161 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2165 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2167 pp_string (buffer
, " [value-expr: ");
2168 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2169 pp_character (buffer
, ']');
2172 pp_character (buffer
, ';');
2176 /* Prints a structure: name, fields, and methods.
2177 FIXME: Still incomplete. */
2180 print_struct_decl (pretty_printer
*buffer
, const_tree node
, int spc
, int flags
)
2182 /* Print the name of the structure. */
2183 if (TYPE_NAME (node
))
2186 if (TREE_CODE (node
) == RECORD_TYPE
)
2187 pp_string (buffer
, "struct ");
2188 else if ((TREE_CODE (node
) == UNION_TYPE
2189 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
2190 pp_string (buffer
, "union ");
2192 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
2195 /* Print the contents of the structure. */
2196 pp_newline (buffer
);
2198 pp_character (buffer
, '{');
2199 pp_newline (buffer
);
2201 /* Print the fields of the structure. */
2204 tmp
= TYPE_FIELDS (node
);
2207 /* Avoid to print recursively the structure. */
2208 /* FIXME : Not implemented correctly...,
2209 what about the case when we have a cycle in the contain graph? ...
2210 Maybe this could be solved by looking at the scope in which the
2211 structure was declared. */
2212 if (TREE_TYPE (tmp
) != node
2213 || (TREE_CODE (TREE_TYPE (tmp
)) == POINTER_TYPE
2214 && TREE_TYPE (TREE_TYPE (tmp
)) != node
))
2216 print_declaration (buffer
, tmp
, spc
+2, flags
);
2217 pp_newline (buffer
);
2219 tmp
= TREE_CHAIN (tmp
);
2223 pp_character (buffer
, '}');
2226 /* Return the priority of the operator OP.
2228 From lowest to highest precedence with either left-to-right (L-R)
2229 or right-to-left (R-L) associativity]:
2232 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2244 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2245 15 [L-R] fn() [] -> .
2247 unary +, - and * have higher precedence than the corresponding binary
2251 op_prio (const_tree op
)
2256 switch (TREE_CODE (op
))
2271 case TRUTH_ORIF_EXPR
:
2274 case TRUTH_AND_EXPR
:
2275 case TRUTH_ANDIF_EXPR
:
2282 case TRUTH_XOR_EXPR
:
2299 case UNORDERED_EXPR
:
2312 case WIDEN_SUM_EXPR
:
2314 case POINTER_PLUS_EXPR
:
2318 case VEC_WIDEN_MULT_HI_EXPR
:
2319 case VEC_WIDEN_MULT_LO_EXPR
:
2320 case WIDEN_MULT_EXPR
:
2323 case TRUNC_DIV_EXPR
:
2325 case FLOOR_DIV_EXPR
:
2326 case ROUND_DIV_EXPR
:
2328 case EXACT_DIV_EXPR
:
2329 case TRUNC_MOD_EXPR
:
2331 case FLOOR_MOD_EXPR
:
2332 case ROUND_MOD_EXPR
:
2335 case TRUTH_NOT_EXPR
:
2337 case POSTINCREMENT_EXPR
:
2338 case POSTDECREMENT_EXPR
:
2339 case PREINCREMENT_EXPR
:
2340 case PREDECREMENT_EXPR
:
2342 case ALIGN_INDIRECT_REF
:
2343 case MISALIGNED_INDIRECT_REF
:
2348 case FIX_TRUNC_EXPR
:
2354 case ARRAY_RANGE_REF
:
2358 /* Special expressions. */
2364 case REDUC_MAX_EXPR
:
2365 case REDUC_MIN_EXPR
:
2366 case REDUC_PLUS_EXPR
:
2367 case VEC_LSHIFT_EXPR
:
2368 case VEC_RSHIFT_EXPR
:
2369 case VEC_UNPACK_HI_EXPR
:
2370 case VEC_UNPACK_LO_EXPR
:
2371 case VEC_UNPACK_FLOAT_HI_EXPR
:
2372 case VEC_UNPACK_FLOAT_LO_EXPR
:
2373 case VEC_PACK_TRUNC_EXPR
:
2374 case VEC_PACK_SAT_EXPR
:
2378 case NON_LVALUE_EXPR
:
2379 return op_prio (TREE_OPERAND (op
, 0));
2382 /* Return an arbitrarily high precedence to avoid surrounding single
2383 VAR_DECLs in ()s. */
2389 /* Return the symbol associated with operator CODE. */
2392 op_symbol_code (enum tree_code code
)
2400 case TRUTH_ORIF_EXPR
:
2403 case TRUTH_AND_EXPR
:
2404 case TRUTH_ANDIF_EXPR
:
2410 case TRUTH_XOR_EXPR
:
2420 case UNORDERED_EXPR
:
2466 case VEC_LSHIFT_EXPR
:
2469 case VEC_RSHIFT_EXPR
:
2472 case POINTER_PLUS_EXPR
:
2478 case REDUC_PLUS_EXPR
:
2481 case WIDEN_SUM_EXPR
:
2484 case WIDEN_MULT_EXPR
:
2494 case TRUTH_NOT_EXPR
:
2501 case ALIGN_INDIRECT_REF
:
2504 case MISALIGNED_INDIRECT_REF
:
2507 case TRUNC_DIV_EXPR
:
2514 case FLOOR_DIV_EXPR
:
2517 case ROUND_DIV_EXPR
:
2520 case EXACT_DIV_EXPR
:
2523 case TRUNC_MOD_EXPR
:
2529 case FLOOR_MOD_EXPR
:
2532 case ROUND_MOD_EXPR
:
2535 case PREDECREMENT_EXPR
:
2538 case PREINCREMENT_EXPR
:
2541 case POSTDECREMENT_EXPR
:
2544 case POSTINCREMENT_EXPR
:
2554 return "<<< ??? >>>";
2558 /* Return the symbol associated with operator OP. */
2561 op_symbol (const_tree op
)
2563 return op_symbol_code (TREE_CODE (op
));
2566 /* Prints the name of a CALL_EXPR. */
2569 print_call_name (pretty_printer
*buffer
, const_tree node
)
2573 gcc_assert (TREE_CODE (node
) == CALL_EXPR
);
2575 op0
= CALL_EXPR_FN (node
);
2577 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
2578 op0
= TREE_OPERAND (op0
, 0);
2580 switch (TREE_CODE (op0
))
2584 dump_function_name (buffer
, op0
);
2590 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2594 pp_string (buffer
, "(");
2595 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2596 pp_string (buffer
, ") ? ");
2597 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, 0, false);
2598 pp_string (buffer
, " : ");
2599 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, 0, false);
2603 /* The function is a pointer contained in a structure. */
2604 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == INDIRECT_REF
||
2605 TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2606 dump_function_name (buffer
, TREE_OPERAND (op0
, 1));
2608 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, 0, false);
2610 We can have several levels of structures and a function
2611 pointer inside. This is not implemented yet... */
2616 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2617 dump_function_name (buffer
, TREE_OPERAND (op0
, 0));
2619 dump_generic_node (buffer
, op0
, 0, 0, false);
2624 dump_generic_node (buffer
, op0
, 0, 0, false);
2632 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2635 pretty_print_string (pretty_printer
*buffer
, const char *str
)
2645 pp_string (buffer
, "\\b");
2649 pp_string (buffer
, "\\f");
2653 pp_string (buffer
, "\\n");
2657 pp_string (buffer
, "\\r");
2661 pp_string (buffer
, "\\t");
2665 pp_string (buffer
, "\\v");
2669 pp_string (buffer
, "\\\\");
2673 pp_string (buffer
, "\\\"");
2677 pp_string (buffer
, "\\'");
2680 /* No need to handle \0; the loop terminates on \0. */
2683 pp_string (buffer
, "\\1");
2687 pp_string (buffer
, "\\2");
2691 pp_string (buffer
, "\\3");
2695 pp_string (buffer
, "\\4");
2699 pp_string (buffer
, "\\5");
2703 pp_string (buffer
, "\\6");
2707 pp_string (buffer
, "\\7");
2711 pp_character (buffer
, str
[0]);
2719 maybe_init_pretty_print (FILE *file
)
2723 pp_construct (&buffer
, /* prefix */NULL
, /* line-width */0);
2724 pp_needs_newline (&buffer
) = true;
2728 buffer
.buffer
->stream
= file
;
2732 newline_and_indent (pretty_printer
*buffer
, int spc
)
2734 pp_newline (buffer
);