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 newline_and_indent (pretty_printer
*, int);
44 static void maybe_init_pretty_print (FILE *);
45 static void print_struct_decl (pretty_printer
*, const_tree
, int, int);
46 static void do_niy (pretty_printer
*, const_tree
);
48 #define INDENT(SPACE) do { \
49 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
51 #define NIY do_niy(buffer,node)
53 static pretty_printer buffer
;
54 static int initialized
= 0;
56 /* Try to print something for an unknown tree code. */
59 do_niy (pretty_printer
*buffer
, const_tree node
)
63 pp_string (buffer
, "<<< Unknown tree: ");
64 pp_string (buffer
, tree_code_name
[(int) TREE_CODE (node
)]);
68 len
= TREE_OPERAND_LENGTH (node
);
69 for (i
= 0; i
< len
; ++i
)
71 newline_and_indent (buffer
, 2);
72 dump_generic_node (buffer
, TREE_OPERAND (node
, i
), 2, 0, false);
76 pp_string (buffer
, " >>>\n");
79 /* Debugging function to print out a generic expression. */
82 debug_generic_expr (tree t
)
84 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
85 fprintf (stderr
, "\n");
88 /* Debugging function to print out a generic statement. */
91 debug_generic_stmt (tree t
)
93 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
94 fprintf (stderr
, "\n");
97 /* Debugging function to print out a chain of trees . */
100 debug_tree_chain (tree t
)
102 struct pointer_set_t
*seen
= pointer_set_create ();
106 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
107 fprintf (stderr
, " ");
109 if (pointer_set_insert (seen
, t
))
111 fprintf (stderr
, "... [cycled back to ");
112 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
113 fprintf (stderr
, "]");
117 fprintf (stderr
, "\n");
119 pointer_set_destroy (seen
);
122 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
124 print_generic_decl (FILE *file
, tree decl
, int flags
)
126 maybe_init_pretty_print (file
);
127 print_declaration (&buffer
, decl
, 2, flags
);
128 pp_write_text_to_stream (&buffer
);
131 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
132 to show in the dump. See TDF_* in tree-pass.h. */
135 print_generic_stmt (FILE *file
, tree t
, int flags
)
137 maybe_init_pretty_print (file
);
138 dump_generic_node (&buffer
, t
, 0, flags
, true);
142 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
143 to show in the dump. See TDF_* in tree-pass.h. The output is indented by
147 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
151 maybe_init_pretty_print (file
);
153 for (i
= 0; i
< indent
; i
++)
155 dump_generic_node (&buffer
, t
, indent
, flags
, true);
159 /* Print a single expression T on file FILE. FLAGS specifies details to show
160 in the dump. See TDF_* in tree-pass.h. */
163 print_generic_expr (FILE *file
, tree t
, int flags
)
165 maybe_init_pretty_print (file
);
166 dump_generic_node (&buffer
, t
, 0, flags
, false);
169 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
173 dump_decl_name (pretty_printer
*buffer
, tree node
, int flags
)
175 if (DECL_NAME (node
))
177 if ((flags
& TDF_ASMNAME
) && DECL_ASSEMBLER_NAME_SET_P (node
))
178 pp_tree_identifier (buffer
, DECL_ASSEMBLER_NAME (node
));
180 pp_tree_identifier (buffer
, DECL_NAME (node
));
182 if ((flags
& TDF_UID
) || DECL_NAME (node
) == NULL_TREE
)
184 if (TREE_CODE (node
) == LABEL_DECL
&& LABEL_DECL_UID (node
) != -1)
185 pp_printf (buffer
, "L.%d", (int) LABEL_DECL_UID (node
));
186 else if (TREE_CODE (node
) == DEBUG_EXPR_DECL
)
188 if (flags
& TDF_NOUID
)
189 pp_string (buffer
, "D#xxxx");
191 pp_printf (buffer
, "D#%i", DEBUG_TEMP_UID (node
));
195 char c
= TREE_CODE (node
) == CONST_DECL
? 'C' : 'D';
196 if (flags
& TDF_NOUID
)
197 pp_printf (buffer
, "%c.xxxx", c
);
199 pp_printf (buffer
, "%c.%u", c
, DECL_UID (node
));
202 if ((flags
& TDF_ALIAS
) && DECL_PT_UID (node
) != DECL_UID (node
))
204 if (flags
& TDF_NOUID
)
205 pp_printf (buffer
, "ptD.xxxx");
207 pp_printf (buffer
, "ptD.%u", DECL_PT_UID (node
));
211 /* Like the above, but used for pretty printing function calls. */
214 dump_function_name (pretty_printer
*buffer
, tree node
, int flags
)
216 if (TREE_CODE (node
) == NOP_EXPR
)
217 node
= TREE_OPERAND (node
, 0);
218 if (DECL_NAME (node
) && (flags
& TDF_ASMNAME
) == 0)
219 pp_string (buffer
, lang_hooks
.decl_printable_name (node
, 1));
221 dump_decl_name (buffer
, node
, flags
);
224 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
225 FLAGS are as in dump_generic_node. */
228 dump_function_declaration (pretty_printer
*buffer
, tree node
,
231 bool wrote_arg
= false;
235 pp_character (buffer
, '(');
237 /* Print the argument types. The last element in the list is a VOID_TYPE.
238 The following avoids printing the last element. */
239 arg
= TYPE_ARG_TYPES (node
);
240 while (arg
&& TREE_CHAIN (arg
) && arg
!= error_mark_node
)
243 dump_generic_node (buffer
, TREE_VALUE (arg
), spc
, flags
, false);
244 arg
= TREE_CHAIN (arg
);
245 if (TREE_CHAIN (arg
) && TREE_CODE (TREE_CHAIN (arg
)) == TREE_LIST
)
247 pp_character (buffer
, ',');
253 pp_string (buffer
, "void");
255 pp_character (buffer
, ')');
258 /* Dump the domain associated with an array. */
261 dump_array_domain (pretty_printer
*buffer
, tree domain
, int spc
, int flags
)
263 pp_character (buffer
, '[');
266 tree min
= TYPE_MIN_VALUE (domain
);
267 tree max
= TYPE_MAX_VALUE (domain
);
270 && integer_zerop (min
)
271 && host_integerp (max
, 0))
272 pp_wide_integer (buffer
, TREE_INT_CST_LOW (max
) + 1);
276 dump_generic_node (buffer
, min
, spc
, flags
, false);
277 pp_character (buffer
, ':');
279 dump_generic_node (buffer
, max
, spc
, flags
, false);
283 pp_string (buffer
, "<unknown>");
284 pp_character (buffer
, ']');
288 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
289 dump_generic_node. */
292 dump_omp_clause (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
296 switch (OMP_CLAUSE_CODE (clause
))
298 case OMP_CLAUSE_PRIVATE
:
301 case OMP_CLAUSE_SHARED
:
304 case OMP_CLAUSE_FIRSTPRIVATE
:
305 name
= "firstprivate";
307 case OMP_CLAUSE_LASTPRIVATE
:
308 name
= "lastprivate";
310 case OMP_CLAUSE_COPYIN
:
313 case OMP_CLAUSE_COPYPRIVATE
:
314 name
= "copyprivate";
317 pp_string (buffer
, name
);
318 pp_character (buffer
, '(');
319 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
321 pp_character (buffer
, ')');
324 case OMP_CLAUSE_REDUCTION
:
325 pp_string (buffer
, "reduction(");
326 pp_string (buffer
, op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
327 pp_character (buffer
, ':');
328 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
330 pp_character (buffer
, ')');
334 pp_string (buffer
, "if(");
335 dump_generic_node (buffer
, OMP_CLAUSE_IF_EXPR (clause
),
337 pp_character (buffer
, ')');
340 case OMP_CLAUSE_NUM_THREADS
:
341 pp_string (buffer
, "num_threads(");
342 dump_generic_node (buffer
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
344 pp_character (buffer
, ')');
347 case OMP_CLAUSE_NOWAIT
:
348 pp_string (buffer
, "nowait");
350 case OMP_CLAUSE_ORDERED
:
351 pp_string (buffer
, "ordered");
354 case OMP_CLAUSE_DEFAULT
:
355 pp_string (buffer
, "default(");
356 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
358 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
360 case OMP_CLAUSE_DEFAULT_SHARED
:
361 pp_string (buffer
, "shared");
363 case OMP_CLAUSE_DEFAULT_NONE
:
364 pp_string (buffer
, "none");
366 case OMP_CLAUSE_DEFAULT_PRIVATE
:
367 pp_string (buffer
, "private");
369 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
370 pp_string (buffer
, "firstprivate");
375 pp_character (buffer
, ')');
378 case OMP_CLAUSE_SCHEDULE
:
379 pp_string (buffer
, "schedule(");
380 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
382 case OMP_CLAUSE_SCHEDULE_STATIC
:
383 pp_string (buffer
, "static");
385 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
386 pp_string (buffer
, "dynamic");
388 case OMP_CLAUSE_SCHEDULE_GUIDED
:
389 pp_string (buffer
, "guided");
391 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
392 pp_string (buffer
, "runtime");
394 case OMP_CLAUSE_SCHEDULE_AUTO
:
395 pp_string (buffer
, "auto");
400 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
402 pp_character (buffer
, ',');
403 dump_generic_node (buffer
,
404 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
407 pp_character (buffer
, ')');
410 case OMP_CLAUSE_UNTIED
:
411 pp_string (buffer
, "untied");
414 case OMP_CLAUSE_COLLAPSE
:
415 pp_string (buffer
, "collapse(");
416 dump_generic_node (buffer
,
417 OMP_CLAUSE_COLLAPSE_EXPR (clause
),
419 pp_character (buffer
, ')');
423 /* Should never happen. */
424 dump_generic_node (buffer
, clause
, spc
, flags
, false);
430 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
431 dump_generic_node. */
434 dump_omp_clauses (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
442 dump_omp_clause (buffer
, clause
, spc
, flags
);
443 clause
= OMP_CLAUSE_CHAIN (clause
);
451 /* Dump location LOC to BUFFER. */
454 dump_location (pretty_printer
*buffer
, location_t loc
)
456 expanded_location xloc
= expand_location (loc
);
458 pp_character (buffer
, '[');
461 pp_string (buffer
, xloc
.file
);
462 pp_string (buffer
, " : ");
464 pp_decimal_int (buffer
, xloc
.line
);
465 pp_string (buffer
, "] ");
469 /* Dump lexical block BLOCK. BUFFER, SPC and FLAGS are as in
470 dump_generic_node. */
473 dump_block_node (pretty_printer
*buffer
, tree block
, int spc
, int flags
)
477 pp_printf (buffer
, "BLOCK #%d ", BLOCK_NUMBER (block
));
479 if (flags
& TDF_ADDRESS
)
480 pp_printf (buffer
, "[%p] ", (void *) block
);
482 if (BLOCK_ABSTRACT (block
))
483 pp_string (buffer
, "[abstract] ");
485 if (TREE_ASM_WRITTEN (block
))
486 pp_string (buffer
, "[written] ");
488 if (flags
& TDF_SLIM
)
491 if (BLOCK_SOURCE_LOCATION (block
))
492 dump_location (buffer
, BLOCK_SOURCE_LOCATION (block
));
494 newline_and_indent (buffer
, spc
+ 2);
496 if (BLOCK_SUPERCONTEXT (block
))
498 pp_string (buffer
, "SUPERCONTEXT: ");
499 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (block
), 0,
500 flags
| TDF_SLIM
, false);
501 newline_and_indent (buffer
, spc
+ 2);
504 if (BLOCK_SUBBLOCKS (block
))
506 pp_string (buffer
, "SUBBLOCKS: ");
507 for (t
= BLOCK_SUBBLOCKS (block
); t
; t
= BLOCK_CHAIN (t
))
509 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
510 pp_string (buffer
, " ");
512 newline_and_indent (buffer
, spc
+ 2);
515 if (BLOCK_CHAIN (block
))
517 pp_string (buffer
, "SIBLINGS: ");
518 for (t
= BLOCK_CHAIN (block
); t
; t
= BLOCK_CHAIN (t
))
520 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
521 pp_string (buffer
, " ");
523 newline_and_indent (buffer
, spc
+ 2);
526 if (BLOCK_VARS (block
))
528 pp_string (buffer
, "VARS: ");
529 for (t
= BLOCK_VARS (block
); t
; t
= TREE_CHAIN (t
))
531 dump_generic_node (buffer
, t
, 0, flags
, false);
532 pp_string (buffer
, " ");
534 newline_and_indent (buffer
, spc
+ 2);
537 if (VEC_length (tree
, BLOCK_NONLOCALIZED_VARS (block
)) > 0)
540 VEC(tree
,gc
) *nlv
= BLOCK_NONLOCALIZED_VARS (block
);
542 pp_string (buffer
, "NONLOCALIZED_VARS: ");
543 for (i
= 0; VEC_iterate (tree
, nlv
, i
, t
); i
++)
545 dump_generic_node (buffer
, t
, 0, flags
, false);
546 pp_string (buffer
, " ");
548 newline_and_indent (buffer
, spc
+ 2);
551 if (BLOCK_ABSTRACT_ORIGIN (block
))
553 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
554 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (block
), 0,
555 flags
| TDF_SLIM
, false);
556 newline_and_indent (buffer
, spc
+ 2);
559 if (BLOCK_FRAGMENT_ORIGIN (block
))
561 pp_string (buffer
, "FRAGMENT_ORIGIN: ");
562 dump_generic_node (buffer
, BLOCK_FRAGMENT_ORIGIN (block
), 0,
563 flags
| TDF_SLIM
, false);
564 newline_and_indent (buffer
, spc
+ 2);
567 if (BLOCK_FRAGMENT_CHAIN (block
))
569 pp_string (buffer
, "FRAGMENT_CHAIN: ");
570 for (t
= BLOCK_FRAGMENT_CHAIN (block
); t
; t
= BLOCK_FRAGMENT_CHAIN (t
))
572 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
573 pp_string (buffer
, " ");
575 newline_and_indent (buffer
, spc
+ 2);
580 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
581 indent. FLAGS specifies details to show in the dump (see TDF_* in
582 tree-pass.h). If IS_STMT is true, the object printed is considered
583 to be a statement and it is terminated by ';' if appropriate. */
586 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
594 if (node
== NULL_TREE
)
597 is_expr
= EXPR_P (node
);
599 if (is_stmt
&& (flags
& TDF_STMTADDR
))
600 pp_printf (buffer
, "<&%p> ", (void *)node
);
602 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
603 dump_location (buffer
, EXPR_LOCATION (node
));
605 switch (TREE_CODE (node
))
608 pp_string (buffer
, "<<< error >>>");
611 case IDENTIFIER_NODE
:
612 pp_tree_identifier (buffer
, node
);
616 while (node
&& node
!= error_mark_node
)
618 if (TREE_PURPOSE (node
))
620 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
623 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
624 node
= TREE_CHAIN (node
);
625 if (node
&& TREE_CODE (node
) == TREE_LIST
)
627 pp_character (buffer
, ',');
634 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
640 if (TREE_VEC_LENGTH (node
) > 0)
642 size_t len
= TREE_VEC_LENGTH (node
);
643 for (i
= 0; i
< len
- 1; i
++)
645 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
647 pp_character (buffer
, ',');
650 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
659 case FIXED_POINT_TYPE
:
665 unsigned int quals
= TYPE_QUALS (node
);
666 enum tree_code_class tclass
;
668 if (quals
& TYPE_QUAL_CONST
)
669 pp_string (buffer
, "const ");
670 else if (quals
& TYPE_QUAL_VOLATILE
)
671 pp_string (buffer
, "volatile ");
672 else if (quals
& TYPE_QUAL_RESTRICT
)
673 pp_string (buffer
, "restrict ");
675 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
677 pp_string (buffer
, "<address-space-");
678 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
679 pp_string (buffer
, "> ");
682 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
684 if (tclass
== tcc_declaration
)
686 if (DECL_NAME (node
))
687 dump_decl_name (buffer
, node
, flags
);
689 pp_string (buffer
, "<unnamed type decl>");
691 else if (tclass
== tcc_type
)
693 if (TYPE_NAME (node
))
695 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
696 pp_tree_identifier (buffer
, TYPE_NAME (node
));
697 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
698 && DECL_NAME (TYPE_NAME (node
)))
699 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
701 pp_string (buffer
, "<unnamed type>");
703 else if (TREE_CODE (node
) == VECTOR_TYPE
)
705 pp_string (buffer
, "vector");
706 pp_character (buffer
, '(');
707 pp_wide_integer (buffer
, TYPE_VECTOR_SUBPARTS (node
));
708 pp_string (buffer
, ") ");
709 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
711 else if (TREE_CODE (node
) == INTEGER_TYPE
)
713 pp_string (buffer
, (TYPE_UNSIGNED (node
)
714 ? "<unnamed-unsigned:"
715 : "<unnamed-signed:"));
716 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
717 pp_string (buffer
, ">");
719 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
721 pp_string (buffer
, "__complex__ ");
722 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
724 else if (TREE_CODE (node
) == REAL_TYPE
)
726 pp_string (buffer
, "<float:");
727 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
728 pp_string (buffer
, ">");
730 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
732 pp_string (buffer
, "<fixed-point-");
733 pp_string (buffer
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
734 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
735 pp_string (buffer
, ">");
738 pp_string (buffer
, "<unnamed type>");
745 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
747 if (TREE_TYPE (node
) == NULL
)
749 pp_string (buffer
, str
);
750 pp_string (buffer
, "<null type>");
752 else if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
754 tree fnode
= TREE_TYPE (node
);
756 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
758 pp_character (buffer
, '(');
759 pp_string (buffer
, str
);
760 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
761 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
763 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
765 pp_character (buffer
, ')');
766 dump_function_declaration (buffer
, fnode
, spc
, flags
);
770 unsigned int quals
= TYPE_QUALS (node
);
772 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
774 pp_string (buffer
, str
);
776 if (quals
& TYPE_QUAL_CONST
)
777 pp_string (buffer
, " const");
778 if (quals
& TYPE_QUAL_VOLATILE
)
779 pp_string (buffer
, " volatile");
780 if (quals
& TYPE_QUAL_RESTRICT
)
781 pp_string (buffer
, " restrict");
783 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
785 pp_string (buffer
, " <address-space-");
786 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
787 pp_string (buffer
, ">");
790 if (TYPE_REF_CAN_ALIAS_ALL (node
))
791 pp_string (buffer
, " {ref-all}");
801 const char *sep
= "";
804 pp_string (buffer
, "MEM[");
806 tmp
= TMR_SYMBOL (node
);
809 pp_string (buffer
, sep
);
811 pp_string (buffer
, "symbol: ");
812 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
814 tmp
= TMR_BASE (node
);
817 pp_string (buffer
, sep
);
819 pp_string (buffer
, "base: ");
820 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
822 tmp
= TMR_INDEX (node
);
825 pp_string (buffer
, sep
);
827 pp_string (buffer
, "index: ");
828 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
830 tmp
= TMR_STEP (node
);
833 pp_string (buffer
, sep
);
835 pp_string (buffer
, "step: ");
836 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
838 tmp
= TMR_OFFSET (node
);
841 pp_string (buffer
, sep
);
843 pp_string (buffer
, "offset: ");
844 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
846 pp_string (buffer
, "]");
847 if (flags
& TDF_DETAILS
)
849 pp_string (buffer
, "{");
850 dump_generic_node (buffer
, TMR_ORIGINAL (node
), spc
, flags
,
852 pp_string (buffer
, "}");
861 /* Print the innermost component type. */
862 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
863 tmp
= TREE_TYPE (tmp
))
865 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
867 /* Print the dimensions. */
868 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
869 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
875 case QUAL_UNION_TYPE
:
877 unsigned int quals
= TYPE_QUALS (node
);
879 if (quals
& TYPE_QUAL_CONST
)
880 pp_string (buffer
, "const ");
881 if (quals
& TYPE_QUAL_VOLATILE
)
882 pp_string (buffer
, "volatile ");
884 /* Print the name of the structure. */
885 if (TREE_CODE (node
) == RECORD_TYPE
)
886 pp_string (buffer
, "struct ");
887 else if (TREE_CODE (node
) == UNION_TYPE
)
888 pp_string (buffer
, "union ");
890 if (TYPE_NAME (node
))
891 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
892 else if (!(flags
& TDF_SLIM
))
893 /* FIXME: If we eliminate the 'else' above and attempt
894 to show the fields for named types, we may get stuck
895 following a cycle of pointers to structs. The alleged
896 self-reference check in print_struct_decl will not detect
897 cycles involving more than one pointer or struct type. */
898 print_struct_decl (buffer
, node
, spc
, flags
);
907 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
909 /* In the case of a pointer, one may want to divide by the
910 size of the pointed-to type. Unfortunately, this not
911 straightforward. The C front-end maps expressions
916 in such a way that the two INTEGER_CST nodes for "5" have
917 different values but identical types. In the latter
918 case, the 5 is multiplied by sizeof (int) in c-common.c
919 (pointer_int_sum) to convert it to a byte address, and
920 yet the type of the node is left unchanged. Argh. What
921 is consistent though is that the number value corresponds
922 to bytes (UNITS) offset.
924 NB: Neither of the following divisors can be trivially
925 used to recover the original literal:
927 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
928 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
929 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
930 pp_string (buffer
, "B"); /* pseudo-unit */
932 else if (! host_integerp (node
, 0))
935 unsigned HOST_WIDE_INT low
= TREE_INT_CST_LOW (val
);
936 HOST_WIDE_INT high
= TREE_INT_CST_HIGH (val
);
938 if (tree_int_cst_sgn (val
) < 0)
940 pp_character (buffer
, '-');
944 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
946 sprintf (pp_buffer (buffer
)->digit_buffer
,
947 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
948 (unsigned HOST_WIDE_INT
) high
, low
);
949 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
952 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
956 /* Code copied from print_node. */
959 if (TREE_OVERFLOW (node
))
960 pp_string (buffer
, " overflow");
962 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
963 d
= TREE_REAL_CST (node
);
964 if (REAL_VALUE_ISINF (d
))
965 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
966 else if (REAL_VALUE_ISNAN (d
))
967 pp_string (buffer
, " Nan");
971 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
972 pp_string (buffer
, string
);
977 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
978 pp_string (buffer
, "0x");
979 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
980 output_formatted_integer (buffer
, "%02x", *p
++);
989 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
990 pp_string (buffer
, string
);
995 pp_string (buffer
, "__complex__ (");
996 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
997 pp_string (buffer
, ", ");
998 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
999 pp_string (buffer
, ")");
1003 pp_string (buffer
, "\"");
1004 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
1005 pp_string (buffer
, "\"");
1011 pp_string (buffer
, "{ ");
1012 for (elt
= TREE_VECTOR_CST_ELTS (node
); elt
; elt
= TREE_CHAIN (elt
))
1014 dump_generic_node (buffer
, TREE_VALUE (elt
), spc
, flags
, false);
1015 if (TREE_CHAIN (elt
))
1016 pp_string (buffer
, ", ");
1018 pp_string (buffer
, " }");
1024 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1026 if (TREE_CODE (node
) == METHOD_TYPE
)
1028 if (TYPE_METHOD_BASETYPE (node
))
1029 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
1032 pp_string (buffer
, "<null method basetype>");
1033 pp_string (buffer
, "::");
1035 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1036 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1038 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1039 dump_function_declaration (buffer
, node
, spc
, flags
);
1044 dump_decl_name (buffer
, node
, flags
);
1048 if (DECL_NAME (node
))
1049 dump_decl_name (buffer
, node
, flags
);
1050 else if (LABEL_DECL_UID (node
) != -1)
1051 pp_printf (buffer
, "<L%d>", (int) LABEL_DECL_UID (node
));
1054 if (flags
& TDF_NOUID
)
1055 pp_string (buffer
, "<D.xxxx>");
1057 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
1062 if (DECL_IS_BUILTIN (node
))
1064 /* Don't print the declaration of built-in types. */
1067 if (DECL_NAME (node
))
1068 dump_decl_name (buffer
, node
, flags
);
1071 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1072 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1073 && TYPE_METHODS (TREE_TYPE (node
)))
1075 /* The type is a c++ class: all structures have at least
1077 pp_string (buffer
, "class ");
1078 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1083 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
1084 ? "union" : "struct "));
1085 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1093 case DEBUG_EXPR_DECL
:
1094 case NAMESPACE_DECL
:
1095 dump_decl_name (buffer
, node
, flags
);
1099 pp_string (buffer
, "<retval>");
1103 op0
= TREE_OPERAND (node
, 0);
1105 if (op0
&& TREE_CODE (op0
) == INDIRECT_REF
)
1107 op0
= TREE_OPERAND (op0
, 0);
1110 if (op_prio (op0
) < op_prio (node
))
1111 pp_character (buffer
, '(');
1112 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1113 if (op_prio (op0
) < op_prio (node
))
1114 pp_character (buffer
, ')');
1115 pp_string (buffer
, str
);
1116 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1117 op0
= component_ref_field_offset (node
);
1118 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
1120 pp_string (buffer
, "{off: ");
1121 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1122 pp_character (buffer
, '}');
1127 pp_string (buffer
, "BIT_FIELD_REF <");
1128 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1129 pp_string (buffer
, ", ");
1130 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1131 pp_string (buffer
, ", ");
1132 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1133 pp_string (buffer
, ">");
1137 case ARRAY_RANGE_REF
:
1138 op0
= TREE_OPERAND (node
, 0);
1139 if (op_prio (op0
) < op_prio (node
))
1140 pp_character (buffer
, '(');
1141 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1142 if (op_prio (op0
) < op_prio (node
))
1143 pp_character (buffer
, ')');
1144 pp_character (buffer
, '[');
1145 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1146 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
1147 pp_string (buffer
, " ...");
1148 pp_character (buffer
, ']');
1150 op0
= array_ref_low_bound (node
);
1151 op1
= array_ref_element_size (node
);
1153 if (!integer_zerop (op0
)
1154 || TREE_OPERAND (node
, 2)
1155 || TREE_OPERAND (node
, 3))
1157 pp_string (buffer
, "{lb: ");
1158 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1159 pp_string (buffer
, " sz: ");
1160 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1161 pp_character (buffer
, '}');
1167 unsigned HOST_WIDE_INT ix
;
1169 bool is_struct_init
= FALSE
;
1170 pp_character (buffer
, '{');
1171 if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1172 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1173 is_struct_init
= TRUE
;
1174 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1176 if (field
&& is_struct_init
)
1178 pp_character (buffer
, '.');
1179 dump_generic_node (buffer
, field
, spc
, flags
, false);
1180 pp_string (buffer
, "=");
1182 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1183 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1184 val
= TREE_OPERAND (val
, 0);
1185 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1186 dump_decl_name (buffer
, val
, flags
);
1188 dump_generic_node (buffer
, val
, spc
, flags
, false);
1189 if (ix
!= VEC_length (constructor_elt
, CONSTRUCTOR_ELTS (node
)) - 1)
1191 pp_character (buffer
, ',');
1195 pp_character (buffer
, '}');
1202 if (flags
& TDF_SLIM
)
1204 pp_string (buffer
, "<COMPOUND_EXPR>");
1208 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1209 spc
, flags
, !(flags
& TDF_SLIM
));
1210 if (flags
& TDF_SLIM
)
1211 newline_and_indent (buffer
, spc
);
1214 pp_character (buffer
, ',');
1218 for (tp
= &TREE_OPERAND (node
, 1);
1219 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1220 tp
= &TREE_OPERAND (*tp
, 1))
1222 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1223 spc
, flags
, !(flags
& TDF_SLIM
));
1224 if (flags
& TDF_SLIM
)
1225 newline_and_indent (buffer
, spc
);
1228 pp_character (buffer
, ',');
1233 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1237 case STATEMENT_LIST
:
1239 tree_stmt_iterator si
;
1242 if (flags
& TDF_SLIM
)
1244 pp_string (buffer
, "<STATEMENT_LIST>");
1248 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1251 newline_and_indent (buffer
, spc
);
1254 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1261 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
,
1264 pp_character (buffer
, '=');
1265 if (TREE_CODE (node
) == MODIFY_EXPR
1266 && MOVE_NONTEMPORAL (node
))
1267 pp_string (buffer
, "{nt}");
1269 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
,
1274 pp_string (buffer
, "TARGET_EXPR <");
1275 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1276 pp_character (buffer
, ',');
1278 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1279 pp_character (buffer
, '>');
1283 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1288 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1290 pp_string (buffer
, "if (");
1291 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1292 pp_character (buffer
, ')');
1293 /* The lowered cond_exprs should always be printed in full. */
1294 if (COND_EXPR_THEN (node
)
1295 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1296 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1297 && COND_EXPR_ELSE (node
)
1298 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1299 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1302 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1304 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1306 pp_string (buffer
, " else ");
1307 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1311 else if (!(flags
& TDF_SLIM
))
1313 /* Output COND_EXPR_THEN. */
1314 if (COND_EXPR_THEN (node
))
1316 newline_and_indent (buffer
, spc
+2);
1317 pp_character (buffer
, '{');
1318 newline_and_indent (buffer
, spc
+4);
1319 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1321 newline_and_indent (buffer
, spc
+2);
1322 pp_character (buffer
, '}');
1325 /* Output COND_EXPR_ELSE. */
1326 if (COND_EXPR_ELSE (node
)
1327 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1329 newline_and_indent (buffer
, spc
);
1330 pp_string (buffer
, "else");
1331 newline_and_indent (buffer
, spc
+2);
1332 pp_character (buffer
, '{');
1333 newline_and_indent (buffer
, spc
+4);
1334 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1336 newline_and_indent (buffer
, spc
+2);
1337 pp_character (buffer
, '}');
1344 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1346 pp_character (buffer
, '?');
1348 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1350 pp_character (buffer
, ':');
1352 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1357 pp_character (buffer
, '{');
1358 if (!(flags
& TDF_SLIM
))
1360 if (BIND_EXPR_VARS (node
))
1362 pp_newline (buffer
);
1364 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= TREE_CHAIN (op0
))
1366 print_declaration (buffer
, op0
, spc
+2, flags
);
1367 pp_newline (buffer
);
1371 newline_and_indent (buffer
, spc
+2);
1372 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1373 newline_and_indent (buffer
, spc
);
1374 pp_character (buffer
, '}');
1380 print_call_name (buffer
, CALL_EXPR_FN (node
), flags
);
1382 /* Print parameters. */
1384 pp_character (buffer
, '(');
1387 call_expr_arg_iterator iter
;
1388 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1390 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1391 if (more_call_expr_args_p (&iter
))
1393 pp_character (buffer
, ',');
1398 if (CALL_EXPR_VA_ARG_PACK (node
))
1400 if (call_expr_nargs (node
) > 0)
1402 pp_character (buffer
, ',');
1405 pp_string (buffer
, "__builtin_va_arg_pack ()");
1407 pp_character (buffer
, ')');
1409 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1412 pp_string (buffer
, " [static-chain: ");
1413 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1414 pp_character (buffer
, ']');
1417 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1418 pp_string (buffer
, " [return slot optimization]");
1419 if (CALL_EXPR_TAILCALL (node
))
1420 pp_string (buffer
, " [tail call]");
1423 case WITH_CLEANUP_EXPR
:
1427 case CLEANUP_POINT_EXPR
:
1428 pp_string (buffer
, "<<cleanup_point ");
1429 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1430 pp_string (buffer
, ">>");
1433 case PLACEHOLDER_EXPR
:
1434 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1435 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1436 pp_character (buffer
, '>');
1439 /* Binary arithmetic and logic expressions. */
1440 case WIDEN_SUM_EXPR
:
1441 case WIDEN_MULT_EXPR
:
1444 case POINTER_PLUS_EXPR
:
1446 case TRUNC_DIV_EXPR
:
1448 case FLOOR_DIV_EXPR
:
1449 case ROUND_DIV_EXPR
:
1450 case TRUNC_MOD_EXPR
:
1452 case FLOOR_MOD_EXPR
:
1453 case ROUND_MOD_EXPR
:
1455 case EXACT_DIV_EXPR
:
1460 case VEC_LSHIFT_EXPR
:
1461 case VEC_RSHIFT_EXPR
:
1465 case TRUTH_ANDIF_EXPR
:
1466 case TRUTH_ORIF_EXPR
:
1467 case TRUTH_AND_EXPR
:
1469 case TRUTH_XOR_EXPR
:
1483 case UNORDERED_EXPR
:
1485 const char *op
= op_symbol (node
);
1486 op0
= TREE_OPERAND (node
, 0);
1487 op1
= TREE_OPERAND (node
, 1);
1489 /* When the operands are expressions with less priority,
1490 keep semantics of the tree representation. */
1491 if (op_prio (op0
) <= op_prio (node
))
1493 pp_character (buffer
, '(');
1494 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1495 pp_character (buffer
, ')');
1498 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1501 pp_string (buffer
, op
);
1504 /* When the operands are expressions with less priority,
1505 keep semantics of the tree representation. */
1506 if (op_prio (op1
) <= op_prio (node
))
1508 pp_character (buffer
, '(');
1509 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1510 pp_character (buffer
, ')');
1513 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1517 /* Unary arithmetic and logic expressions. */
1520 case TRUTH_NOT_EXPR
:
1522 case PREDECREMENT_EXPR
:
1523 case PREINCREMENT_EXPR
:
1524 case ALIGN_INDIRECT_REF
:
1525 case MISALIGNED_INDIRECT_REF
:
1527 if (TREE_CODE (node
) == ADDR_EXPR
1528 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
1529 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
1530 ; /* Do not output '&' for strings and function pointers. */
1532 pp_string (buffer
, op_symbol (node
));
1534 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1536 pp_character (buffer
, '(');
1537 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1538 pp_character (buffer
, ')');
1541 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1543 if (TREE_CODE (node
) == MISALIGNED_INDIRECT_REF
)
1545 pp_string (buffer
, "{misalignment: ");
1546 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1547 pp_character (buffer
, '}');
1551 case POSTDECREMENT_EXPR
:
1552 case POSTINCREMENT_EXPR
:
1553 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1555 pp_character (buffer
, '(');
1556 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1557 pp_character (buffer
, ')');
1560 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1561 pp_string (buffer
, op_symbol (node
));
1565 pp_string (buffer
, "MIN_EXPR <");
1566 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1567 pp_string (buffer
, ", ");
1568 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1569 pp_character (buffer
, '>');
1573 pp_string (buffer
, "MAX_EXPR <");
1574 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1575 pp_string (buffer
, ", ");
1576 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1577 pp_character (buffer
, '>');
1581 pp_string (buffer
, "ABS_EXPR <");
1582 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1583 pp_character (buffer
, '>');
1590 case ADDR_SPACE_CONVERT_EXPR
:
1591 case FIXED_CONVERT_EXPR
:
1592 case FIX_TRUNC_EXPR
:
1595 type
= TREE_TYPE (node
);
1596 op0
= TREE_OPERAND (node
, 0);
1597 if (type
!= TREE_TYPE (op0
))
1599 pp_character (buffer
, '(');
1600 dump_generic_node (buffer
, type
, spc
, flags
, false);
1601 pp_string (buffer
, ") ");
1603 if (op_prio (op0
) < op_prio (node
))
1604 pp_character (buffer
, '(');
1605 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1606 if (op_prio (op0
) < op_prio (node
))
1607 pp_character (buffer
, ')');
1610 case VIEW_CONVERT_EXPR
:
1611 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
1612 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1613 pp_string (buffer
, ">(");
1614 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1615 pp_character (buffer
, ')');
1619 pp_string (buffer
, "((");
1620 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1621 pp_string (buffer
, "))");
1624 case NON_LVALUE_EXPR
:
1625 pp_string (buffer
, "NON_LVALUE_EXPR <");
1626 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1627 pp_character (buffer
, '>');
1631 pp_string (buffer
, "SAVE_EXPR <");
1632 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1633 pp_character (buffer
, '>');
1637 pp_string (buffer
, "COMPLEX_EXPR <");
1638 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1639 pp_string (buffer
, ", ");
1640 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1641 pp_string (buffer
, ">");
1645 pp_string (buffer
, "CONJ_EXPR <");
1646 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1647 pp_string (buffer
, ">");
1651 pp_string (buffer
, "REALPART_EXPR <");
1652 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1653 pp_string (buffer
, ">");
1657 pp_string (buffer
, "IMAGPART_EXPR <");
1658 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1659 pp_string (buffer
, ">");
1663 pp_string (buffer
, "VA_ARG_EXPR <");
1664 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1665 pp_string (buffer
, ">");
1668 case TRY_FINALLY_EXPR
:
1669 case TRY_CATCH_EXPR
:
1670 pp_string (buffer
, "try");
1671 newline_and_indent (buffer
, spc
+2);
1672 pp_string (buffer
, "{");
1673 newline_and_indent (buffer
, spc
+4);
1674 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
1675 newline_and_indent (buffer
, spc
+2);
1676 pp_string (buffer
, "}");
1677 newline_and_indent (buffer
, spc
);
1679 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
1680 newline_and_indent (buffer
, spc
+2);
1681 pp_string (buffer
, "{");
1682 newline_and_indent (buffer
, spc
+4);
1683 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
1684 newline_and_indent (buffer
, spc
+2);
1685 pp_string (buffer
, "}");
1690 pp_string (buffer
, "catch (");
1691 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
1692 pp_string (buffer
, ")");
1693 newline_and_indent (buffer
, spc
+2);
1694 pp_string (buffer
, "{");
1695 newline_and_indent (buffer
, spc
+4);
1696 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
1697 newline_and_indent (buffer
, spc
+2);
1698 pp_string (buffer
, "}");
1702 case EH_FILTER_EXPR
:
1703 pp_string (buffer
, "<<<eh_filter (");
1704 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
1705 pp_string (buffer
, ")>>>");
1706 newline_and_indent (buffer
, spc
+2);
1707 pp_string (buffer
, "{");
1708 newline_and_indent (buffer
, spc
+4);
1709 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
1710 newline_and_indent (buffer
, spc
+2);
1711 pp_string (buffer
, "}");
1716 op0
= TREE_OPERAND (node
, 0);
1717 /* If this is for break or continue, don't bother printing it. */
1718 if (DECL_NAME (op0
))
1720 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1721 if (strcmp (name
, "break") == 0
1722 || strcmp (name
, "continue") == 0)
1725 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1726 pp_character (buffer
, ':');
1727 if (DECL_NONLOCAL (op0
))
1728 pp_string (buffer
, " [non-local]");
1732 pp_string (buffer
, "while (1)");
1733 if (!(flags
& TDF_SLIM
))
1735 newline_and_indent (buffer
, spc
+2);
1736 pp_character (buffer
, '{');
1737 newline_and_indent (buffer
, spc
+4);
1738 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
1739 newline_and_indent (buffer
, spc
+2);
1740 pp_character (buffer
, '}');
1746 pp_string (buffer
, "// predicted ");
1747 if (PREDICT_EXPR_OUTCOME (node
))
1748 pp_string (buffer
, "likely by ");
1750 pp_string (buffer
, "unlikely by ");
1751 pp_string (buffer
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
1752 pp_string (buffer
, " predictor.");
1756 pp_string (buffer
, "return");
1757 op0
= TREE_OPERAND (node
, 0);
1761 if (TREE_CODE (op0
) == MODIFY_EXPR
)
1762 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1),
1765 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1770 pp_string (buffer
, "if (");
1771 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1772 pp_string (buffer
, ") break");
1776 pp_string (buffer
, "switch (");
1777 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
1778 pp_character (buffer
, ')');
1779 if (!(flags
& TDF_SLIM
))
1781 newline_and_indent (buffer
, spc
+2);
1782 pp_character (buffer
, '{');
1783 if (SWITCH_BODY (node
))
1785 newline_and_indent (buffer
, spc
+4);
1786 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
1791 tree vec
= SWITCH_LABELS (node
);
1792 size_t i
, n
= TREE_VEC_LENGTH (vec
);
1793 for (i
= 0; i
< n
; ++i
)
1795 tree elt
= TREE_VEC_ELT (vec
, i
);
1796 newline_and_indent (buffer
, spc
+4);
1799 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
1800 pp_string (buffer
, " goto ");
1801 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
1803 pp_semicolon (buffer
);
1806 pp_string (buffer
, "case ???: goto ???;");
1809 newline_and_indent (buffer
, spc
+2);
1810 pp_character (buffer
, '}');
1816 op0
= GOTO_DESTINATION (node
);
1817 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
1819 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1820 if (strcmp (name
, "break") == 0
1821 || strcmp (name
, "continue") == 0)
1823 pp_string (buffer
, name
);
1827 pp_string (buffer
, "goto ");
1828 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1832 pp_string (buffer
, "__asm__");
1833 if (ASM_VOLATILE_P (node
))
1834 pp_string (buffer
, " __volatile__");
1835 pp_character (buffer
, '(');
1836 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
1837 pp_character (buffer
, ':');
1838 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
1839 pp_character (buffer
, ':');
1840 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
1841 if (ASM_CLOBBERS (node
))
1843 pp_character (buffer
, ':');
1844 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
1846 pp_string (buffer
, ")");
1849 case CASE_LABEL_EXPR
:
1850 if (CASE_LOW (node
) && CASE_HIGH (node
))
1852 pp_string (buffer
, "case ");
1853 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1854 pp_string (buffer
, " ... ");
1855 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
1857 else if (CASE_LOW (node
))
1859 pp_string (buffer
, "case ");
1860 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
1863 pp_string (buffer
, "default");
1864 pp_character (buffer
, ':');
1868 pp_string (buffer
, "OBJ_TYPE_REF(");
1869 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
1870 pp_character (buffer
, ';');
1871 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
1872 pp_character (buffer
, '-');
1873 pp_character (buffer
, '>');
1874 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
1875 pp_character (buffer
, ')');
1879 dump_generic_node (buffer
, SSA_NAME_VAR (node
), spc
, flags
, false);
1880 pp_string (buffer
, "_");
1881 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
1882 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
1883 pp_string (buffer
, "(ab)");
1884 else if (SSA_NAME_IS_DEFAULT_DEF (node
))
1885 pp_string (buffer
, "(D)");
1888 case WITH_SIZE_EXPR
:
1889 pp_string (buffer
, "WITH_SIZE_EXPR <");
1890 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1891 pp_string (buffer
, ", ");
1892 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1893 pp_string (buffer
, ">");
1897 pp_string (buffer
, "ASSERT_EXPR <");
1898 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
1899 pp_string (buffer
, ", ");
1900 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
1901 pp_string (buffer
, ">");
1905 pp_string (buffer
, "scev_known");
1908 case SCEV_NOT_KNOWN
:
1909 pp_string (buffer
, "scev_not_known");
1912 case POLYNOMIAL_CHREC
:
1913 pp_string (buffer
, "{");
1914 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
1915 pp_string (buffer
, ", +, ");
1916 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
1917 pp_string (buffer
, "}_");
1918 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
1922 case REALIGN_LOAD_EXPR
:
1923 pp_string (buffer
, "REALIGN_LOAD <");
1924 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1925 pp_string (buffer
, ", ");
1926 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1927 pp_string (buffer
, ", ");
1928 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1929 pp_string (buffer
, ">");
1933 pp_string (buffer
, " VEC_COND_EXPR < ");
1934 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1935 pp_string (buffer
, " , ");
1936 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1937 pp_string (buffer
, " , ");
1938 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1939 pp_string (buffer
, " > ");
1943 pp_string (buffer
, " DOT_PROD_EXPR < ");
1944 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1945 pp_string (buffer
, ", ");
1946 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1947 pp_string (buffer
, ", ");
1948 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1949 pp_string (buffer
, " > ");
1953 pp_string (buffer
, "#pragma omp parallel");
1954 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
1957 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
1959 newline_and_indent (buffer
, spc
+ 2);
1960 pp_character (buffer
, '{');
1961 newline_and_indent (buffer
, spc
+ 4);
1962 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
1963 newline_and_indent (buffer
, spc
+ 2);
1964 pp_character (buffer
, '}');
1970 pp_string (buffer
, "#pragma omp task");
1971 dump_omp_clauses (buffer
, OMP_TASK_CLAUSES (node
), spc
, flags
);
1975 pp_string (buffer
, "#pragma omp for");
1976 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
1978 if (!(flags
& TDF_SLIM
))
1982 if (OMP_FOR_PRE_BODY (node
))
1984 newline_and_indent (buffer
, spc
+ 2);
1985 pp_character (buffer
, '{');
1987 newline_and_indent (buffer
, spc
);
1988 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
1992 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
1995 newline_and_indent (buffer
, spc
);
1996 pp_string (buffer
, "for (");
1997 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
1999 pp_string (buffer
, "; ");
2000 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
2002 pp_string (buffer
, "; ");
2003 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
2005 pp_string (buffer
, ")");
2007 if (OMP_FOR_BODY (node
))
2009 newline_and_indent (buffer
, spc
+ 2);
2010 pp_character (buffer
, '{');
2011 newline_and_indent (buffer
, spc
+ 4);
2012 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
2014 newline_and_indent (buffer
, spc
+ 2);
2015 pp_character (buffer
, '}');
2017 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
2018 if (OMP_FOR_PRE_BODY (node
))
2021 newline_and_indent (buffer
, spc
+ 2);
2022 pp_character (buffer
, '}');
2029 pp_string (buffer
, "#pragma omp sections");
2030 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
2034 pp_string (buffer
, "#pragma omp section");
2038 pp_string (buffer
, "#pragma omp master");
2042 pp_string (buffer
, "#pragma omp ordered");
2046 pp_string (buffer
, "#pragma omp critical");
2047 if (OMP_CRITICAL_NAME (node
))
2050 pp_character (buffer
, '(');
2051 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
2053 pp_character (buffer
, ')');
2058 pp_string (buffer
, "#pragma omp atomic");
2059 newline_and_indent (buffer
, spc
+ 2);
2060 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2062 pp_character (buffer
, '=');
2064 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2068 pp_string (buffer
, "#pragma omp single");
2069 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
2073 dump_omp_clause (buffer
, node
, spc
, flags
);
2077 case REDUC_MAX_EXPR
:
2078 pp_string (buffer
, " REDUC_MAX_EXPR < ");
2079 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2080 pp_string (buffer
, " > ");
2083 case REDUC_MIN_EXPR
:
2084 pp_string (buffer
, " REDUC_MIN_EXPR < ");
2085 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2086 pp_string (buffer
, " > ");
2089 case REDUC_PLUS_EXPR
:
2090 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
2091 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2092 pp_string (buffer
, " > ");
2095 case VEC_WIDEN_MULT_HI_EXPR
:
2096 pp_string (buffer
, " VEC_WIDEN_MULT_HI_EXPR < ");
2097 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2098 pp_string (buffer
, ", ");
2099 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2100 pp_string (buffer
, " > ");
2103 case VEC_WIDEN_MULT_LO_EXPR
:
2104 pp_string (buffer
, " VEC_WIDEN_MULT_LO_EXPR < ");
2105 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2106 pp_string (buffer
, ", ");
2107 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2108 pp_string (buffer
, " > ");
2111 case VEC_UNPACK_HI_EXPR
:
2112 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
2113 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2114 pp_string (buffer
, " > ");
2117 case VEC_UNPACK_LO_EXPR
:
2118 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
2119 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2120 pp_string (buffer
, " > ");
2123 case VEC_UNPACK_FLOAT_HI_EXPR
:
2124 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2125 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2126 pp_string (buffer
, " > ");
2129 case VEC_UNPACK_FLOAT_LO_EXPR
:
2130 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2131 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2132 pp_string (buffer
, " > ");
2135 case VEC_PACK_TRUNC_EXPR
:
2136 pp_string (buffer
, " VEC_PACK_TRUNC_EXPR < ");
2137 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2138 pp_string (buffer
, ", ");
2139 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2140 pp_string (buffer
, " > ");
2143 case VEC_PACK_SAT_EXPR
:
2144 pp_string (buffer
, " VEC_PACK_SAT_EXPR < ");
2145 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2146 pp_string (buffer
, ", ");
2147 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2148 pp_string (buffer
, " > ");
2151 case VEC_PACK_FIX_TRUNC_EXPR
:
2152 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2153 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2154 pp_string (buffer
, ", ");
2155 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2156 pp_string (buffer
, " > ");
2160 dump_block_node (buffer
, node
, spc
, flags
);
2163 case VEC_EXTRACT_EVEN_EXPR
:
2164 pp_string (buffer
, " VEC_EXTRACT_EVEN_EXPR < ");
2165 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2166 pp_string (buffer
, ", ");
2167 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2168 pp_string (buffer
, " > ");
2171 case VEC_EXTRACT_ODD_EXPR
:
2172 pp_string (buffer
, " VEC_EXTRACT_ODD_EXPR < ");
2173 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2174 pp_string (buffer
, ", ");
2175 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2176 pp_string (buffer
, " > ");
2179 case VEC_INTERLEAVE_HIGH_EXPR
:
2180 pp_string (buffer
, " VEC_INTERLEAVE_HIGH_EXPR < ");
2181 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2182 pp_string (buffer
, ", ");
2183 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2184 pp_string (buffer
, " > ");
2187 case VEC_INTERLEAVE_LOW_EXPR
:
2188 pp_string (buffer
, " VEC_INTERLEAVE_LOW_EXPR < ");
2189 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2190 pp_string (buffer
, ", ");
2191 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2192 pp_string (buffer
, " > ");
2199 if (is_stmt
&& is_expr
)
2200 pp_semicolon (buffer
);
2202 /* If we're building a diagnostic, the formatted text will be written
2203 into BUFFER's stream by the caller; otherwise, write it now. */
2204 if (!(flags
& TDF_DIAGNOSTIC
))
2205 pp_write_text_to_stream (buffer
);
2210 /* Print the declaration of a variable. */
2213 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2217 if (TREE_CODE (t
) == TYPE_DECL
)
2218 pp_string (buffer
, "typedef ");
2220 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2221 pp_string (buffer
, "register ");
2223 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2224 pp_string (buffer
, "extern ");
2225 else if (TREE_STATIC (t
))
2226 pp_string (buffer
, "static ");
2228 /* Print the type and name. */
2229 if (TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2233 /* Print array's type. */
2234 tmp
= TREE_TYPE (t
);
2235 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2236 tmp
= TREE_TYPE (tmp
);
2237 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2239 /* Print variable's name. */
2241 dump_generic_node (buffer
, t
, spc
, flags
, false);
2243 /* Print the dimensions. */
2244 tmp
= TREE_TYPE (t
);
2245 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2247 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2248 tmp
= TREE_TYPE (tmp
);
2251 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2253 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2255 dump_decl_name (buffer
, t
, flags
);
2256 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2260 /* Print type declaration. */
2261 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2263 /* Print variable's name. */
2265 dump_generic_node (buffer
, t
, spc
, flags
, false);
2268 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2270 pp_string (buffer
, " __asm__ ");
2271 pp_character (buffer
, '(');
2272 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2273 pp_character (buffer
, ')');
2276 /* The initial value of a function serves to determine whether the function
2277 is declared or defined. So the following does not apply to function
2279 if (TREE_CODE (t
) != FUNCTION_DECL
)
2281 /* Print the initial value. */
2282 if (DECL_INITIAL (t
))
2285 pp_character (buffer
, '=');
2287 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2291 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2293 pp_string (buffer
, " [value-expr: ");
2294 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2295 pp_character (buffer
, ']');
2298 pp_character (buffer
, ';');
2302 /* Prints a structure: name, fields, and methods.
2303 FIXME: Still incomplete. */
2306 print_struct_decl (pretty_printer
*buffer
, const_tree node
, int spc
, int flags
)
2308 /* Print the name of the structure. */
2309 if (TYPE_NAME (node
))
2312 if (TREE_CODE (node
) == RECORD_TYPE
)
2313 pp_string (buffer
, "struct ");
2314 else if ((TREE_CODE (node
) == UNION_TYPE
2315 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
2316 pp_string (buffer
, "union ");
2318 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
2321 /* Print the contents of the structure. */
2322 pp_newline (buffer
);
2324 pp_character (buffer
, '{');
2325 pp_newline (buffer
);
2327 /* Print the fields of the structure. */
2330 tmp
= TYPE_FIELDS (node
);
2333 /* Avoid to print recursively the structure. */
2334 /* FIXME : Not implemented correctly...,
2335 what about the case when we have a cycle in the contain graph? ...
2336 Maybe this could be solved by looking at the scope in which the
2337 structure was declared. */
2338 if (TREE_TYPE (tmp
) != node
2339 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
2340 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
2342 print_declaration (buffer
, tmp
, spc
+2, flags
);
2343 pp_newline (buffer
);
2345 tmp
= TREE_CHAIN (tmp
);
2349 pp_character (buffer
, '}');
2352 /* Return the priority of the operator CODE.
2354 From lowest to highest precedence with either left-to-right (L-R)
2355 or right-to-left (R-L) associativity]:
2358 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2370 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2371 15 [L-R] fn() [] -> .
2373 unary +, - and * have higher precedence than the corresponding binary
2377 op_code_prio (enum tree_code code
)
2394 case TRUTH_ORIF_EXPR
:
2397 case TRUTH_AND_EXPR
:
2398 case TRUTH_ANDIF_EXPR
:
2405 case TRUTH_XOR_EXPR
:
2422 case UNORDERED_EXPR
:
2435 case WIDEN_SUM_EXPR
:
2437 case POINTER_PLUS_EXPR
:
2441 case VEC_WIDEN_MULT_HI_EXPR
:
2442 case VEC_WIDEN_MULT_LO_EXPR
:
2443 case WIDEN_MULT_EXPR
:
2446 case TRUNC_DIV_EXPR
:
2448 case FLOOR_DIV_EXPR
:
2449 case ROUND_DIV_EXPR
:
2451 case EXACT_DIV_EXPR
:
2452 case TRUNC_MOD_EXPR
:
2454 case FLOOR_MOD_EXPR
:
2455 case ROUND_MOD_EXPR
:
2458 case TRUTH_NOT_EXPR
:
2460 case POSTINCREMENT_EXPR
:
2461 case POSTDECREMENT_EXPR
:
2462 case PREINCREMENT_EXPR
:
2463 case PREDECREMENT_EXPR
:
2465 case ALIGN_INDIRECT_REF
:
2466 case MISALIGNED_INDIRECT_REF
:
2471 case FIX_TRUNC_EXPR
:
2477 case ARRAY_RANGE_REF
:
2481 /* Special expressions. */
2487 case REDUC_MAX_EXPR
:
2488 case REDUC_MIN_EXPR
:
2489 case REDUC_PLUS_EXPR
:
2490 case VEC_LSHIFT_EXPR
:
2491 case VEC_RSHIFT_EXPR
:
2492 case VEC_UNPACK_HI_EXPR
:
2493 case VEC_UNPACK_LO_EXPR
:
2494 case VEC_UNPACK_FLOAT_HI_EXPR
:
2495 case VEC_UNPACK_FLOAT_LO_EXPR
:
2496 case VEC_PACK_TRUNC_EXPR
:
2497 case VEC_PACK_SAT_EXPR
:
2501 /* Return an arbitrarily high precedence to avoid surrounding single
2502 VAR_DECLs in ()s. */
2507 /* Return the priority of the operator OP. */
2510 op_prio (const_tree op
)
2512 enum tree_code code
;
2517 code
= TREE_CODE (op
);
2518 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
2519 return op_prio (TREE_OPERAND (op
, 0));
2521 return op_code_prio (code
);
2524 /* Return the symbol associated with operator CODE. */
2527 op_symbol_code (enum tree_code code
)
2535 case TRUTH_ORIF_EXPR
:
2538 case TRUTH_AND_EXPR
:
2539 case TRUTH_ANDIF_EXPR
:
2545 case TRUTH_XOR_EXPR
:
2555 case UNORDERED_EXPR
:
2601 case VEC_LSHIFT_EXPR
:
2604 case VEC_RSHIFT_EXPR
:
2607 case POINTER_PLUS_EXPR
:
2613 case REDUC_PLUS_EXPR
:
2616 case WIDEN_SUM_EXPR
:
2619 case WIDEN_MULT_EXPR
:
2629 case TRUTH_NOT_EXPR
:
2636 case ALIGN_INDIRECT_REF
:
2639 case MISALIGNED_INDIRECT_REF
:
2642 case TRUNC_DIV_EXPR
:
2649 case FLOOR_DIV_EXPR
:
2652 case ROUND_DIV_EXPR
:
2655 case EXACT_DIV_EXPR
:
2658 case TRUNC_MOD_EXPR
:
2664 case FLOOR_MOD_EXPR
:
2667 case ROUND_MOD_EXPR
:
2670 case PREDECREMENT_EXPR
:
2673 case PREINCREMENT_EXPR
:
2676 case POSTDECREMENT_EXPR
:
2679 case POSTINCREMENT_EXPR
:
2689 return "<<< ??? >>>";
2693 /* Return the symbol associated with operator OP. */
2696 op_symbol (const_tree op
)
2698 return op_symbol_code (TREE_CODE (op
));
2701 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
2702 the gimple_call_fn of a GIMPLE_CALL. */
2705 print_call_name (pretty_printer
*buffer
, tree node
, int flags
)
2709 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
2710 op0
= TREE_OPERAND (op0
, 0);
2713 switch (TREE_CODE (op0
))
2718 dump_function_name (buffer
, op0
, flags
);
2724 op0
= TREE_OPERAND (op0
, 0);
2728 pp_string (buffer
, "(");
2729 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, flags
, false);
2730 pp_string (buffer
, ") ? ");
2731 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, flags
, false);
2732 pp_string (buffer
, " : ");
2733 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, flags
, false);
2737 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2738 dump_function_name (buffer
, TREE_OPERAND (op0
, 0), flags
);
2740 dump_generic_node (buffer
, op0
, 0, flags
, false);
2746 dump_generic_node (buffer
, op0
, 0, flags
, false);
2754 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2757 pretty_print_string (pretty_printer
*buffer
, const char *str
)
2767 pp_string (buffer
, "\\b");
2771 pp_string (buffer
, "\\f");
2775 pp_string (buffer
, "\\n");
2779 pp_string (buffer
, "\\r");
2783 pp_string (buffer
, "\\t");
2787 pp_string (buffer
, "\\v");
2791 pp_string (buffer
, "\\\\");
2795 pp_string (buffer
, "\\\"");
2799 pp_string (buffer
, "\\'");
2802 /* No need to handle \0; the loop terminates on \0. */
2805 pp_string (buffer
, "\\1");
2809 pp_string (buffer
, "\\2");
2813 pp_string (buffer
, "\\3");
2817 pp_string (buffer
, "\\4");
2821 pp_string (buffer
, "\\5");
2825 pp_string (buffer
, "\\6");
2829 pp_string (buffer
, "\\7");
2833 pp_character (buffer
, str
[0]);
2841 maybe_init_pretty_print (FILE *file
)
2845 pp_construct (&buffer
, /* prefix */NULL
, /* line-width */0);
2846 pp_needs_newline (&buffer
) = true;
2847 pp_translate_identifiers (&buffer
) = false;
2851 buffer
.buffer
->stream
= file
;
2855 newline_and_indent (pretty_printer
*buffer
, int spc
)
2857 pp_newline (buffer
);