1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001-2014 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 "stor-layout.h"
28 #include "tree-pretty-print.h"
30 #include "pointer-set.h"
31 #include "gimple-expr.h"
33 #include "langhooks.h"
34 #include "tree-iterator.h"
35 #include "tree-chrec.h"
37 #include "value-prof.h"
39 #include "wide-int-print.h"
41 #include <new> // For placement-new.
43 /* Local functions, macros and variables. */
44 static const char *op_symbol (const_tree
);
45 static void pretty_print_string (pretty_printer
*, const char*);
46 static void newline_and_indent (pretty_printer
*, int);
47 static void maybe_init_pretty_print (FILE *);
48 static void print_struct_decl (pretty_printer
*, const_tree
, int, int);
49 static void do_niy (pretty_printer
*, const_tree
);
51 #define INDENT(SPACE) do { \
52 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
54 #define NIY do_niy (buffer, node)
56 static pretty_printer buffer
;
57 static int initialized
= 0;
59 /* Try to print something for an unknown tree code. */
62 do_niy (pretty_printer
*buffer
, const_tree node
)
66 pp_string (buffer
, "<<< Unknown tree: ");
67 pp_string (buffer
, get_tree_code_name (TREE_CODE (node
)));
71 len
= TREE_OPERAND_LENGTH (node
);
72 for (i
= 0; i
< len
; ++i
)
74 newline_and_indent (buffer
, 2);
75 dump_generic_node (buffer
, TREE_OPERAND (node
, i
), 2, 0, false);
79 pp_string (buffer
, " >>>");
82 /* Debugging function to print out a generic expression. */
85 debug_generic_expr (tree t
)
87 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
88 fprintf (stderr
, "\n");
91 /* Debugging function to print out a generic statement. */
94 debug_generic_stmt (tree t
)
96 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
97 fprintf (stderr
, "\n");
100 /* Debugging function to print out a chain of trees . */
103 debug_tree_chain (tree t
)
105 struct pointer_set_t
*seen
= pointer_set_create ();
109 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
110 fprintf (stderr
, " ");
112 if (pointer_set_insert (seen
, t
))
114 fprintf (stderr
, "... [cycled back to ");
115 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
116 fprintf (stderr
, "]");
120 fprintf (stderr
, "\n");
122 pointer_set_destroy (seen
);
125 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
127 print_generic_decl (FILE *file
, tree decl
, int flags
)
129 maybe_init_pretty_print (file
);
130 print_declaration (&buffer
, decl
, 2, flags
);
131 pp_write_text_to_stream (&buffer
);
134 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
135 to show in the dump. See TDF_* in dumpfile.h. */
138 print_generic_stmt (FILE *file
, tree t
, int flags
)
140 maybe_init_pretty_print (file
);
141 dump_generic_node (&buffer
, t
, 0, flags
, true);
142 pp_newline_and_flush (&buffer
);
145 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
146 to show in the dump. See TDF_* in dumpfile.h. The output is indented by
150 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
154 maybe_init_pretty_print (file
);
156 for (i
= 0; i
< indent
; i
++)
158 dump_generic_node (&buffer
, t
, indent
, flags
, true);
159 pp_newline_and_flush (&buffer
);
162 /* Print a single expression T on file FILE. FLAGS specifies details to show
163 in the dump. See TDF_* in dumpfile.h. */
166 print_generic_expr (FILE *file
, tree t
, int flags
)
168 maybe_init_pretty_print (file
);
169 dump_generic_node (&buffer
, t
, 0, flags
, false);
173 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
177 dump_decl_name (pretty_printer
*buffer
, tree node
, int flags
)
179 if (DECL_NAME (node
))
181 if ((flags
& TDF_ASMNAME
) && DECL_ASSEMBLER_NAME_SET_P (node
))
182 pp_tree_identifier (buffer
, DECL_ASSEMBLER_NAME (node
));
184 pp_tree_identifier (buffer
, DECL_NAME (node
));
186 if ((flags
& TDF_UID
) || DECL_NAME (node
) == NULL_TREE
)
188 if (TREE_CODE (node
) == LABEL_DECL
&& LABEL_DECL_UID (node
) != -1)
189 pp_printf (buffer
, "L.%d", (int) LABEL_DECL_UID (node
));
190 else if (TREE_CODE (node
) == DEBUG_EXPR_DECL
)
192 if (flags
& TDF_NOUID
)
193 pp_string (buffer
, "D#xxxx");
195 pp_printf (buffer
, "D#%i", DEBUG_TEMP_UID (node
));
199 char c
= TREE_CODE (node
) == CONST_DECL
? 'C' : 'D';
200 if (flags
& TDF_NOUID
)
201 pp_printf (buffer
, "%c.xxxx", c
);
203 pp_printf (buffer
, "%c.%u", c
, DECL_UID (node
));
206 if ((flags
& TDF_ALIAS
) && DECL_PT_UID (node
) != DECL_UID (node
))
208 if (flags
& TDF_NOUID
)
209 pp_printf (buffer
, "ptD.xxxx");
211 pp_printf (buffer
, "ptD.%u", DECL_PT_UID (node
));
215 /* Like the above, but used for pretty printing function calls. */
218 dump_function_name (pretty_printer
*buffer
, tree node
, int flags
)
220 if (TREE_CODE (node
) == NOP_EXPR
)
221 node
= TREE_OPERAND (node
, 0);
222 if (DECL_NAME (node
) && (flags
& TDF_ASMNAME
) == 0)
223 pp_string (buffer
, lang_hooks
.decl_printable_name (node
, 1));
225 dump_decl_name (buffer
, node
, flags
);
228 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
229 FLAGS are as in dump_generic_node. */
232 dump_function_declaration (pretty_printer
*buffer
, tree node
,
235 bool wrote_arg
= false;
239 pp_left_paren (buffer
);
241 /* Print the argument types. */
242 arg
= TYPE_ARG_TYPES (node
);
243 while (arg
&& arg
!= void_list_node
&& arg
!= error_mark_node
)
251 dump_generic_node (buffer
, TREE_VALUE (arg
), spc
, flags
, false);
252 arg
= TREE_CHAIN (arg
);
255 /* Drop the trailing void_type_node if we had any previous argument. */
256 if (arg
== void_list_node
&& !wrote_arg
)
257 pp_string (buffer
, "void");
258 /* Properly dump vararg function types. */
259 else if (!arg
&& wrote_arg
)
260 pp_string (buffer
, ", ...");
261 /* Avoid printing any arg for unprototyped functions. */
263 pp_right_paren (buffer
);
266 /* Dump the domain associated with an array. */
269 dump_array_domain (pretty_printer
*buffer
, tree domain
, int spc
, int flags
)
271 pp_left_bracket (buffer
);
274 tree min
= TYPE_MIN_VALUE (domain
);
275 tree max
= TYPE_MAX_VALUE (domain
);
278 && integer_zerop (min
)
279 && tree_fits_shwi_p (max
))
280 pp_wide_integer (buffer
, tree_to_shwi (max
) + 1);
284 dump_generic_node (buffer
, min
, spc
, flags
, false);
287 dump_generic_node (buffer
, max
, spc
, flags
, false);
291 pp_string (buffer
, "<unknown>");
292 pp_right_bracket (buffer
);
296 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
297 dump_generic_node. */
300 dump_omp_clause (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
304 switch (OMP_CLAUSE_CODE (clause
))
306 case OMP_CLAUSE_PRIVATE
:
309 case OMP_CLAUSE_SHARED
:
312 case OMP_CLAUSE_FIRSTPRIVATE
:
313 name
= "firstprivate";
315 case OMP_CLAUSE_LASTPRIVATE
:
316 name
= "lastprivate";
318 case OMP_CLAUSE_COPYIN
:
321 case OMP_CLAUSE_COPYPRIVATE
:
322 name
= "copyprivate";
324 case OMP_CLAUSE_UNIFORM
:
327 case OMP_CLAUSE__LOOPTEMP_
:
331 pp_string (buffer
, name
);
332 pp_left_paren (buffer
);
333 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
335 pp_right_paren (buffer
);
338 case OMP_CLAUSE_REDUCTION
:
339 pp_string (buffer
, "reduction(");
340 if (OMP_CLAUSE_REDUCTION_CODE (clause
) != ERROR_MARK
)
343 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
346 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
348 pp_right_paren (buffer
);
352 pp_string (buffer
, "if(");
353 dump_generic_node (buffer
, OMP_CLAUSE_IF_EXPR (clause
),
355 pp_right_paren (buffer
);
358 case OMP_CLAUSE_NUM_THREADS
:
359 pp_string (buffer
, "num_threads(");
360 dump_generic_node (buffer
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
362 pp_right_paren (buffer
);
365 case OMP_CLAUSE_NOWAIT
:
366 pp_string (buffer
, "nowait");
368 case OMP_CLAUSE_ORDERED
:
369 pp_string (buffer
, "ordered");
372 case OMP_CLAUSE_DEFAULT
:
373 pp_string (buffer
, "default(");
374 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
376 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
378 case OMP_CLAUSE_DEFAULT_SHARED
:
379 pp_string (buffer
, "shared");
381 case OMP_CLAUSE_DEFAULT_NONE
:
382 pp_string (buffer
, "none");
384 case OMP_CLAUSE_DEFAULT_PRIVATE
:
385 pp_string (buffer
, "private");
387 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
388 pp_string (buffer
, "firstprivate");
393 pp_right_paren (buffer
);
396 case OMP_CLAUSE_SCHEDULE
:
397 pp_string (buffer
, "schedule(");
398 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
400 case OMP_CLAUSE_SCHEDULE_STATIC
:
401 pp_string (buffer
, "static");
403 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
404 pp_string (buffer
, "dynamic");
406 case OMP_CLAUSE_SCHEDULE_GUIDED
:
407 pp_string (buffer
, "guided");
409 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
410 pp_string (buffer
, "runtime");
412 case OMP_CLAUSE_SCHEDULE_AUTO
:
413 pp_string (buffer
, "auto");
418 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
421 dump_generic_node (buffer
, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
424 pp_right_paren (buffer
);
427 case OMP_CLAUSE_UNTIED
:
428 pp_string (buffer
, "untied");
431 case OMP_CLAUSE_COLLAPSE
:
432 pp_string (buffer
, "collapse(");
433 dump_generic_node (buffer
, OMP_CLAUSE_COLLAPSE_EXPR (clause
),
435 pp_right_paren (buffer
);
438 case OMP_CLAUSE_FINAL
:
439 pp_string (buffer
, "final(");
440 dump_generic_node (buffer
, OMP_CLAUSE_FINAL_EXPR (clause
),
442 pp_right_paren (buffer
);
445 case OMP_CLAUSE_MERGEABLE
:
446 pp_string (buffer
, "mergeable");
449 case OMP_CLAUSE_LINEAR
:
450 pp_string (buffer
, "linear(");
451 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
454 dump_generic_node (buffer
, OMP_CLAUSE_LINEAR_STEP (clause
),
456 pp_right_paren (buffer
);
459 case OMP_CLAUSE_ALIGNED
:
460 pp_string (buffer
, "aligned(");
461 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
463 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
))
466 dump_generic_node (buffer
, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
),
469 pp_right_paren (buffer
);
472 case OMP_CLAUSE_DEPEND
:
473 pp_string (buffer
, "depend(");
474 switch (OMP_CLAUSE_DEPEND_KIND (clause
))
476 case OMP_CLAUSE_DEPEND_IN
:
477 pp_string (buffer
, "in");
479 case OMP_CLAUSE_DEPEND_OUT
:
480 pp_string (buffer
, "out");
482 case OMP_CLAUSE_DEPEND_INOUT
:
483 pp_string (buffer
, "inout");
489 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
491 pp_right_paren (buffer
);
495 pp_string (buffer
, "map(");
496 switch (OMP_CLAUSE_MAP_KIND (clause
))
498 case OMP_CLAUSE_MAP_ALLOC
:
499 case OMP_CLAUSE_MAP_POINTER
:
500 pp_string (buffer
, "alloc");
502 case OMP_CLAUSE_MAP_TO
:
503 case OMP_CLAUSE_MAP_TO_PSET
:
504 pp_string (buffer
, "to");
506 case OMP_CLAUSE_MAP_FROM
:
507 pp_string (buffer
, "from");
509 case OMP_CLAUSE_MAP_TOFROM
:
510 pp_string (buffer
, "tofrom");
516 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
519 if (OMP_CLAUSE_SIZE (clause
))
521 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
522 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_POINTER
)
523 pp_string (buffer
, " [pointer assign, bias: ");
524 else if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
525 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_TO_PSET
)
526 pp_string (buffer
, " [pointer set, len: ");
528 pp_string (buffer
, " [len: ");
529 dump_generic_node (buffer
, OMP_CLAUSE_SIZE (clause
),
531 pp_right_bracket (buffer
);
533 pp_right_paren (buffer
);
536 case OMP_CLAUSE_FROM
:
537 pp_string (buffer
, "from(");
538 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
540 goto print_clause_size
;
543 pp_string (buffer
, "to(");
544 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
546 goto print_clause_size
;
548 case OMP_CLAUSE_NUM_TEAMS
:
549 pp_string (buffer
, "num_teams(");
550 dump_generic_node (buffer
, OMP_CLAUSE_NUM_TEAMS_EXPR (clause
),
552 pp_right_paren (buffer
);
555 case OMP_CLAUSE_THREAD_LIMIT
:
556 pp_string (buffer
, "thread_limit(");
557 dump_generic_node (buffer
, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause
),
559 pp_right_paren (buffer
);
562 case OMP_CLAUSE_DEVICE
:
563 pp_string (buffer
, "device(");
564 dump_generic_node (buffer
, OMP_CLAUSE_DEVICE_ID (clause
),
566 pp_right_paren (buffer
);
569 case OMP_CLAUSE_DIST_SCHEDULE
:
570 pp_string (buffer
, "dist_schedule(static");
571 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
))
574 dump_generic_node (buffer
,
575 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
),
578 pp_right_paren (buffer
);
581 case OMP_CLAUSE_PROC_BIND
:
582 pp_string (buffer
, "proc_bind(");
583 switch (OMP_CLAUSE_PROC_BIND_KIND (clause
))
585 case OMP_CLAUSE_PROC_BIND_MASTER
:
586 pp_string (buffer
, "master");
588 case OMP_CLAUSE_PROC_BIND_CLOSE
:
589 pp_string (buffer
, "close");
591 case OMP_CLAUSE_PROC_BIND_SPREAD
:
592 pp_string (buffer
, "spread");
597 pp_right_paren (buffer
);
600 case OMP_CLAUSE_SAFELEN
:
601 pp_string (buffer
, "safelen(");
602 dump_generic_node (buffer
, OMP_CLAUSE_SAFELEN_EXPR (clause
),
604 pp_right_paren (buffer
);
607 case OMP_CLAUSE_SIMDLEN
:
608 pp_string (buffer
, "simdlen(");
609 dump_generic_node (buffer
, OMP_CLAUSE_SIMDLEN_EXPR (clause
),
611 pp_right_paren (buffer
);
614 case OMP_CLAUSE__SIMDUID_
:
615 pp_string (buffer
, "_simduid_(");
616 dump_generic_node (buffer
, OMP_CLAUSE__SIMDUID__DECL (clause
),
618 pp_right_paren (buffer
);
621 case OMP_CLAUSE_INBRANCH
:
622 pp_string (buffer
, "inbranch");
624 case OMP_CLAUSE_NOTINBRANCH
:
625 pp_string (buffer
, "notinbranch");
628 pp_string (buffer
, "for");
630 case OMP_CLAUSE_PARALLEL
:
631 pp_string (buffer
, "parallel");
633 case OMP_CLAUSE_SECTIONS
:
634 pp_string (buffer
, "sections");
636 case OMP_CLAUSE_TASKGROUP
:
637 pp_string (buffer
, "taskgroup");
641 /* Should never happen. */
642 dump_generic_node (buffer
, clause
, spc
, flags
, false);
648 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
649 dump_generic_node. */
652 dump_omp_clauses (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
660 dump_omp_clause (buffer
, clause
, spc
, flags
);
661 clause
= OMP_CLAUSE_CHAIN (clause
);
669 /* Dump location LOC to BUFFER. */
672 dump_location (pretty_printer
*buffer
, location_t loc
)
674 expanded_location xloc
= expand_location (loc
);
676 pp_left_bracket (buffer
);
679 pp_string (buffer
, xloc
.file
);
680 pp_string (buffer
, " : ");
682 pp_decimal_int (buffer
, xloc
.line
);
683 pp_string (buffer
, "] ");
687 /* Dump lexical block BLOCK. BUFFER, SPC and FLAGS are as in
688 dump_generic_node. */
691 dump_block_node (pretty_printer
*buffer
, tree block
, int spc
, int flags
)
695 pp_printf (buffer
, "BLOCK #%d ", BLOCK_NUMBER (block
));
697 if (flags
& TDF_ADDRESS
)
698 pp_printf (buffer
, "[%p] ", (void *) block
);
700 if (BLOCK_ABSTRACT (block
))
701 pp_string (buffer
, "[abstract] ");
703 if (TREE_ASM_WRITTEN (block
))
704 pp_string (buffer
, "[written] ");
706 if (flags
& TDF_SLIM
)
709 if (BLOCK_SOURCE_LOCATION (block
))
710 dump_location (buffer
, BLOCK_SOURCE_LOCATION (block
));
712 newline_and_indent (buffer
, spc
+ 2);
714 if (BLOCK_SUPERCONTEXT (block
))
716 pp_string (buffer
, "SUPERCONTEXT: ");
717 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (block
), 0,
718 flags
| TDF_SLIM
, false);
719 newline_and_indent (buffer
, spc
+ 2);
722 if (BLOCK_SUBBLOCKS (block
))
724 pp_string (buffer
, "SUBBLOCKS: ");
725 for (t
= BLOCK_SUBBLOCKS (block
); t
; t
= BLOCK_CHAIN (t
))
727 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
730 newline_and_indent (buffer
, spc
+ 2);
733 if (BLOCK_CHAIN (block
))
735 pp_string (buffer
, "SIBLINGS: ");
736 for (t
= BLOCK_CHAIN (block
); t
; t
= BLOCK_CHAIN (t
))
738 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
741 newline_and_indent (buffer
, spc
+ 2);
744 if (BLOCK_VARS (block
))
746 pp_string (buffer
, "VARS: ");
747 for (t
= BLOCK_VARS (block
); t
; t
= TREE_CHAIN (t
))
749 dump_generic_node (buffer
, t
, 0, flags
, false);
752 newline_and_indent (buffer
, spc
+ 2);
755 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block
)) > 0)
758 vec
<tree
, va_gc
> *nlv
= BLOCK_NONLOCALIZED_VARS (block
);
760 pp_string (buffer
, "NONLOCALIZED_VARS: ");
761 FOR_EACH_VEC_ELT (*nlv
, i
, t
)
763 dump_generic_node (buffer
, t
, 0, flags
, false);
766 newline_and_indent (buffer
, spc
+ 2);
769 if (BLOCK_ABSTRACT_ORIGIN (block
))
771 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
772 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (block
), 0,
773 flags
| TDF_SLIM
, false);
774 newline_and_indent (buffer
, spc
+ 2);
777 if (BLOCK_FRAGMENT_ORIGIN (block
))
779 pp_string (buffer
, "FRAGMENT_ORIGIN: ");
780 dump_generic_node (buffer
, BLOCK_FRAGMENT_ORIGIN (block
), 0,
781 flags
| TDF_SLIM
, false);
782 newline_and_indent (buffer
, spc
+ 2);
785 if (BLOCK_FRAGMENT_CHAIN (block
))
787 pp_string (buffer
, "FRAGMENT_CHAIN: ");
788 for (t
= BLOCK_FRAGMENT_CHAIN (block
); t
; t
= BLOCK_FRAGMENT_CHAIN (t
))
790 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
793 newline_and_indent (buffer
, spc
+ 2);
798 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
799 indent. FLAGS specifies details to show in the dump (see TDF_* in
800 dumpfile.h). If IS_STMT is true, the object printed is considered
801 to be a statement and it is terminated by ';' if appropriate. */
804 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
813 if (node
== NULL_TREE
)
816 is_expr
= EXPR_P (node
);
818 if (is_stmt
&& (flags
& TDF_STMTADDR
))
819 pp_printf (buffer
, "<&%p> ", (void *)node
);
821 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
822 dump_location (buffer
, EXPR_LOCATION (node
));
824 code
= TREE_CODE (node
);
828 pp_string (buffer
, "<<< error >>>");
831 case IDENTIFIER_NODE
:
832 pp_tree_identifier (buffer
, node
);
836 while (node
&& node
!= error_mark_node
)
838 if (TREE_PURPOSE (node
))
840 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
843 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
844 node
= TREE_CHAIN (node
);
845 if (node
&& TREE_CODE (node
) == TREE_LIST
)
854 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
860 if (TREE_VEC_LENGTH (node
) > 0)
862 size_t len
= TREE_VEC_LENGTH (node
);
863 for (i
= 0; i
< len
- 1; i
++)
865 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
870 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
879 case FIXED_POINT_TYPE
:
885 unsigned int quals
= TYPE_QUALS (node
);
886 enum tree_code_class tclass
;
888 if (quals
& TYPE_QUAL_ATOMIC
)
889 pp_string (buffer
, "atomic ");
890 if (quals
& TYPE_QUAL_CONST
)
891 pp_string (buffer
, "const ");
892 else if (quals
& TYPE_QUAL_VOLATILE
)
893 pp_string (buffer
, "volatile ");
894 else if (quals
& TYPE_QUAL_RESTRICT
)
895 pp_string (buffer
, "restrict ");
897 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
899 pp_string (buffer
, "<address-space-");
900 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
901 pp_string (buffer
, "> ");
904 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
906 if (tclass
== tcc_declaration
)
908 if (DECL_NAME (node
))
909 dump_decl_name (buffer
, node
, flags
);
911 pp_string (buffer
, "<unnamed type decl>");
913 else if (tclass
== tcc_type
)
915 if (TYPE_NAME (node
))
917 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
918 pp_tree_identifier (buffer
, TYPE_NAME (node
));
919 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
920 && DECL_NAME (TYPE_NAME (node
)))
921 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
923 pp_string (buffer
, "<unnamed type>");
925 else if (TREE_CODE (node
) == VECTOR_TYPE
)
927 pp_string (buffer
, "vector");
928 pp_left_paren (buffer
);
929 pp_wide_integer (buffer
, TYPE_VECTOR_SUBPARTS (node
));
930 pp_string (buffer
, ") ");
931 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
933 else if (TREE_CODE (node
) == INTEGER_TYPE
)
935 if (TYPE_PRECISION (node
) == CHAR_TYPE_SIZE
)
936 pp_string (buffer
, (TYPE_UNSIGNED (node
)
939 else if (TYPE_PRECISION (node
) == SHORT_TYPE_SIZE
)
940 pp_string (buffer
, (TYPE_UNSIGNED (node
)
943 else if (TYPE_PRECISION (node
) == INT_TYPE_SIZE
)
944 pp_string (buffer
, (TYPE_UNSIGNED (node
)
947 else if (TYPE_PRECISION (node
) == LONG_TYPE_SIZE
)
948 pp_string (buffer
, (TYPE_UNSIGNED (node
)
951 else if (TYPE_PRECISION (node
) == LONG_LONG_TYPE_SIZE
)
952 pp_string (buffer
, (TYPE_UNSIGNED (node
)
953 ? "unsigned long long"
954 : "signed long long"));
955 else if (TYPE_PRECISION (node
) >= CHAR_TYPE_SIZE
956 && exact_log2 (TYPE_PRECISION (node
)) != -1)
958 pp_string (buffer
, (TYPE_UNSIGNED (node
) ? "uint" : "int"));
959 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
960 pp_string (buffer
, "_t");
964 pp_string (buffer
, (TYPE_UNSIGNED (node
)
965 ? "<unnamed-unsigned:"
966 : "<unnamed-signed:"));
967 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
971 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
973 pp_string (buffer
, "__complex__ ");
974 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
976 else if (TREE_CODE (node
) == REAL_TYPE
)
978 pp_string (buffer
, "<float:");
979 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
982 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
984 pp_string (buffer
, "<fixed-point-");
985 pp_string (buffer
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
986 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
989 else if (TREE_CODE (node
) == VOID_TYPE
)
990 pp_string (buffer
, "void");
992 pp_string (buffer
, "<unnamed type>");
999 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
1001 if (TREE_TYPE (node
) == NULL
)
1003 pp_string (buffer
, str
);
1004 pp_string (buffer
, "<null type>");
1006 else if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
1008 tree fnode
= TREE_TYPE (node
);
1010 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
1012 pp_left_paren (buffer
);
1013 pp_string (buffer
, str
);
1014 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1015 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1016 else if (flags
& TDF_NOUID
)
1017 pp_printf (buffer
, "<Txxxx>");
1019 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1021 pp_right_paren (buffer
);
1022 dump_function_declaration (buffer
, fnode
, spc
, flags
);
1026 unsigned int quals
= TYPE_QUALS (node
);
1028 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1030 pp_string (buffer
, str
);
1032 if (quals
& TYPE_QUAL_CONST
)
1033 pp_string (buffer
, " const");
1034 if (quals
& TYPE_QUAL_VOLATILE
)
1035 pp_string (buffer
, " volatile");
1036 if (quals
& TYPE_QUAL_RESTRICT
)
1037 pp_string (buffer
, " restrict");
1039 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1041 pp_string (buffer
, " <address-space-");
1042 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
1043 pp_greater (buffer
);
1046 if (TYPE_REF_CAN_ALIAS_ALL (node
))
1047 pp_string (buffer
, " {ref-all}");
1057 if (integer_zerop (TREE_OPERAND (node
, 1))
1058 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1059 infer them and MEM_ATTR caching will share MEM_REFs
1060 with differently-typed op0s. */
1061 && TREE_CODE (TREE_OPERAND (node
, 0)) != INTEGER_CST
1062 /* Released SSA_NAMES have no TREE_TYPE. */
1063 && TREE_TYPE (TREE_OPERAND (node
, 0)) != NULL_TREE
1064 /* Same pointer types, but ignoring POINTER_TYPE vs.
1066 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1067 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1068 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1069 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1070 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 0)))
1071 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 1))))
1072 /* Same value types ignoring qualifiers. */
1073 && (TYPE_MAIN_VARIANT (TREE_TYPE (node
))
1074 == TYPE_MAIN_VARIANT
1075 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))))
1077 if (TREE_CODE (TREE_OPERAND (node
, 0)) != ADDR_EXPR
)
1080 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1084 dump_generic_node (buffer
,
1085 TREE_OPERAND (TREE_OPERAND (node
, 0), 0),
1092 pp_string (buffer
, "MEM[");
1093 pp_left_paren (buffer
);
1094 ptype
= TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node
, 1)));
1095 dump_generic_node (buffer
, ptype
,
1096 spc
, flags
| TDF_SLIM
, false);
1097 pp_right_paren (buffer
);
1098 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1100 if (!integer_zerop (TREE_OPERAND (node
, 1)))
1102 pp_string (buffer
, " + ");
1103 dump_generic_node (buffer
, TREE_OPERAND (node
, 1),
1106 pp_right_bracket (buffer
);
1111 case TARGET_MEM_REF
:
1113 const char *sep
= "";
1116 pp_string (buffer
, "MEM[");
1118 if (TREE_CODE (TMR_BASE (node
)) == ADDR_EXPR
)
1120 pp_string (buffer
, sep
);
1122 pp_string (buffer
, "symbol: ");
1123 dump_generic_node (buffer
, TREE_OPERAND (TMR_BASE (node
), 0),
1128 pp_string (buffer
, sep
);
1130 pp_string (buffer
, "base: ");
1131 dump_generic_node (buffer
, TMR_BASE (node
), spc
, flags
, false);
1133 tmp
= TMR_INDEX2 (node
);
1136 pp_string (buffer
, sep
);
1138 pp_string (buffer
, "base: ");
1139 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1141 tmp
= TMR_INDEX (node
);
1144 pp_string (buffer
, sep
);
1146 pp_string (buffer
, "index: ");
1147 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1149 tmp
= TMR_STEP (node
);
1152 pp_string (buffer
, sep
);
1154 pp_string (buffer
, "step: ");
1155 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1157 tmp
= TMR_OFFSET (node
);
1160 pp_string (buffer
, sep
);
1162 pp_string (buffer
, "offset: ");
1163 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1165 pp_right_bracket (buffer
);
1173 /* Print the innermost component type. */
1174 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
1175 tmp
= TREE_TYPE (tmp
))
1177 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1179 /* Print the dimensions. */
1180 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
1181 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
1187 case QUAL_UNION_TYPE
:
1189 unsigned int quals
= TYPE_QUALS (node
);
1191 if (quals
& TYPE_QUAL_ATOMIC
)
1192 pp_string (buffer
, "atomic ");
1193 if (quals
& TYPE_QUAL_CONST
)
1194 pp_string (buffer
, "const ");
1195 if (quals
& TYPE_QUAL_VOLATILE
)
1196 pp_string (buffer
, "volatile ");
1198 /* Print the name of the structure. */
1199 if (TREE_CODE (node
) == RECORD_TYPE
)
1200 pp_string (buffer
, "struct ");
1201 else if (TREE_CODE (node
) == UNION_TYPE
)
1202 pp_string (buffer
, "union ");
1204 if (TYPE_NAME (node
))
1205 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
1206 else if (!(flags
& TDF_SLIM
))
1207 /* FIXME: If we eliminate the 'else' above and attempt
1208 to show the fields for named types, we may get stuck
1209 following a cycle of pointers to structs. The alleged
1210 self-reference check in print_struct_decl will not detect
1211 cycles involving more than one pointer or struct type. */
1212 print_struct_decl (buffer
, node
, spc
, flags
);
1221 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
1223 /* In the case of a pointer, one may want to divide by the
1224 size of the pointed-to type. Unfortunately, this not
1225 straightforward. The C front-end maps expressions
1230 in such a way that the two INTEGER_CST nodes for "5" have
1231 different values but identical types. In the latter
1232 case, the 5 is multiplied by sizeof (int) in c-common.c
1233 (pointer_int_sum) to convert it to a byte address, and
1234 yet the type of the node is left unchanged. Argh. What
1235 is consistent though is that the number value corresponds
1236 to bytes (UNITS) offset.
1238 NB: Neither of the following divisors can be trivially
1239 used to recover the original literal:
1241 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1242 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1243 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
1244 pp_string (buffer
, "B"); /* pseudo-unit */
1246 else if (tree_fits_shwi_p (node
))
1247 pp_wide_integer (buffer
, tree_to_shwi (node
));
1248 else if (tree_fits_uhwi_p (node
))
1249 pp_unsigned_wide_integer (buffer
, tree_to_uhwi (node
));
1252 wide_int val
= node
;
1254 if (wi::neg_p (val
, TYPE_SIGN (TREE_TYPE (node
))))
1259 print_hex (val
, pp_buffer (buffer
)->digit_buffer
);
1260 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
1262 if (TREE_OVERFLOW (node
))
1263 pp_string (buffer
, "(OVF)");
1267 /* Code copied from print_node. */
1270 if (TREE_OVERFLOW (node
))
1271 pp_string (buffer
, " overflow");
1273 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
1274 d
= TREE_REAL_CST (node
);
1275 if (REAL_VALUE_ISINF (d
))
1276 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
1277 else if (REAL_VALUE_ISNAN (d
))
1278 pp_string (buffer
, " Nan");
1282 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
1283 pp_string (buffer
, string
);
1288 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
1289 pp_string (buffer
, "0x");
1290 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
1291 output_formatted_integer (buffer
, "%02x", *p
++);
1300 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
1301 pp_string (buffer
, string
);
1306 pp_string (buffer
, "__complex__ (");
1307 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
1308 pp_string (buffer
, ", ");
1309 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
1310 pp_right_paren (buffer
);
1314 pp_string (buffer
, "\"");
1315 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
1316 pp_string (buffer
, "\"");
1322 pp_string (buffer
, "{ ");
1323 for (i
= 0; i
< VECTOR_CST_NELTS (node
); ++i
)
1326 pp_string (buffer
, ", ");
1327 dump_generic_node (buffer
, VECTOR_CST_ELT (node
, i
),
1330 pp_string (buffer
, " }");
1336 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1338 if (TREE_CODE (node
) == METHOD_TYPE
)
1340 if (TYPE_METHOD_BASETYPE (node
))
1341 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
1344 pp_string (buffer
, "<null method basetype>");
1345 pp_colon_colon (buffer
);
1347 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1348 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1349 else if (flags
& TDF_NOUID
)
1350 pp_printf (buffer
, "<Txxxx>");
1352 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1353 dump_function_declaration (buffer
, node
, spc
, flags
);
1358 dump_decl_name (buffer
, node
, flags
);
1362 if (DECL_NAME (node
))
1363 dump_decl_name (buffer
, node
, flags
);
1364 else if (LABEL_DECL_UID (node
) != -1)
1365 pp_printf (buffer
, "<L%d>", (int) LABEL_DECL_UID (node
));
1368 if (flags
& TDF_NOUID
)
1369 pp_string (buffer
, "<D.xxxx>");
1371 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
1376 if (DECL_IS_BUILTIN (node
))
1378 /* Don't print the declaration of built-in types. */
1381 if (DECL_NAME (node
))
1382 dump_decl_name (buffer
, node
, flags
);
1383 else if (TYPE_NAME (TREE_TYPE (node
)) != node
)
1385 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1386 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1387 && TYPE_METHODS (TREE_TYPE (node
)))
1389 /* The type is a c++ class: all structures have at least
1391 pp_string (buffer
, "class ");
1392 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1397 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
1398 ? "union" : "struct "));
1399 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1403 pp_string (buffer
, "<anon>");
1409 case DEBUG_EXPR_DECL
:
1410 case NAMESPACE_DECL
:
1412 dump_decl_name (buffer
, node
, flags
);
1416 pp_string (buffer
, "<retval>");
1420 op0
= TREE_OPERAND (node
, 0);
1423 && (TREE_CODE (op0
) == INDIRECT_REF
1424 || (TREE_CODE (op0
) == MEM_REF
1425 && TREE_CODE (TREE_OPERAND (op0
, 0)) != ADDR_EXPR
1426 && integer_zerop (TREE_OPERAND (op0
, 1))
1427 /* Dump the types of INTEGER_CSTs explicitly, for we
1428 can't infer them and MEM_ATTR caching will share
1429 MEM_REFs with differently-typed op0s. */
1430 && TREE_CODE (TREE_OPERAND (op0
, 0)) != INTEGER_CST
1431 /* Released SSA_NAMES have no TREE_TYPE. */
1432 && TREE_TYPE (TREE_OPERAND (op0
, 0)) != NULL_TREE
1433 /* Same pointer types, but ignoring POINTER_TYPE vs.
1435 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1436 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1437 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1438 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1439 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1440 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1441 /* Same value types ignoring qualifiers. */
1442 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0
))
1443 == TYPE_MAIN_VARIANT
1444 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))))))
1446 op0
= TREE_OPERAND (op0
, 0);
1449 if (op_prio (op0
) < op_prio (node
))
1450 pp_left_paren (buffer
);
1451 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1452 if (op_prio (op0
) < op_prio (node
))
1453 pp_right_paren (buffer
);
1454 pp_string (buffer
, str
);
1455 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1456 op0
= component_ref_field_offset (node
);
1457 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
1459 pp_string (buffer
, "{off: ");
1460 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1461 pp_right_brace (buffer
);
1466 pp_string (buffer
, "BIT_FIELD_REF <");
1467 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1468 pp_string (buffer
, ", ");
1469 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1470 pp_string (buffer
, ", ");
1471 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1472 pp_greater (buffer
);
1476 case ARRAY_RANGE_REF
:
1477 op0
= TREE_OPERAND (node
, 0);
1478 if (op_prio (op0
) < op_prio (node
))
1479 pp_left_paren (buffer
);
1480 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1481 if (op_prio (op0
) < op_prio (node
))
1482 pp_right_paren (buffer
);
1483 pp_left_bracket (buffer
);
1484 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1485 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
1486 pp_string (buffer
, " ...");
1487 pp_right_bracket (buffer
);
1489 op0
= array_ref_low_bound (node
);
1490 op1
= array_ref_element_size (node
);
1492 if (!integer_zerop (op0
)
1493 || TREE_OPERAND (node
, 2)
1494 || TREE_OPERAND (node
, 3))
1496 pp_string (buffer
, "{lb: ");
1497 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1498 pp_string (buffer
, " sz: ");
1499 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1500 pp_right_brace (buffer
);
1506 unsigned HOST_WIDE_INT ix
;
1508 bool is_struct_init
= false;
1509 bool is_array_init
= false;
1511 pp_left_brace (buffer
);
1512 if (TREE_CLOBBER_P (node
))
1513 pp_string (buffer
, "CLOBBER");
1514 else if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1515 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1516 is_struct_init
= true;
1517 else if (TREE_CODE (TREE_TYPE (node
)) == ARRAY_TYPE
1518 && TYPE_DOMAIN (TREE_TYPE (node
))
1519 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)))
1520 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
))))
1523 tree minv
= TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)));
1524 is_array_init
= true;
1525 curidx
= wi::to_widest (minv
);
1527 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1534 dump_generic_node (buffer
, field
, spc
, flags
, false);
1537 else if (is_array_init
1538 && (TREE_CODE (field
) != INTEGER_CST
1539 || curidx
!= wi::to_widest (field
)))
1541 pp_left_bracket (buffer
);
1542 if (TREE_CODE (field
) == RANGE_EXPR
)
1544 dump_generic_node (buffer
, TREE_OPERAND (field
, 0), spc
,
1546 pp_string (buffer
, " ... ");
1547 dump_generic_node (buffer
, TREE_OPERAND (field
, 1), spc
,
1549 if (TREE_CODE (TREE_OPERAND (field
, 1)) == INTEGER_CST
)
1550 curidx
= wi::to_widest (TREE_OPERAND (field
, 1));
1553 dump_generic_node (buffer
, field
, spc
, flags
, false);
1554 if (TREE_CODE (field
) == INTEGER_CST
)
1555 curidx
= wi::to_widest (field
);
1556 pp_string (buffer
, "]=");
1561 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1562 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1563 val
= TREE_OPERAND (val
, 0);
1564 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1565 dump_decl_name (buffer
, val
, flags
);
1567 dump_generic_node (buffer
, val
, spc
, flags
, false);
1568 if (ix
!= vec_safe_length (CONSTRUCTOR_ELTS (node
)) - 1)
1574 pp_right_brace (buffer
);
1581 if (flags
& TDF_SLIM
)
1583 pp_string (buffer
, "<COMPOUND_EXPR>");
1587 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1588 spc
, flags
, !(flags
& TDF_SLIM
));
1589 if (flags
& TDF_SLIM
)
1590 newline_and_indent (buffer
, spc
);
1597 for (tp
= &TREE_OPERAND (node
, 1);
1598 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1599 tp
= &TREE_OPERAND (*tp
, 1))
1601 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1602 spc
, flags
, !(flags
& TDF_SLIM
));
1603 if (flags
& TDF_SLIM
)
1604 newline_and_indent (buffer
, spc
);
1612 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1616 case STATEMENT_LIST
:
1618 tree_stmt_iterator si
;
1621 if (flags
& TDF_SLIM
)
1623 pp_string (buffer
, "<STATEMENT_LIST>");
1627 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1630 newline_and_indent (buffer
, spc
);
1633 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1640 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
,
1645 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
,
1650 pp_string (buffer
, "TARGET_EXPR <");
1651 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1654 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1655 pp_greater (buffer
);
1659 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1664 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1666 pp_string (buffer
, "if (");
1667 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1668 pp_right_paren (buffer
);
1669 /* The lowered cond_exprs should always be printed in full. */
1670 if (COND_EXPR_THEN (node
)
1671 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1672 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1673 && COND_EXPR_ELSE (node
)
1674 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1675 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1678 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1680 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1682 pp_string (buffer
, " else ");
1683 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1687 else if (!(flags
& TDF_SLIM
))
1689 /* Output COND_EXPR_THEN. */
1690 if (COND_EXPR_THEN (node
))
1692 newline_and_indent (buffer
, spc
+2);
1693 pp_left_brace (buffer
);
1694 newline_and_indent (buffer
, spc
+4);
1695 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1697 newline_and_indent (buffer
, spc
+2);
1698 pp_right_brace (buffer
);
1701 /* Output COND_EXPR_ELSE. */
1702 if (COND_EXPR_ELSE (node
)
1703 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1705 newline_and_indent (buffer
, spc
);
1706 pp_string (buffer
, "else");
1707 newline_and_indent (buffer
, spc
+2);
1708 pp_left_brace (buffer
);
1709 newline_and_indent (buffer
, spc
+4);
1710 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1712 newline_and_indent (buffer
, spc
+2);
1713 pp_right_brace (buffer
);
1720 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1722 pp_question (buffer
);
1724 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1728 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1733 pp_left_brace (buffer
);
1734 if (!(flags
& TDF_SLIM
))
1736 if (BIND_EXPR_VARS (node
))
1738 pp_newline (buffer
);
1740 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= DECL_CHAIN (op0
))
1742 print_declaration (buffer
, op0
, spc
+2, flags
);
1743 pp_newline (buffer
);
1747 newline_and_indent (buffer
, spc
+2);
1748 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1749 newline_and_indent (buffer
, spc
);
1750 pp_right_brace (buffer
);
1756 print_call_name (buffer
, CALL_EXPR_FN (node
), flags
);
1758 /* Print parameters. */
1760 pp_left_paren (buffer
);
1763 call_expr_arg_iterator iter
;
1764 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1766 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1767 if (more_call_expr_args_p (&iter
))
1774 if (CALL_EXPR_VA_ARG_PACK (node
))
1776 if (call_expr_nargs (node
) > 0)
1781 pp_string (buffer
, "__builtin_va_arg_pack ()");
1783 pp_right_paren (buffer
);
1785 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1788 pp_string (buffer
, " [static-chain: ");
1789 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1790 pp_right_bracket (buffer
);
1793 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1794 pp_string (buffer
, " [return slot optimization]");
1795 if (CALL_EXPR_TAILCALL (node
))
1796 pp_string (buffer
, " [tail call]");
1799 case WITH_CLEANUP_EXPR
:
1803 case CLEANUP_POINT_EXPR
:
1804 pp_string (buffer
, "<<cleanup_point ");
1805 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1806 pp_string (buffer
, ">>");
1809 case PLACEHOLDER_EXPR
:
1810 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1811 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1812 pp_greater (buffer
);
1815 /* Binary arithmetic and logic expressions. */
1816 case WIDEN_SUM_EXPR
:
1817 case WIDEN_MULT_EXPR
:
1819 case MULT_HIGHPART_EXPR
:
1821 case POINTER_PLUS_EXPR
:
1823 case TRUNC_DIV_EXPR
:
1825 case FLOOR_DIV_EXPR
:
1826 case ROUND_DIV_EXPR
:
1827 case TRUNC_MOD_EXPR
:
1829 case FLOOR_MOD_EXPR
:
1830 case ROUND_MOD_EXPR
:
1832 case EXACT_DIV_EXPR
:
1837 case VEC_LSHIFT_EXPR
:
1838 case VEC_RSHIFT_EXPR
:
1839 case WIDEN_LSHIFT_EXPR
:
1843 case TRUTH_ANDIF_EXPR
:
1844 case TRUTH_ORIF_EXPR
:
1845 case TRUTH_AND_EXPR
:
1847 case TRUTH_XOR_EXPR
:
1861 case UNORDERED_EXPR
:
1863 const char *op
= op_symbol (node
);
1864 op0
= TREE_OPERAND (node
, 0);
1865 op1
= TREE_OPERAND (node
, 1);
1867 /* When the operands are expressions with less priority,
1868 keep semantics of the tree representation. */
1869 if (op_prio (op0
) <= op_prio (node
))
1871 pp_left_paren (buffer
);
1872 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1873 pp_right_paren (buffer
);
1876 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1879 pp_string (buffer
, op
);
1882 /* When the operands are expressions with less priority,
1883 keep semantics of the tree representation. */
1884 if (op_prio (op1
) <= op_prio (node
))
1886 pp_left_paren (buffer
);
1887 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1888 pp_right_paren (buffer
);
1891 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1895 /* Unary arithmetic and logic expressions. */
1898 case TRUTH_NOT_EXPR
:
1900 case PREDECREMENT_EXPR
:
1901 case PREINCREMENT_EXPR
:
1903 if (TREE_CODE (node
) == ADDR_EXPR
1904 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
1905 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
1906 ; /* Do not output '&' for strings and function pointers. */
1908 pp_string (buffer
, op_symbol (node
));
1910 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1912 pp_left_paren (buffer
);
1913 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1914 pp_right_paren (buffer
);
1917 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1920 case POSTDECREMENT_EXPR
:
1921 case POSTINCREMENT_EXPR
:
1922 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1924 pp_left_paren (buffer
);
1925 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1926 pp_right_paren (buffer
);
1929 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1930 pp_string (buffer
, op_symbol (node
));
1934 pp_string (buffer
, "MIN_EXPR <");
1935 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1936 pp_string (buffer
, ", ");
1937 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1938 pp_greater (buffer
);
1942 pp_string (buffer
, "MAX_EXPR <");
1943 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1944 pp_string (buffer
, ", ");
1945 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1946 pp_greater (buffer
);
1950 pp_string (buffer
, "ABS_EXPR <");
1951 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1952 pp_greater (buffer
);
1959 case ADDR_SPACE_CONVERT_EXPR
:
1960 case FIXED_CONVERT_EXPR
:
1961 case FIX_TRUNC_EXPR
:
1964 type
= TREE_TYPE (node
);
1965 op0
= TREE_OPERAND (node
, 0);
1966 if (type
!= TREE_TYPE (op0
))
1968 pp_left_paren (buffer
);
1969 dump_generic_node (buffer
, type
, spc
, flags
, false);
1970 pp_string (buffer
, ") ");
1972 if (op_prio (op0
) < op_prio (node
))
1973 pp_left_paren (buffer
);
1974 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1975 if (op_prio (op0
) < op_prio (node
))
1976 pp_right_paren (buffer
);
1979 case VIEW_CONVERT_EXPR
:
1980 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
1981 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1982 pp_string (buffer
, ">(");
1983 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1984 pp_right_paren (buffer
);
1988 pp_string (buffer
, "((");
1989 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1990 pp_string (buffer
, "))");
1993 case NON_LVALUE_EXPR
:
1994 pp_string (buffer
, "NON_LVALUE_EXPR <");
1995 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1996 pp_greater (buffer
);
2000 pp_string (buffer
, "SAVE_EXPR <");
2001 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2002 pp_greater (buffer
);
2006 pp_string (buffer
, "COMPLEX_EXPR <");
2007 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2008 pp_string (buffer
, ", ");
2009 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2010 pp_greater (buffer
);
2014 pp_string (buffer
, "CONJ_EXPR <");
2015 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2016 pp_greater (buffer
);
2020 pp_string (buffer
, "REALPART_EXPR <");
2021 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2022 pp_greater (buffer
);
2026 pp_string (buffer
, "IMAGPART_EXPR <");
2027 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2028 pp_greater (buffer
);
2032 pp_string (buffer
, "VA_ARG_EXPR <");
2033 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2034 pp_greater (buffer
);
2037 case TRY_FINALLY_EXPR
:
2038 case TRY_CATCH_EXPR
:
2039 pp_string (buffer
, "try");
2040 newline_and_indent (buffer
, spc
+2);
2041 pp_left_brace (buffer
);
2042 newline_and_indent (buffer
, spc
+4);
2043 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
2044 newline_and_indent (buffer
, spc
+2);
2045 pp_right_brace (buffer
);
2046 newline_and_indent (buffer
, spc
);
2048 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
2049 newline_and_indent (buffer
, spc
+2);
2050 pp_left_brace (buffer
);
2051 newline_and_indent (buffer
, spc
+4);
2052 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
2053 newline_and_indent (buffer
, spc
+2);
2054 pp_right_brace (buffer
);
2059 pp_string (buffer
, "catch (");
2060 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
2061 pp_right_paren (buffer
);
2062 newline_and_indent (buffer
, spc
+2);
2063 pp_left_brace (buffer
);
2064 newline_and_indent (buffer
, spc
+4);
2065 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
2066 newline_and_indent (buffer
, spc
+2);
2067 pp_right_brace (buffer
);
2071 case EH_FILTER_EXPR
:
2072 pp_string (buffer
, "<<<eh_filter (");
2073 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
2074 pp_string (buffer
, ")>>>");
2075 newline_and_indent (buffer
, spc
+2);
2076 pp_left_brace (buffer
);
2077 newline_and_indent (buffer
, spc
+4);
2078 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
2079 newline_and_indent (buffer
, spc
+2);
2080 pp_right_brace (buffer
);
2085 op0
= TREE_OPERAND (node
, 0);
2086 /* If this is for break or continue, don't bother printing it. */
2087 if (DECL_NAME (op0
))
2089 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2090 if (strcmp (name
, "break") == 0
2091 || strcmp (name
, "continue") == 0)
2094 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2096 if (DECL_NONLOCAL (op0
))
2097 pp_string (buffer
, " [non-local]");
2101 pp_string (buffer
, "while (1)");
2102 if (!(flags
& TDF_SLIM
))
2104 newline_and_indent (buffer
, spc
+2);
2105 pp_left_brace (buffer
);
2106 newline_and_indent (buffer
, spc
+4);
2107 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
2108 newline_and_indent (buffer
, spc
+2);
2109 pp_right_brace (buffer
);
2115 pp_string (buffer
, "// predicted ");
2116 if (PREDICT_EXPR_OUTCOME (node
))
2117 pp_string (buffer
, "likely by ");
2119 pp_string (buffer
, "unlikely by ");
2120 pp_string (buffer
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
2121 pp_string (buffer
, " predictor.");
2125 pp_string (buffer
, "ANNOTATE_EXPR <");
2126 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2127 switch ((enum annot_expr_kind
) TREE_INT_CST_LOW (TREE_OPERAND (node
, 1)))
2129 case annot_expr_ivdep_kind
:
2130 pp_string (buffer
, ", ivdep");
2132 case annot_expr_no_vector_kind
:
2133 pp_string (buffer
, ", no-vector");
2135 case annot_expr_vector_kind
:
2136 pp_string (buffer
, ", vector");
2141 pp_greater (buffer
);
2145 pp_string (buffer
, "return");
2146 op0
= TREE_OPERAND (node
, 0);
2150 if (TREE_CODE (op0
) == MODIFY_EXPR
)
2151 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1),
2154 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2159 pp_string (buffer
, "if (");
2160 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2161 pp_string (buffer
, ") break");
2165 pp_string (buffer
, "switch (");
2166 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
2167 pp_right_paren (buffer
);
2168 if (!(flags
& TDF_SLIM
))
2170 newline_and_indent (buffer
, spc
+2);
2171 pp_left_brace (buffer
);
2172 if (SWITCH_BODY (node
))
2174 newline_and_indent (buffer
, spc
+4);
2175 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
2180 tree vec
= SWITCH_LABELS (node
);
2181 size_t i
, n
= TREE_VEC_LENGTH (vec
);
2182 for (i
= 0; i
< n
; ++i
)
2184 tree elt
= TREE_VEC_ELT (vec
, i
);
2185 newline_and_indent (buffer
, spc
+4);
2188 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
2189 pp_string (buffer
, " goto ");
2190 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
2192 pp_semicolon (buffer
);
2195 pp_string (buffer
, "case ???: goto ???;");
2198 newline_and_indent (buffer
, spc
+2);
2199 pp_right_brace (buffer
);
2205 op0
= GOTO_DESTINATION (node
);
2206 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
2208 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2209 if (strcmp (name
, "break") == 0
2210 || strcmp (name
, "continue") == 0)
2212 pp_string (buffer
, name
);
2216 pp_string (buffer
, "goto ");
2217 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2221 pp_string (buffer
, "__asm__");
2222 if (ASM_VOLATILE_P (node
))
2223 pp_string (buffer
, " __volatile__");
2224 pp_left_paren (buffer
);
2225 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
2227 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
2229 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
2230 if (ASM_CLOBBERS (node
))
2233 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
2235 pp_right_paren (buffer
);
2238 case CASE_LABEL_EXPR
:
2239 if (CASE_LOW (node
) && CASE_HIGH (node
))
2241 pp_string (buffer
, "case ");
2242 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2243 pp_string (buffer
, " ... ");
2244 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
2246 else if (CASE_LOW (node
))
2248 pp_string (buffer
, "case ");
2249 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2252 pp_string (buffer
, "default");
2257 pp_string (buffer
, "OBJ_TYPE_REF(");
2258 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
2259 pp_semicolon (buffer
);
2260 if (!(flags
& TDF_SLIM
) && virtual_method_call_p (node
))
2262 pp_string (buffer
, "(");
2263 dump_generic_node (buffer
, obj_type_ref_class (node
), spc
, flags
, false);
2264 pp_string (buffer
, ")");
2266 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
2268 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
2269 pp_right_paren (buffer
);
2273 if (SSA_NAME_IDENTIFIER (node
))
2274 dump_generic_node (buffer
, SSA_NAME_IDENTIFIER (node
),
2276 pp_underscore (buffer
);
2277 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
2278 if (SSA_NAME_IS_DEFAULT_DEF (node
))
2279 pp_string (buffer
, "(D)");
2280 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
2281 pp_string (buffer
, "(ab)");
2284 case WITH_SIZE_EXPR
:
2285 pp_string (buffer
, "WITH_SIZE_EXPR <");
2286 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2287 pp_string (buffer
, ", ");
2288 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2289 pp_greater (buffer
);
2293 pp_string (buffer
, "ASSERT_EXPR <");
2294 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
2295 pp_string (buffer
, ", ");
2296 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
2297 pp_greater (buffer
);
2301 pp_string (buffer
, "scev_known");
2304 case SCEV_NOT_KNOWN
:
2305 pp_string (buffer
, "scev_not_known");
2308 case POLYNOMIAL_CHREC
:
2309 pp_left_brace (buffer
);
2310 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
2311 pp_string (buffer
, ", +, ");
2312 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
2313 pp_string (buffer
, "}_");
2314 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
2318 case REALIGN_LOAD_EXPR
:
2319 pp_string (buffer
, "REALIGN_LOAD <");
2320 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2321 pp_string (buffer
, ", ");
2322 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2323 pp_string (buffer
, ", ");
2324 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2325 pp_greater (buffer
);
2329 pp_string (buffer
, " VEC_COND_EXPR < ");
2330 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2331 pp_string (buffer
, " , ");
2332 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2333 pp_string (buffer
, " , ");
2334 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2335 pp_string (buffer
, " > ");
2339 pp_string (buffer
, " VEC_PERM_EXPR < ");
2340 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2341 pp_string (buffer
, " , ");
2342 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2343 pp_string (buffer
, " , ");
2344 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2345 pp_string (buffer
, " > ");
2349 pp_string (buffer
, " DOT_PROD_EXPR < ");
2350 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2351 pp_string (buffer
, ", ");
2352 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2353 pp_string (buffer
, ", ");
2354 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2355 pp_string (buffer
, " > ");
2358 case WIDEN_MULT_PLUS_EXPR
:
2359 pp_string (buffer
, " WIDEN_MULT_PLUS_EXPR < ");
2360 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2361 pp_string (buffer
, ", ");
2362 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2363 pp_string (buffer
, ", ");
2364 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2365 pp_string (buffer
, " > ");
2368 case WIDEN_MULT_MINUS_EXPR
:
2369 pp_string (buffer
, " WIDEN_MULT_MINUS_EXPR < ");
2370 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2371 pp_string (buffer
, ", ");
2372 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2373 pp_string (buffer
, ", ");
2374 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2375 pp_string (buffer
, " > ");
2379 pp_string (buffer
, " FMA_EXPR < ");
2380 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2381 pp_string (buffer
, ", ");
2382 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2383 pp_string (buffer
, ", ");
2384 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2385 pp_string (buffer
, " > ");
2389 pp_string (buffer
, "#pragma omp parallel");
2390 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
2393 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
2395 newline_and_indent (buffer
, spc
+ 2);
2396 pp_left_brace (buffer
);
2397 newline_and_indent (buffer
, spc
+ 4);
2398 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
2399 newline_and_indent (buffer
, spc
+ 2);
2400 pp_right_brace (buffer
);
2406 pp_string (buffer
, "#pragma omp task");
2407 dump_omp_clauses (buffer
, OMP_TASK_CLAUSES (node
), spc
, flags
);
2411 pp_string (buffer
, "#pragma omp for");
2415 pp_string (buffer
, "#pragma omp simd");
2419 pp_string (buffer
, "#pragma simd");
2422 case OMP_DISTRIBUTE
:
2423 pp_string (buffer
, "#pragma omp distribute");
2427 pp_string (buffer
, "#pragma omp teams");
2428 dump_omp_clauses (buffer
, OMP_TEAMS_CLAUSES (node
), spc
, flags
);
2431 case OMP_TARGET_DATA
:
2432 pp_string (buffer
, "#pragma omp target data");
2433 dump_omp_clauses (buffer
, OMP_TARGET_DATA_CLAUSES (node
), spc
, flags
);
2437 pp_string (buffer
, "#pragma omp target");
2438 dump_omp_clauses (buffer
, OMP_TARGET_CLAUSES (node
), spc
, flags
);
2441 case OMP_TARGET_UPDATE
:
2442 pp_string (buffer
, "#pragma omp target update");
2443 dump_omp_clauses (buffer
, OMP_TARGET_UPDATE_CLAUSES (node
), spc
, flags
);
2448 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2450 if (!(flags
& TDF_SLIM
))
2454 if (OMP_FOR_PRE_BODY (node
))
2456 newline_and_indent (buffer
, spc
+ 2);
2457 pp_left_brace (buffer
);
2459 newline_and_indent (buffer
, spc
);
2460 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
2463 if (OMP_FOR_INIT (node
))
2466 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
2469 newline_and_indent (buffer
, spc
);
2470 pp_string (buffer
, "for (");
2471 dump_generic_node (buffer
,
2472 TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
2474 pp_string (buffer
, "; ");
2475 dump_generic_node (buffer
,
2476 TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
2478 pp_string (buffer
, "; ");
2479 dump_generic_node (buffer
,
2480 TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
2482 pp_right_paren (buffer
);
2485 if (OMP_FOR_BODY (node
))
2487 newline_and_indent (buffer
, spc
+ 2);
2488 pp_left_brace (buffer
);
2489 newline_and_indent (buffer
, spc
+ 4);
2490 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
2492 newline_and_indent (buffer
, spc
+ 2);
2493 pp_right_brace (buffer
);
2495 if (OMP_FOR_INIT (node
))
2496 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
2497 if (OMP_FOR_PRE_BODY (node
))
2500 newline_and_indent (buffer
, spc
+ 2);
2501 pp_right_brace (buffer
);
2508 pp_string (buffer
, "#pragma omp sections");
2509 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
2513 pp_string (buffer
, "#pragma omp section");
2517 pp_string (buffer
, "#pragma omp master");
2521 pp_string (buffer
, "#pragma omp taskgroup");
2525 pp_string (buffer
, "#pragma omp ordered");
2529 pp_string (buffer
, "#pragma omp critical");
2530 if (OMP_CRITICAL_NAME (node
))
2533 pp_left_paren (buffer
);
2534 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
2536 pp_right_paren (buffer
);
2541 pp_string (buffer
, "#pragma omp atomic");
2542 if (OMP_ATOMIC_SEQ_CST (node
))
2543 pp_string (buffer
, " seq_cst");
2544 newline_and_indent (buffer
, spc
+ 2);
2545 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2549 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2552 case OMP_ATOMIC_READ
:
2553 pp_string (buffer
, "#pragma omp atomic read");
2554 if (OMP_ATOMIC_SEQ_CST (node
))
2555 pp_string (buffer
, " seq_cst");
2556 newline_and_indent (buffer
, spc
+ 2);
2557 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2561 case OMP_ATOMIC_CAPTURE_OLD
:
2562 case OMP_ATOMIC_CAPTURE_NEW
:
2563 pp_string (buffer
, "#pragma omp atomic capture");
2564 if (OMP_ATOMIC_SEQ_CST (node
))
2565 pp_string (buffer
, " seq_cst");
2566 newline_and_indent (buffer
, spc
+ 2);
2567 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2571 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2575 pp_string (buffer
, "#pragma omp single");
2576 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
2580 dump_omp_clause (buffer
, node
, spc
, flags
);
2584 case TRANSACTION_EXPR
:
2585 if (TRANSACTION_EXPR_OUTER (node
))
2586 pp_string (buffer
, "__transaction_atomic [[outer]]");
2587 else if (TRANSACTION_EXPR_RELAXED (node
))
2588 pp_string (buffer
, "__transaction_relaxed");
2590 pp_string (buffer
, "__transaction_atomic");
2591 if (!(flags
& TDF_SLIM
) && TRANSACTION_EXPR_BODY (node
))
2593 newline_and_indent (buffer
, spc
);
2594 pp_left_brace (buffer
);
2595 newline_and_indent (buffer
, spc
+ 2);
2596 dump_generic_node (buffer
, TRANSACTION_EXPR_BODY (node
),
2597 spc
+ 2, flags
, false);
2598 newline_and_indent (buffer
, spc
);
2599 pp_right_brace (buffer
);
2604 case REDUC_MAX_EXPR
:
2605 pp_string (buffer
, " REDUC_MAX_EXPR < ");
2606 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2607 pp_string (buffer
, " > ");
2610 case REDUC_MIN_EXPR
:
2611 pp_string (buffer
, " REDUC_MIN_EXPR < ");
2612 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2613 pp_string (buffer
, " > ");
2616 case REDUC_PLUS_EXPR
:
2617 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
2618 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2619 pp_string (buffer
, " > ");
2622 case VEC_WIDEN_MULT_HI_EXPR
:
2623 case VEC_WIDEN_MULT_LO_EXPR
:
2624 case VEC_WIDEN_MULT_EVEN_EXPR
:
2625 case VEC_WIDEN_MULT_ODD_EXPR
:
2626 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2627 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2629 for (str
= get_tree_code_name (code
); *str
; str
++)
2630 pp_character (buffer
, TOUPPER (*str
));
2631 pp_string (buffer
, " < ");
2632 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2633 pp_string (buffer
, ", ");
2634 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2635 pp_string (buffer
, " > ");
2638 case VEC_UNPACK_HI_EXPR
:
2639 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
2640 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2641 pp_string (buffer
, " > ");
2644 case VEC_UNPACK_LO_EXPR
:
2645 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
2646 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2647 pp_string (buffer
, " > ");
2650 case VEC_UNPACK_FLOAT_HI_EXPR
:
2651 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2652 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2653 pp_string (buffer
, " > ");
2656 case VEC_UNPACK_FLOAT_LO_EXPR
:
2657 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2658 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2659 pp_string (buffer
, " > ");
2662 case VEC_PACK_TRUNC_EXPR
:
2663 pp_string (buffer
, " VEC_PACK_TRUNC_EXPR < ");
2664 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2665 pp_string (buffer
, ", ");
2666 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2667 pp_string (buffer
, " > ");
2670 case VEC_PACK_SAT_EXPR
:
2671 pp_string (buffer
, " VEC_PACK_SAT_EXPR < ");
2672 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2673 pp_string (buffer
, ", ");
2674 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2675 pp_string (buffer
, " > ");
2678 case VEC_PACK_FIX_TRUNC_EXPR
:
2679 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2680 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2681 pp_string (buffer
, ", ");
2682 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2683 pp_string (buffer
, " > ");
2687 dump_block_node (buffer
, node
, spc
, flags
);
2690 case CILK_SPAWN_STMT
:
2691 pp_string (buffer
, "_Cilk_spawn ");
2692 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2695 case CILK_SYNC_STMT
:
2696 pp_string (buffer
, "_Cilk_sync");
2703 if (is_stmt
&& is_expr
)
2704 pp_semicolon (buffer
);
2709 /* Print the declaration of a variable. */
2712 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2716 if (TREE_CODE(t
) == NAMELIST_DECL
)
2718 pp_string(buffer
, "namelist ");
2719 dump_decl_name (buffer
, t
, flags
);
2720 pp_semicolon (buffer
);
2724 if (TREE_CODE (t
) == TYPE_DECL
)
2725 pp_string (buffer
, "typedef ");
2727 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2728 pp_string (buffer
, "register ");
2730 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2731 pp_string (buffer
, "extern ");
2732 else if (TREE_STATIC (t
))
2733 pp_string (buffer
, "static ");
2735 /* Print the type and name. */
2736 if (TREE_TYPE (t
) && TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2740 /* Print array's type. */
2741 tmp
= TREE_TYPE (t
);
2742 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2743 tmp
= TREE_TYPE (tmp
);
2744 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2746 /* Print variable's name. */
2748 dump_generic_node (buffer
, t
, spc
, flags
, false);
2750 /* Print the dimensions. */
2751 tmp
= TREE_TYPE (t
);
2752 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2754 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2755 tmp
= TREE_TYPE (tmp
);
2758 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2760 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2762 dump_decl_name (buffer
, t
, flags
);
2763 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2767 /* Print type declaration. */
2768 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2770 /* Print variable's name. */
2772 dump_generic_node (buffer
, t
, spc
, flags
, false);
2775 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2777 pp_string (buffer
, " __asm__ ");
2778 pp_left_paren (buffer
);
2779 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2780 pp_right_paren (buffer
);
2783 /* The initial value of a function serves to determine whether the function
2784 is declared or defined. So the following does not apply to function
2786 if (TREE_CODE (t
) != FUNCTION_DECL
)
2788 /* Print the initial value. */
2789 if (DECL_INITIAL (t
))
2794 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2798 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2800 pp_string (buffer
, " [value-expr: ");
2801 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2802 pp_right_bracket (buffer
);
2805 pp_semicolon (buffer
);
2809 /* Prints a structure: name, fields, and methods.
2810 FIXME: Still incomplete. */
2813 print_struct_decl (pretty_printer
*buffer
, const_tree node
, int spc
, int flags
)
2815 /* Print the name of the structure. */
2816 if (TYPE_NAME (node
))
2819 if (TREE_CODE (node
) == RECORD_TYPE
)
2820 pp_string (buffer
, "struct ");
2821 else if ((TREE_CODE (node
) == UNION_TYPE
2822 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
2823 pp_string (buffer
, "union ");
2825 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
2828 /* Print the contents of the structure. */
2829 pp_newline (buffer
);
2831 pp_left_brace (buffer
);
2832 pp_newline (buffer
);
2834 /* Print the fields of the structure. */
2837 tmp
= TYPE_FIELDS (node
);
2840 /* Avoid to print recursively the structure. */
2841 /* FIXME : Not implemented correctly...,
2842 what about the case when we have a cycle in the contain graph? ...
2843 Maybe this could be solved by looking at the scope in which the
2844 structure was declared. */
2845 if (TREE_TYPE (tmp
) != node
2846 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
2847 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
2849 print_declaration (buffer
, tmp
, spc
+2, flags
);
2850 pp_newline (buffer
);
2852 tmp
= DECL_CHAIN (tmp
);
2856 pp_right_brace (buffer
);
2859 /* Return the priority of the operator CODE.
2861 From lowest to highest precedence with either left-to-right (L-R)
2862 or right-to-left (R-L) associativity]:
2865 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2877 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2878 15 [L-R] fn() [] -> .
2880 unary +, - and * have higher precedence than the corresponding binary
2884 op_code_prio (enum tree_code code
)
2901 case TRUTH_ORIF_EXPR
:
2904 case TRUTH_AND_EXPR
:
2905 case TRUTH_ANDIF_EXPR
:
2912 case TRUTH_XOR_EXPR
:
2929 case UNORDERED_EXPR
:
2940 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2941 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2942 case WIDEN_LSHIFT_EXPR
:
2945 case WIDEN_SUM_EXPR
:
2947 case POINTER_PLUS_EXPR
:
2951 case VEC_WIDEN_MULT_HI_EXPR
:
2952 case VEC_WIDEN_MULT_LO_EXPR
:
2953 case WIDEN_MULT_EXPR
:
2955 case WIDEN_MULT_PLUS_EXPR
:
2956 case WIDEN_MULT_MINUS_EXPR
:
2958 case MULT_HIGHPART_EXPR
:
2959 case TRUNC_DIV_EXPR
:
2961 case FLOOR_DIV_EXPR
:
2962 case ROUND_DIV_EXPR
:
2964 case EXACT_DIV_EXPR
:
2965 case TRUNC_MOD_EXPR
:
2967 case FLOOR_MOD_EXPR
:
2968 case ROUND_MOD_EXPR
:
2972 case TRUTH_NOT_EXPR
:
2974 case POSTINCREMENT_EXPR
:
2975 case POSTDECREMENT_EXPR
:
2976 case PREINCREMENT_EXPR
:
2977 case PREDECREMENT_EXPR
:
2983 case FIX_TRUNC_EXPR
:
2989 case ARRAY_RANGE_REF
:
2993 /* Special expressions. */
2999 case REDUC_MAX_EXPR
:
3000 case REDUC_MIN_EXPR
:
3001 case REDUC_PLUS_EXPR
:
3002 case VEC_LSHIFT_EXPR
:
3003 case VEC_RSHIFT_EXPR
:
3004 case VEC_UNPACK_HI_EXPR
:
3005 case VEC_UNPACK_LO_EXPR
:
3006 case VEC_UNPACK_FLOAT_HI_EXPR
:
3007 case VEC_UNPACK_FLOAT_LO_EXPR
:
3008 case VEC_PACK_TRUNC_EXPR
:
3009 case VEC_PACK_SAT_EXPR
:
3013 /* Return an arbitrarily high precedence to avoid surrounding single
3014 VAR_DECLs in ()s. */
3019 /* Return the priority of the operator OP. */
3022 op_prio (const_tree op
)
3024 enum tree_code code
;
3029 code
= TREE_CODE (op
);
3030 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
3031 return op_prio (TREE_OPERAND (op
, 0));
3033 return op_code_prio (code
);
3036 /* Return the symbol associated with operator CODE. */
3039 op_symbol_code (enum tree_code code
)
3047 case TRUTH_ORIF_EXPR
:
3050 case TRUTH_AND_EXPR
:
3051 case TRUTH_ANDIF_EXPR
:
3057 case TRUTH_XOR_EXPR
:
3067 case UNORDERED_EXPR
:
3113 case VEC_LSHIFT_EXPR
:
3116 case VEC_RSHIFT_EXPR
:
3119 case WIDEN_LSHIFT_EXPR
:
3122 case POINTER_PLUS_EXPR
:
3128 case REDUC_PLUS_EXPR
:
3131 case WIDEN_SUM_EXPR
:
3134 case WIDEN_MULT_EXPR
:
3137 case MULT_HIGHPART_EXPR
:
3147 case TRUTH_NOT_EXPR
:
3154 case TRUNC_DIV_EXPR
:
3161 case FLOOR_DIV_EXPR
:
3164 case ROUND_DIV_EXPR
:
3167 case EXACT_DIV_EXPR
:
3170 case TRUNC_MOD_EXPR
:
3176 case FLOOR_MOD_EXPR
:
3179 case ROUND_MOD_EXPR
:
3182 case PREDECREMENT_EXPR
:
3185 case PREINCREMENT_EXPR
:
3188 case POSTDECREMENT_EXPR
:
3191 case POSTINCREMENT_EXPR
:
3201 return "<<< ??? >>>";
3205 /* Return the symbol associated with operator OP. */
3208 op_symbol (const_tree op
)
3210 return op_symbol_code (TREE_CODE (op
));
3213 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
3214 the gimple_call_fn of a GIMPLE_CALL. */
3217 print_call_name (pretty_printer
*buffer
, tree node
, int flags
)
3221 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
3222 op0
= TREE_OPERAND (op0
, 0);
3225 switch (TREE_CODE (op0
))
3230 dump_function_name (buffer
, op0
, flags
);
3236 op0
= TREE_OPERAND (op0
, 0);
3240 pp_left_paren (buffer
);
3241 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, flags
, false);
3242 pp_string (buffer
, ") ? ");
3243 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, flags
, false);
3244 pp_string (buffer
, " : ");
3245 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, flags
, false);
3249 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
3250 dump_function_name (buffer
, TREE_OPERAND (op0
, 0), flags
);
3252 dump_generic_node (buffer
, op0
, 0, flags
, false);
3256 if (integer_zerop (TREE_OPERAND (op0
, 1)))
3258 op0
= TREE_OPERAND (op0
, 0);
3265 dump_generic_node (buffer
, op0
, 0, flags
, false);
3273 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
3276 pretty_print_string (pretty_printer
*buffer
, const char *str
)
3286 pp_string (buffer
, "\\b");
3290 pp_string (buffer
, "\\f");
3294 pp_string (buffer
, "\\n");
3298 pp_string (buffer
, "\\r");
3302 pp_string (buffer
, "\\t");
3306 pp_string (buffer
, "\\v");
3310 pp_string (buffer
, "\\\\");
3314 pp_string (buffer
, "\\\"");
3318 pp_string (buffer
, "\\'");
3321 /* No need to handle \0; the loop terminates on \0. */
3324 pp_string (buffer
, "\\1");
3328 pp_string (buffer
, "\\2");
3332 pp_string (buffer
, "\\3");
3336 pp_string (buffer
, "\\4");
3340 pp_string (buffer
, "\\5");
3344 pp_string (buffer
, "\\6");
3348 pp_string (buffer
, "\\7");
3352 pp_character (buffer
, str
[0]);
3360 maybe_init_pretty_print (FILE *file
)
3364 new (&buffer
) pretty_printer ();
3365 pp_needs_newline (&buffer
) = true;
3366 pp_translate_identifiers (&buffer
) = false;
3370 buffer
.buffer
->stream
= file
;
3374 newline_and_indent (pretty_printer
*buffer
, int spc
)
3376 pp_newline (buffer
);
3380 /* Handle a %K format for TEXT. Separate from default_tree_printer so
3381 it can also be used in front ends.
3382 %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
3386 percent_K_format (text_info
*text
)
3388 tree t
= va_arg (*text
->args_ptr
, tree
), block
;
3389 gcc_assert (text
->locus
!= NULL
);
3390 *text
->locus
= EXPR_LOCATION (t
);
3391 gcc_assert (pp_ti_abstract_origin (text
) != NULL
);
3392 block
= TREE_BLOCK (t
);
3393 *pp_ti_abstract_origin (text
) = NULL
;
3397 /* ??? LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those
3398 representing the outermost block of an inlined function.
3399 So walk the BLOCK tree until we hit such a scope. */
3401 && TREE_CODE (block
) == BLOCK
)
3403 if (inlined_function_outer_scope_p (block
))
3405 *pp_ti_abstract_origin (text
) = block
;
3408 block
= BLOCK_SUPERCONTEXT (block
);
3414 && TREE_CODE (block
) == BLOCK
3415 && BLOCK_ABSTRACT_ORIGIN (block
))
3417 tree ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3419 while (TREE_CODE (ao
) == BLOCK
3420 && BLOCK_ABSTRACT_ORIGIN (ao
)
3421 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3422 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3424 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3426 *pp_ti_abstract_origin (text
) = block
;
3429 block
= BLOCK_SUPERCONTEXT (block
);
3433 /* Print the identifier ID to PRETTY-PRINTER. */
3436 pp_tree_identifier (pretty_printer
*pp
, tree id
)
3438 if (pp_translate_identifiers (pp
))
3440 const char *text
= identifier_to_locale (IDENTIFIER_POINTER (id
));
3441 pp_append_text (pp
, text
, text
+ strlen (text
));
3444 pp_append_text (pp
, IDENTIFIER_POINTER (id
),
3445 IDENTIFIER_POINTER (id
) + IDENTIFIER_LENGTH (id
));
3448 /* A helper function that is used to dump function information before the
3452 dump_function_header (FILE *dump_file
, tree fdecl
, int flags
)
3454 const char *dname
, *aname
;
3455 struct cgraph_node
*node
= cgraph_get_node (fdecl
);
3456 struct function
*fun
= DECL_STRUCT_FUNCTION (fdecl
);
3458 dname
= lang_hooks
.decl_printable_name (fdecl
, 2);
3460 if (DECL_ASSEMBLER_NAME_SET_P (fdecl
))
3461 aname
= (IDENTIFIER_POINTER
3462 (DECL_ASSEMBLER_NAME (fdecl
)));
3464 aname
= "<unset-asm-name>";
3466 fprintf (dump_file
, "\n;; Function %s (%s, funcdef_no=%d",
3467 dname
, aname
, fun
->funcdef_no
);
3468 if (!(flags
& TDF_NOUID
))
3469 fprintf (dump_file
, ", decl_uid=%d", DECL_UID (fdecl
));
3472 fprintf (dump_file
, ", cgraph_uid=%d", node
->uid
);
3473 fprintf (dump_file
, ", symbol_order=%d)%s\n\n", node
->order
,
3474 node
->frequency
== NODE_FREQUENCY_HOT
3476 : node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
3477 ? " (unlikely executed)"
3478 : node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
3479 ? " (executed once)"
3483 fprintf (dump_file
, ")\n\n");
3486 /* Dump double_int D to pretty_printer PP. UNS is true
3487 if D is unsigned and false otherwise. */
3489 pp_double_int (pretty_printer
*pp
, double_int d
, bool uns
)
3492 pp_wide_integer (pp
, d
.low
);
3493 else if (d
.fits_uhwi ())
3494 pp_unsigned_wide_integer (pp
, d
.low
);
3497 unsigned HOST_WIDE_INT low
= d
.low
;
3498 HOST_WIDE_INT high
= d
.high
;
3499 if (!uns
&& d
.is_negative ())
3502 high
= ~high
+ !low
;
3505 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
3507 sprintf (pp_buffer (pp
)->digit_buffer
,
3508 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
3509 (unsigned HOST_WIDE_INT
) high
, low
);
3510 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);