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"
28 #include "double-int.h"
35 #include "stor-layout.h"
37 #include "tree-pretty-print.h"
38 #include "gimple-expr.h"
42 #include "plugin-api.h"
43 #include "hard-reg-set.h"
48 #include "langhooks.h"
49 #include "tree-iterator.h"
50 #include "tree-chrec.h"
52 #include "value-prof.h"
53 #include "wide-int-print.h"
54 #include "internal-fn.h"
56 /* Local functions, macros and variables. */
57 static const char *op_symbol (const_tree
);
58 static void pretty_print_string (pretty_printer
*, const char*);
59 static void newline_and_indent (pretty_printer
*, int);
60 static void maybe_init_pretty_print (FILE *);
61 static void print_struct_decl (pretty_printer
*, const_tree
, int, int);
62 static void do_niy (pretty_printer
*, const_tree
);
64 #define INDENT(SPACE) do { \
65 int i; for (i = 0; i<SPACE; i++) pp_space (pp); } while (0)
67 #define NIY do_niy (pp, node)
69 static pretty_printer
*tree_pp
;
71 /* Try to print something for an unknown tree code. */
74 do_niy (pretty_printer
*pp
, const_tree node
)
78 pp_string (pp
, "<<< Unknown tree: ");
79 pp_string (pp
, get_tree_code_name (TREE_CODE (node
)));
83 len
= TREE_OPERAND_LENGTH (node
);
84 for (i
= 0; i
< len
; ++i
)
86 newline_and_indent (pp
, 2);
87 dump_generic_node (pp
, TREE_OPERAND (node
, i
), 2, 0, false);
91 pp_string (pp
, " >>>");
94 /* Debugging function to print out a generic expression. */
97 debug_generic_expr (tree t
)
99 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
100 fprintf (stderr
, "\n");
103 /* Debugging function to print out a generic statement. */
106 debug_generic_stmt (tree t
)
108 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
109 fprintf (stderr
, "\n");
112 /* Debugging function to print out a chain of trees . */
115 debug_tree_chain (tree t
)
121 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
122 fprintf (stderr
, " ");
126 fprintf (stderr
, "... [cycled back to ");
127 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
128 fprintf (stderr
, "]");
132 fprintf (stderr
, "\n");
135 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
137 print_generic_decl (FILE *file
, tree decl
, int flags
)
139 maybe_init_pretty_print (file
);
140 print_declaration (tree_pp
, decl
, 2, flags
);
141 pp_write_text_to_stream (tree_pp
);
144 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
145 to show in the dump. See TDF_* in dumpfile.h. */
148 print_generic_stmt (FILE *file
, tree t
, int flags
)
150 maybe_init_pretty_print (file
);
151 dump_generic_node (tree_pp
, t
, 0, flags
, true);
152 pp_newline_and_flush (tree_pp
);
155 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
156 to show in the dump. See TDF_* in dumpfile.h. The output is indented by
160 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
164 maybe_init_pretty_print (file
);
166 for (i
= 0; i
< indent
; i
++)
168 dump_generic_node (tree_pp
, t
, indent
, flags
, true);
169 pp_newline_and_flush (tree_pp
);
172 /* Print a single expression T on file FILE. FLAGS specifies details to show
173 in the dump. See TDF_* in dumpfile.h. */
176 print_generic_expr (FILE *file
, tree t
, int flags
)
178 maybe_init_pretty_print (file
);
179 dump_generic_node (tree_pp
, t
, 0, flags
, false);
183 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
187 dump_decl_name (pretty_printer
*pp
, tree node
, int flags
)
189 if (DECL_NAME (node
))
191 if ((flags
& TDF_ASMNAME
) && DECL_ASSEMBLER_NAME_SET_P (node
))
192 pp_tree_identifier (pp
, DECL_ASSEMBLER_NAME (node
));
194 pp_tree_identifier (pp
, DECL_NAME (node
));
196 if ((flags
& TDF_UID
) || DECL_NAME (node
) == NULL_TREE
)
198 if (TREE_CODE (node
) == LABEL_DECL
&& LABEL_DECL_UID (node
) != -1)
199 pp_printf (pp
, "L.%d", (int) LABEL_DECL_UID (node
));
200 else if (TREE_CODE (node
) == DEBUG_EXPR_DECL
)
202 if (flags
& TDF_NOUID
)
203 pp_string (pp
, "D#xxxx");
205 pp_printf (pp
, "D#%i", DEBUG_TEMP_UID (node
));
209 char c
= TREE_CODE (node
) == CONST_DECL
? 'C' : 'D';
210 if (flags
& TDF_NOUID
)
211 pp_printf (pp
, "%c.xxxx", c
);
213 pp_printf (pp
, "%c.%u", c
, DECL_UID (node
));
216 if ((flags
& TDF_ALIAS
) && DECL_PT_UID (node
) != DECL_UID (node
))
218 if (flags
& TDF_NOUID
)
219 pp_printf (pp
, "ptD.xxxx");
221 pp_printf (pp
, "ptD.%u", DECL_PT_UID (node
));
225 /* Like the above, but used for pretty printing function calls. */
228 dump_function_name (pretty_printer
*pp
, tree node
, int flags
)
230 if (CONVERT_EXPR_P (node
))
231 node
= TREE_OPERAND (node
, 0);
232 if (DECL_NAME (node
) && (flags
& TDF_ASMNAME
) == 0)
233 pp_string (pp
, lang_hooks
.decl_printable_name (node
, 1));
235 dump_decl_name (pp
, node
, flags
);
238 /* Dump a function declaration. NODE is the FUNCTION_TYPE. PP, SPC and
239 FLAGS are as in dump_generic_node. */
242 dump_function_declaration (pretty_printer
*pp
, tree node
,
245 bool wrote_arg
= false;
251 /* Print the argument types. */
252 arg
= TYPE_ARG_TYPES (node
);
253 while (arg
&& arg
!= void_list_node
&& arg
!= error_mark_node
)
261 dump_generic_node (pp
, TREE_VALUE (arg
), spc
, flags
, false);
262 arg
= TREE_CHAIN (arg
);
265 /* Drop the trailing void_type_node if we had any previous argument. */
266 if (arg
== void_list_node
&& !wrote_arg
)
267 pp_string (pp
, "void");
268 /* Properly dump vararg function types. */
269 else if (!arg
&& wrote_arg
)
270 pp_string (pp
, ", ...");
271 /* Avoid printing any arg for unprototyped functions. */
276 /* Dump the domain associated with an array. */
279 dump_array_domain (pretty_printer
*pp
, tree domain
, int spc
, int flags
)
281 pp_left_bracket (pp
);
284 tree min
= TYPE_MIN_VALUE (domain
);
285 tree max
= TYPE_MAX_VALUE (domain
);
288 && integer_zerop (min
)
289 && tree_fits_shwi_p (max
))
290 pp_wide_integer (pp
, tree_to_shwi (max
) + 1);
294 dump_generic_node (pp
, min
, spc
, flags
, false);
297 dump_generic_node (pp
, max
, spc
, flags
, false);
301 pp_string (pp
, "<unknown>");
302 pp_right_bracket (pp
);
306 /* Dump OpenMP clause CLAUSE. PP, CLAUSE, SPC and FLAGS are as in
307 dump_generic_node. */
310 dump_omp_clause (pretty_printer
*pp
, tree clause
, int spc
, int flags
)
314 switch (OMP_CLAUSE_CODE (clause
))
316 case OMP_CLAUSE_PRIVATE
:
319 case OMP_CLAUSE_SHARED
:
322 case OMP_CLAUSE_FIRSTPRIVATE
:
323 name
= "firstprivate";
325 case OMP_CLAUSE_LASTPRIVATE
:
326 name
= "lastprivate";
328 case OMP_CLAUSE_COPYIN
:
331 case OMP_CLAUSE_COPYPRIVATE
:
332 name
= "copyprivate";
334 case OMP_CLAUSE_UNIFORM
:
337 case OMP_CLAUSE__LOOPTEMP_
:
340 case OMP_CLAUSE_DEVICE_RESIDENT
:
341 name
= "device_resident";
343 case OMP_CLAUSE_USE_DEVICE
:
347 pp_string (pp
, name
);
349 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
354 case OMP_CLAUSE_REDUCTION
:
355 pp_string (pp
, "reduction(");
356 if (OMP_CLAUSE_REDUCTION_CODE (clause
) != ERROR_MARK
)
359 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
362 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
368 pp_string (pp
, "if(");
369 dump_generic_node (pp
, OMP_CLAUSE_IF_EXPR (clause
),
374 case OMP_CLAUSE_NUM_THREADS
:
375 pp_string (pp
, "num_threads(");
376 dump_generic_node (pp
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
381 case OMP_CLAUSE__CILK_FOR_COUNT_
:
382 pp_string (pp
, "_Cilk_for_count_(");
383 dump_generic_node (pp
, OMP_CLAUSE_OPERAND (clause
, 0),
388 case OMP_CLAUSE_NOWAIT
:
389 pp_string (pp
, "nowait");
391 case OMP_CLAUSE_ORDERED
:
392 pp_string (pp
, "ordered");
395 case OMP_CLAUSE_DEFAULT
:
396 pp_string (pp
, "default(");
397 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
399 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
401 case OMP_CLAUSE_DEFAULT_SHARED
:
402 pp_string (pp
, "shared");
404 case OMP_CLAUSE_DEFAULT_NONE
:
405 pp_string (pp
, "none");
407 case OMP_CLAUSE_DEFAULT_PRIVATE
:
408 pp_string (pp
, "private");
410 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
411 pp_string (pp
, "firstprivate");
419 case OMP_CLAUSE_SCHEDULE
:
420 pp_string (pp
, "schedule(");
421 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
423 case OMP_CLAUSE_SCHEDULE_STATIC
:
424 pp_string (pp
, "static");
426 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
427 pp_string (pp
, "dynamic");
429 case OMP_CLAUSE_SCHEDULE_GUIDED
:
430 pp_string (pp
, "guided");
432 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
433 pp_string (pp
, "runtime");
435 case OMP_CLAUSE_SCHEDULE_AUTO
:
436 pp_string (pp
, "auto");
438 case OMP_CLAUSE_SCHEDULE_CILKFOR
:
439 pp_string (pp
, "cilk-for grain");
444 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
447 dump_generic_node (pp
, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
453 case OMP_CLAUSE_UNTIED
:
454 pp_string (pp
, "untied");
457 case OMP_CLAUSE_COLLAPSE
:
458 pp_string (pp
, "collapse(");
459 dump_generic_node (pp
, OMP_CLAUSE_COLLAPSE_EXPR (clause
),
464 case OMP_CLAUSE_FINAL
:
465 pp_string (pp
, "final(");
466 dump_generic_node (pp
, OMP_CLAUSE_FINAL_EXPR (clause
),
471 case OMP_CLAUSE_MERGEABLE
:
472 pp_string (pp
, "mergeable");
475 case OMP_CLAUSE_LINEAR
:
476 pp_string (pp
, "linear(");
477 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
480 dump_generic_node (pp
, OMP_CLAUSE_LINEAR_STEP (clause
),
485 case OMP_CLAUSE_ALIGNED
:
486 pp_string (pp
, "aligned(");
487 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
489 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
))
492 dump_generic_node (pp
, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
),
498 case OMP_CLAUSE_DEPEND
:
499 pp_string (pp
, "depend(");
500 switch (OMP_CLAUSE_DEPEND_KIND (clause
))
502 case OMP_CLAUSE_DEPEND_IN
:
503 pp_string (pp
, "in");
505 case OMP_CLAUSE_DEPEND_OUT
:
506 pp_string (pp
, "out");
508 case OMP_CLAUSE_DEPEND_INOUT
:
509 pp_string (pp
, "inout");
515 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
521 pp_string (pp
, "map(");
522 switch (OMP_CLAUSE_MAP_KIND (clause
))
524 case OMP_CLAUSE_MAP_ALLOC
:
525 case OMP_CLAUSE_MAP_POINTER
:
526 pp_string (pp
, "alloc");
528 case OMP_CLAUSE_MAP_TO
:
529 case OMP_CLAUSE_MAP_TO_PSET
:
530 pp_string (pp
, "to");
532 case OMP_CLAUSE_MAP_FROM
:
533 pp_string (pp
, "from");
535 case OMP_CLAUSE_MAP_TOFROM
:
536 pp_string (pp
, "tofrom");
538 case OMP_CLAUSE_MAP_FORCE_ALLOC
:
539 pp_string (pp
, "force_alloc");
541 case OMP_CLAUSE_MAP_FORCE_TO
:
542 pp_string (pp
, "force_to");
544 case OMP_CLAUSE_MAP_FORCE_FROM
:
545 pp_string (pp
, "force_from");
547 case OMP_CLAUSE_MAP_FORCE_TOFROM
:
548 pp_string (pp
, "force_tofrom");
550 case OMP_CLAUSE_MAP_FORCE_PRESENT
:
551 pp_string (pp
, "force_present");
553 case OMP_CLAUSE_MAP_FORCE_DEALLOC
:
554 pp_string (pp
, "force_dealloc");
556 case OMP_CLAUSE_MAP_FORCE_DEVICEPTR
:
557 pp_string (pp
, "force_deviceptr");
563 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
566 if (OMP_CLAUSE_SIZE (clause
))
568 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
569 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_POINTER
)
570 pp_string (pp
, " [pointer assign, bias: ");
571 else if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
572 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_TO_PSET
)
573 pp_string (pp
, " [pointer set, len: ");
575 pp_string (pp
, " [len: ");
576 dump_generic_node (pp
, OMP_CLAUSE_SIZE (clause
),
578 pp_right_bracket (pp
);
583 case OMP_CLAUSE_FROM
:
584 pp_string (pp
, "from(");
585 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
587 goto print_clause_size
;
590 pp_string (pp
, "to(");
591 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
593 goto print_clause_size
;
595 case OMP_CLAUSE__CACHE_
:
597 dump_generic_node (pp
, OMP_CLAUSE_DECL (clause
),
599 goto print_clause_size
;
601 case OMP_CLAUSE_NUM_TEAMS
:
602 pp_string (pp
, "num_teams(");
603 dump_generic_node (pp
, OMP_CLAUSE_NUM_TEAMS_EXPR (clause
),
608 case OMP_CLAUSE_THREAD_LIMIT
:
609 pp_string (pp
, "thread_limit(");
610 dump_generic_node (pp
, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause
),
615 case OMP_CLAUSE_DEVICE
:
616 pp_string (pp
, "device(");
617 dump_generic_node (pp
, OMP_CLAUSE_DEVICE_ID (clause
),
622 case OMP_CLAUSE_DIST_SCHEDULE
:
623 pp_string (pp
, "dist_schedule(static");
624 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
))
627 dump_generic_node (pp
,
628 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
),
634 case OMP_CLAUSE_PROC_BIND
:
635 pp_string (pp
, "proc_bind(");
636 switch (OMP_CLAUSE_PROC_BIND_KIND (clause
))
638 case OMP_CLAUSE_PROC_BIND_MASTER
:
639 pp_string (pp
, "master");
641 case OMP_CLAUSE_PROC_BIND_CLOSE
:
642 pp_string (pp
, "close");
644 case OMP_CLAUSE_PROC_BIND_SPREAD
:
645 pp_string (pp
, "spread");
653 case OMP_CLAUSE_SAFELEN
:
654 pp_string (pp
, "safelen(");
655 dump_generic_node (pp
, OMP_CLAUSE_SAFELEN_EXPR (clause
),
660 case OMP_CLAUSE_SIMDLEN
:
661 pp_string (pp
, "simdlen(");
662 dump_generic_node (pp
, OMP_CLAUSE_SIMDLEN_EXPR (clause
),
667 case OMP_CLAUSE__SIMDUID_
:
668 pp_string (pp
, "_simduid_(");
669 dump_generic_node (pp
, OMP_CLAUSE__SIMDUID__DECL (clause
),
674 case OMP_CLAUSE_GANG
:
675 pp_string (pp
, "gang");
676 if (OMP_CLAUSE_GANG_EXPR (clause
) != NULL_TREE
)
678 pp_string (pp
, "(num: ");
679 dump_generic_node (pp
, OMP_CLAUSE_GANG_EXPR (clause
),
682 if (OMP_CLAUSE_GANG_STATIC_EXPR (clause
) != NULL_TREE
)
684 if (OMP_CLAUSE_GANG_EXPR (clause
) == NULL_TREE
)
688 pp_string (pp
, "static:");
689 if (OMP_CLAUSE_GANG_STATIC_EXPR (clause
)
690 == integer_minus_one_node
)
691 pp_character (pp
, '*');
693 dump_generic_node (pp
, OMP_CLAUSE_GANG_STATIC_EXPR (clause
),
696 if (OMP_CLAUSE_GANG_EXPR (clause
) != NULL_TREE
697 || OMP_CLAUSE_GANG_STATIC_EXPR (clause
) != NULL_TREE
)
701 case OMP_CLAUSE_ASYNC
:
702 pp_string (pp
, "async");
703 if (OMP_CLAUSE_ASYNC_EXPR (clause
))
705 pp_character(pp
, '(');
706 dump_generic_node (pp
, OMP_CLAUSE_ASYNC_EXPR (clause
),
708 pp_character(pp
, ')');
712 case OMP_CLAUSE_AUTO
:
714 pp_string (pp
, omp_clause_code_name
[OMP_CLAUSE_CODE (clause
)]);
717 case OMP_CLAUSE_WAIT
:
718 pp_string (pp
, "wait(");
719 dump_generic_node (pp
, OMP_CLAUSE_WAIT_EXPR (clause
),
721 pp_character(pp
, ')');
724 case OMP_CLAUSE_WORKER
:
725 pp_string (pp
, "worker");
726 if (OMP_CLAUSE_WORKER_EXPR (clause
) != NULL_TREE
)
729 dump_generic_node (pp
, OMP_CLAUSE_WORKER_EXPR (clause
),
735 case OMP_CLAUSE_VECTOR
:
736 pp_string (pp
, "vector");
737 if (OMP_CLAUSE_VECTOR_EXPR (clause
) != NULL_TREE
)
740 dump_generic_node (pp
, OMP_CLAUSE_VECTOR_EXPR (clause
),
746 case OMP_CLAUSE_NUM_GANGS
:
747 pp_string (pp
, "num_gangs(");
748 dump_generic_node (pp
, OMP_CLAUSE_NUM_GANGS_EXPR (clause
),
750 pp_character (pp
, ')');
753 case OMP_CLAUSE_NUM_WORKERS
:
754 pp_string (pp
, "num_workers(");
755 dump_generic_node (pp
, OMP_CLAUSE_NUM_WORKERS_EXPR (clause
),
757 pp_character (pp
, ')');
760 case OMP_CLAUSE_VECTOR_LENGTH
:
761 pp_string (pp
, "vector_length(");
762 dump_generic_node (pp
, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause
),
764 pp_character (pp
, ')');
767 case OMP_CLAUSE_INBRANCH
:
768 pp_string (pp
, "inbranch");
770 case OMP_CLAUSE_NOTINBRANCH
:
771 pp_string (pp
, "notinbranch");
774 pp_string (pp
, "for");
776 case OMP_CLAUSE_PARALLEL
:
777 pp_string (pp
, "parallel");
779 case OMP_CLAUSE_SECTIONS
:
780 pp_string (pp
, "sections");
782 case OMP_CLAUSE_TASKGROUP
:
783 pp_string (pp
, "taskgroup");
785 case OMP_CLAUSE_INDEPENDENT
:
786 pp_string (pp
, "independent");
790 /* Should never happen. */
791 dump_generic_node (pp
, clause
, spc
, flags
, false);
797 /* Dump the list of OpenMP clauses. PP, SPC and FLAGS are as in
798 dump_generic_node. */
801 dump_omp_clauses (pretty_printer
*pp
, tree clause
, int spc
, int flags
)
809 dump_omp_clause (pp
, clause
, spc
, flags
);
810 clause
= OMP_CLAUSE_CHAIN (clause
);
818 /* Dump location LOC to PP. */
821 dump_location (pretty_printer
*pp
, location_t loc
)
823 expanded_location xloc
= expand_location (loc
);
825 pp_left_bracket (pp
);
828 pp_string (pp
, xloc
.file
);
831 pp_decimal_int (pp
, xloc
.line
);
833 pp_decimal_int (pp
, xloc
.column
);
834 pp_string (pp
, "] ");
838 /* Dump lexical block BLOCK. PP, SPC and FLAGS are as in
839 dump_generic_node. */
842 dump_block_node (pretty_printer
*pp
, tree block
, int spc
, int flags
)
846 pp_printf (pp
, "BLOCK #%d ", BLOCK_NUMBER (block
));
848 if (flags
& TDF_ADDRESS
)
849 pp_printf (pp
, "[%p] ", (void *) block
);
851 if (BLOCK_ABSTRACT (block
))
852 pp_string (pp
, "[abstract] ");
854 if (TREE_ASM_WRITTEN (block
))
855 pp_string (pp
, "[written] ");
857 if (flags
& TDF_SLIM
)
860 if (BLOCK_SOURCE_LOCATION (block
))
861 dump_location (pp
, BLOCK_SOURCE_LOCATION (block
));
863 newline_and_indent (pp
, spc
+ 2);
865 if (BLOCK_SUPERCONTEXT (block
))
867 pp_string (pp
, "SUPERCONTEXT: ");
868 dump_generic_node (pp
, BLOCK_SUPERCONTEXT (block
), 0,
869 flags
| TDF_SLIM
, false);
870 newline_and_indent (pp
, spc
+ 2);
873 if (BLOCK_SUBBLOCKS (block
))
875 pp_string (pp
, "SUBBLOCKS: ");
876 for (t
= BLOCK_SUBBLOCKS (block
); t
; t
= BLOCK_CHAIN (t
))
878 dump_generic_node (pp
, t
, 0, flags
| TDF_SLIM
, false);
881 newline_and_indent (pp
, spc
+ 2);
884 if (BLOCK_CHAIN (block
))
886 pp_string (pp
, "SIBLINGS: ");
887 for (t
= BLOCK_CHAIN (block
); t
; t
= BLOCK_CHAIN (t
))
889 dump_generic_node (pp
, t
, 0, flags
| TDF_SLIM
, false);
892 newline_and_indent (pp
, spc
+ 2);
895 if (BLOCK_VARS (block
))
897 pp_string (pp
, "VARS: ");
898 for (t
= BLOCK_VARS (block
); t
; t
= TREE_CHAIN (t
))
900 dump_generic_node (pp
, t
, 0, flags
, false);
903 newline_and_indent (pp
, spc
+ 2);
906 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block
)) > 0)
909 vec
<tree
, va_gc
> *nlv
= BLOCK_NONLOCALIZED_VARS (block
);
911 pp_string (pp
, "NONLOCALIZED_VARS: ");
912 FOR_EACH_VEC_ELT (*nlv
, i
, t
)
914 dump_generic_node (pp
, t
, 0, flags
, false);
917 newline_and_indent (pp
, spc
+ 2);
920 if (BLOCK_ABSTRACT_ORIGIN (block
))
922 pp_string (pp
, "ABSTRACT_ORIGIN: ");
923 dump_generic_node (pp
, BLOCK_ABSTRACT_ORIGIN (block
), 0,
924 flags
| TDF_SLIM
, false);
925 newline_and_indent (pp
, spc
+ 2);
928 if (BLOCK_FRAGMENT_ORIGIN (block
))
930 pp_string (pp
, "FRAGMENT_ORIGIN: ");
931 dump_generic_node (pp
, BLOCK_FRAGMENT_ORIGIN (block
), 0,
932 flags
| TDF_SLIM
, false);
933 newline_and_indent (pp
, spc
+ 2);
936 if (BLOCK_FRAGMENT_CHAIN (block
))
938 pp_string (pp
, "FRAGMENT_CHAIN: ");
939 for (t
= BLOCK_FRAGMENT_CHAIN (block
); t
; t
= BLOCK_FRAGMENT_CHAIN (t
))
941 dump_generic_node (pp
, t
, 0, flags
| TDF_SLIM
, false);
944 newline_and_indent (pp
, spc
+ 2);
949 /* Dump the node NODE on the pretty_printer PP, SPC spaces of
950 indent. FLAGS specifies details to show in the dump (see TDF_* in
951 dumpfile.h). If IS_STMT is true, the object printed is considered
952 to be a statement and it is terminated by ';' if appropriate. */
955 dump_generic_node (pretty_printer
*pp
, tree node
, int spc
, int flags
,
964 if (node
== NULL_TREE
)
967 is_expr
= EXPR_P (node
);
969 if (is_stmt
&& (flags
& TDF_STMTADDR
))
970 pp_printf (pp
, "<&%p> ", (void *)node
);
972 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
973 dump_location (pp
, EXPR_LOCATION (node
));
975 code
= TREE_CODE (node
);
979 pp_string (pp
, "<<< error >>>");
982 case IDENTIFIER_NODE
:
983 pp_tree_identifier (pp
, node
);
987 while (node
&& node
!= error_mark_node
)
989 if (TREE_PURPOSE (node
))
991 dump_generic_node (pp
, TREE_PURPOSE (node
), spc
, flags
, false);
994 dump_generic_node (pp
, TREE_VALUE (node
), spc
, flags
, false);
995 node
= TREE_CHAIN (node
);
996 if (node
&& TREE_CODE (node
) == TREE_LIST
)
1005 dump_generic_node (pp
, BINFO_TYPE (node
), spc
, flags
, false);
1011 if (TREE_VEC_LENGTH (node
) > 0)
1013 size_t len
= TREE_VEC_LENGTH (node
);
1014 for (i
= 0; i
< len
- 1; i
++)
1016 dump_generic_node (pp
, TREE_VEC_ELT (node
, i
), spc
, flags
,
1021 dump_generic_node (pp
, TREE_VEC_ELT (node
, len
- 1), spc
,
1028 case POINTER_BOUNDS_TYPE
:
1031 case FIXED_POINT_TYPE
:
1037 unsigned int quals
= TYPE_QUALS (node
);
1038 enum tree_code_class tclass
;
1040 if (quals
& TYPE_QUAL_ATOMIC
)
1041 pp_string (pp
, "atomic ");
1042 if (quals
& TYPE_QUAL_CONST
)
1043 pp_string (pp
, "const ");
1044 else if (quals
& TYPE_QUAL_VOLATILE
)
1045 pp_string (pp
, "volatile ");
1046 else if (quals
& TYPE_QUAL_RESTRICT
)
1047 pp_string (pp
, "restrict ");
1049 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1051 pp_string (pp
, "<address-space-");
1052 pp_decimal_int (pp
, TYPE_ADDR_SPACE (node
));
1053 pp_string (pp
, "> ");
1056 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
1058 if (tclass
== tcc_declaration
)
1060 if (DECL_NAME (node
))
1061 dump_decl_name (pp
, node
, flags
);
1063 pp_string (pp
, "<unnamed type decl>");
1065 else if (tclass
== tcc_type
)
1067 if (TYPE_NAME (node
))
1069 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
1070 pp_tree_identifier (pp
, TYPE_NAME (node
));
1071 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
1072 && DECL_NAME (TYPE_NAME (node
)))
1073 dump_decl_name (pp
, TYPE_NAME (node
), flags
);
1075 pp_string (pp
, "<unnamed type>");
1077 else if (TREE_CODE (node
) == VECTOR_TYPE
)
1079 pp_string (pp
, "vector");
1081 pp_wide_integer (pp
, TYPE_VECTOR_SUBPARTS (node
));
1082 pp_string (pp
, ") ");
1083 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1085 else if (TREE_CODE (node
) == INTEGER_TYPE
)
1087 if (TYPE_PRECISION (node
) == CHAR_TYPE_SIZE
)
1088 pp_string (pp
, (TYPE_UNSIGNED (node
)
1091 else if (TYPE_PRECISION (node
) == SHORT_TYPE_SIZE
)
1092 pp_string (pp
, (TYPE_UNSIGNED (node
)
1095 else if (TYPE_PRECISION (node
) == INT_TYPE_SIZE
)
1096 pp_string (pp
, (TYPE_UNSIGNED (node
)
1099 else if (TYPE_PRECISION (node
) == LONG_TYPE_SIZE
)
1100 pp_string (pp
, (TYPE_UNSIGNED (node
)
1103 else if (TYPE_PRECISION (node
) == LONG_LONG_TYPE_SIZE
)
1104 pp_string (pp
, (TYPE_UNSIGNED (node
)
1105 ? "unsigned long long"
1106 : "signed long long"));
1107 else if (TYPE_PRECISION (node
) >= CHAR_TYPE_SIZE
1108 && exact_log2 (TYPE_PRECISION (node
)) != -1)
1110 pp_string (pp
, (TYPE_UNSIGNED (node
) ? "uint" : "int"));
1111 pp_decimal_int (pp
, TYPE_PRECISION (node
));
1112 pp_string (pp
, "_t");
1116 pp_string (pp
, (TYPE_UNSIGNED (node
)
1117 ? "<unnamed-unsigned:"
1118 : "<unnamed-signed:"));
1119 pp_decimal_int (pp
, TYPE_PRECISION (node
));
1123 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
1125 pp_string (pp
, "__complex__ ");
1126 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1128 else if (TREE_CODE (node
) == REAL_TYPE
)
1130 pp_string (pp
, "<float:");
1131 pp_decimal_int (pp
, TYPE_PRECISION (node
));
1134 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
1136 pp_string (pp
, "<fixed-point-");
1137 pp_string (pp
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
1138 pp_decimal_int (pp
, TYPE_PRECISION (node
));
1141 else if (TREE_CODE (node
) == VOID_TYPE
)
1142 pp_string (pp
, "void");
1144 pp_string (pp
, "<unnamed type>");
1150 case REFERENCE_TYPE
:
1151 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
1153 if (TREE_TYPE (node
) == NULL
)
1155 pp_string (pp
, str
);
1156 pp_string (pp
, "<null type>");
1158 else if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
1160 tree fnode
= TREE_TYPE (node
);
1162 dump_generic_node (pp
, TREE_TYPE (fnode
), spc
, flags
, false);
1165 pp_string (pp
, str
);
1166 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1167 dump_decl_name (pp
, TYPE_NAME (node
), flags
);
1168 else if (flags
& TDF_NOUID
)
1169 pp_printf (pp
, "<Txxxx>");
1171 pp_printf (pp
, "<T%x>", TYPE_UID (node
));
1173 pp_right_paren (pp
);
1174 dump_function_declaration (pp
, fnode
, spc
, flags
);
1178 unsigned int quals
= TYPE_QUALS (node
);
1180 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1182 pp_string (pp
, str
);
1184 if (quals
& TYPE_QUAL_CONST
)
1185 pp_string (pp
, " const");
1186 if (quals
& TYPE_QUAL_VOLATILE
)
1187 pp_string (pp
, " volatile");
1188 if (quals
& TYPE_QUAL_RESTRICT
)
1189 pp_string (pp
, " restrict");
1191 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1193 pp_string (pp
, " <address-space-");
1194 pp_decimal_int (pp
, TYPE_ADDR_SPACE (node
));
1198 if (TYPE_REF_CAN_ALIAS_ALL (node
))
1199 pp_string (pp
, " {ref-all}");
1209 if (integer_zerop (TREE_OPERAND (node
, 1))
1210 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1211 infer them and MEM_ATTR caching will share MEM_REFs
1212 with differently-typed op0s. */
1213 && TREE_CODE (TREE_OPERAND (node
, 0)) != INTEGER_CST
1214 /* Released SSA_NAMES have no TREE_TYPE. */
1215 && TREE_TYPE (TREE_OPERAND (node
, 0)) != NULL_TREE
1216 /* Same pointer types, but ignoring POINTER_TYPE vs.
1218 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1219 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1220 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1221 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1222 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 0)))
1223 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 1))))
1224 /* Same value types ignoring qualifiers. */
1225 && (TYPE_MAIN_VARIANT (TREE_TYPE (node
))
1226 == TYPE_MAIN_VARIANT
1227 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1)))))
1228 && (!(flags
& TDF_ALIAS
)
1229 || MR_DEPENDENCE_CLIQUE (node
) == 0))
1231 if (TREE_CODE (TREE_OPERAND (node
, 0)) != ADDR_EXPR
)
1234 dump_generic_node (pp
, TREE_OPERAND (node
, 0),
1238 dump_generic_node (pp
,
1239 TREE_OPERAND (TREE_OPERAND (node
, 0), 0),
1246 pp_string (pp
, "MEM[");
1248 ptype
= TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node
, 1)));
1249 dump_generic_node (pp
, ptype
,
1250 spc
, flags
| TDF_SLIM
, false);
1251 pp_right_paren (pp
);
1252 dump_generic_node (pp
, TREE_OPERAND (node
, 0),
1254 if (!integer_zerop (TREE_OPERAND (node
, 1)))
1256 pp_string (pp
, " + ");
1257 dump_generic_node (pp
, TREE_OPERAND (node
, 1),
1260 if ((flags
& TDF_ALIAS
)
1261 && MR_DEPENDENCE_CLIQUE (node
) != 0)
1263 pp_string (pp
, " clique ");
1264 pp_unsigned_wide_integer (pp
, MR_DEPENDENCE_CLIQUE (node
));
1265 pp_string (pp
, " base ");
1266 pp_unsigned_wide_integer (pp
, MR_DEPENDENCE_BASE (node
));
1268 pp_right_bracket (pp
);
1273 case TARGET_MEM_REF
:
1275 const char *sep
= "";
1278 pp_string (pp
, "MEM[");
1280 if (TREE_CODE (TMR_BASE (node
)) == ADDR_EXPR
)
1282 pp_string (pp
, sep
);
1284 pp_string (pp
, "symbol: ");
1285 dump_generic_node (pp
, TREE_OPERAND (TMR_BASE (node
), 0),
1290 pp_string (pp
, sep
);
1292 pp_string (pp
, "base: ");
1293 dump_generic_node (pp
, TMR_BASE (node
), spc
, flags
, false);
1295 tmp
= TMR_INDEX2 (node
);
1298 pp_string (pp
, sep
);
1300 pp_string (pp
, "base: ");
1301 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1303 tmp
= TMR_INDEX (node
);
1306 pp_string (pp
, sep
);
1308 pp_string (pp
, "index: ");
1309 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1311 tmp
= TMR_STEP (node
);
1314 pp_string (pp
, sep
);
1316 pp_string (pp
, "step: ");
1317 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1319 tmp
= TMR_OFFSET (node
);
1322 pp_string (pp
, sep
);
1324 pp_string (pp
, "offset: ");
1325 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1327 pp_right_bracket (pp
);
1335 /* Print the innermost component type. */
1336 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
1337 tmp
= TREE_TYPE (tmp
))
1339 dump_generic_node (pp
, tmp
, spc
, flags
, false);
1341 /* Print the dimensions. */
1342 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
1343 dump_array_domain (pp
, TYPE_DOMAIN (tmp
), spc
, flags
);
1349 case QUAL_UNION_TYPE
:
1351 unsigned int quals
= TYPE_QUALS (node
);
1353 if (quals
& TYPE_QUAL_ATOMIC
)
1354 pp_string (pp
, "atomic ");
1355 if (quals
& TYPE_QUAL_CONST
)
1356 pp_string (pp
, "const ");
1357 if (quals
& TYPE_QUAL_VOLATILE
)
1358 pp_string (pp
, "volatile ");
1360 /* Print the name of the structure. */
1361 if (TREE_CODE (node
) == RECORD_TYPE
)
1362 pp_string (pp
, "struct ");
1363 else if (TREE_CODE (node
) == UNION_TYPE
)
1364 pp_string (pp
, "union ");
1366 if (TYPE_NAME (node
))
1367 dump_generic_node (pp
, TYPE_NAME (node
), spc
, flags
, false);
1368 else if (!(flags
& TDF_SLIM
))
1369 /* FIXME: If we eliminate the 'else' above and attempt
1370 to show the fields for named types, we may get stuck
1371 following a cycle of pointers to structs. The alleged
1372 self-reference check in print_struct_decl will not detect
1373 cycles involving more than one pointer or struct type. */
1374 print_struct_decl (pp
, node
, spc
, flags
);
1383 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
1385 /* In the case of a pointer, one may want to divide by the
1386 size of the pointed-to type. Unfortunately, this not
1387 straightforward. The C front-end maps expressions
1392 in such a way that the two INTEGER_CST nodes for "5" have
1393 different values but identical types. In the latter
1394 case, the 5 is multiplied by sizeof (int) in c-common.c
1395 (pointer_int_sum) to convert it to a byte address, and
1396 yet the type of the node is left unchanged. Argh. What
1397 is consistent though is that the number value corresponds
1398 to bytes (UNITS) offset.
1400 NB: Neither of the following divisors can be trivially
1401 used to recover the original literal:
1403 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1404 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1405 pp_wide_integer (pp
, TREE_INT_CST_LOW (node
));
1406 pp_string (pp
, "B"); /* pseudo-unit */
1408 else if (tree_fits_shwi_p (node
))
1409 pp_wide_integer (pp
, tree_to_shwi (node
));
1410 else if (tree_fits_uhwi_p (node
))
1411 pp_unsigned_wide_integer (pp
, tree_to_uhwi (node
));
1414 wide_int val
= node
;
1416 if (wi::neg_p (val
, TYPE_SIGN (TREE_TYPE (node
))))
1421 print_hex (val
, pp_buffer (pp
)->digit_buffer
);
1422 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);
1424 if (TREE_OVERFLOW (node
))
1425 pp_string (pp
, "(OVF)");
1429 /* Code copied from print_node. */
1432 if (TREE_OVERFLOW (node
))
1433 pp_string (pp
, " overflow");
1435 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
1436 d
= TREE_REAL_CST (node
);
1437 if (REAL_VALUE_ISINF (d
))
1438 pp_string (pp
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
1439 else if (REAL_VALUE_ISNAN (d
))
1440 pp_string (pp
, " Nan");
1444 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
1445 pp_string (pp
, string
);
1450 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
1451 pp_string (pp
, "0x");
1452 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
1453 output_formatted_integer (pp
, "%02x", *p
++);
1462 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
1463 pp_string (pp
, string
);
1468 pp_string (pp
, "__complex__ (");
1469 dump_generic_node (pp
, TREE_REALPART (node
), spc
, flags
, false);
1470 pp_string (pp
, ", ");
1471 dump_generic_node (pp
, TREE_IMAGPART (node
), spc
, flags
, false);
1472 pp_right_paren (pp
);
1476 pp_string (pp
, "\"");
1477 pretty_print_string (pp
, TREE_STRING_POINTER (node
));
1478 pp_string (pp
, "\"");
1484 pp_string (pp
, "{ ");
1485 for (i
= 0; i
< VECTOR_CST_NELTS (node
); ++i
)
1488 pp_string (pp
, ", ");
1489 dump_generic_node (pp
, VECTOR_CST_ELT (node
, i
),
1492 pp_string (pp
, " }");
1498 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1500 if (TREE_CODE (node
) == METHOD_TYPE
)
1502 if (TYPE_METHOD_BASETYPE (node
))
1503 dump_decl_name (pp
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
1506 pp_string (pp
, "<null method basetype>");
1507 pp_colon_colon (pp
);
1509 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1510 dump_decl_name (pp
, TYPE_NAME (node
), flags
);
1511 else if (flags
& TDF_NOUID
)
1512 pp_printf (pp
, "<Txxxx>");
1514 pp_printf (pp
, "<T%x>", TYPE_UID (node
));
1515 dump_function_declaration (pp
, node
, spc
, flags
);
1520 dump_decl_name (pp
, node
, flags
);
1524 if (DECL_NAME (node
))
1525 dump_decl_name (pp
, node
, flags
);
1526 else if (LABEL_DECL_UID (node
) != -1)
1527 pp_printf (pp
, "<L%d>", (int) LABEL_DECL_UID (node
));
1530 if (flags
& TDF_NOUID
)
1531 pp_string (pp
, "<D.xxxx>");
1533 pp_printf (pp
, "<D.%u>", DECL_UID (node
));
1538 if (DECL_IS_BUILTIN (node
))
1540 /* Don't print the declaration of built-in types. */
1543 if (DECL_NAME (node
))
1544 dump_decl_name (pp
, node
, flags
);
1545 else if (TYPE_NAME (TREE_TYPE (node
)) != node
)
1547 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1548 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1549 && TYPE_METHODS (TREE_TYPE (node
)))
1551 /* The type is a c++ class: all structures have at least
1553 pp_string (pp
, "class ");
1554 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1559 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
1560 ? "union" : "struct "));
1561 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1565 pp_string (pp
, "<anon>");
1571 case DEBUG_EXPR_DECL
:
1572 case NAMESPACE_DECL
:
1574 dump_decl_name (pp
, node
, flags
);
1578 pp_string (pp
, "<retval>");
1582 op0
= TREE_OPERAND (node
, 0);
1585 && (TREE_CODE (op0
) == INDIRECT_REF
1586 || (TREE_CODE (op0
) == MEM_REF
1587 && TREE_CODE (TREE_OPERAND (op0
, 0)) != ADDR_EXPR
1588 && integer_zerop (TREE_OPERAND (op0
, 1))
1589 /* Dump the types of INTEGER_CSTs explicitly, for we
1590 can't infer them and MEM_ATTR caching will share
1591 MEM_REFs with differently-typed op0s. */
1592 && TREE_CODE (TREE_OPERAND (op0
, 0)) != INTEGER_CST
1593 /* Released SSA_NAMES have no TREE_TYPE. */
1594 && TREE_TYPE (TREE_OPERAND (op0
, 0)) != NULL_TREE
1595 /* Same pointer types, but ignoring POINTER_TYPE vs.
1597 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1598 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1599 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1600 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1601 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1602 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1603 /* Same value types ignoring qualifiers. */
1604 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0
))
1605 == TYPE_MAIN_VARIANT
1606 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1)))))
1607 && MR_DEPENDENCE_CLIQUE (op0
) == 0)))
1609 op0
= TREE_OPERAND (op0
, 0);
1612 if (op_prio (op0
) < op_prio (node
))
1614 dump_generic_node (pp
, op0
, spc
, flags
, false);
1615 if (op_prio (op0
) < op_prio (node
))
1616 pp_right_paren (pp
);
1617 pp_string (pp
, str
);
1618 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1619 op0
= component_ref_field_offset (node
);
1620 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
1622 pp_string (pp
, "{off: ");
1623 dump_generic_node (pp
, op0
, spc
, flags
, false);
1624 pp_right_brace (pp
);
1629 pp_string (pp
, "BIT_FIELD_REF <");
1630 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1631 pp_string (pp
, ", ");
1632 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1633 pp_string (pp
, ", ");
1634 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1639 case ARRAY_RANGE_REF
:
1640 op0
= TREE_OPERAND (node
, 0);
1641 if (op_prio (op0
) < op_prio (node
))
1643 dump_generic_node (pp
, op0
, spc
, flags
, false);
1644 if (op_prio (op0
) < op_prio (node
))
1645 pp_right_paren (pp
);
1646 pp_left_bracket (pp
);
1647 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1648 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
1649 pp_string (pp
, " ...");
1650 pp_right_bracket (pp
);
1652 op0
= array_ref_low_bound (node
);
1653 op1
= array_ref_element_size (node
);
1655 if (!integer_zerop (op0
)
1656 || TREE_OPERAND (node
, 2)
1657 || TREE_OPERAND (node
, 3))
1659 pp_string (pp
, "{lb: ");
1660 dump_generic_node (pp
, op0
, spc
, flags
, false);
1661 pp_string (pp
, " sz: ");
1662 dump_generic_node (pp
, op1
, spc
, flags
, false);
1663 pp_right_brace (pp
);
1669 unsigned HOST_WIDE_INT ix
;
1671 bool is_struct_init
= false;
1672 bool is_array_init
= false;
1675 if (TREE_CLOBBER_P (node
))
1676 pp_string (pp
, "CLOBBER");
1677 else if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1678 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1679 is_struct_init
= true;
1680 else if (TREE_CODE (TREE_TYPE (node
)) == ARRAY_TYPE
1681 && TYPE_DOMAIN (TREE_TYPE (node
))
1682 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)))
1683 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
))))
1686 tree minv
= TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)));
1687 is_array_init
= true;
1688 curidx
= wi::to_widest (minv
);
1690 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1697 dump_generic_node (pp
, field
, spc
, flags
, false);
1700 else if (is_array_init
1701 && (TREE_CODE (field
) != INTEGER_CST
1702 || curidx
!= wi::to_widest (field
)))
1704 pp_left_bracket (pp
);
1705 if (TREE_CODE (field
) == RANGE_EXPR
)
1707 dump_generic_node (pp
, TREE_OPERAND (field
, 0), spc
,
1709 pp_string (pp
, " ... ");
1710 dump_generic_node (pp
, TREE_OPERAND (field
, 1), spc
,
1712 if (TREE_CODE (TREE_OPERAND (field
, 1)) == INTEGER_CST
)
1713 curidx
= wi::to_widest (TREE_OPERAND (field
, 1));
1716 dump_generic_node (pp
, field
, spc
, flags
, false);
1717 if (TREE_CODE (field
) == INTEGER_CST
)
1718 curidx
= wi::to_widest (field
);
1719 pp_string (pp
, "]=");
1724 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1725 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1726 val
= TREE_OPERAND (val
, 0);
1727 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1728 dump_decl_name (pp
, val
, flags
);
1730 dump_generic_node (pp
, val
, spc
, flags
, false);
1731 if (ix
!= vec_safe_length (CONSTRUCTOR_ELTS (node
)) - 1)
1737 pp_right_brace (pp
);
1744 if (flags
& TDF_SLIM
)
1746 pp_string (pp
, "<COMPOUND_EXPR>");
1750 dump_generic_node (pp
, TREE_OPERAND (node
, 0),
1751 spc
, flags
, !(flags
& TDF_SLIM
));
1752 if (flags
& TDF_SLIM
)
1753 newline_and_indent (pp
, spc
);
1760 for (tp
= &TREE_OPERAND (node
, 1);
1761 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1762 tp
= &TREE_OPERAND (*tp
, 1))
1764 dump_generic_node (pp
, TREE_OPERAND (*tp
, 0),
1765 spc
, flags
, !(flags
& TDF_SLIM
));
1766 if (flags
& TDF_SLIM
)
1767 newline_and_indent (pp
, spc
);
1775 dump_generic_node (pp
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1779 case STATEMENT_LIST
:
1781 tree_stmt_iterator si
;
1784 if (flags
& TDF_SLIM
)
1786 pp_string (pp
, "<STATEMENT_LIST>");
1790 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1793 newline_and_indent (pp
, spc
);
1796 dump_generic_node (pp
, tsi_stmt (si
), spc
, flags
, true);
1803 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
,
1808 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
,
1813 pp_string (pp
, "TARGET_EXPR <");
1814 dump_generic_node (pp
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1817 dump_generic_node (pp
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1822 print_declaration (pp
, DECL_EXPR_DECL (node
), spc
, flags
);
1827 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1829 pp_string (pp
, "if (");
1830 dump_generic_node (pp
, COND_EXPR_COND (node
), spc
, flags
, false);
1831 pp_right_paren (pp
);
1832 /* The lowered cond_exprs should always be printed in full. */
1833 if (COND_EXPR_THEN (node
)
1834 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1835 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1836 && COND_EXPR_ELSE (node
)
1837 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1838 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1841 dump_generic_node (pp
, COND_EXPR_THEN (node
),
1843 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1845 pp_string (pp
, " else ");
1846 dump_generic_node (pp
, COND_EXPR_ELSE (node
),
1850 else if (!(flags
& TDF_SLIM
))
1852 /* Output COND_EXPR_THEN. */
1853 if (COND_EXPR_THEN (node
))
1855 newline_and_indent (pp
, spc
+2);
1857 newline_and_indent (pp
, spc
+4);
1858 dump_generic_node (pp
, COND_EXPR_THEN (node
), spc
+4,
1860 newline_and_indent (pp
, spc
+2);
1861 pp_right_brace (pp
);
1864 /* Output COND_EXPR_ELSE. */
1865 if (COND_EXPR_ELSE (node
)
1866 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1868 newline_and_indent (pp
, spc
);
1869 pp_string (pp
, "else");
1870 newline_and_indent (pp
, spc
+2);
1872 newline_and_indent (pp
, spc
+4);
1873 dump_generic_node (pp
, COND_EXPR_ELSE (node
), spc
+4,
1875 newline_and_indent (pp
, spc
+2);
1876 pp_right_brace (pp
);
1883 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1887 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1891 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1897 if (!(flags
& TDF_SLIM
))
1899 if (BIND_EXPR_VARS (node
))
1903 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= DECL_CHAIN (op0
))
1905 print_declaration (pp
, op0
, spc
+2, flags
);
1910 newline_and_indent (pp
, spc
+2);
1911 dump_generic_node (pp
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1912 newline_and_indent (pp
, spc
);
1913 pp_right_brace (pp
);
1919 if (CALL_EXPR_FN (node
) != NULL_TREE
)
1920 print_call_name (pp
, CALL_EXPR_FN (node
), flags
);
1922 pp_string (pp
, internal_fn_name (CALL_EXPR_IFN (node
)));
1924 /* Print parameters. */
1929 call_expr_arg_iterator iter
;
1930 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1932 dump_generic_node (pp
, arg
, spc
, flags
, false);
1933 if (more_call_expr_args_p (&iter
))
1940 if (CALL_EXPR_VA_ARG_PACK (node
))
1942 if (call_expr_nargs (node
) > 0)
1947 pp_string (pp
, "__builtin_va_arg_pack ()");
1949 pp_right_paren (pp
);
1951 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1954 pp_string (pp
, " [static-chain: ");
1955 dump_generic_node (pp
, op1
, spc
, flags
, false);
1956 pp_right_bracket (pp
);
1959 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1960 pp_string (pp
, " [return slot optimization]");
1961 if (CALL_EXPR_TAILCALL (node
))
1962 pp_string (pp
, " [tail call]");
1965 case WITH_CLEANUP_EXPR
:
1969 case CLEANUP_POINT_EXPR
:
1970 pp_string (pp
, "<<cleanup_point ");
1971 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1972 pp_string (pp
, ">>");
1975 case PLACEHOLDER_EXPR
:
1976 pp_string (pp
, "<PLACEHOLDER_EXPR ");
1977 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
1981 /* Binary arithmetic and logic expressions. */
1982 case WIDEN_SUM_EXPR
:
1983 case WIDEN_MULT_EXPR
:
1985 case MULT_HIGHPART_EXPR
:
1987 case POINTER_PLUS_EXPR
:
1989 case TRUNC_DIV_EXPR
:
1991 case FLOOR_DIV_EXPR
:
1992 case ROUND_DIV_EXPR
:
1993 case TRUNC_MOD_EXPR
:
1995 case FLOOR_MOD_EXPR
:
1996 case ROUND_MOD_EXPR
:
1998 case EXACT_DIV_EXPR
:
2003 case WIDEN_LSHIFT_EXPR
:
2007 case TRUTH_ANDIF_EXPR
:
2008 case TRUTH_ORIF_EXPR
:
2009 case TRUTH_AND_EXPR
:
2011 case TRUTH_XOR_EXPR
:
2025 case UNORDERED_EXPR
:
2027 const char *op
= op_symbol (node
);
2028 op0
= TREE_OPERAND (node
, 0);
2029 op1
= TREE_OPERAND (node
, 1);
2031 /* When the operands are expressions with less priority,
2032 keep semantics of the tree representation. */
2033 if (op_prio (op0
) <= op_prio (node
))
2036 dump_generic_node (pp
, op0
, spc
, flags
, false);
2037 pp_right_paren (pp
);
2040 dump_generic_node (pp
, op0
, spc
, flags
, false);
2046 /* When the operands are expressions with less priority,
2047 keep semantics of the tree representation. */
2048 if (op_prio (op1
) <= op_prio (node
))
2051 dump_generic_node (pp
, op1
, spc
, flags
, false);
2052 pp_right_paren (pp
);
2055 dump_generic_node (pp
, op1
, spc
, flags
, false);
2059 /* Unary arithmetic and logic expressions. */
2062 case TRUTH_NOT_EXPR
:
2064 case PREDECREMENT_EXPR
:
2065 case PREINCREMENT_EXPR
:
2067 if (TREE_CODE (node
) == ADDR_EXPR
2068 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
2069 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
2070 ; /* Do not output '&' for strings and function pointers. */
2072 pp_string (pp
, op_symbol (node
));
2074 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2077 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2078 pp_right_paren (pp
);
2081 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2084 case POSTDECREMENT_EXPR
:
2085 case POSTINCREMENT_EXPR
:
2086 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2089 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2090 pp_right_paren (pp
);
2093 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2094 pp_string (pp
, op_symbol (node
));
2098 pp_string (pp
, "MIN_EXPR <");
2099 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2100 pp_string (pp
, ", ");
2101 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2106 pp_string (pp
, "MAX_EXPR <");
2107 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2108 pp_string (pp
, ", ");
2109 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2114 pp_string (pp
, "ABS_EXPR <");
2115 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2123 case ADDR_SPACE_CONVERT_EXPR
:
2124 case FIXED_CONVERT_EXPR
:
2125 case FIX_TRUNC_EXPR
:
2128 type
= TREE_TYPE (node
);
2129 op0
= TREE_OPERAND (node
, 0);
2130 if (type
!= TREE_TYPE (op0
))
2133 dump_generic_node (pp
, type
, spc
, flags
, false);
2134 pp_string (pp
, ") ");
2136 if (op_prio (op0
) < op_prio (node
))
2138 dump_generic_node (pp
, op0
, spc
, flags
, false);
2139 if (op_prio (op0
) < op_prio (node
))
2140 pp_right_paren (pp
);
2143 case VIEW_CONVERT_EXPR
:
2144 pp_string (pp
, "VIEW_CONVERT_EXPR<");
2145 dump_generic_node (pp
, TREE_TYPE (node
), spc
, flags
, false);
2146 pp_string (pp
, ">(");
2147 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2148 pp_right_paren (pp
);
2152 pp_string (pp
, "((");
2153 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2154 pp_string (pp
, "))");
2157 case NON_LVALUE_EXPR
:
2158 pp_string (pp
, "NON_LVALUE_EXPR <");
2159 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2164 pp_string (pp
, "SAVE_EXPR <");
2165 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2170 pp_string (pp
, "COMPLEX_EXPR <");
2171 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2172 pp_string (pp
, ", ");
2173 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2178 pp_string (pp
, "CONJ_EXPR <");
2179 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2184 pp_string (pp
, "REALPART_EXPR <");
2185 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2190 pp_string (pp
, "IMAGPART_EXPR <");
2191 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2196 pp_string (pp
, "VA_ARG_EXPR <");
2197 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2201 case TRY_FINALLY_EXPR
:
2202 case TRY_CATCH_EXPR
:
2203 pp_string (pp
, "try");
2204 newline_and_indent (pp
, spc
+2);
2206 newline_and_indent (pp
, spc
+4);
2207 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
2208 newline_and_indent (pp
, spc
+2);
2209 pp_right_brace (pp
);
2210 newline_and_indent (pp
, spc
);
2212 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
2213 newline_and_indent (pp
, spc
+2);
2215 newline_and_indent (pp
, spc
+4);
2216 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
2217 newline_and_indent (pp
, spc
+2);
2218 pp_right_brace (pp
);
2223 pp_string (pp
, "catch (");
2224 dump_generic_node (pp
, CATCH_TYPES (node
), spc
+2, flags
, false);
2225 pp_right_paren (pp
);
2226 newline_and_indent (pp
, spc
+2);
2228 newline_and_indent (pp
, spc
+4);
2229 dump_generic_node (pp
, CATCH_BODY (node
), spc
+4, flags
, true);
2230 newline_and_indent (pp
, spc
+2);
2231 pp_right_brace (pp
);
2235 case EH_FILTER_EXPR
:
2236 pp_string (pp
, "<<<eh_filter (");
2237 dump_generic_node (pp
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
2238 pp_string (pp
, ")>>>");
2239 newline_and_indent (pp
, spc
+2);
2241 newline_and_indent (pp
, spc
+4);
2242 dump_generic_node (pp
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
2243 newline_and_indent (pp
, spc
+2);
2244 pp_right_brace (pp
);
2249 op0
= TREE_OPERAND (node
, 0);
2250 /* If this is for break or continue, don't bother printing it. */
2251 if (DECL_NAME (op0
))
2253 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2254 if (strcmp (name
, "break") == 0
2255 || strcmp (name
, "continue") == 0)
2258 dump_generic_node (pp
, op0
, spc
, flags
, false);
2260 if (DECL_NONLOCAL (op0
))
2261 pp_string (pp
, " [non-local]");
2265 pp_string (pp
, "while (1)");
2266 if (!(flags
& TDF_SLIM
))
2268 newline_and_indent (pp
, spc
+2);
2270 newline_and_indent (pp
, spc
+4);
2271 dump_generic_node (pp
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
2272 newline_and_indent (pp
, spc
+2);
2273 pp_right_brace (pp
);
2279 pp_string (pp
, "// predicted ");
2280 if (PREDICT_EXPR_OUTCOME (node
))
2281 pp_string (pp
, "likely by ");
2283 pp_string (pp
, "unlikely by ");
2284 pp_string (pp
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
2285 pp_string (pp
, " predictor.");
2289 pp_string (pp
, "ANNOTATE_EXPR <");
2290 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2291 switch ((enum annot_expr_kind
) TREE_INT_CST_LOW (TREE_OPERAND (node
, 1)))
2293 case annot_expr_ivdep_kind
:
2294 pp_string (pp
, ", ivdep");
2296 case annot_expr_no_vector_kind
:
2297 pp_string (pp
, ", no-vector");
2299 case annot_expr_vector_kind
:
2300 pp_string (pp
, ", vector");
2309 pp_string (pp
, "return");
2310 op0
= TREE_OPERAND (node
, 0);
2314 if (TREE_CODE (op0
) == MODIFY_EXPR
)
2315 dump_generic_node (pp
, TREE_OPERAND (op0
, 1),
2318 dump_generic_node (pp
, op0
, spc
, flags
, false);
2323 pp_string (pp
, "if (");
2324 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2325 pp_string (pp
, ") break");
2329 pp_string (pp
, "switch (");
2330 dump_generic_node (pp
, SWITCH_COND (node
), spc
, flags
, false);
2331 pp_right_paren (pp
);
2332 if (!(flags
& TDF_SLIM
))
2334 newline_and_indent (pp
, spc
+2);
2336 if (SWITCH_BODY (node
))
2338 newline_and_indent (pp
, spc
+4);
2339 dump_generic_node (pp
, SWITCH_BODY (node
), spc
+4, flags
,
2344 tree vec
= SWITCH_LABELS (node
);
2345 size_t i
, n
= TREE_VEC_LENGTH (vec
);
2346 for (i
= 0; i
< n
; ++i
)
2348 tree elt
= TREE_VEC_ELT (vec
, i
);
2349 newline_and_indent (pp
, spc
+4);
2352 dump_generic_node (pp
, elt
, spc
+4, flags
, false);
2353 pp_string (pp
, " goto ");
2354 dump_generic_node (pp
, CASE_LABEL (elt
), spc
+4,
2359 pp_string (pp
, "case ???: goto ???;");
2362 newline_and_indent (pp
, spc
+2);
2363 pp_right_brace (pp
);
2369 op0
= GOTO_DESTINATION (node
);
2370 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
2372 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2373 if (strcmp (name
, "break") == 0
2374 || strcmp (name
, "continue") == 0)
2376 pp_string (pp
, name
);
2380 pp_string (pp
, "goto ");
2381 dump_generic_node (pp
, op0
, spc
, flags
, false);
2385 pp_string (pp
, "__asm__");
2386 if (ASM_VOLATILE_P (node
))
2387 pp_string (pp
, " __volatile__");
2389 dump_generic_node (pp
, ASM_STRING (node
), spc
, flags
, false);
2391 dump_generic_node (pp
, ASM_OUTPUTS (node
), spc
, flags
, false);
2393 dump_generic_node (pp
, ASM_INPUTS (node
), spc
, flags
, false);
2394 if (ASM_CLOBBERS (node
))
2397 dump_generic_node (pp
, ASM_CLOBBERS (node
), spc
, flags
, false);
2399 pp_right_paren (pp
);
2402 case CASE_LABEL_EXPR
:
2403 if (CASE_LOW (node
) && CASE_HIGH (node
))
2405 pp_string (pp
, "case ");
2406 dump_generic_node (pp
, CASE_LOW (node
), spc
, flags
, false);
2407 pp_string (pp
, " ... ");
2408 dump_generic_node (pp
, CASE_HIGH (node
), spc
, flags
, false);
2410 else if (CASE_LOW (node
))
2412 pp_string (pp
, "case ");
2413 dump_generic_node (pp
, CASE_LOW (node
), spc
, flags
, false);
2416 pp_string (pp
, "default");
2421 pp_string (pp
, "OBJ_TYPE_REF(");
2422 dump_generic_node (pp
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
2424 if (!(flags
& TDF_SLIM
) && virtual_method_call_p (node
))
2426 pp_string (pp
, "(");
2427 dump_generic_node (pp
, obj_type_ref_class (node
), spc
, flags
, false);
2428 pp_string (pp
, ")");
2430 dump_generic_node (pp
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
2432 dump_generic_node (pp
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
2433 pp_right_paren (pp
);
2437 if (SSA_NAME_IDENTIFIER (node
))
2438 dump_generic_node (pp
, SSA_NAME_IDENTIFIER (node
),
2441 pp_decimal_int (pp
, SSA_NAME_VERSION (node
));
2442 if (SSA_NAME_IS_DEFAULT_DEF (node
))
2443 pp_string (pp
, "(D)");
2444 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
2445 pp_string (pp
, "(ab)");
2448 case WITH_SIZE_EXPR
:
2449 pp_string (pp
, "WITH_SIZE_EXPR <");
2450 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2451 pp_string (pp
, ", ");
2452 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2457 pp_string (pp
, "ASSERT_EXPR <");
2458 dump_generic_node (pp
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
2459 pp_string (pp
, ", ");
2460 dump_generic_node (pp
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
2465 pp_string (pp
, "scev_known");
2468 case SCEV_NOT_KNOWN
:
2469 pp_string (pp
, "scev_not_known");
2472 case POLYNOMIAL_CHREC
:
2474 dump_generic_node (pp
, CHREC_LEFT (node
), spc
, flags
, false);
2475 pp_string (pp
, ", +, ");
2476 dump_generic_node (pp
, CHREC_RIGHT (node
), spc
, flags
, false);
2477 pp_string (pp
, "}_");
2478 dump_generic_node (pp
, CHREC_VAR (node
), spc
, flags
, false);
2482 case REALIGN_LOAD_EXPR
:
2483 pp_string (pp
, "REALIGN_LOAD <");
2484 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2485 pp_string (pp
, ", ");
2486 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2487 pp_string (pp
, ", ");
2488 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2493 pp_string (pp
, " VEC_COND_EXPR < ");
2494 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2495 pp_string (pp
, " , ");
2496 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2497 pp_string (pp
, " , ");
2498 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2499 pp_string (pp
, " > ");
2503 pp_string (pp
, " VEC_PERM_EXPR < ");
2504 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2505 pp_string (pp
, " , ");
2506 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2507 pp_string (pp
, " , ");
2508 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2509 pp_string (pp
, " > ");
2513 pp_string (pp
, " DOT_PROD_EXPR < ");
2514 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2515 pp_string (pp
, ", ");
2516 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2517 pp_string (pp
, ", ");
2518 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2519 pp_string (pp
, " > ");
2522 case WIDEN_MULT_PLUS_EXPR
:
2523 pp_string (pp
, " WIDEN_MULT_PLUS_EXPR < ");
2524 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2525 pp_string (pp
, ", ");
2526 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2527 pp_string (pp
, ", ");
2528 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2529 pp_string (pp
, " > ");
2532 case WIDEN_MULT_MINUS_EXPR
:
2533 pp_string (pp
, " WIDEN_MULT_MINUS_EXPR < ");
2534 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2535 pp_string (pp
, ", ");
2536 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2537 pp_string (pp
, ", ");
2538 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2539 pp_string (pp
, " > ");
2543 pp_string (pp
, " FMA_EXPR < ");
2544 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2545 pp_string (pp
, ", ");
2546 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2547 pp_string (pp
, ", ");
2548 dump_generic_node (pp
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2549 pp_string (pp
, " > ");
2553 pp_string (pp
, "#pragma acc parallel");
2554 dump_omp_clauses (pp
, OACC_PARALLEL_CLAUSES (node
), spc
, flags
);
2558 pp_string (pp
, "#pragma acc kernels");
2559 dump_omp_clauses (pp
, OACC_KERNELS_CLAUSES (node
), spc
, flags
);
2563 pp_string (pp
, "#pragma acc data");
2564 dump_omp_clauses (pp
, OACC_DATA_CLAUSES (node
), spc
, flags
);
2567 case OACC_HOST_DATA
:
2568 pp_string (pp
, "#pragma acc host_data");
2569 dump_omp_clauses (pp
, OACC_HOST_DATA_CLAUSES (node
), spc
, flags
);
2573 pp_string (pp
, "#pragma acc declare");
2574 dump_omp_clauses (pp
, OACC_DECLARE_CLAUSES (node
), spc
, flags
);
2578 pp_string (pp
, "#pragma acc update");
2579 dump_omp_clauses (pp
, OACC_UPDATE_CLAUSES (node
), spc
, flags
);
2582 case OACC_ENTER_DATA
:
2583 pp_string (pp
, "#pragma acc enter data");
2584 dump_omp_clauses (pp
, OACC_ENTER_DATA_CLAUSES (node
), spc
, flags
);
2587 case OACC_EXIT_DATA
:
2588 pp_string (pp
, "#pragma acc exit data");
2589 dump_omp_clauses (pp
, OACC_EXIT_DATA_CLAUSES (node
), spc
, flags
);
2593 pp_string (pp
, "#pragma acc cache");
2594 dump_omp_clauses (pp
, OACC_CACHE_CLAUSES (node
), spc
, flags
);
2598 pp_string (pp
, "#pragma omp parallel");
2599 dump_omp_clauses (pp
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
2602 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
2604 newline_and_indent (pp
, spc
+ 2);
2606 newline_and_indent (pp
, spc
+ 4);
2607 dump_generic_node (pp
, OMP_BODY (node
), spc
+ 4, flags
, false);
2608 newline_and_indent (pp
, spc
+ 2);
2609 pp_right_brace (pp
);
2615 pp_string (pp
, "#pragma omp task");
2616 dump_omp_clauses (pp
, OMP_TASK_CLAUSES (node
), spc
, flags
);
2620 pp_string (pp
, "#pragma omp for");
2624 pp_string (pp
, "#pragma omp simd");
2628 pp_string (pp
, "#pragma simd");
2632 /* This label points one line after dumping the clauses.
2633 For _Cilk_for the clauses are dumped after the _Cilk_for (...)
2634 parameters are printed out. */
2635 goto dump_omp_loop_cilk_for
;
2637 case OMP_DISTRIBUTE
:
2638 pp_string (pp
, "#pragma omp distribute");
2642 pp_string (pp
, "#pragma acc loop");
2646 pp_string (pp
, "#pragma omp teams");
2647 dump_omp_clauses (pp
, OMP_TEAMS_CLAUSES (node
), spc
, flags
);
2650 case OMP_TARGET_DATA
:
2651 pp_string (pp
, "#pragma omp target data");
2652 dump_omp_clauses (pp
, OMP_TARGET_DATA_CLAUSES (node
), spc
, flags
);
2656 pp_string (pp
, "#pragma omp target");
2657 dump_omp_clauses (pp
, OMP_TARGET_CLAUSES (node
), spc
, flags
);
2660 case OMP_TARGET_UPDATE
:
2661 pp_string (pp
, "#pragma omp target update");
2662 dump_omp_clauses (pp
, OMP_TARGET_UPDATE_CLAUSES (node
), spc
, flags
);
2667 dump_omp_clauses (pp
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2669 dump_omp_loop_cilk_for
:
2670 if (!(flags
& TDF_SLIM
))
2674 if (OMP_FOR_PRE_BODY (node
))
2676 if (TREE_CODE (node
) == CILK_FOR
)
2677 pp_string (pp
, " ");
2679 newline_and_indent (pp
, spc
+ 2);
2682 newline_and_indent (pp
, spc
);
2683 dump_generic_node (pp
, OMP_FOR_PRE_BODY (node
),
2686 if (OMP_FOR_INIT (node
))
2689 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
2692 if (TREE_CODE (node
) != CILK_FOR
|| OMP_FOR_PRE_BODY (node
))
2693 newline_and_indent (pp
, spc
);
2694 if (TREE_CODE (node
) == CILK_FOR
)
2695 pp_string (pp
, "_Cilk_for (");
2697 pp_string (pp
, "for (");
2698 dump_generic_node (pp
,
2699 TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
2701 pp_string (pp
, "; ");
2702 dump_generic_node (pp
,
2703 TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
2705 pp_string (pp
, "; ");
2706 dump_generic_node (pp
,
2707 TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
2709 pp_right_paren (pp
);
2711 if (TREE_CODE (node
) == CILK_FOR
)
2712 dump_omp_clauses (pp
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2714 if (OMP_FOR_BODY (node
))
2716 newline_and_indent (pp
, spc
+ 2);
2718 newline_and_indent (pp
, spc
+ 4);
2719 dump_generic_node (pp
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
2721 newline_and_indent (pp
, spc
+ 2);
2722 pp_right_brace (pp
);
2724 if (OMP_FOR_INIT (node
))
2725 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
2726 if (OMP_FOR_PRE_BODY (node
))
2729 newline_and_indent (pp
, spc
+ 2);
2730 pp_right_brace (pp
);
2737 pp_string (pp
, "#pragma omp sections");
2738 dump_omp_clauses (pp
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
2742 pp_string (pp
, "#pragma omp section");
2746 pp_string (pp
, "#pragma omp master");
2750 pp_string (pp
, "#pragma omp taskgroup");
2754 pp_string (pp
, "#pragma omp ordered");
2758 pp_string (pp
, "#pragma omp critical");
2759 if (OMP_CRITICAL_NAME (node
))
2763 dump_generic_node (pp
, OMP_CRITICAL_NAME (node
), spc
,
2765 pp_right_paren (pp
);
2770 pp_string (pp
, "#pragma omp atomic");
2771 if (OMP_ATOMIC_SEQ_CST (node
))
2772 pp_string (pp
, " seq_cst");
2773 newline_and_indent (pp
, spc
+ 2);
2774 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2778 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2781 case OMP_ATOMIC_READ
:
2782 pp_string (pp
, "#pragma omp atomic read");
2783 if (OMP_ATOMIC_SEQ_CST (node
))
2784 pp_string (pp
, " seq_cst");
2785 newline_and_indent (pp
, spc
+ 2);
2786 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2790 case OMP_ATOMIC_CAPTURE_OLD
:
2791 case OMP_ATOMIC_CAPTURE_NEW
:
2792 pp_string (pp
, "#pragma omp atomic capture");
2793 if (OMP_ATOMIC_SEQ_CST (node
))
2794 pp_string (pp
, " seq_cst");
2795 newline_and_indent (pp
, spc
+ 2);
2796 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2800 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2804 pp_string (pp
, "#pragma omp single");
2805 dump_omp_clauses (pp
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
2809 dump_omp_clause (pp
, node
, spc
, flags
);
2813 case TRANSACTION_EXPR
:
2814 if (TRANSACTION_EXPR_OUTER (node
))
2815 pp_string (pp
, "__transaction_atomic [[outer]]");
2816 else if (TRANSACTION_EXPR_RELAXED (node
))
2817 pp_string (pp
, "__transaction_relaxed");
2819 pp_string (pp
, "__transaction_atomic");
2820 if (!(flags
& TDF_SLIM
) && TRANSACTION_EXPR_BODY (node
))
2822 newline_and_indent (pp
, spc
);
2824 newline_and_indent (pp
, spc
+ 2);
2825 dump_generic_node (pp
, TRANSACTION_EXPR_BODY (node
),
2826 spc
+ 2, flags
, false);
2827 newline_and_indent (pp
, spc
);
2828 pp_right_brace (pp
);
2833 case REDUC_MAX_EXPR
:
2834 pp_string (pp
, " REDUC_MAX_EXPR < ");
2835 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2836 pp_string (pp
, " > ");
2839 case REDUC_MIN_EXPR
:
2840 pp_string (pp
, " REDUC_MIN_EXPR < ");
2841 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2842 pp_string (pp
, " > ");
2845 case REDUC_PLUS_EXPR
:
2846 pp_string (pp
, " REDUC_PLUS_EXPR < ");
2847 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2848 pp_string (pp
, " > ");
2851 case VEC_WIDEN_MULT_HI_EXPR
:
2852 case VEC_WIDEN_MULT_LO_EXPR
:
2853 case VEC_WIDEN_MULT_EVEN_EXPR
:
2854 case VEC_WIDEN_MULT_ODD_EXPR
:
2855 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2856 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2858 for (str
= get_tree_code_name (code
); *str
; str
++)
2859 pp_character (pp
, TOUPPER (*str
));
2860 pp_string (pp
, " < ");
2861 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2862 pp_string (pp
, ", ");
2863 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2864 pp_string (pp
, " > ");
2867 case VEC_UNPACK_HI_EXPR
:
2868 pp_string (pp
, " VEC_UNPACK_HI_EXPR < ");
2869 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2870 pp_string (pp
, " > ");
2873 case VEC_UNPACK_LO_EXPR
:
2874 pp_string (pp
, " VEC_UNPACK_LO_EXPR < ");
2875 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2876 pp_string (pp
, " > ");
2879 case VEC_UNPACK_FLOAT_HI_EXPR
:
2880 pp_string (pp
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2881 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2882 pp_string (pp
, " > ");
2885 case VEC_UNPACK_FLOAT_LO_EXPR
:
2886 pp_string (pp
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2887 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2888 pp_string (pp
, " > ");
2891 case VEC_PACK_TRUNC_EXPR
:
2892 pp_string (pp
, " VEC_PACK_TRUNC_EXPR < ");
2893 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2894 pp_string (pp
, ", ");
2895 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2896 pp_string (pp
, " > ");
2899 case VEC_PACK_SAT_EXPR
:
2900 pp_string (pp
, " VEC_PACK_SAT_EXPR < ");
2901 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2902 pp_string (pp
, ", ");
2903 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2904 pp_string (pp
, " > ");
2907 case VEC_PACK_FIX_TRUNC_EXPR
:
2908 pp_string (pp
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2909 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2910 pp_string (pp
, ", ");
2911 dump_generic_node (pp
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2912 pp_string (pp
, " > ");
2916 dump_block_node (pp
, node
, spc
, flags
);
2919 case CILK_SPAWN_STMT
:
2920 pp_string (pp
, "_Cilk_spawn ");
2921 dump_generic_node (pp
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2924 case CILK_SYNC_STMT
:
2925 pp_string (pp
, "_Cilk_sync");
2932 if (is_stmt
&& is_expr
)
2938 /* Print the declaration of a variable. */
2941 print_declaration (pretty_printer
*pp
, tree t
, int spc
, int flags
)
2945 if (TREE_CODE(t
) == NAMELIST_DECL
)
2947 pp_string(pp
, "namelist ");
2948 dump_decl_name (pp
, t
, flags
);
2953 if (TREE_CODE (t
) == TYPE_DECL
)
2954 pp_string (pp
, "typedef ");
2956 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2957 pp_string (pp
, "register ");
2959 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2960 pp_string (pp
, "extern ");
2961 else if (TREE_STATIC (t
))
2962 pp_string (pp
, "static ");
2964 /* Print the type and name. */
2965 if (TREE_TYPE (t
) && TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2969 /* Print array's type. */
2970 tmp
= TREE_TYPE (t
);
2971 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2972 tmp
= TREE_TYPE (tmp
);
2973 dump_generic_node (pp
, TREE_TYPE (tmp
), spc
, flags
, false);
2975 /* Print variable's name. */
2977 dump_generic_node (pp
, t
, spc
, flags
, false);
2979 /* Print the dimensions. */
2980 tmp
= TREE_TYPE (t
);
2981 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2983 dump_array_domain (pp
, TYPE_DOMAIN (tmp
), spc
, flags
);
2984 tmp
= TREE_TYPE (tmp
);
2987 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2989 dump_generic_node (pp
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2991 dump_decl_name (pp
, t
, flags
);
2992 dump_function_declaration (pp
, TREE_TYPE (t
), spc
, flags
);
2996 /* Print type declaration. */
2997 dump_generic_node (pp
, TREE_TYPE (t
), spc
, flags
, false);
2999 /* Print variable's name. */
3001 dump_generic_node (pp
, t
, spc
, flags
, false);
3004 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
3006 pp_string (pp
, " __asm__ ");
3008 dump_generic_node (pp
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
3009 pp_right_paren (pp
);
3012 /* The initial value of a function serves to determine whether the function
3013 is declared or defined. So the following does not apply to function
3015 if (TREE_CODE (t
) != FUNCTION_DECL
)
3017 /* Print the initial value. */
3018 if (DECL_INITIAL (t
))
3023 dump_generic_node (pp
, DECL_INITIAL (t
), spc
, flags
, false);
3027 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
3029 pp_string (pp
, " [value-expr: ");
3030 dump_generic_node (pp
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
3031 pp_right_bracket (pp
);
3038 /* Prints a structure: name, fields, and methods.
3039 FIXME: Still incomplete. */
3042 print_struct_decl (pretty_printer
*pp
, const_tree node
, int spc
, int flags
)
3044 /* Print the name of the structure. */
3045 if (TYPE_NAME (node
))
3048 if (TREE_CODE (node
) == RECORD_TYPE
)
3049 pp_string (pp
, "struct ");
3050 else if ((TREE_CODE (node
) == UNION_TYPE
3051 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
3052 pp_string (pp
, "union ");
3054 dump_generic_node (pp
, TYPE_NAME (node
), spc
, 0, false);
3057 /* Print the contents of the structure. */
3063 /* Print the fields of the structure. */
3066 tmp
= TYPE_FIELDS (node
);
3069 /* Avoid to print recursively the structure. */
3070 /* FIXME : Not implemented correctly...,
3071 what about the case when we have a cycle in the contain graph? ...
3072 Maybe this could be solved by looking at the scope in which the
3073 structure was declared. */
3074 if (TREE_TYPE (tmp
) != node
3075 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
3076 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
3078 print_declaration (pp
, tmp
, spc
+2, flags
);
3081 tmp
= DECL_CHAIN (tmp
);
3085 pp_right_brace (pp
);
3088 /* Return the priority of the operator CODE.
3090 From lowest to highest precedence with either left-to-right (L-R)
3091 or right-to-left (R-L) associativity]:
3094 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
3106 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
3107 15 [L-R] fn() [] -> .
3109 unary +, - and * have higher precedence than the corresponding binary
3113 op_code_prio (enum tree_code code
)
3130 case TRUTH_ORIF_EXPR
:
3133 case TRUTH_AND_EXPR
:
3134 case TRUTH_ANDIF_EXPR
:
3141 case TRUTH_XOR_EXPR
:
3158 case UNORDERED_EXPR
:
3169 case VEC_WIDEN_LSHIFT_HI_EXPR
:
3170 case VEC_WIDEN_LSHIFT_LO_EXPR
:
3171 case WIDEN_LSHIFT_EXPR
:
3174 case WIDEN_SUM_EXPR
:
3176 case POINTER_PLUS_EXPR
:
3180 case VEC_WIDEN_MULT_HI_EXPR
:
3181 case VEC_WIDEN_MULT_LO_EXPR
:
3182 case WIDEN_MULT_EXPR
:
3184 case WIDEN_MULT_PLUS_EXPR
:
3185 case WIDEN_MULT_MINUS_EXPR
:
3187 case MULT_HIGHPART_EXPR
:
3188 case TRUNC_DIV_EXPR
:
3190 case FLOOR_DIV_EXPR
:
3191 case ROUND_DIV_EXPR
:
3193 case EXACT_DIV_EXPR
:
3194 case TRUNC_MOD_EXPR
:
3196 case FLOOR_MOD_EXPR
:
3197 case ROUND_MOD_EXPR
:
3201 case TRUTH_NOT_EXPR
:
3203 case POSTINCREMENT_EXPR
:
3204 case POSTDECREMENT_EXPR
:
3205 case PREINCREMENT_EXPR
:
3206 case PREDECREMENT_EXPR
:
3212 case FIX_TRUNC_EXPR
:
3218 case ARRAY_RANGE_REF
:
3222 /* Special expressions. */
3228 case REDUC_MAX_EXPR
:
3229 case REDUC_MIN_EXPR
:
3230 case REDUC_PLUS_EXPR
:
3231 case VEC_UNPACK_HI_EXPR
:
3232 case VEC_UNPACK_LO_EXPR
:
3233 case VEC_UNPACK_FLOAT_HI_EXPR
:
3234 case VEC_UNPACK_FLOAT_LO_EXPR
:
3235 case VEC_PACK_TRUNC_EXPR
:
3236 case VEC_PACK_SAT_EXPR
:
3240 /* Return an arbitrarily high precedence to avoid surrounding single
3241 VAR_DECLs in ()s. */
3246 /* Return the priority of the operator OP. */
3249 op_prio (const_tree op
)
3251 enum tree_code code
;
3256 code
= TREE_CODE (op
);
3257 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
3258 return op_prio (TREE_OPERAND (op
, 0));
3260 return op_code_prio (code
);
3263 /* Return the symbol associated with operator CODE. */
3266 op_symbol_code (enum tree_code code
)
3274 case TRUTH_ORIF_EXPR
:
3277 case TRUTH_AND_EXPR
:
3278 case TRUTH_ANDIF_EXPR
:
3284 case TRUTH_XOR_EXPR
:
3294 case UNORDERED_EXPR
:
3340 case WIDEN_LSHIFT_EXPR
:
3343 case POINTER_PLUS_EXPR
:
3349 case REDUC_PLUS_EXPR
:
3352 case WIDEN_SUM_EXPR
:
3355 case WIDEN_MULT_EXPR
:
3358 case MULT_HIGHPART_EXPR
:
3368 case TRUTH_NOT_EXPR
:
3375 case TRUNC_DIV_EXPR
:
3382 case FLOOR_DIV_EXPR
:
3385 case ROUND_DIV_EXPR
:
3388 case EXACT_DIV_EXPR
:
3391 case TRUNC_MOD_EXPR
:
3397 case FLOOR_MOD_EXPR
:
3400 case ROUND_MOD_EXPR
:
3403 case PREDECREMENT_EXPR
:
3406 case PREINCREMENT_EXPR
:
3409 case POSTDECREMENT_EXPR
:
3412 case POSTINCREMENT_EXPR
:
3422 return "<<< ??? >>>";
3426 /* Return the symbol associated with operator OP. */
3429 op_symbol (const_tree op
)
3431 return op_symbol_code (TREE_CODE (op
));
3434 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
3435 the gimple_call_fn of a GIMPLE_CALL. */
3438 print_call_name (pretty_printer
*pp
, tree node
, int flags
)
3442 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
3443 op0
= TREE_OPERAND (op0
, 0);
3446 switch (TREE_CODE (op0
))
3451 dump_function_name (pp
, op0
, flags
);
3457 op0
= TREE_OPERAND (op0
, 0);
3462 dump_generic_node (pp
, TREE_OPERAND (op0
, 0), 0, flags
, false);
3463 pp_string (pp
, ") ? ");
3464 dump_generic_node (pp
, TREE_OPERAND (op0
, 1), 0, flags
, false);
3465 pp_string (pp
, " : ");
3466 dump_generic_node (pp
, TREE_OPERAND (op0
, 2), 0, flags
, false);
3470 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
3471 dump_function_name (pp
, TREE_OPERAND (op0
, 0), flags
);
3473 dump_generic_node (pp
, op0
, 0, flags
, false);
3477 if (integer_zerop (TREE_OPERAND (op0
, 1)))
3479 op0
= TREE_OPERAND (op0
, 0);
3486 dump_generic_node (pp
, op0
, 0, flags
, false);
3494 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
3497 pretty_print_string (pretty_printer
*pp
, const char *str
)
3507 pp_string (pp
, "\\b");
3511 pp_string (pp
, "\\f");
3515 pp_string (pp
, "\\n");
3519 pp_string (pp
, "\\r");
3523 pp_string (pp
, "\\t");
3527 pp_string (pp
, "\\v");
3531 pp_string (pp
, "\\\\");
3535 pp_string (pp
, "\\\"");
3539 pp_string (pp
, "\\'");
3542 /* No need to handle \0; the loop terminates on \0. */
3545 pp_string (pp
, "\\1");
3549 pp_string (pp
, "\\2");
3553 pp_string (pp
, "\\3");
3557 pp_string (pp
, "\\4");
3561 pp_string (pp
, "\\5");
3565 pp_string (pp
, "\\6");
3569 pp_string (pp
, "\\7");
3573 pp_character (pp
, str
[0]);
3581 maybe_init_pretty_print (FILE *file
)
3585 tree_pp
= new pretty_printer ();
3586 pp_needs_newline (tree_pp
) = true;
3587 pp_translate_identifiers (tree_pp
) = false;
3590 tree_pp
->buffer
->stream
= file
;
3594 newline_and_indent (pretty_printer
*pp
, int spc
)
3600 /* Handle a %K format for TEXT. Separate from default_tree_printer so
3601 it can also be used in front ends.
3602 %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
3606 percent_K_format (text_info
*text
)
3608 tree t
= va_arg (*text
->args_ptr
, tree
), block
;
3609 gcc_assert (text
->locus
!= NULL
);
3610 *text
->locus
= EXPR_LOCATION (t
);
3611 gcc_assert (pp_ti_abstract_origin (text
) != NULL
);
3612 block
= TREE_BLOCK (t
);
3613 *pp_ti_abstract_origin (text
) = NULL
;
3617 /* ??? LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those
3618 representing the outermost block of an inlined function.
3619 So walk the BLOCK tree until we hit such a scope. */
3621 && TREE_CODE (block
) == BLOCK
)
3623 if (inlined_function_outer_scope_p (block
))
3625 *pp_ti_abstract_origin (text
) = block
;
3628 block
= BLOCK_SUPERCONTEXT (block
);
3634 && TREE_CODE (block
) == BLOCK
3635 && BLOCK_ABSTRACT_ORIGIN (block
))
3637 tree ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3639 while (TREE_CODE (ao
) == BLOCK
3640 && BLOCK_ABSTRACT_ORIGIN (ao
)
3641 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3642 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3644 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3646 *pp_ti_abstract_origin (text
) = block
;
3649 block
= BLOCK_SUPERCONTEXT (block
);
3653 /* Print the identifier ID to PRETTY-PRINTER. */
3656 pp_tree_identifier (pretty_printer
*pp
, tree id
)
3658 if (pp_translate_identifiers (pp
))
3660 const char *text
= identifier_to_locale (IDENTIFIER_POINTER (id
));
3661 pp_append_text (pp
, text
, text
+ strlen (text
));
3664 pp_append_text (pp
, IDENTIFIER_POINTER (id
),
3665 IDENTIFIER_POINTER (id
) + IDENTIFIER_LENGTH (id
));
3668 /* A helper function that is used to dump function information before the
3672 dump_function_header (FILE *dump_file
, tree fdecl
, int flags
)
3674 const char *dname
, *aname
;
3675 struct cgraph_node
*node
= cgraph_node::get (fdecl
);
3676 struct function
*fun
= DECL_STRUCT_FUNCTION (fdecl
);
3678 dname
= lang_hooks
.decl_printable_name (fdecl
, 2);
3680 if (DECL_ASSEMBLER_NAME_SET_P (fdecl
))
3681 aname
= (IDENTIFIER_POINTER
3682 (DECL_ASSEMBLER_NAME (fdecl
)));
3684 aname
= "<unset-asm-name>";
3686 fprintf (dump_file
, "\n;; Function %s (%s, funcdef_no=%d",
3687 dname
, aname
, fun
->funcdef_no
);
3688 if (!(flags
& TDF_NOUID
))
3689 fprintf (dump_file
, ", decl_uid=%d", DECL_UID (fdecl
));
3692 fprintf (dump_file
, ", cgraph_uid=%d", node
->uid
);
3693 fprintf (dump_file
, ", symbol_order=%d)%s\n\n", node
->order
,
3694 node
->frequency
== NODE_FREQUENCY_HOT
3696 : node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
3697 ? " (unlikely executed)"
3698 : node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
3699 ? " (executed once)"
3703 fprintf (dump_file
, ")\n\n");
3706 /* Dump double_int D to pretty_printer PP. UNS is true
3707 if D is unsigned and false otherwise. */
3709 pp_double_int (pretty_printer
*pp
, double_int d
, bool uns
)
3712 pp_wide_integer (pp
, d
.low
);
3713 else if (d
.fits_uhwi ())
3714 pp_unsigned_wide_integer (pp
, d
.low
);
3717 unsigned HOST_WIDE_INT low
= d
.low
;
3718 HOST_WIDE_INT high
= d
.high
;
3719 if (!uns
&& d
.is_negative ())
3722 high
= ~high
+ !low
;
3725 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
3727 sprintf (pp_buffer (pp
)->digit_buffer
,
3728 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
3729 (unsigned HOST_WIDE_INT
) high
, low
);
3730 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);