1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001-2014 Free Software Foundation, Inc.
3 Adapted from c-pretty-print.c by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
26 #include "stor-layout.h"
28 #include "tree-pretty-print.h"
31 #include "gimple-expr.h"
35 #include "plugin-api.h"
38 #include "hard-reg-set.h"
43 #include "langhooks.h"
44 #include "tree-iterator.h"
45 #include "tree-chrec.h"
47 #include "value-prof.h"
48 #include "wide-int-print.h"
49 #include "internal-fn.h"
51 #include <new> // For placement-new.
53 /* Local functions, macros and variables. */
54 static const char *op_symbol (const_tree
);
55 static void pretty_print_string (pretty_printer
*, const char*);
56 static void newline_and_indent (pretty_printer
*, int);
57 static void maybe_init_pretty_print (FILE *);
58 static void print_struct_decl (pretty_printer
*, const_tree
, int, int);
59 static void do_niy (pretty_printer
*, const_tree
);
61 #define INDENT(SPACE) do { \
62 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
64 #define NIY do_niy (buffer, node)
66 static pretty_printer buffer
;
67 static int initialized
= 0;
69 /* Try to print something for an unknown tree code. */
72 do_niy (pretty_printer
*buffer
, const_tree node
)
76 pp_string (buffer
, "<<< Unknown tree: ");
77 pp_string (buffer
, get_tree_code_name (TREE_CODE (node
)));
81 len
= TREE_OPERAND_LENGTH (node
);
82 for (i
= 0; i
< len
; ++i
)
84 newline_and_indent (buffer
, 2);
85 dump_generic_node (buffer
, TREE_OPERAND (node
, i
), 2, 0, false);
89 pp_string (buffer
, " >>>");
92 /* Debugging function to print out a generic expression. */
95 debug_generic_expr (tree t
)
97 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
98 fprintf (stderr
, "\n");
101 /* Debugging function to print out a generic statement. */
104 debug_generic_stmt (tree t
)
106 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
107 fprintf (stderr
, "\n");
110 /* Debugging function to print out a chain of trees . */
113 debug_tree_chain (tree t
)
119 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
120 fprintf (stderr
, " ");
124 fprintf (stderr
, "... [cycled back to ");
125 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
126 fprintf (stderr
, "]");
130 fprintf (stderr
, "\n");
133 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
135 print_generic_decl (FILE *file
, tree decl
, int flags
)
137 maybe_init_pretty_print (file
);
138 print_declaration (&buffer
, decl
, 2, flags
);
139 pp_write_text_to_stream (&buffer
);
142 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
143 to show in the dump. See TDF_* in dumpfile.h. */
146 print_generic_stmt (FILE *file
, tree t
, int flags
)
148 maybe_init_pretty_print (file
);
149 dump_generic_node (&buffer
, t
, 0, flags
, true);
150 pp_newline_and_flush (&buffer
);
153 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
154 to show in the dump. See TDF_* in dumpfile.h. The output is indented by
158 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
162 maybe_init_pretty_print (file
);
164 for (i
= 0; i
< indent
; i
++)
166 dump_generic_node (&buffer
, t
, indent
, flags
, true);
167 pp_newline_and_flush (&buffer
);
170 /* Print a single expression T on file FILE. FLAGS specifies details to show
171 in the dump. See TDF_* in dumpfile.h. */
174 print_generic_expr (FILE *file
, tree t
, int flags
)
176 maybe_init_pretty_print (file
);
177 dump_generic_node (&buffer
, t
, 0, flags
, false);
181 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
185 dump_decl_name (pretty_printer
*buffer
, tree node
, int flags
)
187 if (DECL_NAME (node
))
189 if ((flags
& TDF_ASMNAME
) && DECL_ASSEMBLER_NAME_SET_P (node
))
190 pp_tree_identifier (buffer
, DECL_ASSEMBLER_NAME (node
));
192 pp_tree_identifier (buffer
, DECL_NAME (node
));
194 if ((flags
& TDF_UID
) || DECL_NAME (node
) == NULL_TREE
)
196 if (TREE_CODE (node
) == LABEL_DECL
&& LABEL_DECL_UID (node
) != -1)
197 pp_printf (buffer
, "L.%d", (int) LABEL_DECL_UID (node
));
198 else if (TREE_CODE (node
) == DEBUG_EXPR_DECL
)
200 if (flags
& TDF_NOUID
)
201 pp_string (buffer
, "D#xxxx");
203 pp_printf (buffer
, "D#%i", DEBUG_TEMP_UID (node
));
207 char c
= TREE_CODE (node
) == CONST_DECL
? 'C' : 'D';
208 if (flags
& TDF_NOUID
)
209 pp_printf (buffer
, "%c.xxxx", c
);
211 pp_printf (buffer
, "%c.%u", c
, DECL_UID (node
));
214 if ((flags
& TDF_ALIAS
) && DECL_PT_UID (node
) != DECL_UID (node
))
216 if (flags
& TDF_NOUID
)
217 pp_printf (buffer
, "ptD.xxxx");
219 pp_printf (buffer
, "ptD.%u", DECL_PT_UID (node
));
223 /* Like the above, but used for pretty printing function calls. */
226 dump_function_name (pretty_printer
*buffer
, tree node
, int flags
)
228 if (TREE_CODE (node
) == NOP_EXPR
)
229 node
= TREE_OPERAND (node
, 0);
230 if (DECL_NAME (node
) && (flags
& TDF_ASMNAME
) == 0)
231 pp_string (buffer
, lang_hooks
.decl_printable_name (node
, 1));
233 dump_decl_name (buffer
, node
, flags
);
236 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
237 FLAGS are as in dump_generic_node. */
240 dump_function_declaration (pretty_printer
*buffer
, tree node
,
243 bool wrote_arg
= false;
247 pp_left_paren (buffer
);
249 /* Print the argument types. */
250 arg
= TYPE_ARG_TYPES (node
);
251 while (arg
&& arg
!= void_list_node
&& arg
!= error_mark_node
)
259 dump_generic_node (buffer
, TREE_VALUE (arg
), spc
, flags
, false);
260 arg
= TREE_CHAIN (arg
);
263 /* Drop the trailing void_type_node if we had any previous argument. */
264 if (arg
== void_list_node
&& !wrote_arg
)
265 pp_string (buffer
, "void");
266 /* Properly dump vararg function types. */
267 else if (!arg
&& wrote_arg
)
268 pp_string (buffer
, ", ...");
269 /* Avoid printing any arg for unprototyped functions. */
271 pp_right_paren (buffer
);
274 /* Dump the domain associated with an array. */
277 dump_array_domain (pretty_printer
*buffer
, tree domain
, int spc
, int flags
)
279 pp_left_bracket (buffer
);
282 tree min
= TYPE_MIN_VALUE (domain
);
283 tree max
= TYPE_MAX_VALUE (domain
);
286 && integer_zerop (min
)
287 && tree_fits_shwi_p (max
))
288 pp_wide_integer (buffer
, tree_to_shwi (max
) + 1);
292 dump_generic_node (buffer
, min
, spc
, flags
, false);
295 dump_generic_node (buffer
, max
, spc
, flags
, false);
299 pp_string (buffer
, "<unknown>");
300 pp_right_bracket (buffer
);
304 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
305 dump_generic_node. */
308 dump_omp_clause (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
312 switch (OMP_CLAUSE_CODE (clause
))
314 case OMP_CLAUSE_PRIVATE
:
317 case OMP_CLAUSE_SHARED
:
320 case OMP_CLAUSE_FIRSTPRIVATE
:
321 name
= "firstprivate";
323 case OMP_CLAUSE_LASTPRIVATE
:
324 name
= "lastprivate";
326 case OMP_CLAUSE_COPYIN
:
329 case OMP_CLAUSE_COPYPRIVATE
:
330 name
= "copyprivate";
332 case OMP_CLAUSE_UNIFORM
:
335 case OMP_CLAUSE__LOOPTEMP_
:
338 case OMP_CLAUSE_HOST
:
341 case OMP_CLAUSE_OACC_DEVICE
:
344 case OMP_CLAUSE_DEVICE_RESIDENT
:
345 name
= "device_resident";
347 case OMP_CLAUSE_USE_DEVICE
:
351 pp_string (buffer
, name
);
352 pp_left_paren (buffer
);
353 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
355 pp_right_paren (buffer
);
358 case OMP_CLAUSE_REDUCTION
:
359 pp_string (buffer
, "reduction(");
360 if (OMP_CLAUSE_REDUCTION_CODE (clause
) != ERROR_MARK
)
363 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
366 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
368 pp_right_paren (buffer
);
372 pp_string (buffer
, "if(");
373 dump_generic_node (buffer
, OMP_CLAUSE_IF_EXPR (clause
),
375 pp_right_paren (buffer
);
378 case OMP_CLAUSE_NUM_THREADS
:
379 pp_string (buffer
, "num_threads(");
380 dump_generic_node (buffer
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
382 pp_right_paren (buffer
);
385 case OMP_CLAUSE__CILK_FOR_COUNT_
:
386 pp_string (buffer
, "_Cilk_for_count_(");
387 dump_generic_node (buffer
, OMP_CLAUSE_OPERAND (clause
, 0),
389 pp_right_paren (buffer
);
392 case OMP_CLAUSE_NOWAIT
:
393 pp_string (buffer
, "nowait");
395 case OMP_CLAUSE_ORDERED
:
396 pp_string (buffer
, "ordered");
399 case OMP_CLAUSE_DEFAULT
:
400 pp_string (buffer
, "default(");
401 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
403 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
405 case OMP_CLAUSE_DEFAULT_SHARED
:
406 pp_string (buffer
, "shared");
408 case OMP_CLAUSE_DEFAULT_NONE
:
409 pp_string (buffer
, "none");
411 case OMP_CLAUSE_DEFAULT_PRIVATE
:
412 pp_string (buffer
, "private");
414 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
415 pp_string (buffer
, "firstprivate");
420 pp_right_paren (buffer
);
423 case OMP_CLAUSE_SCHEDULE
:
424 pp_string (buffer
, "schedule(");
425 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
427 case OMP_CLAUSE_SCHEDULE_STATIC
:
428 pp_string (buffer
, "static");
430 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
431 pp_string (buffer
, "dynamic");
433 case OMP_CLAUSE_SCHEDULE_GUIDED
:
434 pp_string (buffer
, "guided");
436 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
437 pp_string (buffer
, "runtime");
439 case OMP_CLAUSE_SCHEDULE_AUTO
:
440 pp_string (buffer
, "auto");
442 case OMP_CLAUSE_SCHEDULE_CILKFOR
:
443 pp_string (buffer
, "cilk-for grain");
448 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
451 dump_generic_node (buffer
, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
454 pp_right_paren (buffer
);
457 case OMP_CLAUSE_UNTIED
:
458 pp_string (buffer
, "untied");
461 case OMP_CLAUSE_COLLAPSE
:
462 pp_string (buffer
, "collapse(");
463 dump_generic_node (buffer
, OMP_CLAUSE_COLLAPSE_EXPR (clause
),
465 pp_right_paren (buffer
);
468 case OMP_CLAUSE_FINAL
:
469 pp_string (buffer
, "final(");
470 dump_generic_node (buffer
, OMP_CLAUSE_FINAL_EXPR (clause
),
472 pp_right_paren (buffer
);
475 case OMP_CLAUSE_MERGEABLE
:
476 pp_string (buffer
, "mergeable");
479 case OMP_CLAUSE_LINEAR
:
480 pp_string (buffer
, "linear(");
481 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
484 dump_generic_node (buffer
, OMP_CLAUSE_LINEAR_STEP (clause
),
486 pp_right_paren (buffer
);
489 case OMP_CLAUSE_ALIGNED
:
490 pp_string (buffer
, "aligned(");
491 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
493 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
))
496 dump_generic_node (buffer
, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
),
499 pp_right_paren (buffer
);
502 case OMP_CLAUSE_DEPEND
:
503 pp_string (buffer
, "depend(");
504 switch (OMP_CLAUSE_DEPEND_KIND (clause
))
506 case OMP_CLAUSE_DEPEND_IN
:
507 pp_string (buffer
, "in");
509 case OMP_CLAUSE_DEPEND_OUT
:
510 pp_string (buffer
, "out");
512 case OMP_CLAUSE_DEPEND_INOUT
:
513 pp_string (buffer
, "inout");
519 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
521 pp_right_paren (buffer
);
525 pp_string (buffer
, "map(");
526 switch (OMP_CLAUSE_MAP_KIND (clause
))
528 case OMP_CLAUSE_MAP_ALLOC
:
529 case OMP_CLAUSE_MAP_POINTER
:
530 pp_string (buffer
, "alloc");
532 case OMP_CLAUSE_MAP_TO
:
533 case OMP_CLAUSE_MAP_TO_PSET
:
534 pp_string (buffer
, "to");
536 case OMP_CLAUSE_MAP_FROM
:
537 pp_string (buffer
, "from");
539 case OMP_CLAUSE_MAP_TOFROM
:
540 pp_string (buffer
, "tofrom");
542 case OMP_CLAUSE_MAP_FORCE_ALLOC
:
543 pp_string (buffer
, "force_alloc");
545 case OMP_CLAUSE_MAP_FORCE_TO
:
546 pp_string (buffer
, "force_to");
548 case OMP_CLAUSE_MAP_FORCE_FROM
:
549 pp_string (buffer
, "force_from");
551 case OMP_CLAUSE_MAP_FORCE_TOFROM
:
552 pp_string (buffer
, "force_tofrom");
554 case OMP_CLAUSE_MAP_FORCE_PRESENT
:
555 pp_string (buffer
, "force_present");
557 case OMP_CLAUSE_MAP_FORCE_DEALLOC
:
558 pp_string (buffer
, "force_dealloc");
560 case OMP_CLAUSE_MAP_FORCE_DEVICEPTR
:
561 pp_string (buffer
, "force_deviceptr");
567 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
570 if (OMP_CLAUSE_SIZE (clause
))
572 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
573 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_POINTER
)
574 pp_string (buffer
, " [pointer assign, bias: ");
575 else if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
576 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_TO_PSET
)
577 pp_string (buffer
, " [pointer set, len: ");
579 pp_string (buffer
, " [len: ");
580 dump_generic_node (buffer
, OMP_CLAUSE_SIZE (clause
),
582 pp_right_bracket (buffer
);
584 pp_right_paren (buffer
);
587 case OMP_CLAUSE_FROM
:
588 pp_string (buffer
, "from(");
589 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
591 goto print_clause_size
;
594 pp_string (buffer
, "to(");
595 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
597 goto print_clause_size
;
599 case OMP_CLAUSE__CACHE_
:
600 pp_string (buffer
, "(");
601 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
603 goto print_clause_size
;
605 case OMP_CLAUSE_NUM_TEAMS
:
606 pp_string (buffer
, "num_teams(");
607 dump_generic_node (buffer
, OMP_CLAUSE_NUM_TEAMS_EXPR (clause
),
609 pp_right_paren (buffer
);
612 case OMP_CLAUSE_THREAD_LIMIT
:
613 pp_string (buffer
, "thread_limit(");
614 dump_generic_node (buffer
, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause
),
616 pp_right_paren (buffer
);
619 case OMP_CLAUSE_DEVICE
:
620 pp_string (buffer
, "device(");
621 dump_generic_node (buffer
, OMP_CLAUSE_DEVICE_ID (clause
),
623 pp_right_paren (buffer
);
626 case OMP_CLAUSE_DIST_SCHEDULE
:
627 pp_string (buffer
, "dist_schedule(static");
628 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
))
631 dump_generic_node (buffer
,
632 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
),
635 pp_right_paren (buffer
);
638 case OMP_CLAUSE_PROC_BIND
:
639 pp_string (buffer
, "proc_bind(");
640 switch (OMP_CLAUSE_PROC_BIND_KIND (clause
))
642 case OMP_CLAUSE_PROC_BIND_MASTER
:
643 pp_string (buffer
, "master");
645 case OMP_CLAUSE_PROC_BIND_CLOSE
:
646 pp_string (buffer
, "close");
648 case OMP_CLAUSE_PROC_BIND_SPREAD
:
649 pp_string (buffer
, "spread");
654 pp_right_paren (buffer
);
657 case OMP_CLAUSE_SAFELEN
:
658 pp_string (buffer
, "safelen(");
659 dump_generic_node (buffer
, OMP_CLAUSE_SAFELEN_EXPR (clause
),
661 pp_right_paren (buffer
);
664 case OMP_CLAUSE_SIMDLEN
:
665 pp_string (buffer
, "simdlen(");
666 dump_generic_node (buffer
, OMP_CLAUSE_SIMDLEN_EXPR (clause
),
668 pp_right_paren (buffer
);
671 case OMP_CLAUSE__SIMDUID_
:
672 pp_string (buffer
, "_simduid_(");
673 dump_generic_node (buffer
, OMP_CLAUSE__SIMDUID__DECL (clause
),
675 pp_right_paren (buffer
);
678 case OMP_CLAUSE_GANG
:
679 pp_string (buffer
, "gang(");
680 dump_generic_node (buffer
, OMP_CLAUSE_GANG_EXPR (clause
),
682 pp_character(buffer
, ')');
685 case OMP_CLAUSE_ASYNC
:
686 pp_string (buffer
, "async");
687 if (OMP_CLAUSE_ASYNC_EXPR (clause
))
689 pp_character(buffer
, '(');
690 dump_generic_node (buffer
, OMP_CLAUSE_ASYNC_EXPR (clause
),
692 pp_character(buffer
, ')');
696 case OMP_CLAUSE_WAIT
:
697 pp_string (buffer
, "wait(");
698 dump_generic_node (buffer
, OMP_CLAUSE_WAIT_EXPR (clause
),
700 pp_character(buffer
, ')');
703 case OMP_CLAUSE_WORKER
:
704 pp_string (buffer
, "worker(");
705 dump_generic_node (buffer
, OMP_CLAUSE_WORKER_EXPR (clause
),
707 pp_character(buffer
, ')');
710 case OMP_CLAUSE_VECTOR
:
711 pp_string (buffer
, "vector(");
712 dump_generic_node (buffer
, OMP_CLAUSE_VECTOR_EXPR (clause
),
714 pp_character(buffer
, ')');
717 case OMP_CLAUSE_NUM_GANGS
:
718 pp_string (buffer
, "num_gangs(");
719 dump_generic_node (buffer
, OMP_CLAUSE_NUM_GANGS_EXPR (clause
),
721 pp_character (buffer
, ')');
724 case OMP_CLAUSE_NUM_WORKERS
:
725 pp_string (buffer
, "num_workers(");
726 dump_generic_node (buffer
, OMP_CLAUSE_NUM_WORKERS_EXPR (clause
),
728 pp_character (buffer
, ')');
731 case OMP_CLAUSE_VECTOR_LENGTH
:
732 pp_string (buffer
, "vector_length(");
733 dump_generic_node (buffer
, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause
),
735 pp_character (buffer
, ')');
738 case OMP_CLAUSE_INBRANCH
:
739 pp_string (buffer
, "inbranch");
741 case OMP_CLAUSE_NOTINBRANCH
:
742 pp_string (buffer
, "notinbranch");
745 pp_string (buffer
, "for");
747 case OMP_CLAUSE_PARALLEL
:
748 pp_string (buffer
, "parallel");
750 case OMP_CLAUSE_SECTIONS
:
751 pp_string (buffer
, "sections");
753 case OMP_CLAUSE_TASKGROUP
:
754 pp_string (buffer
, "taskgroup");
756 case OMP_CLAUSE_INDEPENDENT
:
757 pp_string (buffer
, "independent");
761 /* Should never happen. */
762 dump_generic_node (buffer
, clause
, spc
, flags
, false);
768 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
769 dump_generic_node. */
772 dump_omp_clauses (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
780 dump_omp_clause (buffer
, clause
, spc
, flags
);
781 clause
= OMP_CLAUSE_CHAIN (clause
);
789 /* Dump location LOC to BUFFER. */
792 dump_location (pretty_printer
*buffer
, location_t loc
)
794 expanded_location xloc
= expand_location (loc
);
796 pp_left_bracket (buffer
);
799 pp_string (buffer
, xloc
.file
);
800 pp_string (buffer
, ":");
802 pp_decimal_int (buffer
, xloc
.line
);
804 pp_decimal_int (buffer
, xloc
.column
);
805 pp_string (buffer
, "] ");
809 /* Dump lexical block BLOCK. BUFFER, SPC and FLAGS are as in
810 dump_generic_node. */
813 dump_block_node (pretty_printer
*buffer
, tree block
, int spc
, int flags
)
817 pp_printf (buffer
, "BLOCK #%d ", BLOCK_NUMBER (block
));
819 if (flags
& TDF_ADDRESS
)
820 pp_printf (buffer
, "[%p] ", (void *) block
);
822 if (BLOCK_ABSTRACT (block
))
823 pp_string (buffer
, "[abstract] ");
825 if (TREE_ASM_WRITTEN (block
))
826 pp_string (buffer
, "[written] ");
828 if (flags
& TDF_SLIM
)
831 if (BLOCK_SOURCE_LOCATION (block
))
832 dump_location (buffer
, BLOCK_SOURCE_LOCATION (block
));
834 newline_and_indent (buffer
, spc
+ 2);
836 if (BLOCK_SUPERCONTEXT (block
))
838 pp_string (buffer
, "SUPERCONTEXT: ");
839 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (block
), 0,
840 flags
| TDF_SLIM
, false);
841 newline_and_indent (buffer
, spc
+ 2);
844 if (BLOCK_SUBBLOCKS (block
))
846 pp_string (buffer
, "SUBBLOCKS: ");
847 for (t
= BLOCK_SUBBLOCKS (block
); t
; t
= BLOCK_CHAIN (t
))
849 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
852 newline_and_indent (buffer
, spc
+ 2);
855 if (BLOCK_CHAIN (block
))
857 pp_string (buffer
, "SIBLINGS: ");
858 for (t
= BLOCK_CHAIN (block
); t
; t
= BLOCK_CHAIN (t
))
860 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
863 newline_and_indent (buffer
, spc
+ 2);
866 if (BLOCK_VARS (block
))
868 pp_string (buffer
, "VARS: ");
869 for (t
= BLOCK_VARS (block
); t
; t
= TREE_CHAIN (t
))
871 dump_generic_node (buffer
, t
, 0, flags
, false);
874 newline_and_indent (buffer
, spc
+ 2);
877 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block
)) > 0)
880 vec
<tree
, va_gc
> *nlv
= BLOCK_NONLOCALIZED_VARS (block
);
882 pp_string (buffer
, "NONLOCALIZED_VARS: ");
883 FOR_EACH_VEC_ELT (*nlv
, i
, t
)
885 dump_generic_node (buffer
, t
, 0, flags
, false);
888 newline_and_indent (buffer
, spc
+ 2);
891 if (BLOCK_ABSTRACT_ORIGIN (block
))
893 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
894 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (block
), 0,
895 flags
| TDF_SLIM
, false);
896 newline_and_indent (buffer
, spc
+ 2);
899 if (BLOCK_FRAGMENT_ORIGIN (block
))
901 pp_string (buffer
, "FRAGMENT_ORIGIN: ");
902 dump_generic_node (buffer
, BLOCK_FRAGMENT_ORIGIN (block
), 0,
903 flags
| TDF_SLIM
, false);
904 newline_and_indent (buffer
, spc
+ 2);
907 if (BLOCK_FRAGMENT_CHAIN (block
))
909 pp_string (buffer
, "FRAGMENT_CHAIN: ");
910 for (t
= BLOCK_FRAGMENT_CHAIN (block
); t
; t
= BLOCK_FRAGMENT_CHAIN (t
))
912 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
915 newline_and_indent (buffer
, spc
+ 2);
920 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
921 indent. FLAGS specifies details to show in the dump (see TDF_* in
922 dumpfile.h). If IS_STMT is true, the object printed is considered
923 to be a statement and it is terminated by ';' if appropriate. */
926 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
935 if (node
== NULL_TREE
)
938 is_expr
= EXPR_P (node
);
940 if (is_stmt
&& (flags
& TDF_STMTADDR
))
941 pp_printf (buffer
, "<&%p> ", (void *)node
);
943 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
944 dump_location (buffer
, EXPR_LOCATION (node
));
946 code
= TREE_CODE (node
);
950 pp_string (buffer
, "<<< error >>>");
953 case IDENTIFIER_NODE
:
954 pp_tree_identifier (buffer
, node
);
958 while (node
&& node
!= error_mark_node
)
960 if (TREE_PURPOSE (node
))
962 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
965 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
966 node
= TREE_CHAIN (node
);
967 if (node
&& TREE_CODE (node
) == TREE_LIST
)
976 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
982 if (TREE_VEC_LENGTH (node
) > 0)
984 size_t len
= TREE_VEC_LENGTH (node
);
985 for (i
= 0; i
< len
- 1; i
++)
987 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
992 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
1001 case FIXED_POINT_TYPE
:
1007 unsigned int quals
= TYPE_QUALS (node
);
1008 enum tree_code_class tclass
;
1010 if (quals
& TYPE_QUAL_ATOMIC
)
1011 pp_string (buffer
, "atomic ");
1012 if (quals
& TYPE_QUAL_CONST
)
1013 pp_string (buffer
, "const ");
1014 else if (quals
& TYPE_QUAL_VOLATILE
)
1015 pp_string (buffer
, "volatile ");
1016 else if (quals
& TYPE_QUAL_RESTRICT
)
1017 pp_string (buffer
, "restrict ");
1019 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1021 pp_string (buffer
, "<address-space-");
1022 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
1023 pp_string (buffer
, "> ");
1026 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
1028 if (tclass
== tcc_declaration
)
1030 if (DECL_NAME (node
))
1031 dump_decl_name (buffer
, node
, flags
);
1033 pp_string (buffer
, "<unnamed type decl>");
1035 else if (tclass
== tcc_type
)
1037 if (TYPE_NAME (node
))
1039 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
1040 pp_tree_identifier (buffer
, TYPE_NAME (node
));
1041 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
1042 && DECL_NAME (TYPE_NAME (node
)))
1043 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1045 pp_string (buffer
, "<unnamed type>");
1047 else if (TREE_CODE (node
) == VECTOR_TYPE
)
1049 pp_string (buffer
, "vector");
1050 pp_left_paren (buffer
);
1051 pp_wide_integer (buffer
, TYPE_VECTOR_SUBPARTS (node
));
1052 pp_string (buffer
, ") ");
1053 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1055 else if (TREE_CODE (node
) == INTEGER_TYPE
)
1057 if (TYPE_PRECISION (node
) == CHAR_TYPE_SIZE
)
1058 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1061 else if (TYPE_PRECISION (node
) == SHORT_TYPE_SIZE
)
1062 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1065 else if (TYPE_PRECISION (node
) == INT_TYPE_SIZE
)
1066 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1069 else if (TYPE_PRECISION (node
) == LONG_TYPE_SIZE
)
1070 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1073 else if (TYPE_PRECISION (node
) == LONG_LONG_TYPE_SIZE
)
1074 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1075 ? "unsigned long long"
1076 : "signed long long"));
1077 else if (TYPE_PRECISION (node
) >= CHAR_TYPE_SIZE
1078 && exact_log2 (TYPE_PRECISION (node
)) != -1)
1080 pp_string (buffer
, (TYPE_UNSIGNED (node
) ? "uint" : "int"));
1081 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1082 pp_string (buffer
, "_t");
1086 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1087 ? "<unnamed-unsigned:"
1088 : "<unnamed-signed:"));
1089 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1090 pp_greater (buffer
);
1093 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
1095 pp_string (buffer
, "__complex__ ");
1096 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1098 else if (TREE_CODE (node
) == REAL_TYPE
)
1100 pp_string (buffer
, "<float:");
1101 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1102 pp_greater (buffer
);
1104 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
1106 pp_string (buffer
, "<fixed-point-");
1107 pp_string (buffer
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
1108 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1109 pp_greater (buffer
);
1111 else if (TREE_CODE (node
) == VOID_TYPE
)
1112 pp_string (buffer
, "void");
1114 pp_string (buffer
, "<unnamed type>");
1120 case REFERENCE_TYPE
:
1121 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
1123 if (TREE_TYPE (node
) == NULL
)
1125 pp_string (buffer
, str
);
1126 pp_string (buffer
, "<null type>");
1128 else if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
1130 tree fnode
= TREE_TYPE (node
);
1132 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
1134 pp_left_paren (buffer
);
1135 pp_string (buffer
, str
);
1136 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1137 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1138 else if (flags
& TDF_NOUID
)
1139 pp_printf (buffer
, "<Txxxx>");
1141 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1143 pp_right_paren (buffer
);
1144 dump_function_declaration (buffer
, fnode
, spc
, flags
);
1148 unsigned int quals
= TYPE_QUALS (node
);
1150 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1152 pp_string (buffer
, str
);
1154 if (quals
& TYPE_QUAL_CONST
)
1155 pp_string (buffer
, " const");
1156 if (quals
& TYPE_QUAL_VOLATILE
)
1157 pp_string (buffer
, " volatile");
1158 if (quals
& TYPE_QUAL_RESTRICT
)
1159 pp_string (buffer
, " restrict");
1161 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1163 pp_string (buffer
, " <address-space-");
1164 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
1165 pp_greater (buffer
);
1168 if (TYPE_REF_CAN_ALIAS_ALL (node
))
1169 pp_string (buffer
, " {ref-all}");
1179 if (integer_zerop (TREE_OPERAND (node
, 1))
1180 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1181 infer them and MEM_ATTR caching will share MEM_REFs
1182 with differently-typed op0s. */
1183 && TREE_CODE (TREE_OPERAND (node
, 0)) != INTEGER_CST
1184 /* Released SSA_NAMES have no TREE_TYPE. */
1185 && TREE_TYPE (TREE_OPERAND (node
, 0)) != NULL_TREE
1186 /* Same pointer types, but ignoring POINTER_TYPE vs.
1188 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1189 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1190 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1191 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1192 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 0)))
1193 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 1))))
1194 /* Same value types ignoring qualifiers. */
1195 && (TYPE_MAIN_VARIANT (TREE_TYPE (node
))
1196 == TYPE_MAIN_VARIANT
1197 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))))
1199 if (TREE_CODE (TREE_OPERAND (node
, 0)) != ADDR_EXPR
)
1202 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1206 dump_generic_node (buffer
,
1207 TREE_OPERAND (TREE_OPERAND (node
, 0), 0),
1214 pp_string (buffer
, "MEM[");
1215 pp_left_paren (buffer
);
1216 ptype
= TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node
, 1)));
1217 dump_generic_node (buffer
, ptype
,
1218 spc
, flags
| TDF_SLIM
, false);
1219 pp_right_paren (buffer
);
1220 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1222 if (!integer_zerop (TREE_OPERAND (node
, 1)))
1224 pp_string (buffer
, " + ");
1225 dump_generic_node (buffer
, TREE_OPERAND (node
, 1),
1228 pp_right_bracket (buffer
);
1233 case TARGET_MEM_REF
:
1235 const char *sep
= "";
1238 pp_string (buffer
, "MEM[");
1240 if (TREE_CODE (TMR_BASE (node
)) == ADDR_EXPR
)
1242 pp_string (buffer
, sep
);
1244 pp_string (buffer
, "symbol: ");
1245 dump_generic_node (buffer
, TREE_OPERAND (TMR_BASE (node
), 0),
1250 pp_string (buffer
, sep
);
1252 pp_string (buffer
, "base: ");
1253 dump_generic_node (buffer
, TMR_BASE (node
), spc
, flags
, false);
1255 tmp
= TMR_INDEX2 (node
);
1258 pp_string (buffer
, sep
);
1260 pp_string (buffer
, "base: ");
1261 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1263 tmp
= TMR_INDEX (node
);
1266 pp_string (buffer
, sep
);
1268 pp_string (buffer
, "index: ");
1269 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1271 tmp
= TMR_STEP (node
);
1274 pp_string (buffer
, sep
);
1276 pp_string (buffer
, "step: ");
1277 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1279 tmp
= TMR_OFFSET (node
);
1282 pp_string (buffer
, sep
);
1284 pp_string (buffer
, "offset: ");
1285 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1287 pp_right_bracket (buffer
);
1295 /* Print the innermost component type. */
1296 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
1297 tmp
= TREE_TYPE (tmp
))
1299 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1301 /* Print the dimensions. */
1302 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
1303 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
1309 case QUAL_UNION_TYPE
:
1311 unsigned int quals
= TYPE_QUALS (node
);
1313 if (quals
& TYPE_QUAL_ATOMIC
)
1314 pp_string (buffer
, "atomic ");
1315 if (quals
& TYPE_QUAL_CONST
)
1316 pp_string (buffer
, "const ");
1317 if (quals
& TYPE_QUAL_VOLATILE
)
1318 pp_string (buffer
, "volatile ");
1320 /* Print the name of the structure. */
1321 if (TREE_CODE (node
) == RECORD_TYPE
)
1322 pp_string (buffer
, "struct ");
1323 else if (TREE_CODE (node
) == UNION_TYPE
)
1324 pp_string (buffer
, "union ");
1326 if (TYPE_NAME (node
))
1327 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
1328 else if (!(flags
& TDF_SLIM
))
1329 /* FIXME: If we eliminate the 'else' above and attempt
1330 to show the fields for named types, we may get stuck
1331 following a cycle of pointers to structs. The alleged
1332 self-reference check in print_struct_decl will not detect
1333 cycles involving more than one pointer or struct type. */
1334 print_struct_decl (buffer
, node
, spc
, flags
);
1343 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
1345 /* In the case of a pointer, one may want to divide by the
1346 size of the pointed-to type. Unfortunately, this not
1347 straightforward. The C front-end maps expressions
1352 in such a way that the two INTEGER_CST nodes for "5" have
1353 different values but identical types. In the latter
1354 case, the 5 is multiplied by sizeof (int) in c-common.c
1355 (pointer_int_sum) to convert it to a byte address, and
1356 yet the type of the node is left unchanged. Argh. What
1357 is consistent though is that the number value corresponds
1358 to bytes (UNITS) offset.
1360 NB: Neither of the following divisors can be trivially
1361 used to recover the original literal:
1363 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1364 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1365 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
1366 pp_string (buffer
, "B"); /* pseudo-unit */
1368 else if (tree_fits_shwi_p (node
))
1369 pp_wide_integer (buffer
, tree_to_shwi (node
));
1370 else if (tree_fits_uhwi_p (node
))
1371 pp_unsigned_wide_integer (buffer
, tree_to_uhwi (node
));
1374 wide_int val
= node
;
1376 if (wi::neg_p (val
, TYPE_SIGN (TREE_TYPE (node
))))
1381 print_hex (val
, pp_buffer (buffer
)->digit_buffer
);
1382 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
1384 if (TREE_OVERFLOW (node
))
1385 pp_string (buffer
, "(OVF)");
1389 /* Code copied from print_node. */
1392 if (TREE_OVERFLOW (node
))
1393 pp_string (buffer
, " overflow");
1395 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
1396 d
= TREE_REAL_CST (node
);
1397 if (REAL_VALUE_ISINF (d
))
1398 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
1399 else if (REAL_VALUE_ISNAN (d
))
1400 pp_string (buffer
, " Nan");
1404 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
1405 pp_string (buffer
, string
);
1410 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
1411 pp_string (buffer
, "0x");
1412 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
1413 output_formatted_integer (buffer
, "%02x", *p
++);
1422 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
1423 pp_string (buffer
, string
);
1428 pp_string (buffer
, "__complex__ (");
1429 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
1430 pp_string (buffer
, ", ");
1431 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
1432 pp_right_paren (buffer
);
1436 pp_string (buffer
, "\"");
1437 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
1438 pp_string (buffer
, "\"");
1444 pp_string (buffer
, "{ ");
1445 for (i
= 0; i
< VECTOR_CST_NELTS (node
); ++i
)
1448 pp_string (buffer
, ", ");
1449 dump_generic_node (buffer
, VECTOR_CST_ELT (node
, i
),
1452 pp_string (buffer
, " }");
1458 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1460 if (TREE_CODE (node
) == METHOD_TYPE
)
1462 if (TYPE_METHOD_BASETYPE (node
))
1463 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
1466 pp_string (buffer
, "<null method basetype>");
1467 pp_colon_colon (buffer
);
1469 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1470 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1471 else if (flags
& TDF_NOUID
)
1472 pp_printf (buffer
, "<Txxxx>");
1474 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1475 dump_function_declaration (buffer
, node
, spc
, flags
);
1480 dump_decl_name (buffer
, node
, flags
);
1484 if (DECL_NAME (node
))
1485 dump_decl_name (buffer
, node
, flags
);
1486 else if (LABEL_DECL_UID (node
) != -1)
1487 pp_printf (buffer
, "<L%d>", (int) LABEL_DECL_UID (node
));
1490 if (flags
& TDF_NOUID
)
1491 pp_string (buffer
, "<D.xxxx>");
1493 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
1498 if (DECL_IS_BUILTIN (node
))
1500 /* Don't print the declaration of built-in types. */
1503 if (DECL_NAME (node
))
1504 dump_decl_name (buffer
, node
, flags
);
1505 else if (TYPE_NAME (TREE_TYPE (node
)) != node
)
1507 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1508 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1509 && TYPE_METHODS (TREE_TYPE (node
)))
1511 /* The type is a c++ class: all structures have at least
1513 pp_string (buffer
, "class ");
1514 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1519 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
1520 ? "union" : "struct "));
1521 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1525 pp_string (buffer
, "<anon>");
1531 case DEBUG_EXPR_DECL
:
1532 case NAMESPACE_DECL
:
1534 dump_decl_name (buffer
, node
, flags
);
1538 pp_string (buffer
, "<retval>");
1542 op0
= TREE_OPERAND (node
, 0);
1545 && (TREE_CODE (op0
) == INDIRECT_REF
1546 || (TREE_CODE (op0
) == MEM_REF
1547 && TREE_CODE (TREE_OPERAND (op0
, 0)) != ADDR_EXPR
1548 && integer_zerop (TREE_OPERAND (op0
, 1))
1549 /* Dump the types of INTEGER_CSTs explicitly, for we
1550 can't infer them and MEM_ATTR caching will share
1551 MEM_REFs with differently-typed op0s. */
1552 && TREE_CODE (TREE_OPERAND (op0
, 0)) != INTEGER_CST
1553 /* Released SSA_NAMES have no TREE_TYPE. */
1554 && TREE_TYPE (TREE_OPERAND (op0
, 0)) != NULL_TREE
1555 /* Same pointer types, but ignoring POINTER_TYPE vs.
1557 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1558 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1559 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1560 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1561 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1562 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1563 /* Same value types ignoring qualifiers. */
1564 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0
))
1565 == TYPE_MAIN_VARIANT
1566 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))))))
1568 op0
= TREE_OPERAND (op0
, 0);
1571 if (op_prio (op0
) < op_prio (node
))
1572 pp_left_paren (buffer
);
1573 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1574 if (op_prio (op0
) < op_prio (node
))
1575 pp_right_paren (buffer
);
1576 pp_string (buffer
, str
);
1577 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1578 op0
= component_ref_field_offset (node
);
1579 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
1581 pp_string (buffer
, "{off: ");
1582 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1583 pp_right_brace (buffer
);
1588 pp_string (buffer
, "BIT_FIELD_REF <");
1589 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1590 pp_string (buffer
, ", ");
1591 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1592 pp_string (buffer
, ", ");
1593 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1594 pp_greater (buffer
);
1598 case ARRAY_RANGE_REF
:
1599 op0
= TREE_OPERAND (node
, 0);
1600 if (op_prio (op0
) < op_prio (node
))
1601 pp_left_paren (buffer
);
1602 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1603 if (op_prio (op0
) < op_prio (node
))
1604 pp_right_paren (buffer
);
1605 pp_left_bracket (buffer
);
1606 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1607 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
1608 pp_string (buffer
, " ...");
1609 pp_right_bracket (buffer
);
1611 op0
= array_ref_low_bound (node
);
1612 op1
= array_ref_element_size (node
);
1614 if (!integer_zerop (op0
)
1615 || TREE_OPERAND (node
, 2)
1616 || TREE_OPERAND (node
, 3))
1618 pp_string (buffer
, "{lb: ");
1619 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1620 pp_string (buffer
, " sz: ");
1621 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1622 pp_right_brace (buffer
);
1628 unsigned HOST_WIDE_INT ix
;
1630 bool is_struct_init
= false;
1631 bool is_array_init
= false;
1633 pp_left_brace (buffer
);
1634 if (TREE_CLOBBER_P (node
))
1635 pp_string (buffer
, "CLOBBER");
1636 else if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1637 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1638 is_struct_init
= true;
1639 else if (TREE_CODE (TREE_TYPE (node
)) == ARRAY_TYPE
1640 && TYPE_DOMAIN (TREE_TYPE (node
))
1641 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)))
1642 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
))))
1645 tree minv
= TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)));
1646 is_array_init
= true;
1647 curidx
= wi::to_widest (minv
);
1649 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1656 dump_generic_node (buffer
, field
, spc
, flags
, false);
1659 else if (is_array_init
1660 && (TREE_CODE (field
) != INTEGER_CST
1661 || curidx
!= wi::to_widest (field
)))
1663 pp_left_bracket (buffer
);
1664 if (TREE_CODE (field
) == RANGE_EXPR
)
1666 dump_generic_node (buffer
, TREE_OPERAND (field
, 0), spc
,
1668 pp_string (buffer
, " ... ");
1669 dump_generic_node (buffer
, TREE_OPERAND (field
, 1), spc
,
1671 if (TREE_CODE (TREE_OPERAND (field
, 1)) == INTEGER_CST
)
1672 curidx
= wi::to_widest (TREE_OPERAND (field
, 1));
1675 dump_generic_node (buffer
, field
, spc
, flags
, false);
1676 if (TREE_CODE (field
) == INTEGER_CST
)
1677 curidx
= wi::to_widest (field
);
1678 pp_string (buffer
, "]=");
1683 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1684 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1685 val
= TREE_OPERAND (val
, 0);
1686 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1687 dump_decl_name (buffer
, val
, flags
);
1689 dump_generic_node (buffer
, val
, spc
, flags
, false);
1690 if (ix
!= vec_safe_length (CONSTRUCTOR_ELTS (node
)) - 1)
1696 pp_right_brace (buffer
);
1703 if (flags
& TDF_SLIM
)
1705 pp_string (buffer
, "<COMPOUND_EXPR>");
1709 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1710 spc
, flags
, !(flags
& TDF_SLIM
));
1711 if (flags
& TDF_SLIM
)
1712 newline_and_indent (buffer
, spc
);
1719 for (tp
= &TREE_OPERAND (node
, 1);
1720 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1721 tp
= &TREE_OPERAND (*tp
, 1))
1723 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1724 spc
, flags
, !(flags
& TDF_SLIM
));
1725 if (flags
& TDF_SLIM
)
1726 newline_and_indent (buffer
, spc
);
1734 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1738 case STATEMENT_LIST
:
1740 tree_stmt_iterator si
;
1743 if (flags
& TDF_SLIM
)
1745 pp_string (buffer
, "<STATEMENT_LIST>");
1749 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1752 newline_and_indent (buffer
, spc
);
1755 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1762 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
,
1767 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
,
1772 pp_string (buffer
, "TARGET_EXPR <");
1773 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1776 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1777 pp_greater (buffer
);
1781 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1786 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1788 pp_string (buffer
, "if (");
1789 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1790 pp_right_paren (buffer
);
1791 /* The lowered cond_exprs should always be printed in full. */
1792 if (COND_EXPR_THEN (node
)
1793 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1794 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1795 && COND_EXPR_ELSE (node
)
1796 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1797 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1800 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1802 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1804 pp_string (buffer
, " else ");
1805 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1809 else if (!(flags
& TDF_SLIM
))
1811 /* Output COND_EXPR_THEN. */
1812 if (COND_EXPR_THEN (node
))
1814 newline_and_indent (buffer
, spc
+2);
1815 pp_left_brace (buffer
);
1816 newline_and_indent (buffer
, spc
+4);
1817 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1819 newline_and_indent (buffer
, spc
+2);
1820 pp_right_brace (buffer
);
1823 /* Output COND_EXPR_ELSE. */
1824 if (COND_EXPR_ELSE (node
)
1825 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1827 newline_and_indent (buffer
, spc
);
1828 pp_string (buffer
, "else");
1829 newline_and_indent (buffer
, spc
+2);
1830 pp_left_brace (buffer
);
1831 newline_and_indent (buffer
, spc
+4);
1832 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1834 newline_and_indent (buffer
, spc
+2);
1835 pp_right_brace (buffer
);
1842 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1844 pp_question (buffer
);
1846 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1850 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1855 pp_left_brace (buffer
);
1856 if (!(flags
& TDF_SLIM
))
1858 if (BIND_EXPR_VARS (node
))
1860 pp_newline (buffer
);
1862 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= DECL_CHAIN (op0
))
1864 print_declaration (buffer
, op0
, spc
+2, flags
);
1865 pp_newline (buffer
);
1869 newline_and_indent (buffer
, spc
+2);
1870 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1871 newline_and_indent (buffer
, spc
);
1872 pp_right_brace (buffer
);
1878 if (CALL_EXPR_FN (node
) != NULL_TREE
)
1879 print_call_name (buffer
, CALL_EXPR_FN (node
), flags
);
1881 pp_string (buffer
, internal_fn_name (CALL_EXPR_IFN (node
)));
1883 /* Print parameters. */
1885 pp_left_paren (buffer
);
1888 call_expr_arg_iterator iter
;
1889 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1891 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1892 if (more_call_expr_args_p (&iter
))
1899 if (CALL_EXPR_VA_ARG_PACK (node
))
1901 if (call_expr_nargs (node
) > 0)
1906 pp_string (buffer
, "__builtin_va_arg_pack ()");
1908 pp_right_paren (buffer
);
1910 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1913 pp_string (buffer
, " [static-chain: ");
1914 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1915 pp_right_bracket (buffer
);
1918 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1919 pp_string (buffer
, " [return slot optimization]");
1920 if (CALL_EXPR_TAILCALL (node
))
1921 pp_string (buffer
, " [tail call]");
1924 case WITH_CLEANUP_EXPR
:
1928 case CLEANUP_POINT_EXPR
:
1929 pp_string (buffer
, "<<cleanup_point ");
1930 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1931 pp_string (buffer
, ">>");
1934 case PLACEHOLDER_EXPR
:
1935 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1936 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1937 pp_greater (buffer
);
1940 /* Binary arithmetic and logic expressions. */
1941 case WIDEN_SUM_EXPR
:
1942 case WIDEN_MULT_EXPR
:
1944 case MULT_HIGHPART_EXPR
:
1946 case POINTER_PLUS_EXPR
:
1948 case TRUNC_DIV_EXPR
:
1950 case FLOOR_DIV_EXPR
:
1951 case ROUND_DIV_EXPR
:
1952 case TRUNC_MOD_EXPR
:
1954 case FLOOR_MOD_EXPR
:
1955 case ROUND_MOD_EXPR
:
1957 case EXACT_DIV_EXPR
:
1962 case VEC_RSHIFT_EXPR
:
1963 case WIDEN_LSHIFT_EXPR
:
1967 case TRUTH_ANDIF_EXPR
:
1968 case TRUTH_ORIF_EXPR
:
1969 case TRUTH_AND_EXPR
:
1971 case TRUTH_XOR_EXPR
:
1985 case UNORDERED_EXPR
:
1987 const char *op
= op_symbol (node
);
1988 op0
= TREE_OPERAND (node
, 0);
1989 op1
= TREE_OPERAND (node
, 1);
1991 /* When the operands are expressions with less priority,
1992 keep semantics of the tree representation. */
1993 if (op_prio (op0
) <= op_prio (node
))
1995 pp_left_paren (buffer
);
1996 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1997 pp_right_paren (buffer
);
2000 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2003 pp_string (buffer
, op
);
2006 /* When the operands are expressions with less priority,
2007 keep semantics of the tree representation. */
2008 if (op_prio (op1
) <= op_prio (node
))
2010 pp_left_paren (buffer
);
2011 dump_generic_node (buffer
, op1
, spc
, flags
, false);
2012 pp_right_paren (buffer
);
2015 dump_generic_node (buffer
, op1
, spc
, flags
, false);
2019 /* Unary arithmetic and logic expressions. */
2022 case TRUTH_NOT_EXPR
:
2024 case PREDECREMENT_EXPR
:
2025 case PREINCREMENT_EXPR
:
2027 if (TREE_CODE (node
) == ADDR_EXPR
2028 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
2029 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
2030 ; /* Do not output '&' for strings and function pointers. */
2032 pp_string (buffer
, op_symbol (node
));
2034 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2036 pp_left_paren (buffer
);
2037 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2038 pp_right_paren (buffer
);
2041 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2044 case POSTDECREMENT_EXPR
:
2045 case POSTINCREMENT_EXPR
:
2046 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2048 pp_left_paren (buffer
);
2049 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2050 pp_right_paren (buffer
);
2053 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2054 pp_string (buffer
, op_symbol (node
));
2058 pp_string (buffer
, "MIN_EXPR <");
2059 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2060 pp_string (buffer
, ", ");
2061 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2062 pp_greater (buffer
);
2066 pp_string (buffer
, "MAX_EXPR <");
2067 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2068 pp_string (buffer
, ", ");
2069 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2070 pp_greater (buffer
);
2074 pp_string (buffer
, "ABS_EXPR <");
2075 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2076 pp_greater (buffer
);
2083 case ADDR_SPACE_CONVERT_EXPR
:
2084 case FIXED_CONVERT_EXPR
:
2085 case FIX_TRUNC_EXPR
:
2088 type
= TREE_TYPE (node
);
2089 op0
= TREE_OPERAND (node
, 0);
2090 if (type
!= TREE_TYPE (op0
))
2092 pp_left_paren (buffer
);
2093 dump_generic_node (buffer
, type
, spc
, flags
, false);
2094 pp_string (buffer
, ") ");
2096 if (op_prio (op0
) < op_prio (node
))
2097 pp_left_paren (buffer
);
2098 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2099 if (op_prio (op0
) < op_prio (node
))
2100 pp_right_paren (buffer
);
2103 case VIEW_CONVERT_EXPR
:
2104 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
2105 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
2106 pp_string (buffer
, ">(");
2107 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2108 pp_right_paren (buffer
);
2112 pp_string (buffer
, "((");
2113 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2114 pp_string (buffer
, "))");
2117 case NON_LVALUE_EXPR
:
2118 pp_string (buffer
, "NON_LVALUE_EXPR <");
2119 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2120 pp_greater (buffer
);
2124 pp_string (buffer
, "SAVE_EXPR <");
2125 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2126 pp_greater (buffer
);
2130 pp_string (buffer
, "COMPLEX_EXPR <");
2131 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2132 pp_string (buffer
, ", ");
2133 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2134 pp_greater (buffer
);
2138 pp_string (buffer
, "CONJ_EXPR <");
2139 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2140 pp_greater (buffer
);
2144 pp_string (buffer
, "REALPART_EXPR <");
2145 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2146 pp_greater (buffer
);
2150 pp_string (buffer
, "IMAGPART_EXPR <");
2151 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2152 pp_greater (buffer
);
2156 pp_string (buffer
, "VA_ARG_EXPR <");
2157 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2158 pp_greater (buffer
);
2161 case TRY_FINALLY_EXPR
:
2162 case TRY_CATCH_EXPR
:
2163 pp_string (buffer
, "try");
2164 newline_and_indent (buffer
, spc
+2);
2165 pp_left_brace (buffer
);
2166 newline_and_indent (buffer
, spc
+4);
2167 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
2168 newline_and_indent (buffer
, spc
+2);
2169 pp_right_brace (buffer
);
2170 newline_and_indent (buffer
, spc
);
2172 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
2173 newline_and_indent (buffer
, spc
+2);
2174 pp_left_brace (buffer
);
2175 newline_and_indent (buffer
, spc
+4);
2176 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
2177 newline_and_indent (buffer
, spc
+2);
2178 pp_right_brace (buffer
);
2183 pp_string (buffer
, "catch (");
2184 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
2185 pp_right_paren (buffer
);
2186 newline_and_indent (buffer
, spc
+2);
2187 pp_left_brace (buffer
);
2188 newline_and_indent (buffer
, spc
+4);
2189 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
2190 newline_and_indent (buffer
, spc
+2);
2191 pp_right_brace (buffer
);
2195 case EH_FILTER_EXPR
:
2196 pp_string (buffer
, "<<<eh_filter (");
2197 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
2198 pp_string (buffer
, ")>>>");
2199 newline_and_indent (buffer
, spc
+2);
2200 pp_left_brace (buffer
);
2201 newline_and_indent (buffer
, spc
+4);
2202 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
2203 newline_and_indent (buffer
, spc
+2);
2204 pp_right_brace (buffer
);
2209 op0
= TREE_OPERAND (node
, 0);
2210 /* If this is for break or continue, don't bother printing it. */
2211 if (DECL_NAME (op0
))
2213 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2214 if (strcmp (name
, "break") == 0
2215 || strcmp (name
, "continue") == 0)
2218 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2220 if (DECL_NONLOCAL (op0
))
2221 pp_string (buffer
, " [non-local]");
2225 pp_string (buffer
, "while (1)");
2226 if (!(flags
& TDF_SLIM
))
2228 newline_and_indent (buffer
, spc
+2);
2229 pp_left_brace (buffer
);
2230 newline_and_indent (buffer
, spc
+4);
2231 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
2232 newline_and_indent (buffer
, spc
+2);
2233 pp_right_brace (buffer
);
2239 pp_string (buffer
, "// predicted ");
2240 if (PREDICT_EXPR_OUTCOME (node
))
2241 pp_string (buffer
, "likely by ");
2243 pp_string (buffer
, "unlikely by ");
2244 pp_string (buffer
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
2245 pp_string (buffer
, " predictor.");
2249 pp_string (buffer
, "ANNOTATE_EXPR <");
2250 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2251 switch ((enum annot_expr_kind
) TREE_INT_CST_LOW (TREE_OPERAND (node
, 1)))
2253 case annot_expr_ivdep_kind
:
2254 pp_string (buffer
, ", ivdep");
2256 case annot_expr_no_vector_kind
:
2257 pp_string (buffer
, ", no-vector");
2259 case annot_expr_vector_kind
:
2260 pp_string (buffer
, ", vector");
2265 pp_greater (buffer
);
2269 pp_string (buffer
, "return");
2270 op0
= TREE_OPERAND (node
, 0);
2274 if (TREE_CODE (op0
) == MODIFY_EXPR
)
2275 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1),
2278 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2283 pp_string (buffer
, "if (");
2284 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2285 pp_string (buffer
, ") break");
2289 pp_string (buffer
, "switch (");
2290 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
2291 pp_right_paren (buffer
);
2292 if (!(flags
& TDF_SLIM
))
2294 newline_and_indent (buffer
, spc
+2);
2295 pp_left_brace (buffer
);
2296 if (SWITCH_BODY (node
))
2298 newline_and_indent (buffer
, spc
+4);
2299 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
2304 tree vec
= SWITCH_LABELS (node
);
2305 size_t i
, n
= TREE_VEC_LENGTH (vec
);
2306 for (i
= 0; i
< n
; ++i
)
2308 tree elt
= TREE_VEC_ELT (vec
, i
);
2309 newline_and_indent (buffer
, spc
+4);
2312 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
2313 pp_string (buffer
, " goto ");
2314 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
2316 pp_semicolon (buffer
);
2319 pp_string (buffer
, "case ???: goto ???;");
2322 newline_and_indent (buffer
, spc
+2);
2323 pp_right_brace (buffer
);
2329 op0
= GOTO_DESTINATION (node
);
2330 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
2332 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2333 if (strcmp (name
, "break") == 0
2334 || strcmp (name
, "continue") == 0)
2336 pp_string (buffer
, name
);
2340 pp_string (buffer
, "goto ");
2341 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2345 pp_string (buffer
, "__asm__");
2346 if (ASM_VOLATILE_P (node
))
2347 pp_string (buffer
, " __volatile__");
2348 pp_left_paren (buffer
);
2349 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
2351 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
2353 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
2354 if (ASM_CLOBBERS (node
))
2357 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
2359 pp_right_paren (buffer
);
2362 case CASE_LABEL_EXPR
:
2363 if (CASE_LOW (node
) && CASE_HIGH (node
))
2365 pp_string (buffer
, "case ");
2366 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2367 pp_string (buffer
, " ... ");
2368 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
2370 else if (CASE_LOW (node
))
2372 pp_string (buffer
, "case ");
2373 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2376 pp_string (buffer
, "default");
2381 pp_string (buffer
, "OBJ_TYPE_REF(");
2382 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
2383 pp_semicolon (buffer
);
2384 if (!(flags
& TDF_SLIM
) && virtual_method_call_p (node
))
2386 pp_string (buffer
, "(");
2387 dump_generic_node (buffer
, obj_type_ref_class (node
), spc
, flags
, false);
2388 pp_string (buffer
, ")");
2390 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
2392 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
2393 pp_right_paren (buffer
);
2397 if (SSA_NAME_IDENTIFIER (node
))
2398 dump_generic_node (buffer
, SSA_NAME_IDENTIFIER (node
),
2400 pp_underscore (buffer
);
2401 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
2402 if (SSA_NAME_IS_DEFAULT_DEF (node
))
2403 pp_string (buffer
, "(D)");
2404 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
2405 pp_string (buffer
, "(ab)");
2408 case WITH_SIZE_EXPR
:
2409 pp_string (buffer
, "WITH_SIZE_EXPR <");
2410 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2411 pp_string (buffer
, ", ");
2412 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2413 pp_greater (buffer
);
2417 pp_string (buffer
, "ASSERT_EXPR <");
2418 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
2419 pp_string (buffer
, ", ");
2420 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
2421 pp_greater (buffer
);
2425 pp_string (buffer
, "scev_known");
2428 case SCEV_NOT_KNOWN
:
2429 pp_string (buffer
, "scev_not_known");
2432 case POLYNOMIAL_CHREC
:
2433 pp_left_brace (buffer
);
2434 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
2435 pp_string (buffer
, ", +, ");
2436 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
2437 pp_string (buffer
, "}_");
2438 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
2442 case REALIGN_LOAD_EXPR
:
2443 pp_string (buffer
, "REALIGN_LOAD <");
2444 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2445 pp_string (buffer
, ", ");
2446 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2447 pp_string (buffer
, ", ");
2448 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2449 pp_greater (buffer
);
2453 pp_string (buffer
, " VEC_COND_EXPR < ");
2454 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2455 pp_string (buffer
, " , ");
2456 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2457 pp_string (buffer
, " , ");
2458 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2459 pp_string (buffer
, " > ");
2463 pp_string (buffer
, " VEC_PERM_EXPR < ");
2464 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2465 pp_string (buffer
, " , ");
2466 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2467 pp_string (buffer
, " , ");
2468 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2469 pp_string (buffer
, " > ");
2473 pp_string (buffer
, " DOT_PROD_EXPR < ");
2474 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2475 pp_string (buffer
, ", ");
2476 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2477 pp_string (buffer
, ", ");
2478 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2479 pp_string (buffer
, " > ");
2482 case WIDEN_MULT_PLUS_EXPR
:
2483 pp_string (buffer
, " WIDEN_MULT_PLUS_EXPR < ");
2484 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2485 pp_string (buffer
, ", ");
2486 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2487 pp_string (buffer
, ", ");
2488 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2489 pp_string (buffer
, " > ");
2492 case WIDEN_MULT_MINUS_EXPR
:
2493 pp_string (buffer
, " WIDEN_MULT_MINUS_EXPR < ");
2494 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2495 pp_string (buffer
, ", ");
2496 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2497 pp_string (buffer
, ", ");
2498 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2499 pp_string (buffer
, " > ");
2503 pp_string (buffer
, " FMA_EXPR < ");
2504 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2505 pp_string (buffer
, ", ");
2506 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2507 pp_string (buffer
, ", ");
2508 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2509 pp_string (buffer
, " > ");
2513 pp_string (buffer
, "#pragma acc parallel");
2514 dump_omp_clauses (buffer
, OACC_PARALLEL_CLAUSES (node
), spc
, flags
);
2518 pp_string (buffer
, "#pragma acc kernels");
2519 dump_omp_clauses (buffer
, OACC_KERNELS_CLAUSES (node
), spc
, flags
);
2523 pp_string (buffer
, "#pragma acc data");
2524 dump_omp_clauses (buffer
, OACC_DATA_CLAUSES (node
), spc
, flags
);
2527 case OACC_HOST_DATA
:
2528 pp_string (buffer
, "#pragma acc host_data");
2529 dump_omp_clauses (buffer
, OACC_HOST_DATA_CLAUSES (node
), spc
, flags
);
2533 pp_string (buffer
, "#pragma acc declare");
2534 dump_omp_clauses (buffer
, OACC_DECLARE_CLAUSES (node
), spc
, flags
);
2538 pp_string (buffer
, "#pragma acc update");
2539 dump_omp_clauses (buffer
, OACC_UPDATE_CLAUSES (node
), spc
, flags
);
2542 case OACC_ENTER_DATA
:
2543 pp_string (buffer
, "#pragma acc enter data");
2544 dump_omp_clauses (buffer
, OACC_ENTER_DATA_CLAUSES (node
), spc
, flags
);
2547 case OACC_EXIT_DATA
:
2548 pp_string (buffer
, "#pragma acc exit data");
2549 dump_omp_clauses (buffer
, OACC_EXIT_DATA_CLAUSES (node
), spc
, flags
);
2553 pp_string (buffer
, "#pragma acc cache");
2554 dump_omp_clauses (buffer
, OACC_CACHE_CLAUSES (node
), spc
, flags
);
2558 pp_string (buffer
, "#pragma omp parallel");
2559 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
2562 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
2564 newline_and_indent (buffer
, spc
+ 2);
2565 pp_left_brace (buffer
);
2566 newline_and_indent (buffer
, spc
+ 4);
2567 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
2568 newline_and_indent (buffer
, spc
+ 2);
2569 pp_right_brace (buffer
);
2575 pp_string (buffer
, "#pragma omp task");
2576 dump_omp_clauses (buffer
, OMP_TASK_CLAUSES (node
), spc
, flags
);
2580 pp_string (buffer
, "#pragma omp for");
2584 pp_string (buffer
, "#pragma omp simd");
2588 pp_string (buffer
, "#pragma simd");
2592 /* This label points one line after dumping the clauses.
2593 For _Cilk_for the clauses are dumped after the _Cilk_for (...)
2594 parameters are printed out. */
2595 goto dump_omp_loop_cilk_for
;
2597 case OMP_DISTRIBUTE
:
2598 pp_string (buffer
, "#pragma omp distribute");
2602 pp_string (buffer
, "#pragma acc loop");
2606 pp_string (buffer
, "#pragma omp teams");
2607 dump_omp_clauses (buffer
, OMP_TEAMS_CLAUSES (node
), spc
, flags
);
2610 case OMP_TARGET_DATA
:
2611 pp_string (buffer
, "#pragma omp target data");
2612 dump_omp_clauses (buffer
, OMP_TARGET_DATA_CLAUSES (node
), spc
, flags
);
2616 pp_string (buffer
, "#pragma omp target");
2617 dump_omp_clauses (buffer
, OMP_TARGET_CLAUSES (node
), spc
, flags
);
2620 case OMP_TARGET_UPDATE
:
2621 pp_string (buffer
, "#pragma omp target update");
2622 dump_omp_clauses (buffer
, OMP_TARGET_UPDATE_CLAUSES (node
), spc
, flags
);
2627 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2629 dump_omp_loop_cilk_for
:
2630 if (!(flags
& TDF_SLIM
))
2634 if (OMP_FOR_PRE_BODY (node
))
2636 if (TREE_CODE (node
) == CILK_FOR
)
2637 pp_string (buffer
, " ");
2639 newline_and_indent (buffer
, spc
+ 2);
2640 pp_left_brace (buffer
);
2642 newline_and_indent (buffer
, spc
);
2643 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
2646 if (OMP_FOR_INIT (node
))
2649 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
2652 if (TREE_CODE (node
) != CILK_FOR
|| OMP_FOR_PRE_BODY (node
))
2653 newline_and_indent (buffer
, spc
);
2654 if (TREE_CODE (node
) == CILK_FOR
)
2655 pp_string (buffer
, "_Cilk_for (");
2657 pp_string (buffer
, "for (");
2658 dump_generic_node (buffer
,
2659 TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
2661 pp_string (buffer
, "; ");
2662 dump_generic_node (buffer
,
2663 TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
2665 pp_string (buffer
, "; ");
2666 dump_generic_node (buffer
,
2667 TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
2669 pp_right_paren (buffer
);
2671 if (TREE_CODE (node
) == CILK_FOR
)
2672 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2674 if (OMP_FOR_BODY (node
))
2676 newline_and_indent (buffer
, spc
+ 2);
2677 pp_left_brace (buffer
);
2678 newline_and_indent (buffer
, spc
+ 4);
2679 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
2681 newline_and_indent (buffer
, spc
+ 2);
2682 pp_right_brace (buffer
);
2684 if (OMP_FOR_INIT (node
))
2685 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
2686 if (OMP_FOR_PRE_BODY (node
))
2689 newline_and_indent (buffer
, spc
+ 2);
2690 pp_right_brace (buffer
);
2697 pp_string (buffer
, "#pragma omp sections");
2698 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
2702 pp_string (buffer
, "#pragma omp section");
2706 pp_string (buffer
, "#pragma omp master");
2710 pp_string (buffer
, "#pragma omp taskgroup");
2714 pp_string (buffer
, "#pragma omp ordered");
2718 pp_string (buffer
, "#pragma omp critical");
2719 if (OMP_CRITICAL_NAME (node
))
2722 pp_left_paren (buffer
);
2723 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
2725 pp_right_paren (buffer
);
2730 pp_string (buffer
, "#pragma omp atomic");
2731 if (OMP_ATOMIC_SEQ_CST (node
))
2732 pp_string (buffer
, " seq_cst");
2733 newline_and_indent (buffer
, spc
+ 2);
2734 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2738 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2741 case OMP_ATOMIC_READ
:
2742 pp_string (buffer
, "#pragma omp atomic read");
2743 if (OMP_ATOMIC_SEQ_CST (node
))
2744 pp_string (buffer
, " seq_cst");
2745 newline_and_indent (buffer
, spc
+ 2);
2746 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2750 case OMP_ATOMIC_CAPTURE_OLD
:
2751 case OMP_ATOMIC_CAPTURE_NEW
:
2752 pp_string (buffer
, "#pragma omp atomic capture");
2753 if (OMP_ATOMIC_SEQ_CST (node
))
2754 pp_string (buffer
, " seq_cst");
2755 newline_and_indent (buffer
, spc
+ 2);
2756 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2760 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2764 pp_string (buffer
, "#pragma omp single");
2765 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
2769 dump_omp_clause (buffer
, node
, spc
, flags
);
2773 case TRANSACTION_EXPR
:
2774 if (TRANSACTION_EXPR_OUTER (node
))
2775 pp_string (buffer
, "__transaction_atomic [[outer]]");
2776 else if (TRANSACTION_EXPR_RELAXED (node
))
2777 pp_string (buffer
, "__transaction_relaxed");
2779 pp_string (buffer
, "__transaction_atomic");
2780 if (!(flags
& TDF_SLIM
) && TRANSACTION_EXPR_BODY (node
))
2782 newline_and_indent (buffer
, spc
);
2783 pp_left_brace (buffer
);
2784 newline_and_indent (buffer
, spc
+ 2);
2785 dump_generic_node (buffer
, TRANSACTION_EXPR_BODY (node
),
2786 spc
+ 2, flags
, false);
2787 newline_and_indent (buffer
, spc
);
2788 pp_right_brace (buffer
);
2793 case REDUC_MAX_EXPR
:
2794 pp_string (buffer
, " REDUC_MAX_EXPR < ");
2795 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2796 pp_string (buffer
, " > ");
2799 case REDUC_MIN_EXPR
:
2800 pp_string (buffer
, " REDUC_MIN_EXPR < ");
2801 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2802 pp_string (buffer
, " > ");
2805 case REDUC_PLUS_EXPR
:
2806 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
2807 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2808 pp_string (buffer
, " > ");
2811 case VEC_WIDEN_MULT_HI_EXPR
:
2812 case VEC_WIDEN_MULT_LO_EXPR
:
2813 case VEC_WIDEN_MULT_EVEN_EXPR
:
2814 case VEC_WIDEN_MULT_ODD_EXPR
:
2815 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2816 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2818 for (str
= get_tree_code_name (code
); *str
; str
++)
2819 pp_character (buffer
, TOUPPER (*str
));
2820 pp_string (buffer
, " < ");
2821 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2822 pp_string (buffer
, ", ");
2823 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2824 pp_string (buffer
, " > ");
2827 case VEC_UNPACK_HI_EXPR
:
2828 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
2829 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2830 pp_string (buffer
, " > ");
2833 case VEC_UNPACK_LO_EXPR
:
2834 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
2835 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2836 pp_string (buffer
, " > ");
2839 case VEC_UNPACK_FLOAT_HI_EXPR
:
2840 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2841 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2842 pp_string (buffer
, " > ");
2845 case VEC_UNPACK_FLOAT_LO_EXPR
:
2846 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2847 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2848 pp_string (buffer
, " > ");
2851 case VEC_PACK_TRUNC_EXPR
:
2852 pp_string (buffer
, " VEC_PACK_TRUNC_EXPR < ");
2853 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2854 pp_string (buffer
, ", ");
2855 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2856 pp_string (buffer
, " > ");
2859 case VEC_PACK_SAT_EXPR
:
2860 pp_string (buffer
, " VEC_PACK_SAT_EXPR < ");
2861 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2862 pp_string (buffer
, ", ");
2863 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2864 pp_string (buffer
, " > ");
2867 case VEC_PACK_FIX_TRUNC_EXPR
:
2868 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2869 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2870 pp_string (buffer
, ", ");
2871 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2872 pp_string (buffer
, " > ");
2876 dump_block_node (buffer
, node
, spc
, flags
);
2879 case CILK_SPAWN_STMT
:
2880 pp_string (buffer
, "_Cilk_spawn ");
2881 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2884 case CILK_SYNC_STMT
:
2885 pp_string (buffer
, "_Cilk_sync");
2892 if (is_stmt
&& is_expr
)
2893 pp_semicolon (buffer
);
2898 /* Print the declaration of a variable. */
2901 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2905 if (TREE_CODE(t
) == NAMELIST_DECL
)
2907 pp_string(buffer
, "namelist ");
2908 dump_decl_name (buffer
, t
, flags
);
2909 pp_semicolon (buffer
);
2913 if (TREE_CODE (t
) == TYPE_DECL
)
2914 pp_string (buffer
, "typedef ");
2916 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2917 pp_string (buffer
, "register ");
2919 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2920 pp_string (buffer
, "extern ");
2921 else if (TREE_STATIC (t
))
2922 pp_string (buffer
, "static ");
2924 /* Print the type and name. */
2925 if (TREE_TYPE (t
) && TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2929 /* Print array's type. */
2930 tmp
= TREE_TYPE (t
);
2931 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2932 tmp
= TREE_TYPE (tmp
);
2933 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2935 /* Print variable's name. */
2937 dump_generic_node (buffer
, t
, spc
, flags
, false);
2939 /* Print the dimensions. */
2940 tmp
= TREE_TYPE (t
);
2941 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2943 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2944 tmp
= TREE_TYPE (tmp
);
2947 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2949 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2951 dump_decl_name (buffer
, t
, flags
);
2952 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2956 /* Print type declaration. */
2957 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2959 /* Print variable's name. */
2961 dump_generic_node (buffer
, t
, spc
, flags
, false);
2964 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2966 pp_string (buffer
, " __asm__ ");
2967 pp_left_paren (buffer
);
2968 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2969 pp_right_paren (buffer
);
2972 /* The initial value of a function serves to determine whether the function
2973 is declared or defined. So the following does not apply to function
2975 if (TREE_CODE (t
) != FUNCTION_DECL
)
2977 /* Print the initial value. */
2978 if (DECL_INITIAL (t
))
2983 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2987 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2989 pp_string (buffer
, " [value-expr: ");
2990 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2991 pp_right_bracket (buffer
);
2994 pp_semicolon (buffer
);
2998 /* Prints a structure: name, fields, and methods.
2999 FIXME: Still incomplete. */
3002 print_struct_decl (pretty_printer
*buffer
, const_tree node
, int spc
, int flags
)
3004 /* Print the name of the structure. */
3005 if (TYPE_NAME (node
))
3008 if (TREE_CODE (node
) == RECORD_TYPE
)
3009 pp_string (buffer
, "struct ");
3010 else if ((TREE_CODE (node
) == UNION_TYPE
3011 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
3012 pp_string (buffer
, "union ");
3014 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
3017 /* Print the contents of the structure. */
3018 pp_newline (buffer
);
3020 pp_left_brace (buffer
);
3021 pp_newline (buffer
);
3023 /* Print the fields of the structure. */
3026 tmp
= TYPE_FIELDS (node
);
3029 /* Avoid to print recursively the structure. */
3030 /* FIXME : Not implemented correctly...,
3031 what about the case when we have a cycle in the contain graph? ...
3032 Maybe this could be solved by looking at the scope in which the
3033 structure was declared. */
3034 if (TREE_TYPE (tmp
) != node
3035 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
3036 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
3038 print_declaration (buffer
, tmp
, spc
+2, flags
);
3039 pp_newline (buffer
);
3041 tmp
= DECL_CHAIN (tmp
);
3045 pp_right_brace (buffer
);
3048 /* Return the priority of the operator CODE.
3050 From lowest to highest precedence with either left-to-right (L-R)
3051 or right-to-left (R-L) associativity]:
3054 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
3066 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
3067 15 [L-R] fn() [] -> .
3069 unary +, - and * have higher precedence than the corresponding binary
3073 op_code_prio (enum tree_code code
)
3090 case TRUTH_ORIF_EXPR
:
3093 case TRUTH_AND_EXPR
:
3094 case TRUTH_ANDIF_EXPR
:
3101 case TRUTH_XOR_EXPR
:
3118 case UNORDERED_EXPR
:
3129 case VEC_WIDEN_LSHIFT_HI_EXPR
:
3130 case VEC_WIDEN_LSHIFT_LO_EXPR
:
3131 case WIDEN_LSHIFT_EXPR
:
3134 case WIDEN_SUM_EXPR
:
3136 case POINTER_PLUS_EXPR
:
3140 case VEC_WIDEN_MULT_HI_EXPR
:
3141 case VEC_WIDEN_MULT_LO_EXPR
:
3142 case WIDEN_MULT_EXPR
:
3144 case WIDEN_MULT_PLUS_EXPR
:
3145 case WIDEN_MULT_MINUS_EXPR
:
3147 case MULT_HIGHPART_EXPR
:
3148 case TRUNC_DIV_EXPR
:
3150 case FLOOR_DIV_EXPR
:
3151 case ROUND_DIV_EXPR
:
3153 case EXACT_DIV_EXPR
:
3154 case TRUNC_MOD_EXPR
:
3156 case FLOOR_MOD_EXPR
:
3157 case ROUND_MOD_EXPR
:
3161 case TRUTH_NOT_EXPR
:
3163 case POSTINCREMENT_EXPR
:
3164 case POSTDECREMENT_EXPR
:
3165 case PREINCREMENT_EXPR
:
3166 case PREDECREMENT_EXPR
:
3172 case FIX_TRUNC_EXPR
:
3178 case ARRAY_RANGE_REF
:
3182 /* Special expressions. */
3188 case REDUC_MAX_EXPR
:
3189 case REDUC_MIN_EXPR
:
3190 case REDUC_PLUS_EXPR
:
3191 case VEC_RSHIFT_EXPR
:
3192 case VEC_UNPACK_HI_EXPR
:
3193 case VEC_UNPACK_LO_EXPR
:
3194 case VEC_UNPACK_FLOAT_HI_EXPR
:
3195 case VEC_UNPACK_FLOAT_LO_EXPR
:
3196 case VEC_PACK_TRUNC_EXPR
:
3197 case VEC_PACK_SAT_EXPR
:
3201 /* Return an arbitrarily high precedence to avoid surrounding single
3202 VAR_DECLs in ()s. */
3207 /* Return the priority of the operator OP. */
3210 op_prio (const_tree op
)
3212 enum tree_code code
;
3217 code
= TREE_CODE (op
);
3218 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
3219 return op_prio (TREE_OPERAND (op
, 0));
3221 return op_code_prio (code
);
3224 /* Return the symbol associated with operator CODE. */
3227 op_symbol_code (enum tree_code code
)
3235 case TRUTH_ORIF_EXPR
:
3238 case TRUTH_AND_EXPR
:
3239 case TRUTH_ANDIF_EXPR
:
3245 case TRUTH_XOR_EXPR
:
3255 case UNORDERED_EXPR
:
3301 case VEC_RSHIFT_EXPR
:
3304 case WIDEN_LSHIFT_EXPR
:
3307 case POINTER_PLUS_EXPR
:
3313 case REDUC_PLUS_EXPR
:
3316 case WIDEN_SUM_EXPR
:
3319 case WIDEN_MULT_EXPR
:
3322 case MULT_HIGHPART_EXPR
:
3332 case TRUTH_NOT_EXPR
:
3339 case TRUNC_DIV_EXPR
:
3346 case FLOOR_DIV_EXPR
:
3349 case ROUND_DIV_EXPR
:
3352 case EXACT_DIV_EXPR
:
3355 case TRUNC_MOD_EXPR
:
3361 case FLOOR_MOD_EXPR
:
3364 case ROUND_MOD_EXPR
:
3367 case PREDECREMENT_EXPR
:
3370 case PREINCREMENT_EXPR
:
3373 case POSTDECREMENT_EXPR
:
3376 case POSTINCREMENT_EXPR
:
3386 return "<<< ??? >>>";
3390 /* Return the symbol associated with operator OP. */
3393 op_symbol (const_tree op
)
3395 return op_symbol_code (TREE_CODE (op
));
3398 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
3399 the gimple_call_fn of a GIMPLE_CALL. */
3402 print_call_name (pretty_printer
*buffer
, tree node
, int flags
)
3406 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
3407 op0
= TREE_OPERAND (op0
, 0);
3410 switch (TREE_CODE (op0
))
3415 dump_function_name (buffer
, op0
, flags
);
3421 op0
= TREE_OPERAND (op0
, 0);
3425 pp_left_paren (buffer
);
3426 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, flags
, false);
3427 pp_string (buffer
, ") ? ");
3428 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, flags
, false);
3429 pp_string (buffer
, " : ");
3430 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, flags
, false);
3434 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
3435 dump_function_name (buffer
, TREE_OPERAND (op0
, 0), flags
);
3437 dump_generic_node (buffer
, op0
, 0, flags
, false);
3441 if (integer_zerop (TREE_OPERAND (op0
, 1)))
3443 op0
= TREE_OPERAND (op0
, 0);
3450 dump_generic_node (buffer
, op0
, 0, flags
, false);
3458 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
3461 pretty_print_string (pretty_printer
*buffer
, const char *str
)
3471 pp_string (buffer
, "\\b");
3475 pp_string (buffer
, "\\f");
3479 pp_string (buffer
, "\\n");
3483 pp_string (buffer
, "\\r");
3487 pp_string (buffer
, "\\t");
3491 pp_string (buffer
, "\\v");
3495 pp_string (buffer
, "\\\\");
3499 pp_string (buffer
, "\\\"");
3503 pp_string (buffer
, "\\'");
3506 /* No need to handle \0; the loop terminates on \0. */
3509 pp_string (buffer
, "\\1");
3513 pp_string (buffer
, "\\2");
3517 pp_string (buffer
, "\\3");
3521 pp_string (buffer
, "\\4");
3525 pp_string (buffer
, "\\5");
3529 pp_string (buffer
, "\\6");
3533 pp_string (buffer
, "\\7");
3537 pp_character (buffer
, str
[0]);
3545 maybe_init_pretty_print (FILE *file
)
3549 new (&buffer
) pretty_printer ();
3550 pp_needs_newline (&buffer
) = true;
3551 pp_translate_identifiers (&buffer
) = false;
3555 buffer
.buffer
->stream
= file
;
3559 newline_and_indent (pretty_printer
*buffer
, int spc
)
3561 pp_newline (buffer
);
3565 /* Handle a %K format for TEXT. Separate from default_tree_printer so
3566 it can also be used in front ends.
3567 %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
3571 percent_K_format (text_info
*text
)
3573 tree t
= va_arg (*text
->args_ptr
, tree
), block
;
3574 gcc_assert (text
->locus
!= NULL
);
3575 *text
->locus
= EXPR_LOCATION (t
);
3576 gcc_assert (pp_ti_abstract_origin (text
) != NULL
);
3577 block
= TREE_BLOCK (t
);
3578 *pp_ti_abstract_origin (text
) = NULL
;
3582 /* ??? LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those
3583 representing the outermost block of an inlined function.
3584 So walk the BLOCK tree until we hit such a scope. */
3586 && TREE_CODE (block
) == BLOCK
)
3588 if (inlined_function_outer_scope_p (block
))
3590 *pp_ti_abstract_origin (text
) = block
;
3593 block
= BLOCK_SUPERCONTEXT (block
);
3599 && TREE_CODE (block
) == BLOCK
3600 && BLOCK_ABSTRACT_ORIGIN (block
))
3602 tree ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3604 while (TREE_CODE (ao
) == BLOCK
3605 && BLOCK_ABSTRACT_ORIGIN (ao
)
3606 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3607 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3609 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3611 *pp_ti_abstract_origin (text
) = block
;
3614 block
= BLOCK_SUPERCONTEXT (block
);
3618 /* Print the identifier ID to PRETTY-PRINTER. */
3621 pp_tree_identifier (pretty_printer
*pp
, tree id
)
3623 if (pp_translate_identifiers (pp
))
3625 const char *text
= identifier_to_locale (IDENTIFIER_POINTER (id
));
3626 pp_append_text (pp
, text
, text
+ strlen (text
));
3629 pp_append_text (pp
, IDENTIFIER_POINTER (id
),
3630 IDENTIFIER_POINTER (id
) + IDENTIFIER_LENGTH (id
));
3633 /* A helper function that is used to dump function information before the
3637 dump_function_header (FILE *dump_file
, tree fdecl
, int flags
)
3639 const char *dname
, *aname
;
3640 struct cgraph_node
*node
= cgraph_node::get (fdecl
);
3641 struct function
*fun
= DECL_STRUCT_FUNCTION (fdecl
);
3643 dname
= lang_hooks
.decl_printable_name (fdecl
, 2);
3645 if (DECL_ASSEMBLER_NAME_SET_P (fdecl
))
3646 aname
= (IDENTIFIER_POINTER
3647 (DECL_ASSEMBLER_NAME (fdecl
)));
3649 aname
= "<unset-asm-name>";
3651 fprintf (dump_file
, "\n;; Function %s (%s, funcdef_no=%d",
3652 dname
, aname
, fun
->funcdef_no
);
3653 if (!(flags
& TDF_NOUID
))
3654 fprintf (dump_file
, ", decl_uid=%d", DECL_UID (fdecl
));
3657 fprintf (dump_file
, ", cgraph_uid=%d", node
->uid
);
3658 fprintf (dump_file
, ", symbol_order=%d)%s\n\n", node
->order
,
3659 node
->frequency
== NODE_FREQUENCY_HOT
3661 : node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
3662 ? " (unlikely executed)"
3663 : node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
3664 ? " (executed once)"
3668 fprintf (dump_file
, ")\n\n");
3671 /* Dump double_int D to pretty_printer PP. UNS is true
3672 if D is unsigned and false otherwise. */
3674 pp_double_int (pretty_printer
*pp
, double_int d
, bool uns
)
3677 pp_wide_integer (pp
, d
.low
);
3678 else if (d
.fits_uhwi ())
3679 pp_unsigned_wide_integer (pp
, d
.low
);
3682 unsigned HOST_WIDE_INT low
= d
.low
;
3683 HOST_WIDE_INT high
= d
.high
;
3684 if (!uns
&& d
.is_negative ())
3687 high
= ~high
+ !low
;
3690 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
3692 sprintf (pp_buffer (pp
)->digit_buffer
,
3693 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
3694 (unsigned HOST_WIDE_INT
) high
, low
);
3695 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);