1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
3 2011 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"
27 #include "tree-pretty-print.h"
29 #include "tree-flow.h"
30 #include "langhooks.h"
31 #include "tree-iterator.h"
32 #include "tree-chrec.h"
34 #include "value-prof.h"
37 /* Local functions, macros and variables. */
38 static const char *op_symbol (const_tree
);
39 static void pretty_print_string (pretty_printer
*, const char*);
40 static void newline_and_indent (pretty_printer
*, int);
41 static void maybe_init_pretty_print (FILE *);
42 static void print_struct_decl (pretty_printer
*, const_tree
, int, int);
43 static void do_niy (pretty_printer
*, const_tree
);
45 #define INDENT(SPACE) do { \
46 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
48 #define NIY do_niy(buffer,node)
50 static pretty_printer buffer
;
51 static int initialized
= 0;
53 /* Try to print something for an unknown tree code. */
56 do_niy (pretty_printer
*buffer
, const_tree node
)
60 pp_string (buffer
, "<<< Unknown tree: ");
61 pp_string (buffer
, tree_code_name
[(int) TREE_CODE (node
)]);
65 len
= TREE_OPERAND_LENGTH (node
);
66 for (i
= 0; i
< len
; ++i
)
68 newline_and_indent (buffer
, 2);
69 dump_generic_node (buffer
, TREE_OPERAND (node
, i
), 2, 0, false);
73 pp_string (buffer
, " >>>");
76 /* Debugging function to print out a generic expression. */
79 debug_generic_expr (tree t
)
81 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
82 fprintf (stderr
, "\n");
85 /* Debugging function to print out a generic statement. */
88 debug_generic_stmt (tree t
)
90 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
91 fprintf (stderr
, "\n");
94 /* Debugging function to print out a chain of trees . */
97 debug_tree_chain (tree t
)
99 struct pointer_set_t
*seen
= pointer_set_create ();
103 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
104 fprintf (stderr
, " ");
106 if (pointer_set_insert (seen
, t
))
108 fprintf (stderr
, "... [cycled back to ");
109 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
110 fprintf (stderr
, "]");
114 fprintf (stderr
, "\n");
116 pointer_set_destroy (seen
);
119 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
121 print_generic_decl (FILE *file
, tree decl
, int flags
)
123 maybe_init_pretty_print (file
);
124 print_declaration (&buffer
, decl
, 2, flags
);
125 pp_write_text_to_stream (&buffer
);
128 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
129 to show in the dump. See TDF_* in dumpfile.h. */
132 print_generic_stmt (FILE *file
, tree t
, int flags
)
134 maybe_init_pretty_print (file
);
135 dump_generic_node (&buffer
, t
, 0, flags
, true);
136 pp_newline_and_flush (&buffer
);
139 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
140 to show in the dump. See TDF_* in dumpfile.h. The output is indented by
144 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
148 maybe_init_pretty_print (file
);
150 for (i
= 0; i
< indent
; i
++)
152 dump_generic_node (&buffer
, t
, indent
, flags
, true);
153 pp_newline_and_flush (&buffer
);
156 /* Print a single expression T on file FILE. FLAGS specifies details to show
157 in the dump. See TDF_* in dumpfile.h. */
160 print_generic_expr (FILE *file
, tree t
, int flags
)
162 maybe_init_pretty_print (file
);
163 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_length (tree
, BLOCK_NONLOCALIZED_VARS (block
)) > 0)
552 VEC(tree
,gc
) *nlv
= BLOCK_NONLOCALIZED_VARS (block
);
554 pp_string (buffer
, "NONLOCALIZED_VARS: ");
555 FOR_EACH_VEC_ELT (tree
, 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);
592 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
593 indent. FLAGS specifies details to show in the dump (see TDF_* in
594 dumpfile.h). If IS_STMT is true, the object printed is considered
595 to be a statement and it is terminated by ';' if appropriate. */
598 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
607 if (node
== NULL_TREE
)
610 is_expr
= EXPR_P (node
);
612 if (is_stmt
&& (flags
& TDF_STMTADDR
))
613 pp_printf (buffer
, "<&%p> ", (void *)node
);
615 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
616 dump_location (buffer
, EXPR_LOCATION (node
));
618 code
= TREE_CODE (node
);
622 pp_string (buffer
, "<<< error >>>");
625 case IDENTIFIER_NODE
:
626 pp_tree_identifier (buffer
, node
);
630 while (node
&& node
!= error_mark_node
)
632 if (TREE_PURPOSE (node
))
634 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
637 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
638 node
= TREE_CHAIN (node
);
639 if (node
&& TREE_CODE (node
) == TREE_LIST
)
641 pp_character (buffer
, ',');
648 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
654 if (TREE_VEC_LENGTH (node
) > 0)
656 size_t len
= TREE_VEC_LENGTH (node
);
657 for (i
= 0; i
< len
- 1; i
++)
659 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
661 pp_character (buffer
, ',');
664 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
673 case FIXED_POINT_TYPE
:
679 unsigned int quals
= TYPE_QUALS (node
);
680 enum tree_code_class tclass
;
682 if (quals
& TYPE_QUAL_CONST
)
683 pp_string (buffer
, "const ");
684 else if (quals
& TYPE_QUAL_VOLATILE
)
685 pp_string (buffer
, "volatile ");
686 else if (quals
& TYPE_QUAL_RESTRICT
)
687 pp_string (buffer
, "restrict ");
689 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
691 pp_string (buffer
, "<address-space-");
692 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
693 pp_string (buffer
, "> ");
696 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
698 if (tclass
== tcc_declaration
)
700 if (DECL_NAME (node
))
701 dump_decl_name (buffer
, node
, flags
);
703 pp_string (buffer
, "<unnamed type decl>");
705 else if (tclass
== tcc_type
)
707 if (TYPE_NAME (node
))
709 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
710 pp_tree_identifier (buffer
, TYPE_NAME (node
));
711 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
712 && DECL_NAME (TYPE_NAME (node
)))
713 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
715 pp_string (buffer
, "<unnamed type>");
717 else if (TREE_CODE (node
) == VECTOR_TYPE
)
719 pp_string (buffer
, "vector");
720 pp_character (buffer
, '(');
721 pp_wide_integer (buffer
, TYPE_VECTOR_SUBPARTS (node
));
722 pp_string (buffer
, ") ");
723 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
725 else if (TREE_CODE (node
) == INTEGER_TYPE
)
727 if (TYPE_PRECISION (node
) == CHAR_TYPE_SIZE
)
728 pp_string (buffer
, (TYPE_UNSIGNED (node
)
731 else if (TYPE_PRECISION (node
) == SHORT_TYPE_SIZE
)
732 pp_string (buffer
, (TYPE_UNSIGNED (node
)
735 else if (TYPE_PRECISION (node
) == INT_TYPE_SIZE
)
736 pp_string (buffer
, (TYPE_UNSIGNED (node
)
739 else if (TYPE_PRECISION (node
) == LONG_TYPE_SIZE
)
740 pp_string (buffer
, (TYPE_UNSIGNED (node
)
743 else if (TYPE_PRECISION (node
) == LONG_LONG_TYPE_SIZE
)
744 pp_string (buffer
, (TYPE_UNSIGNED (node
)
745 ? "unsigned long long"
746 : "signed long long"));
747 else if (TYPE_PRECISION (node
) >= CHAR_TYPE_SIZE
748 && exact_log2 (TYPE_PRECISION (node
)) != -1)
750 pp_string (buffer
, (TYPE_UNSIGNED (node
) ? "uint" : "int"));
751 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
752 pp_string (buffer
, "_t");
756 pp_string (buffer
, (TYPE_UNSIGNED (node
)
757 ? "<unnamed-unsigned:"
758 : "<unnamed-signed:"));
759 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
760 pp_string (buffer
, ">");
763 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
765 pp_string (buffer
, "__complex__ ");
766 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
768 else if (TREE_CODE (node
) == REAL_TYPE
)
770 pp_string (buffer
, "<float:");
771 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
772 pp_string (buffer
, ">");
774 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
776 pp_string (buffer
, "<fixed-point-");
777 pp_string (buffer
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
778 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
779 pp_string (buffer
, ">");
781 else if (TREE_CODE (node
) == VOID_TYPE
)
782 pp_string (buffer
, "void");
784 pp_string (buffer
, "<unnamed type>");
791 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
793 if (TREE_TYPE (node
) == NULL
)
795 pp_string (buffer
, str
);
796 pp_string (buffer
, "<null type>");
798 else if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
800 tree fnode
= TREE_TYPE (node
);
802 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
804 pp_character (buffer
, '(');
805 pp_string (buffer
, str
);
806 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
807 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
808 else if (flags
& TDF_NOUID
)
809 pp_printf (buffer
, "<Txxxx>");
811 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
813 pp_character (buffer
, ')');
814 dump_function_declaration (buffer
, fnode
, spc
, flags
);
818 unsigned int quals
= TYPE_QUALS (node
);
820 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
822 pp_string (buffer
, str
);
824 if (quals
& TYPE_QUAL_CONST
)
825 pp_string (buffer
, " const");
826 if (quals
& TYPE_QUAL_VOLATILE
)
827 pp_string (buffer
, " volatile");
828 if (quals
& TYPE_QUAL_RESTRICT
)
829 pp_string (buffer
, " restrict");
831 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
833 pp_string (buffer
, " <address-space-");
834 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
835 pp_string (buffer
, ">");
838 if (TYPE_REF_CAN_ALIAS_ALL (node
))
839 pp_string (buffer
, " {ref-all}");
849 if (integer_zerop (TREE_OPERAND (node
, 1))
850 /* Dump the types of INTEGER_CSTs explicitly, for we can't
851 infer them and MEM_ATTR caching will share MEM_REFs
852 with differently-typed op0s. */
853 && TREE_CODE (TREE_OPERAND (node
, 0)) != INTEGER_CST
854 /* Released SSA_NAMES have no TREE_TYPE. */
855 && TREE_TYPE (TREE_OPERAND (node
, 0)) != NULL_TREE
856 /* Same pointer types, but ignoring POINTER_TYPE vs.
858 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 0)))
859 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))
860 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 0)))
861 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 1))))
862 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 0)))
863 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 1))))
864 /* Same value types ignoring qualifiers. */
865 && (TYPE_MAIN_VARIANT (TREE_TYPE (node
))
867 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))))
869 if (TREE_CODE (TREE_OPERAND (node
, 0)) != ADDR_EXPR
)
871 pp_string (buffer
, "*");
872 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
876 dump_generic_node (buffer
,
877 TREE_OPERAND (TREE_OPERAND (node
, 0), 0),
884 pp_string (buffer
, "MEM[");
885 pp_string (buffer
, "(");
886 ptype
= TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node
, 1)));
887 dump_generic_node (buffer
, ptype
,
888 spc
, flags
| TDF_SLIM
, false);
889 pp_string (buffer
, ")");
890 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
892 if (!integer_zerop (TREE_OPERAND (node
, 1)))
894 pp_string (buffer
, " + ");
895 dump_generic_node (buffer
, TREE_OPERAND (node
, 1),
898 pp_string (buffer
, "]");
905 const char *sep
= "";
908 pp_string (buffer
, "MEM[");
910 if (TREE_CODE (TMR_BASE (node
)) == ADDR_EXPR
)
912 pp_string (buffer
, sep
);
914 pp_string (buffer
, "symbol: ");
915 dump_generic_node (buffer
, TREE_OPERAND (TMR_BASE (node
), 0),
920 pp_string (buffer
, sep
);
922 pp_string (buffer
, "base: ");
923 dump_generic_node (buffer
, TMR_BASE (node
), spc
, flags
, false);
925 tmp
= TMR_INDEX2 (node
);
928 pp_string (buffer
, sep
);
930 pp_string (buffer
, "base: ");
931 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
933 tmp
= TMR_INDEX (node
);
936 pp_string (buffer
, sep
);
938 pp_string (buffer
, "index: ");
939 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
941 tmp
= TMR_STEP (node
);
944 pp_string (buffer
, sep
);
946 pp_string (buffer
, "step: ");
947 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
949 tmp
= TMR_OFFSET (node
);
952 pp_string (buffer
, sep
);
954 pp_string (buffer
, "offset: ");
955 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
957 pp_string (buffer
, "]");
965 /* Print the innermost component type. */
966 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
967 tmp
= TREE_TYPE (tmp
))
969 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
971 /* Print the dimensions. */
972 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
973 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
979 case QUAL_UNION_TYPE
:
981 unsigned int quals
= TYPE_QUALS (node
);
983 if (quals
& TYPE_QUAL_CONST
)
984 pp_string (buffer
, "const ");
985 if (quals
& TYPE_QUAL_VOLATILE
)
986 pp_string (buffer
, "volatile ");
988 /* Print the name of the structure. */
989 if (TREE_CODE (node
) == RECORD_TYPE
)
990 pp_string (buffer
, "struct ");
991 else if (TREE_CODE (node
) == UNION_TYPE
)
992 pp_string (buffer
, "union ");
994 if (TYPE_NAME (node
))
995 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
996 else if (!(flags
& TDF_SLIM
))
997 /* FIXME: If we eliminate the 'else' above and attempt
998 to show the fields for named types, we may get stuck
999 following a cycle of pointers to structs. The alleged
1000 self-reference check in print_struct_decl will not detect
1001 cycles involving more than one pointer or struct type. */
1002 print_struct_decl (buffer
, node
, spc
, flags
);
1011 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
1013 /* In the case of a pointer, one may want to divide by the
1014 size of the pointed-to type. Unfortunately, this not
1015 straightforward. The C front-end maps expressions
1020 in such a way that the two INTEGER_CST nodes for "5" have
1021 different values but identical types. In the latter
1022 case, the 5 is multiplied by sizeof (int) in c-common.c
1023 (pointer_int_sum) to convert it to a byte address, and
1024 yet the type of the node is left unchanged. Argh. What
1025 is consistent though is that the number value corresponds
1026 to bytes (UNITS) offset.
1028 NB: Neither of the following divisors can be trivially
1029 used to recover the original literal:
1031 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1032 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1033 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
1034 pp_string (buffer
, "B"); /* pseudo-unit */
1036 else if (host_integerp (node
, 0))
1037 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
1038 else if (host_integerp (node
, 1))
1039 pp_unsigned_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
1043 unsigned HOST_WIDE_INT low
= TREE_INT_CST_LOW (val
);
1044 HOST_WIDE_INT high
= TREE_INT_CST_HIGH (val
);
1046 if (tree_int_cst_sgn (val
) < 0)
1048 pp_character (buffer
, '-');
1049 high
= ~high
+ !low
;
1052 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
1054 sprintf (pp_buffer (buffer
)->digit_buffer
,
1055 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
1056 (unsigned HOST_WIDE_INT
) high
, low
);
1057 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
1062 /* Code copied from print_node. */
1065 if (TREE_OVERFLOW (node
))
1066 pp_string (buffer
, " overflow");
1068 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
1069 d
= TREE_REAL_CST (node
);
1070 if (REAL_VALUE_ISINF (d
))
1071 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
1072 else if (REAL_VALUE_ISNAN (d
))
1073 pp_string (buffer
, " Nan");
1077 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
1078 pp_string (buffer
, string
);
1083 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
1084 pp_string (buffer
, "0x");
1085 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
1086 output_formatted_integer (buffer
, "%02x", *p
++);
1095 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
1096 pp_string (buffer
, string
);
1101 pp_string (buffer
, "__complex__ (");
1102 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
1103 pp_string (buffer
, ", ");
1104 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
1105 pp_string (buffer
, ")");
1109 pp_string (buffer
, "\"");
1110 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
1111 pp_string (buffer
, "\"");
1117 pp_string (buffer
, "{ ");
1118 for (i
= 0; i
< VECTOR_CST_NELTS (node
); ++i
)
1121 pp_string (buffer
, ", ");
1122 dump_generic_node (buffer
, VECTOR_CST_ELT (node
, i
),
1125 pp_string (buffer
, " }");
1131 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1133 if (TREE_CODE (node
) == METHOD_TYPE
)
1135 if (TYPE_METHOD_BASETYPE (node
))
1136 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
1139 pp_string (buffer
, "<null method basetype>");
1140 pp_string (buffer
, "::");
1142 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1143 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1144 else if (flags
& TDF_NOUID
)
1145 pp_printf (buffer
, "<Txxxx>");
1147 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1148 dump_function_declaration (buffer
, node
, spc
, flags
);
1153 dump_decl_name (buffer
, node
, flags
);
1157 if (DECL_NAME (node
))
1158 dump_decl_name (buffer
, node
, flags
);
1159 else if (LABEL_DECL_UID (node
) != -1)
1160 pp_printf (buffer
, "<L%d>", (int) LABEL_DECL_UID (node
));
1163 if (flags
& TDF_NOUID
)
1164 pp_string (buffer
, "<D.xxxx>");
1166 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
1171 if (DECL_IS_BUILTIN (node
))
1173 /* Don't print the declaration of built-in types. */
1176 if (DECL_NAME (node
))
1177 dump_decl_name (buffer
, node
, flags
);
1178 else if (TYPE_NAME (TREE_TYPE (node
)) != node
)
1180 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1181 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1182 && TYPE_METHODS (TREE_TYPE (node
)))
1184 /* The type is a c++ class: all structures have at least
1186 pp_string (buffer
, "class ");
1187 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1192 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
1193 ? "union" : "struct "));
1194 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1198 pp_string (buffer
, "<anon>");
1204 case DEBUG_EXPR_DECL
:
1205 case NAMESPACE_DECL
:
1206 dump_decl_name (buffer
, node
, flags
);
1210 pp_string (buffer
, "<retval>");
1214 op0
= TREE_OPERAND (node
, 0);
1217 && (TREE_CODE (op0
) == INDIRECT_REF
1218 || (TREE_CODE (op0
) == MEM_REF
1219 && TREE_CODE (TREE_OPERAND (op0
, 0)) != ADDR_EXPR
1220 && integer_zerop (TREE_OPERAND (op0
, 1))
1221 /* Dump the types of INTEGER_CSTs explicitly, for we
1222 can't infer them and MEM_ATTR caching will share
1223 MEM_REFs with differently-typed op0s. */
1224 && TREE_CODE (TREE_OPERAND (op0
, 0)) != INTEGER_CST
1225 /* Released SSA_NAMES have no TREE_TYPE. */
1226 && TREE_TYPE (TREE_OPERAND (op0
, 0)) != NULL_TREE
1227 /* Same pointer types, but ignoring POINTER_TYPE vs.
1229 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1230 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1231 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1232 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1233 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1234 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1235 /* Same value types ignoring qualifiers. */
1236 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0
))
1237 == TYPE_MAIN_VARIANT
1238 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))))))
1240 op0
= TREE_OPERAND (op0
, 0);
1243 if (op_prio (op0
) < op_prio (node
))
1244 pp_character (buffer
, '(');
1245 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1246 if (op_prio (op0
) < op_prio (node
))
1247 pp_character (buffer
, ')');
1248 pp_string (buffer
, str
);
1249 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1250 op0
= component_ref_field_offset (node
);
1251 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
1253 pp_string (buffer
, "{off: ");
1254 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1255 pp_character (buffer
, '}');
1260 pp_string (buffer
, "BIT_FIELD_REF <");
1261 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1262 pp_string (buffer
, ", ");
1263 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1264 pp_string (buffer
, ", ");
1265 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1266 pp_string (buffer
, ">");
1270 case ARRAY_RANGE_REF
:
1271 op0
= TREE_OPERAND (node
, 0);
1272 if (op_prio (op0
) < op_prio (node
))
1273 pp_character (buffer
, '(');
1274 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1275 if (op_prio (op0
) < op_prio (node
))
1276 pp_character (buffer
, ')');
1277 pp_character (buffer
, '[');
1278 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1279 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
1280 pp_string (buffer
, " ...");
1281 pp_character (buffer
, ']');
1283 op0
= array_ref_low_bound (node
);
1284 op1
= array_ref_element_size (node
);
1286 if (!integer_zerop (op0
)
1287 || TREE_OPERAND (node
, 2)
1288 || TREE_OPERAND (node
, 3))
1290 pp_string (buffer
, "{lb: ");
1291 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1292 pp_string (buffer
, " sz: ");
1293 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1294 pp_character (buffer
, '}');
1300 unsigned HOST_WIDE_INT ix
;
1302 bool is_struct_init
= false;
1303 bool is_array_init
= false;
1304 double_int curidx
= double_int_zero
;
1305 pp_character (buffer
, '{');
1306 if (TREE_CLOBBER_P (node
))
1307 pp_string (buffer
, "CLOBBER");
1308 else if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1309 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1310 is_struct_init
= true;
1311 else if (TREE_CODE (TREE_TYPE (node
)) == ARRAY_TYPE
1312 && TYPE_DOMAIN (TREE_TYPE (node
))
1313 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)))
1314 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
))))
1317 tree minv
= TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)));
1318 is_array_init
= true;
1319 curidx
= tree_to_double_int (minv
);
1321 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1327 pp_character (buffer
, '.');
1328 dump_generic_node (buffer
, field
, spc
, flags
, false);
1329 pp_character (buffer
, '=');
1331 else if (is_array_init
1332 && (TREE_CODE (field
) != INTEGER_CST
1333 || !double_int_equal_p (tree_to_double_int (field
),
1336 pp_character (buffer
, '[');
1337 if (TREE_CODE (field
) == RANGE_EXPR
)
1339 dump_generic_node (buffer
, TREE_OPERAND (field
, 0), spc
,
1341 pp_string (buffer
, " ... ");
1342 dump_generic_node (buffer
, TREE_OPERAND (field
, 1), spc
,
1344 if (TREE_CODE (TREE_OPERAND (field
, 1)) == INTEGER_CST
)
1345 curidx
= tree_to_double_int (TREE_OPERAND (field
, 1));
1348 dump_generic_node (buffer
, field
, spc
, flags
, false);
1349 if (TREE_CODE (field
) == INTEGER_CST
)
1350 curidx
= tree_to_double_int (field
);
1351 pp_string (buffer
, "]=");
1355 curidx
= double_int_add (curidx
, double_int_one
);
1356 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1357 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1358 val
= TREE_OPERAND (val
, 0);
1359 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1360 dump_decl_name (buffer
, val
, flags
);
1362 dump_generic_node (buffer
, val
, spc
, flags
, false);
1363 if (ix
!= VEC_length (constructor_elt
, CONSTRUCTOR_ELTS (node
)) - 1)
1365 pp_character (buffer
, ',');
1369 pp_character (buffer
, '}');
1376 if (flags
& TDF_SLIM
)
1378 pp_string (buffer
, "<COMPOUND_EXPR>");
1382 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1383 spc
, flags
, !(flags
& TDF_SLIM
));
1384 if (flags
& TDF_SLIM
)
1385 newline_and_indent (buffer
, spc
);
1388 pp_character (buffer
, ',');
1392 for (tp
= &TREE_OPERAND (node
, 1);
1393 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1394 tp
= &TREE_OPERAND (*tp
, 1))
1396 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1397 spc
, flags
, !(flags
& TDF_SLIM
));
1398 if (flags
& TDF_SLIM
)
1399 newline_and_indent (buffer
, spc
);
1402 pp_character (buffer
, ',');
1407 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1411 case STATEMENT_LIST
:
1413 tree_stmt_iterator si
;
1416 if (flags
& TDF_SLIM
)
1418 pp_string (buffer
, "<STATEMENT_LIST>");
1422 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1425 newline_and_indent (buffer
, spc
);
1428 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1435 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
,
1438 pp_character (buffer
, '=');
1439 if (TREE_CODE (node
) == MODIFY_EXPR
1440 && MOVE_NONTEMPORAL (node
))
1441 pp_string (buffer
, "{nt}");
1443 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
,
1448 pp_string (buffer
, "TARGET_EXPR <");
1449 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1450 pp_character (buffer
, ',');
1452 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1453 pp_character (buffer
, '>');
1457 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1462 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1464 pp_string (buffer
, "if (");
1465 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1466 pp_character (buffer
, ')');
1467 /* The lowered cond_exprs should always be printed in full. */
1468 if (COND_EXPR_THEN (node
)
1469 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1470 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1471 && COND_EXPR_ELSE (node
)
1472 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1473 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1476 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1478 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1480 pp_string (buffer
, " else ");
1481 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1485 else if (!(flags
& TDF_SLIM
))
1487 /* Output COND_EXPR_THEN. */
1488 if (COND_EXPR_THEN (node
))
1490 newline_and_indent (buffer
, spc
+2);
1491 pp_character (buffer
, '{');
1492 newline_and_indent (buffer
, spc
+4);
1493 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1495 newline_and_indent (buffer
, spc
+2);
1496 pp_character (buffer
, '}');
1499 /* Output COND_EXPR_ELSE. */
1500 if (COND_EXPR_ELSE (node
)
1501 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1503 newline_and_indent (buffer
, spc
);
1504 pp_string (buffer
, "else");
1505 newline_and_indent (buffer
, spc
+2);
1506 pp_character (buffer
, '{');
1507 newline_and_indent (buffer
, spc
+4);
1508 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1510 newline_and_indent (buffer
, spc
+2);
1511 pp_character (buffer
, '}');
1518 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1520 pp_character (buffer
, '?');
1522 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1524 pp_character (buffer
, ':');
1526 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1531 pp_character (buffer
, '{');
1532 if (!(flags
& TDF_SLIM
))
1534 if (BIND_EXPR_VARS (node
))
1536 pp_newline (buffer
);
1538 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= DECL_CHAIN (op0
))
1540 print_declaration (buffer
, op0
, spc
+2, flags
);
1541 pp_newline (buffer
);
1545 newline_and_indent (buffer
, spc
+2);
1546 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1547 newline_and_indent (buffer
, spc
);
1548 pp_character (buffer
, '}');
1554 print_call_name (buffer
, CALL_EXPR_FN (node
), flags
);
1556 /* Print parameters. */
1558 pp_character (buffer
, '(');
1561 call_expr_arg_iterator iter
;
1562 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1564 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1565 if (more_call_expr_args_p (&iter
))
1567 pp_character (buffer
, ',');
1572 if (CALL_EXPR_VA_ARG_PACK (node
))
1574 if (call_expr_nargs (node
) > 0)
1576 pp_character (buffer
, ',');
1579 pp_string (buffer
, "__builtin_va_arg_pack ()");
1581 pp_character (buffer
, ')');
1583 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1586 pp_string (buffer
, " [static-chain: ");
1587 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1588 pp_character (buffer
, ']');
1591 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1592 pp_string (buffer
, " [return slot optimization]");
1593 if (CALL_EXPR_TAILCALL (node
))
1594 pp_string (buffer
, " [tail call]");
1597 case WITH_CLEANUP_EXPR
:
1601 case CLEANUP_POINT_EXPR
:
1602 pp_string (buffer
, "<<cleanup_point ");
1603 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1604 pp_string (buffer
, ">>");
1607 case PLACEHOLDER_EXPR
:
1608 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1609 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1610 pp_character (buffer
, '>');
1613 /* Binary arithmetic and logic expressions. */
1614 case WIDEN_SUM_EXPR
:
1615 case WIDEN_MULT_EXPR
:
1617 case MULT_HIGHPART_EXPR
:
1619 case POINTER_PLUS_EXPR
:
1621 case TRUNC_DIV_EXPR
:
1623 case FLOOR_DIV_EXPR
:
1624 case ROUND_DIV_EXPR
:
1625 case TRUNC_MOD_EXPR
:
1627 case FLOOR_MOD_EXPR
:
1628 case ROUND_MOD_EXPR
:
1630 case EXACT_DIV_EXPR
:
1635 case VEC_LSHIFT_EXPR
:
1636 case VEC_RSHIFT_EXPR
:
1637 case WIDEN_LSHIFT_EXPR
:
1641 case TRUTH_ANDIF_EXPR
:
1642 case TRUTH_ORIF_EXPR
:
1643 case TRUTH_AND_EXPR
:
1645 case TRUTH_XOR_EXPR
:
1659 case UNORDERED_EXPR
:
1661 const char *op
= op_symbol (node
);
1662 op0
= TREE_OPERAND (node
, 0);
1663 op1
= TREE_OPERAND (node
, 1);
1665 /* When the operands are expressions with less priority,
1666 keep semantics of the tree representation. */
1667 if (op_prio (op0
) <= op_prio (node
))
1669 pp_character (buffer
, '(');
1670 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1671 pp_character (buffer
, ')');
1674 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1677 pp_string (buffer
, op
);
1680 /* When the operands are expressions with less priority,
1681 keep semantics of the tree representation. */
1682 if (op_prio (op1
) <= op_prio (node
))
1684 pp_character (buffer
, '(');
1685 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1686 pp_character (buffer
, ')');
1689 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1693 /* Unary arithmetic and logic expressions. */
1696 case TRUTH_NOT_EXPR
:
1698 case PREDECREMENT_EXPR
:
1699 case PREINCREMENT_EXPR
:
1701 if (TREE_CODE (node
) == ADDR_EXPR
1702 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
1703 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
1704 ; /* Do not output '&' for strings and function pointers. */
1706 pp_string (buffer
, op_symbol (node
));
1708 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1710 pp_character (buffer
, '(');
1711 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1712 pp_character (buffer
, ')');
1715 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1718 case POSTDECREMENT_EXPR
:
1719 case POSTINCREMENT_EXPR
:
1720 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1722 pp_character (buffer
, '(');
1723 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1724 pp_character (buffer
, ')');
1727 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1728 pp_string (buffer
, op_symbol (node
));
1732 pp_string (buffer
, "MIN_EXPR <");
1733 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1734 pp_string (buffer
, ", ");
1735 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1736 pp_character (buffer
, '>');
1740 pp_string (buffer
, "MAX_EXPR <");
1741 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1742 pp_string (buffer
, ", ");
1743 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1744 pp_character (buffer
, '>');
1748 pp_string (buffer
, "ABS_EXPR <");
1749 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1750 pp_character (buffer
, '>');
1757 case ADDR_SPACE_CONVERT_EXPR
:
1758 case FIXED_CONVERT_EXPR
:
1759 case FIX_TRUNC_EXPR
:
1762 type
= TREE_TYPE (node
);
1763 op0
= TREE_OPERAND (node
, 0);
1764 if (type
!= TREE_TYPE (op0
))
1766 pp_character (buffer
, '(');
1767 dump_generic_node (buffer
, type
, spc
, flags
, false);
1768 pp_string (buffer
, ") ");
1770 if (op_prio (op0
) < op_prio (node
))
1771 pp_character (buffer
, '(');
1772 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1773 if (op_prio (op0
) < op_prio (node
))
1774 pp_character (buffer
, ')');
1777 case VIEW_CONVERT_EXPR
:
1778 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
1779 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1780 pp_string (buffer
, ">(");
1781 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1782 pp_character (buffer
, ')');
1786 pp_string (buffer
, "((");
1787 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1788 pp_string (buffer
, "))");
1791 case NON_LVALUE_EXPR
:
1792 pp_string (buffer
, "NON_LVALUE_EXPR <");
1793 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1794 pp_character (buffer
, '>');
1798 pp_string (buffer
, "SAVE_EXPR <");
1799 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1800 pp_character (buffer
, '>');
1804 pp_string (buffer
, "COMPLEX_EXPR <");
1805 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1806 pp_string (buffer
, ", ");
1807 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1808 pp_string (buffer
, ">");
1812 pp_string (buffer
, "CONJ_EXPR <");
1813 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1814 pp_string (buffer
, ">");
1818 pp_string (buffer
, "REALPART_EXPR <");
1819 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1820 pp_string (buffer
, ">");
1824 pp_string (buffer
, "IMAGPART_EXPR <");
1825 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1826 pp_string (buffer
, ">");
1830 pp_string (buffer
, "VA_ARG_EXPR <");
1831 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1832 pp_string (buffer
, ">");
1835 case TRY_FINALLY_EXPR
:
1836 case TRY_CATCH_EXPR
:
1837 pp_string (buffer
, "try");
1838 newline_and_indent (buffer
, spc
+2);
1839 pp_string (buffer
, "{");
1840 newline_and_indent (buffer
, spc
+4);
1841 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
1842 newline_and_indent (buffer
, spc
+2);
1843 pp_string (buffer
, "}");
1844 newline_and_indent (buffer
, spc
);
1846 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
1847 newline_and_indent (buffer
, spc
+2);
1848 pp_string (buffer
, "{");
1849 newline_and_indent (buffer
, spc
+4);
1850 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
1851 newline_and_indent (buffer
, spc
+2);
1852 pp_string (buffer
, "}");
1857 pp_string (buffer
, "catch (");
1858 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
1859 pp_string (buffer
, ")");
1860 newline_and_indent (buffer
, spc
+2);
1861 pp_string (buffer
, "{");
1862 newline_and_indent (buffer
, spc
+4);
1863 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
1864 newline_and_indent (buffer
, spc
+2);
1865 pp_string (buffer
, "}");
1869 case EH_FILTER_EXPR
:
1870 pp_string (buffer
, "<<<eh_filter (");
1871 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
1872 pp_string (buffer
, ")>>>");
1873 newline_and_indent (buffer
, spc
+2);
1874 pp_string (buffer
, "{");
1875 newline_and_indent (buffer
, spc
+4);
1876 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
1877 newline_and_indent (buffer
, spc
+2);
1878 pp_string (buffer
, "}");
1883 op0
= TREE_OPERAND (node
, 0);
1884 /* If this is for break or continue, don't bother printing it. */
1885 if (DECL_NAME (op0
))
1887 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1888 if (strcmp (name
, "break") == 0
1889 || strcmp (name
, "continue") == 0)
1892 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1893 pp_character (buffer
, ':');
1894 if (DECL_NONLOCAL (op0
))
1895 pp_string (buffer
, " [non-local]");
1899 pp_string (buffer
, "while (1)");
1900 if (!(flags
& TDF_SLIM
))
1902 newline_and_indent (buffer
, spc
+2);
1903 pp_character (buffer
, '{');
1904 newline_and_indent (buffer
, spc
+4);
1905 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
1906 newline_and_indent (buffer
, spc
+2);
1907 pp_character (buffer
, '}');
1913 pp_string (buffer
, "// predicted ");
1914 if (PREDICT_EXPR_OUTCOME (node
))
1915 pp_string (buffer
, "likely by ");
1917 pp_string (buffer
, "unlikely by ");
1918 pp_string (buffer
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
1919 pp_string (buffer
, " predictor.");
1923 pp_string (buffer
, "return");
1924 op0
= TREE_OPERAND (node
, 0);
1928 if (TREE_CODE (op0
) == MODIFY_EXPR
)
1929 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1),
1932 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1937 pp_string (buffer
, "if (");
1938 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1939 pp_string (buffer
, ") break");
1943 pp_string (buffer
, "switch (");
1944 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
1945 pp_character (buffer
, ')');
1946 if (!(flags
& TDF_SLIM
))
1948 newline_and_indent (buffer
, spc
+2);
1949 pp_character (buffer
, '{');
1950 if (SWITCH_BODY (node
))
1952 newline_and_indent (buffer
, spc
+4);
1953 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
1958 tree vec
= SWITCH_LABELS (node
);
1959 size_t i
, n
= TREE_VEC_LENGTH (vec
);
1960 for (i
= 0; i
< n
; ++i
)
1962 tree elt
= TREE_VEC_ELT (vec
, i
);
1963 newline_and_indent (buffer
, spc
+4);
1966 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
1967 pp_string (buffer
, " goto ");
1968 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
1970 pp_semicolon (buffer
);
1973 pp_string (buffer
, "case ???: goto ???;");
1976 newline_and_indent (buffer
, spc
+2);
1977 pp_character (buffer
, '}');
1983 op0
= GOTO_DESTINATION (node
);
1984 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
1986 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
1987 if (strcmp (name
, "break") == 0
1988 || strcmp (name
, "continue") == 0)
1990 pp_string (buffer
, name
);
1994 pp_string (buffer
, "goto ");
1995 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1999 pp_string (buffer
, "__asm__");
2000 if (ASM_VOLATILE_P (node
))
2001 pp_string (buffer
, " __volatile__");
2002 pp_character (buffer
, '(');
2003 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
2004 pp_character (buffer
, ':');
2005 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
2006 pp_character (buffer
, ':');
2007 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
2008 if (ASM_CLOBBERS (node
))
2010 pp_character (buffer
, ':');
2011 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
2013 pp_string (buffer
, ")");
2016 case CASE_LABEL_EXPR
:
2017 if (CASE_LOW (node
) && CASE_HIGH (node
))
2019 pp_string (buffer
, "case ");
2020 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2021 pp_string (buffer
, " ... ");
2022 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
2024 else if (CASE_LOW (node
))
2026 pp_string (buffer
, "case ");
2027 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2030 pp_string (buffer
, "default");
2031 pp_character (buffer
, ':');
2035 pp_string (buffer
, "OBJ_TYPE_REF(");
2036 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
2037 pp_character (buffer
, ';');
2038 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
2039 pp_character (buffer
, '-');
2040 pp_character (buffer
, '>');
2041 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
2042 pp_character (buffer
, ')');
2046 if (SSA_NAME_IDENTIFIER (node
))
2047 dump_generic_node (buffer
, SSA_NAME_IDENTIFIER (node
),
2049 pp_string (buffer
, "_");
2050 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
2051 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
2052 pp_string (buffer
, "(ab)");
2053 else if (SSA_NAME_IS_DEFAULT_DEF (node
))
2054 pp_string (buffer
, "(D)");
2057 case WITH_SIZE_EXPR
:
2058 pp_string (buffer
, "WITH_SIZE_EXPR <");
2059 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2060 pp_string (buffer
, ", ");
2061 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2062 pp_string (buffer
, ">");
2066 pp_string (buffer
, "ASSERT_EXPR <");
2067 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
2068 pp_string (buffer
, ", ");
2069 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
2070 pp_string (buffer
, ">");
2074 pp_string (buffer
, "scev_known");
2077 case SCEV_NOT_KNOWN
:
2078 pp_string (buffer
, "scev_not_known");
2081 case POLYNOMIAL_CHREC
:
2082 pp_string (buffer
, "{");
2083 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
2084 pp_string (buffer
, ", +, ");
2085 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
2086 pp_string (buffer
, "}_");
2087 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
2091 case REALIGN_LOAD_EXPR
:
2092 pp_string (buffer
, "REALIGN_LOAD <");
2093 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2094 pp_string (buffer
, ", ");
2095 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2096 pp_string (buffer
, ", ");
2097 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2098 pp_string (buffer
, ">");
2102 pp_string (buffer
, " VEC_COND_EXPR < ");
2103 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2104 pp_string (buffer
, " , ");
2105 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2106 pp_string (buffer
, " , ");
2107 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2108 pp_string (buffer
, " > ");
2112 pp_string (buffer
, " VEC_PERM_EXPR < ");
2113 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2114 pp_string (buffer
, " , ");
2115 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2116 pp_string (buffer
, " , ");
2117 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2118 pp_string (buffer
, " > ");
2122 pp_string (buffer
, " DOT_PROD_EXPR < ");
2123 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2124 pp_string (buffer
, ", ");
2125 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2126 pp_string (buffer
, ", ");
2127 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2128 pp_string (buffer
, " > ");
2131 case WIDEN_MULT_PLUS_EXPR
:
2132 pp_string (buffer
, " WIDEN_MULT_PLUS_EXPR < ");
2133 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2134 pp_string (buffer
, ", ");
2135 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2136 pp_string (buffer
, ", ");
2137 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2138 pp_string (buffer
, " > ");
2141 case WIDEN_MULT_MINUS_EXPR
:
2142 pp_string (buffer
, " WIDEN_MULT_MINUS_EXPR < ");
2143 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2144 pp_string (buffer
, ", ");
2145 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2146 pp_string (buffer
, ", ");
2147 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2148 pp_string (buffer
, " > ");
2152 pp_string (buffer
, " FMA_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
, ", ");
2157 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2158 pp_string (buffer
, " > ");
2162 pp_string (buffer
, "#pragma omp parallel");
2163 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
2166 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
2168 newline_and_indent (buffer
, spc
+ 2);
2169 pp_character (buffer
, '{');
2170 newline_and_indent (buffer
, spc
+ 4);
2171 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
2172 newline_and_indent (buffer
, spc
+ 2);
2173 pp_character (buffer
, '}');
2179 pp_string (buffer
, "#pragma omp task");
2180 dump_omp_clauses (buffer
, OMP_TASK_CLAUSES (node
), spc
, flags
);
2184 pp_string (buffer
, "#pragma omp for");
2185 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2187 if (!(flags
& TDF_SLIM
))
2191 if (OMP_FOR_PRE_BODY (node
))
2193 newline_and_indent (buffer
, spc
+ 2);
2194 pp_character (buffer
, '{');
2196 newline_and_indent (buffer
, spc
);
2197 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
2201 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
2204 newline_and_indent (buffer
, spc
);
2205 pp_string (buffer
, "for (");
2206 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
2208 pp_string (buffer
, "; ");
2209 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
2211 pp_string (buffer
, "; ");
2212 dump_generic_node (buffer
, TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
2214 pp_string (buffer
, ")");
2216 if (OMP_FOR_BODY (node
))
2218 newline_and_indent (buffer
, spc
+ 2);
2219 pp_character (buffer
, '{');
2220 newline_and_indent (buffer
, spc
+ 4);
2221 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
2223 newline_and_indent (buffer
, spc
+ 2);
2224 pp_character (buffer
, '}');
2226 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
2227 if (OMP_FOR_PRE_BODY (node
))
2230 newline_and_indent (buffer
, spc
+ 2);
2231 pp_character (buffer
, '}');
2238 pp_string (buffer
, "#pragma omp sections");
2239 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
2243 pp_string (buffer
, "#pragma omp section");
2247 pp_string (buffer
, "#pragma omp master");
2251 pp_string (buffer
, "#pragma omp ordered");
2255 pp_string (buffer
, "#pragma omp critical");
2256 if (OMP_CRITICAL_NAME (node
))
2259 pp_character (buffer
, '(');
2260 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
2262 pp_character (buffer
, ')');
2267 pp_string (buffer
, "#pragma omp atomic");
2268 newline_and_indent (buffer
, spc
+ 2);
2269 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2271 pp_character (buffer
, '=');
2273 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2276 case OMP_ATOMIC_READ
:
2277 pp_string (buffer
, "#pragma omp atomic read");
2278 newline_and_indent (buffer
, spc
+ 2);
2279 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2283 case OMP_ATOMIC_CAPTURE_OLD
:
2284 case OMP_ATOMIC_CAPTURE_NEW
:
2285 pp_string (buffer
, "#pragma omp atomic capture");
2286 newline_and_indent (buffer
, spc
+ 2);
2287 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2289 pp_character (buffer
, '=');
2291 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2295 pp_string (buffer
, "#pragma omp single");
2296 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
2300 dump_omp_clause (buffer
, node
, spc
, flags
);
2304 case TRANSACTION_EXPR
:
2305 if (TRANSACTION_EXPR_OUTER (node
))
2306 pp_string (buffer
, "__transaction_atomic [[outer]]");
2307 else if (TRANSACTION_EXPR_RELAXED (node
))
2308 pp_string (buffer
, "__transaction_relaxed");
2310 pp_string (buffer
, "__transaction_atomic");
2311 if (!(flags
& TDF_SLIM
) && TRANSACTION_EXPR_BODY (node
))
2313 newline_and_indent (buffer
, spc
);
2314 pp_character (buffer
, '{');
2315 newline_and_indent (buffer
, spc
+ 2);
2316 dump_generic_node (buffer
, TRANSACTION_EXPR_BODY (node
),
2317 spc
+ 2, flags
, false);
2318 newline_and_indent (buffer
, spc
);
2319 pp_character (buffer
, '}');
2324 case REDUC_MAX_EXPR
:
2325 pp_string (buffer
, " REDUC_MAX_EXPR < ");
2326 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2327 pp_string (buffer
, " > ");
2330 case REDUC_MIN_EXPR
:
2331 pp_string (buffer
, " REDUC_MIN_EXPR < ");
2332 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2333 pp_string (buffer
, " > ");
2336 case REDUC_PLUS_EXPR
:
2337 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
2338 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2339 pp_string (buffer
, " > ");
2342 case VEC_WIDEN_MULT_HI_EXPR
:
2343 case VEC_WIDEN_MULT_LO_EXPR
:
2344 case VEC_WIDEN_MULT_EVEN_EXPR
:
2345 case VEC_WIDEN_MULT_ODD_EXPR
:
2346 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2347 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2348 pp_character (buffer
, ' ');
2349 for (str
= tree_code_name
[code
]; *str
; str
++)
2350 pp_character (buffer
, TOUPPER (*str
));
2351 pp_string (buffer
, " < ");
2352 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2353 pp_string (buffer
, ", ");
2354 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2355 pp_string (buffer
, " > ");
2358 case VEC_UNPACK_HI_EXPR
:
2359 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
2360 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2361 pp_string (buffer
, " > ");
2364 case VEC_UNPACK_LO_EXPR
:
2365 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
2366 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2367 pp_string (buffer
, " > ");
2370 case VEC_UNPACK_FLOAT_HI_EXPR
:
2371 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2372 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2373 pp_string (buffer
, " > ");
2376 case VEC_UNPACK_FLOAT_LO_EXPR
:
2377 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2378 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2379 pp_string (buffer
, " > ");
2382 case VEC_PACK_TRUNC_EXPR
:
2383 pp_string (buffer
, " VEC_PACK_TRUNC_EXPR < ");
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_PACK_SAT_EXPR
:
2391 pp_string (buffer
, " VEC_PACK_SAT_EXPR < ");
2392 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2393 pp_string (buffer
, ", ");
2394 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2395 pp_string (buffer
, " > ");
2398 case VEC_PACK_FIX_TRUNC_EXPR
:
2399 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2400 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2401 pp_string (buffer
, ", ");
2402 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2403 pp_string (buffer
, " > ");
2407 dump_block_node (buffer
, node
, spc
, flags
);
2414 if (is_stmt
&& is_expr
)
2415 pp_semicolon (buffer
);
2417 /* If we're building a diagnostic, the formatted text will be written
2418 into BUFFER's stream by the caller; otherwise, write it now. */
2419 if (!(flags
& TDF_DIAGNOSTIC
))
2420 pp_write_text_to_stream (buffer
);
2425 /* Print the declaration of a variable. */
2428 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2432 if (TREE_CODE (t
) == TYPE_DECL
)
2433 pp_string (buffer
, "typedef ");
2435 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2436 pp_string (buffer
, "register ");
2438 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2439 pp_string (buffer
, "extern ");
2440 else if (TREE_STATIC (t
))
2441 pp_string (buffer
, "static ");
2443 /* Print the type and name. */
2444 if (TREE_TYPE (t
) && TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2448 /* Print array's type. */
2449 tmp
= TREE_TYPE (t
);
2450 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2451 tmp
= TREE_TYPE (tmp
);
2452 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2454 /* Print variable's name. */
2456 dump_generic_node (buffer
, t
, spc
, flags
, false);
2458 /* Print the dimensions. */
2459 tmp
= TREE_TYPE (t
);
2460 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2462 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2463 tmp
= TREE_TYPE (tmp
);
2466 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2468 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2470 dump_decl_name (buffer
, t
, flags
);
2471 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2475 /* Print type declaration. */
2476 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2478 /* Print variable's name. */
2480 dump_generic_node (buffer
, t
, spc
, flags
, false);
2483 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2485 pp_string (buffer
, " __asm__ ");
2486 pp_character (buffer
, '(');
2487 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2488 pp_character (buffer
, ')');
2491 /* The initial value of a function serves to determine whether the function
2492 is declared or defined. So the following does not apply to function
2494 if (TREE_CODE (t
) != FUNCTION_DECL
)
2496 /* Print the initial value. */
2497 if (DECL_INITIAL (t
))
2500 pp_character (buffer
, '=');
2502 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2506 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2508 pp_string (buffer
, " [value-expr: ");
2509 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2510 pp_character (buffer
, ']');
2513 pp_character (buffer
, ';');
2517 /* Prints a structure: name, fields, and methods.
2518 FIXME: Still incomplete. */
2521 print_struct_decl (pretty_printer
*buffer
, const_tree node
, int spc
, int flags
)
2523 /* Print the name of the structure. */
2524 if (TYPE_NAME (node
))
2527 if (TREE_CODE (node
) == RECORD_TYPE
)
2528 pp_string (buffer
, "struct ");
2529 else if ((TREE_CODE (node
) == UNION_TYPE
2530 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
2531 pp_string (buffer
, "union ");
2533 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
2536 /* Print the contents of the structure. */
2537 pp_newline (buffer
);
2539 pp_character (buffer
, '{');
2540 pp_newline (buffer
);
2542 /* Print the fields of the structure. */
2545 tmp
= TYPE_FIELDS (node
);
2548 /* Avoid to print recursively the structure. */
2549 /* FIXME : Not implemented correctly...,
2550 what about the case when we have a cycle in the contain graph? ...
2551 Maybe this could be solved by looking at the scope in which the
2552 structure was declared. */
2553 if (TREE_TYPE (tmp
) != node
2554 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
2555 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
2557 print_declaration (buffer
, tmp
, spc
+2, flags
);
2558 pp_newline (buffer
);
2560 tmp
= DECL_CHAIN (tmp
);
2564 pp_character (buffer
, '}');
2567 /* Return the priority of the operator CODE.
2569 From lowest to highest precedence with either left-to-right (L-R)
2570 or right-to-left (R-L) associativity]:
2573 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2585 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2586 15 [L-R] fn() [] -> .
2588 unary +, - and * have higher precedence than the corresponding binary
2592 op_code_prio (enum tree_code code
)
2609 case TRUTH_ORIF_EXPR
:
2612 case TRUTH_AND_EXPR
:
2613 case TRUTH_ANDIF_EXPR
:
2620 case TRUTH_XOR_EXPR
:
2637 case UNORDERED_EXPR
:
2648 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2649 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2650 case WIDEN_LSHIFT_EXPR
:
2653 case WIDEN_SUM_EXPR
:
2655 case POINTER_PLUS_EXPR
:
2659 case VEC_WIDEN_MULT_HI_EXPR
:
2660 case VEC_WIDEN_MULT_LO_EXPR
:
2661 case WIDEN_MULT_EXPR
:
2663 case WIDEN_MULT_PLUS_EXPR
:
2664 case WIDEN_MULT_MINUS_EXPR
:
2666 case MULT_HIGHPART_EXPR
:
2667 case TRUNC_DIV_EXPR
:
2669 case FLOOR_DIV_EXPR
:
2670 case ROUND_DIV_EXPR
:
2672 case EXACT_DIV_EXPR
:
2673 case TRUNC_MOD_EXPR
:
2675 case FLOOR_MOD_EXPR
:
2676 case ROUND_MOD_EXPR
:
2680 case TRUTH_NOT_EXPR
:
2682 case POSTINCREMENT_EXPR
:
2683 case POSTDECREMENT_EXPR
:
2684 case PREINCREMENT_EXPR
:
2685 case PREDECREMENT_EXPR
:
2691 case FIX_TRUNC_EXPR
:
2697 case ARRAY_RANGE_REF
:
2701 /* Special expressions. */
2707 case REDUC_MAX_EXPR
:
2708 case REDUC_MIN_EXPR
:
2709 case REDUC_PLUS_EXPR
:
2710 case VEC_LSHIFT_EXPR
:
2711 case VEC_RSHIFT_EXPR
:
2712 case VEC_UNPACK_HI_EXPR
:
2713 case VEC_UNPACK_LO_EXPR
:
2714 case VEC_UNPACK_FLOAT_HI_EXPR
:
2715 case VEC_UNPACK_FLOAT_LO_EXPR
:
2716 case VEC_PACK_TRUNC_EXPR
:
2717 case VEC_PACK_SAT_EXPR
:
2721 /* Return an arbitrarily high precedence to avoid surrounding single
2722 VAR_DECLs in ()s. */
2727 /* Return the priority of the operator OP. */
2730 op_prio (const_tree op
)
2732 enum tree_code code
;
2737 code
= TREE_CODE (op
);
2738 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
2739 return op_prio (TREE_OPERAND (op
, 0));
2741 return op_code_prio (code
);
2744 /* Return the symbol associated with operator CODE. */
2747 op_symbol_code (enum tree_code code
)
2755 case TRUTH_ORIF_EXPR
:
2758 case TRUTH_AND_EXPR
:
2759 case TRUTH_ANDIF_EXPR
:
2765 case TRUTH_XOR_EXPR
:
2775 case UNORDERED_EXPR
:
2821 case VEC_LSHIFT_EXPR
:
2824 case VEC_RSHIFT_EXPR
:
2827 case WIDEN_LSHIFT_EXPR
:
2830 case POINTER_PLUS_EXPR
:
2836 case REDUC_PLUS_EXPR
:
2839 case WIDEN_SUM_EXPR
:
2842 case WIDEN_MULT_EXPR
:
2845 case MULT_HIGHPART_EXPR
:
2855 case TRUTH_NOT_EXPR
:
2862 case TRUNC_DIV_EXPR
:
2869 case FLOOR_DIV_EXPR
:
2872 case ROUND_DIV_EXPR
:
2875 case EXACT_DIV_EXPR
:
2878 case TRUNC_MOD_EXPR
:
2884 case FLOOR_MOD_EXPR
:
2887 case ROUND_MOD_EXPR
:
2890 case PREDECREMENT_EXPR
:
2893 case PREINCREMENT_EXPR
:
2896 case POSTDECREMENT_EXPR
:
2899 case POSTINCREMENT_EXPR
:
2909 return "<<< ??? >>>";
2913 /* Return the symbol associated with operator OP. */
2916 op_symbol (const_tree op
)
2918 return op_symbol_code (TREE_CODE (op
));
2921 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
2922 the gimple_call_fn of a GIMPLE_CALL. */
2925 print_call_name (pretty_printer
*buffer
, tree node
, int flags
)
2929 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
2930 op0
= TREE_OPERAND (op0
, 0);
2933 switch (TREE_CODE (op0
))
2938 dump_function_name (buffer
, op0
, flags
);
2944 op0
= TREE_OPERAND (op0
, 0);
2948 pp_string (buffer
, "(");
2949 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, flags
, false);
2950 pp_string (buffer
, ") ? ");
2951 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, flags
, false);
2952 pp_string (buffer
, " : ");
2953 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, flags
, false);
2957 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
2958 dump_function_name (buffer
, TREE_OPERAND (op0
, 0), flags
);
2960 dump_generic_node (buffer
, op0
, 0, flags
, false);
2964 if (integer_zerop (TREE_OPERAND (op0
, 1)))
2966 op0
= TREE_OPERAND (op0
, 0);
2973 dump_generic_node (buffer
, op0
, 0, flags
, false);
2981 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2984 pretty_print_string (pretty_printer
*buffer
, const char *str
)
2994 pp_string (buffer
, "\\b");
2998 pp_string (buffer
, "\\f");
3002 pp_string (buffer
, "\\n");
3006 pp_string (buffer
, "\\r");
3010 pp_string (buffer
, "\\t");
3014 pp_string (buffer
, "\\v");
3018 pp_string (buffer
, "\\\\");
3022 pp_string (buffer
, "\\\"");
3026 pp_string (buffer
, "\\'");
3029 /* No need to handle \0; the loop terminates on \0. */
3032 pp_string (buffer
, "\\1");
3036 pp_string (buffer
, "\\2");
3040 pp_string (buffer
, "\\3");
3044 pp_string (buffer
, "\\4");
3048 pp_string (buffer
, "\\5");
3052 pp_string (buffer
, "\\6");
3056 pp_string (buffer
, "\\7");
3060 pp_character (buffer
, str
[0]);
3068 maybe_init_pretty_print (FILE *file
)
3072 pp_construct (&buffer
, /* prefix */NULL
, /* line-width */0);
3073 pp_needs_newline (&buffer
) = true;
3074 pp_translate_identifiers (&buffer
) = false;
3078 buffer
.buffer
->stream
= file
;
3082 newline_and_indent (pretty_printer
*buffer
, int spc
)
3084 pp_newline (buffer
);
3088 /* Handle a %K format for TEXT. Separate from default_tree_printer so
3089 it can also be used in front ends.
3090 %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
3094 percent_K_format (text_info
*text
)
3096 tree t
= va_arg (*text
->args_ptr
, tree
), block
;
3097 gcc_assert (text
->locus
!= NULL
);
3098 *text
->locus
= EXPR_LOCATION (t
);
3099 gcc_assert (pp_ti_abstract_origin (text
) != NULL
);
3100 block
= TREE_BLOCK (t
);
3101 *pp_ti_abstract_origin (text
) = NULL
;
3103 && TREE_CODE (block
) == BLOCK
3104 && BLOCK_ABSTRACT_ORIGIN (block
))
3106 tree ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3108 while (TREE_CODE (ao
) == BLOCK
3109 && BLOCK_ABSTRACT_ORIGIN (ao
)
3110 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3111 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3113 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3115 *pp_ti_abstract_origin (text
) = block
;
3118 block
= BLOCK_SUPERCONTEXT (block
);
3122 /* Print the identifier ID to PRETTY-PRINTER. */
3125 pp_base_tree_identifier (pretty_printer
*pp
, tree id
)
3127 if (pp_translate_identifiers (pp
))
3129 const char *text
= identifier_to_locale (IDENTIFIER_POINTER (id
));
3130 pp_append_text (pp
, text
, text
+ strlen (text
));
3133 pp_append_text (pp
, IDENTIFIER_POINTER (id
),
3134 IDENTIFIER_POINTER (id
) + IDENTIFIER_LENGTH (id
));
3137 /* A helper function that is used to dump function information before the
3141 dump_function_header (FILE *dump_file
, tree fdecl
, int flags
)
3143 const char *dname
, *aname
;
3144 struct cgraph_node
*node
= cgraph_get_node (fdecl
);
3145 struct function
*fun
= DECL_STRUCT_FUNCTION (fdecl
);
3147 dname
= lang_hooks
.decl_printable_name (fdecl
, 2);
3149 if (DECL_ASSEMBLER_NAME_SET_P (fdecl
))
3150 aname
= (IDENTIFIER_POINTER
3151 (DECL_ASSEMBLER_NAME (fdecl
)));
3153 aname
= "<unset-asm-name>";
3155 fprintf (dump_file
, "\n;; Function %s (%s, funcdef_no=%d",
3156 dname
, aname
, fun
->funcdef_no
);
3157 if (!(flags
& TDF_NOUID
))
3158 fprintf (dump_file
, ", decl_uid=%d", DECL_UID (fdecl
));
3161 fprintf (dump_file
, ", cgraph_uid=%d)%s\n\n", node
->uid
,
3162 node
->frequency
== NODE_FREQUENCY_HOT
3164 : node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
3165 ? " (unlikely executed)"
3166 : node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
3167 ? " (executed once)"
3171 fprintf (dump_file
, ")\n\n");