1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001-2013 Free Software Foundation, Inc.
3 Adapted from c-pretty-print.c by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
26 #include "tree-pretty-print.h"
28 #include "tree-flow.h"
29 #include "langhooks.h"
30 #include "tree-iterator.h"
31 #include "tree-chrec.h"
33 #include "value-prof.h"
36 /* Local functions, macros and variables. */
37 static const char *op_symbol (const_tree
);
38 static void pretty_print_string (pretty_printer
*, const char*);
39 static void newline_and_indent (pretty_printer
*, int);
40 static void maybe_init_pretty_print (FILE *);
41 static void print_struct_decl (pretty_printer
*, const_tree
, int, int);
42 static void do_niy (pretty_printer
*, const_tree
);
44 #define INDENT(SPACE) do { \
45 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
47 #define NIY do_niy(buffer,node)
49 static pretty_printer buffer
;
50 static int initialized
= 0;
52 /* Try to print something for an unknown tree code. */
55 do_niy (pretty_printer
*buffer
, const_tree node
)
59 pp_string (buffer
, "<<< Unknown tree: ");
60 pp_string (buffer
, tree_code_name
[(int) TREE_CODE (node
)]);
64 len
= TREE_OPERAND_LENGTH (node
);
65 for (i
= 0; i
< len
; ++i
)
67 newline_and_indent (buffer
, 2);
68 dump_generic_node (buffer
, TREE_OPERAND (node
, i
), 2, 0, false);
72 pp_string (buffer
, " >>>");
75 /* Debugging function to print out a generic expression. */
78 debug_generic_expr (tree t
)
80 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
81 fprintf (stderr
, "\n");
84 /* Debugging function to print out a generic statement. */
87 debug_generic_stmt (tree t
)
89 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
90 fprintf (stderr
, "\n");
93 /* Debugging function to print out a chain of trees . */
96 debug_tree_chain (tree t
)
98 struct pointer_set_t
*seen
= pointer_set_create ();
102 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
103 fprintf (stderr
, " ");
105 if (pointer_set_insert (seen
, t
))
107 fprintf (stderr
, "... [cycled back to ");
108 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
109 fprintf (stderr
, "]");
113 fprintf (stderr
, "\n");
115 pointer_set_destroy (seen
);
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 dumpfile.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);
135 pp_newline_and_flush (&buffer
);
138 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
139 to show in the dump. See TDF_* in dumpfile.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);
152 pp_newline_and_flush (&buffer
);
155 /* Print a single expression T on file FILE. FLAGS specifies details to show
156 in the dump. See TDF_* in dumpfile.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);
166 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
170 dump_decl_name (pretty_printer
*buffer
, tree node
, int flags
)
172 if (DECL_NAME (node
))
174 if ((flags
& TDF_ASMNAME
) && DECL_ASSEMBLER_NAME_SET_P (node
))
175 pp_tree_identifier (buffer
, DECL_ASSEMBLER_NAME (node
));
177 pp_tree_identifier (buffer
, DECL_NAME (node
));
179 if ((flags
& TDF_UID
) || DECL_NAME (node
) == NULL_TREE
)
181 if (TREE_CODE (node
) == LABEL_DECL
&& LABEL_DECL_UID (node
) != -1)
182 pp_printf (buffer
, "L.%d", (int) LABEL_DECL_UID (node
));
183 else if (TREE_CODE (node
) == DEBUG_EXPR_DECL
)
185 if (flags
& TDF_NOUID
)
186 pp_string (buffer
, "D#xxxx");
188 pp_printf (buffer
, "D#%i", DEBUG_TEMP_UID (node
));
192 char c
= TREE_CODE (node
) == CONST_DECL
? 'C' : 'D';
193 if (flags
& TDF_NOUID
)
194 pp_printf (buffer
, "%c.xxxx", c
);
196 pp_printf (buffer
, "%c.%u", c
, DECL_UID (node
));
199 if ((flags
& TDF_ALIAS
) && DECL_PT_UID (node
) != DECL_UID (node
))
201 if (flags
& TDF_NOUID
)
202 pp_printf (buffer
, "ptD.xxxx");
204 pp_printf (buffer
, "ptD.%u", DECL_PT_UID (node
));
208 /* Like the above, but used for pretty printing function calls. */
211 dump_function_name (pretty_printer
*buffer
, tree node
, int flags
)
213 if (TREE_CODE (node
) == NOP_EXPR
)
214 node
= TREE_OPERAND (node
, 0);
215 if (DECL_NAME (node
) && (flags
& TDF_ASMNAME
) == 0)
216 pp_string (buffer
, lang_hooks
.decl_printable_name (node
, 1));
218 dump_decl_name (buffer
, node
, flags
);
221 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
222 FLAGS are as in dump_generic_node. */
225 dump_function_declaration (pretty_printer
*buffer
, tree node
,
228 bool wrote_arg
= false;
232 pp_character (buffer
, '(');
234 /* Print the argument types. */
235 arg
= TYPE_ARG_TYPES (node
);
236 while (arg
&& arg
!= void_list_node
&& arg
!= error_mark_node
)
240 pp_character (buffer
, ',');
244 dump_generic_node (buffer
, TREE_VALUE (arg
), spc
, flags
, false);
245 arg
= TREE_CHAIN (arg
);
248 /* Drop the trailing void_type_node if we had any previous argument. */
249 if (arg
== void_list_node
&& !wrote_arg
)
250 pp_string (buffer
, "void");
251 /* Properly dump vararg function types. */
252 else if (!arg
&& wrote_arg
)
253 pp_string (buffer
, ", ...");
254 /* Avoid printing any arg for unprototyped functions. */
256 pp_character (buffer
, ')');
259 /* Dump the domain associated with an array. */
262 dump_array_domain (pretty_printer
*buffer
, tree domain
, int spc
, int flags
)
264 pp_character (buffer
, '[');
267 tree min
= TYPE_MIN_VALUE (domain
);
268 tree max
= TYPE_MAX_VALUE (domain
);
271 && integer_zerop (min
)
272 && host_integerp (max
, 0))
273 pp_wide_integer (buffer
, TREE_INT_CST_LOW (max
) + 1);
277 dump_generic_node (buffer
, min
, spc
, flags
, false);
278 pp_character (buffer
, ':');
280 dump_generic_node (buffer
, max
, spc
, flags
, false);
284 pp_string (buffer
, "<unknown>");
285 pp_character (buffer
, ']');
289 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
290 dump_generic_node. */
293 dump_omp_clause (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
297 switch (OMP_CLAUSE_CODE (clause
))
299 case OMP_CLAUSE_PRIVATE
:
302 case OMP_CLAUSE_SHARED
:
305 case OMP_CLAUSE_FIRSTPRIVATE
:
306 name
= "firstprivate";
308 case OMP_CLAUSE_LASTPRIVATE
:
309 name
= "lastprivate";
311 case OMP_CLAUSE_COPYIN
:
314 case OMP_CLAUSE_COPYPRIVATE
:
315 name
= "copyprivate";
318 pp_string (buffer
, name
);
319 pp_character (buffer
, '(');
320 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
322 pp_character (buffer
, ')');
325 case OMP_CLAUSE_REDUCTION
:
326 pp_string (buffer
, "reduction(");
327 pp_string (buffer
, op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
328 pp_character (buffer
, ':');
329 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
331 pp_character (buffer
, ')');
335 pp_string (buffer
, "if(");
336 dump_generic_node (buffer
, OMP_CLAUSE_IF_EXPR (clause
),
338 pp_character (buffer
, ')');
341 case OMP_CLAUSE_NUM_THREADS
:
342 pp_string (buffer
, "num_threads(");
343 dump_generic_node (buffer
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
345 pp_character (buffer
, ')');
348 case OMP_CLAUSE_NOWAIT
:
349 pp_string (buffer
, "nowait");
351 case OMP_CLAUSE_ORDERED
:
352 pp_string (buffer
, "ordered");
355 case OMP_CLAUSE_DEFAULT
:
356 pp_string (buffer
, "default(");
357 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
359 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
361 case OMP_CLAUSE_DEFAULT_SHARED
:
362 pp_string (buffer
, "shared");
364 case OMP_CLAUSE_DEFAULT_NONE
:
365 pp_string (buffer
, "none");
367 case OMP_CLAUSE_DEFAULT_PRIVATE
:
368 pp_string (buffer
, "private");
370 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
371 pp_string (buffer
, "firstprivate");
376 pp_character (buffer
, ')');
379 case OMP_CLAUSE_SCHEDULE
:
380 pp_string (buffer
, "schedule(");
381 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
383 case OMP_CLAUSE_SCHEDULE_STATIC
:
384 pp_string (buffer
, "static");
386 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
387 pp_string (buffer
, "dynamic");
389 case OMP_CLAUSE_SCHEDULE_GUIDED
:
390 pp_string (buffer
, "guided");
392 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
393 pp_string (buffer
, "runtime");
395 case OMP_CLAUSE_SCHEDULE_AUTO
:
396 pp_string (buffer
, "auto");
401 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
403 pp_character (buffer
, ',');
404 dump_generic_node (buffer
,
405 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
408 pp_character (buffer
, ')');
411 case OMP_CLAUSE_UNTIED
:
412 pp_string (buffer
, "untied");
415 case OMP_CLAUSE_COLLAPSE
:
416 pp_string (buffer
, "collapse(");
417 dump_generic_node (buffer
,
418 OMP_CLAUSE_COLLAPSE_EXPR (clause
),
420 pp_character (buffer
, ')');
423 case OMP_CLAUSE_FINAL
:
424 pp_string (buffer
, "final(");
425 dump_generic_node (buffer
, OMP_CLAUSE_FINAL_EXPR (clause
),
427 pp_character (buffer
, ')');
430 case OMP_CLAUSE_MERGEABLE
:
431 pp_string (buffer
, "mergeable");
435 /* Should never happen. */
436 dump_generic_node (buffer
, clause
, spc
, flags
, false);
442 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
443 dump_generic_node. */
446 dump_omp_clauses (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
454 dump_omp_clause (buffer
, clause
, spc
, flags
);
455 clause
= OMP_CLAUSE_CHAIN (clause
);
463 /* Dump location LOC to BUFFER. */
466 dump_location (pretty_printer
*buffer
, location_t loc
)
468 expanded_location xloc
= expand_location (loc
);
470 pp_character (buffer
, '[');
473 pp_string (buffer
, xloc
.file
);
474 pp_string (buffer
, " : ");
476 pp_decimal_int (buffer
, xloc
.line
);
477 pp_string (buffer
, "] ");
481 /* Dump lexical block BLOCK. BUFFER, SPC and FLAGS are as in
482 dump_generic_node. */
485 dump_block_node (pretty_printer
*buffer
, tree block
, int spc
, int flags
)
489 pp_printf (buffer
, "BLOCK #%d ", BLOCK_NUMBER (block
));
491 if (flags
& TDF_ADDRESS
)
492 pp_printf (buffer
, "[%p] ", (void *) block
);
494 if (BLOCK_ABSTRACT (block
))
495 pp_string (buffer
, "[abstract] ");
497 if (TREE_ASM_WRITTEN (block
))
498 pp_string (buffer
, "[written] ");
500 if (flags
& TDF_SLIM
)
503 if (BLOCK_SOURCE_LOCATION (block
))
504 dump_location (buffer
, BLOCK_SOURCE_LOCATION (block
));
506 newline_and_indent (buffer
, spc
+ 2);
508 if (BLOCK_SUPERCONTEXT (block
))
510 pp_string (buffer
, "SUPERCONTEXT: ");
511 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (block
), 0,
512 flags
| TDF_SLIM
, false);
513 newline_and_indent (buffer
, spc
+ 2);
516 if (BLOCK_SUBBLOCKS (block
))
518 pp_string (buffer
, "SUBBLOCKS: ");
519 for (t
= BLOCK_SUBBLOCKS (block
); t
; t
= BLOCK_CHAIN (t
))
521 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
522 pp_string (buffer
, " ");
524 newline_and_indent (buffer
, spc
+ 2);
527 if (BLOCK_CHAIN (block
))
529 pp_string (buffer
, "SIBLINGS: ");
530 for (t
= BLOCK_CHAIN (block
); t
; t
= BLOCK_CHAIN (t
))
532 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
533 pp_string (buffer
, " ");
535 newline_and_indent (buffer
, spc
+ 2);
538 if (BLOCK_VARS (block
))
540 pp_string (buffer
, "VARS: ");
541 for (t
= BLOCK_VARS (block
); t
; t
= TREE_CHAIN (t
))
543 dump_generic_node (buffer
, t
, 0, flags
, false);
544 pp_string (buffer
, " ");
546 newline_and_indent (buffer
, spc
+ 2);
549 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block
)) > 0)
552 vec
<tree
, va_gc
> *nlv
= BLOCK_NONLOCALIZED_VARS (block
);
554 pp_string (buffer
, "NONLOCALIZED_VARS: ");
555 FOR_EACH_VEC_ELT (*nlv
, i
, t
)
557 dump_generic_node (buffer
, t
, 0, flags
, false);
558 pp_string (buffer
, " ");
560 newline_and_indent (buffer
, spc
+ 2);
563 if (BLOCK_ABSTRACT_ORIGIN (block
))
565 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
566 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (block
), 0,
567 flags
| TDF_SLIM
, false);
568 newline_and_indent (buffer
, spc
+ 2);
571 if (BLOCK_FRAGMENT_ORIGIN (block
))
573 pp_string (buffer
, "FRAGMENT_ORIGIN: ");
574 dump_generic_node (buffer
, BLOCK_FRAGMENT_ORIGIN (block
), 0,
575 flags
| TDF_SLIM
, false);
576 newline_and_indent (buffer
, spc
+ 2);
579 if (BLOCK_FRAGMENT_CHAIN (block
))
581 pp_string (buffer
, "FRAGMENT_CHAIN: ");
582 for (t
= BLOCK_FRAGMENT_CHAIN (block
); t
; t
= BLOCK_FRAGMENT_CHAIN (t
))
584 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
585 pp_string (buffer
, " ");
587 newline_and_indent (buffer
, spc
+ 2);
593 dump_upc_type_quals (pretty_printer
*buffer
, tree type
, int quals
)
595 gcc_assert (type
&& TYPE_CHECK (type
));
596 gcc_assert (quals
& TYPE_QUAL_SHARED
);
597 if (quals
& TYPE_QUAL_STRICT
)
598 pp_string (buffer
, "strict ");
599 if (quals
& TYPE_QUAL_RELAXED
)
600 pp_string (buffer
, "relaxed ");
601 pp_string (buffer
, "shared ");
602 if (TYPE_HAS_BLOCK_FACTOR (type
))
604 tree block_factor
= TYPE_BLOCK_FACTOR (type
);
605 pp_string (buffer
, "[");
606 pp_wide_integer (buffer
, TREE_INT_CST_LOW (block_factor
));
607 pp_string (buffer
, "] ");
611 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
612 indent. FLAGS specifies details to show in the dump (see TDF_* in
613 dumpfile.h). If IS_STMT is true, the object printed is considered
614 to be a statement and it is terminated by ';' if appropriate. */
617 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
626 if (node
== NULL_TREE
)
629 is_expr
= EXPR_P (node
);
631 if (is_stmt
&& (flags
& TDF_STMTADDR
))
632 pp_printf (buffer
, "<&%p> ", (void *)node
);
634 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
635 dump_location (buffer
, EXPR_LOCATION (node
));
637 code
= TREE_CODE (node
);
641 pp_string (buffer
, "<<< error >>>");
644 case IDENTIFIER_NODE
:
645 pp_tree_identifier (buffer
, node
);
649 while (node
&& node
!= error_mark_node
)
651 if (TREE_PURPOSE (node
))
653 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
656 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
657 node
= TREE_CHAIN (node
);
658 if (node
&& TREE_CODE (node
) == TREE_LIST
)
660 pp_character (buffer
, ',');
667 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
673 if (TREE_VEC_LENGTH (node
) > 0)
675 size_t len
= TREE_VEC_LENGTH (node
);
676 for (i
= 0; i
< len
- 1; i
++)
678 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
680 pp_character (buffer
, ',');
683 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
692 case FIXED_POINT_TYPE
:
698 unsigned int quals
= TYPE_QUALS (node
);
699 enum tree_code_class tclass
;
701 if (quals
& TYPE_QUAL_CONST
)
702 pp_string (buffer
, "const ");
703 else if (quals
& TYPE_QUAL_VOLATILE
)
704 pp_string (buffer
, "volatile ");
705 else if (quals
& TYPE_QUAL_RESTRICT
)
706 pp_string (buffer
, "restrict ");
707 else if (quals
& TYPE_QUAL_SHARED
)
708 dump_upc_type_quals (buffer
, node
, quals
);
710 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
712 pp_string (buffer
, "<address-space-");
713 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
714 pp_string (buffer
, "> ");
717 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
719 if (tclass
== tcc_declaration
)
721 if (DECL_NAME (node
))
722 dump_decl_name (buffer
, node
, flags
);
724 pp_string (buffer
, "<unnamed type decl>");
726 else if (tclass
== tcc_type
)
728 if (TYPE_NAME (node
))
730 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
731 pp_tree_identifier (buffer
, TYPE_NAME (node
));
732 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
733 && DECL_NAME (TYPE_NAME (node
)))
734 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
736 pp_string (buffer
, "<unnamed type>");
738 else if (TREE_CODE (node
) == VECTOR_TYPE
)
740 pp_string (buffer
, "vector");
741 pp_character (buffer
, '(');
742 pp_wide_integer (buffer
, TYPE_VECTOR_SUBPARTS (node
));
743 pp_string (buffer
, ") ");
744 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
746 else if (TREE_CODE (node
) == INTEGER_TYPE
)
748 if (TYPE_PRECISION (node
) == CHAR_TYPE_SIZE
)
749 pp_string (buffer
, (TYPE_UNSIGNED (node
)
752 else if (TYPE_PRECISION (node
) == SHORT_TYPE_SIZE
)
753 pp_string (buffer
, (TYPE_UNSIGNED (node
)
756 else if (TYPE_PRECISION (node
) == INT_TYPE_SIZE
)
757 pp_string (buffer
, (TYPE_UNSIGNED (node
)
760 else if (TYPE_PRECISION (node
) == LONG_TYPE_SIZE
)
761 pp_string (buffer
, (TYPE_UNSIGNED (node
)
764 else if (TYPE_PRECISION (node
) == LONG_LONG_TYPE_SIZE
)
765 pp_string (buffer
, (TYPE_UNSIGNED (node
)
766 ? "unsigned long long"
767 : "signed long long"));
768 else if (TYPE_PRECISION (node
) >= CHAR_TYPE_SIZE
769 && exact_log2 (TYPE_PRECISION (node
)) != -1)
771 pp_string (buffer
, (TYPE_UNSIGNED (node
) ? "uint" : "int"));
772 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
773 pp_string (buffer
, "_t");
777 pp_string (buffer
, (TYPE_UNSIGNED (node
)
778 ? "<unnamed-unsigned:"
779 : "<unnamed-signed:"));
780 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
781 pp_string (buffer
, ">");
784 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
786 pp_string (buffer
, "__complex__ ");
787 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
789 else if (TREE_CODE (node
) == REAL_TYPE
)
791 pp_string (buffer
, "<float:");
792 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
793 pp_string (buffer
, ">");
795 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
797 pp_string (buffer
, "<fixed-point-");
798 pp_string (buffer
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
799 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
800 pp_string (buffer
, ">");
802 else if (TREE_CODE (node
) == VOID_TYPE
)
803 pp_string (buffer
, "void");
805 pp_string (buffer
, "<unnamed type>");
812 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
814 if (TREE_TYPE (node
) == NULL
)
816 pp_string (buffer
, str
);
817 pp_string (buffer
, "<null type>");
819 else if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
821 tree fnode
= TREE_TYPE (node
);
823 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
825 pp_character (buffer
, '(');
826 pp_string (buffer
, str
);
827 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
828 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
829 else if (flags
& TDF_NOUID
)
830 pp_printf (buffer
, "<Txxxx>");
832 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
834 pp_character (buffer
, ')');
835 dump_function_declaration (buffer
, fnode
, spc
, flags
);
839 unsigned int quals
= TYPE_QUALS (node
);
841 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
843 pp_string (buffer
, str
);
845 if (quals
& TYPE_QUAL_CONST
)
846 pp_string (buffer
, " const");
847 if (quals
& TYPE_QUAL_VOLATILE
)
848 pp_string (buffer
, " volatile");
849 if (quals
& TYPE_QUAL_RESTRICT
)
850 pp_string (buffer
, " restrict");
851 if (quals
& TYPE_QUAL_SHARED
)
853 if (quals
& TYPE_QUAL_STRICT
)
854 pp_string (buffer
, " strict");
855 if (quals
& TYPE_QUAL_RELAXED
)
856 pp_string (buffer
, " relaxed");
857 pp_string (buffer
, " shared");
860 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
862 pp_string (buffer
, " <address-space-");
863 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
864 pp_string (buffer
, ">");
867 if (TYPE_REF_CAN_ALIAS_ALL (node
))
868 pp_string (buffer
, " {ref-all}");
878 if (integer_zerop (TREE_OPERAND (node
, 1))
879 /* Dump the types of INTEGER_CSTs explicitly, for we can't
880 infer them and MEM_ATTR caching will share MEM_REFs
881 with differently-typed op0s. */
882 && TREE_CODE (TREE_OPERAND (node
, 0)) != INTEGER_CST
883 /* Released SSA_NAMES have no TREE_TYPE. */
884 && TREE_TYPE (TREE_OPERAND (node
, 0)) != NULL_TREE
885 /* Same pointer types, but ignoring POINTER_TYPE vs.
887 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 0)))
888 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))
889 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 0)))
890 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 1))))
891 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 0)))
892 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 1))))
893 /* Same value types ignoring qualifiers. */
894 && (TYPE_MAIN_VARIANT (TREE_TYPE (node
))
896 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))))
898 if (TREE_CODE (TREE_OPERAND (node
, 0)) != ADDR_EXPR
)
900 pp_string (buffer
, "*");
901 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
905 dump_generic_node (buffer
,
906 TREE_OPERAND (TREE_OPERAND (node
, 0), 0),
913 pp_string (buffer
, "MEM[");
914 pp_string (buffer
, "(");
915 ptype
= TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node
, 1)));
916 dump_generic_node (buffer
, ptype
,
917 spc
, flags
| TDF_SLIM
, false);
918 pp_string (buffer
, ")");
919 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
921 if (!integer_zerop (TREE_OPERAND (node
, 1)))
923 pp_string (buffer
, " + ");
924 dump_generic_node (buffer
, TREE_OPERAND (node
, 1),
927 pp_string (buffer
, "]");
934 const char *sep
= "";
937 pp_string (buffer
, "MEM[");
939 if (TREE_CODE (TMR_BASE (node
)) == ADDR_EXPR
)
941 pp_string (buffer
, sep
);
943 pp_string (buffer
, "symbol: ");
944 dump_generic_node (buffer
, TREE_OPERAND (TMR_BASE (node
), 0),
949 pp_string (buffer
, sep
);
951 pp_string (buffer
, "base: ");
952 dump_generic_node (buffer
, TMR_BASE (node
), spc
, flags
, false);
954 tmp
= TMR_INDEX2 (node
);
957 pp_string (buffer
, sep
);
959 pp_string (buffer
, "base: ");
960 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
962 tmp
= TMR_INDEX (node
);
965 pp_string (buffer
, sep
);
967 pp_string (buffer
, "index: ");
968 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
970 tmp
= TMR_STEP (node
);
973 pp_string (buffer
, sep
);
975 pp_string (buffer
, "step: ");
976 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
978 tmp
= TMR_OFFSET (node
);
981 pp_string (buffer
, sep
);
983 pp_string (buffer
, "offset: ");
984 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
986 pp_string (buffer
, "]");
994 /* Print the innermost component type. */
995 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
996 tmp
= TREE_TYPE (tmp
))
998 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1000 /* Print the dimensions. */
1001 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
1002 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
1008 case QUAL_UNION_TYPE
:
1010 unsigned int quals
= TYPE_QUALS (node
);
1012 if (quals
& TYPE_QUAL_CONST
)
1013 pp_string (buffer
, "const ");
1014 if (quals
& TYPE_QUAL_VOLATILE
)
1015 pp_string (buffer
, "volatile ");
1016 if (quals
& TYPE_QUAL_SHARED
)
1017 dump_upc_type_quals (buffer
, node
, quals
);
1019 /* Print the name of the structure. */
1020 if (TREE_CODE (node
) == RECORD_TYPE
)
1021 pp_string (buffer
, "struct ");
1022 else if (TREE_CODE (node
) == UNION_TYPE
)
1023 pp_string (buffer
, "union ");
1025 if (upc_pts_rep_type_node
&& node
== upc_pts_rep_type_node
)
1026 /* Normally, builtin types will not be printed.
1027 We short-circuit that check for the UPC "struct PTS"
1028 representation type. */
1029 pp_string (buffer
, "upc_shared_ptr_t");
1030 else if (TYPE_NAME (node
))
1031 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
1032 else if (!(flags
& TDF_SLIM
))
1033 /* FIXME: If we eliminate the 'else' above and attempt
1034 to show the fields for named types, we may get stuck
1035 following a cycle of pointers to structs. The alleged
1036 self-reference check in print_struct_decl will not detect
1037 cycles involving more than one pointer or struct type. */
1038 print_struct_decl (buffer
, node
, spc
, flags
);
1047 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
1049 /* In the case of a pointer, one may want to divide by the
1050 size of the pointed-to type. Unfortunately, this not
1051 straightforward. The C front-end maps expressions
1056 in such a way that the two INTEGER_CST nodes for "5" have
1057 different values but identical types. In the latter
1058 case, the 5 is multiplied by sizeof (int) in c-common.c
1059 (pointer_int_sum) to convert it to a byte address, and
1060 yet the type of the node is left unchanged. Argh. What
1061 is consistent though is that the number value corresponds
1062 to bytes (UNITS) offset.
1064 NB: Neither of the following divisors can be trivially
1065 used to recover the original literal:
1067 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1068 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1069 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
1070 pp_string (buffer
, "B"); /* pseudo-unit */
1072 else if (host_integerp (node
, 0))
1073 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
1074 else if (host_integerp (node
, 1))
1075 pp_unsigned_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
1079 unsigned HOST_WIDE_INT low
= TREE_INT_CST_LOW (val
);
1080 HOST_WIDE_INT high
= TREE_INT_CST_HIGH (val
);
1082 if (tree_int_cst_sgn (val
) < 0)
1084 pp_character (buffer
, '-');
1085 high
= ~high
+ !low
;
1088 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
1090 sprintf (pp_buffer (buffer
)->digit_buffer
,
1091 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
1092 (unsigned HOST_WIDE_INT
) high
, low
);
1093 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
1098 /* Code copied from print_node. */
1101 if (TREE_OVERFLOW (node
))
1102 pp_string (buffer
, " overflow");
1104 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
1105 d
= TREE_REAL_CST (node
);
1106 if (REAL_VALUE_ISINF (d
))
1107 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
1108 else if (REAL_VALUE_ISNAN (d
))
1109 pp_string (buffer
, " Nan");
1113 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
1114 pp_string (buffer
, string
);
1119 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
1120 pp_string (buffer
, "0x");
1121 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
1122 output_formatted_integer (buffer
, "%02x", *p
++);
1131 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
1132 pp_string (buffer
, string
);
1137 pp_string (buffer
, "__complex__ (");
1138 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
1139 pp_string (buffer
, ", ");
1140 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
1141 pp_string (buffer
, ")");
1145 pp_string (buffer
, "\"");
1146 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
1147 pp_string (buffer
, "\"");
1153 pp_string (buffer
, "{ ");
1154 for (i
= 0; i
< VECTOR_CST_NELTS (node
); ++i
)
1157 pp_string (buffer
, ", ");
1158 dump_generic_node (buffer
, VECTOR_CST_ELT (node
, i
),
1161 pp_string (buffer
, " }");
1167 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1169 if (TREE_CODE (node
) == METHOD_TYPE
)
1171 if (TYPE_METHOD_BASETYPE (node
))
1172 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
1175 pp_string (buffer
, "<null method basetype>");
1176 pp_string (buffer
, "::");
1178 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1179 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1180 else if (flags
& TDF_NOUID
)
1181 pp_printf (buffer
, "<Txxxx>");
1183 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1184 dump_function_declaration (buffer
, node
, spc
, flags
);
1189 dump_decl_name (buffer
, node
, flags
);
1193 if (DECL_NAME (node
))
1194 dump_decl_name (buffer
, node
, flags
);
1195 else if (LABEL_DECL_UID (node
) != -1)
1196 pp_printf (buffer
, "<L%d>", (int) LABEL_DECL_UID (node
));
1199 if (flags
& TDF_NOUID
)
1200 pp_string (buffer
, "<D.xxxx>");
1202 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
1207 if (DECL_IS_BUILTIN (node
))
1209 /* Don't print the declaration of built-in types. */
1212 if (DECL_NAME (node
))
1213 dump_decl_name (buffer
, node
, flags
);
1214 else if (TYPE_NAME (TREE_TYPE (node
)) != node
)
1216 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1217 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1218 && TYPE_METHODS (TREE_TYPE (node
)))
1220 /* The type is a c++ class: all structures have at least
1222 pp_string (buffer
, "class ");
1223 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1228 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
1229 ? "union" : "struct "));
1230 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1234 pp_string (buffer
, "<anon>");
1240 case DEBUG_EXPR_DECL
:
1241 case NAMESPACE_DECL
:
1242 dump_decl_name (buffer
, node
, flags
);
1246 pp_string (buffer
, "<retval>");
1250 op0
= TREE_OPERAND (node
, 0);
1253 && (TREE_CODE (op0
) == INDIRECT_REF
1254 || (TREE_CODE (op0
) == MEM_REF
1255 && TREE_CODE (TREE_OPERAND (op0
, 0)) != ADDR_EXPR
1256 && integer_zerop (TREE_OPERAND (op0
, 1))
1257 /* Dump the types of INTEGER_CSTs explicitly, for we
1258 can't infer them and MEM_ATTR caching will share
1259 MEM_REFs with differently-typed op0s. */
1260 && TREE_CODE (TREE_OPERAND (op0
, 0)) != INTEGER_CST
1261 /* Released SSA_NAMES have no TREE_TYPE. */
1262 && TREE_TYPE (TREE_OPERAND (op0
, 0)) != NULL_TREE
1263 /* Same pointer types, but ignoring POINTER_TYPE vs.
1265 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1266 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1267 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1268 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1269 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1270 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1271 /* Same value types ignoring qualifiers. */
1272 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0
))
1273 == TYPE_MAIN_VARIANT
1274 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))))))
1276 op0
= TREE_OPERAND (op0
, 0);
1279 if (op_prio (op0
) < op_prio (node
))
1280 pp_character (buffer
, '(');
1281 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1282 if (op_prio (op0
) < op_prio (node
))
1283 pp_character (buffer
, ')');
1284 pp_string (buffer
, str
);
1285 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1286 op0
= component_ref_field_offset (node
);
1287 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
1289 pp_string (buffer
, "{off: ");
1290 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1291 pp_character (buffer
, '}');
1296 pp_string (buffer
, "BIT_FIELD_REF <");
1297 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1298 pp_string (buffer
, ", ");
1299 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1300 pp_string (buffer
, ", ");
1301 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1302 pp_string (buffer
, ">");
1306 case ARRAY_RANGE_REF
:
1307 op0
= TREE_OPERAND (node
, 0);
1308 if (op_prio (op0
) < op_prio (node
))
1309 pp_character (buffer
, '(');
1310 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1311 if (op_prio (op0
) < op_prio (node
))
1312 pp_character (buffer
, ')');
1313 pp_character (buffer
, '[');
1314 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1315 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
1316 pp_string (buffer
, " ...");
1317 pp_character (buffer
, ']');
1319 op0
= array_ref_low_bound (node
);
1320 op1
= array_ref_element_size (node
);
1322 if (!integer_zerop (op0
)
1323 || TREE_OPERAND (node
, 2)
1324 || TREE_OPERAND (node
, 3))
1326 pp_string (buffer
, "{lb: ");
1327 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1328 pp_string (buffer
, " sz: ");
1329 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1330 pp_character (buffer
, '}');
1336 unsigned HOST_WIDE_INT ix
;
1338 bool is_struct_init
= false;
1339 bool is_array_init
= false;
1340 double_int curidx
= double_int_zero
;
1341 pp_character (buffer
, '{');
1342 if (TREE_CLOBBER_P (node
))
1343 pp_string (buffer
, "CLOBBER");
1344 else if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1345 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1346 is_struct_init
= true;
1347 else if (TREE_CODE (TREE_TYPE (node
)) == ARRAY_TYPE
1348 && TYPE_DOMAIN (TREE_TYPE (node
))
1349 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)))
1350 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
))))
1353 tree minv
= TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)));
1354 is_array_init
= true;
1355 curidx
= tree_to_double_int (minv
);
1357 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1363 pp_character (buffer
, '.');
1364 dump_generic_node (buffer
, field
, spc
, flags
, false);
1365 pp_character (buffer
, '=');
1367 else if (is_array_init
1368 && (TREE_CODE (field
) != INTEGER_CST
1369 || tree_to_double_int (field
) != curidx
))
1371 pp_character (buffer
, '[');
1372 if (TREE_CODE (field
) == RANGE_EXPR
)
1374 dump_generic_node (buffer
, TREE_OPERAND (field
, 0), spc
,
1376 pp_string (buffer
, " ... ");
1377 dump_generic_node (buffer
, TREE_OPERAND (field
, 1), spc
,
1379 if (TREE_CODE (TREE_OPERAND (field
, 1)) == INTEGER_CST
)
1380 curidx
= tree_to_double_int (TREE_OPERAND (field
, 1));
1383 dump_generic_node (buffer
, field
, spc
, flags
, false);
1384 if (TREE_CODE (field
) == INTEGER_CST
)
1385 curidx
= tree_to_double_int (field
);
1386 pp_string (buffer
, "]=");
1390 curidx
+= double_int_one
;
1391 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1392 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1393 val
= TREE_OPERAND (val
, 0);
1394 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1395 dump_decl_name (buffer
, val
, flags
);
1397 dump_generic_node (buffer
, val
, spc
, flags
, false);
1398 if (ix
!= vec_safe_length (CONSTRUCTOR_ELTS (node
)) - 1)
1400 pp_character (buffer
, ',');
1404 pp_character (buffer
, '}');
1411 if (flags
& TDF_SLIM
)
1413 pp_string (buffer
, "<COMPOUND_EXPR>");
1417 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1418 spc
, flags
, !(flags
& TDF_SLIM
));
1419 if (flags
& TDF_SLIM
)
1420 newline_and_indent (buffer
, spc
);
1423 pp_character (buffer
, ',');
1427 for (tp
= &TREE_OPERAND (node
, 1);
1428 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1429 tp
= &TREE_OPERAND (*tp
, 1))
1431 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1432 spc
, flags
, !(flags
& TDF_SLIM
));
1433 if (flags
& TDF_SLIM
)
1434 newline_and_indent (buffer
, spc
);
1437 pp_character (buffer
, ',');
1442 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1446 case STATEMENT_LIST
:
1448 tree_stmt_iterator si
;
1451 if (flags
& TDF_SLIM
)
1453 pp_string (buffer
, "<STATEMENT_LIST>");
1457 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1460 newline_and_indent (buffer
, spc
);
1463 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1470 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
,
1473 pp_character (buffer
, '=');
1475 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
,
1480 pp_string (buffer
, "TARGET_EXPR <");
1481 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1482 pp_character (buffer
, ',');
1484 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1485 pp_character (buffer
, '>');
1489 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1494 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1496 pp_string (buffer
, "if (");
1497 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1498 pp_character (buffer
, ')');
1499 /* The lowered cond_exprs should always be printed in full. */
1500 if (COND_EXPR_THEN (node
)
1501 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1502 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1503 && COND_EXPR_ELSE (node
)
1504 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1505 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1508 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1510 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1512 pp_string (buffer
, " else ");
1513 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1517 else if (!(flags
& TDF_SLIM
))
1519 /* Output COND_EXPR_THEN. */
1520 if (COND_EXPR_THEN (node
))
1522 newline_and_indent (buffer
, spc
+2);
1523 pp_character (buffer
, '{');
1524 newline_and_indent (buffer
, spc
+4);
1525 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1527 newline_and_indent (buffer
, spc
+2);
1528 pp_character (buffer
, '}');
1531 /* Output COND_EXPR_ELSE. */
1532 if (COND_EXPR_ELSE (node
)
1533 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1535 newline_and_indent (buffer
, spc
);
1536 pp_string (buffer
, "else");
1537 newline_and_indent (buffer
, spc
+2);
1538 pp_character (buffer
, '{');
1539 newline_and_indent (buffer
, spc
+4);
1540 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1542 newline_and_indent (buffer
, spc
+2);
1543 pp_character (buffer
, '}');
1550 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1552 pp_character (buffer
, '?');
1554 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1556 pp_character (buffer
, ':');
1558 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1563 pp_character (buffer
, '{');
1564 if (!(flags
& TDF_SLIM
))
1566 if (BIND_EXPR_VARS (node
))
1568 pp_newline (buffer
);
1570 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= DECL_CHAIN (op0
))
1572 print_declaration (buffer
, op0
, spc
+2, flags
);
1573 pp_newline (buffer
);
1577 newline_and_indent (buffer
, spc
+2);
1578 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1579 newline_and_indent (buffer
, spc
);
1580 pp_character (buffer
, '}');
1586 print_call_name (buffer
, CALL_EXPR_FN (node
), flags
);
1588 /* Print parameters. */
1590 pp_character (buffer
, '(');
1593 call_expr_arg_iterator iter
;
1594 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1596 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1597 if (more_call_expr_args_p (&iter
))
1599 pp_character (buffer
, ',');
1604 if (CALL_EXPR_VA_ARG_PACK (node
))
1606 if (call_expr_nargs (node
) > 0)
1608 pp_character (buffer
, ',');
1611 pp_string (buffer
, "__builtin_va_arg_pack ()");
1613 pp_character (buffer
, ')');
1615 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1618 pp_string (buffer
, " [static-chain: ");
1619 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1620 pp_character (buffer
, ']');
1623 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1624 pp_string (buffer
, " [return slot optimization]");
1625 if (CALL_EXPR_TAILCALL (node
))
1626 pp_string (buffer
, " [tail call]");
1629 case WITH_CLEANUP_EXPR
:
1633 case CLEANUP_POINT_EXPR
:
1634 pp_string (buffer
, "<<cleanup_point ");
1635 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1636 pp_string (buffer
, ">>");
1639 case PLACEHOLDER_EXPR
:
1640 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1641 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1642 pp_character (buffer
, '>');
1645 /* Binary arithmetic and logic expressions. */
1646 case WIDEN_SUM_EXPR
:
1647 case WIDEN_MULT_EXPR
:
1649 case MULT_HIGHPART_EXPR
:
1651 case POINTER_PLUS_EXPR
:
1653 case TRUNC_DIV_EXPR
:
1655 case FLOOR_DIV_EXPR
:
1656 case ROUND_DIV_EXPR
:
1657 case TRUNC_MOD_EXPR
:
1659 case FLOOR_MOD_EXPR
:
1660 case ROUND_MOD_EXPR
:
1662 case EXACT_DIV_EXPR
:
1667 case VEC_LSHIFT_EXPR
:
1668 case VEC_RSHIFT_EXPR
:
1669 case WIDEN_LSHIFT_EXPR
:
1673 case TRUTH_ANDIF_EXPR
:
1674 case TRUTH_ORIF_EXPR
:
1675 case TRUTH_AND_EXPR
:
1677 case TRUTH_XOR_EXPR
:
1691 case UNORDERED_EXPR
:
1693 const char *op
= op_symbol (node
);
1694 op0
= TREE_OPERAND (node
, 0);
1695 op1
= TREE_OPERAND (node
, 1);
1697 /* When the operands are expressions with less priority,
1698 keep semantics of the tree representation. */
1699 if (op_prio (op0
) <= op_prio (node
))
1701 pp_character (buffer
, '(');
1702 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1703 pp_character (buffer
, ')');
1706 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1709 pp_string (buffer
, op
);
1712 /* When the operands are expressions with less priority,
1713 keep semantics of the tree representation. */
1714 if (op_prio (op1
) <= op_prio (node
))
1716 pp_character (buffer
, '(');
1717 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1718 pp_character (buffer
, ')');
1721 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1725 /* Unary arithmetic and logic expressions. */
1728 case TRUTH_NOT_EXPR
:
1730 case PREDECREMENT_EXPR
:
1731 case PREINCREMENT_EXPR
:
1733 if (TREE_CODE (node
) == ADDR_EXPR
1734 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
1735 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
1736 ; /* Do not output '&' for strings and function pointers. */
1738 pp_string (buffer
, op_symbol (node
));
1740 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1742 pp_character (buffer
, '(');
1743 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1744 pp_character (buffer
, ')');
1747 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1750 case POSTDECREMENT_EXPR
:
1751 case POSTINCREMENT_EXPR
:
1752 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1754 pp_character (buffer
, '(');
1755 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1756 pp_character (buffer
, ')');
1759 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1760 pp_string (buffer
, op_symbol (node
));
1764 pp_string (buffer
, "MIN_EXPR <");
1765 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1766 pp_string (buffer
, ", ");
1767 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1768 pp_character (buffer
, '>');
1772 pp_string (buffer
, "MAX_EXPR <");
1773 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1774 pp_string (buffer
, ", ");
1775 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1776 pp_character (buffer
, '>');
1780 pp_string (buffer
, "ABS_EXPR <");
1781 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1782 pp_character (buffer
, '>');
1789 case ADDR_SPACE_CONVERT_EXPR
:
1790 case FIXED_CONVERT_EXPR
:
1791 case FIX_TRUNC_EXPR
:
1794 type
= TREE_TYPE (node
);
1795 op0
= TREE_OPERAND (node
, 0);
1796 if (type
!= TREE_TYPE (op0
))
1798 pp_character (buffer
, '(');
1799 dump_generic_node (buffer
, type
, spc
, flags
, false);
1800 pp_string (buffer
, ") ");
1802 if (op_prio (op0
) < op_prio (node
))
1803 pp_character (buffer
, '(');
1804 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1805 if (op_prio (op0
) < op_prio (node
))
1806 pp_character (buffer
, ')');
1809 case VIEW_CONVERT_EXPR
:
1810 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
1811 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1812 pp_string (buffer
, ">(");
1813 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1814 pp_character (buffer
, ')');
1818 pp_string (buffer
, "((");
1819 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1820 pp_string (buffer
, "))");
1823 case NON_LVALUE_EXPR
:
1824 pp_string (buffer
, "NON_LVALUE_EXPR <");
1825 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1826 pp_character (buffer
, '>');
1830 pp_string (buffer
, "SAVE_EXPR <");
1831 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1832 pp_character (buffer
, '>');
1836 pp_string (buffer
, "COMPLEX_EXPR <");
1837 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1838 pp_string (buffer
, ", ");
1839 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1840 pp_string (buffer
, ">");
1844 pp_string (buffer
, "CONJ_EXPR <");
1845 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1846 pp_string (buffer
, ">");
1850 pp_string (buffer
, "REALPART_EXPR <");
1851 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1852 pp_string (buffer
, ">");
1856 pp_string (buffer
, "IMAGPART_EXPR <");
1857 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1858 pp_string (buffer
, ">");
1862 pp_string (buffer
, "VA_ARG_EXPR <");
1863 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1864 pp_string (buffer
, ">");
1867 case TRY_FINALLY_EXPR
:
1868 case TRY_CATCH_EXPR
:
1869 pp_string (buffer
, "try");
1870 newline_and_indent (buffer
, spc
+2);
1871 pp_string (buffer
, "{");
1872 newline_and_indent (buffer
, spc
+4);
1873 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
1874 newline_and_indent (buffer
, spc
+2);
1875 pp_string (buffer
, "}");
1876 newline_and_indent (buffer
, spc
);
1878 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
1879 newline_and_indent (buffer
, spc
+2);
1880 pp_string (buffer
, "{");
1881 newline_and_indent (buffer
, spc
+4);
1882 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
1883 newline_and_indent (buffer
, spc
+2);
1884 pp_string (buffer
, "}");
1889 pp_string (buffer
, "catch (");
1890 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
1891 pp_string (buffer
, ")");
1892 newline_and_indent (buffer
, spc
+2);
1893 pp_string (buffer
, "{");
1894 newline_and_indent (buffer
, spc
+4);
1895 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
1896 newline_and_indent (buffer
, spc
+2);
1897 pp_string (buffer
, "}");
1901 case EH_FILTER_EXPR
:
1902 pp_string (buffer
, "<<<eh_filter (");
1903 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
1904 pp_string (buffer
, ")>>>");
1905 newline_and_indent (buffer
, spc
+2);
1906 pp_string (buffer
, "{");
1907 newline_and_indent (buffer
, spc
+4);
1908 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
1909 newline_and_indent (buffer
, spc
+2);
1910 pp_string (buffer
, "}");
1915 op0
= TREE_OPERAND (node
, 0);
1916 /* If this is for break or continue, don't bother printing it. */
1917 if (DECL_NAME (op0
))
1919 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1920 if (strcmp (name
, "break") == 0
1921 || strcmp (name
, "continue") == 0)
1924 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1925 pp_character (buffer
, ':');
1926 if (DECL_NONLOCAL (op0
))
1927 pp_string (buffer
, " [non-local]");
1931 pp_string (buffer
, "while (1)");
1932 if (!(flags
& TDF_SLIM
))
1934 newline_and_indent (buffer
, spc
+2);
1935 pp_character (buffer
, '{');
1936 newline_and_indent (buffer
, spc
+4);
1937 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
1938 newline_and_indent (buffer
, spc
+2);
1939 pp_character (buffer
, '}');
1945 pp_string (buffer
, "// predicted ");
1946 if (PREDICT_EXPR_OUTCOME (node
))
1947 pp_string (buffer
, "likely by ");
1949 pp_string (buffer
, "unlikely by ");
1950 pp_string (buffer
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
1951 pp_string (buffer
, " predictor.");
1955 pp_string (buffer
, "return");
1956 op0
= TREE_OPERAND (node
, 0);
1960 if (TREE_CODE (op0
) == MODIFY_EXPR
)
1961 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1),
1964 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1969 pp_string (buffer
, "if (");
1970 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1971 pp_string (buffer
, ") break");
1975 pp_string (buffer
, "switch (");
1976 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
1977 pp_character (buffer
, ')');
1978 if (!(flags
& TDF_SLIM
))
1980 newline_and_indent (buffer
, spc
+2);
1981 pp_character (buffer
, '{');
1982 if (SWITCH_BODY (node
))
1984 newline_and_indent (buffer
, spc
+4);
1985 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
1990 tree vec
= SWITCH_LABELS (node
);
1991 size_t i
, n
= TREE_VEC_LENGTH (vec
);
1992 for (i
= 0; i
< n
; ++i
)
1994 tree elt
= TREE_VEC_ELT (vec
, i
);
1995 newline_and_indent (buffer
, spc
+4);
1998 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
1999 pp_string (buffer
, " goto ");
2000 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
2002 pp_semicolon (buffer
);
2005 pp_string (buffer
, "case ???: goto ???;");
2008 newline_and_indent (buffer
, spc
+2);
2009 pp_character (buffer
, '}');
2015 op0
= GOTO_DESTINATION (node
);
2016 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
2018 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2019 if (strcmp (name
, "break") == 0
2020 || strcmp (name
, "continue") == 0)
2022 pp_string (buffer
, name
);
2026 pp_string (buffer
, "goto ");
2027 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2031 pp_string (buffer
, "__asm__");
2032 if (ASM_VOLATILE_P (node
))
2033 pp_string (buffer
, " __volatile__");
2034 pp_character (buffer
, '(');
2035 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
2036 pp_character (buffer
, ':');
2037 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
2038 pp_character (buffer
, ':');
2039 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
2040 if (ASM_CLOBBERS (node
))
2042 pp_character (buffer
, ':');
2043 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
2045 pp_string (buffer
, ")");
2048 case CASE_LABEL_EXPR
:
2049 if (CASE_LOW (node
) && CASE_HIGH (node
))
2051 pp_string (buffer
, "case ");
2052 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2053 pp_string (buffer
, " ... ");
2054 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
2056 else if (CASE_LOW (node
))
2058 pp_string (buffer
, "case ");
2059 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2062 pp_string (buffer
, "default");
2063 pp_character (buffer
, ':');
2067 pp_string (buffer
, "OBJ_TYPE_REF(");
2068 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
2069 pp_character (buffer
, ';');
2070 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
2071 pp_character (buffer
, '-');
2072 pp_character (buffer
, '>');
2073 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
2074 pp_character (buffer
, ')');
2078 if (SSA_NAME_IDENTIFIER (node
))
2079 dump_generic_node (buffer
, SSA_NAME_IDENTIFIER (node
),
2081 pp_string (buffer
, "_");
2082 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
2083 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
2084 pp_string (buffer
, "(ab)");
2085 else if (SSA_NAME_IS_DEFAULT_DEF (node
))
2086 pp_string (buffer
, "(D)");
2089 case WITH_SIZE_EXPR
:
2090 pp_string (buffer
, "WITH_SIZE_EXPR <");
2091 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2092 pp_string (buffer
, ", ");
2093 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2094 pp_string (buffer
, ">");
2098 pp_string (buffer
, "ASSERT_EXPR <");
2099 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
2100 pp_string (buffer
, ", ");
2101 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
2102 pp_string (buffer
, ">");
2106 pp_string (buffer
, "scev_known");
2109 case SCEV_NOT_KNOWN
:
2110 pp_string (buffer
, "scev_not_known");
2113 case POLYNOMIAL_CHREC
:
2114 pp_string (buffer
, "{");
2115 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
2116 pp_string (buffer
, ", +, ");
2117 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
2118 pp_string (buffer
, "}_");
2119 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
2123 case REALIGN_LOAD_EXPR
:
2124 pp_string (buffer
, "REALIGN_LOAD <");
2125 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2126 pp_string (buffer
, ", ");
2127 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2128 pp_string (buffer
, ", ");
2129 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2130 pp_string (buffer
, ">");
2134 pp_string (buffer
, " VEC_COND_EXPR < ");
2135 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2136 pp_string (buffer
, " , ");
2137 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2138 pp_string (buffer
, " , ");
2139 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2140 pp_string (buffer
, " > ");
2144 pp_string (buffer
, " VEC_PERM_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
, " , ");
2149 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2150 pp_string (buffer
, " > ");
2154 pp_string (buffer
, " DOT_PROD_EXPR < ");
2155 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2156 pp_string (buffer
, ", ");
2157 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2158 pp_string (buffer
, ", ");
2159 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2160 pp_string (buffer
, " > ");
2163 case WIDEN_MULT_PLUS_EXPR
:
2164 pp_string (buffer
, " WIDEN_MULT_PLUS_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
, ", ");
2169 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2170 pp_string (buffer
, " > ");
2173 case WIDEN_MULT_MINUS_EXPR
:
2174 pp_string (buffer
, " WIDEN_MULT_MINUS_EXPR < ");
2175 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2176 pp_string (buffer
, ", ");
2177 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2178 pp_string (buffer
, ", ");
2179 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2180 pp_string (buffer
, " > ");
2184 pp_string (buffer
, " FMA_EXPR < ");
2185 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2186 pp_string (buffer
, ", ");
2187 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2188 pp_string (buffer
, ", ");
2189 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2190 pp_string (buffer
, " > ");
2194 pp_string (buffer
, "#pragma omp parallel");
2195 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
2198 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
2200 newline_and_indent (buffer
, spc
+ 2);
2201 pp_character (buffer
, '{');
2202 newline_and_indent (buffer
, spc
+ 4);
2203 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
2204 newline_and_indent (buffer
, spc
+ 2);
2205 pp_character (buffer
, '}');
2211 pp_string (buffer
, "#pragma omp task");
2212 dump_omp_clauses (buffer
, OMP_TASK_CLAUSES (node
), spc
, flags
);
2216 pp_string (buffer
, "#pragma omp for");
2217 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2219 if (!(flags
& TDF_SLIM
))
2223 if (OMP_FOR_PRE_BODY (node
))
2225 newline_and_indent (buffer
, spc
+ 2);
2226 pp_character (buffer
, '{');
2228 newline_and_indent (buffer
, spc
);
2229 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
2233 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
2236 newline_and_indent (buffer
, spc
);
2237 pp_string (buffer
, "for (");
2238 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
2240 pp_string (buffer
, "; ");
2241 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
2243 pp_string (buffer
, "; ");
2244 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
2246 pp_string (buffer
, ")");
2248 if (OMP_FOR_BODY (node
))
2250 newline_and_indent (buffer
, spc
+ 2);
2251 pp_character (buffer
, '{');
2252 newline_and_indent (buffer
, spc
+ 4);
2253 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
2255 newline_and_indent (buffer
, spc
+ 2);
2256 pp_character (buffer
, '}');
2258 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
2259 if (OMP_FOR_PRE_BODY (node
))
2262 newline_and_indent (buffer
, spc
+ 2);
2263 pp_character (buffer
, '}');
2270 pp_string (buffer
, "#pragma omp sections");
2271 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
2275 pp_string (buffer
, "#pragma omp section");
2279 pp_string (buffer
, "#pragma omp master");
2283 pp_string (buffer
, "#pragma omp ordered");
2287 pp_string (buffer
, "#pragma omp critical");
2288 if (OMP_CRITICAL_NAME (node
))
2291 pp_character (buffer
, '(');
2292 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
2294 pp_character (buffer
, ')');
2299 pp_string (buffer
, "#pragma omp atomic");
2300 newline_and_indent (buffer
, spc
+ 2);
2301 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2303 pp_character (buffer
, '=');
2305 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2308 case OMP_ATOMIC_READ
:
2309 pp_string (buffer
, "#pragma omp atomic read");
2310 newline_and_indent (buffer
, spc
+ 2);
2311 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2315 case OMP_ATOMIC_CAPTURE_OLD
:
2316 case OMP_ATOMIC_CAPTURE_NEW
:
2317 pp_string (buffer
, "#pragma omp atomic capture");
2318 newline_and_indent (buffer
, spc
+ 2);
2319 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2321 pp_character (buffer
, '=');
2323 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2327 pp_string (buffer
, "#pragma omp single");
2328 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
2332 dump_omp_clause (buffer
, node
, spc
, flags
);
2336 case TRANSACTION_EXPR
:
2337 if (TRANSACTION_EXPR_OUTER (node
))
2338 pp_string (buffer
, "__transaction_atomic [[outer]]");
2339 else if (TRANSACTION_EXPR_RELAXED (node
))
2340 pp_string (buffer
, "__transaction_relaxed");
2342 pp_string (buffer
, "__transaction_atomic");
2343 if (!(flags
& TDF_SLIM
) && TRANSACTION_EXPR_BODY (node
))
2345 newline_and_indent (buffer
, spc
);
2346 pp_character (buffer
, '{');
2347 newline_and_indent (buffer
, spc
+ 2);
2348 dump_generic_node (buffer
, TRANSACTION_EXPR_BODY (node
),
2349 spc
+ 2, flags
, false);
2350 newline_and_indent (buffer
, spc
);
2351 pp_character (buffer
, '}');
2356 case REDUC_MAX_EXPR
:
2357 pp_string (buffer
, " REDUC_MAX_EXPR < ");
2358 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2359 pp_string (buffer
, " > ");
2362 case REDUC_MIN_EXPR
:
2363 pp_string (buffer
, " REDUC_MIN_EXPR < ");
2364 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2365 pp_string (buffer
, " > ");
2368 case REDUC_PLUS_EXPR
:
2369 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
2370 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2371 pp_string (buffer
, " > ");
2374 case VEC_WIDEN_MULT_HI_EXPR
:
2375 case VEC_WIDEN_MULT_LO_EXPR
:
2376 case VEC_WIDEN_MULT_EVEN_EXPR
:
2377 case VEC_WIDEN_MULT_ODD_EXPR
:
2378 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2379 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2380 pp_character (buffer
, ' ');
2381 for (str
= tree_code_name
[code
]; *str
; str
++)
2382 pp_character (buffer
, TOUPPER (*str
));
2383 pp_string (buffer
, " < ");
2384 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2385 pp_string (buffer
, ", ");
2386 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2387 pp_string (buffer
, " > ");
2390 case VEC_UNPACK_HI_EXPR
:
2391 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
2392 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2393 pp_string (buffer
, " > ");
2396 case VEC_UNPACK_LO_EXPR
:
2397 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
2398 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2399 pp_string (buffer
, " > ");
2402 case VEC_UNPACK_FLOAT_HI_EXPR
:
2403 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2404 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2405 pp_string (buffer
, " > ");
2408 case VEC_UNPACK_FLOAT_LO_EXPR
:
2409 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2410 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2411 pp_string (buffer
, " > ");
2414 case VEC_PACK_TRUNC_EXPR
:
2415 pp_string (buffer
, " VEC_PACK_TRUNC_EXPR < ");
2416 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2417 pp_string (buffer
, ", ");
2418 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2419 pp_string (buffer
, " > ");
2422 case VEC_PACK_SAT_EXPR
:
2423 pp_string (buffer
, " VEC_PACK_SAT_EXPR < ");
2424 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2425 pp_string (buffer
, ", ");
2426 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2427 pp_string (buffer
, " > ");
2430 case VEC_PACK_FIX_TRUNC_EXPR
:
2431 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2432 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2433 pp_string (buffer
, ", ");
2434 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2435 pp_string (buffer
, " > ");
2439 dump_block_node (buffer
, node
, spc
, flags
);
2446 if (is_stmt
&& is_expr
)
2447 pp_semicolon (buffer
);
2452 /* Print the declaration of a variable. */
2455 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2459 if (TREE_CODE (t
) == TYPE_DECL
)
2460 pp_string (buffer
, "typedef ");
2462 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2463 pp_string (buffer
, "register ");
2465 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2466 pp_string (buffer
, "extern ");
2467 else if (TREE_STATIC (t
))
2468 pp_string (buffer
, "static ");
2470 /* Print the type and name. */
2471 if (TREE_TYPE (t
) && TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2475 /* Print array's type. */
2476 tmp
= TREE_TYPE (t
);
2477 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2478 tmp
= TREE_TYPE (tmp
);
2479 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2481 /* Print variable's name. */
2483 dump_generic_node (buffer
, t
, spc
, flags
, false);
2485 /* Print the dimensions. */
2486 tmp
= TREE_TYPE (t
);
2487 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2489 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2490 tmp
= TREE_TYPE (tmp
);
2493 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2495 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2497 dump_decl_name (buffer
, t
, flags
);
2498 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2502 /* Print type declaration. */
2503 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2505 /* Print variable's name. */
2507 dump_generic_node (buffer
, t
, spc
, flags
, false);
2510 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2512 pp_string (buffer
, " __asm__ ");
2513 pp_character (buffer
, '(');
2514 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2515 pp_character (buffer
, ')');
2518 /* The initial value of a function serves to determine whether the function
2519 is declared or defined. So the following does not apply to function
2521 if (TREE_CODE (t
) != FUNCTION_DECL
)
2523 /* Print the initial value. */
2524 if (DECL_INITIAL (t
))
2527 pp_character (buffer
, '=');
2529 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2533 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2535 pp_string (buffer
, " [value-expr: ");
2536 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2537 pp_character (buffer
, ']');
2540 pp_character (buffer
, ';');
2544 /* Prints a structure: name, fields, and methods.
2545 FIXME: Still incomplete. */
2548 print_struct_decl (pretty_printer
*buffer
, const_tree node
, int spc
, int flags
)
2550 /* Print the name of the structure. */
2551 if (TYPE_NAME (node
))
2554 if (TREE_CODE (node
) == RECORD_TYPE
)
2555 pp_string (buffer
, "struct ");
2556 else if ((TREE_CODE (node
) == UNION_TYPE
2557 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
2558 pp_string (buffer
, "union ");
2560 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
2563 /* Print the contents of the structure. */
2564 pp_newline (buffer
);
2566 pp_character (buffer
, '{');
2567 pp_newline (buffer
);
2569 /* Print the fields of the structure. */
2572 tmp
= TYPE_FIELDS (node
);
2575 /* Avoid to print recursively the structure. */
2576 /* FIXME : Not implemented correctly...,
2577 what about the case when we have a cycle in the contain graph? ...
2578 Maybe this could be solved by looking at the scope in which the
2579 structure was declared. */
2580 if (TREE_TYPE (tmp
) != node
2581 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
2582 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
2584 print_declaration (buffer
, tmp
, spc
+2, flags
);
2585 pp_newline (buffer
);
2587 tmp
= DECL_CHAIN (tmp
);
2591 pp_character (buffer
, '}');
2594 /* Return the priority of the operator CODE.
2596 From lowest to highest precedence with either left-to-right (L-R)
2597 or right-to-left (R-L) associativity]:
2600 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2612 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2613 15 [L-R] fn() [] -> .
2615 unary +, - and * have higher precedence than the corresponding binary
2619 op_code_prio (enum tree_code code
)
2636 case TRUTH_ORIF_EXPR
:
2639 case TRUTH_AND_EXPR
:
2640 case TRUTH_ANDIF_EXPR
:
2647 case TRUTH_XOR_EXPR
:
2664 case UNORDERED_EXPR
:
2675 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2676 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2677 case WIDEN_LSHIFT_EXPR
:
2680 case WIDEN_SUM_EXPR
:
2682 case POINTER_PLUS_EXPR
:
2686 case VEC_WIDEN_MULT_HI_EXPR
:
2687 case VEC_WIDEN_MULT_LO_EXPR
:
2688 case WIDEN_MULT_EXPR
:
2690 case WIDEN_MULT_PLUS_EXPR
:
2691 case WIDEN_MULT_MINUS_EXPR
:
2693 case MULT_HIGHPART_EXPR
:
2694 case TRUNC_DIV_EXPR
:
2696 case FLOOR_DIV_EXPR
:
2697 case ROUND_DIV_EXPR
:
2699 case EXACT_DIV_EXPR
:
2700 case TRUNC_MOD_EXPR
:
2702 case FLOOR_MOD_EXPR
:
2703 case ROUND_MOD_EXPR
:
2707 case TRUTH_NOT_EXPR
:
2709 case POSTINCREMENT_EXPR
:
2710 case POSTDECREMENT_EXPR
:
2711 case PREINCREMENT_EXPR
:
2712 case PREDECREMENT_EXPR
:
2718 case FIX_TRUNC_EXPR
:
2724 case ARRAY_RANGE_REF
:
2728 /* Special expressions. */
2734 case REDUC_MAX_EXPR
:
2735 case REDUC_MIN_EXPR
:
2736 case REDUC_PLUS_EXPR
:
2737 case VEC_LSHIFT_EXPR
:
2738 case VEC_RSHIFT_EXPR
:
2739 case VEC_UNPACK_HI_EXPR
:
2740 case VEC_UNPACK_LO_EXPR
:
2741 case VEC_UNPACK_FLOAT_HI_EXPR
:
2742 case VEC_UNPACK_FLOAT_LO_EXPR
:
2743 case VEC_PACK_TRUNC_EXPR
:
2744 case VEC_PACK_SAT_EXPR
:
2748 /* Return an arbitrarily high precedence to avoid surrounding single
2749 VAR_DECLs in ()s. */
2754 /* Return the priority of the operator OP. */
2757 op_prio (const_tree op
)
2759 enum tree_code code
;
2764 code
= TREE_CODE (op
);
2765 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
2766 return op_prio (TREE_OPERAND (op
, 0));
2768 return op_code_prio (code
);
2771 /* Return the symbol associated with operator CODE. */
2774 op_symbol_code (enum tree_code code
)
2782 case TRUTH_ORIF_EXPR
:
2785 case TRUTH_AND_EXPR
:
2786 case TRUTH_ANDIF_EXPR
:
2792 case TRUTH_XOR_EXPR
:
2802 case UNORDERED_EXPR
:
2848 case VEC_LSHIFT_EXPR
:
2851 case VEC_RSHIFT_EXPR
:
2854 case WIDEN_LSHIFT_EXPR
:
2857 case POINTER_PLUS_EXPR
:
2863 case REDUC_PLUS_EXPR
:
2866 case WIDEN_SUM_EXPR
:
2869 case WIDEN_MULT_EXPR
:
2872 case MULT_HIGHPART_EXPR
:
2882 case TRUTH_NOT_EXPR
:
2889 case TRUNC_DIV_EXPR
:
2896 case FLOOR_DIV_EXPR
:
2899 case ROUND_DIV_EXPR
:
2902 case EXACT_DIV_EXPR
:
2905 case TRUNC_MOD_EXPR
:
2911 case FLOOR_MOD_EXPR
:
2914 case ROUND_MOD_EXPR
:
2917 case PREDECREMENT_EXPR
:
2920 case PREINCREMENT_EXPR
:
2923 case POSTDECREMENT_EXPR
:
2926 case POSTINCREMENT_EXPR
:
2936 return "<<< ??? >>>";
2940 /* Return the symbol associated with operator OP. */
2943 op_symbol (const_tree op
)
2945 return op_symbol_code (TREE_CODE (op
));
2948 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
2949 the gimple_call_fn of a GIMPLE_CALL. */
2952 print_call_name (pretty_printer
*buffer
, tree node
, int flags
)
2956 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
2957 op0
= TREE_OPERAND (op0
, 0);
2960 switch (TREE_CODE (op0
))
2965 dump_function_name (buffer
, op0
, flags
);
2971 op0
= TREE_OPERAND (op0
, 0);
2975 pp_string (buffer
, "(");
2976 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, flags
, false);
2977 pp_string (buffer
, ") ? ");
2978 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, flags
, false);
2979 pp_string (buffer
, " : ");
2980 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, flags
, false);
2984 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2985 dump_function_name (buffer
, TREE_OPERAND (op0
, 0), flags
);
2987 dump_generic_node (buffer
, op0
, 0, flags
, false);
2991 if (integer_zerop (TREE_OPERAND (op0
, 1)))
2993 op0
= TREE_OPERAND (op0
, 0);
3000 dump_generic_node (buffer
, op0
, 0, flags
, false);
3008 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
3011 pretty_print_string (pretty_printer
*buffer
, const char *str
)
3021 pp_string (buffer
, "\\b");
3025 pp_string (buffer
, "\\f");
3029 pp_string (buffer
, "\\n");
3033 pp_string (buffer
, "\\r");
3037 pp_string (buffer
, "\\t");
3041 pp_string (buffer
, "\\v");
3045 pp_string (buffer
, "\\\\");
3049 pp_string (buffer
, "\\\"");
3053 pp_string (buffer
, "\\'");
3056 /* No need to handle \0; the loop terminates on \0. */
3059 pp_string (buffer
, "\\1");
3063 pp_string (buffer
, "\\2");
3067 pp_string (buffer
, "\\3");
3071 pp_string (buffer
, "\\4");
3075 pp_string (buffer
, "\\5");
3079 pp_string (buffer
, "\\6");
3083 pp_string (buffer
, "\\7");
3087 pp_character (buffer
, str
[0]);
3095 maybe_init_pretty_print (FILE *file
)
3099 pp_construct (&buffer
, /* prefix */NULL
, /* line-width */0);
3100 pp_needs_newline (&buffer
) = true;
3101 pp_translate_identifiers (&buffer
) = false;
3105 buffer
.buffer
->stream
= file
;
3109 newline_and_indent (pretty_printer
*buffer
, int spc
)
3111 pp_newline (buffer
);
3115 /* Handle a %K format for TEXT. Separate from default_tree_printer so
3116 it can also be used in front ends.
3117 %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
3121 percent_K_format (text_info
*text
)
3123 tree t
= va_arg (*text
->args_ptr
, tree
), block
;
3124 gcc_assert (text
->locus
!= NULL
);
3125 *text
->locus
= EXPR_LOCATION (t
);
3126 gcc_assert (pp_ti_abstract_origin (text
) != NULL
);
3127 block
= TREE_BLOCK (t
);
3128 *pp_ti_abstract_origin (text
) = NULL
;
3130 && TREE_CODE (block
) == BLOCK
3131 && BLOCK_ABSTRACT_ORIGIN (block
))
3133 tree ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3135 while (TREE_CODE (ao
) == BLOCK
3136 && BLOCK_ABSTRACT_ORIGIN (ao
)
3137 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3138 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3140 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3142 *pp_ti_abstract_origin (text
) = block
;
3145 block
= BLOCK_SUPERCONTEXT (block
);
3149 /* Print the identifier ID to PRETTY-PRINTER. */
3152 pp_base_tree_identifier (pretty_printer
*pp
, tree id
)
3154 if (pp_translate_identifiers (pp
))
3156 const char *text
= identifier_to_locale (IDENTIFIER_POINTER (id
));
3157 pp_append_text (pp
, text
, text
+ strlen (text
));
3160 pp_append_text (pp
, IDENTIFIER_POINTER (id
),
3161 IDENTIFIER_POINTER (id
) + IDENTIFIER_LENGTH (id
));
3164 /* A helper function that is used to dump function information before the
3168 dump_function_header (FILE *dump_file
, tree fdecl
, int flags
)
3170 const char *dname
, *aname
;
3171 struct cgraph_node
*node
= cgraph_get_node (fdecl
);
3172 struct function
*fun
= DECL_STRUCT_FUNCTION (fdecl
);
3174 dname
= lang_hooks
.decl_printable_name (fdecl
, 2);
3176 if (DECL_ASSEMBLER_NAME_SET_P (fdecl
))
3177 aname
= (IDENTIFIER_POINTER
3178 (DECL_ASSEMBLER_NAME (fdecl
)));
3180 aname
= "<unset-asm-name>";
3182 fprintf (dump_file
, "\n;; Function %s (%s, funcdef_no=%d",
3183 dname
, aname
, fun
->funcdef_no
);
3184 if (!(flags
& TDF_NOUID
))
3185 fprintf (dump_file
, ", decl_uid=%d", DECL_UID (fdecl
));
3188 fprintf (dump_file
, ", cgraph_uid=%d)%s\n\n", node
->uid
,
3189 node
->frequency
== NODE_FREQUENCY_HOT
3191 : node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
3192 ? " (unlikely executed)"
3193 : node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
3194 ? " (executed once)"
3198 fprintf (dump_file
, ")\n\n");