1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001-2015 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"
29 #include "stor-layout.h"
30 #include "hard-reg-set.h"
34 #include "insn-config.h"
43 #include "tree-pretty-print.h"
44 #include "gimple-expr.h"
47 #include "plugin-api.h"
50 #include "langhooks.h"
51 #include "tree-iterator.h"
52 #include "tree-chrec.h"
54 #include "value-prof.h"
55 #include "wide-int-print.h"
56 #include "internal-fn.h"
57 #include "gomp-constants.h"
59 /* Local functions, macros and variables. */
60 static const char *op_symbol (const_tree
);
61 static void pretty_print_string (pretty_printer
*, const char*);
62 static void newline_and_indent (pretty_printer
*, int);
63 static void maybe_init_pretty_print (FILE *);
64 static void print_struct_decl (pretty_printer
*, const_tree
, int, int);
65 static void do_niy (pretty_printer
*, const_tree
);
67 #define INDENT(SPACE) do { \
68 int i; for (i = 0; i<SPACE; i++) pp_space (pp); } while (0)
70 #define NIY do_niy (pp, node)
72 static pretty_printer
*tree_pp
;
74 /* Try to print something for an unknown tree code. */
77 do_niy (pretty_printer
*pp
, const_tree node
)
81 pp_string (pp
, "<<< Unknown tree: ");
82 pp_string (pp
, get_tree_code_name (TREE_CODE (node
)));
86 len
= TREE_OPERAND_LENGTH (node
);
87 for (i
= 0; i
< len
; ++i
)
89 newline_and_indent (pp
, 2);
90 dump_generic_node (pp
, TREE_OPERAND (node
, i
), 2, 0, false);
94 pp_string (pp
, " >>>");
97 /* Debugging function to print out a generic expression. */
100 debug_generic_expr (tree t
)
102 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
103 fprintf (stderr
, "\n");
106 /* Debugging function to print out a generic statement. */
109 debug_generic_stmt (tree t
)
111 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
112 fprintf (stderr
, "\n");
115 /* Debugging function to print out a chain of trees . */
118 debug_tree_chain (tree t
)
124 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
125 fprintf (stderr
, " ");
129 fprintf (stderr
, "... [cycled back to ");
130 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
131 fprintf (stderr
, "]");
135 fprintf (stderr
, "\n");
138 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
140 print_generic_decl (FILE *file
, tree decl
, int flags
)
142 maybe_init_pretty_print (file
);
143 print_declaration (tree_pp
, decl
, 2, flags
);
144 pp_write_text_to_stream (tree_pp
);
147 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
148 to show in the dump. See TDF_* in dumpfile.h. */
151 print_generic_stmt (FILE *file
, tree t
, int flags
)
153 maybe_init_pretty_print (file
);
154 dump_generic_node (tree_pp
, t
, 0, flags
, true);
155 pp_newline_and_flush (tree_pp
);
158 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
159 to show in the dump. See TDF_* in dumpfile.h. The output is indented by
163 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
167 maybe_init_pretty_print (file
);
169 for (i
= 0; i
< indent
; i
++)
171 dump_generic_node (tree_pp
, t
, indent
, flags
, true);
172 pp_newline_and_flush (tree_pp
);
175 /* Print a single expression T on file FILE. FLAGS specifies details to show
176 in the dump. See TDF_* in dumpfile.h. */
179 print_generic_expr (FILE *file
, tree t
, int flags
)
181 maybe_init_pretty_print (file
);
182 dump_generic_node (tree_pp
, t
, 0, flags
, false);
186 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
190 dump_decl_name (pretty_printer
*pp
, tree node
, int flags
)
192 if (DECL_NAME (node
))
194 if ((flags
& TDF_ASMNAME
) && DECL_ASSEMBLER_NAME_SET_P (node
))
195 pp_tree_identifier (pp
, DECL_ASSEMBLER_NAME (node
));
197 pp_tree_identifier (pp
, DECL_NAME (node
));
199 if ((flags
& TDF_UID
) || DECL_NAME (node
) == NULL_TREE
)
201 if (TREE_CODE (node
) == LABEL_DECL
&& LABEL_DECL_UID (node
) != -1)
202 pp_printf (pp
, "L.%d", (int) LABEL_DECL_UID (node
));
203 else if (TREE_CODE (node
) == DEBUG_EXPR_DECL
)
205 if (flags
& TDF_NOUID
)
206 pp_string (pp
, "D#xxxx");
208 pp_printf (pp
, "D#%i", DEBUG_TEMP_UID (node
));
212 char c
= TREE_CODE (node
) == CONST_DECL
? 'C' : 'D';
213 if (flags
& TDF_NOUID
)
214 pp_printf (pp
, "%c.xxxx", c
);
216 pp_printf (pp
, "%c.%u", c
, DECL_UID (node
));
219 if ((flags
& TDF_ALIAS
) && DECL_PT_UID (node
) != DECL_UID (node
))
221 if (flags
& TDF_NOUID
)
222 pp_printf (pp
, "ptD.xxxx");
224 pp_printf (pp
, "ptD.%u", DECL_PT_UID (node
));
228 /* Like the above, but used for pretty printing function calls. */
231 dump_function_name (pretty_printer
*pp
, tree node
, int flags
)
233 if (CONVERT_EXPR_P (node
))
234 node
= TREE_OPERAND (node
, 0);
235 if (DECL_NAME (node
) && (flags
& TDF_ASMNAME
) == 0)
236 pp_string (pp
, lang_hooks
.decl_printable_name (node
, 1));
238 dump_decl_name (pp
, node
, flags
);
241 /* Dump a function declaration. NODE is the FUNCTION_TYPE. PP, SPC and
242 FLAGS are as in dump_generic_node. */
245 dump_function_declaration (pretty_printer
*pp
, tree node
,
248 bool wrote_arg
= false;
254 /* Print the argument types. */
255 arg
= TYPE_ARG_TYPES (node
);
256 while (arg
&& arg
!= void_list_node
&& arg
!= error_mark_node
)
264 dump_generic_node (pp
, TREE_VALUE (arg
), spc
, flags
, false);
265 arg
= TREE_CHAIN (arg
);
268 /* Drop the trailing void_type_node if we had any previous argument. */
269 if (arg
== void_list_node
&& !wrote_arg
)
270 pp_string (pp
, "void");
271 /* Properly dump vararg function types. */
272 else if (!arg
&& wrote_arg
)
273 pp_string (pp
, ", ...");
274 /* Avoid printing any arg for unprototyped functions. */
279 /* Dump the domain associated with an array. */
282 dump_array_domain (pretty_printer
*pp
, tree domain
, int spc
, int flags
)
284 pp_left_bracket (pp
);
287 tree min
= TYPE_MIN_VALUE (domain
);
288 tree max
= TYPE_MAX_VALUE (domain
);
291 && integer_zerop (min
)
292 && tree_fits_shwi_p (max
))
293 pp_wide_integer (pp
, tree_to_shwi (max
) + 1);
297 dump_generic_node (pp
, min
, spc
, flags
, false);
300 dump_generic_node (pp
, max
, spc
, flags
, false);
304 pp_string (pp
, "<unknown>");
305 pp_right_bracket (pp
);
309 /* Dump OpenMP clause CLAUSE. PP, CLAUSE, SPC and FLAGS are as in
310 dump_generic_node. */
313 dump_omp_clause (pretty_printer
*pp
, tree clause
, int spc
, int flags
)
317 switch (OMP_CLAUSE_CODE (clause
))
319 case OMP_CLAUSE_PRIVATE
:
322 case OMP_CLAUSE_SHARED
:
325 case OMP_CLAUSE_FIRSTPRIVATE
:
326 name
= "firstprivate";
328 case OMP_CLAUSE_LASTPRIVATE
:
329 name
= "lastprivate";
331 case OMP_CLAUSE_COPYIN
:
334 case OMP_CLAUSE_COPYPRIVATE
:
335 name
= "copyprivate";
337 case OMP_CLAUSE_UNIFORM
:
340 case OMP_CLAUSE__LOOPTEMP_
:
343 case OMP_CLAUSE_DEVICE_RESIDENT
:
344 name
= "device_resident";
346 case OMP_CLAUSE_USE_DEVICE
:
350 pp_string (pp
, name
);
352 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
357 case OMP_CLAUSE_REDUCTION
:
358 pp_string (pp
, "reduction(");
359 if (OMP_CLAUSE_REDUCTION_CODE (clause
) != ERROR_MARK
)
362 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
365 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
371 pp_string (pp
, "if(");
372 dump_generic_node (pp
, OMP_CLAUSE_IF_EXPR (clause
),
377 case OMP_CLAUSE_NUM_THREADS
:
378 pp_string (pp
, "num_threads(");
379 dump_generic_node (pp
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
384 case OMP_CLAUSE__CILK_FOR_COUNT_
:
385 pp_string (pp
, "_Cilk_for_count_(");
386 dump_generic_node (pp
, OMP_CLAUSE_OPERAND (clause
, 0),
391 case OMP_CLAUSE_NOWAIT
:
392 pp_string (pp
, "nowait");
394 case OMP_CLAUSE_ORDERED
:
395 pp_string (pp
, "ordered");
398 case OMP_CLAUSE_DEFAULT
:
399 pp_string (pp
, "default(");
400 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
402 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
404 case OMP_CLAUSE_DEFAULT_SHARED
:
405 pp_string (pp
, "shared");
407 case OMP_CLAUSE_DEFAULT_NONE
:
408 pp_string (pp
, "none");
410 case OMP_CLAUSE_DEFAULT_PRIVATE
:
411 pp_string (pp
, "private");
413 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
414 pp_string (pp
, "firstprivate");
422 case OMP_CLAUSE_SCHEDULE
:
423 pp_string (pp
, "schedule(");
424 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
426 case OMP_CLAUSE_SCHEDULE_STATIC
:
427 pp_string (pp
, "static");
429 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
430 pp_string (pp
, "dynamic");
432 case OMP_CLAUSE_SCHEDULE_GUIDED
:
433 pp_string (pp
, "guided");
435 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
436 pp_string (pp
, "runtime");
438 case OMP_CLAUSE_SCHEDULE_AUTO
:
439 pp_string (pp
, "auto");
441 case OMP_CLAUSE_SCHEDULE_CILKFOR
:
442 pp_string (pp
, "cilk-for grain");
447 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
450 dump_generic_node (pp
, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
456 case OMP_CLAUSE_UNTIED
:
457 pp_string (pp
, "untied");
460 case OMP_CLAUSE_COLLAPSE
:
461 pp_string (pp
, "collapse(");
462 dump_generic_node (pp
, OMP_CLAUSE_COLLAPSE_EXPR (clause
),
467 case OMP_CLAUSE_FINAL
:
468 pp_string (pp
, "final(");
469 dump_generic_node (pp
, OMP_CLAUSE_FINAL_EXPR (clause
),
474 case OMP_CLAUSE_MERGEABLE
:
475 pp_string (pp
, "mergeable");
478 case OMP_CLAUSE_LINEAR
:
479 pp_string (pp
, "linear(");
480 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
483 dump_generic_node (pp
, OMP_CLAUSE_LINEAR_STEP (clause
),
488 case OMP_CLAUSE_ALIGNED
:
489 pp_string (pp
, "aligned(");
490 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
492 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
))
495 dump_generic_node (pp
, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
),
501 case OMP_CLAUSE_DEPEND
:
502 pp_string (pp
, "depend(");
503 switch (OMP_CLAUSE_DEPEND_KIND (clause
))
505 case OMP_CLAUSE_DEPEND_IN
:
506 pp_string (pp
, "in");
508 case OMP_CLAUSE_DEPEND_OUT
:
509 pp_string (pp
, "out");
511 case OMP_CLAUSE_DEPEND_INOUT
:
512 pp_string (pp
, "inout");
518 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
524 pp_string (pp
, "map(");
525 switch (OMP_CLAUSE_MAP_KIND (clause
))
528 case GOMP_MAP_POINTER
:
529 pp_string (pp
, "alloc");
532 case GOMP_MAP_TO_PSET
:
533 pp_string (pp
, "to");
536 pp_string (pp
, "from");
538 case GOMP_MAP_TOFROM
:
539 pp_string (pp
, "tofrom");
541 case GOMP_MAP_FORCE_ALLOC
:
542 pp_string (pp
, "force_alloc");
544 case GOMP_MAP_FORCE_TO
:
545 pp_string (pp
, "force_to");
547 case GOMP_MAP_FORCE_FROM
:
548 pp_string (pp
, "force_from");
550 case GOMP_MAP_FORCE_TOFROM
:
551 pp_string (pp
, "force_tofrom");
553 case GOMP_MAP_FORCE_PRESENT
:
554 pp_string (pp
, "force_present");
556 case GOMP_MAP_FORCE_DEALLOC
:
557 pp_string (pp
, "force_dealloc");
559 case GOMP_MAP_FORCE_DEVICEPTR
:
560 pp_string (pp
, "force_deviceptr");
566 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
569 if (OMP_CLAUSE_SIZE (clause
))
571 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
572 && OMP_CLAUSE_MAP_KIND (clause
) == GOMP_MAP_POINTER
)
573 pp_string (pp
, " [pointer assign, bias: ");
574 else if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
575 && OMP_CLAUSE_MAP_KIND (clause
) == GOMP_MAP_TO_PSET
)
576 pp_string (pp
, " [pointer set, len: ");
578 pp_string (pp
, " [len: ");
579 dump_generic_node (pp
, OMP_CLAUSE_SIZE (clause
),
581 pp_right_bracket (pp
);
586 case OMP_CLAUSE_FROM
:
587 pp_string (pp
, "from(");
588 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
590 goto print_clause_size
;
593 pp_string (pp
, "to(");
594 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
596 goto print_clause_size
;
598 case OMP_CLAUSE__CACHE_
:
600 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
602 goto print_clause_size
;
604 case OMP_CLAUSE_NUM_TEAMS
:
605 pp_string (pp
, "num_teams(");
606 dump_generic_node (pp
, OMP_CLAUSE_NUM_TEAMS_EXPR (clause
),
611 case OMP_CLAUSE_THREAD_LIMIT
:
612 pp_string (pp
, "thread_limit(");
613 dump_generic_node (pp
, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause
),
618 case OMP_CLAUSE_DEVICE
:
619 pp_string (pp
, "device(");
620 dump_generic_node (pp
, OMP_CLAUSE_DEVICE_ID (clause
),
625 case OMP_CLAUSE_DIST_SCHEDULE
:
626 pp_string (pp
, "dist_schedule(static");
627 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
))
630 dump_generic_node (pp
,
631 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
),
637 case OMP_CLAUSE_PROC_BIND
:
638 pp_string (pp
, "proc_bind(");
639 switch (OMP_CLAUSE_PROC_BIND_KIND (clause
))
641 case OMP_CLAUSE_PROC_BIND_MASTER
:
642 pp_string (pp
, "master");
644 case OMP_CLAUSE_PROC_BIND_CLOSE
:
645 pp_string (pp
, "close");
647 case OMP_CLAUSE_PROC_BIND_SPREAD
:
648 pp_string (pp
, "spread");
656 case OMP_CLAUSE_SAFELEN
:
657 pp_string (pp
, "safelen(");
658 dump_generic_node (pp
, OMP_CLAUSE_SAFELEN_EXPR (clause
),
663 case OMP_CLAUSE_SIMDLEN
:
664 pp_string (pp
, "simdlen(");
665 dump_generic_node (pp
, OMP_CLAUSE_SIMDLEN_EXPR (clause
),
670 case OMP_CLAUSE__SIMDUID_
:
671 pp_string (pp
, "_simduid_(");
672 dump_generic_node (pp
, OMP_CLAUSE__SIMDUID__DECL (clause
),
677 case OMP_CLAUSE_GANG
:
678 pp_string (pp
, "gang");
679 if (OMP_CLAUSE_GANG_EXPR (clause
) != NULL_TREE
)
681 pp_string (pp
, "(num: ");
682 dump_generic_node (pp
, OMP_CLAUSE_GANG_EXPR (clause
),
685 if (OMP_CLAUSE_GANG_STATIC_EXPR (clause
) != NULL_TREE
)
687 if (OMP_CLAUSE_GANG_EXPR (clause
) == NULL_TREE
)
691 pp_string (pp
, "static:");
692 if (OMP_CLAUSE_GANG_STATIC_EXPR (clause
)
693 == integer_minus_one_node
)
694 pp_character (pp
, '*');
696 dump_generic_node (pp
, OMP_CLAUSE_GANG_STATIC_EXPR (clause
),
699 if (OMP_CLAUSE_GANG_EXPR (clause
) != NULL_TREE
700 || OMP_CLAUSE_GANG_STATIC_EXPR (clause
) != NULL_TREE
)
704 case OMP_CLAUSE_ASYNC
:
705 pp_string (pp
, "async");
706 if (OMP_CLAUSE_ASYNC_EXPR (clause
))
708 pp_character(pp
, '(');
709 dump_generic_node (pp
, OMP_CLAUSE_ASYNC_EXPR (clause
),
711 pp_character(pp
, ')');
715 case OMP_CLAUSE_AUTO
:
717 pp_string (pp
, omp_clause_code_name
[OMP_CLAUSE_CODE (clause
)]);
720 case OMP_CLAUSE_WAIT
:
721 pp_string (pp
, "wait(");
722 dump_generic_node (pp
, OMP_CLAUSE_WAIT_EXPR (clause
),
724 pp_character(pp
, ')');
727 case OMP_CLAUSE_WORKER
:
728 pp_string (pp
, "worker");
729 if (OMP_CLAUSE_WORKER_EXPR (clause
) != NULL_TREE
)
732 dump_generic_node (pp
, OMP_CLAUSE_WORKER_EXPR (clause
),
738 case OMP_CLAUSE_VECTOR
:
739 pp_string (pp
, "vector");
740 if (OMP_CLAUSE_VECTOR_EXPR (clause
) != NULL_TREE
)
743 dump_generic_node (pp
, OMP_CLAUSE_VECTOR_EXPR (clause
),
749 case OMP_CLAUSE_NUM_GANGS
:
750 pp_string (pp
, "num_gangs(");
751 dump_generic_node (pp
, OMP_CLAUSE_NUM_GANGS_EXPR (clause
),
753 pp_character (pp
, ')');
756 case OMP_CLAUSE_NUM_WORKERS
:
757 pp_string (pp
, "num_workers(");
758 dump_generic_node (pp
, OMP_CLAUSE_NUM_WORKERS_EXPR (clause
),
760 pp_character (pp
, ')');
763 case OMP_CLAUSE_VECTOR_LENGTH
:
764 pp_string (pp
, "vector_length(");
765 dump_generic_node (pp
, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause
),
767 pp_character (pp
, ')');
770 case OMP_CLAUSE_INBRANCH
:
771 pp_string (pp
, "inbranch");
773 case OMP_CLAUSE_NOTINBRANCH
:
774 pp_string (pp
, "notinbranch");
777 pp_string (pp
, "for");
779 case OMP_CLAUSE_PARALLEL
:
780 pp_string (pp
, "parallel");
782 case OMP_CLAUSE_SECTIONS
:
783 pp_string (pp
, "sections");
785 case OMP_CLAUSE_TASKGROUP
:
786 pp_string (pp
, "taskgroup");
788 case OMP_CLAUSE_INDEPENDENT
:
789 pp_string (pp
, "independent");
793 /* Should never happen. */
794 dump_generic_node (pp
, clause
, spc
, flags
, false);
800 /* Dump the list of OpenMP clauses. PP, SPC and FLAGS are as in
801 dump_generic_node. */
804 dump_omp_clauses (pretty_printer
*pp
, tree clause
, int spc
, int flags
)
812 dump_omp_clause (pp
, clause
, spc
, flags
);
813 clause
= OMP_CLAUSE_CHAIN (clause
);
821 /* Dump location LOC to PP. */
824 dump_location (pretty_printer
*pp
, location_t loc
)
826 expanded_location xloc
= expand_location (loc
);
828 pp_left_bracket (pp
);
831 pp_string (pp
, xloc
.file
);
834 pp_decimal_int (pp
, xloc
.line
);
836 pp_decimal_int (pp
, xloc
.column
);
837 pp_string (pp
, "] ");
841 /* Dump lexical block BLOCK. PP, SPC and FLAGS are as in
842 dump_generic_node. */
845 dump_block_node (pretty_printer
*pp
, tree block
, int spc
, int flags
)
849 pp_printf (pp
, "BLOCK #%d ", BLOCK_NUMBER (block
));
851 if (flags
& TDF_ADDRESS
)
852 pp_printf (pp
, "[%p] ", (void *) block
);
854 if (BLOCK_ABSTRACT (block
))
855 pp_string (pp
, "[abstract] ");
857 if (TREE_ASM_WRITTEN (block
))
858 pp_string (pp
, "[written] ");
860 if (flags
& TDF_SLIM
)
863 if (BLOCK_SOURCE_LOCATION (block
))
864 dump_location (pp
, BLOCK_SOURCE_LOCATION (block
));
866 newline_and_indent (pp
, spc
+ 2);
868 if (BLOCK_SUPERCONTEXT (block
))
870 pp_string (pp
, "SUPERCONTEXT: ");
871 dump_generic_node (pp
, BLOCK_SUPERCONTEXT (block
), 0,
872 flags
| TDF_SLIM
, false);
873 newline_and_indent (pp
, spc
+ 2);
876 if (BLOCK_SUBBLOCKS (block
))
878 pp_string (pp
, "SUBBLOCKS: ");
879 for (t
= BLOCK_SUBBLOCKS (block
); t
; t
= BLOCK_CHAIN (t
))
881 dump_generic_node (pp
, t
, 0, flags
| TDF_SLIM
, false);
884 newline_and_indent (pp
, spc
+ 2);
887 if (BLOCK_CHAIN (block
))
889 pp_string (pp
, "SIBLINGS: ");
890 for (t
= BLOCK_CHAIN (block
); t
; t
= BLOCK_CHAIN (t
))
892 dump_generic_node (pp
, t
, 0, flags
| TDF_SLIM
, false);
895 newline_and_indent (pp
, spc
+ 2);
898 if (BLOCK_VARS (block
))
900 pp_string (pp
, "VARS: ");
901 for (t
= BLOCK_VARS (block
); t
; t
= TREE_CHAIN (t
))
903 dump_generic_node (pp
, t
, 0, flags
, false);
906 newline_and_indent (pp
, spc
+ 2);
909 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block
)) > 0)
912 vec
<tree
, va_gc
> *nlv
= BLOCK_NONLOCALIZED_VARS (block
);
914 pp_string (pp
, "NONLOCALIZED_VARS: ");
915 FOR_EACH_VEC_ELT (*nlv
, i
, t
)
917 dump_generic_node (pp
, t
, 0, flags
, false);
920 newline_and_indent (pp
, spc
+ 2);
923 if (BLOCK_ABSTRACT_ORIGIN (block
))
925 pp_string (pp
, "ABSTRACT_ORIGIN: ");
926 dump_generic_node (pp
, BLOCK_ABSTRACT_ORIGIN (block
), 0,
927 flags
| TDF_SLIM
, false);
928 newline_and_indent (pp
, spc
+ 2);
931 if (BLOCK_FRAGMENT_ORIGIN (block
))
933 pp_string (pp
, "FRAGMENT_ORIGIN: ");
934 dump_generic_node (pp
, BLOCK_FRAGMENT_ORIGIN (block
), 0,
935 flags
| TDF_SLIM
, false);
936 newline_and_indent (pp
, spc
+ 2);
939 if (BLOCK_FRAGMENT_CHAIN (block
))
941 pp_string (pp
, "FRAGMENT_CHAIN: ");
942 for (t
= BLOCK_FRAGMENT_CHAIN (block
); t
; t
= BLOCK_FRAGMENT_CHAIN (t
))
944 dump_generic_node (pp
, t
, 0, flags
| TDF_SLIM
, false);
947 newline_and_indent (pp
, spc
+ 2);
952 /* Dump the node NODE on the pretty_printer PP, SPC spaces of
953 indent. FLAGS specifies details to show in the dump (see TDF_* in
954 dumpfile.h). If IS_STMT is true, the object printed is considered
955 to be a statement and it is terminated by ';' if appropriate. */
958 dump_generic_node (pretty_printer
*pp
, tree node
, int spc
, int flags
,
967 if (node
== NULL_TREE
)
970 is_expr
= EXPR_P (node
);
972 if (is_stmt
&& (flags
& TDF_STMTADDR
))
973 pp_printf (pp
, "<&%p> ", (void *)node
);
975 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
976 dump_location (pp
, EXPR_LOCATION (node
));
978 code
= TREE_CODE (node
);
982 pp_string (pp
, "<<< error >>>");
985 case IDENTIFIER_NODE
:
986 pp_tree_identifier (pp
, node
);
990 while (node
&& node
!= error_mark_node
)
992 if (TREE_PURPOSE (node
))
994 dump_generic_node (pp
, TREE_PURPOSE (node
), spc
, flags
, false);
997 dump_generic_node (pp
, TREE_VALUE (node
), spc
, flags
, false);
998 node
= TREE_CHAIN (node
);
999 if (node
&& TREE_CODE (node
) == TREE_LIST
)
1008 dump_generic_node (pp
, BINFO_TYPE (node
), spc
, flags
, false);
1014 if (TREE_VEC_LENGTH (node
) > 0)
1016 size_t len
= TREE_VEC_LENGTH (node
);
1017 for (i
= 0; i
< len
- 1; i
++)
1019 dump_generic_node (pp
, TREE_VEC_ELT (node
, i
), spc
, flags
,
1024 dump_generic_node (pp
, TREE_VEC_ELT (node
, len
- 1), spc
,
1031 case POINTER_BOUNDS_TYPE
:
1034 case FIXED_POINT_TYPE
:
1040 unsigned int quals
= TYPE_QUALS (node
);
1041 enum tree_code_class tclass
;
1043 if (quals
& TYPE_QUAL_ATOMIC
)
1044 pp_string (pp
, "atomic ");
1045 if (quals
& TYPE_QUAL_CONST
)
1046 pp_string (pp
, "const ");
1047 else if (quals
& TYPE_QUAL_VOLATILE
)
1048 pp_string (pp
, "volatile ");
1049 else if (quals
& TYPE_QUAL_RESTRICT
)
1050 pp_string (pp
, "restrict ");
1052 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1054 pp_string (pp
, "<address-space-");
1055 pp_decimal_int (pp
, TYPE_ADDR_SPACE (node
));
1056 pp_string (pp
, "> ");
1059 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
1061 if (tclass
== tcc_declaration
)
1063 if (DECL_NAME (node
))
1064 dump_decl_name (pp
, node
, flags
);
1066 pp_string (pp
, "<unnamed type decl>");
1068 else if (tclass
== tcc_type
)
1070 if (TYPE_NAME (node
))
1072 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
1073 pp_tree_identifier (pp
, TYPE_NAME (node
));
1074 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
1075 && DECL_NAME (TYPE_NAME (node
)))
1076 dump_decl_name (pp
, TYPE_NAME (node
), flags
);
1078 pp_string (pp
, "<unnamed type>");
1080 else if (TREE_CODE (node
) == VECTOR_TYPE
)
1082 pp_string (pp
, "vector");
1084 pp_wide_integer (pp
, TYPE_VECTOR_SUBPARTS (node
));
1085 pp_string (pp
, ") ");
1086 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1088 else if (TREE_CODE (node
) == INTEGER_TYPE
)
1090 if (TYPE_PRECISION (node
) == CHAR_TYPE_SIZE
)
1091 pp_string (pp
, (TYPE_UNSIGNED (node
)
1094 else if (TYPE_PRECISION (node
) == SHORT_TYPE_SIZE
)
1095 pp_string (pp
, (TYPE_UNSIGNED (node
)
1098 else if (TYPE_PRECISION (node
) == INT_TYPE_SIZE
)
1099 pp_string (pp
, (TYPE_UNSIGNED (node
)
1102 else if (TYPE_PRECISION (node
) == LONG_TYPE_SIZE
)
1103 pp_string (pp
, (TYPE_UNSIGNED (node
)
1106 else if (TYPE_PRECISION (node
) == LONG_LONG_TYPE_SIZE
)
1107 pp_string (pp
, (TYPE_UNSIGNED (node
)
1108 ? "unsigned long long"
1109 : "signed long long"));
1110 else if (TYPE_PRECISION (node
) >= CHAR_TYPE_SIZE
1111 && exact_log2 (TYPE_PRECISION (node
)) != -1)
1113 pp_string (pp
, (TYPE_UNSIGNED (node
) ? "uint" : "int"));
1114 pp_decimal_int (pp
, TYPE_PRECISION (node
));
1115 pp_string (pp
, "_t");
1119 pp_string (pp
, (TYPE_UNSIGNED (node
)
1120 ? "<unnamed-unsigned:"
1121 : "<unnamed-signed:"));
1122 pp_decimal_int (pp
, TYPE_PRECISION (node
));
1126 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
1128 pp_string (pp
, "__complex__ ");
1129 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1131 else if (TREE_CODE (node
) == REAL_TYPE
)
1133 pp_string (pp
, "<float:");
1134 pp_decimal_int (pp
, TYPE_PRECISION (node
));
1137 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
1139 pp_string (pp
, "<fixed-point-");
1140 pp_string (pp
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
1141 pp_decimal_int (pp
, TYPE_PRECISION (node
));
1144 else if (TREE_CODE (node
) == VOID_TYPE
)
1145 pp_string (pp
, "void");
1147 pp_string (pp
, "<unnamed type>");
1153 case REFERENCE_TYPE
:
1154 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
1156 if (TREE_TYPE (node
) == NULL
)
1158 pp_string (pp
, str
);
1159 pp_string (pp
, "<null type>");
1161 else if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
1163 tree fnode
= TREE_TYPE (node
);
1165 dump_generic_node (pp
, TREE_TYPE (fnode
), spc
, flags
, false);
1168 pp_string (pp
, str
);
1169 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1170 dump_decl_name (pp
, TYPE_NAME (node
), flags
);
1171 else if (flags
& TDF_NOUID
)
1172 pp_printf (pp
, "<Txxxx>");
1174 pp_printf (pp
, "<T%x>", TYPE_UID (node
));
1176 pp_right_paren (pp
);
1177 dump_function_declaration (pp
, fnode
, spc
, flags
);
1181 unsigned int quals
= TYPE_QUALS (node
);
1183 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1185 pp_string (pp
, str
);
1187 if (quals
& TYPE_QUAL_CONST
)
1188 pp_string (pp
, " const");
1189 if (quals
& TYPE_QUAL_VOLATILE
)
1190 pp_string (pp
, " volatile");
1191 if (quals
& TYPE_QUAL_RESTRICT
)
1192 pp_string (pp
, " restrict");
1194 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1196 pp_string (pp
, " <address-space-");
1197 pp_decimal_int (pp
, TYPE_ADDR_SPACE (node
));
1201 if (TYPE_REF_CAN_ALIAS_ALL (node
))
1202 pp_string (pp
, " {ref-all}");
1212 if (integer_zerop (TREE_OPERAND (node
, 1))
1213 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1214 infer them and MEM_ATTR caching will share MEM_REFs
1215 with differently-typed op0s. */
1216 && TREE_CODE (TREE_OPERAND (node
, 0)) != INTEGER_CST
1217 /* Released SSA_NAMES have no TREE_TYPE. */
1218 && TREE_TYPE (TREE_OPERAND (node
, 0)) != NULL_TREE
1219 /* Same pointer types, but ignoring POINTER_TYPE vs.
1221 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1222 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1223 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1224 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1225 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 0)))
1226 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 1))))
1227 /* Same value types ignoring qualifiers. */
1228 && (TYPE_MAIN_VARIANT (TREE_TYPE (node
))
1229 == TYPE_MAIN_VARIANT
1230 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1)))))
1231 && (!(flags
& TDF_ALIAS
)
1232 || MR_DEPENDENCE_CLIQUE (node
) == 0))
1234 if (TREE_CODE (TREE_OPERAND (node
, 0)) != ADDR_EXPR
)
1237 dump_generic_node (pp
, TREE_OPERAND (node
, 0),
1241 dump_generic_node (pp
,
1242 TREE_OPERAND (TREE_OPERAND (node
, 0), 0),
1249 pp_string (pp
, "MEM[");
1251 ptype
= TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node
, 1)));
1252 dump_generic_node (pp
, ptype
,
1253 spc
, flags
| TDF_SLIM
, false);
1254 pp_right_paren (pp
);
1255 dump_generic_node (pp
, TREE_OPERAND (node
, 0),
1257 if (!integer_zerop (TREE_OPERAND (node
, 1)))
1259 pp_string (pp
, " + ");
1260 dump_generic_node (pp
, TREE_OPERAND (node
, 1),
1263 if ((flags
& TDF_ALIAS
)
1264 && MR_DEPENDENCE_CLIQUE (node
) != 0)
1266 pp_string (pp
, " clique ");
1267 pp_unsigned_wide_integer (pp
, MR_DEPENDENCE_CLIQUE (node
));
1268 pp_string (pp
, " base ");
1269 pp_unsigned_wide_integer (pp
, MR_DEPENDENCE_BASE (node
));
1271 pp_right_bracket (pp
);
1276 case TARGET_MEM_REF
:
1278 const char *sep
= "";
1281 pp_string (pp
, "MEM[");
1283 if (TREE_CODE (TMR_BASE (node
)) == ADDR_EXPR
)
1285 pp_string (pp
, sep
);
1287 pp_string (pp
, "symbol: ");
1288 dump_generic_node (pp
, TREE_OPERAND (TMR_BASE (node
), 0),
1293 pp_string (pp
, sep
);
1295 pp_string (pp
, "base: ");
1296 dump_generic_node (pp
, TMR_BASE (node
), spc
, flags
, false);
1298 tmp
= TMR_INDEX2 (node
);
1301 pp_string (pp
, sep
);
1303 pp_string (pp
, "base: ");
1304 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1306 tmp
= TMR_INDEX (node
);
1309 pp_string (pp
, sep
);
1311 pp_string (pp
, "index: ");
1312 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1314 tmp
= TMR_STEP (node
);
1317 pp_string (pp
, sep
);
1319 pp_string (pp
, "step: ");
1320 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1322 tmp
= TMR_OFFSET (node
);
1325 pp_string (pp
, sep
);
1327 pp_string (pp
, "offset: ");
1328 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1330 pp_right_bracket (pp
);
1338 /* Print the innermost component type. */
1339 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
1340 tmp
= TREE_TYPE (tmp
))
1342 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1344 /* Print the dimensions. */
1345 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
1346 dump_array_domain (pp
, TYPE_DOMAIN (tmp
), spc
, flags
);
1352 case QUAL_UNION_TYPE
:
1354 unsigned int quals
= TYPE_QUALS (node
);
1356 if (quals
& TYPE_QUAL_ATOMIC
)
1357 pp_string (pp
, "atomic ");
1358 if (quals
& TYPE_QUAL_CONST
)
1359 pp_string (pp
, "const ");
1360 if (quals
& TYPE_QUAL_VOLATILE
)
1361 pp_string (pp
, "volatile ");
1363 /* Print the name of the structure. */
1364 if (TREE_CODE (node
) == RECORD_TYPE
)
1365 pp_string (pp
, "struct ");
1366 else if (TREE_CODE (node
) == UNION_TYPE
)
1367 pp_string (pp
, "union ");
1369 if (TYPE_NAME (node
))
1370 dump_generic_node (pp
, TYPE_NAME (node
), spc
, flags
, false);
1371 else if (!(flags
& TDF_SLIM
))
1372 /* FIXME: If we eliminate the 'else' above and attempt
1373 to show the fields for named types, we may get stuck
1374 following a cycle of pointers to structs. The alleged
1375 self-reference check in print_struct_decl will not detect
1376 cycles involving more than one pointer or struct type. */
1377 print_struct_decl (pp
, node
, spc
, flags
);
1386 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
1388 /* In the case of a pointer, one may want to divide by the
1389 size of the pointed-to type. Unfortunately, this not
1390 straightforward. The C front-end maps expressions
1395 in such a way that the two INTEGER_CST nodes for "5" have
1396 different values but identical types. In the latter
1397 case, the 5 is multiplied by sizeof (int) in c-common.c
1398 (pointer_int_sum) to convert it to a byte address, and
1399 yet the type of the node is left unchanged. Argh. What
1400 is consistent though is that the number value corresponds
1401 to bytes (UNITS) offset.
1403 NB: Neither of the following divisors can be trivially
1404 used to recover the original literal:
1406 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1407 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1408 pp_wide_integer (pp
, TREE_INT_CST_LOW (node
));
1409 pp_string (pp
, "B"); /* pseudo-unit */
1411 else if (tree_fits_shwi_p (node
))
1412 pp_wide_integer (pp
, tree_to_shwi (node
));
1413 else if (tree_fits_uhwi_p (node
))
1414 pp_unsigned_wide_integer (pp
, tree_to_uhwi (node
));
1417 wide_int val
= node
;
1419 if (wi::neg_p (val
, TYPE_SIGN (TREE_TYPE (node
))))
1424 print_hex (val
, pp_buffer (pp
)->digit_buffer
);
1425 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);
1427 if (TREE_OVERFLOW (node
))
1428 pp_string (pp
, "(OVF)");
1432 /* Code copied from print_node. */
1435 if (TREE_OVERFLOW (node
))
1436 pp_string (pp
, " overflow");
1438 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
1439 d
= TREE_REAL_CST (node
);
1440 if (REAL_VALUE_ISINF (d
))
1441 pp_string (pp
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
1442 else if (REAL_VALUE_ISNAN (d
))
1443 pp_string (pp
, " Nan");
1447 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
1448 pp_string (pp
, string
);
1453 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
1454 pp_string (pp
, "0x");
1455 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
1456 output_formatted_integer (pp
, "%02x", *p
++);
1465 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
1466 pp_string (pp
, string
);
1471 pp_string (pp
, "__complex__ (");
1472 dump_generic_node (pp
, TREE_REALPART (node
), spc
, flags
, false);
1473 pp_string (pp
, ", ");
1474 dump_generic_node (pp
, TREE_IMAGPART (node
), spc
, flags
, false);
1475 pp_right_paren (pp
);
1479 pp_string (pp
, "\"");
1480 pretty_print_string (pp
, TREE_STRING_POINTER (node
));
1481 pp_string (pp
, "\"");
1487 pp_string (pp
, "{ ");
1488 for (i
= 0; i
< VECTOR_CST_NELTS (node
); ++i
)
1491 pp_string (pp
, ", ");
1492 dump_generic_node (pp
, VECTOR_CST_ELT (node
, i
),
1495 pp_string (pp
, " }");
1501 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1503 if (TREE_CODE (node
) == METHOD_TYPE
)
1505 if (TYPE_METHOD_BASETYPE (node
))
1506 dump_decl_name (pp
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
1509 pp_string (pp
, "<null method basetype>");
1510 pp_colon_colon (pp
);
1512 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1513 dump_decl_name (pp
, TYPE_NAME (node
), flags
);
1514 else if (flags
& TDF_NOUID
)
1515 pp_printf (pp
, "<Txxxx>");
1517 pp_printf (pp
, "<T%x>", TYPE_UID (node
));
1518 dump_function_declaration (pp
, node
, spc
, flags
);
1523 dump_decl_name (pp
, node
, flags
);
1527 if (DECL_NAME (node
))
1528 dump_decl_name (pp
, node
, flags
);
1529 else if (LABEL_DECL_UID (node
) != -1)
1530 pp_printf (pp
, "<L%d>", (int) LABEL_DECL_UID (node
));
1533 if (flags
& TDF_NOUID
)
1534 pp_string (pp
, "<D.xxxx>");
1536 pp_printf (pp
, "<D.%u>", DECL_UID (node
));
1541 if (DECL_IS_BUILTIN (node
))
1543 /* Don't print the declaration of built-in types. */
1546 if (DECL_NAME (node
))
1547 dump_decl_name (pp
, node
, flags
);
1548 else if (TYPE_NAME (TREE_TYPE (node
)) != node
)
1550 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1551 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1552 && TYPE_METHODS (TREE_TYPE (node
)))
1554 /* The type is a c++ class: all structures have at least
1556 pp_string (pp
, "class ");
1557 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1562 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
1563 ? "union" : "struct "));
1564 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1568 pp_string (pp
, "<anon>");
1574 case DEBUG_EXPR_DECL
:
1575 case NAMESPACE_DECL
:
1577 dump_decl_name (pp
, node
, flags
);
1581 pp_string (pp
, "<retval>");
1585 op0
= TREE_OPERAND (node
, 0);
1588 && (TREE_CODE (op0
) == INDIRECT_REF
1589 || (TREE_CODE (op0
) == MEM_REF
1590 && TREE_CODE (TREE_OPERAND (op0
, 0)) != ADDR_EXPR
1591 && integer_zerop (TREE_OPERAND (op0
, 1))
1592 /* Dump the types of INTEGER_CSTs explicitly, for we
1593 can't infer them and MEM_ATTR caching will share
1594 MEM_REFs with differently-typed op0s. */
1595 && TREE_CODE (TREE_OPERAND (op0
, 0)) != INTEGER_CST
1596 /* Released SSA_NAMES have no TREE_TYPE. */
1597 && TREE_TYPE (TREE_OPERAND (op0
, 0)) != NULL_TREE
1598 /* Same pointer types, but ignoring POINTER_TYPE vs.
1600 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1601 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1602 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1603 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1604 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1605 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1606 /* Same value types ignoring qualifiers. */
1607 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0
))
1608 == TYPE_MAIN_VARIANT
1609 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1)))))
1610 && MR_DEPENDENCE_CLIQUE (op0
) == 0)))
1612 op0
= TREE_OPERAND (op0
, 0);
1615 if (op_prio (op0
) < op_prio (node
))
1617 dump_generic_node (pp
, op0
, spc
, flags
, false);
1618 if (op_prio (op0
) < op_prio (node
))
1619 pp_right_paren (pp
);
1620 pp_string (pp
, str
);
1621 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1622 op0
= component_ref_field_offset (node
);
1623 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
1625 pp_string (pp
, "{off: ");
1626 dump_generic_node (pp
, op0
, spc
, flags
, false);
1627 pp_right_brace (pp
);
1632 pp_string (pp
, "BIT_FIELD_REF <");
1633 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1634 pp_string (pp
, ", ");
1635 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1636 pp_string (pp
, ", ");
1637 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1642 case ARRAY_RANGE_REF
:
1643 op0
= TREE_OPERAND (node
, 0);
1644 if (op_prio (op0
) < op_prio (node
))
1646 dump_generic_node (pp
, op0
, spc
, flags
, false);
1647 if (op_prio (op0
) < op_prio (node
))
1648 pp_right_paren (pp
);
1649 pp_left_bracket (pp
);
1650 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1651 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
1652 pp_string (pp
, " ...");
1653 pp_right_bracket (pp
);
1655 op0
= array_ref_low_bound (node
);
1656 op1
= array_ref_element_size (node
);
1658 if (!integer_zerop (op0
)
1659 || TREE_OPERAND (node
, 2)
1660 || TREE_OPERAND (node
, 3))
1662 pp_string (pp
, "{lb: ");
1663 dump_generic_node (pp
, op0
, spc
, flags
, false);
1664 pp_string (pp
, " sz: ");
1665 dump_generic_node (pp
, op1
, spc
, flags
, false);
1666 pp_right_brace (pp
);
1672 unsigned HOST_WIDE_INT ix
;
1674 bool is_struct_init
= false;
1675 bool is_array_init
= false;
1678 if (TREE_CLOBBER_P (node
))
1679 pp_string (pp
, "CLOBBER");
1680 else if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1681 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1682 is_struct_init
= true;
1683 else if (TREE_CODE (TREE_TYPE (node
)) == ARRAY_TYPE
1684 && TYPE_DOMAIN (TREE_TYPE (node
))
1685 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)))
1686 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
))))
1689 tree minv
= TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)));
1690 is_array_init
= true;
1691 curidx
= wi::to_widest (minv
);
1693 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1700 dump_generic_node (pp
, field
, spc
, flags
, false);
1703 else if (is_array_init
1704 && (TREE_CODE (field
) != INTEGER_CST
1705 || curidx
!= wi::to_widest (field
)))
1707 pp_left_bracket (pp
);
1708 if (TREE_CODE (field
) == RANGE_EXPR
)
1710 dump_generic_node (pp
, TREE_OPERAND (field
, 0), spc
,
1712 pp_string (pp
, " ... ");
1713 dump_generic_node (pp
, TREE_OPERAND (field
, 1), spc
,
1715 if (TREE_CODE (TREE_OPERAND (field
, 1)) == INTEGER_CST
)
1716 curidx
= wi::to_widest (TREE_OPERAND (field
, 1));
1719 dump_generic_node (pp
, field
, spc
, flags
, false);
1720 if (TREE_CODE (field
) == INTEGER_CST
)
1721 curidx
= wi::to_widest (field
);
1722 pp_string (pp
, "]=");
1727 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1728 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1729 val
= TREE_OPERAND (val
, 0);
1730 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1731 dump_decl_name (pp
, val
, flags
);
1733 dump_generic_node (pp
, val
, spc
, flags
, false);
1734 if (ix
!= vec_safe_length (CONSTRUCTOR_ELTS (node
)) - 1)
1740 pp_right_brace (pp
);
1747 if (flags
& TDF_SLIM
)
1749 pp_string (pp
, "<COMPOUND_EXPR>");
1753 dump_generic_node (pp
, TREE_OPERAND (node
, 0),
1754 spc
, flags
, !(flags
& TDF_SLIM
));
1755 if (flags
& TDF_SLIM
)
1756 newline_and_indent (pp
, spc
);
1763 for (tp
= &TREE_OPERAND (node
, 1);
1764 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1765 tp
= &TREE_OPERAND (*tp
, 1))
1767 dump_generic_node (pp
, TREE_OPERAND (*tp
, 0),
1768 spc
, flags
, !(flags
& TDF_SLIM
));
1769 if (flags
& TDF_SLIM
)
1770 newline_and_indent (pp
, spc
);
1778 dump_generic_node (pp
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1782 case STATEMENT_LIST
:
1784 tree_stmt_iterator si
;
1787 if (flags
& TDF_SLIM
)
1789 pp_string (pp
, "<STATEMENT_LIST>");
1793 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1796 newline_and_indent (pp
, spc
);
1799 dump_generic_node (pp
, tsi_stmt (si
), spc
, flags
, true);
1806 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
,
1811 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
,
1816 pp_string (pp
, "TARGET_EXPR <");
1817 dump_generic_node (pp
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1820 dump_generic_node (pp
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1825 print_declaration (pp
, DECL_EXPR_DECL (node
), spc
, flags
);
1830 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1832 pp_string (pp
, "if (");
1833 dump_generic_node (pp
, COND_EXPR_COND (node
), spc
, flags
, false);
1834 pp_right_paren (pp
);
1835 /* The lowered cond_exprs should always be printed in full. */
1836 if (COND_EXPR_THEN (node
)
1837 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1838 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1839 && COND_EXPR_ELSE (node
)
1840 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1841 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1844 dump_generic_node (pp
, COND_EXPR_THEN (node
),
1846 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1848 pp_string (pp
, " else ");
1849 dump_generic_node (pp
, COND_EXPR_ELSE (node
),
1853 else if (!(flags
& TDF_SLIM
))
1855 /* Output COND_EXPR_THEN. */
1856 if (COND_EXPR_THEN (node
))
1858 newline_and_indent (pp
, spc
+2);
1860 newline_and_indent (pp
, spc
+4);
1861 dump_generic_node (pp
, COND_EXPR_THEN (node
), spc
+4,
1863 newline_and_indent (pp
, spc
+2);
1864 pp_right_brace (pp
);
1867 /* Output COND_EXPR_ELSE. */
1868 if (COND_EXPR_ELSE (node
)
1869 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1871 newline_and_indent (pp
, spc
);
1872 pp_string (pp
, "else");
1873 newline_and_indent (pp
, spc
+2);
1875 newline_and_indent (pp
, spc
+4);
1876 dump_generic_node (pp
, COND_EXPR_ELSE (node
), spc
+4,
1878 newline_and_indent (pp
, spc
+2);
1879 pp_right_brace (pp
);
1886 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1890 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1894 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1900 if (!(flags
& TDF_SLIM
))
1902 if (BIND_EXPR_VARS (node
))
1906 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= DECL_CHAIN (op0
))
1908 print_declaration (pp
, op0
, spc
+2, flags
);
1913 newline_and_indent (pp
, spc
+2);
1914 dump_generic_node (pp
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1915 newline_and_indent (pp
, spc
);
1916 pp_right_brace (pp
);
1922 if (CALL_EXPR_FN (node
) != NULL_TREE
)
1923 print_call_name (pp
, CALL_EXPR_FN (node
), flags
);
1925 pp_string (pp
, internal_fn_name (CALL_EXPR_IFN (node
)));
1927 /* Print parameters. */
1932 call_expr_arg_iterator iter
;
1933 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1935 dump_generic_node (pp
, arg
, spc
, flags
, false);
1936 if (more_call_expr_args_p (&iter
))
1943 if (CALL_EXPR_VA_ARG_PACK (node
))
1945 if (call_expr_nargs (node
) > 0)
1950 pp_string (pp
, "__builtin_va_arg_pack ()");
1952 pp_right_paren (pp
);
1954 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1957 pp_string (pp
, " [static-chain: ");
1958 dump_generic_node (pp
, op1
, spc
, flags
, false);
1959 pp_right_bracket (pp
);
1962 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1963 pp_string (pp
, " [return slot optimization]");
1964 if (CALL_EXPR_TAILCALL (node
))
1965 pp_string (pp
, " [tail call]");
1968 case WITH_CLEANUP_EXPR
:
1972 case CLEANUP_POINT_EXPR
:
1973 pp_string (pp
, "<<cleanup_point ");
1974 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1975 pp_string (pp
, ">>");
1978 case PLACEHOLDER_EXPR
:
1979 pp_string (pp
, "<PLACEHOLDER_EXPR ");
1980 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1984 /* Binary arithmetic and logic expressions. */
1985 case WIDEN_SUM_EXPR
:
1986 case WIDEN_MULT_EXPR
:
1988 case MULT_HIGHPART_EXPR
:
1990 case POINTER_PLUS_EXPR
:
1992 case TRUNC_DIV_EXPR
:
1994 case FLOOR_DIV_EXPR
:
1995 case ROUND_DIV_EXPR
:
1996 case TRUNC_MOD_EXPR
:
1998 case FLOOR_MOD_EXPR
:
1999 case ROUND_MOD_EXPR
:
2001 case EXACT_DIV_EXPR
:
2006 case WIDEN_LSHIFT_EXPR
:
2010 case TRUTH_ANDIF_EXPR
:
2011 case TRUTH_ORIF_EXPR
:
2012 case TRUTH_AND_EXPR
:
2014 case TRUTH_XOR_EXPR
:
2028 case UNORDERED_EXPR
:
2030 const char *op
= op_symbol (node
);
2031 op0
= TREE_OPERAND (node
, 0);
2032 op1
= TREE_OPERAND (node
, 1);
2034 /* When the operands are expressions with less priority,
2035 keep semantics of the tree representation. */
2036 if (op_prio (op0
) <= op_prio (node
))
2039 dump_generic_node (pp
, op0
, spc
, flags
, false);
2040 pp_right_paren (pp
);
2043 dump_generic_node (pp
, op0
, spc
, flags
, false);
2049 /* When the operands are expressions with less priority,
2050 keep semantics of the tree representation. */
2051 if (op_prio (op1
) <= op_prio (node
))
2054 dump_generic_node (pp
, op1
, spc
, flags
, false);
2055 pp_right_paren (pp
);
2058 dump_generic_node (pp
, op1
, spc
, flags
, false);
2062 /* Unary arithmetic and logic expressions. */
2065 case TRUTH_NOT_EXPR
:
2067 case PREDECREMENT_EXPR
:
2068 case PREINCREMENT_EXPR
:
2070 if (TREE_CODE (node
) == ADDR_EXPR
2071 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
2072 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
2073 ; /* Do not output '&' for strings and function pointers. */
2075 pp_string (pp
, op_symbol (node
));
2077 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2080 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2081 pp_right_paren (pp
);
2084 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2087 case POSTDECREMENT_EXPR
:
2088 case POSTINCREMENT_EXPR
:
2089 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2092 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2093 pp_right_paren (pp
);
2096 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2097 pp_string (pp
, op_symbol (node
));
2101 pp_string (pp
, "MIN_EXPR <");
2102 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2103 pp_string (pp
, ", ");
2104 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2109 pp_string (pp
, "MAX_EXPR <");
2110 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2111 pp_string (pp
, ", ");
2112 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2117 pp_string (pp
, "ABS_EXPR <");
2118 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2126 case ADDR_SPACE_CONVERT_EXPR
:
2127 case FIXED_CONVERT_EXPR
:
2128 case FIX_TRUNC_EXPR
:
2131 type
= TREE_TYPE (node
);
2132 op0
= TREE_OPERAND (node
, 0);
2133 if (type
!= TREE_TYPE (op0
))
2136 dump_generic_node (pp
, type
, spc
, flags
, false);
2137 pp_string (pp
, ") ");
2139 if (op_prio (op0
) < op_prio (node
))
2141 dump_generic_node (pp
, op0
, spc
, flags
, false);
2142 if (op_prio (op0
) < op_prio (node
))
2143 pp_right_paren (pp
);
2146 case VIEW_CONVERT_EXPR
:
2147 pp_string (pp
, "VIEW_CONVERT_EXPR<");
2148 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
2149 pp_string (pp
, ">(");
2150 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2151 pp_right_paren (pp
);
2155 pp_string (pp
, "((");
2156 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2157 pp_string (pp
, "))");
2160 case NON_LVALUE_EXPR
:
2161 pp_string (pp
, "NON_LVALUE_EXPR <");
2162 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2167 pp_string (pp
, "SAVE_EXPR <");
2168 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2173 pp_string (pp
, "COMPLEX_EXPR <");
2174 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2175 pp_string (pp
, ", ");
2176 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2181 pp_string (pp
, "CONJ_EXPR <");
2182 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2187 pp_string (pp
, "REALPART_EXPR <");
2188 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2193 pp_string (pp
, "IMAGPART_EXPR <");
2194 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2199 pp_string (pp
, "VA_ARG_EXPR <");
2200 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2204 case TRY_FINALLY_EXPR
:
2205 case TRY_CATCH_EXPR
:
2206 pp_string (pp
, "try");
2207 newline_and_indent (pp
, spc
+2);
2209 newline_and_indent (pp
, spc
+4);
2210 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
2211 newline_and_indent (pp
, spc
+2);
2212 pp_right_brace (pp
);
2213 newline_and_indent (pp
, spc
);
2215 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
2216 newline_and_indent (pp
, spc
+2);
2218 newline_and_indent (pp
, spc
+4);
2219 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
2220 newline_and_indent (pp
, spc
+2);
2221 pp_right_brace (pp
);
2226 pp_string (pp
, "catch (");
2227 dump_generic_node (pp
, CATCH_TYPES (node
), spc
+2, flags
, false);
2228 pp_right_paren (pp
);
2229 newline_and_indent (pp
, spc
+2);
2231 newline_and_indent (pp
, spc
+4);
2232 dump_generic_node (pp
, CATCH_BODY (node
), spc
+4, flags
, true);
2233 newline_and_indent (pp
, spc
+2);
2234 pp_right_brace (pp
);
2238 case EH_FILTER_EXPR
:
2239 pp_string (pp
, "<<<eh_filter (");
2240 dump_generic_node (pp
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
2241 pp_string (pp
, ")>>>");
2242 newline_and_indent (pp
, spc
+2);
2244 newline_and_indent (pp
, spc
+4);
2245 dump_generic_node (pp
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
2246 newline_and_indent (pp
, spc
+2);
2247 pp_right_brace (pp
);
2252 op0
= TREE_OPERAND (node
, 0);
2253 /* If this is for break or continue, don't bother printing it. */
2254 if (DECL_NAME (op0
))
2256 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2257 if (strcmp (name
, "break") == 0
2258 || strcmp (name
, "continue") == 0)
2261 dump_generic_node (pp
, op0
, spc
, flags
, false);
2263 if (DECL_NONLOCAL (op0
))
2264 pp_string (pp
, " [non-local]");
2268 pp_string (pp
, "while (1)");
2269 if (!(flags
& TDF_SLIM
))
2271 newline_and_indent (pp
, spc
+2);
2273 newline_and_indent (pp
, spc
+4);
2274 dump_generic_node (pp
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
2275 newline_and_indent (pp
, spc
+2);
2276 pp_right_brace (pp
);
2282 pp_string (pp
, "// predicted ");
2283 if (PREDICT_EXPR_OUTCOME (node
))
2284 pp_string (pp
, "likely by ");
2286 pp_string (pp
, "unlikely by ");
2287 pp_string (pp
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
2288 pp_string (pp
, " predictor.");
2292 pp_string (pp
, "ANNOTATE_EXPR <");
2293 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2294 switch ((enum annot_expr_kind
) TREE_INT_CST_LOW (TREE_OPERAND (node
, 1)))
2296 case annot_expr_ivdep_kind
:
2297 pp_string (pp
, ", ivdep");
2299 case annot_expr_no_vector_kind
:
2300 pp_string (pp
, ", no-vector");
2302 case annot_expr_vector_kind
:
2303 pp_string (pp
, ", vector");
2312 pp_string (pp
, "return");
2313 op0
= TREE_OPERAND (node
, 0);
2317 if (TREE_CODE (op0
) == MODIFY_EXPR
)
2318 dump_generic_node (pp
, TREE_OPERAND (op0
, 1),
2321 dump_generic_node (pp
, op0
, spc
, flags
, false);
2326 pp_string (pp
, "if (");
2327 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2328 pp_string (pp
, ") break");
2332 pp_string (pp
, "switch (");
2333 dump_generic_node (pp
, SWITCH_COND (node
), spc
, flags
, false);
2334 pp_right_paren (pp
);
2335 if (!(flags
& TDF_SLIM
))
2337 newline_and_indent (pp
, spc
+2);
2339 if (SWITCH_BODY (node
))
2341 newline_and_indent (pp
, spc
+4);
2342 dump_generic_node (pp
, SWITCH_BODY (node
), spc
+4, flags
,
2347 tree vec
= SWITCH_LABELS (node
);
2348 size_t i
, n
= TREE_VEC_LENGTH (vec
);
2349 for (i
= 0; i
< n
; ++i
)
2351 tree elt
= TREE_VEC_ELT (vec
, i
);
2352 newline_and_indent (pp
, spc
+4);
2355 dump_generic_node (pp
, elt
, spc
+4, flags
, false);
2356 pp_string (pp
, " goto ");
2357 dump_generic_node (pp
, CASE_LABEL (elt
), spc
+4,
2362 pp_string (pp
, "case ???: goto ???;");
2365 newline_and_indent (pp
, spc
+2);
2366 pp_right_brace (pp
);
2372 op0
= GOTO_DESTINATION (node
);
2373 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
2375 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2376 if (strcmp (name
, "break") == 0
2377 || strcmp (name
, "continue") == 0)
2379 pp_string (pp
, name
);
2383 pp_string (pp
, "goto ");
2384 dump_generic_node (pp
, op0
, spc
, flags
, false);
2388 pp_string (pp
, "__asm__");
2389 if (ASM_VOLATILE_P (node
))
2390 pp_string (pp
, " __volatile__");
2392 dump_generic_node (pp
, ASM_STRING (node
), spc
, flags
, false);
2394 dump_generic_node (pp
, ASM_OUTPUTS (node
), spc
, flags
, false);
2396 dump_generic_node (pp
, ASM_INPUTS (node
), spc
, flags
, false);
2397 if (ASM_CLOBBERS (node
))
2400 dump_generic_node (pp
, ASM_CLOBBERS (node
), spc
, flags
, false);
2402 pp_right_paren (pp
);
2405 case CASE_LABEL_EXPR
:
2406 if (CASE_LOW (node
) && CASE_HIGH (node
))
2408 pp_string (pp
, "case ");
2409 dump_generic_node (pp
, CASE_LOW (node
), spc
, flags
, false);
2410 pp_string (pp
, " ... ");
2411 dump_generic_node (pp
, CASE_HIGH (node
), spc
, flags
, false);
2413 else if (CASE_LOW (node
))
2415 pp_string (pp
, "case ");
2416 dump_generic_node (pp
, CASE_LOW (node
), spc
, flags
, false);
2419 pp_string (pp
, "default");
2424 pp_string (pp
, "OBJ_TYPE_REF(");
2425 dump_generic_node (pp
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
2427 if (!(flags
& TDF_SLIM
) && virtual_method_call_p (node
))
2429 pp_string (pp
, "(");
2430 dump_generic_node (pp
, obj_type_ref_class (node
), spc
, flags
, false);
2431 pp_string (pp
, ")");
2433 dump_generic_node (pp
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
2435 dump_generic_node (pp
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
2436 pp_right_paren (pp
);
2440 if (SSA_NAME_IDENTIFIER (node
))
2441 dump_generic_node (pp
, SSA_NAME_IDENTIFIER (node
),
2444 pp_decimal_int (pp
, SSA_NAME_VERSION (node
));
2445 if (SSA_NAME_IS_DEFAULT_DEF (node
))
2446 pp_string (pp
, "(D)");
2447 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
2448 pp_string (pp
, "(ab)");
2451 case WITH_SIZE_EXPR
:
2452 pp_string (pp
, "WITH_SIZE_EXPR <");
2453 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2454 pp_string (pp
, ", ");
2455 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2460 pp_string (pp
, "ASSERT_EXPR <");
2461 dump_generic_node (pp
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
2462 pp_string (pp
, ", ");
2463 dump_generic_node (pp
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
2468 pp_string (pp
, "scev_known");
2471 case SCEV_NOT_KNOWN
:
2472 pp_string (pp
, "scev_not_known");
2475 case POLYNOMIAL_CHREC
:
2477 dump_generic_node (pp
, CHREC_LEFT (node
), spc
, flags
, false);
2478 pp_string (pp
, ", +, ");
2479 dump_generic_node (pp
, CHREC_RIGHT (node
), spc
, flags
, false);
2480 pp_string (pp
, "}_");
2481 dump_generic_node (pp
, CHREC_VAR (node
), spc
, flags
, false);
2485 case REALIGN_LOAD_EXPR
:
2486 pp_string (pp
, "REALIGN_LOAD <");
2487 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2488 pp_string (pp
, ", ");
2489 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2490 pp_string (pp
, ", ");
2491 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2496 pp_string (pp
, " VEC_COND_EXPR < ");
2497 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2498 pp_string (pp
, " , ");
2499 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2500 pp_string (pp
, " , ");
2501 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2502 pp_string (pp
, " > ");
2506 pp_string (pp
, " VEC_PERM_EXPR < ");
2507 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2508 pp_string (pp
, " , ");
2509 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2510 pp_string (pp
, " , ");
2511 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2512 pp_string (pp
, " > ");
2516 pp_string (pp
, " DOT_PROD_EXPR < ");
2517 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2518 pp_string (pp
, ", ");
2519 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2520 pp_string (pp
, ", ");
2521 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2522 pp_string (pp
, " > ");
2525 case WIDEN_MULT_PLUS_EXPR
:
2526 pp_string (pp
, " WIDEN_MULT_PLUS_EXPR < ");
2527 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2528 pp_string (pp
, ", ");
2529 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2530 pp_string (pp
, ", ");
2531 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2532 pp_string (pp
, " > ");
2535 case WIDEN_MULT_MINUS_EXPR
:
2536 pp_string (pp
, " WIDEN_MULT_MINUS_EXPR < ");
2537 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2538 pp_string (pp
, ", ");
2539 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2540 pp_string (pp
, ", ");
2541 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2542 pp_string (pp
, " > ");
2546 pp_string (pp
, " FMA_EXPR < ");
2547 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2548 pp_string (pp
, ", ");
2549 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2550 pp_string (pp
, ", ");
2551 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2552 pp_string (pp
, " > ");
2556 pp_string (pp
, "#pragma acc parallel");
2557 dump_omp_clauses (pp
, OACC_PARALLEL_CLAUSES (node
), spc
, flags
);
2561 pp_string (pp
, "#pragma acc kernels");
2562 dump_omp_clauses (pp
, OACC_KERNELS_CLAUSES (node
), spc
, flags
);
2566 pp_string (pp
, "#pragma acc data");
2567 dump_omp_clauses (pp
, OACC_DATA_CLAUSES (node
), spc
, flags
);
2570 case OACC_HOST_DATA
:
2571 pp_string (pp
, "#pragma acc host_data");
2572 dump_omp_clauses (pp
, OACC_HOST_DATA_CLAUSES (node
), spc
, flags
);
2576 pp_string (pp
, "#pragma acc declare");
2577 dump_omp_clauses (pp
, OACC_DECLARE_CLAUSES (node
), spc
, flags
);
2581 pp_string (pp
, "#pragma acc update");
2582 dump_omp_clauses (pp
, OACC_UPDATE_CLAUSES (node
), spc
, flags
);
2585 case OACC_ENTER_DATA
:
2586 pp_string (pp
, "#pragma acc enter data");
2587 dump_omp_clauses (pp
, OACC_ENTER_DATA_CLAUSES (node
), spc
, flags
);
2590 case OACC_EXIT_DATA
:
2591 pp_string (pp
, "#pragma acc exit data");
2592 dump_omp_clauses (pp
, OACC_EXIT_DATA_CLAUSES (node
), spc
, flags
);
2596 pp_string (pp
, "#pragma acc cache");
2597 dump_omp_clauses (pp
, OACC_CACHE_CLAUSES (node
), spc
, flags
);
2601 pp_string (pp
, "#pragma omp parallel");
2602 dump_omp_clauses (pp
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
2605 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
2607 newline_and_indent (pp
, spc
+ 2);
2609 newline_and_indent (pp
, spc
+ 4);
2610 dump_generic_node (pp
, OMP_BODY (node
), spc
+ 4, flags
, false);
2611 newline_and_indent (pp
, spc
+ 2);
2612 pp_right_brace (pp
);
2618 pp_string (pp
, "#pragma omp task");
2619 dump_omp_clauses (pp
, OMP_TASK_CLAUSES (node
), spc
, flags
);
2623 pp_string (pp
, "#pragma omp for");
2627 pp_string (pp
, "#pragma omp simd");
2631 pp_string (pp
, "#pragma simd");
2635 /* This label points one line after dumping the clauses.
2636 For _Cilk_for the clauses are dumped after the _Cilk_for (...)
2637 parameters are printed out. */
2638 goto dump_omp_loop_cilk_for
;
2640 case OMP_DISTRIBUTE
:
2641 pp_string (pp
, "#pragma omp distribute");
2645 pp_string (pp
, "#pragma acc loop");
2649 pp_string (pp
, "#pragma omp teams");
2650 dump_omp_clauses (pp
, OMP_TEAMS_CLAUSES (node
), spc
, flags
);
2653 case OMP_TARGET_DATA
:
2654 pp_string (pp
, "#pragma omp target data");
2655 dump_omp_clauses (pp
, OMP_TARGET_DATA_CLAUSES (node
), spc
, flags
);
2659 pp_string (pp
, "#pragma omp target");
2660 dump_omp_clauses (pp
, OMP_TARGET_CLAUSES (node
), spc
, flags
);
2663 case OMP_TARGET_UPDATE
:
2664 pp_string (pp
, "#pragma omp target update");
2665 dump_omp_clauses (pp
, OMP_TARGET_UPDATE_CLAUSES (node
), spc
, flags
);
2670 dump_omp_clauses (pp
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2672 dump_omp_loop_cilk_for
:
2673 if (!(flags
& TDF_SLIM
))
2677 if (OMP_FOR_PRE_BODY (node
))
2679 if (TREE_CODE (node
) == CILK_FOR
)
2680 pp_string (pp
, " ");
2682 newline_and_indent (pp
, spc
+ 2);
2685 newline_and_indent (pp
, spc
);
2686 dump_generic_node (pp
, OMP_FOR_PRE_BODY (node
),
2689 if (OMP_FOR_INIT (node
))
2692 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
2695 if (TREE_CODE (node
) != CILK_FOR
|| OMP_FOR_PRE_BODY (node
))
2696 newline_and_indent (pp
, spc
);
2697 if (TREE_CODE (node
) == CILK_FOR
)
2698 pp_string (pp
, "_Cilk_for (");
2700 pp_string (pp
, "for (");
2701 dump_generic_node (pp
,
2702 TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
2704 pp_string (pp
, "; ");
2705 dump_generic_node (pp
,
2706 TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
2708 pp_string (pp
, "; ");
2709 dump_generic_node (pp
,
2710 TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
2712 pp_right_paren (pp
);
2714 if (TREE_CODE (node
) == CILK_FOR
)
2715 dump_omp_clauses (pp
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2717 if (OMP_FOR_BODY (node
))
2719 newline_and_indent (pp
, spc
+ 2);
2721 newline_and_indent (pp
, spc
+ 4);
2722 dump_generic_node (pp
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
2724 newline_and_indent (pp
, spc
+ 2);
2725 pp_right_brace (pp
);
2727 if (OMP_FOR_INIT (node
))
2728 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
2729 if (OMP_FOR_PRE_BODY (node
))
2732 newline_and_indent (pp
, spc
+ 2);
2733 pp_right_brace (pp
);
2740 pp_string (pp
, "#pragma omp sections");
2741 dump_omp_clauses (pp
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
2745 pp_string (pp
, "#pragma omp section");
2749 pp_string (pp
, "#pragma omp master");
2753 pp_string (pp
, "#pragma omp taskgroup");
2757 pp_string (pp
, "#pragma omp ordered");
2761 pp_string (pp
, "#pragma omp critical");
2762 if (OMP_CRITICAL_NAME (node
))
2766 dump_generic_node (pp
, OMP_CRITICAL_NAME (node
), spc
,
2768 pp_right_paren (pp
);
2773 pp_string (pp
, "#pragma omp atomic");
2774 if (OMP_ATOMIC_SEQ_CST (node
))
2775 pp_string (pp
, " seq_cst");
2776 newline_and_indent (pp
, spc
+ 2);
2777 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2781 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2784 case OMP_ATOMIC_READ
:
2785 pp_string (pp
, "#pragma omp atomic read");
2786 if (OMP_ATOMIC_SEQ_CST (node
))
2787 pp_string (pp
, " seq_cst");
2788 newline_and_indent (pp
, spc
+ 2);
2789 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2793 case OMP_ATOMIC_CAPTURE_OLD
:
2794 case OMP_ATOMIC_CAPTURE_NEW
:
2795 pp_string (pp
, "#pragma omp atomic capture");
2796 if (OMP_ATOMIC_SEQ_CST (node
))
2797 pp_string (pp
, " seq_cst");
2798 newline_and_indent (pp
, spc
+ 2);
2799 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2803 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2807 pp_string (pp
, "#pragma omp single");
2808 dump_omp_clauses (pp
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
2812 dump_omp_clause (pp
, node
, spc
, flags
);
2816 case TRANSACTION_EXPR
:
2817 if (TRANSACTION_EXPR_OUTER (node
))
2818 pp_string (pp
, "__transaction_atomic [[outer]]");
2819 else if (TRANSACTION_EXPR_RELAXED (node
))
2820 pp_string (pp
, "__transaction_relaxed");
2822 pp_string (pp
, "__transaction_atomic");
2823 if (!(flags
& TDF_SLIM
) && TRANSACTION_EXPR_BODY (node
))
2825 newline_and_indent (pp
, spc
);
2827 newline_and_indent (pp
, spc
+ 2);
2828 dump_generic_node (pp
, TRANSACTION_EXPR_BODY (node
),
2829 spc
+ 2, flags
, false);
2830 newline_and_indent (pp
, spc
);
2831 pp_right_brace (pp
);
2836 case REDUC_MAX_EXPR
:
2837 pp_string (pp
, " REDUC_MAX_EXPR < ");
2838 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2839 pp_string (pp
, " > ");
2842 case REDUC_MIN_EXPR
:
2843 pp_string (pp
, " REDUC_MIN_EXPR < ");
2844 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2845 pp_string (pp
, " > ");
2848 case REDUC_PLUS_EXPR
:
2849 pp_string (pp
, " REDUC_PLUS_EXPR < ");
2850 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2851 pp_string (pp
, " > ");
2854 case VEC_WIDEN_MULT_HI_EXPR
:
2855 case VEC_WIDEN_MULT_LO_EXPR
:
2856 case VEC_WIDEN_MULT_EVEN_EXPR
:
2857 case VEC_WIDEN_MULT_ODD_EXPR
:
2858 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2859 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2861 for (str
= get_tree_code_name (code
); *str
; str
++)
2862 pp_character (pp
, TOUPPER (*str
));
2863 pp_string (pp
, " < ");
2864 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2865 pp_string (pp
, ", ");
2866 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2867 pp_string (pp
, " > ");
2870 case VEC_UNPACK_HI_EXPR
:
2871 pp_string (pp
, " VEC_UNPACK_HI_EXPR < ");
2872 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2873 pp_string (pp
, " > ");
2876 case VEC_UNPACK_LO_EXPR
:
2877 pp_string (pp
, " VEC_UNPACK_LO_EXPR < ");
2878 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2879 pp_string (pp
, " > ");
2882 case VEC_UNPACK_FLOAT_HI_EXPR
:
2883 pp_string (pp
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2884 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2885 pp_string (pp
, " > ");
2888 case VEC_UNPACK_FLOAT_LO_EXPR
:
2889 pp_string (pp
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2890 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2891 pp_string (pp
, " > ");
2894 case VEC_PACK_TRUNC_EXPR
:
2895 pp_string (pp
, " VEC_PACK_TRUNC_EXPR < ");
2896 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2897 pp_string (pp
, ", ");
2898 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2899 pp_string (pp
, " > ");
2902 case VEC_PACK_SAT_EXPR
:
2903 pp_string (pp
, " VEC_PACK_SAT_EXPR < ");
2904 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2905 pp_string (pp
, ", ");
2906 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2907 pp_string (pp
, " > ");
2910 case VEC_PACK_FIX_TRUNC_EXPR
:
2911 pp_string (pp
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2912 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2913 pp_string (pp
, ", ");
2914 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2915 pp_string (pp
, " > ");
2919 dump_block_node (pp
, node
, spc
, flags
);
2922 case CILK_SPAWN_STMT
:
2923 pp_string (pp
, "_Cilk_spawn ");
2924 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2927 case CILK_SYNC_STMT
:
2928 pp_string (pp
, "_Cilk_sync");
2935 if (is_stmt
&& is_expr
)
2941 /* Print the declaration of a variable. */
2944 print_declaration (pretty_printer
*pp
, tree t
, int spc
, int flags
)
2948 if (TREE_CODE(t
) == NAMELIST_DECL
)
2950 pp_string(pp
, "namelist ");
2951 dump_decl_name (pp
, t
, flags
);
2956 if (TREE_CODE (t
) == TYPE_DECL
)
2957 pp_string (pp
, "typedef ");
2959 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2960 pp_string (pp
, "register ");
2962 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2963 pp_string (pp
, "extern ");
2964 else if (TREE_STATIC (t
))
2965 pp_string (pp
, "static ");
2967 /* Print the type and name. */
2968 if (TREE_TYPE (t
) && TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2972 /* Print array's type. */
2973 tmp
= TREE_TYPE (t
);
2974 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2975 tmp
= TREE_TYPE (tmp
);
2976 dump_generic_node (pp
, TREE_TYPE (tmp
), spc
, flags
, false);
2978 /* Print variable's name. */
2980 dump_generic_node (pp
, t
, spc
, flags
, false);
2982 /* Print the dimensions. */
2983 tmp
= TREE_TYPE (t
);
2984 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2986 dump_array_domain (pp
, TYPE_DOMAIN (tmp
), spc
, flags
);
2987 tmp
= TREE_TYPE (tmp
);
2990 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2992 dump_generic_node (pp
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2994 dump_decl_name (pp
, t
, flags
);
2995 dump_function_declaration (pp
, TREE_TYPE (t
), spc
, flags
);
2999 /* Print type declaration. */
3000 dump_generic_node (pp
, TREE_TYPE (t
), spc
, flags
, false);
3002 /* Print variable's name. */
3004 dump_generic_node (pp
, t
, spc
, flags
, false);
3007 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
3009 pp_string (pp
, " __asm__ ");
3011 dump_generic_node (pp
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
3012 pp_right_paren (pp
);
3015 /* The initial value of a function serves to determine whether the function
3016 is declared or defined. So the following does not apply to function
3018 if (TREE_CODE (t
) != FUNCTION_DECL
)
3020 /* Print the initial value. */
3021 if (DECL_INITIAL (t
))
3026 dump_generic_node (pp
, DECL_INITIAL (t
), spc
, flags
, false);
3030 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
3032 pp_string (pp
, " [value-expr: ");
3033 dump_generic_node (pp
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
3034 pp_right_bracket (pp
);
3041 /* Prints a structure: name, fields, and methods.
3042 FIXME: Still incomplete. */
3045 print_struct_decl (pretty_printer
*pp
, const_tree node
, int spc
, int flags
)
3047 /* Print the name of the structure. */
3048 if (TYPE_NAME (node
))
3051 if (TREE_CODE (node
) == RECORD_TYPE
)
3052 pp_string (pp
, "struct ");
3053 else if ((TREE_CODE (node
) == UNION_TYPE
3054 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
3055 pp_string (pp
, "union ");
3057 dump_generic_node (pp
, TYPE_NAME (node
), spc
, 0, false);
3060 /* Print the contents of the structure. */
3066 /* Print the fields of the structure. */
3069 tmp
= TYPE_FIELDS (node
);
3072 /* Avoid to print recursively the structure. */
3073 /* FIXME : Not implemented correctly...,
3074 what about the case when we have a cycle in the contain graph? ...
3075 Maybe this could be solved by looking at the scope in which the
3076 structure was declared. */
3077 if (TREE_TYPE (tmp
) != node
3078 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
3079 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
3081 print_declaration (pp
, tmp
, spc
+2, flags
);
3084 tmp
= DECL_CHAIN (tmp
);
3088 pp_right_brace (pp
);
3091 /* Return the priority of the operator CODE.
3093 From lowest to highest precedence with either left-to-right (L-R)
3094 or right-to-left (R-L) associativity]:
3097 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
3109 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
3110 15 [L-R] fn() [] -> .
3112 unary +, - and * have higher precedence than the corresponding binary
3116 op_code_prio (enum tree_code code
)
3133 case TRUTH_ORIF_EXPR
:
3136 case TRUTH_AND_EXPR
:
3137 case TRUTH_ANDIF_EXPR
:
3144 case TRUTH_XOR_EXPR
:
3161 case UNORDERED_EXPR
:
3172 case VEC_WIDEN_LSHIFT_HI_EXPR
:
3173 case VEC_WIDEN_LSHIFT_LO_EXPR
:
3174 case WIDEN_LSHIFT_EXPR
:
3177 case WIDEN_SUM_EXPR
:
3179 case POINTER_PLUS_EXPR
:
3183 case VEC_WIDEN_MULT_HI_EXPR
:
3184 case VEC_WIDEN_MULT_LO_EXPR
:
3185 case WIDEN_MULT_EXPR
:
3187 case WIDEN_MULT_PLUS_EXPR
:
3188 case WIDEN_MULT_MINUS_EXPR
:
3190 case MULT_HIGHPART_EXPR
:
3191 case TRUNC_DIV_EXPR
:
3193 case FLOOR_DIV_EXPR
:
3194 case ROUND_DIV_EXPR
:
3196 case EXACT_DIV_EXPR
:
3197 case TRUNC_MOD_EXPR
:
3199 case FLOOR_MOD_EXPR
:
3200 case ROUND_MOD_EXPR
:
3204 case TRUTH_NOT_EXPR
:
3206 case POSTINCREMENT_EXPR
:
3207 case POSTDECREMENT_EXPR
:
3208 case PREINCREMENT_EXPR
:
3209 case PREDECREMENT_EXPR
:
3215 case FIX_TRUNC_EXPR
:
3221 case ARRAY_RANGE_REF
:
3225 /* Special expressions. */
3231 case REDUC_MAX_EXPR
:
3232 case REDUC_MIN_EXPR
:
3233 case REDUC_PLUS_EXPR
:
3234 case VEC_UNPACK_HI_EXPR
:
3235 case VEC_UNPACK_LO_EXPR
:
3236 case VEC_UNPACK_FLOAT_HI_EXPR
:
3237 case VEC_UNPACK_FLOAT_LO_EXPR
:
3238 case VEC_PACK_TRUNC_EXPR
:
3239 case VEC_PACK_SAT_EXPR
:
3243 /* Return an arbitrarily high precedence to avoid surrounding single
3244 VAR_DECLs in ()s. */
3249 /* Return the priority of the operator OP. */
3252 op_prio (const_tree op
)
3254 enum tree_code code
;
3259 code
= TREE_CODE (op
);
3260 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
3261 return op_prio (TREE_OPERAND (op
, 0));
3263 return op_code_prio (code
);
3266 /* Return the symbol associated with operator CODE. */
3269 op_symbol_code (enum tree_code code
)
3277 case TRUTH_ORIF_EXPR
:
3280 case TRUTH_AND_EXPR
:
3281 case TRUTH_ANDIF_EXPR
:
3287 case TRUTH_XOR_EXPR
:
3297 case UNORDERED_EXPR
:
3343 case WIDEN_LSHIFT_EXPR
:
3346 case POINTER_PLUS_EXPR
:
3352 case REDUC_PLUS_EXPR
:
3355 case WIDEN_SUM_EXPR
:
3358 case WIDEN_MULT_EXPR
:
3361 case MULT_HIGHPART_EXPR
:
3371 case TRUTH_NOT_EXPR
:
3378 case TRUNC_DIV_EXPR
:
3385 case FLOOR_DIV_EXPR
:
3388 case ROUND_DIV_EXPR
:
3391 case EXACT_DIV_EXPR
:
3394 case TRUNC_MOD_EXPR
:
3400 case FLOOR_MOD_EXPR
:
3403 case ROUND_MOD_EXPR
:
3406 case PREDECREMENT_EXPR
:
3409 case PREINCREMENT_EXPR
:
3412 case POSTDECREMENT_EXPR
:
3415 case POSTINCREMENT_EXPR
:
3425 return "<<< ??? >>>";
3429 /* Return the symbol associated with operator OP. */
3432 op_symbol (const_tree op
)
3434 return op_symbol_code (TREE_CODE (op
));
3437 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
3438 the gimple_call_fn of a GIMPLE_CALL. */
3441 print_call_name (pretty_printer
*pp
, tree node
, int flags
)
3445 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
3446 op0
= TREE_OPERAND (op0
, 0);
3449 switch (TREE_CODE (op0
))
3454 dump_function_name (pp
, op0
, flags
);
3460 op0
= TREE_OPERAND (op0
, 0);
3465 dump_generic_node (pp
, TREE_OPERAND (op0
, 0), 0, flags
, false);
3466 pp_string (pp
, ") ? ");
3467 dump_generic_node (pp
, TREE_OPERAND (op0
, 1), 0, flags
, false);
3468 pp_string (pp
, " : ");
3469 dump_generic_node (pp
, TREE_OPERAND (op0
, 2), 0, flags
, false);
3473 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
3474 dump_function_name (pp
, TREE_OPERAND (op0
, 0), flags
);
3476 dump_generic_node (pp
, op0
, 0, flags
, false);
3480 if (integer_zerop (TREE_OPERAND (op0
, 1)))
3482 op0
= TREE_OPERAND (op0
, 0);
3489 dump_generic_node (pp
, op0
, 0, flags
, false);
3497 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
3500 pretty_print_string (pretty_printer
*pp
, const char *str
)
3510 pp_string (pp
, "\\b");
3514 pp_string (pp
, "\\f");
3518 pp_string (pp
, "\\n");
3522 pp_string (pp
, "\\r");
3526 pp_string (pp
, "\\t");
3530 pp_string (pp
, "\\v");
3534 pp_string (pp
, "\\\\");
3538 pp_string (pp
, "\\\"");
3542 pp_string (pp
, "\\'");
3545 /* No need to handle \0; the loop terminates on \0. */
3548 pp_string (pp
, "\\1");
3552 pp_string (pp
, "\\2");
3556 pp_string (pp
, "\\3");
3560 pp_string (pp
, "\\4");
3564 pp_string (pp
, "\\5");
3568 pp_string (pp
, "\\6");
3572 pp_string (pp
, "\\7");
3576 pp_character (pp
, str
[0]);
3584 maybe_init_pretty_print (FILE *file
)
3588 tree_pp
= new pretty_printer ();
3589 pp_needs_newline (tree_pp
) = true;
3590 pp_translate_identifiers (tree_pp
) = false;
3593 tree_pp
->buffer
->stream
= file
;
3597 newline_and_indent (pretty_printer
*pp
, int spc
)
3603 /* Handle a %K format for TEXT. Separate from default_tree_printer so
3604 it can also be used in front ends.
3605 %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
3609 percent_K_format (text_info
*text
)
3611 tree t
= va_arg (*text
->args_ptr
, tree
), block
;
3612 text
->set_location (0, EXPR_LOCATION (t
));
3613 gcc_assert (pp_ti_abstract_origin (text
) != NULL
);
3614 block
= TREE_BLOCK (t
);
3615 *pp_ti_abstract_origin (text
) = NULL
;
3619 /* ??? LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those
3620 representing the outermost block of an inlined function.
3621 So walk the BLOCK tree until we hit such a scope. */
3623 && TREE_CODE (block
) == BLOCK
)
3625 if (inlined_function_outer_scope_p (block
))
3627 *pp_ti_abstract_origin (text
) = block
;
3630 block
= BLOCK_SUPERCONTEXT (block
);
3636 && TREE_CODE (block
) == BLOCK
3637 && BLOCK_ABSTRACT_ORIGIN (block
))
3639 tree ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3641 while (TREE_CODE (ao
) == BLOCK
3642 && BLOCK_ABSTRACT_ORIGIN (ao
)
3643 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3644 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3646 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3648 *pp_ti_abstract_origin (text
) = block
;
3651 block
= BLOCK_SUPERCONTEXT (block
);
3655 /* Print the identifier ID to PRETTY-PRINTER. */
3658 pp_tree_identifier (pretty_printer
*pp
, tree id
)
3660 if (pp_translate_identifiers (pp
))
3662 const char *text
= identifier_to_locale (IDENTIFIER_POINTER (id
));
3663 pp_append_text (pp
, text
, text
+ strlen (text
));
3666 pp_append_text (pp
, IDENTIFIER_POINTER (id
),
3667 IDENTIFIER_POINTER (id
) + IDENTIFIER_LENGTH (id
));
3670 /* A helper function that is used to dump function information before the
3674 dump_function_header (FILE *dump_file
, tree fdecl
, int flags
)
3676 const char *dname
, *aname
;
3677 struct cgraph_node
*node
= cgraph_node::get (fdecl
);
3678 struct function
*fun
= DECL_STRUCT_FUNCTION (fdecl
);
3680 dname
= lang_hooks
.decl_printable_name (fdecl
, 2);
3682 if (DECL_ASSEMBLER_NAME_SET_P (fdecl
))
3683 aname
= (IDENTIFIER_POINTER
3684 (DECL_ASSEMBLER_NAME (fdecl
)));
3686 aname
= "<unset-asm-name>";
3688 fprintf (dump_file
, "\n;; Function %s (%s, funcdef_no=%d",
3689 dname
, aname
, fun
->funcdef_no
);
3690 if (!(flags
& TDF_NOUID
))
3691 fprintf (dump_file
, ", decl_uid=%d", DECL_UID (fdecl
));
3694 fprintf (dump_file
, ", cgraph_uid=%d", node
->uid
);
3695 fprintf (dump_file
, ", symbol_order=%d)%s\n\n", node
->order
,
3696 node
->frequency
== NODE_FREQUENCY_HOT
3698 : node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
3699 ? " (unlikely executed)"
3700 : node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
3701 ? " (executed once)"
3705 fprintf (dump_file
, ")\n\n");
3708 /* Dump double_int D to pretty_printer PP. UNS is true
3709 if D is unsigned and false otherwise. */
3711 pp_double_int (pretty_printer
*pp
, double_int d
, bool uns
)
3714 pp_wide_integer (pp
, d
.low
);
3715 else if (d
.fits_uhwi ())
3716 pp_unsigned_wide_integer (pp
, d
.low
);
3719 unsigned HOST_WIDE_INT low
= d
.low
;
3720 HOST_WIDE_INT high
= d
.high
;
3721 if (!uns
&& d
.is_negative ())
3724 high
= ~high
+ !low
;
3727 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
3729 sprintf (pp_buffer (pp
)->digit_buffer
,
3730 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
3731 (unsigned HOST_WIDE_INT
) high
, low
);
3732 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);