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_DEVICE_RESIDENT
:
339 name
= "device_resident";
341 case OMP_CLAUSE_USE_DEVICE
:
345 pp_string (buffer
, name
);
346 pp_left_paren (buffer
);
347 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
349 pp_right_paren (buffer
);
352 case OMP_CLAUSE_REDUCTION
:
353 pp_string (buffer
, "reduction(");
354 if (OMP_CLAUSE_REDUCTION_CODE (clause
) != ERROR_MARK
)
357 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
360 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
362 pp_right_paren (buffer
);
366 pp_string (buffer
, "if(");
367 dump_generic_node (buffer
, OMP_CLAUSE_IF_EXPR (clause
),
369 pp_right_paren (buffer
);
372 case OMP_CLAUSE_NUM_THREADS
:
373 pp_string (buffer
, "num_threads(");
374 dump_generic_node (buffer
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
376 pp_right_paren (buffer
);
379 case OMP_CLAUSE__CILK_FOR_COUNT_
:
380 pp_string (buffer
, "_Cilk_for_count_(");
381 dump_generic_node (buffer
, OMP_CLAUSE_OPERAND (clause
, 0),
383 pp_right_paren (buffer
);
386 case OMP_CLAUSE_NOWAIT
:
387 pp_string (buffer
, "nowait");
389 case OMP_CLAUSE_ORDERED
:
390 pp_string (buffer
, "ordered");
393 case OMP_CLAUSE_DEFAULT
:
394 pp_string (buffer
, "default(");
395 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
397 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
399 case OMP_CLAUSE_DEFAULT_SHARED
:
400 pp_string (buffer
, "shared");
402 case OMP_CLAUSE_DEFAULT_NONE
:
403 pp_string (buffer
, "none");
405 case OMP_CLAUSE_DEFAULT_PRIVATE
:
406 pp_string (buffer
, "private");
408 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
409 pp_string (buffer
, "firstprivate");
414 pp_right_paren (buffer
);
417 case OMP_CLAUSE_SCHEDULE
:
418 pp_string (buffer
, "schedule(");
419 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
421 case OMP_CLAUSE_SCHEDULE_STATIC
:
422 pp_string (buffer
, "static");
424 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
425 pp_string (buffer
, "dynamic");
427 case OMP_CLAUSE_SCHEDULE_GUIDED
:
428 pp_string (buffer
, "guided");
430 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
431 pp_string (buffer
, "runtime");
433 case OMP_CLAUSE_SCHEDULE_AUTO
:
434 pp_string (buffer
, "auto");
436 case OMP_CLAUSE_SCHEDULE_CILKFOR
:
437 pp_string (buffer
, "cilk-for grain");
442 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
445 dump_generic_node (buffer
, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
448 pp_right_paren (buffer
);
451 case OMP_CLAUSE_UNTIED
:
452 pp_string (buffer
, "untied");
455 case OMP_CLAUSE_COLLAPSE
:
456 pp_string (buffer
, "collapse(");
457 dump_generic_node (buffer
, OMP_CLAUSE_COLLAPSE_EXPR (clause
),
459 pp_right_paren (buffer
);
462 case OMP_CLAUSE_FINAL
:
463 pp_string (buffer
, "final(");
464 dump_generic_node (buffer
, OMP_CLAUSE_FINAL_EXPR (clause
),
466 pp_right_paren (buffer
);
469 case OMP_CLAUSE_MERGEABLE
:
470 pp_string (buffer
, "mergeable");
473 case OMP_CLAUSE_LINEAR
:
474 pp_string (buffer
, "linear(");
475 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
478 dump_generic_node (buffer
, OMP_CLAUSE_LINEAR_STEP (clause
),
480 pp_right_paren (buffer
);
483 case OMP_CLAUSE_ALIGNED
:
484 pp_string (buffer
, "aligned(");
485 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
487 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
))
490 dump_generic_node (buffer
, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
),
493 pp_right_paren (buffer
);
496 case OMP_CLAUSE_DEPEND
:
497 pp_string (buffer
, "depend(");
498 switch (OMP_CLAUSE_DEPEND_KIND (clause
))
500 case OMP_CLAUSE_DEPEND_IN
:
501 pp_string (buffer
, "in");
503 case OMP_CLAUSE_DEPEND_OUT
:
504 pp_string (buffer
, "out");
506 case OMP_CLAUSE_DEPEND_INOUT
:
507 pp_string (buffer
, "inout");
513 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
515 pp_right_paren (buffer
);
519 pp_string (buffer
, "map(");
520 switch (OMP_CLAUSE_MAP_KIND (clause
))
522 case OMP_CLAUSE_MAP_ALLOC
:
523 case OMP_CLAUSE_MAP_POINTER
:
524 pp_string (buffer
, "alloc");
526 case OMP_CLAUSE_MAP_TO
:
527 case OMP_CLAUSE_MAP_TO_PSET
:
528 pp_string (buffer
, "to");
530 case OMP_CLAUSE_MAP_FROM
:
531 pp_string (buffer
, "from");
533 case OMP_CLAUSE_MAP_TOFROM
:
534 pp_string (buffer
, "tofrom");
536 case OMP_CLAUSE_MAP_FORCE_ALLOC
:
537 pp_string (buffer
, "force_alloc");
539 case OMP_CLAUSE_MAP_FORCE_TO
:
540 pp_string (buffer
, "force_to");
542 case OMP_CLAUSE_MAP_FORCE_FROM
:
543 pp_string (buffer
, "force_from");
545 case OMP_CLAUSE_MAP_FORCE_TOFROM
:
546 pp_string (buffer
, "force_tofrom");
548 case OMP_CLAUSE_MAP_FORCE_PRESENT
:
549 pp_string (buffer
, "force_present");
551 case OMP_CLAUSE_MAP_FORCE_DEALLOC
:
552 pp_string (buffer
, "force_dealloc");
554 case OMP_CLAUSE_MAP_FORCE_DEVICEPTR
:
555 pp_string (buffer
, "force_deviceptr");
561 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
564 if (OMP_CLAUSE_SIZE (clause
))
566 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
567 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_POINTER
)
568 pp_string (buffer
, " [pointer assign, bias: ");
569 else if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
570 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_TO_PSET
)
571 pp_string (buffer
, " [pointer set, len: ");
573 pp_string (buffer
, " [len: ");
574 dump_generic_node (buffer
, OMP_CLAUSE_SIZE (clause
),
576 pp_right_bracket (buffer
);
578 pp_right_paren (buffer
);
581 case OMP_CLAUSE_FROM
:
582 pp_string (buffer
, "from(");
583 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
585 goto print_clause_size
;
588 pp_string (buffer
, "to(");
589 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
591 goto print_clause_size
;
593 case OMP_CLAUSE__CACHE_
:
594 pp_string (buffer
, "(");
595 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
597 goto print_clause_size
;
599 case OMP_CLAUSE_NUM_TEAMS
:
600 pp_string (buffer
, "num_teams(");
601 dump_generic_node (buffer
, OMP_CLAUSE_NUM_TEAMS_EXPR (clause
),
603 pp_right_paren (buffer
);
606 case OMP_CLAUSE_THREAD_LIMIT
:
607 pp_string (buffer
, "thread_limit(");
608 dump_generic_node (buffer
, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause
),
610 pp_right_paren (buffer
);
613 case OMP_CLAUSE_DEVICE
:
614 pp_string (buffer
, "device(");
615 dump_generic_node (buffer
, OMP_CLAUSE_DEVICE_ID (clause
),
617 pp_right_paren (buffer
);
620 case OMP_CLAUSE_DIST_SCHEDULE
:
621 pp_string (buffer
, "dist_schedule(static");
622 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
))
625 dump_generic_node (buffer
,
626 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
),
629 pp_right_paren (buffer
);
632 case OMP_CLAUSE_PROC_BIND
:
633 pp_string (buffer
, "proc_bind(");
634 switch (OMP_CLAUSE_PROC_BIND_KIND (clause
))
636 case OMP_CLAUSE_PROC_BIND_MASTER
:
637 pp_string (buffer
, "master");
639 case OMP_CLAUSE_PROC_BIND_CLOSE
:
640 pp_string (buffer
, "close");
642 case OMP_CLAUSE_PROC_BIND_SPREAD
:
643 pp_string (buffer
, "spread");
648 pp_right_paren (buffer
);
651 case OMP_CLAUSE_SAFELEN
:
652 pp_string (buffer
, "safelen(");
653 dump_generic_node (buffer
, OMP_CLAUSE_SAFELEN_EXPR (clause
),
655 pp_right_paren (buffer
);
658 case OMP_CLAUSE_SIMDLEN
:
659 pp_string (buffer
, "simdlen(");
660 dump_generic_node (buffer
, OMP_CLAUSE_SIMDLEN_EXPR (clause
),
662 pp_right_paren (buffer
);
665 case OMP_CLAUSE__SIMDUID_
:
666 pp_string (buffer
, "_simduid_(");
667 dump_generic_node (buffer
, OMP_CLAUSE__SIMDUID__DECL (clause
),
669 pp_right_paren (buffer
);
672 case OMP_CLAUSE_GANG
:
673 pp_string (buffer
, "gang(");
674 dump_generic_node (buffer
, OMP_CLAUSE_GANG_EXPR (clause
),
676 pp_character(buffer
, ')');
679 case OMP_CLAUSE_ASYNC
:
680 pp_string (buffer
, "async");
681 if (OMP_CLAUSE_ASYNC_EXPR (clause
))
683 pp_character(buffer
, '(');
684 dump_generic_node (buffer
, OMP_CLAUSE_ASYNC_EXPR (clause
),
686 pp_character(buffer
, ')');
690 case OMP_CLAUSE_WAIT
:
691 pp_string (buffer
, "wait(");
692 dump_generic_node (buffer
, OMP_CLAUSE_WAIT_EXPR (clause
),
694 pp_character(buffer
, ')');
697 case OMP_CLAUSE_WORKER
:
698 pp_string (buffer
, "worker(");
699 dump_generic_node (buffer
, OMP_CLAUSE_WORKER_EXPR (clause
),
701 pp_character(buffer
, ')');
704 case OMP_CLAUSE_VECTOR
:
705 pp_string (buffer
, "vector(");
706 dump_generic_node (buffer
, OMP_CLAUSE_VECTOR_EXPR (clause
),
708 pp_character(buffer
, ')');
711 case OMP_CLAUSE_NUM_GANGS
:
712 pp_string (buffer
, "num_gangs(");
713 dump_generic_node (buffer
, OMP_CLAUSE_NUM_GANGS_EXPR (clause
),
715 pp_character (buffer
, ')');
718 case OMP_CLAUSE_NUM_WORKERS
:
719 pp_string (buffer
, "num_workers(");
720 dump_generic_node (buffer
, OMP_CLAUSE_NUM_WORKERS_EXPR (clause
),
722 pp_character (buffer
, ')');
725 case OMP_CLAUSE_VECTOR_LENGTH
:
726 pp_string (buffer
, "vector_length(");
727 dump_generic_node (buffer
, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause
),
729 pp_character (buffer
, ')');
732 case OMP_CLAUSE_INBRANCH
:
733 pp_string (buffer
, "inbranch");
735 case OMP_CLAUSE_NOTINBRANCH
:
736 pp_string (buffer
, "notinbranch");
739 pp_string (buffer
, "for");
741 case OMP_CLAUSE_PARALLEL
:
742 pp_string (buffer
, "parallel");
744 case OMP_CLAUSE_SECTIONS
:
745 pp_string (buffer
, "sections");
747 case OMP_CLAUSE_TASKGROUP
:
748 pp_string (buffer
, "taskgroup");
750 case OMP_CLAUSE_INDEPENDENT
:
751 pp_string (buffer
, "independent");
755 /* Should never happen. */
756 dump_generic_node (buffer
, clause
, spc
, flags
, false);
762 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
763 dump_generic_node. */
766 dump_omp_clauses (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
774 dump_omp_clause (buffer
, clause
, spc
, flags
);
775 clause
= OMP_CLAUSE_CHAIN (clause
);
783 /* Dump location LOC to BUFFER. */
786 dump_location (pretty_printer
*buffer
, location_t loc
)
788 expanded_location xloc
= expand_location (loc
);
790 pp_left_bracket (buffer
);
793 pp_string (buffer
, xloc
.file
);
794 pp_string (buffer
, ":");
796 pp_decimal_int (buffer
, xloc
.line
);
798 pp_decimal_int (buffer
, xloc
.column
);
799 pp_string (buffer
, "] ");
803 /* Dump lexical block BLOCK. BUFFER, SPC and FLAGS are as in
804 dump_generic_node. */
807 dump_block_node (pretty_printer
*buffer
, tree block
, int spc
, int flags
)
811 pp_printf (buffer
, "BLOCK #%d ", BLOCK_NUMBER (block
));
813 if (flags
& TDF_ADDRESS
)
814 pp_printf (buffer
, "[%p] ", (void *) block
);
816 if (BLOCK_ABSTRACT (block
))
817 pp_string (buffer
, "[abstract] ");
819 if (TREE_ASM_WRITTEN (block
))
820 pp_string (buffer
, "[written] ");
822 if (flags
& TDF_SLIM
)
825 if (BLOCK_SOURCE_LOCATION (block
))
826 dump_location (buffer
, BLOCK_SOURCE_LOCATION (block
));
828 newline_and_indent (buffer
, spc
+ 2);
830 if (BLOCK_SUPERCONTEXT (block
))
832 pp_string (buffer
, "SUPERCONTEXT: ");
833 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (block
), 0,
834 flags
| TDF_SLIM
, false);
835 newline_and_indent (buffer
, spc
+ 2);
838 if (BLOCK_SUBBLOCKS (block
))
840 pp_string (buffer
, "SUBBLOCKS: ");
841 for (t
= BLOCK_SUBBLOCKS (block
); t
; t
= BLOCK_CHAIN (t
))
843 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
846 newline_and_indent (buffer
, spc
+ 2);
849 if (BLOCK_CHAIN (block
))
851 pp_string (buffer
, "SIBLINGS: ");
852 for (t
= BLOCK_CHAIN (block
); t
; t
= BLOCK_CHAIN (t
))
854 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
857 newline_and_indent (buffer
, spc
+ 2);
860 if (BLOCK_VARS (block
))
862 pp_string (buffer
, "VARS: ");
863 for (t
= BLOCK_VARS (block
); t
; t
= TREE_CHAIN (t
))
865 dump_generic_node (buffer
, t
, 0, flags
, false);
868 newline_and_indent (buffer
, spc
+ 2);
871 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block
)) > 0)
874 vec
<tree
, va_gc
> *nlv
= BLOCK_NONLOCALIZED_VARS (block
);
876 pp_string (buffer
, "NONLOCALIZED_VARS: ");
877 FOR_EACH_VEC_ELT (*nlv
, i
, t
)
879 dump_generic_node (buffer
, t
, 0, flags
, false);
882 newline_and_indent (buffer
, spc
+ 2);
885 if (BLOCK_ABSTRACT_ORIGIN (block
))
887 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
888 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (block
), 0,
889 flags
| TDF_SLIM
, false);
890 newline_and_indent (buffer
, spc
+ 2);
893 if (BLOCK_FRAGMENT_ORIGIN (block
))
895 pp_string (buffer
, "FRAGMENT_ORIGIN: ");
896 dump_generic_node (buffer
, BLOCK_FRAGMENT_ORIGIN (block
), 0,
897 flags
| TDF_SLIM
, false);
898 newline_and_indent (buffer
, spc
+ 2);
901 if (BLOCK_FRAGMENT_CHAIN (block
))
903 pp_string (buffer
, "FRAGMENT_CHAIN: ");
904 for (t
= BLOCK_FRAGMENT_CHAIN (block
); t
; t
= BLOCK_FRAGMENT_CHAIN (t
))
906 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
909 newline_and_indent (buffer
, spc
+ 2);
914 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
915 indent. FLAGS specifies details to show in the dump (see TDF_* in
916 dumpfile.h). If IS_STMT is true, the object printed is considered
917 to be a statement and it is terminated by ';' if appropriate. */
920 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
929 if (node
== NULL_TREE
)
932 is_expr
= EXPR_P (node
);
934 if (is_stmt
&& (flags
& TDF_STMTADDR
))
935 pp_printf (buffer
, "<&%p> ", (void *)node
);
937 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
938 dump_location (buffer
, EXPR_LOCATION (node
));
940 code
= TREE_CODE (node
);
944 pp_string (buffer
, "<<< error >>>");
947 case IDENTIFIER_NODE
:
948 pp_tree_identifier (buffer
, node
);
952 while (node
&& node
!= error_mark_node
)
954 if (TREE_PURPOSE (node
))
956 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
959 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
960 node
= TREE_CHAIN (node
);
961 if (node
&& TREE_CODE (node
) == TREE_LIST
)
970 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
976 if (TREE_VEC_LENGTH (node
) > 0)
978 size_t len
= TREE_VEC_LENGTH (node
);
979 for (i
= 0; i
< len
- 1; i
++)
981 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
986 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
995 case FIXED_POINT_TYPE
:
1001 unsigned int quals
= TYPE_QUALS (node
);
1002 enum tree_code_class tclass
;
1004 if (quals
& TYPE_QUAL_ATOMIC
)
1005 pp_string (buffer
, "atomic ");
1006 if (quals
& TYPE_QUAL_CONST
)
1007 pp_string (buffer
, "const ");
1008 else if (quals
& TYPE_QUAL_VOLATILE
)
1009 pp_string (buffer
, "volatile ");
1010 else if (quals
& TYPE_QUAL_RESTRICT
)
1011 pp_string (buffer
, "restrict ");
1013 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1015 pp_string (buffer
, "<address-space-");
1016 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
1017 pp_string (buffer
, "> ");
1020 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
1022 if (tclass
== tcc_declaration
)
1024 if (DECL_NAME (node
))
1025 dump_decl_name (buffer
, node
, flags
);
1027 pp_string (buffer
, "<unnamed type decl>");
1029 else if (tclass
== tcc_type
)
1031 if (TYPE_NAME (node
))
1033 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
1034 pp_tree_identifier (buffer
, TYPE_NAME (node
));
1035 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
1036 && DECL_NAME (TYPE_NAME (node
)))
1037 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1039 pp_string (buffer
, "<unnamed type>");
1041 else if (TREE_CODE (node
) == VECTOR_TYPE
)
1043 pp_string (buffer
, "vector");
1044 pp_left_paren (buffer
);
1045 pp_wide_integer (buffer
, TYPE_VECTOR_SUBPARTS (node
));
1046 pp_string (buffer
, ") ");
1047 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1049 else if (TREE_CODE (node
) == INTEGER_TYPE
)
1051 if (TYPE_PRECISION (node
) == CHAR_TYPE_SIZE
)
1052 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1055 else if (TYPE_PRECISION (node
) == SHORT_TYPE_SIZE
)
1056 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1059 else if (TYPE_PRECISION (node
) == INT_TYPE_SIZE
)
1060 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1063 else if (TYPE_PRECISION (node
) == LONG_TYPE_SIZE
)
1064 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1067 else if (TYPE_PRECISION (node
) == LONG_LONG_TYPE_SIZE
)
1068 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1069 ? "unsigned long long"
1070 : "signed long long"));
1071 else if (TYPE_PRECISION (node
) >= CHAR_TYPE_SIZE
1072 && exact_log2 (TYPE_PRECISION (node
)) != -1)
1074 pp_string (buffer
, (TYPE_UNSIGNED (node
) ? "uint" : "int"));
1075 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1076 pp_string (buffer
, "_t");
1080 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1081 ? "<unnamed-unsigned:"
1082 : "<unnamed-signed:"));
1083 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1084 pp_greater (buffer
);
1087 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
1089 pp_string (buffer
, "__complex__ ");
1090 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1092 else if (TREE_CODE (node
) == REAL_TYPE
)
1094 pp_string (buffer
, "<float:");
1095 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1096 pp_greater (buffer
);
1098 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
1100 pp_string (buffer
, "<fixed-point-");
1101 pp_string (buffer
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
1102 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1103 pp_greater (buffer
);
1105 else if (TREE_CODE (node
) == VOID_TYPE
)
1106 pp_string (buffer
, "void");
1108 pp_string (buffer
, "<unnamed type>");
1114 case REFERENCE_TYPE
:
1115 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
1117 if (TREE_TYPE (node
) == NULL
)
1119 pp_string (buffer
, str
);
1120 pp_string (buffer
, "<null type>");
1122 else if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
1124 tree fnode
= TREE_TYPE (node
);
1126 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
1128 pp_left_paren (buffer
);
1129 pp_string (buffer
, str
);
1130 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1131 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1132 else if (flags
& TDF_NOUID
)
1133 pp_printf (buffer
, "<Txxxx>");
1135 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1137 pp_right_paren (buffer
);
1138 dump_function_declaration (buffer
, fnode
, spc
, flags
);
1142 unsigned int quals
= TYPE_QUALS (node
);
1144 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1146 pp_string (buffer
, str
);
1148 if (quals
& TYPE_QUAL_CONST
)
1149 pp_string (buffer
, " const");
1150 if (quals
& TYPE_QUAL_VOLATILE
)
1151 pp_string (buffer
, " volatile");
1152 if (quals
& TYPE_QUAL_RESTRICT
)
1153 pp_string (buffer
, " restrict");
1155 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1157 pp_string (buffer
, " <address-space-");
1158 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
1159 pp_greater (buffer
);
1162 if (TYPE_REF_CAN_ALIAS_ALL (node
))
1163 pp_string (buffer
, " {ref-all}");
1173 if (integer_zerop (TREE_OPERAND (node
, 1))
1174 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1175 infer them and MEM_ATTR caching will share MEM_REFs
1176 with differently-typed op0s. */
1177 && TREE_CODE (TREE_OPERAND (node
, 0)) != INTEGER_CST
1178 /* Released SSA_NAMES have no TREE_TYPE. */
1179 && TREE_TYPE (TREE_OPERAND (node
, 0)) != NULL_TREE
1180 /* Same pointer types, but ignoring POINTER_TYPE vs.
1182 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1183 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1184 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1185 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1186 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 0)))
1187 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 1))))
1188 /* Same value types ignoring qualifiers. */
1189 && (TYPE_MAIN_VARIANT (TREE_TYPE (node
))
1190 == TYPE_MAIN_VARIANT
1191 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))))
1193 if (TREE_CODE (TREE_OPERAND (node
, 0)) != ADDR_EXPR
)
1196 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1200 dump_generic_node (buffer
,
1201 TREE_OPERAND (TREE_OPERAND (node
, 0), 0),
1208 pp_string (buffer
, "MEM[");
1209 pp_left_paren (buffer
);
1210 ptype
= TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node
, 1)));
1211 dump_generic_node (buffer
, ptype
,
1212 spc
, flags
| TDF_SLIM
, false);
1213 pp_right_paren (buffer
);
1214 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1216 if (!integer_zerop (TREE_OPERAND (node
, 1)))
1218 pp_string (buffer
, " + ");
1219 dump_generic_node (buffer
, TREE_OPERAND (node
, 1),
1222 pp_right_bracket (buffer
);
1227 case TARGET_MEM_REF
:
1229 const char *sep
= "";
1232 pp_string (buffer
, "MEM[");
1234 if (TREE_CODE (TMR_BASE (node
)) == ADDR_EXPR
)
1236 pp_string (buffer
, sep
);
1238 pp_string (buffer
, "symbol: ");
1239 dump_generic_node (buffer
, TREE_OPERAND (TMR_BASE (node
), 0),
1244 pp_string (buffer
, sep
);
1246 pp_string (buffer
, "base: ");
1247 dump_generic_node (buffer
, TMR_BASE (node
), spc
, flags
, false);
1249 tmp
= TMR_INDEX2 (node
);
1252 pp_string (buffer
, sep
);
1254 pp_string (buffer
, "base: ");
1255 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1257 tmp
= TMR_INDEX (node
);
1260 pp_string (buffer
, sep
);
1262 pp_string (buffer
, "index: ");
1263 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1265 tmp
= TMR_STEP (node
);
1268 pp_string (buffer
, sep
);
1270 pp_string (buffer
, "step: ");
1271 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1273 tmp
= TMR_OFFSET (node
);
1276 pp_string (buffer
, sep
);
1278 pp_string (buffer
, "offset: ");
1279 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1281 pp_right_bracket (buffer
);
1289 /* Print the innermost component type. */
1290 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
1291 tmp
= TREE_TYPE (tmp
))
1293 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1295 /* Print the dimensions. */
1296 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
1297 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
1303 case QUAL_UNION_TYPE
:
1305 unsigned int quals
= TYPE_QUALS (node
);
1307 if (quals
& TYPE_QUAL_ATOMIC
)
1308 pp_string (buffer
, "atomic ");
1309 if (quals
& TYPE_QUAL_CONST
)
1310 pp_string (buffer
, "const ");
1311 if (quals
& TYPE_QUAL_VOLATILE
)
1312 pp_string (buffer
, "volatile ");
1314 /* Print the name of the structure. */
1315 if (TREE_CODE (node
) == RECORD_TYPE
)
1316 pp_string (buffer
, "struct ");
1317 else if (TREE_CODE (node
) == UNION_TYPE
)
1318 pp_string (buffer
, "union ");
1320 if (TYPE_NAME (node
))
1321 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
1322 else if (!(flags
& TDF_SLIM
))
1323 /* FIXME: If we eliminate the 'else' above and attempt
1324 to show the fields for named types, we may get stuck
1325 following a cycle of pointers to structs. The alleged
1326 self-reference check in print_struct_decl will not detect
1327 cycles involving more than one pointer or struct type. */
1328 print_struct_decl (buffer
, node
, spc
, flags
);
1337 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
1339 /* In the case of a pointer, one may want to divide by the
1340 size of the pointed-to type. Unfortunately, this not
1341 straightforward. The C front-end maps expressions
1346 in such a way that the two INTEGER_CST nodes for "5" have
1347 different values but identical types. In the latter
1348 case, the 5 is multiplied by sizeof (int) in c-common.c
1349 (pointer_int_sum) to convert it to a byte address, and
1350 yet the type of the node is left unchanged. Argh. What
1351 is consistent though is that the number value corresponds
1352 to bytes (UNITS) offset.
1354 NB: Neither of the following divisors can be trivially
1355 used to recover the original literal:
1357 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1358 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1359 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
1360 pp_string (buffer
, "B"); /* pseudo-unit */
1362 else if (tree_fits_shwi_p (node
))
1363 pp_wide_integer (buffer
, tree_to_shwi (node
));
1364 else if (tree_fits_uhwi_p (node
))
1365 pp_unsigned_wide_integer (buffer
, tree_to_uhwi (node
));
1368 wide_int val
= node
;
1370 if (wi::neg_p (val
, TYPE_SIGN (TREE_TYPE (node
))))
1375 print_hex (val
, pp_buffer (buffer
)->digit_buffer
);
1376 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
1378 if (TREE_OVERFLOW (node
))
1379 pp_string (buffer
, "(OVF)");
1383 /* Code copied from print_node. */
1386 if (TREE_OVERFLOW (node
))
1387 pp_string (buffer
, " overflow");
1389 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
1390 d
= TREE_REAL_CST (node
);
1391 if (REAL_VALUE_ISINF (d
))
1392 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
1393 else if (REAL_VALUE_ISNAN (d
))
1394 pp_string (buffer
, " Nan");
1398 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
1399 pp_string (buffer
, string
);
1404 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
1405 pp_string (buffer
, "0x");
1406 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
1407 output_formatted_integer (buffer
, "%02x", *p
++);
1416 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
1417 pp_string (buffer
, string
);
1422 pp_string (buffer
, "__complex__ (");
1423 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
1424 pp_string (buffer
, ", ");
1425 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
1426 pp_right_paren (buffer
);
1430 pp_string (buffer
, "\"");
1431 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
1432 pp_string (buffer
, "\"");
1438 pp_string (buffer
, "{ ");
1439 for (i
= 0; i
< VECTOR_CST_NELTS (node
); ++i
)
1442 pp_string (buffer
, ", ");
1443 dump_generic_node (buffer
, VECTOR_CST_ELT (node
, i
),
1446 pp_string (buffer
, " }");
1452 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1454 if (TREE_CODE (node
) == METHOD_TYPE
)
1456 if (TYPE_METHOD_BASETYPE (node
))
1457 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
1460 pp_string (buffer
, "<null method basetype>");
1461 pp_colon_colon (buffer
);
1463 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1464 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1465 else if (flags
& TDF_NOUID
)
1466 pp_printf (buffer
, "<Txxxx>");
1468 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1469 dump_function_declaration (buffer
, node
, spc
, flags
);
1474 dump_decl_name (buffer
, node
, flags
);
1478 if (DECL_NAME (node
))
1479 dump_decl_name (buffer
, node
, flags
);
1480 else if (LABEL_DECL_UID (node
) != -1)
1481 pp_printf (buffer
, "<L%d>", (int) LABEL_DECL_UID (node
));
1484 if (flags
& TDF_NOUID
)
1485 pp_string (buffer
, "<D.xxxx>");
1487 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
1492 if (DECL_IS_BUILTIN (node
))
1494 /* Don't print the declaration of built-in types. */
1497 if (DECL_NAME (node
))
1498 dump_decl_name (buffer
, node
, flags
);
1499 else if (TYPE_NAME (TREE_TYPE (node
)) != node
)
1501 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1502 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1503 && TYPE_METHODS (TREE_TYPE (node
)))
1505 /* The type is a c++ class: all structures have at least
1507 pp_string (buffer
, "class ");
1508 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1513 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
1514 ? "union" : "struct "));
1515 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1519 pp_string (buffer
, "<anon>");
1525 case DEBUG_EXPR_DECL
:
1526 case NAMESPACE_DECL
:
1528 dump_decl_name (buffer
, node
, flags
);
1532 pp_string (buffer
, "<retval>");
1536 op0
= TREE_OPERAND (node
, 0);
1539 && (TREE_CODE (op0
) == INDIRECT_REF
1540 || (TREE_CODE (op0
) == MEM_REF
1541 && TREE_CODE (TREE_OPERAND (op0
, 0)) != ADDR_EXPR
1542 && integer_zerop (TREE_OPERAND (op0
, 1))
1543 /* Dump the types of INTEGER_CSTs explicitly, for we
1544 can't infer them and MEM_ATTR caching will share
1545 MEM_REFs with differently-typed op0s. */
1546 && TREE_CODE (TREE_OPERAND (op0
, 0)) != INTEGER_CST
1547 /* Released SSA_NAMES have no TREE_TYPE. */
1548 && TREE_TYPE (TREE_OPERAND (op0
, 0)) != NULL_TREE
1549 /* Same pointer types, but ignoring POINTER_TYPE vs.
1551 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1552 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1553 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1554 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1555 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1556 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1557 /* Same value types ignoring qualifiers. */
1558 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0
))
1559 == TYPE_MAIN_VARIANT
1560 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))))))
1562 op0
= TREE_OPERAND (op0
, 0);
1565 if (op_prio (op0
) < op_prio (node
))
1566 pp_left_paren (buffer
);
1567 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1568 if (op_prio (op0
) < op_prio (node
))
1569 pp_right_paren (buffer
);
1570 pp_string (buffer
, str
);
1571 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1572 op0
= component_ref_field_offset (node
);
1573 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
1575 pp_string (buffer
, "{off: ");
1576 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1577 pp_right_brace (buffer
);
1582 pp_string (buffer
, "BIT_FIELD_REF <");
1583 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1584 pp_string (buffer
, ", ");
1585 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1586 pp_string (buffer
, ", ");
1587 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1588 pp_greater (buffer
);
1592 case ARRAY_RANGE_REF
:
1593 op0
= TREE_OPERAND (node
, 0);
1594 if (op_prio (op0
) < op_prio (node
))
1595 pp_left_paren (buffer
);
1596 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1597 if (op_prio (op0
) < op_prio (node
))
1598 pp_right_paren (buffer
);
1599 pp_left_bracket (buffer
);
1600 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1601 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
1602 pp_string (buffer
, " ...");
1603 pp_right_bracket (buffer
);
1605 op0
= array_ref_low_bound (node
);
1606 op1
= array_ref_element_size (node
);
1608 if (!integer_zerop (op0
)
1609 || TREE_OPERAND (node
, 2)
1610 || TREE_OPERAND (node
, 3))
1612 pp_string (buffer
, "{lb: ");
1613 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1614 pp_string (buffer
, " sz: ");
1615 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1616 pp_right_brace (buffer
);
1622 unsigned HOST_WIDE_INT ix
;
1624 bool is_struct_init
= false;
1625 bool is_array_init
= false;
1627 pp_left_brace (buffer
);
1628 if (TREE_CLOBBER_P (node
))
1629 pp_string (buffer
, "CLOBBER");
1630 else if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1631 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1632 is_struct_init
= true;
1633 else if (TREE_CODE (TREE_TYPE (node
)) == ARRAY_TYPE
1634 && TYPE_DOMAIN (TREE_TYPE (node
))
1635 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)))
1636 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
))))
1639 tree minv
= TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)));
1640 is_array_init
= true;
1641 curidx
= wi::to_widest (minv
);
1643 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1650 dump_generic_node (buffer
, field
, spc
, flags
, false);
1653 else if (is_array_init
1654 && (TREE_CODE (field
) != INTEGER_CST
1655 || curidx
!= wi::to_widest (field
)))
1657 pp_left_bracket (buffer
);
1658 if (TREE_CODE (field
) == RANGE_EXPR
)
1660 dump_generic_node (buffer
, TREE_OPERAND (field
, 0), spc
,
1662 pp_string (buffer
, " ... ");
1663 dump_generic_node (buffer
, TREE_OPERAND (field
, 1), spc
,
1665 if (TREE_CODE (TREE_OPERAND (field
, 1)) == INTEGER_CST
)
1666 curidx
= wi::to_widest (TREE_OPERAND (field
, 1));
1669 dump_generic_node (buffer
, field
, spc
, flags
, false);
1670 if (TREE_CODE (field
) == INTEGER_CST
)
1671 curidx
= wi::to_widest (field
);
1672 pp_string (buffer
, "]=");
1677 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1678 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1679 val
= TREE_OPERAND (val
, 0);
1680 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1681 dump_decl_name (buffer
, val
, flags
);
1683 dump_generic_node (buffer
, val
, spc
, flags
, false);
1684 if (ix
!= vec_safe_length (CONSTRUCTOR_ELTS (node
)) - 1)
1690 pp_right_brace (buffer
);
1697 if (flags
& TDF_SLIM
)
1699 pp_string (buffer
, "<COMPOUND_EXPR>");
1703 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1704 spc
, flags
, !(flags
& TDF_SLIM
));
1705 if (flags
& TDF_SLIM
)
1706 newline_and_indent (buffer
, spc
);
1713 for (tp
= &TREE_OPERAND (node
, 1);
1714 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1715 tp
= &TREE_OPERAND (*tp
, 1))
1717 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1718 spc
, flags
, !(flags
& TDF_SLIM
));
1719 if (flags
& TDF_SLIM
)
1720 newline_and_indent (buffer
, spc
);
1728 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1732 case STATEMENT_LIST
:
1734 tree_stmt_iterator si
;
1737 if (flags
& TDF_SLIM
)
1739 pp_string (buffer
, "<STATEMENT_LIST>");
1743 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1746 newline_and_indent (buffer
, spc
);
1749 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1756 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
,
1761 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
,
1766 pp_string (buffer
, "TARGET_EXPR <");
1767 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1770 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1771 pp_greater (buffer
);
1775 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1780 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1782 pp_string (buffer
, "if (");
1783 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1784 pp_right_paren (buffer
);
1785 /* The lowered cond_exprs should always be printed in full. */
1786 if (COND_EXPR_THEN (node
)
1787 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1788 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1789 && COND_EXPR_ELSE (node
)
1790 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1791 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1794 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1796 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1798 pp_string (buffer
, " else ");
1799 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1803 else if (!(flags
& TDF_SLIM
))
1805 /* Output COND_EXPR_THEN. */
1806 if (COND_EXPR_THEN (node
))
1808 newline_and_indent (buffer
, spc
+2);
1809 pp_left_brace (buffer
);
1810 newline_and_indent (buffer
, spc
+4);
1811 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1813 newline_and_indent (buffer
, spc
+2);
1814 pp_right_brace (buffer
);
1817 /* Output COND_EXPR_ELSE. */
1818 if (COND_EXPR_ELSE (node
)
1819 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1821 newline_and_indent (buffer
, spc
);
1822 pp_string (buffer
, "else");
1823 newline_and_indent (buffer
, spc
+2);
1824 pp_left_brace (buffer
);
1825 newline_and_indent (buffer
, spc
+4);
1826 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1828 newline_and_indent (buffer
, spc
+2);
1829 pp_right_brace (buffer
);
1836 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1838 pp_question (buffer
);
1840 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1844 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1849 pp_left_brace (buffer
);
1850 if (!(flags
& TDF_SLIM
))
1852 if (BIND_EXPR_VARS (node
))
1854 pp_newline (buffer
);
1856 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= DECL_CHAIN (op0
))
1858 print_declaration (buffer
, op0
, spc
+2, flags
);
1859 pp_newline (buffer
);
1863 newline_and_indent (buffer
, spc
+2);
1864 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1865 newline_and_indent (buffer
, spc
);
1866 pp_right_brace (buffer
);
1872 if (CALL_EXPR_FN (node
) != NULL_TREE
)
1873 print_call_name (buffer
, CALL_EXPR_FN (node
), flags
);
1875 pp_string (buffer
, internal_fn_name (CALL_EXPR_IFN (node
)));
1877 /* Print parameters. */
1879 pp_left_paren (buffer
);
1882 call_expr_arg_iterator iter
;
1883 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1885 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1886 if (more_call_expr_args_p (&iter
))
1893 if (CALL_EXPR_VA_ARG_PACK (node
))
1895 if (call_expr_nargs (node
) > 0)
1900 pp_string (buffer
, "__builtin_va_arg_pack ()");
1902 pp_right_paren (buffer
);
1904 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1907 pp_string (buffer
, " [static-chain: ");
1908 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1909 pp_right_bracket (buffer
);
1912 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1913 pp_string (buffer
, " [return slot optimization]");
1914 if (CALL_EXPR_TAILCALL (node
))
1915 pp_string (buffer
, " [tail call]");
1918 case WITH_CLEANUP_EXPR
:
1922 case CLEANUP_POINT_EXPR
:
1923 pp_string (buffer
, "<<cleanup_point ");
1924 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1925 pp_string (buffer
, ">>");
1928 case PLACEHOLDER_EXPR
:
1929 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1930 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1931 pp_greater (buffer
);
1934 /* Binary arithmetic and logic expressions. */
1935 case WIDEN_SUM_EXPR
:
1936 case WIDEN_MULT_EXPR
:
1938 case MULT_HIGHPART_EXPR
:
1940 case POINTER_PLUS_EXPR
:
1942 case TRUNC_DIV_EXPR
:
1944 case FLOOR_DIV_EXPR
:
1945 case ROUND_DIV_EXPR
:
1946 case TRUNC_MOD_EXPR
:
1948 case FLOOR_MOD_EXPR
:
1949 case ROUND_MOD_EXPR
:
1951 case EXACT_DIV_EXPR
:
1956 case VEC_RSHIFT_EXPR
:
1957 case WIDEN_LSHIFT_EXPR
:
1961 case TRUTH_ANDIF_EXPR
:
1962 case TRUTH_ORIF_EXPR
:
1963 case TRUTH_AND_EXPR
:
1965 case TRUTH_XOR_EXPR
:
1979 case UNORDERED_EXPR
:
1981 const char *op
= op_symbol (node
);
1982 op0
= TREE_OPERAND (node
, 0);
1983 op1
= TREE_OPERAND (node
, 1);
1985 /* When the operands are expressions with less priority,
1986 keep semantics of the tree representation. */
1987 if (op_prio (op0
) <= op_prio (node
))
1989 pp_left_paren (buffer
);
1990 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1991 pp_right_paren (buffer
);
1994 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1997 pp_string (buffer
, op
);
2000 /* When the operands are expressions with less priority,
2001 keep semantics of the tree representation. */
2002 if (op_prio (op1
) <= op_prio (node
))
2004 pp_left_paren (buffer
);
2005 dump_generic_node (buffer
, op1
, spc
, flags
, false);
2006 pp_right_paren (buffer
);
2009 dump_generic_node (buffer
, op1
, spc
, flags
, false);
2013 /* Unary arithmetic and logic expressions. */
2016 case TRUTH_NOT_EXPR
:
2018 case PREDECREMENT_EXPR
:
2019 case PREINCREMENT_EXPR
:
2021 if (TREE_CODE (node
) == ADDR_EXPR
2022 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
2023 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
2024 ; /* Do not output '&' for strings and function pointers. */
2026 pp_string (buffer
, op_symbol (node
));
2028 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2030 pp_left_paren (buffer
);
2031 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2032 pp_right_paren (buffer
);
2035 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2038 case POSTDECREMENT_EXPR
:
2039 case POSTINCREMENT_EXPR
:
2040 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2042 pp_left_paren (buffer
);
2043 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2044 pp_right_paren (buffer
);
2047 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2048 pp_string (buffer
, op_symbol (node
));
2052 pp_string (buffer
, "MIN_EXPR <");
2053 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2054 pp_string (buffer
, ", ");
2055 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2056 pp_greater (buffer
);
2060 pp_string (buffer
, "MAX_EXPR <");
2061 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2062 pp_string (buffer
, ", ");
2063 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2064 pp_greater (buffer
);
2068 pp_string (buffer
, "ABS_EXPR <");
2069 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2070 pp_greater (buffer
);
2077 case ADDR_SPACE_CONVERT_EXPR
:
2078 case FIXED_CONVERT_EXPR
:
2079 case FIX_TRUNC_EXPR
:
2082 type
= TREE_TYPE (node
);
2083 op0
= TREE_OPERAND (node
, 0);
2084 if (type
!= TREE_TYPE (op0
))
2086 pp_left_paren (buffer
);
2087 dump_generic_node (buffer
, type
, spc
, flags
, false);
2088 pp_string (buffer
, ") ");
2090 if (op_prio (op0
) < op_prio (node
))
2091 pp_left_paren (buffer
);
2092 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2093 if (op_prio (op0
) < op_prio (node
))
2094 pp_right_paren (buffer
);
2097 case VIEW_CONVERT_EXPR
:
2098 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
2099 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
2100 pp_string (buffer
, ">(");
2101 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2102 pp_right_paren (buffer
);
2106 pp_string (buffer
, "((");
2107 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2108 pp_string (buffer
, "))");
2111 case NON_LVALUE_EXPR
:
2112 pp_string (buffer
, "NON_LVALUE_EXPR <");
2113 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2114 pp_greater (buffer
);
2118 pp_string (buffer
, "SAVE_EXPR <");
2119 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2120 pp_greater (buffer
);
2124 pp_string (buffer
, "COMPLEX_EXPR <");
2125 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2126 pp_string (buffer
, ", ");
2127 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2128 pp_greater (buffer
);
2132 pp_string (buffer
, "CONJ_EXPR <");
2133 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2134 pp_greater (buffer
);
2138 pp_string (buffer
, "REALPART_EXPR <");
2139 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2140 pp_greater (buffer
);
2144 pp_string (buffer
, "IMAGPART_EXPR <");
2145 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2146 pp_greater (buffer
);
2150 pp_string (buffer
, "VA_ARG_EXPR <");
2151 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2152 pp_greater (buffer
);
2155 case TRY_FINALLY_EXPR
:
2156 case TRY_CATCH_EXPR
:
2157 pp_string (buffer
, "try");
2158 newline_and_indent (buffer
, spc
+2);
2159 pp_left_brace (buffer
);
2160 newline_and_indent (buffer
, spc
+4);
2161 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
2162 newline_and_indent (buffer
, spc
+2);
2163 pp_right_brace (buffer
);
2164 newline_and_indent (buffer
, spc
);
2166 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
2167 newline_and_indent (buffer
, spc
+2);
2168 pp_left_brace (buffer
);
2169 newline_and_indent (buffer
, spc
+4);
2170 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
2171 newline_and_indent (buffer
, spc
+2);
2172 pp_right_brace (buffer
);
2177 pp_string (buffer
, "catch (");
2178 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
2179 pp_right_paren (buffer
);
2180 newline_and_indent (buffer
, spc
+2);
2181 pp_left_brace (buffer
);
2182 newline_and_indent (buffer
, spc
+4);
2183 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
2184 newline_and_indent (buffer
, spc
+2);
2185 pp_right_brace (buffer
);
2189 case EH_FILTER_EXPR
:
2190 pp_string (buffer
, "<<<eh_filter (");
2191 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
2192 pp_string (buffer
, ")>>>");
2193 newline_and_indent (buffer
, spc
+2);
2194 pp_left_brace (buffer
);
2195 newline_and_indent (buffer
, spc
+4);
2196 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
2197 newline_and_indent (buffer
, spc
+2);
2198 pp_right_brace (buffer
);
2203 op0
= TREE_OPERAND (node
, 0);
2204 /* If this is for break or continue, don't bother printing it. */
2205 if (DECL_NAME (op0
))
2207 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2208 if (strcmp (name
, "break") == 0
2209 || strcmp (name
, "continue") == 0)
2212 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2214 if (DECL_NONLOCAL (op0
))
2215 pp_string (buffer
, " [non-local]");
2219 pp_string (buffer
, "while (1)");
2220 if (!(flags
& TDF_SLIM
))
2222 newline_and_indent (buffer
, spc
+2);
2223 pp_left_brace (buffer
);
2224 newline_and_indent (buffer
, spc
+4);
2225 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
2226 newline_and_indent (buffer
, spc
+2);
2227 pp_right_brace (buffer
);
2233 pp_string (buffer
, "// predicted ");
2234 if (PREDICT_EXPR_OUTCOME (node
))
2235 pp_string (buffer
, "likely by ");
2237 pp_string (buffer
, "unlikely by ");
2238 pp_string (buffer
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
2239 pp_string (buffer
, " predictor.");
2243 pp_string (buffer
, "ANNOTATE_EXPR <");
2244 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2245 switch ((enum annot_expr_kind
) TREE_INT_CST_LOW (TREE_OPERAND (node
, 1)))
2247 case annot_expr_ivdep_kind
:
2248 pp_string (buffer
, ", ivdep");
2250 case annot_expr_no_vector_kind
:
2251 pp_string (buffer
, ", no-vector");
2253 case annot_expr_vector_kind
:
2254 pp_string (buffer
, ", vector");
2259 pp_greater (buffer
);
2263 pp_string (buffer
, "return");
2264 op0
= TREE_OPERAND (node
, 0);
2268 if (TREE_CODE (op0
) == MODIFY_EXPR
)
2269 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1),
2272 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2277 pp_string (buffer
, "if (");
2278 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2279 pp_string (buffer
, ") break");
2283 pp_string (buffer
, "switch (");
2284 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
2285 pp_right_paren (buffer
);
2286 if (!(flags
& TDF_SLIM
))
2288 newline_and_indent (buffer
, spc
+2);
2289 pp_left_brace (buffer
);
2290 if (SWITCH_BODY (node
))
2292 newline_and_indent (buffer
, spc
+4);
2293 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
2298 tree vec
= SWITCH_LABELS (node
);
2299 size_t i
, n
= TREE_VEC_LENGTH (vec
);
2300 for (i
= 0; i
< n
; ++i
)
2302 tree elt
= TREE_VEC_ELT (vec
, i
);
2303 newline_and_indent (buffer
, spc
+4);
2306 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
2307 pp_string (buffer
, " goto ");
2308 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
2310 pp_semicolon (buffer
);
2313 pp_string (buffer
, "case ???: goto ???;");
2316 newline_and_indent (buffer
, spc
+2);
2317 pp_right_brace (buffer
);
2323 op0
= GOTO_DESTINATION (node
);
2324 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
2326 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2327 if (strcmp (name
, "break") == 0
2328 || strcmp (name
, "continue") == 0)
2330 pp_string (buffer
, name
);
2334 pp_string (buffer
, "goto ");
2335 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2339 pp_string (buffer
, "__asm__");
2340 if (ASM_VOLATILE_P (node
))
2341 pp_string (buffer
, " __volatile__");
2342 pp_left_paren (buffer
);
2343 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
2345 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
2347 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
2348 if (ASM_CLOBBERS (node
))
2351 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
2353 pp_right_paren (buffer
);
2356 case CASE_LABEL_EXPR
:
2357 if (CASE_LOW (node
) && CASE_HIGH (node
))
2359 pp_string (buffer
, "case ");
2360 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2361 pp_string (buffer
, " ... ");
2362 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
2364 else if (CASE_LOW (node
))
2366 pp_string (buffer
, "case ");
2367 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2370 pp_string (buffer
, "default");
2375 pp_string (buffer
, "OBJ_TYPE_REF(");
2376 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
2377 pp_semicolon (buffer
);
2378 if (!(flags
& TDF_SLIM
) && virtual_method_call_p (node
))
2380 pp_string (buffer
, "(");
2381 dump_generic_node (buffer
, obj_type_ref_class (node
), spc
, flags
, false);
2382 pp_string (buffer
, ")");
2384 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
2386 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
2387 pp_right_paren (buffer
);
2391 if (SSA_NAME_IDENTIFIER (node
))
2392 dump_generic_node (buffer
, SSA_NAME_IDENTIFIER (node
),
2394 pp_underscore (buffer
);
2395 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
2396 if (SSA_NAME_IS_DEFAULT_DEF (node
))
2397 pp_string (buffer
, "(D)");
2398 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
2399 pp_string (buffer
, "(ab)");
2402 case WITH_SIZE_EXPR
:
2403 pp_string (buffer
, "WITH_SIZE_EXPR <");
2404 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2405 pp_string (buffer
, ", ");
2406 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2407 pp_greater (buffer
);
2411 pp_string (buffer
, "ASSERT_EXPR <");
2412 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
2413 pp_string (buffer
, ", ");
2414 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
2415 pp_greater (buffer
);
2419 pp_string (buffer
, "scev_known");
2422 case SCEV_NOT_KNOWN
:
2423 pp_string (buffer
, "scev_not_known");
2426 case POLYNOMIAL_CHREC
:
2427 pp_left_brace (buffer
);
2428 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
2429 pp_string (buffer
, ", +, ");
2430 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
2431 pp_string (buffer
, "}_");
2432 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
2436 case REALIGN_LOAD_EXPR
:
2437 pp_string (buffer
, "REALIGN_LOAD <");
2438 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2439 pp_string (buffer
, ", ");
2440 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2441 pp_string (buffer
, ", ");
2442 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2443 pp_greater (buffer
);
2447 pp_string (buffer
, " VEC_COND_EXPR < ");
2448 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2449 pp_string (buffer
, " , ");
2450 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2451 pp_string (buffer
, " , ");
2452 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2453 pp_string (buffer
, " > ");
2457 pp_string (buffer
, " VEC_PERM_EXPR < ");
2458 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2459 pp_string (buffer
, " , ");
2460 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2461 pp_string (buffer
, " , ");
2462 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2463 pp_string (buffer
, " > ");
2467 pp_string (buffer
, " DOT_PROD_EXPR < ");
2468 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2469 pp_string (buffer
, ", ");
2470 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2471 pp_string (buffer
, ", ");
2472 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2473 pp_string (buffer
, " > ");
2476 case WIDEN_MULT_PLUS_EXPR
:
2477 pp_string (buffer
, " WIDEN_MULT_PLUS_EXPR < ");
2478 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2479 pp_string (buffer
, ", ");
2480 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2481 pp_string (buffer
, ", ");
2482 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2483 pp_string (buffer
, " > ");
2486 case WIDEN_MULT_MINUS_EXPR
:
2487 pp_string (buffer
, " WIDEN_MULT_MINUS_EXPR < ");
2488 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2489 pp_string (buffer
, ", ");
2490 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2491 pp_string (buffer
, ", ");
2492 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2493 pp_string (buffer
, " > ");
2497 pp_string (buffer
, " FMA_EXPR < ");
2498 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2499 pp_string (buffer
, ", ");
2500 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2501 pp_string (buffer
, ", ");
2502 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2503 pp_string (buffer
, " > ");
2507 pp_string (buffer
, "#pragma acc parallel");
2508 dump_omp_clauses (buffer
, OACC_PARALLEL_CLAUSES (node
), spc
, flags
);
2512 pp_string (buffer
, "#pragma acc kernels");
2513 dump_omp_clauses (buffer
, OACC_KERNELS_CLAUSES (node
), spc
, flags
);
2517 pp_string (buffer
, "#pragma acc data");
2518 dump_omp_clauses (buffer
, OACC_DATA_CLAUSES (node
), spc
, flags
);
2521 case OACC_HOST_DATA
:
2522 pp_string (buffer
, "#pragma acc host_data");
2523 dump_omp_clauses (buffer
, OACC_HOST_DATA_CLAUSES (node
), spc
, flags
);
2527 pp_string (buffer
, "#pragma acc declare");
2528 dump_omp_clauses (buffer
, OACC_DECLARE_CLAUSES (node
), spc
, flags
);
2532 pp_string (buffer
, "#pragma acc update");
2533 dump_omp_clauses (buffer
, OACC_UPDATE_CLAUSES (node
), spc
, flags
);
2536 case OACC_ENTER_DATA
:
2537 pp_string (buffer
, "#pragma acc enter data");
2538 dump_omp_clauses (buffer
, OACC_ENTER_DATA_CLAUSES (node
), spc
, flags
);
2541 case OACC_EXIT_DATA
:
2542 pp_string (buffer
, "#pragma acc exit data");
2543 dump_omp_clauses (buffer
, OACC_EXIT_DATA_CLAUSES (node
), spc
, flags
);
2547 pp_string (buffer
, "#pragma acc cache");
2548 dump_omp_clauses (buffer
, OACC_CACHE_CLAUSES (node
), spc
, flags
);
2552 pp_string (buffer
, "#pragma omp parallel");
2553 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
2556 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
2558 newline_and_indent (buffer
, spc
+ 2);
2559 pp_left_brace (buffer
);
2560 newline_and_indent (buffer
, spc
+ 4);
2561 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
2562 newline_and_indent (buffer
, spc
+ 2);
2563 pp_right_brace (buffer
);
2569 pp_string (buffer
, "#pragma omp task");
2570 dump_omp_clauses (buffer
, OMP_TASK_CLAUSES (node
), spc
, flags
);
2574 pp_string (buffer
, "#pragma omp for");
2578 pp_string (buffer
, "#pragma omp simd");
2582 pp_string (buffer
, "#pragma simd");
2586 /* This label points one line after dumping the clauses.
2587 For _Cilk_for the clauses are dumped after the _Cilk_for (...)
2588 parameters are printed out. */
2589 goto dump_omp_loop_cilk_for
;
2591 case OMP_DISTRIBUTE
:
2592 pp_string (buffer
, "#pragma omp distribute");
2596 pp_string (buffer
, "#pragma acc loop");
2600 pp_string (buffer
, "#pragma omp teams");
2601 dump_omp_clauses (buffer
, OMP_TEAMS_CLAUSES (node
), spc
, flags
);
2604 case OMP_TARGET_DATA
:
2605 pp_string (buffer
, "#pragma omp target data");
2606 dump_omp_clauses (buffer
, OMP_TARGET_DATA_CLAUSES (node
), spc
, flags
);
2610 pp_string (buffer
, "#pragma omp target");
2611 dump_omp_clauses (buffer
, OMP_TARGET_CLAUSES (node
), spc
, flags
);
2614 case OMP_TARGET_UPDATE
:
2615 pp_string (buffer
, "#pragma omp target update");
2616 dump_omp_clauses (buffer
, OMP_TARGET_UPDATE_CLAUSES (node
), spc
, flags
);
2621 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2623 dump_omp_loop_cilk_for
:
2624 if (!(flags
& TDF_SLIM
))
2628 if (OMP_FOR_PRE_BODY (node
))
2630 if (TREE_CODE (node
) == CILK_FOR
)
2631 pp_string (buffer
, " ");
2633 newline_and_indent (buffer
, spc
+ 2);
2634 pp_left_brace (buffer
);
2636 newline_and_indent (buffer
, spc
);
2637 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
2640 if (OMP_FOR_INIT (node
))
2643 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
2646 if (TREE_CODE (node
) != CILK_FOR
|| OMP_FOR_PRE_BODY (node
))
2647 newline_and_indent (buffer
, spc
);
2648 if (TREE_CODE (node
) == CILK_FOR
)
2649 pp_string (buffer
, "_Cilk_for (");
2651 pp_string (buffer
, "for (");
2652 dump_generic_node (buffer
,
2653 TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
2655 pp_string (buffer
, "; ");
2656 dump_generic_node (buffer
,
2657 TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
2659 pp_string (buffer
, "; ");
2660 dump_generic_node (buffer
,
2661 TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
2663 pp_right_paren (buffer
);
2665 if (TREE_CODE (node
) == CILK_FOR
)
2666 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2668 if (OMP_FOR_BODY (node
))
2670 newline_and_indent (buffer
, spc
+ 2);
2671 pp_left_brace (buffer
);
2672 newline_and_indent (buffer
, spc
+ 4);
2673 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
2675 newline_and_indent (buffer
, spc
+ 2);
2676 pp_right_brace (buffer
);
2678 if (OMP_FOR_INIT (node
))
2679 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
2680 if (OMP_FOR_PRE_BODY (node
))
2683 newline_and_indent (buffer
, spc
+ 2);
2684 pp_right_brace (buffer
);
2691 pp_string (buffer
, "#pragma omp sections");
2692 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
2696 pp_string (buffer
, "#pragma omp section");
2700 pp_string (buffer
, "#pragma omp master");
2704 pp_string (buffer
, "#pragma omp taskgroup");
2708 pp_string (buffer
, "#pragma omp ordered");
2712 pp_string (buffer
, "#pragma omp critical");
2713 if (OMP_CRITICAL_NAME (node
))
2716 pp_left_paren (buffer
);
2717 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
2719 pp_right_paren (buffer
);
2724 pp_string (buffer
, "#pragma omp atomic");
2725 if (OMP_ATOMIC_SEQ_CST (node
))
2726 pp_string (buffer
, " seq_cst");
2727 newline_and_indent (buffer
, spc
+ 2);
2728 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2732 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2735 case OMP_ATOMIC_READ
:
2736 pp_string (buffer
, "#pragma omp atomic read");
2737 if (OMP_ATOMIC_SEQ_CST (node
))
2738 pp_string (buffer
, " seq_cst");
2739 newline_and_indent (buffer
, spc
+ 2);
2740 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2744 case OMP_ATOMIC_CAPTURE_OLD
:
2745 case OMP_ATOMIC_CAPTURE_NEW
:
2746 pp_string (buffer
, "#pragma omp atomic capture");
2747 if (OMP_ATOMIC_SEQ_CST (node
))
2748 pp_string (buffer
, " seq_cst");
2749 newline_and_indent (buffer
, spc
+ 2);
2750 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2754 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2758 pp_string (buffer
, "#pragma omp single");
2759 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
2763 dump_omp_clause (buffer
, node
, spc
, flags
);
2767 case TRANSACTION_EXPR
:
2768 if (TRANSACTION_EXPR_OUTER (node
))
2769 pp_string (buffer
, "__transaction_atomic [[outer]]");
2770 else if (TRANSACTION_EXPR_RELAXED (node
))
2771 pp_string (buffer
, "__transaction_relaxed");
2773 pp_string (buffer
, "__transaction_atomic");
2774 if (!(flags
& TDF_SLIM
) && TRANSACTION_EXPR_BODY (node
))
2776 newline_and_indent (buffer
, spc
);
2777 pp_left_brace (buffer
);
2778 newline_and_indent (buffer
, spc
+ 2);
2779 dump_generic_node (buffer
, TRANSACTION_EXPR_BODY (node
),
2780 spc
+ 2, flags
, false);
2781 newline_and_indent (buffer
, spc
);
2782 pp_right_brace (buffer
);
2787 case REDUC_MAX_EXPR
:
2788 pp_string (buffer
, " REDUC_MAX_EXPR < ");
2789 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2790 pp_string (buffer
, " > ");
2793 case REDUC_MIN_EXPR
:
2794 pp_string (buffer
, " REDUC_MIN_EXPR < ");
2795 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2796 pp_string (buffer
, " > ");
2799 case REDUC_PLUS_EXPR
:
2800 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
2801 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2802 pp_string (buffer
, " > ");
2805 case VEC_WIDEN_MULT_HI_EXPR
:
2806 case VEC_WIDEN_MULT_LO_EXPR
:
2807 case VEC_WIDEN_MULT_EVEN_EXPR
:
2808 case VEC_WIDEN_MULT_ODD_EXPR
:
2809 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2810 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2812 for (str
= get_tree_code_name (code
); *str
; str
++)
2813 pp_character (buffer
, TOUPPER (*str
));
2814 pp_string (buffer
, " < ");
2815 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2816 pp_string (buffer
, ", ");
2817 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2818 pp_string (buffer
, " > ");
2821 case VEC_UNPACK_HI_EXPR
:
2822 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
2823 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2824 pp_string (buffer
, " > ");
2827 case VEC_UNPACK_LO_EXPR
:
2828 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
2829 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2830 pp_string (buffer
, " > ");
2833 case VEC_UNPACK_FLOAT_HI_EXPR
:
2834 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2835 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2836 pp_string (buffer
, " > ");
2839 case VEC_UNPACK_FLOAT_LO_EXPR
:
2840 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2841 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2842 pp_string (buffer
, " > ");
2845 case VEC_PACK_TRUNC_EXPR
:
2846 pp_string (buffer
, " VEC_PACK_TRUNC_EXPR < ");
2847 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2848 pp_string (buffer
, ", ");
2849 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2850 pp_string (buffer
, " > ");
2853 case VEC_PACK_SAT_EXPR
:
2854 pp_string (buffer
, " VEC_PACK_SAT_EXPR < ");
2855 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2856 pp_string (buffer
, ", ");
2857 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2858 pp_string (buffer
, " > ");
2861 case VEC_PACK_FIX_TRUNC_EXPR
:
2862 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2863 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2864 pp_string (buffer
, ", ");
2865 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2866 pp_string (buffer
, " > ");
2870 dump_block_node (buffer
, node
, spc
, flags
);
2873 case CILK_SPAWN_STMT
:
2874 pp_string (buffer
, "_Cilk_spawn ");
2875 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2878 case CILK_SYNC_STMT
:
2879 pp_string (buffer
, "_Cilk_sync");
2886 if (is_stmt
&& is_expr
)
2887 pp_semicolon (buffer
);
2892 /* Print the declaration of a variable. */
2895 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2899 if (TREE_CODE(t
) == NAMELIST_DECL
)
2901 pp_string(buffer
, "namelist ");
2902 dump_decl_name (buffer
, t
, flags
);
2903 pp_semicolon (buffer
);
2907 if (TREE_CODE (t
) == TYPE_DECL
)
2908 pp_string (buffer
, "typedef ");
2910 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2911 pp_string (buffer
, "register ");
2913 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2914 pp_string (buffer
, "extern ");
2915 else if (TREE_STATIC (t
))
2916 pp_string (buffer
, "static ");
2918 /* Print the type and name. */
2919 if (TREE_TYPE (t
) && TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2923 /* Print array's type. */
2924 tmp
= TREE_TYPE (t
);
2925 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2926 tmp
= TREE_TYPE (tmp
);
2927 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2929 /* Print variable's name. */
2931 dump_generic_node (buffer
, t
, spc
, flags
, false);
2933 /* Print the dimensions. */
2934 tmp
= TREE_TYPE (t
);
2935 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2937 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2938 tmp
= TREE_TYPE (tmp
);
2941 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2943 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2945 dump_decl_name (buffer
, t
, flags
);
2946 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2950 /* Print type declaration. */
2951 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2953 /* Print variable's name. */
2955 dump_generic_node (buffer
, t
, spc
, flags
, false);
2958 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2960 pp_string (buffer
, " __asm__ ");
2961 pp_left_paren (buffer
);
2962 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2963 pp_right_paren (buffer
);
2966 /* The initial value of a function serves to determine whether the function
2967 is declared or defined. So the following does not apply to function
2969 if (TREE_CODE (t
) != FUNCTION_DECL
)
2971 /* Print the initial value. */
2972 if (DECL_INITIAL (t
))
2977 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2981 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2983 pp_string (buffer
, " [value-expr: ");
2984 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2985 pp_right_bracket (buffer
);
2988 pp_semicolon (buffer
);
2992 /* Prints a structure: name, fields, and methods.
2993 FIXME: Still incomplete. */
2996 print_struct_decl (pretty_printer
*buffer
, const_tree node
, int spc
, int flags
)
2998 /* Print the name of the structure. */
2999 if (TYPE_NAME (node
))
3002 if (TREE_CODE (node
) == RECORD_TYPE
)
3003 pp_string (buffer
, "struct ");
3004 else if ((TREE_CODE (node
) == UNION_TYPE
3005 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
3006 pp_string (buffer
, "union ");
3008 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
3011 /* Print the contents of the structure. */
3012 pp_newline (buffer
);
3014 pp_left_brace (buffer
);
3015 pp_newline (buffer
);
3017 /* Print the fields of the structure. */
3020 tmp
= TYPE_FIELDS (node
);
3023 /* Avoid to print recursively the structure. */
3024 /* FIXME : Not implemented correctly...,
3025 what about the case when we have a cycle in the contain graph? ...
3026 Maybe this could be solved by looking at the scope in which the
3027 structure was declared. */
3028 if (TREE_TYPE (tmp
) != node
3029 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
3030 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
3032 print_declaration (buffer
, tmp
, spc
+2, flags
);
3033 pp_newline (buffer
);
3035 tmp
= DECL_CHAIN (tmp
);
3039 pp_right_brace (buffer
);
3042 /* Return the priority of the operator CODE.
3044 From lowest to highest precedence with either left-to-right (L-R)
3045 or right-to-left (R-L) associativity]:
3048 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
3060 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
3061 15 [L-R] fn() [] -> .
3063 unary +, - and * have higher precedence than the corresponding binary
3067 op_code_prio (enum tree_code code
)
3084 case TRUTH_ORIF_EXPR
:
3087 case TRUTH_AND_EXPR
:
3088 case TRUTH_ANDIF_EXPR
:
3095 case TRUTH_XOR_EXPR
:
3112 case UNORDERED_EXPR
:
3123 case VEC_WIDEN_LSHIFT_HI_EXPR
:
3124 case VEC_WIDEN_LSHIFT_LO_EXPR
:
3125 case WIDEN_LSHIFT_EXPR
:
3128 case WIDEN_SUM_EXPR
:
3130 case POINTER_PLUS_EXPR
:
3134 case VEC_WIDEN_MULT_HI_EXPR
:
3135 case VEC_WIDEN_MULT_LO_EXPR
:
3136 case WIDEN_MULT_EXPR
:
3138 case WIDEN_MULT_PLUS_EXPR
:
3139 case WIDEN_MULT_MINUS_EXPR
:
3141 case MULT_HIGHPART_EXPR
:
3142 case TRUNC_DIV_EXPR
:
3144 case FLOOR_DIV_EXPR
:
3145 case ROUND_DIV_EXPR
:
3147 case EXACT_DIV_EXPR
:
3148 case TRUNC_MOD_EXPR
:
3150 case FLOOR_MOD_EXPR
:
3151 case ROUND_MOD_EXPR
:
3155 case TRUTH_NOT_EXPR
:
3157 case POSTINCREMENT_EXPR
:
3158 case POSTDECREMENT_EXPR
:
3159 case PREINCREMENT_EXPR
:
3160 case PREDECREMENT_EXPR
:
3166 case FIX_TRUNC_EXPR
:
3172 case ARRAY_RANGE_REF
:
3176 /* Special expressions. */
3182 case REDUC_MAX_EXPR
:
3183 case REDUC_MIN_EXPR
:
3184 case REDUC_PLUS_EXPR
:
3185 case VEC_RSHIFT_EXPR
:
3186 case VEC_UNPACK_HI_EXPR
:
3187 case VEC_UNPACK_LO_EXPR
:
3188 case VEC_UNPACK_FLOAT_HI_EXPR
:
3189 case VEC_UNPACK_FLOAT_LO_EXPR
:
3190 case VEC_PACK_TRUNC_EXPR
:
3191 case VEC_PACK_SAT_EXPR
:
3195 /* Return an arbitrarily high precedence to avoid surrounding single
3196 VAR_DECLs in ()s. */
3201 /* Return the priority of the operator OP. */
3204 op_prio (const_tree op
)
3206 enum tree_code code
;
3211 code
= TREE_CODE (op
);
3212 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
3213 return op_prio (TREE_OPERAND (op
, 0));
3215 return op_code_prio (code
);
3218 /* Return the symbol associated with operator CODE. */
3221 op_symbol_code (enum tree_code code
)
3229 case TRUTH_ORIF_EXPR
:
3232 case TRUTH_AND_EXPR
:
3233 case TRUTH_ANDIF_EXPR
:
3239 case TRUTH_XOR_EXPR
:
3249 case UNORDERED_EXPR
:
3295 case VEC_RSHIFT_EXPR
:
3298 case WIDEN_LSHIFT_EXPR
:
3301 case POINTER_PLUS_EXPR
:
3307 case REDUC_PLUS_EXPR
:
3310 case WIDEN_SUM_EXPR
:
3313 case WIDEN_MULT_EXPR
:
3316 case MULT_HIGHPART_EXPR
:
3326 case TRUTH_NOT_EXPR
:
3333 case TRUNC_DIV_EXPR
:
3340 case FLOOR_DIV_EXPR
:
3343 case ROUND_DIV_EXPR
:
3346 case EXACT_DIV_EXPR
:
3349 case TRUNC_MOD_EXPR
:
3355 case FLOOR_MOD_EXPR
:
3358 case ROUND_MOD_EXPR
:
3361 case PREDECREMENT_EXPR
:
3364 case PREINCREMENT_EXPR
:
3367 case POSTDECREMENT_EXPR
:
3370 case POSTINCREMENT_EXPR
:
3380 return "<<< ??? >>>";
3384 /* Return the symbol associated with operator OP. */
3387 op_symbol (const_tree op
)
3389 return op_symbol_code (TREE_CODE (op
));
3392 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
3393 the gimple_call_fn of a GIMPLE_CALL. */
3396 print_call_name (pretty_printer
*buffer
, tree node
, int flags
)
3400 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
3401 op0
= TREE_OPERAND (op0
, 0);
3404 switch (TREE_CODE (op0
))
3409 dump_function_name (buffer
, op0
, flags
);
3415 op0
= TREE_OPERAND (op0
, 0);
3419 pp_left_paren (buffer
);
3420 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, flags
, false);
3421 pp_string (buffer
, ") ? ");
3422 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, flags
, false);
3423 pp_string (buffer
, " : ");
3424 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, flags
, false);
3428 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
3429 dump_function_name (buffer
, TREE_OPERAND (op0
, 0), flags
);
3431 dump_generic_node (buffer
, op0
, 0, flags
, false);
3435 if (integer_zerop (TREE_OPERAND (op0
, 1)))
3437 op0
= TREE_OPERAND (op0
, 0);
3444 dump_generic_node (buffer
, op0
, 0, flags
, false);
3452 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
3455 pretty_print_string (pretty_printer
*buffer
, const char *str
)
3465 pp_string (buffer
, "\\b");
3469 pp_string (buffer
, "\\f");
3473 pp_string (buffer
, "\\n");
3477 pp_string (buffer
, "\\r");
3481 pp_string (buffer
, "\\t");
3485 pp_string (buffer
, "\\v");
3489 pp_string (buffer
, "\\\\");
3493 pp_string (buffer
, "\\\"");
3497 pp_string (buffer
, "\\'");
3500 /* No need to handle \0; the loop terminates on \0. */
3503 pp_string (buffer
, "\\1");
3507 pp_string (buffer
, "\\2");
3511 pp_string (buffer
, "\\3");
3515 pp_string (buffer
, "\\4");
3519 pp_string (buffer
, "\\5");
3523 pp_string (buffer
, "\\6");
3527 pp_string (buffer
, "\\7");
3531 pp_character (buffer
, str
[0]);
3539 maybe_init_pretty_print (FILE *file
)
3543 new (&buffer
) pretty_printer ();
3544 pp_needs_newline (&buffer
) = true;
3545 pp_translate_identifiers (&buffer
) = false;
3549 buffer
.buffer
->stream
= file
;
3553 newline_and_indent (pretty_printer
*buffer
, int spc
)
3555 pp_newline (buffer
);
3559 /* Handle a %K format for TEXT. Separate from default_tree_printer so
3560 it can also be used in front ends.
3561 %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
3565 percent_K_format (text_info
*text
)
3567 tree t
= va_arg (*text
->args_ptr
, tree
), block
;
3568 gcc_assert (text
->locus
!= NULL
);
3569 *text
->locus
= EXPR_LOCATION (t
);
3570 gcc_assert (pp_ti_abstract_origin (text
) != NULL
);
3571 block
= TREE_BLOCK (t
);
3572 *pp_ti_abstract_origin (text
) = NULL
;
3576 /* ??? LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those
3577 representing the outermost block of an inlined function.
3578 So walk the BLOCK tree until we hit such a scope. */
3580 && TREE_CODE (block
) == BLOCK
)
3582 if (inlined_function_outer_scope_p (block
))
3584 *pp_ti_abstract_origin (text
) = block
;
3587 block
= BLOCK_SUPERCONTEXT (block
);
3593 && TREE_CODE (block
) == BLOCK
3594 && BLOCK_ABSTRACT_ORIGIN (block
))
3596 tree ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3598 while (TREE_CODE (ao
) == BLOCK
3599 && BLOCK_ABSTRACT_ORIGIN (ao
)
3600 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3601 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3603 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3605 *pp_ti_abstract_origin (text
) = block
;
3608 block
= BLOCK_SUPERCONTEXT (block
);
3612 /* Print the identifier ID to PRETTY-PRINTER. */
3615 pp_tree_identifier (pretty_printer
*pp
, tree id
)
3617 if (pp_translate_identifiers (pp
))
3619 const char *text
= identifier_to_locale (IDENTIFIER_POINTER (id
));
3620 pp_append_text (pp
, text
, text
+ strlen (text
));
3623 pp_append_text (pp
, IDENTIFIER_POINTER (id
),
3624 IDENTIFIER_POINTER (id
) + IDENTIFIER_LENGTH (id
));
3627 /* A helper function that is used to dump function information before the
3631 dump_function_header (FILE *dump_file
, tree fdecl
, int flags
)
3633 const char *dname
, *aname
;
3634 struct cgraph_node
*node
= cgraph_node::get (fdecl
);
3635 struct function
*fun
= DECL_STRUCT_FUNCTION (fdecl
);
3637 dname
= lang_hooks
.decl_printable_name (fdecl
, 2);
3639 if (DECL_ASSEMBLER_NAME_SET_P (fdecl
))
3640 aname
= (IDENTIFIER_POINTER
3641 (DECL_ASSEMBLER_NAME (fdecl
)));
3643 aname
= "<unset-asm-name>";
3645 fprintf (dump_file
, "\n;; Function %s (%s, funcdef_no=%d",
3646 dname
, aname
, fun
->funcdef_no
);
3647 if (!(flags
& TDF_NOUID
))
3648 fprintf (dump_file
, ", decl_uid=%d", DECL_UID (fdecl
));
3651 fprintf (dump_file
, ", cgraph_uid=%d", node
->uid
);
3652 fprintf (dump_file
, ", symbol_order=%d)%s\n\n", node
->order
,
3653 node
->frequency
== NODE_FREQUENCY_HOT
3655 : node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
3656 ? " (unlikely executed)"
3657 : node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
3658 ? " (executed once)"
3662 fprintf (dump_file
, ")\n\n");
3665 /* Dump double_int D to pretty_printer PP. UNS is true
3666 if D is unsigned and false otherwise. */
3668 pp_double_int (pretty_printer
*pp
, double_int d
, bool uns
)
3671 pp_wide_integer (pp
, d
.low
);
3672 else if (d
.fits_uhwi ())
3673 pp_unsigned_wide_integer (pp
, d
.low
);
3676 unsigned HOST_WIDE_INT low
= d
.low
;
3677 HOST_WIDE_INT high
= d
.high
;
3678 if (!uns
&& d
.is_negative ())
3681 high
= ~high
+ !low
;
3684 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
3686 sprintf (pp_buffer (pp
)->digit_buffer
,
3687 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
3688 (unsigned HOST_WIDE_INT
) high
, low
);
3689 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);