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"
31 #include "gimple-expr.h"
35 #include "plugin-api.h"
38 #include "hard-reg-set.h"
43 #include "langhooks.h"
44 #include "tree-iterator.h"
45 #include "tree-chrec.h"
47 #include "value-prof.h"
48 #include "wide-int-print.h"
49 #include "internal-fn.h"
51 /* Local functions, macros and variables. */
52 static const char *op_symbol (const_tree
);
53 static void pretty_print_string (pretty_printer
*, const char*);
54 static void newline_and_indent (pretty_printer
*, int);
55 static void maybe_init_pretty_print (FILE *);
56 static void print_struct_decl (pretty_printer
*, const_tree
, int, int);
57 static void do_niy (pretty_printer
*, const_tree
);
59 #define INDENT(SPACE) do { \
60 int i; for (i = 0; i<SPACE; i++) pp_space (pp); } while (0)
62 #define NIY do_niy (pp, node)
64 static pretty_printer
*tree_pp
;
66 /* Try to print something for an unknown tree code. */
69 do_niy (pretty_printer
*pp
, const_tree node
)
73 pp_string (pp
, "<<< Unknown tree: ");
74 pp_string (pp
, get_tree_code_name (TREE_CODE (node
)));
78 len
= TREE_OPERAND_LENGTH (node
);
79 for (i
= 0; i
< len
; ++i
)
81 newline_and_indent (pp
, 2);
82 dump_generic_node (pp
, TREE_OPERAND (node
, i
), 2, 0, false);
86 pp_string (pp
, " >>>");
89 /* Debugging function to print out a generic expression. */
92 debug_generic_expr (tree t
)
94 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
95 fprintf (stderr
, "\n");
98 /* Debugging function to print out a generic statement. */
101 debug_generic_stmt (tree t
)
103 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
104 fprintf (stderr
, "\n");
107 /* Debugging function to print out a chain of trees . */
110 debug_tree_chain (tree t
)
116 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
117 fprintf (stderr
, " ");
121 fprintf (stderr
, "... [cycled back to ");
122 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
123 fprintf (stderr
, "]");
127 fprintf (stderr
, "\n");
130 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
132 print_generic_decl (FILE *file
, tree decl
, int flags
)
134 maybe_init_pretty_print (file
);
135 print_declaration (tree_pp
, decl
, 2, flags
);
136 pp_write_text_to_stream (tree_pp
);
139 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
140 to show in the dump. See TDF_* in dumpfile.h. */
143 print_generic_stmt (FILE *file
, tree t
, int flags
)
145 maybe_init_pretty_print (file
);
146 dump_generic_node (tree_pp
, t
, 0, flags
, true);
147 pp_newline_and_flush (tree_pp
);
150 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
151 to show in the dump. See TDF_* in dumpfile.h. The output is indented by
155 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
159 maybe_init_pretty_print (file
);
161 for (i
= 0; i
< indent
; i
++)
163 dump_generic_node (tree_pp
, t
, indent
, flags
, true);
164 pp_newline_and_flush (tree_pp
);
167 /* Print a single expression T on file FILE. FLAGS specifies details to show
168 in the dump. See TDF_* in dumpfile.h. */
171 print_generic_expr (FILE *file
, tree t
, int flags
)
173 maybe_init_pretty_print (file
);
174 dump_generic_node (tree_pp
, t
, 0, flags
, false);
178 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
182 dump_decl_name (pretty_printer
*pp
, tree node
, int flags
)
184 if (DECL_NAME (node
))
186 if ((flags
& TDF_ASMNAME
) && DECL_ASSEMBLER_NAME_SET_P (node
))
187 pp_tree_identifier (pp
, DECL_ASSEMBLER_NAME (node
));
189 pp_tree_identifier (pp
, DECL_NAME (node
));
191 if ((flags
& TDF_UID
) || DECL_NAME (node
) == NULL_TREE
)
193 if (TREE_CODE (node
) == LABEL_DECL
&& LABEL_DECL_UID (node
) != -1)
194 pp_printf (pp
, "L.%d", (int) LABEL_DECL_UID (node
));
195 else if (TREE_CODE (node
) == DEBUG_EXPR_DECL
)
197 if (flags
& TDF_NOUID
)
198 pp_string (pp
, "D#xxxx");
200 pp_printf (pp
, "D#%i", DEBUG_TEMP_UID (node
));
204 char c
= TREE_CODE (node
) == CONST_DECL
? 'C' : 'D';
205 if (flags
& TDF_NOUID
)
206 pp_printf (pp
, "%c.xxxx", c
);
208 pp_printf (pp
, "%c.%u", c
, DECL_UID (node
));
211 if ((flags
& TDF_ALIAS
) && DECL_PT_UID (node
) != DECL_UID (node
))
213 if (flags
& TDF_NOUID
)
214 pp_printf (pp
, "ptD.xxxx");
216 pp_printf (pp
, "ptD.%u", DECL_PT_UID (node
));
220 /* Like the above, but used for pretty printing function calls. */
223 dump_function_name (pretty_printer
*pp
, tree node
, int flags
)
225 if (CONVERT_EXPR_P (node
))
226 node
= TREE_OPERAND (node
, 0);
227 if (DECL_NAME (node
) && (flags
& TDF_ASMNAME
) == 0)
228 pp_string (pp
, lang_hooks
.decl_printable_name (node
, 1));
230 dump_decl_name (pp
, node
, flags
);
233 /* Dump a function declaration. NODE is the FUNCTION_TYPE. PP, SPC and
234 FLAGS are as in dump_generic_node. */
237 dump_function_declaration (pretty_printer
*pp
, tree node
,
240 bool wrote_arg
= false;
246 /* Print the argument types. */
247 arg
= TYPE_ARG_TYPES (node
);
248 while (arg
&& arg
!= void_list_node
&& arg
!= error_mark_node
)
256 dump_generic_node (pp
, TREE_VALUE (arg
), spc
, flags
, false);
257 arg
= TREE_CHAIN (arg
);
260 /* Drop the trailing void_type_node if we had any previous argument. */
261 if (arg
== void_list_node
&& !wrote_arg
)
262 pp_string (pp
, "void");
263 /* Properly dump vararg function types. */
264 else if (!arg
&& wrote_arg
)
265 pp_string (pp
, ", ...");
266 /* Avoid printing any arg for unprototyped functions. */
271 /* Dump the domain associated with an array. */
274 dump_array_domain (pretty_printer
*pp
, tree domain
, int spc
, int flags
)
276 pp_left_bracket (pp
);
279 tree min
= TYPE_MIN_VALUE (domain
);
280 tree max
= TYPE_MAX_VALUE (domain
);
283 && integer_zerop (min
)
284 && tree_fits_shwi_p (max
))
285 pp_wide_integer (pp
, tree_to_shwi (max
) + 1);
289 dump_generic_node (pp
, min
, spc
, flags
, false);
292 dump_generic_node (pp
, max
, spc
, flags
, false);
296 pp_string (pp
, "<unknown>");
297 pp_right_bracket (pp
);
301 /* Dump OpenMP clause CLAUSE. PP, CLAUSE, SPC and FLAGS are as in
302 dump_generic_node. */
305 dump_omp_clause (pretty_printer
*pp
, tree clause
, int spc
, int flags
)
309 switch (OMP_CLAUSE_CODE (clause
))
311 case OMP_CLAUSE_PRIVATE
:
314 case OMP_CLAUSE_SHARED
:
317 case OMP_CLAUSE_FIRSTPRIVATE
:
318 name
= "firstprivate";
320 case OMP_CLAUSE_LASTPRIVATE
:
321 name
= "lastprivate";
323 case OMP_CLAUSE_COPYIN
:
326 case OMP_CLAUSE_COPYPRIVATE
:
327 name
= "copyprivate";
329 case OMP_CLAUSE_UNIFORM
:
332 case OMP_CLAUSE__LOOPTEMP_
:
335 case OMP_CLAUSE_DEVICE_RESIDENT
:
336 name
= "device_resident";
338 case OMP_CLAUSE_USE_DEVICE
:
342 pp_string (pp
, name
);
344 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
349 case OMP_CLAUSE_REDUCTION
:
350 pp_string (pp
, "reduction(");
351 if (OMP_CLAUSE_REDUCTION_CODE (clause
) != ERROR_MARK
)
354 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
357 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
363 pp_string (pp
, "if(");
364 dump_generic_node (pp
, OMP_CLAUSE_IF_EXPR (clause
),
369 case OMP_CLAUSE_NUM_THREADS
:
370 pp_string (pp
, "num_threads(");
371 dump_generic_node (pp
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
376 case OMP_CLAUSE__CILK_FOR_COUNT_
:
377 pp_string (pp
, "_Cilk_for_count_(");
378 dump_generic_node (pp
, OMP_CLAUSE_OPERAND (clause
, 0),
383 case OMP_CLAUSE_NOWAIT
:
384 pp_string (pp
, "nowait");
386 case OMP_CLAUSE_ORDERED
:
387 pp_string (pp
, "ordered");
390 case OMP_CLAUSE_DEFAULT
:
391 pp_string (pp
, "default(");
392 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
394 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
396 case OMP_CLAUSE_DEFAULT_SHARED
:
397 pp_string (pp
, "shared");
399 case OMP_CLAUSE_DEFAULT_NONE
:
400 pp_string (pp
, "none");
402 case OMP_CLAUSE_DEFAULT_PRIVATE
:
403 pp_string (pp
, "private");
405 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
406 pp_string (pp
, "firstprivate");
414 case OMP_CLAUSE_SCHEDULE
:
415 pp_string (pp
, "schedule(");
416 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
418 case OMP_CLAUSE_SCHEDULE_STATIC
:
419 pp_string (pp
, "static");
421 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
422 pp_string (pp
, "dynamic");
424 case OMP_CLAUSE_SCHEDULE_GUIDED
:
425 pp_string (pp
, "guided");
427 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
428 pp_string (pp
, "runtime");
430 case OMP_CLAUSE_SCHEDULE_AUTO
:
431 pp_string (pp
, "auto");
433 case OMP_CLAUSE_SCHEDULE_CILKFOR
:
434 pp_string (pp
, "cilk-for grain");
439 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
442 dump_generic_node (pp
, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
448 case OMP_CLAUSE_UNTIED
:
449 pp_string (pp
, "untied");
452 case OMP_CLAUSE_COLLAPSE
:
453 pp_string (pp
, "collapse(");
454 dump_generic_node (pp
, OMP_CLAUSE_COLLAPSE_EXPR (clause
),
459 case OMP_CLAUSE_FINAL
:
460 pp_string (pp
, "final(");
461 dump_generic_node (pp
, OMP_CLAUSE_FINAL_EXPR (clause
),
466 case OMP_CLAUSE_MERGEABLE
:
467 pp_string (pp
, "mergeable");
470 case OMP_CLAUSE_LINEAR
:
471 pp_string (pp
, "linear(");
472 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
475 dump_generic_node (pp
, OMP_CLAUSE_LINEAR_STEP (clause
),
480 case OMP_CLAUSE_ALIGNED
:
481 pp_string (pp
, "aligned(");
482 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
484 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
))
487 dump_generic_node (pp
, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
),
493 case OMP_CLAUSE_DEPEND
:
494 pp_string (pp
, "depend(");
495 switch (OMP_CLAUSE_DEPEND_KIND (clause
))
497 case OMP_CLAUSE_DEPEND_IN
:
498 pp_string (pp
, "in");
500 case OMP_CLAUSE_DEPEND_OUT
:
501 pp_string (pp
, "out");
503 case OMP_CLAUSE_DEPEND_INOUT
:
504 pp_string (pp
, "inout");
510 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
516 pp_string (pp
, "map(");
517 switch (OMP_CLAUSE_MAP_KIND (clause
))
519 case OMP_CLAUSE_MAP_ALLOC
:
520 case OMP_CLAUSE_MAP_POINTER
:
521 pp_string (pp
, "alloc");
523 case OMP_CLAUSE_MAP_TO
:
524 case OMP_CLAUSE_MAP_TO_PSET
:
525 pp_string (pp
, "to");
527 case OMP_CLAUSE_MAP_FROM
:
528 pp_string (pp
, "from");
530 case OMP_CLAUSE_MAP_TOFROM
:
531 pp_string (pp
, "tofrom");
533 case OMP_CLAUSE_MAP_FORCE_ALLOC
:
534 pp_string (pp
, "force_alloc");
536 case OMP_CLAUSE_MAP_FORCE_TO
:
537 pp_string (pp
, "force_to");
539 case OMP_CLAUSE_MAP_FORCE_FROM
:
540 pp_string (pp
, "force_from");
542 case OMP_CLAUSE_MAP_FORCE_TOFROM
:
543 pp_string (pp
, "force_tofrom");
545 case OMP_CLAUSE_MAP_FORCE_PRESENT
:
546 pp_string (pp
, "force_present");
548 case OMP_CLAUSE_MAP_FORCE_DEALLOC
:
549 pp_string (pp
, "force_dealloc");
551 case OMP_CLAUSE_MAP_FORCE_DEVICEPTR
:
552 pp_string (pp
, "force_deviceptr");
558 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
561 if (OMP_CLAUSE_SIZE (clause
))
563 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
564 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_POINTER
)
565 pp_string (pp
, " [pointer assign, bias: ");
566 else if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
567 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_TO_PSET
)
568 pp_string (pp
, " [pointer set, len: ");
570 pp_string (pp
, " [len: ");
571 dump_generic_node (pp
, OMP_CLAUSE_SIZE (clause
),
573 pp_right_bracket (pp
);
578 case OMP_CLAUSE_FROM
:
579 pp_string (pp
, "from(");
580 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
582 goto print_clause_size
;
585 pp_string (pp
, "to(");
586 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
588 goto print_clause_size
;
590 case OMP_CLAUSE__CACHE_
:
592 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
594 goto print_clause_size
;
596 case OMP_CLAUSE_NUM_TEAMS
:
597 pp_string (pp
, "num_teams(");
598 dump_generic_node (pp
, OMP_CLAUSE_NUM_TEAMS_EXPR (clause
),
603 case OMP_CLAUSE_THREAD_LIMIT
:
604 pp_string (pp
, "thread_limit(");
605 dump_generic_node (pp
, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause
),
610 case OMP_CLAUSE_DEVICE
:
611 pp_string (pp
, "device(");
612 dump_generic_node (pp
, OMP_CLAUSE_DEVICE_ID (clause
),
617 case OMP_CLAUSE_DIST_SCHEDULE
:
618 pp_string (pp
, "dist_schedule(static");
619 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
))
622 dump_generic_node (pp
,
623 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
),
629 case OMP_CLAUSE_PROC_BIND
:
630 pp_string (pp
, "proc_bind(");
631 switch (OMP_CLAUSE_PROC_BIND_KIND (clause
))
633 case OMP_CLAUSE_PROC_BIND_MASTER
:
634 pp_string (pp
, "master");
636 case OMP_CLAUSE_PROC_BIND_CLOSE
:
637 pp_string (pp
, "close");
639 case OMP_CLAUSE_PROC_BIND_SPREAD
:
640 pp_string (pp
, "spread");
648 case OMP_CLAUSE_SAFELEN
:
649 pp_string (pp
, "safelen(");
650 dump_generic_node (pp
, OMP_CLAUSE_SAFELEN_EXPR (clause
),
655 case OMP_CLAUSE_SIMDLEN
:
656 pp_string (pp
, "simdlen(");
657 dump_generic_node (pp
, OMP_CLAUSE_SIMDLEN_EXPR (clause
),
662 case OMP_CLAUSE__SIMDUID_
:
663 pp_string (pp
, "_simduid_(");
664 dump_generic_node (pp
, OMP_CLAUSE__SIMDUID__DECL (clause
),
669 case OMP_CLAUSE_GANG
:
670 pp_string (pp
, "gang(");
671 dump_generic_node (pp
, OMP_CLAUSE_GANG_EXPR (clause
),
673 pp_character(pp
, ')');
676 case OMP_CLAUSE_ASYNC
:
677 pp_string (pp
, "async");
678 if (OMP_CLAUSE_ASYNC_EXPR (clause
))
680 pp_character(pp
, '(');
681 dump_generic_node (pp
, OMP_CLAUSE_ASYNC_EXPR (clause
),
683 pp_character(pp
, ')');
687 case OMP_CLAUSE_WAIT
:
688 pp_string (pp
, "wait(");
689 dump_generic_node (pp
, OMP_CLAUSE_WAIT_EXPR (clause
),
691 pp_character(pp
, ')');
694 case OMP_CLAUSE_WORKER
:
695 pp_string (pp
, "worker(");
696 dump_generic_node (pp
, OMP_CLAUSE_WORKER_EXPR (clause
),
698 pp_character(pp
, ')');
701 case OMP_CLAUSE_VECTOR
:
702 pp_string (pp
, "vector(");
703 dump_generic_node (pp
, OMP_CLAUSE_VECTOR_EXPR (clause
),
705 pp_character(pp
, ')');
708 case OMP_CLAUSE_NUM_GANGS
:
709 pp_string (pp
, "num_gangs(");
710 dump_generic_node (pp
, OMP_CLAUSE_NUM_GANGS_EXPR (clause
),
712 pp_character (pp
, ')');
715 case OMP_CLAUSE_NUM_WORKERS
:
716 pp_string (pp
, "num_workers(");
717 dump_generic_node (pp
, OMP_CLAUSE_NUM_WORKERS_EXPR (clause
),
719 pp_character (pp
, ')');
722 case OMP_CLAUSE_VECTOR_LENGTH
:
723 pp_string (pp
, "vector_length(");
724 dump_generic_node (pp
, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause
),
726 pp_character (pp
, ')');
729 case OMP_CLAUSE_INBRANCH
:
730 pp_string (pp
, "inbranch");
732 case OMP_CLAUSE_NOTINBRANCH
:
733 pp_string (pp
, "notinbranch");
736 pp_string (pp
, "for");
738 case OMP_CLAUSE_PARALLEL
:
739 pp_string (pp
, "parallel");
741 case OMP_CLAUSE_SECTIONS
:
742 pp_string (pp
, "sections");
744 case OMP_CLAUSE_TASKGROUP
:
745 pp_string (pp
, "taskgroup");
747 case OMP_CLAUSE_INDEPENDENT
:
748 pp_string (pp
, "independent");
752 /* Should never happen. */
753 dump_generic_node (pp
, clause
, spc
, flags
, false);
759 /* Dump the list of OpenMP clauses. PP, SPC and FLAGS are as in
760 dump_generic_node. */
763 dump_omp_clauses (pretty_printer
*pp
, tree clause
, int spc
, int flags
)
771 dump_omp_clause (pp
, clause
, spc
, flags
);
772 clause
= OMP_CLAUSE_CHAIN (clause
);
780 /* Dump location LOC to PP. */
783 dump_location (pretty_printer
*pp
, location_t loc
)
785 expanded_location xloc
= expand_location (loc
);
787 pp_left_bracket (pp
);
790 pp_string (pp
, xloc
.file
);
793 pp_decimal_int (pp
, xloc
.line
);
795 pp_decimal_int (pp
, xloc
.column
);
796 pp_string (pp
, "] ");
800 /* Dump lexical block BLOCK. PP, SPC and FLAGS are as in
801 dump_generic_node. */
804 dump_block_node (pretty_printer
*pp
, tree block
, int spc
, int flags
)
808 pp_printf (pp
, "BLOCK #%d ", BLOCK_NUMBER (block
));
810 if (flags
& TDF_ADDRESS
)
811 pp_printf (pp
, "[%p] ", (void *) block
);
813 if (BLOCK_ABSTRACT (block
))
814 pp_string (pp
, "[abstract] ");
816 if (TREE_ASM_WRITTEN (block
))
817 pp_string (pp
, "[written] ");
819 if (flags
& TDF_SLIM
)
822 if (BLOCK_SOURCE_LOCATION (block
))
823 dump_location (pp
, BLOCK_SOURCE_LOCATION (block
));
825 newline_and_indent (pp
, spc
+ 2);
827 if (BLOCK_SUPERCONTEXT (block
))
829 pp_string (pp
, "SUPERCONTEXT: ");
830 dump_generic_node (pp
, BLOCK_SUPERCONTEXT (block
), 0,
831 flags
| TDF_SLIM
, false);
832 newline_and_indent (pp
, spc
+ 2);
835 if (BLOCK_SUBBLOCKS (block
))
837 pp_string (pp
, "SUBBLOCKS: ");
838 for (t
= BLOCK_SUBBLOCKS (block
); t
; t
= BLOCK_CHAIN (t
))
840 dump_generic_node (pp
, t
, 0, flags
| TDF_SLIM
, false);
843 newline_and_indent (pp
, spc
+ 2);
846 if (BLOCK_CHAIN (block
))
848 pp_string (pp
, "SIBLINGS: ");
849 for (t
= BLOCK_CHAIN (block
); t
; t
= BLOCK_CHAIN (t
))
851 dump_generic_node (pp
, t
, 0, flags
| TDF_SLIM
, false);
854 newline_and_indent (pp
, spc
+ 2);
857 if (BLOCK_VARS (block
))
859 pp_string (pp
, "VARS: ");
860 for (t
= BLOCK_VARS (block
); t
; t
= TREE_CHAIN (t
))
862 dump_generic_node (pp
, t
, 0, flags
, false);
865 newline_and_indent (pp
, spc
+ 2);
868 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block
)) > 0)
871 vec
<tree
, va_gc
> *nlv
= BLOCK_NONLOCALIZED_VARS (block
);
873 pp_string (pp
, "NONLOCALIZED_VARS: ");
874 FOR_EACH_VEC_ELT (*nlv
, i
, t
)
876 dump_generic_node (pp
, t
, 0, flags
, false);
879 newline_and_indent (pp
, spc
+ 2);
882 if (BLOCK_ABSTRACT_ORIGIN (block
))
884 pp_string (pp
, "ABSTRACT_ORIGIN: ");
885 dump_generic_node (pp
, BLOCK_ABSTRACT_ORIGIN (block
), 0,
886 flags
| TDF_SLIM
, false);
887 newline_and_indent (pp
, spc
+ 2);
890 if (BLOCK_FRAGMENT_ORIGIN (block
))
892 pp_string (pp
, "FRAGMENT_ORIGIN: ");
893 dump_generic_node (pp
, BLOCK_FRAGMENT_ORIGIN (block
), 0,
894 flags
| TDF_SLIM
, false);
895 newline_and_indent (pp
, spc
+ 2);
898 if (BLOCK_FRAGMENT_CHAIN (block
))
900 pp_string (pp
, "FRAGMENT_CHAIN: ");
901 for (t
= BLOCK_FRAGMENT_CHAIN (block
); t
; t
= BLOCK_FRAGMENT_CHAIN (t
))
903 dump_generic_node (pp
, t
, 0, flags
| TDF_SLIM
, false);
906 newline_and_indent (pp
, spc
+ 2);
911 /* Dump the node NODE on the pretty_printer PP, SPC spaces of
912 indent. FLAGS specifies details to show in the dump (see TDF_* in
913 dumpfile.h). If IS_STMT is true, the object printed is considered
914 to be a statement and it is terminated by ';' if appropriate. */
917 dump_generic_node (pretty_printer
*pp
, tree node
, int spc
, int flags
,
926 if (node
== NULL_TREE
)
929 is_expr
= EXPR_P (node
);
931 if (is_stmt
&& (flags
& TDF_STMTADDR
))
932 pp_printf (pp
, "<&%p> ", (void *)node
);
934 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
935 dump_location (pp
, EXPR_LOCATION (node
));
937 code
= TREE_CODE (node
);
941 pp_string (pp
, "<<< error >>>");
944 case IDENTIFIER_NODE
:
945 pp_tree_identifier (pp
, node
);
949 while (node
&& node
!= error_mark_node
)
951 if (TREE_PURPOSE (node
))
953 dump_generic_node (pp
, TREE_PURPOSE (node
), spc
, flags
, false);
956 dump_generic_node (pp
, TREE_VALUE (node
), spc
, flags
, false);
957 node
= TREE_CHAIN (node
);
958 if (node
&& TREE_CODE (node
) == TREE_LIST
)
967 dump_generic_node (pp
, BINFO_TYPE (node
), spc
, flags
, false);
973 if (TREE_VEC_LENGTH (node
) > 0)
975 size_t len
= TREE_VEC_LENGTH (node
);
976 for (i
= 0; i
< len
- 1; i
++)
978 dump_generic_node (pp
, TREE_VEC_ELT (node
, i
), spc
, flags
,
983 dump_generic_node (pp
, TREE_VEC_ELT (node
, len
- 1), spc
,
990 case POINTER_BOUNDS_TYPE
:
993 case FIXED_POINT_TYPE
:
999 unsigned int quals
= TYPE_QUALS (node
);
1000 enum tree_code_class tclass
;
1002 if (quals
& TYPE_QUAL_ATOMIC
)
1003 pp_string (pp
, "atomic ");
1004 if (quals
& TYPE_QUAL_CONST
)
1005 pp_string (pp
, "const ");
1006 else if (quals
& TYPE_QUAL_VOLATILE
)
1007 pp_string (pp
, "volatile ");
1008 else if (quals
& TYPE_QUAL_RESTRICT
)
1009 pp_string (pp
, "restrict ");
1011 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1013 pp_string (pp
, "<address-space-");
1014 pp_decimal_int (pp
, TYPE_ADDR_SPACE (node
));
1015 pp_string (pp
, "> ");
1018 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
1020 if (tclass
== tcc_declaration
)
1022 if (DECL_NAME (node
))
1023 dump_decl_name (pp
, node
, flags
);
1025 pp_string (pp
, "<unnamed type decl>");
1027 else if (tclass
== tcc_type
)
1029 if (TYPE_NAME (node
))
1031 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
1032 pp_tree_identifier (pp
, TYPE_NAME (node
));
1033 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
1034 && DECL_NAME (TYPE_NAME (node
)))
1035 dump_decl_name (pp
, TYPE_NAME (node
), flags
);
1037 pp_string (pp
, "<unnamed type>");
1039 else if (TREE_CODE (node
) == VECTOR_TYPE
)
1041 pp_string (pp
, "vector");
1043 pp_wide_integer (pp
, TYPE_VECTOR_SUBPARTS (node
));
1044 pp_string (pp
, ") ");
1045 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1047 else if (TREE_CODE (node
) == INTEGER_TYPE
)
1049 if (TYPE_PRECISION (node
) == CHAR_TYPE_SIZE
)
1050 pp_string (pp
, (TYPE_UNSIGNED (node
)
1053 else if (TYPE_PRECISION (node
) == SHORT_TYPE_SIZE
)
1054 pp_string (pp
, (TYPE_UNSIGNED (node
)
1057 else if (TYPE_PRECISION (node
) == INT_TYPE_SIZE
)
1058 pp_string (pp
, (TYPE_UNSIGNED (node
)
1061 else if (TYPE_PRECISION (node
) == LONG_TYPE_SIZE
)
1062 pp_string (pp
, (TYPE_UNSIGNED (node
)
1065 else if (TYPE_PRECISION (node
) == LONG_LONG_TYPE_SIZE
)
1066 pp_string (pp
, (TYPE_UNSIGNED (node
)
1067 ? "unsigned long long"
1068 : "signed long long"));
1069 else if (TYPE_PRECISION (node
) >= CHAR_TYPE_SIZE
1070 && exact_log2 (TYPE_PRECISION (node
)) != -1)
1072 pp_string (pp
, (TYPE_UNSIGNED (node
) ? "uint" : "int"));
1073 pp_decimal_int (pp
, TYPE_PRECISION (node
));
1074 pp_string (pp
, "_t");
1078 pp_string (pp
, (TYPE_UNSIGNED (node
)
1079 ? "<unnamed-unsigned:"
1080 : "<unnamed-signed:"));
1081 pp_decimal_int (pp
, TYPE_PRECISION (node
));
1085 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
1087 pp_string (pp
, "__complex__ ");
1088 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1090 else if (TREE_CODE (node
) == REAL_TYPE
)
1092 pp_string (pp
, "<float:");
1093 pp_decimal_int (pp
, TYPE_PRECISION (node
));
1096 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
1098 pp_string (pp
, "<fixed-point-");
1099 pp_string (pp
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
1100 pp_decimal_int (pp
, TYPE_PRECISION (node
));
1103 else if (TREE_CODE (node
) == VOID_TYPE
)
1104 pp_string (pp
, "void");
1106 pp_string (pp
, "<unnamed type>");
1112 case REFERENCE_TYPE
:
1113 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
1115 if (TREE_TYPE (node
) == NULL
)
1117 pp_string (pp
, str
);
1118 pp_string (pp
, "<null type>");
1120 else if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
1122 tree fnode
= TREE_TYPE (node
);
1124 dump_generic_node (pp
, TREE_TYPE (fnode
), spc
, flags
, false);
1127 pp_string (pp
, str
);
1128 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1129 dump_decl_name (pp
, TYPE_NAME (node
), flags
);
1130 else if (flags
& TDF_NOUID
)
1131 pp_printf (pp
, "<Txxxx>");
1133 pp_printf (pp
, "<T%x>", TYPE_UID (node
));
1135 pp_right_paren (pp
);
1136 dump_function_declaration (pp
, fnode
, spc
, flags
);
1140 unsigned int quals
= TYPE_QUALS (node
);
1142 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1144 pp_string (pp
, str
);
1146 if (quals
& TYPE_QUAL_CONST
)
1147 pp_string (pp
, " const");
1148 if (quals
& TYPE_QUAL_VOLATILE
)
1149 pp_string (pp
, " volatile");
1150 if (quals
& TYPE_QUAL_RESTRICT
)
1151 pp_string (pp
, " restrict");
1153 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1155 pp_string (pp
, " <address-space-");
1156 pp_decimal_int (pp
, TYPE_ADDR_SPACE (node
));
1160 if (TYPE_REF_CAN_ALIAS_ALL (node
))
1161 pp_string (pp
, " {ref-all}");
1171 if (integer_zerop (TREE_OPERAND (node
, 1))
1172 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1173 infer them and MEM_ATTR caching will share MEM_REFs
1174 with differently-typed op0s. */
1175 && TREE_CODE (TREE_OPERAND (node
, 0)) != INTEGER_CST
1176 /* Released SSA_NAMES have no TREE_TYPE. */
1177 && TREE_TYPE (TREE_OPERAND (node
, 0)) != NULL_TREE
1178 /* Same pointer types, but ignoring POINTER_TYPE vs.
1180 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1181 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1182 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1183 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1184 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 0)))
1185 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 1))))
1186 /* Same value types ignoring qualifiers. */
1187 && (TYPE_MAIN_VARIANT (TREE_TYPE (node
))
1188 == TYPE_MAIN_VARIANT
1189 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1)))))
1190 && (!(flags
& TDF_ALIAS
)
1191 || MR_DEPENDENCE_CLIQUE (node
) == 0))
1193 if (TREE_CODE (TREE_OPERAND (node
, 0)) != ADDR_EXPR
)
1196 dump_generic_node (pp
, TREE_OPERAND (node
, 0),
1200 dump_generic_node (pp
,
1201 TREE_OPERAND (TREE_OPERAND (node
, 0), 0),
1208 pp_string (pp
, "MEM[");
1210 ptype
= TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node
, 1)));
1211 dump_generic_node (pp
, ptype
,
1212 spc
, flags
| TDF_SLIM
, false);
1213 pp_right_paren (pp
);
1214 dump_generic_node (pp
, TREE_OPERAND (node
, 0),
1216 if (!integer_zerop (TREE_OPERAND (node
, 1)))
1218 pp_string (pp
, " + ");
1219 dump_generic_node (pp
, TREE_OPERAND (node
, 1),
1222 if ((flags
& TDF_ALIAS
)
1223 && MR_DEPENDENCE_CLIQUE (node
) != 0)
1225 pp_string (pp
, " clique ");
1226 pp_unsigned_wide_integer (pp
, MR_DEPENDENCE_CLIQUE (node
));
1227 pp_string (pp
, " base ");
1228 pp_unsigned_wide_integer (pp
, MR_DEPENDENCE_BASE (node
));
1230 pp_right_bracket (pp
);
1235 case TARGET_MEM_REF
:
1237 const char *sep
= "";
1240 pp_string (pp
, "MEM[");
1242 if (TREE_CODE (TMR_BASE (node
)) == ADDR_EXPR
)
1244 pp_string (pp
, sep
);
1246 pp_string (pp
, "symbol: ");
1247 dump_generic_node (pp
, TREE_OPERAND (TMR_BASE (node
), 0),
1252 pp_string (pp
, sep
);
1254 pp_string (pp
, "base: ");
1255 dump_generic_node (pp
, TMR_BASE (node
), spc
, flags
, false);
1257 tmp
= TMR_INDEX2 (node
);
1260 pp_string (pp
, sep
);
1262 pp_string (pp
, "base: ");
1263 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1265 tmp
= TMR_INDEX (node
);
1268 pp_string (pp
, sep
);
1270 pp_string (pp
, "index: ");
1271 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1273 tmp
= TMR_STEP (node
);
1276 pp_string (pp
, sep
);
1278 pp_string (pp
, "step: ");
1279 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1281 tmp
= TMR_OFFSET (node
);
1284 pp_string (pp
, sep
);
1286 pp_string (pp
, "offset: ");
1287 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1289 pp_right_bracket (pp
);
1297 /* Print the innermost component type. */
1298 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
1299 tmp
= TREE_TYPE (tmp
))
1301 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1303 /* Print the dimensions. */
1304 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
1305 dump_array_domain (pp
, TYPE_DOMAIN (tmp
), spc
, flags
);
1311 case QUAL_UNION_TYPE
:
1313 unsigned int quals
= TYPE_QUALS (node
);
1315 if (quals
& TYPE_QUAL_ATOMIC
)
1316 pp_string (pp
, "atomic ");
1317 if (quals
& TYPE_QUAL_CONST
)
1318 pp_string (pp
, "const ");
1319 if (quals
& TYPE_QUAL_VOLATILE
)
1320 pp_string (pp
, "volatile ");
1322 /* Print the name of the structure. */
1323 if (TREE_CODE (node
) == RECORD_TYPE
)
1324 pp_string (pp
, "struct ");
1325 else if (TREE_CODE (node
) == UNION_TYPE
)
1326 pp_string (pp
, "union ");
1328 if (TYPE_NAME (node
))
1329 dump_generic_node (pp
, TYPE_NAME (node
), spc
, flags
, false);
1330 else if (!(flags
& TDF_SLIM
))
1331 /* FIXME: If we eliminate the 'else' above and attempt
1332 to show the fields for named types, we may get stuck
1333 following a cycle of pointers to structs. The alleged
1334 self-reference check in print_struct_decl will not detect
1335 cycles involving more than one pointer or struct type. */
1336 print_struct_decl (pp
, node
, spc
, flags
);
1345 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
1347 /* In the case of a pointer, one may want to divide by the
1348 size of the pointed-to type. Unfortunately, this not
1349 straightforward. The C front-end maps expressions
1354 in such a way that the two INTEGER_CST nodes for "5" have
1355 different values but identical types. In the latter
1356 case, the 5 is multiplied by sizeof (int) in c-common.c
1357 (pointer_int_sum) to convert it to a byte address, and
1358 yet the type of the node is left unchanged. Argh. What
1359 is consistent though is that the number value corresponds
1360 to bytes (UNITS) offset.
1362 NB: Neither of the following divisors can be trivially
1363 used to recover the original literal:
1365 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1366 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1367 pp_wide_integer (pp
, TREE_INT_CST_LOW (node
));
1368 pp_string (pp
, "B"); /* pseudo-unit */
1370 else if (tree_fits_shwi_p (node
))
1371 pp_wide_integer (pp
, tree_to_shwi (node
));
1372 else if (tree_fits_uhwi_p (node
))
1373 pp_unsigned_wide_integer (pp
, tree_to_uhwi (node
));
1376 wide_int val
= node
;
1378 if (wi::neg_p (val
, TYPE_SIGN (TREE_TYPE (node
))))
1383 print_hex (val
, pp_buffer (pp
)->digit_buffer
);
1384 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);
1386 if (TREE_OVERFLOW (node
))
1387 pp_string (pp
, "(OVF)");
1391 /* Code copied from print_node. */
1394 if (TREE_OVERFLOW (node
))
1395 pp_string (pp
, " overflow");
1397 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
1398 d
= TREE_REAL_CST (node
);
1399 if (REAL_VALUE_ISINF (d
))
1400 pp_string (pp
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
1401 else if (REAL_VALUE_ISNAN (d
))
1402 pp_string (pp
, " Nan");
1406 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
1407 pp_string (pp
, string
);
1412 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
1413 pp_string (pp
, "0x");
1414 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
1415 output_formatted_integer (pp
, "%02x", *p
++);
1424 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
1425 pp_string (pp
, string
);
1430 pp_string (pp
, "__complex__ (");
1431 dump_generic_node (pp
, TREE_REALPART (node
), spc
, flags
, false);
1432 pp_string (pp
, ", ");
1433 dump_generic_node (pp
, TREE_IMAGPART (node
), spc
, flags
, false);
1434 pp_right_paren (pp
);
1438 pp_string (pp
, "\"");
1439 pretty_print_string (pp
, TREE_STRING_POINTER (node
));
1440 pp_string (pp
, "\"");
1446 pp_string (pp
, "{ ");
1447 for (i
= 0; i
< VECTOR_CST_NELTS (node
); ++i
)
1450 pp_string (pp
, ", ");
1451 dump_generic_node (pp
, VECTOR_CST_ELT (node
, i
),
1454 pp_string (pp
, " }");
1460 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1462 if (TREE_CODE (node
) == METHOD_TYPE
)
1464 if (TYPE_METHOD_BASETYPE (node
))
1465 dump_decl_name (pp
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
1468 pp_string (pp
, "<null method basetype>");
1469 pp_colon_colon (pp
);
1471 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1472 dump_decl_name (pp
, TYPE_NAME (node
), flags
);
1473 else if (flags
& TDF_NOUID
)
1474 pp_printf (pp
, "<Txxxx>");
1476 pp_printf (pp
, "<T%x>", TYPE_UID (node
));
1477 dump_function_declaration (pp
, node
, spc
, flags
);
1482 dump_decl_name (pp
, node
, flags
);
1486 if (DECL_NAME (node
))
1487 dump_decl_name (pp
, node
, flags
);
1488 else if (LABEL_DECL_UID (node
) != -1)
1489 pp_printf (pp
, "<L%d>", (int) LABEL_DECL_UID (node
));
1492 if (flags
& TDF_NOUID
)
1493 pp_string (pp
, "<D.xxxx>");
1495 pp_printf (pp
, "<D.%u>", DECL_UID (node
));
1500 if (DECL_IS_BUILTIN (node
))
1502 /* Don't print the declaration of built-in types. */
1505 if (DECL_NAME (node
))
1506 dump_decl_name (pp
, node
, flags
);
1507 else if (TYPE_NAME (TREE_TYPE (node
)) != node
)
1509 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1510 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1511 && TYPE_METHODS (TREE_TYPE (node
)))
1513 /* The type is a c++ class: all structures have at least
1515 pp_string (pp
, "class ");
1516 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1521 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
1522 ? "union" : "struct "));
1523 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1527 pp_string (pp
, "<anon>");
1533 case DEBUG_EXPR_DECL
:
1534 case NAMESPACE_DECL
:
1536 dump_decl_name (pp
, node
, flags
);
1540 pp_string (pp
, "<retval>");
1544 op0
= TREE_OPERAND (node
, 0);
1547 && (TREE_CODE (op0
) == INDIRECT_REF
1548 || (TREE_CODE (op0
) == MEM_REF
1549 && TREE_CODE (TREE_OPERAND (op0
, 0)) != ADDR_EXPR
1550 && integer_zerop (TREE_OPERAND (op0
, 1))
1551 /* Dump the types of INTEGER_CSTs explicitly, for we
1552 can't infer them and MEM_ATTR caching will share
1553 MEM_REFs with differently-typed op0s. */
1554 && TREE_CODE (TREE_OPERAND (op0
, 0)) != INTEGER_CST
1555 /* Released SSA_NAMES have no TREE_TYPE. */
1556 && TREE_TYPE (TREE_OPERAND (op0
, 0)) != NULL_TREE
1557 /* Same pointer types, but ignoring POINTER_TYPE vs.
1559 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1560 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1561 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1562 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1563 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1564 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1565 /* Same value types ignoring qualifiers. */
1566 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0
))
1567 == TYPE_MAIN_VARIANT
1568 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1)))))
1569 && MR_DEPENDENCE_CLIQUE (op0
) == 0)))
1571 op0
= TREE_OPERAND (op0
, 0);
1574 if (op_prio (op0
) < op_prio (node
))
1576 dump_generic_node (pp
, op0
, spc
, flags
, false);
1577 if (op_prio (op0
) < op_prio (node
))
1578 pp_right_paren (pp
);
1579 pp_string (pp
, str
);
1580 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1581 op0
= component_ref_field_offset (node
);
1582 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
1584 pp_string (pp
, "{off: ");
1585 dump_generic_node (pp
, op0
, spc
, flags
, false);
1586 pp_right_brace (pp
);
1591 pp_string (pp
, "BIT_FIELD_REF <");
1592 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1593 pp_string (pp
, ", ");
1594 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1595 pp_string (pp
, ", ");
1596 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1601 case ARRAY_RANGE_REF
:
1602 op0
= TREE_OPERAND (node
, 0);
1603 if (op_prio (op0
) < op_prio (node
))
1605 dump_generic_node (pp
, op0
, spc
, flags
, false);
1606 if (op_prio (op0
) < op_prio (node
))
1607 pp_right_paren (pp
);
1608 pp_left_bracket (pp
);
1609 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1610 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
1611 pp_string (pp
, " ...");
1612 pp_right_bracket (pp
);
1614 op0
= array_ref_low_bound (node
);
1615 op1
= array_ref_element_size (node
);
1617 if (!integer_zerop (op0
)
1618 || TREE_OPERAND (node
, 2)
1619 || TREE_OPERAND (node
, 3))
1621 pp_string (pp
, "{lb: ");
1622 dump_generic_node (pp
, op0
, spc
, flags
, false);
1623 pp_string (pp
, " sz: ");
1624 dump_generic_node (pp
, op1
, spc
, flags
, false);
1625 pp_right_brace (pp
);
1631 unsigned HOST_WIDE_INT ix
;
1633 bool is_struct_init
= false;
1634 bool is_array_init
= false;
1637 if (TREE_CLOBBER_P (node
))
1638 pp_string (pp
, "CLOBBER");
1639 else if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1640 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1641 is_struct_init
= true;
1642 else if (TREE_CODE (TREE_TYPE (node
)) == ARRAY_TYPE
1643 && TYPE_DOMAIN (TREE_TYPE (node
))
1644 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)))
1645 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
))))
1648 tree minv
= TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)));
1649 is_array_init
= true;
1650 curidx
= wi::to_widest (minv
);
1652 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1659 dump_generic_node (pp
, field
, spc
, flags
, false);
1662 else if (is_array_init
1663 && (TREE_CODE (field
) != INTEGER_CST
1664 || curidx
!= wi::to_widest (field
)))
1666 pp_left_bracket (pp
);
1667 if (TREE_CODE (field
) == RANGE_EXPR
)
1669 dump_generic_node (pp
, TREE_OPERAND (field
, 0), spc
,
1671 pp_string (pp
, " ... ");
1672 dump_generic_node (pp
, TREE_OPERAND (field
, 1), spc
,
1674 if (TREE_CODE (TREE_OPERAND (field
, 1)) == INTEGER_CST
)
1675 curidx
= wi::to_widest (TREE_OPERAND (field
, 1));
1678 dump_generic_node (pp
, field
, spc
, flags
, false);
1679 if (TREE_CODE (field
) == INTEGER_CST
)
1680 curidx
= wi::to_widest (field
);
1681 pp_string (pp
, "]=");
1686 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1687 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1688 val
= TREE_OPERAND (val
, 0);
1689 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1690 dump_decl_name (pp
, val
, flags
);
1692 dump_generic_node (pp
, val
, spc
, flags
, false);
1693 if (ix
!= vec_safe_length (CONSTRUCTOR_ELTS (node
)) - 1)
1699 pp_right_brace (pp
);
1706 if (flags
& TDF_SLIM
)
1708 pp_string (pp
, "<COMPOUND_EXPR>");
1712 dump_generic_node (pp
, TREE_OPERAND (node
, 0),
1713 spc
, flags
, !(flags
& TDF_SLIM
));
1714 if (flags
& TDF_SLIM
)
1715 newline_and_indent (pp
, spc
);
1722 for (tp
= &TREE_OPERAND (node
, 1);
1723 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1724 tp
= &TREE_OPERAND (*tp
, 1))
1726 dump_generic_node (pp
, TREE_OPERAND (*tp
, 0),
1727 spc
, flags
, !(flags
& TDF_SLIM
));
1728 if (flags
& TDF_SLIM
)
1729 newline_and_indent (pp
, spc
);
1737 dump_generic_node (pp
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1741 case STATEMENT_LIST
:
1743 tree_stmt_iterator si
;
1746 if (flags
& TDF_SLIM
)
1748 pp_string (pp
, "<STATEMENT_LIST>");
1752 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1755 newline_and_indent (pp
, spc
);
1758 dump_generic_node (pp
, tsi_stmt (si
), spc
, flags
, true);
1765 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
,
1770 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
,
1775 pp_string (pp
, "TARGET_EXPR <");
1776 dump_generic_node (pp
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1779 dump_generic_node (pp
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1784 print_declaration (pp
, DECL_EXPR_DECL (node
), spc
, flags
);
1789 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1791 pp_string (pp
, "if (");
1792 dump_generic_node (pp
, COND_EXPR_COND (node
), spc
, flags
, false);
1793 pp_right_paren (pp
);
1794 /* The lowered cond_exprs should always be printed in full. */
1795 if (COND_EXPR_THEN (node
)
1796 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1797 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1798 && COND_EXPR_ELSE (node
)
1799 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1800 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1803 dump_generic_node (pp
, COND_EXPR_THEN (node
),
1805 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1807 pp_string (pp
, " else ");
1808 dump_generic_node (pp
, COND_EXPR_ELSE (node
),
1812 else if (!(flags
& TDF_SLIM
))
1814 /* Output COND_EXPR_THEN. */
1815 if (COND_EXPR_THEN (node
))
1817 newline_and_indent (pp
, spc
+2);
1819 newline_and_indent (pp
, spc
+4);
1820 dump_generic_node (pp
, COND_EXPR_THEN (node
), spc
+4,
1822 newline_and_indent (pp
, spc
+2);
1823 pp_right_brace (pp
);
1826 /* Output COND_EXPR_ELSE. */
1827 if (COND_EXPR_ELSE (node
)
1828 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1830 newline_and_indent (pp
, spc
);
1831 pp_string (pp
, "else");
1832 newline_and_indent (pp
, spc
+2);
1834 newline_and_indent (pp
, spc
+4);
1835 dump_generic_node (pp
, COND_EXPR_ELSE (node
), spc
+4,
1837 newline_and_indent (pp
, spc
+2);
1838 pp_right_brace (pp
);
1845 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1849 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1853 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1859 if (!(flags
& TDF_SLIM
))
1861 if (BIND_EXPR_VARS (node
))
1865 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= DECL_CHAIN (op0
))
1867 print_declaration (pp
, op0
, spc
+2, flags
);
1872 newline_and_indent (pp
, spc
+2);
1873 dump_generic_node (pp
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1874 newline_and_indent (pp
, spc
);
1875 pp_right_brace (pp
);
1881 if (CALL_EXPR_FN (node
) != NULL_TREE
)
1882 print_call_name (pp
, CALL_EXPR_FN (node
), flags
);
1884 pp_string (pp
, internal_fn_name (CALL_EXPR_IFN (node
)));
1886 /* Print parameters. */
1891 call_expr_arg_iterator iter
;
1892 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1894 dump_generic_node (pp
, arg
, spc
, flags
, false);
1895 if (more_call_expr_args_p (&iter
))
1902 if (CALL_EXPR_VA_ARG_PACK (node
))
1904 if (call_expr_nargs (node
) > 0)
1909 pp_string (pp
, "__builtin_va_arg_pack ()");
1911 pp_right_paren (pp
);
1913 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1916 pp_string (pp
, " [static-chain: ");
1917 dump_generic_node (pp
, op1
, spc
, flags
, false);
1918 pp_right_bracket (pp
);
1921 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1922 pp_string (pp
, " [return slot optimization]");
1923 if (CALL_EXPR_TAILCALL (node
))
1924 pp_string (pp
, " [tail call]");
1927 case WITH_CLEANUP_EXPR
:
1931 case CLEANUP_POINT_EXPR
:
1932 pp_string (pp
, "<<cleanup_point ");
1933 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1934 pp_string (pp
, ">>");
1937 case PLACEHOLDER_EXPR
:
1938 pp_string (pp
, "<PLACEHOLDER_EXPR ");
1939 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1943 /* Binary arithmetic and logic expressions. */
1944 case WIDEN_SUM_EXPR
:
1945 case WIDEN_MULT_EXPR
:
1947 case MULT_HIGHPART_EXPR
:
1949 case POINTER_PLUS_EXPR
:
1951 case TRUNC_DIV_EXPR
:
1953 case FLOOR_DIV_EXPR
:
1954 case ROUND_DIV_EXPR
:
1955 case TRUNC_MOD_EXPR
:
1957 case FLOOR_MOD_EXPR
:
1958 case ROUND_MOD_EXPR
:
1960 case EXACT_DIV_EXPR
:
1965 case WIDEN_LSHIFT_EXPR
:
1969 case TRUTH_ANDIF_EXPR
:
1970 case TRUTH_ORIF_EXPR
:
1971 case TRUTH_AND_EXPR
:
1973 case TRUTH_XOR_EXPR
:
1987 case UNORDERED_EXPR
:
1989 const char *op
= op_symbol (node
);
1990 op0
= TREE_OPERAND (node
, 0);
1991 op1
= TREE_OPERAND (node
, 1);
1993 /* When the operands are expressions with less priority,
1994 keep semantics of the tree representation. */
1995 if (op_prio (op0
) <= op_prio (node
))
1998 dump_generic_node (pp
, op0
, spc
, flags
, false);
1999 pp_right_paren (pp
);
2002 dump_generic_node (pp
, op0
, spc
, flags
, false);
2008 /* When the operands are expressions with less priority,
2009 keep semantics of the tree representation. */
2010 if (op_prio (op1
) <= op_prio (node
))
2013 dump_generic_node (pp
, op1
, spc
, flags
, false);
2014 pp_right_paren (pp
);
2017 dump_generic_node (pp
, op1
, spc
, flags
, false);
2021 /* Unary arithmetic and logic expressions. */
2024 case TRUTH_NOT_EXPR
:
2026 case PREDECREMENT_EXPR
:
2027 case PREINCREMENT_EXPR
:
2029 if (TREE_CODE (node
) == ADDR_EXPR
2030 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
2031 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
2032 ; /* Do not output '&' for strings and function pointers. */
2034 pp_string (pp
, op_symbol (node
));
2036 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2039 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2040 pp_right_paren (pp
);
2043 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2046 case POSTDECREMENT_EXPR
:
2047 case POSTINCREMENT_EXPR
:
2048 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2051 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2052 pp_right_paren (pp
);
2055 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2056 pp_string (pp
, op_symbol (node
));
2060 pp_string (pp
, "MIN_EXPR <");
2061 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2062 pp_string (pp
, ", ");
2063 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2068 pp_string (pp
, "MAX_EXPR <");
2069 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2070 pp_string (pp
, ", ");
2071 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2076 pp_string (pp
, "ABS_EXPR <");
2077 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2085 case ADDR_SPACE_CONVERT_EXPR
:
2086 case FIXED_CONVERT_EXPR
:
2087 case FIX_TRUNC_EXPR
:
2090 type
= TREE_TYPE (node
);
2091 op0
= TREE_OPERAND (node
, 0);
2092 if (type
!= TREE_TYPE (op0
))
2095 dump_generic_node (pp
, type
, spc
, flags
, false);
2096 pp_string (pp
, ") ");
2098 if (op_prio (op0
) < op_prio (node
))
2100 dump_generic_node (pp
, op0
, spc
, flags
, false);
2101 if (op_prio (op0
) < op_prio (node
))
2102 pp_right_paren (pp
);
2105 case VIEW_CONVERT_EXPR
:
2106 pp_string (pp
, "VIEW_CONVERT_EXPR<");
2107 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
2108 pp_string (pp
, ">(");
2109 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2110 pp_right_paren (pp
);
2114 pp_string (pp
, "((");
2115 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2116 pp_string (pp
, "))");
2119 case NON_LVALUE_EXPR
:
2120 pp_string (pp
, "NON_LVALUE_EXPR <");
2121 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2126 pp_string (pp
, "SAVE_EXPR <");
2127 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2132 pp_string (pp
, "COMPLEX_EXPR <");
2133 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2134 pp_string (pp
, ", ");
2135 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2140 pp_string (pp
, "CONJ_EXPR <");
2141 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2146 pp_string (pp
, "REALPART_EXPR <");
2147 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2152 pp_string (pp
, "IMAGPART_EXPR <");
2153 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2158 pp_string (pp
, "VA_ARG_EXPR <");
2159 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2163 case TRY_FINALLY_EXPR
:
2164 case TRY_CATCH_EXPR
:
2165 pp_string (pp
, "try");
2166 newline_and_indent (pp
, spc
+2);
2168 newline_and_indent (pp
, spc
+4);
2169 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
2170 newline_and_indent (pp
, spc
+2);
2171 pp_right_brace (pp
);
2172 newline_and_indent (pp
, spc
);
2174 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
2175 newline_and_indent (pp
, spc
+2);
2177 newline_and_indent (pp
, spc
+4);
2178 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
2179 newline_and_indent (pp
, spc
+2);
2180 pp_right_brace (pp
);
2185 pp_string (pp
, "catch (");
2186 dump_generic_node (pp
, CATCH_TYPES (node
), spc
+2, flags
, false);
2187 pp_right_paren (pp
);
2188 newline_and_indent (pp
, spc
+2);
2190 newline_and_indent (pp
, spc
+4);
2191 dump_generic_node (pp
, CATCH_BODY (node
), spc
+4, flags
, true);
2192 newline_and_indent (pp
, spc
+2);
2193 pp_right_brace (pp
);
2197 case EH_FILTER_EXPR
:
2198 pp_string (pp
, "<<<eh_filter (");
2199 dump_generic_node (pp
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
2200 pp_string (pp
, ")>>>");
2201 newline_and_indent (pp
, spc
+2);
2203 newline_and_indent (pp
, spc
+4);
2204 dump_generic_node (pp
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
2205 newline_and_indent (pp
, spc
+2);
2206 pp_right_brace (pp
);
2211 op0
= TREE_OPERAND (node
, 0);
2212 /* If this is for break or continue, don't bother printing it. */
2213 if (DECL_NAME (op0
))
2215 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2216 if (strcmp (name
, "break") == 0
2217 || strcmp (name
, "continue") == 0)
2220 dump_generic_node (pp
, op0
, spc
, flags
, false);
2222 if (DECL_NONLOCAL (op0
))
2223 pp_string (pp
, " [non-local]");
2227 pp_string (pp
, "while (1)");
2228 if (!(flags
& TDF_SLIM
))
2230 newline_and_indent (pp
, spc
+2);
2232 newline_and_indent (pp
, spc
+4);
2233 dump_generic_node (pp
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
2234 newline_and_indent (pp
, spc
+2);
2235 pp_right_brace (pp
);
2241 pp_string (pp
, "// predicted ");
2242 if (PREDICT_EXPR_OUTCOME (node
))
2243 pp_string (pp
, "likely by ");
2245 pp_string (pp
, "unlikely by ");
2246 pp_string (pp
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
2247 pp_string (pp
, " predictor.");
2251 pp_string (pp
, "ANNOTATE_EXPR <");
2252 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2253 switch ((enum annot_expr_kind
) TREE_INT_CST_LOW (TREE_OPERAND (node
, 1)))
2255 case annot_expr_ivdep_kind
:
2256 pp_string (pp
, ", ivdep");
2258 case annot_expr_no_vector_kind
:
2259 pp_string (pp
, ", no-vector");
2261 case annot_expr_vector_kind
:
2262 pp_string (pp
, ", vector");
2271 pp_string (pp
, "return");
2272 op0
= TREE_OPERAND (node
, 0);
2276 if (TREE_CODE (op0
) == MODIFY_EXPR
)
2277 dump_generic_node (pp
, TREE_OPERAND (op0
, 1),
2280 dump_generic_node (pp
, op0
, spc
, flags
, false);
2285 pp_string (pp
, "if (");
2286 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2287 pp_string (pp
, ") break");
2291 pp_string (pp
, "switch (");
2292 dump_generic_node (pp
, SWITCH_COND (node
), spc
, flags
, false);
2293 pp_right_paren (pp
);
2294 if (!(flags
& TDF_SLIM
))
2296 newline_and_indent (pp
, spc
+2);
2298 if (SWITCH_BODY (node
))
2300 newline_and_indent (pp
, spc
+4);
2301 dump_generic_node (pp
, SWITCH_BODY (node
), spc
+4, flags
,
2306 tree vec
= SWITCH_LABELS (node
);
2307 size_t i
, n
= TREE_VEC_LENGTH (vec
);
2308 for (i
= 0; i
< n
; ++i
)
2310 tree elt
= TREE_VEC_ELT (vec
, i
);
2311 newline_and_indent (pp
, spc
+4);
2314 dump_generic_node (pp
, elt
, spc
+4, flags
, false);
2315 pp_string (pp
, " goto ");
2316 dump_generic_node (pp
, CASE_LABEL (elt
), spc
+4,
2321 pp_string (pp
, "case ???: goto ???;");
2324 newline_and_indent (pp
, spc
+2);
2325 pp_right_brace (pp
);
2331 op0
= GOTO_DESTINATION (node
);
2332 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
2334 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2335 if (strcmp (name
, "break") == 0
2336 || strcmp (name
, "continue") == 0)
2338 pp_string (pp
, name
);
2342 pp_string (pp
, "goto ");
2343 dump_generic_node (pp
, op0
, spc
, flags
, false);
2347 pp_string (pp
, "__asm__");
2348 if (ASM_VOLATILE_P (node
))
2349 pp_string (pp
, " __volatile__");
2351 dump_generic_node (pp
, ASM_STRING (node
), spc
, flags
, false);
2353 dump_generic_node (pp
, ASM_OUTPUTS (node
), spc
, flags
, false);
2355 dump_generic_node (pp
, ASM_INPUTS (node
), spc
, flags
, false);
2356 if (ASM_CLOBBERS (node
))
2359 dump_generic_node (pp
, ASM_CLOBBERS (node
), spc
, flags
, false);
2361 pp_right_paren (pp
);
2364 case CASE_LABEL_EXPR
:
2365 if (CASE_LOW (node
) && CASE_HIGH (node
))
2367 pp_string (pp
, "case ");
2368 dump_generic_node (pp
, CASE_LOW (node
), spc
, flags
, false);
2369 pp_string (pp
, " ... ");
2370 dump_generic_node (pp
, CASE_HIGH (node
), spc
, flags
, false);
2372 else if (CASE_LOW (node
))
2374 pp_string (pp
, "case ");
2375 dump_generic_node (pp
, CASE_LOW (node
), spc
, flags
, false);
2378 pp_string (pp
, "default");
2383 pp_string (pp
, "OBJ_TYPE_REF(");
2384 dump_generic_node (pp
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
2386 if (!(flags
& TDF_SLIM
) && virtual_method_call_p (node
))
2388 pp_string (pp
, "(");
2389 dump_generic_node (pp
, obj_type_ref_class (node
), spc
, flags
, false);
2390 pp_string (pp
, ")");
2392 dump_generic_node (pp
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
2394 dump_generic_node (pp
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
2395 pp_right_paren (pp
);
2399 if (SSA_NAME_IDENTIFIER (node
))
2400 dump_generic_node (pp
, SSA_NAME_IDENTIFIER (node
),
2403 pp_decimal_int (pp
, SSA_NAME_VERSION (node
));
2404 if (SSA_NAME_IS_DEFAULT_DEF (node
))
2405 pp_string (pp
, "(D)");
2406 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
2407 pp_string (pp
, "(ab)");
2410 case WITH_SIZE_EXPR
:
2411 pp_string (pp
, "WITH_SIZE_EXPR <");
2412 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2413 pp_string (pp
, ", ");
2414 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2419 pp_string (pp
, "ASSERT_EXPR <");
2420 dump_generic_node (pp
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
2421 pp_string (pp
, ", ");
2422 dump_generic_node (pp
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
2427 pp_string (pp
, "scev_known");
2430 case SCEV_NOT_KNOWN
:
2431 pp_string (pp
, "scev_not_known");
2434 case POLYNOMIAL_CHREC
:
2436 dump_generic_node (pp
, CHREC_LEFT (node
), spc
, flags
, false);
2437 pp_string (pp
, ", +, ");
2438 dump_generic_node (pp
, CHREC_RIGHT (node
), spc
, flags
, false);
2439 pp_string (pp
, "}_");
2440 dump_generic_node (pp
, CHREC_VAR (node
), spc
, flags
, false);
2444 case REALIGN_LOAD_EXPR
:
2445 pp_string (pp
, "REALIGN_LOAD <");
2446 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2447 pp_string (pp
, ", ");
2448 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2449 pp_string (pp
, ", ");
2450 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2455 pp_string (pp
, " VEC_COND_EXPR < ");
2456 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2457 pp_string (pp
, " , ");
2458 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2459 pp_string (pp
, " , ");
2460 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2461 pp_string (pp
, " > ");
2465 pp_string (pp
, " VEC_PERM_EXPR < ");
2466 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2467 pp_string (pp
, " , ");
2468 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2469 pp_string (pp
, " , ");
2470 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2471 pp_string (pp
, " > ");
2475 pp_string (pp
, " DOT_PROD_EXPR < ");
2476 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2477 pp_string (pp
, ", ");
2478 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2479 pp_string (pp
, ", ");
2480 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2481 pp_string (pp
, " > ");
2484 case WIDEN_MULT_PLUS_EXPR
:
2485 pp_string (pp
, " WIDEN_MULT_PLUS_EXPR < ");
2486 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2487 pp_string (pp
, ", ");
2488 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2489 pp_string (pp
, ", ");
2490 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2491 pp_string (pp
, " > ");
2494 case WIDEN_MULT_MINUS_EXPR
:
2495 pp_string (pp
, " WIDEN_MULT_MINUS_EXPR < ");
2496 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2497 pp_string (pp
, ", ");
2498 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2499 pp_string (pp
, ", ");
2500 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2501 pp_string (pp
, " > ");
2505 pp_string (pp
, " FMA_EXPR < ");
2506 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2507 pp_string (pp
, ", ");
2508 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2509 pp_string (pp
, ", ");
2510 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2511 pp_string (pp
, " > ");
2515 pp_string (pp
, "#pragma acc parallel");
2516 dump_omp_clauses (pp
, OACC_PARALLEL_CLAUSES (node
), spc
, flags
);
2520 pp_string (pp
, "#pragma acc kernels");
2521 dump_omp_clauses (pp
, OACC_KERNELS_CLAUSES (node
), spc
, flags
);
2525 pp_string (pp
, "#pragma acc data");
2526 dump_omp_clauses (pp
, OACC_DATA_CLAUSES (node
), spc
, flags
);
2529 case OACC_HOST_DATA
:
2530 pp_string (pp
, "#pragma acc host_data");
2531 dump_omp_clauses (pp
, OACC_HOST_DATA_CLAUSES (node
), spc
, flags
);
2535 pp_string (pp
, "#pragma acc declare");
2536 dump_omp_clauses (pp
, OACC_DECLARE_CLAUSES (node
), spc
, flags
);
2540 pp_string (pp
, "#pragma acc update");
2541 dump_omp_clauses (pp
, OACC_UPDATE_CLAUSES (node
), spc
, flags
);
2544 case OACC_ENTER_DATA
:
2545 pp_string (pp
, "#pragma acc enter data");
2546 dump_omp_clauses (pp
, OACC_ENTER_DATA_CLAUSES (node
), spc
, flags
);
2549 case OACC_EXIT_DATA
:
2550 pp_string (pp
, "#pragma acc exit data");
2551 dump_omp_clauses (pp
, OACC_EXIT_DATA_CLAUSES (node
), spc
, flags
);
2555 pp_string (pp
, "#pragma acc cache");
2556 dump_omp_clauses (pp
, OACC_CACHE_CLAUSES (node
), spc
, flags
);
2560 pp_string (pp
, "#pragma omp parallel");
2561 dump_omp_clauses (pp
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
2564 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
2566 newline_and_indent (pp
, spc
+ 2);
2568 newline_and_indent (pp
, spc
+ 4);
2569 dump_generic_node (pp
, OMP_BODY (node
), spc
+ 4, flags
, false);
2570 newline_and_indent (pp
, spc
+ 2);
2571 pp_right_brace (pp
);
2577 pp_string (pp
, "#pragma omp task");
2578 dump_omp_clauses (pp
, OMP_TASK_CLAUSES (node
), spc
, flags
);
2582 pp_string (pp
, "#pragma omp for");
2586 pp_string (pp
, "#pragma omp simd");
2590 pp_string (pp
, "#pragma simd");
2594 /* This label points one line after dumping the clauses.
2595 For _Cilk_for the clauses are dumped after the _Cilk_for (...)
2596 parameters are printed out. */
2597 goto dump_omp_loop_cilk_for
;
2599 case OMP_DISTRIBUTE
:
2600 pp_string (pp
, "#pragma omp distribute");
2604 pp_string (pp
, "#pragma acc loop");
2608 pp_string (pp
, "#pragma omp teams");
2609 dump_omp_clauses (pp
, OMP_TEAMS_CLAUSES (node
), spc
, flags
);
2612 case OMP_TARGET_DATA
:
2613 pp_string (pp
, "#pragma omp target data");
2614 dump_omp_clauses (pp
, OMP_TARGET_DATA_CLAUSES (node
), spc
, flags
);
2618 pp_string (pp
, "#pragma omp target");
2619 dump_omp_clauses (pp
, OMP_TARGET_CLAUSES (node
), spc
, flags
);
2622 case OMP_TARGET_UPDATE
:
2623 pp_string (pp
, "#pragma omp target update");
2624 dump_omp_clauses (pp
, OMP_TARGET_UPDATE_CLAUSES (node
), spc
, flags
);
2629 dump_omp_clauses (pp
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2631 dump_omp_loop_cilk_for
:
2632 if (!(flags
& TDF_SLIM
))
2636 if (OMP_FOR_PRE_BODY (node
))
2638 if (TREE_CODE (node
) == CILK_FOR
)
2639 pp_string (pp
, " ");
2641 newline_and_indent (pp
, spc
+ 2);
2644 newline_and_indent (pp
, spc
);
2645 dump_generic_node (pp
, OMP_FOR_PRE_BODY (node
),
2648 if (OMP_FOR_INIT (node
))
2651 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
2654 if (TREE_CODE (node
) != CILK_FOR
|| OMP_FOR_PRE_BODY (node
))
2655 newline_and_indent (pp
, spc
);
2656 if (TREE_CODE (node
) == CILK_FOR
)
2657 pp_string (pp
, "_Cilk_for (");
2659 pp_string (pp
, "for (");
2660 dump_generic_node (pp
,
2661 TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
2663 pp_string (pp
, "; ");
2664 dump_generic_node (pp
,
2665 TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
2667 pp_string (pp
, "; ");
2668 dump_generic_node (pp
,
2669 TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
2671 pp_right_paren (pp
);
2673 if (TREE_CODE (node
) == CILK_FOR
)
2674 dump_omp_clauses (pp
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2676 if (OMP_FOR_BODY (node
))
2678 newline_and_indent (pp
, spc
+ 2);
2680 newline_and_indent (pp
, spc
+ 4);
2681 dump_generic_node (pp
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
2683 newline_and_indent (pp
, spc
+ 2);
2684 pp_right_brace (pp
);
2686 if (OMP_FOR_INIT (node
))
2687 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
2688 if (OMP_FOR_PRE_BODY (node
))
2691 newline_and_indent (pp
, spc
+ 2);
2692 pp_right_brace (pp
);
2699 pp_string (pp
, "#pragma omp sections");
2700 dump_omp_clauses (pp
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
2704 pp_string (pp
, "#pragma omp section");
2708 pp_string (pp
, "#pragma omp master");
2712 pp_string (pp
, "#pragma omp taskgroup");
2716 pp_string (pp
, "#pragma omp ordered");
2720 pp_string (pp
, "#pragma omp critical");
2721 if (OMP_CRITICAL_NAME (node
))
2725 dump_generic_node (pp
, OMP_CRITICAL_NAME (node
), spc
,
2727 pp_right_paren (pp
);
2732 pp_string (pp
, "#pragma omp atomic");
2733 if (OMP_ATOMIC_SEQ_CST (node
))
2734 pp_string (pp
, " seq_cst");
2735 newline_and_indent (pp
, spc
+ 2);
2736 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2740 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2743 case OMP_ATOMIC_READ
:
2744 pp_string (pp
, "#pragma omp atomic read");
2745 if (OMP_ATOMIC_SEQ_CST (node
))
2746 pp_string (pp
, " seq_cst");
2747 newline_and_indent (pp
, spc
+ 2);
2748 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2752 case OMP_ATOMIC_CAPTURE_OLD
:
2753 case OMP_ATOMIC_CAPTURE_NEW
:
2754 pp_string (pp
, "#pragma omp atomic capture");
2755 if (OMP_ATOMIC_SEQ_CST (node
))
2756 pp_string (pp
, " seq_cst");
2757 newline_and_indent (pp
, spc
+ 2);
2758 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2762 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2766 pp_string (pp
, "#pragma omp single");
2767 dump_omp_clauses (pp
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
2771 dump_omp_clause (pp
, node
, spc
, flags
);
2775 case TRANSACTION_EXPR
:
2776 if (TRANSACTION_EXPR_OUTER (node
))
2777 pp_string (pp
, "__transaction_atomic [[outer]]");
2778 else if (TRANSACTION_EXPR_RELAXED (node
))
2779 pp_string (pp
, "__transaction_relaxed");
2781 pp_string (pp
, "__transaction_atomic");
2782 if (!(flags
& TDF_SLIM
) && TRANSACTION_EXPR_BODY (node
))
2784 newline_and_indent (pp
, spc
);
2786 newline_and_indent (pp
, spc
+ 2);
2787 dump_generic_node (pp
, TRANSACTION_EXPR_BODY (node
),
2788 spc
+ 2, flags
, false);
2789 newline_and_indent (pp
, spc
);
2790 pp_right_brace (pp
);
2795 case REDUC_MAX_EXPR
:
2796 pp_string (pp
, " REDUC_MAX_EXPR < ");
2797 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2798 pp_string (pp
, " > ");
2801 case REDUC_MIN_EXPR
:
2802 pp_string (pp
, " REDUC_MIN_EXPR < ");
2803 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2804 pp_string (pp
, " > ");
2807 case REDUC_PLUS_EXPR
:
2808 pp_string (pp
, " REDUC_PLUS_EXPR < ");
2809 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2810 pp_string (pp
, " > ");
2813 case VEC_WIDEN_MULT_HI_EXPR
:
2814 case VEC_WIDEN_MULT_LO_EXPR
:
2815 case VEC_WIDEN_MULT_EVEN_EXPR
:
2816 case VEC_WIDEN_MULT_ODD_EXPR
:
2817 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2818 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2820 for (str
= get_tree_code_name (code
); *str
; str
++)
2821 pp_character (pp
, TOUPPER (*str
));
2822 pp_string (pp
, " < ");
2823 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2824 pp_string (pp
, ", ");
2825 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2826 pp_string (pp
, " > ");
2829 case VEC_UNPACK_HI_EXPR
:
2830 pp_string (pp
, " VEC_UNPACK_HI_EXPR < ");
2831 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2832 pp_string (pp
, " > ");
2835 case VEC_UNPACK_LO_EXPR
:
2836 pp_string (pp
, " VEC_UNPACK_LO_EXPR < ");
2837 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2838 pp_string (pp
, " > ");
2841 case VEC_UNPACK_FLOAT_HI_EXPR
:
2842 pp_string (pp
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2843 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2844 pp_string (pp
, " > ");
2847 case VEC_UNPACK_FLOAT_LO_EXPR
:
2848 pp_string (pp
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2849 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2850 pp_string (pp
, " > ");
2853 case VEC_PACK_TRUNC_EXPR
:
2854 pp_string (pp
, " VEC_PACK_TRUNC_EXPR < ");
2855 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2856 pp_string (pp
, ", ");
2857 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2858 pp_string (pp
, " > ");
2861 case VEC_PACK_SAT_EXPR
:
2862 pp_string (pp
, " VEC_PACK_SAT_EXPR < ");
2863 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2864 pp_string (pp
, ", ");
2865 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2866 pp_string (pp
, " > ");
2869 case VEC_PACK_FIX_TRUNC_EXPR
:
2870 pp_string (pp
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2871 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2872 pp_string (pp
, ", ");
2873 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2874 pp_string (pp
, " > ");
2878 dump_block_node (pp
, node
, spc
, flags
);
2881 case CILK_SPAWN_STMT
:
2882 pp_string (pp
, "_Cilk_spawn ");
2883 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2886 case CILK_SYNC_STMT
:
2887 pp_string (pp
, "_Cilk_sync");
2894 if (is_stmt
&& is_expr
)
2900 /* Print the declaration of a variable. */
2903 print_declaration (pretty_printer
*pp
, tree t
, int spc
, int flags
)
2907 if (TREE_CODE(t
) == NAMELIST_DECL
)
2909 pp_string(pp
, "namelist ");
2910 dump_decl_name (pp
, t
, flags
);
2915 if (TREE_CODE (t
) == TYPE_DECL
)
2916 pp_string (pp
, "typedef ");
2918 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2919 pp_string (pp
, "register ");
2921 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2922 pp_string (pp
, "extern ");
2923 else if (TREE_STATIC (t
))
2924 pp_string (pp
, "static ");
2926 /* Print the type and name. */
2927 if (TREE_TYPE (t
) && TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2931 /* Print array's type. */
2932 tmp
= TREE_TYPE (t
);
2933 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2934 tmp
= TREE_TYPE (tmp
);
2935 dump_generic_node (pp
, TREE_TYPE (tmp
), spc
, flags
, false);
2937 /* Print variable's name. */
2939 dump_generic_node (pp
, t
, spc
, flags
, false);
2941 /* Print the dimensions. */
2942 tmp
= TREE_TYPE (t
);
2943 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2945 dump_array_domain (pp
, TYPE_DOMAIN (tmp
), spc
, flags
);
2946 tmp
= TREE_TYPE (tmp
);
2949 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2951 dump_generic_node (pp
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2953 dump_decl_name (pp
, t
, flags
);
2954 dump_function_declaration (pp
, TREE_TYPE (t
), spc
, flags
);
2958 /* Print type declaration. */
2959 dump_generic_node (pp
, TREE_TYPE (t
), spc
, flags
, false);
2961 /* Print variable's name. */
2963 dump_generic_node (pp
, t
, spc
, flags
, false);
2966 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2968 pp_string (pp
, " __asm__ ");
2970 dump_generic_node (pp
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2971 pp_right_paren (pp
);
2974 /* The initial value of a function serves to determine whether the function
2975 is declared or defined. So the following does not apply to function
2977 if (TREE_CODE (t
) != FUNCTION_DECL
)
2979 /* Print the initial value. */
2980 if (DECL_INITIAL (t
))
2985 dump_generic_node (pp
, DECL_INITIAL (t
), spc
, flags
, false);
2989 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2991 pp_string (pp
, " [value-expr: ");
2992 dump_generic_node (pp
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2993 pp_right_bracket (pp
);
3000 /* Prints a structure: name, fields, and methods.
3001 FIXME: Still incomplete. */
3004 print_struct_decl (pretty_printer
*pp
, const_tree node
, int spc
, int flags
)
3006 /* Print the name of the structure. */
3007 if (TYPE_NAME (node
))
3010 if (TREE_CODE (node
) == RECORD_TYPE
)
3011 pp_string (pp
, "struct ");
3012 else if ((TREE_CODE (node
) == UNION_TYPE
3013 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
3014 pp_string (pp
, "union ");
3016 dump_generic_node (pp
, TYPE_NAME (node
), spc
, 0, false);
3019 /* Print the contents of the structure. */
3025 /* Print the fields of the structure. */
3028 tmp
= TYPE_FIELDS (node
);
3031 /* Avoid to print recursively the structure. */
3032 /* FIXME : Not implemented correctly...,
3033 what about the case when we have a cycle in the contain graph? ...
3034 Maybe this could be solved by looking at the scope in which the
3035 structure was declared. */
3036 if (TREE_TYPE (tmp
) != node
3037 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
3038 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
3040 print_declaration (pp
, tmp
, spc
+2, flags
);
3043 tmp
= DECL_CHAIN (tmp
);
3047 pp_right_brace (pp
);
3050 /* Return the priority of the operator CODE.
3052 From lowest to highest precedence with either left-to-right (L-R)
3053 or right-to-left (R-L) associativity]:
3056 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
3068 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
3069 15 [L-R] fn() [] -> .
3071 unary +, - and * have higher precedence than the corresponding binary
3075 op_code_prio (enum tree_code code
)
3092 case TRUTH_ORIF_EXPR
:
3095 case TRUTH_AND_EXPR
:
3096 case TRUTH_ANDIF_EXPR
:
3103 case TRUTH_XOR_EXPR
:
3120 case UNORDERED_EXPR
:
3131 case VEC_WIDEN_LSHIFT_HI_EXPR
:
3132 case VEC_WIDEN_LSHIFT_LO_EXPR
:
3133 case WIDEN_LSHIFT_EXPR
:
3136 case WIDEN_SUM_EXPR
:
3138 case POINTER_PLUS_EXPR
:
3142 case VEC_WIDEN_MULT_HI_EXPR
:
3143 case VEC_WIDEN_MULT_LO_EXPR
:
3144 case WIDEN_MULT_EXPR
:
3146 case WIDEN_MULT_PLUS_EXPR
:
3147 case WIDEN_MULT_MINUS_EXPR
:
3149 case MULT_HIGHPART_EXPR
:
3150 case TRUNC_DIV_EXPR
:
3152 case FLOOR_DIV_EXPR
:
3153 case ROUND_DIV_EXPR
:
3155 case EXACT_DIV_EXPR
:
3156 case TRUNC_MOD_EXPR
:
3158 case FLOOR_MOD_EXPR
:
3159 case ROUND_MOD_EXPR
:
3163 case TRUTH_NOT_EXPR
:
3165 case POSTINCREMENT_EXPR
:
3166 case POSTDECREMENT_EXPR
:
3167 case PREINCREMENT_EXPR
:
3168 case PREDECREMENT_EXPR
:
3174 case FIX_TRUNC_EXPR
:
3180 case ARRAY_RANGE_REF
:
3184 /* Special expressions. */
3190 case REDUC_MAX_EXPR
:
3191 case REDUC_MIN_EXPR
:
3192 case REDUC_PLUS_EXPR
:
3193 case VEC_UNPACK_HI_EXPR
:
3194 case VEC_UNPACK_LO_EXPR
:
3195 case VEC_UNPACK_FLOAT_HI_EXPR
:
3196 case VEC_UNPACK_FLOAT_LO_EXPR
:
3197 case VEC_PACK_TRUNC_EXPR
:
3198 case VEC_PACK_SAT_EXPR
:
3202 /* Return an arbitrarily high precedence to avoid surrounding single
3203 VAR_DECLs in ()s. */
3208 /* Return the priority of the operator OP. */
3211 op_prio (const_tree op
)
3213 enum tree_code code
;
3218 code
= TREE_CODE (op
);
3219 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
3220 return op_prio (TREE_OPERAND (op
, 0));
3222 return op_code_prio (code
);
3225 /* Return the symbol associated with operator CODE. */
3228 op_symbol_code (enum tree_code code
)
3236 case TRUTH_ORIF_EXPR
:
3239 case TRUTH_AND_EXPR
:
3240 case TRUTH_ANDIF_EXPR
:
3246 case TRUTH_XOR_EXPR
:
3256 case UNORDERED_EXPR
:
3302 case WIDEN_LSHIFT_EXPR
:
3305 case POINTER_PLUS_EXPR
:
3311 case REDUC_PLUS_EXPR
:
3314 case WIDEN_SUM_EXPR
:
3317 case WIDEN_MULT_EXPR
:
3320 case MULT_HIGHPART_EXPR
:
3330 case TRUTH_NOT_EXPR
:
3337 case TRUNC_DIV_EXPR
:
3344 case FLOOR_DIV_EXPR
:
3347 case ROUND_DIV_EXPR
:
3350 case EXACT_DIV_EXPR
:
3353 case TRUNC_MOD_EXPR
:
3359 case FLOOR_MOD_EXPR
:
3362 case ROUND_MOD_EXPR
:
3365 case PREDECREMENT_EXPR
:
3368 case PREINCREMENT_EXPR
:
3371 case POSTDECREMENT_EXPR
:
3374 case POSTINCREMENT_EXPR
:
3384 return "<<< ??? >>>";
3388 /* Return the symbol associated with operator OP. */
3391 op_symbol (const_tree op
)
3393 return op_symbol_code (TREE_CODE (op
));
3396 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
3397 the gimple_call_fn of a GIMPLE_CALL. */
3400 print_call_name (pretty_printer
*pp
, tree node
, int flags
)
3404 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
3405 op0
= TREE_OPERAND (op0
, 0);
3408 switch (TREE_CODE (op0
))
3413 dump_function_name (pp
, op0
, flags
);
3419 op0
= TREE_OPERAND (op0
, 0);
3424 dump_generic_node (pp
, TREE_OPERAND (op0
, 0), 0, flags
, false);
3425 pp_string (pp
, ") ? ");
3426 dump_generic_node (pp
, TREE_OPERAND (op0
, 1), 0, flags
, false);
3427 pp_string (pp
, " : ");
3428 dump_generic_node (pp
, TREE_OPERAND (op0
, 2), 0, flags
, false);
3432 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
3433 dump_function_name (pp
, TREE_OPERAND (op0
, 0), flags
);
3435 dump_generic_node (pp
, op0
, 0, flags
, false);
3439 if (integer_zerop (TREE_OPERAND (op0
, 1)))
3441 op0
= TREE_OPERAND (op0
, 0);
3448 dump_generic_node (pp
, op0
, 0, flags
, false);
3456 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
3459 pretty_print_string (pretty_printer
*pp
, const char *str
)
3469 pp_string (pp
, "\\b");
3473 pp_string (pp
, "\\f");
3477 pp_string (pp
, "\\n");
3481 pp_string (pp
, "\\r");
3485 pp_string (pp
, "\\t");
3489 pp_string (pp
, "\\v");
3493 pp_string (pp
, "\\\\");
3497 pp_string (pp
, "\\\"");
3501 pp_string (pp
, "\\'");
3504 /* No need to handle \0; the loop terminates on \0. */
3507 pp_string (pp
, "\\1");
3511 pp_string (pp
, "\\2");
3515 pp_string (pp
, "\\3");
3519 pp_string (pp
, "\\4");
3523 pp_string (pp
, "\\5");
3527 pp_string (pp
, "\\6");
3531 pp_string (pp
, "\\7");
3535 pp_character (pp
, str
[0]);
3543 maybe_init_pretty_print (FILE *file
)
3547 tree_pp
= new pretty_printer ();
3548 pp_needs_newline (tree_pp
) = true;
3549 pp_translate_identifiers (tree_pp
) = false;
3552 tree_pp
->buffer
->stream
= file
;
3556 newline_and_indent (pretty_printer
*pp
, int spc
)
3562 /* Handle a %K format for TEXT. Separate from default_tree_printer so
3563 it can also be used in front ends.
3564 %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
3568 percent_K_format (text_info
*text
)
3570 tree t
= va_arg (*text
->args_ptr
, tree
), block
;
3571 gcc_assert (text
->locus
!= NULL
);
3572 *text
->locus
= EXPR_LOCATION (t
);
3573 gcc_assert (pp_ti_abstract_origin (text
) != NULL
);
3574 block
= TREE_BLOCK (t
);
3575 *pp_ti_abstract_origin (text
) = NULL
;
3579 /* ??? LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those
3580 representing the outermost block of an inlined function.
3581 So walk the BLOCK tree until we hit such a scope. */
3583 && TREE_CODE (block
) == BLOCK
)
3585 if (inlined_function_outer_scope_p (block
))
3587 *pp_ti_abstract_origin (text
) = block
;
3590 block
= BLOCK_SUPERCONTEXT (block
);
3596 && TREE_CODE (block
) == BLOCK
3597 && BLOCK_ABSTRACT_ORIGIN (block
))
3599 tree ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3601 while (TREE_CODE (ao
) == BLOCK
3602 && BLOCK_ABSTRACT_ORIGIN (ao
)
3603 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3604 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3606 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3608 *pp_ti_abstract_origin (text
) = block
;
3611 block
= BLOCK_SUPERCONTEXT (block
);
3615 /* Print the identifier ID to PRETTY-PRINTER. */
3618 pp_tree_identifier (pretty_printer
*pp
, tree id
)
3620 if (pp_translate_identifiers (pp
))
3622 const char *text
= identifier_to_locale (IDENTIFIER_POINTER (id
));
3623 pp_append_text (pp
, text
, text
+ strlen (text
));
3626 pp_append_text (pp
, IDENTIFIER_POINTER (id
),
3627 IDENTIFIER_POINTER (id
) + IDENTIFIER_LENGTH (id
));
3630 /* A helper function that is used to dump function information before the
3634 dump_function_header (FILE *dump_file
, tree fdecl
, int flags
)
3636 const char *dname
, *aname
;
3637 struct cgraph_node
*node
= cgraph_node::get (fdecl
);
3638 struct function
*fun
= DECL_STRUCT_FUNCTION (fdecl
);
3640 dname
= lang_hooks
.decl_printable_name (fdecl
, 2);
3642 if (DECL_ASSEMBLER_NAME_SET_P (fdecl
))
3643 aname
= (IDENTIFIER_POINTER
3644 (DECL_ASSEMBLER_NAME (fdecl
)));
3646 aname
= "<unset-asm-name>";
3648 fprintf (dump_file
, "\n;; Function %s (%s, funcdef_no=%d",
3649 dname
, aname
, fun
->funcdef_no
);
3650 if (!(flags
& TDF_NOUID
))
3651 fprintf (dump_file
, ", decl_uid=%d", DECL_UID (fdecl
));
3654 fprintf (dump_file
, ", cgraph_uid=%d", node
->uid
);
3655 fprintf (dump_file
, ", symbol_order=%d)%s\n\n", node
->order
,
3656 node
->frequency
== NODE_FREQUENCY_HOT
3658 : node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
3659 ? " (unlikely executed)"
3660 : node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
3661 ? " (executed once)"
3665 fprintf (dump_file
, ")\n\n");
3668 /* Dump double_int D to pretty_printer PP. UNS is true
3669 if D is unsigned and false otherwise. */
3671 pp_double_int (pretty_printer
*pp
, double_int d
, bool uns
)
3674 pp_wide_integer (pp
, d
.low
);
3675 else if (d
.fits_uhwi ())
3676 pp_unsigned_wide_integer (pp
, d
.low
);
3679 unsigned HOST_WIDE_INT low
= d
.low
;
3680 HOST_WIDE_INT high
= d
.high
;
3681 if (!uns
&& d
.is_negative ())
3684 high
= ~high
+ !low
;
3687 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
3689 sprintf (pp_buffer (pp
)->digit_buffer
,
3690 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
3691 (unsigned HOST_WIDE_INT
) high
, low
);
3692 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);