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"
30 #include "pointer-set.h"
31 #include "gimple-expr.h"
33 #include "langhooks.h"
34 #include "tree-iterator.h"
35 #include "tree-chrec.h"
37 #include "value-prof.h"
39 #include "wide-int-print.h"
41 #include <new> // For placement-new.
43 /* Local functions, macros and variables. */
44 static const char *op_symbol (const_tree
);
45 static void pretty_print_string (pretty_printer
*, const char*);
46 static void newline_and_indent (pretty_printer
*, int);
47 static void maybe_init_pretty_print (FILE *);
48 static void print_struct_decl (pretty_printer
*, const_tree
, int, int);
49 static void do_niy (pretty_printer
*, const_tree
);
51 #define INDENT(SPACE) do { \
52 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
54 #define NIY do_niy (buffer, node)
56 static pretty_printer buffer
;
57 static int initialized
= 0;
59 /* Try to print something for an unknown tree code. */
62 do_niy (pretty_printer
*buffer
, const_tree node
)
66 pp_string (buffer
, "<<< Unknown tree: ");
67 pp_string (buffer
, get_tree_code_name (TREE_CODE (node
)));
71 len
= TREE_OPERAND_LENGTH (node
);
72 for (i
= 0; i
< len
; ++i
)
74 newline_and_indent (buffer
, 2);
75 dump_generic_node (buffer
, TREE_OPERAND (node
, i
), 2, 0, false);
79 pp_string (buffer
, " >>>");
82 /* Debugging function to print out a generic expression. */
85 debug_generic_expr (tree t
)
87 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
88 fprintf (stderr
, "\n");
91 /* Debugging function to print out a generic statement. */
94 debug_generic_stmt (tree t
)
96 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
97 fprintf (stderr
, "\n");
100 /* Debugging function to print out a chain of trees . */
103 debug_tree_chain (tree t
)
105 struct pointer_set_t
*seen
= pointer_set_create ();
109 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
110 fprintf (stderr
, " ");
112 if (pointer_set_insert (seen
, t
))
114 fprintf (stderr
, "... [cycled back to ");
115 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
116 fprintf (stderr
, "]");
120 fprintf (stderr
, "\n");
122 pointer_set_destroy (seen
);
125 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
127 print_generic_decl (FILE *file
, tree decl
, int flags
)
129 maybe_init_pretty_print (file
);
130 print_declaration (&buffer
, decl
, 2, flags
);
131 pp_write_text_to_stream (&buffer
);
134 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
135 to show in the dump. See TDF_* in dumpfile.h. */
138 print_generic_stmt (FILE *file
, tree t
, int flags
)
140 maybe_init_pretty_print (file
);
141 dump_generic_node (&buffer
, t
, 0, flags
, true);
142 pp_newline_and_flush (&buffer
);
145 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
146 to show in the dump. See TDF_* in dumpfile.h. The output is indented by
150 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
154 maybe_init_pretty_print (file
);
156 for (i
= 0; i
< indent
; i
++)
158 dump_generic_node (&buffer
, t
, indent
, flags
, true);
159 pp_newline_and_flush (&buffer
);
162 /* Print a single expression T on file FILE. FLAGS specifies details to show
163 in the dump. See TDF_* in dumpfile.h. */
166 print_generic_expr (FILE *file
, tree t
, int flags
)
168 maybe_init_pretty_print (file
);
169 dump_generic_node (&buffer
, t
, 0, flags
, false);
173 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
177 dump_decl_name (pretty_printer
*buffer
, tree node
, int flags
)
179 if (DECL_NAME (node
))
181 if ((flags
& TDF_ASMNAME
) && DECL_ASSEMBLER_NAME_SET_P (node
))
182 pp_tree_identifier (buffer
, DECL_ASSEMBLER_NAME (node
));
184 pp_tree_identifier (buffer
, DECL_NAME (node
));
186 if ((flags
& TDF_UID
) || DECL_NAME (node
) == NULL_TREE
)
188 if (TREE_CODE (node
) == LABEL_DECL
&& LABEL_DECL_UID (node
) != -1)
189 pp_printf (buffer
, "L.%d", (int) LABEL_DECL_UID (node
));
190 else if (TREE_CODE (node
) == DEBUG_EXPR_DECL
)
192 if (flags
& TDF_NOUID
)
193 pp_string (buffer
, "D#xxxx");
195 pp_printf (buffer
, "D#%i", DEBUG_TEMP_UID (node
));
199 char c
= TREE_CODE (node
) == CONST_DECL
? 'C' : 'D';
200 if (flags
& TDF_NOUID
)
201 pp_printf (buffer
, "%c.xxxx", c
);
203 pp_printf (buffer
, "%c.%u", c
, DECL_UID (node
));
206 if ((flags
& TDF_ALIAS
) && DECL_PT_UID (node
) != DECL_UID (node
))
208 if (flags
& TDF_NOUID
)
209 pp_printf (buffer
, "ptD.xxxx");
211 pp_printf (buffer
, "ptD.%u", DECL_PT_UID (node
));
215 /* Like the above, but used for pretty printing function calls. */
218 dump_function_name (pretty_printer
*buffer
, tree node
, int flags
)
220 if (TREE_CODE (node
) == NOP_EXPR
)
221 node
= TREE_OPERAND (node
, 0);
222 if (DECL_NAME (node
) && (flags
& TDF_ASMNAME
) == 0)
223 pp_string (buffer
, lang_hooks
.decl_printable_name (node
, 1));
225 dump_decl_name (buffer
, node
, flags
);
228 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
229 FLAGS are as in dump_generic_node. */
232 dump_function_declaration (pretty_printer
*buffer
, tree node
,
235 bool wrote_arg
= false;
239 pp_left_paren (buffer
);
241 /* Print the argument types. */
242 arg
= TYPE_ARG_TYPES (node
);
243 while (arg
&& arg
!= void_list_node
&& arg
!= error_mark_node
)
251 dump_generic_node (buffer
, TREE_VALUE (arg
), spc
, flags
, false);
252 arg
= TREE_CHAIN (arg
);
255 /* Drop the trailing void_type_node if we had any previous argument. */
256 if (arg
== void_list_node
&& !wrote_arg
)
257 pp_string (buffer
, "void");
258 /* Properly dump vararg function types. */
259 else if (!arg
&& wrote_arg
)
260 pp_string (buffer
, ", ...");
261 /* Avoid printing any arg for unprototyped functions. */
263 pp_right_paren (buffer
);
266 /* Dump the domain associated with an array. */
269 dump_array_domain (pretty_printer
*buffer
, tree domain
, int spc
, int flags
)
271 pp_left_bracket (buffer
);
274 tree min
= TYPE_MIN_VALUE (domain
);
275 tree max
= TYPE_MAX_VALUE (domain
);
278 && integer_zerop (min
)
279 && tree_fits_shwi_p (max
))
280 pp_wide_integer (buffer
, tree_to_shwi (max
) + 1);
284 dump_generic_node (buffer
, min
, spc
, flags
, false);
287 dump_generic_node (buffer
, max
, spc
, flags
, false);
291 pp_string (buffer
, "<unknown>");
292 pp_right_bracket (buffer
);
296 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
297 dump_generic_node. */
300 dump_omp_clause (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
304 switch (OMP_CLAUSE_CODE (clause
))
306 case OMP_CLAUSE_PRIVATE
:
309 case OMP_CLAUSE_SHARED
:
312 case OMP_CLAUSE_FIRSTPRIVATE
:
313 name
= "firstprivate";
315 case OMP_CLAUSE_LASTPRIVATE
:
316 name
= "lastprivate";
318 case OMP_CLAUSE_COPYIN
:
321 case OMP_CLAUSE_COPYPRIVATE
:
322 name
= "copyprivate";
324 case OMP_CLAUSE_UNIFORM
:
327 case OMP_CLAUSE__LOOPTEMP_
:
330 case OMP_CLAUSE_HOST
:
333 case OMP_CLAUSE_OACC_DEVICE
:
336 case OMP_CLAUSE_DEVICE_RESIDENT
:
337 name
= "device_resident";
339 case OMP_CLAUSE_USE_DEVICE
:
342 case OMP_NO_CLAUSE_CACHE
:
346 pp_string (buffer
, name
);
347 pp_left_paren (buffer
);
348 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
350 pp_right_paren (buffer
);
353 case OMP_CLAUSE_REDUCTION
:
354 pp_string (buffer
, "reduction(");
355 if (OMP_CLAUSE_REDUCTION_CODE (clause
) != ERROR_MARK
)
358 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
361 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
363 pp_right_paren (buffer
);
367 pp_string (buffer
, "if(");
368 dump_generic_node (buffer
, OMP_CLAUSE_IF_EXPR (clause
),
370 pp_right_paren (buffer
);
373 case OMP_CLAUSE_NUM_THREADS
:
374 pp_string (buffer
, "num_threads(");
375 dump_generic_node (buffer
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
377 pp_right_paren (buffer
);
380 case OMP_CLAUSE_NOWAIT
:
381 pp_string (buffer
, "nowait");
383 case OMP_CLAUSE_ORDERED
:
384 pp_string (buffer
, "ordered");
387 case OMP_CLAUSE_DEFAULT
:
388 pp_string (buffer
, "default(");
389 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
391 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
393 case OMP_CLAUSE_DEFAULT_SHARED
:
394 pp_string (buffer
, "shared");
396 case OMP_CLAUSE_DEFAULT_NONE
:
397 pp_string (buffer
, "none");
399 case OMP_CLAUSE_DEFAULT_PRIVATE
:
400 pp_string (buffer
, "private");
402 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
403 pp_string (buffer
, "firstprivate");
408 pp_right_paren (buffer
);
411 case OMP_CLAUSE_SCHEDULE
:
412 pp_string (buffer
, "schedule(");
413 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
415 case OMP_CLAUSE_SCHEDULE_STATIC
:
416 pp_string (buffer
, "static");
418 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
419 pp_string (buffer
, "dynamic");
421 case OMP_CLAUSE_SCHEDULE_GUIDED
:
422 pp_string (buffer
, "guided");
424 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
425 pp_string (buffer
, "runtime");
427 case OMP_CLAUSE_SCHEDULE_AUTO
:
428 pp_string (buffer
, "auto");
433 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
436 dump_generic_node (buffer
, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
439 pp_right_paren (buffer
);
442 case OMP_CLAUSE_UNTIED
:
443 pp_string (buffer
, "untied");
446 case OMP_CLAUSE_COLLAPSE
:
447 pp_string (buffer
, "collapse(");
448 dump_generic_node (buffer
, OMP_CLAUSE_COLLAPSE_EXPR (clause
),
450 pp_right_paren (buffer
);
453 case OMP_CLAUSE_FINAL
:
454 pp_string (buffer
, "final(");
455 dump_generic_node (buffer
, OMP_CLAUSE_FINAL_EXPR (clause
),
457 pp_right_paren (buffer
);
460 case OMP_CLAUSE_MERGEABLE
:
461 pp_string (buffer
, "mergeable");
464 case OMP_CLAUSE_LINEAR
:
465 pp_string (buffer
, "linear(");
466 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
469 dump_generic_node (buffer
, OMP_CLAUSE_LINEAR_STEP (clause
),
471 pp_right_paren (buffer
);
474 case OMP_CLAUSE_ALIGNED
:
475 pp_string (buffer
, "aligned(");
476 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
478 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
))
481 dump_generic_node (buffer
, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
),
484 pp_right_paren (buffer
);
487 case OMP_CLAUSE_DEPEND
:
488 pp_string (buffer
, "depend(");
489 switch (OMP_CLAUSE_DEPEND_KIND (clause
))
491 case OMP_CLAUSE_DEPEND_IN
:
492 pp_string (buffer
, "in");
494 case OMP_CLAUSE_DEPEND_OUT
:
495 pp_string (buffer
, "out");
497 case OMP_CLAUSE_DEPEND_INOUT
:
498 pp_string (buffer
, "inout");
504 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
506 pp_right_paren (buffer
);
510 pp_string (buffer
, "map(");
511 switch (OMP_CLAUSE_MAP_KIND (clause
))
513 case OMP_CLAUSE_MAP_ALLOC
:
514 case OMP_CLAUSE_MAP_POINTER
:
515 pp_string (buffer
, "alloc");
517 case OMP_CLAUSE_MAP_TO
:
518 pp_string (buffer
, "to");
520 case OMP_CLAUSE_MAP_FROM
:
521 pp_string (buffer
, "from");
523 case OMP_CLAUSE_MAP_TOFROM
:
524 pp_string (buffer
, "tofrom");
526 case OMP_CLAUSE_MAP_FORCE_ALLOC
:
527 pp_string (buffer
, "force_alloc");
529 case OMP_CLAUSE_MAP_FORCE_TO
:
530 pp_string (buffer
, "force_to");
532 case OMP_CLAUSE_MAP_FORCE_FROM
:
533 pp_string (buffer
, "force_from");
535 case OMP_CLAUSE_MAP_FORCE_TOFROM
:
536 pp_string (buffer
, "force_tofrom");
538 case OMP_CLAUSE_MAP_FORCE_PRESENT
:
539 pp_string (buffer
, "force_present");
541 case OMP_CLAUSE_MAP_FORCE_DEALLOC
:
542 pp_string (buffer
, "force_dealloc");
544 case OMP_CLAUSE_MAP_FORCE_DEVICEPTR
:
545 pp_string (buffer
, "force_deviceptr");
551 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
554 if (OMP_CLAUSE_SIZE (clause
))
556 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
557 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_POINTER
)
558 pp_string (buffer
, " [pointer assign, bias: ");
560 pp_string (buffer
, " [len: ");
561 dump_generic_node (buffer
, OMP_CLAUSE_SIZE (clause
),
563 pp_right_bracket (buffer
);
565 pp_right_paren (buffer
);
568 case OMP_CLAUSE_FROM
:
569 pp_string (buffer
, "from(");
570 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
572 goto print_clause_size
;
575 pp_string (buffer
, "to(");
576 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
578 goto print_clause_size
;
580 case OMP_CLAUSE_NUM_TEAMS
:
581 pp_string (buffer
, "num_teams(");
582 dump_generic_node (buffer
, OMP_CLAUSE_NUM_TEAMS_EXPR (clause
),
584 pp_right_paren (buffer
);
587 case OMP_CLAUSE_THREAD_LIMIT
:
588 pp_string (buffer
, "thread_limit(");
589 dump_generic_node (buffer
, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause
),
591 pp_right_paren (buffer
);
594 case OMP_CLAUSE_DEVICE
:
595 pp_string (buffer
, "device(");
596 dump_generic_node (buffer
, OMP_CLAUSE_DEVICE_ID (clause
),
598 pp_right_paren (buffer
);
601 case OMP_CLAUSE_DIST_SCHEDULE
:
602 pp_string (buffer
, "dist_schedule(static");
603 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
))
606 dump_generic_node (buffer
,
607 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
),
610 pp_right_paren (buffer
);
613 case OMP_CLAUSE_PROC_BIND
:
614 pp_string (buffer
, "proc_bind(");
615 switch (OMP_CLAUSE_PROC_BIND_KIND (clause
))
617 case OMP_CLAUSE_PROC_BIND_MASTER
:
618 pp_string (buffer
, "master");
620 case OMP_CLAUSE_PROC_BIND_CLOSE
:
621 pp_string (buffer
, "close");
623 case OMP_CLAUSE_PROC_BIND_SPREAD
:
624 pp_string (buffer
, "spread");
629 pp_right_paren (buffer
);
632 case OMP_CLAUSE_SAFELEN
:
633 pp_string (buffer
, "safelen(");
634 dump_generic_node (buffer
, OMP_CLAUSE_SAFELEN_EXPR (clause
),
636 pp_right_paren (buffer
);
639 case OMP_CLAUSE_SIMDLEN
:
640 pp_string (buffer
, "simdlen(");
641 dump_generic_node (buffer
, OMP_CLAUSE_SIMDLEN_EXPR (clause
),
643 pp_right_paren (buffer
);
646 case OMP_CLAUSE__SIMDUID_
:
647 pp_string (buffer
, "_simduid_(");
648 dump_generic_node (buffer
, OMP_CLAUSE__SIMDUID__DECL (clause
),
650 pp_right_paren (buffer
);
653 case OMP_CLAUSE_GANG
:
654 pp_string (buffer
, "gang(");
655 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
), spc
, flags
, false);
656 pp_character(buffer
, ')');
659 case OMP_CLAUSE_ASYNC
:
660 pp_string (buffer
, "async");
661 if (OMP_CLAUSE_DECL (clause
))
663 pp_character(buffer
, '(');
664 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
666 pp_character(buffer
, ')');
670 case OMP_CLAUSE_WAIT
:
671 pp_string (buffer
, "wait(");
672 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
), spc
, flags
, false);
673 pp_character(buffer
, ')');
676 case OMP_CLAUSE_WORKER
:
677 pp_string (buffer
, "worker(");
678 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
), spc
, flags
, false);
679 pp_character(buffer
, ')');
682 case OMP_CLAUSE_VECTOR
:
683 pp_string (buffer
, "vector(");
684 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
), spc
, flags
, false);
685 pp_character(buffer
, ')');
688 case OMP_CLAUSE_NUM_GANGS
:
689 pp_string (buffer
, "num_gangs(");
690 dump_generic_node (buffer
, OMP_CLAUSE_NUM_GANGS_EXPR (clause
),
692 pp_character (buffer
, ')');
695 case OMP_CLAUSE_NUM_WORKERS
:
696 pp_string (buffer
, "num_workers(");
697 dump_generic_node (buffer
, OMP_CLAUSE_NUM_WORKERS_EXPR (clause
),
699 pp_character (buffer
, ')');
702 case OMP_CLAUSE_VECTOR_LENGTH
:
703 pp_string (buffer
, "vector_length(");
704 dump_generic_node (buffer
, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause
),
706 pp_character (buffer
, ')');
709 case OMP_CLAUSE_INBRANCH
:
710 pp_string (buffer
, "inbranch");
712 case OMP_CLAUSE_NOTINBRANCH
:
713 pp_string (buffer
, "notinbranch");
716 pp_string (buffer
, "for");
718 case OMP_CLAUSE_PARALLEL
:
719 pp_string (buffer
, "parallel");
721 case OMP_CLAUSE_SECTIONS
:
722 pp_string (buffer
, "sections");
724 case OMP_CLAUSE_TASKGROUP
:
725 pp_string (buffer
, "taskgroup");
727 case OMP_CLAUSE_INDEPENDENT
:
728 pp_string (buffer
, "independent");
732 /* Should never happen. */
733 dump_generic_node (buffer
, clause
, spc
, flags
, false);
739 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
740 dump_generic_node. */
743 dump_omp_clauses (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
751 dump_omp_clause (buffer
, clause
, spc
, flags
);
752 clause
= OMP_CLAUSE_CHAIN (clause
);
760 /* Dump location LOC to BUFFER. */
763 dump_location (pretty_printer
*buffer
, location_t loc
)
765 expanded_location xloc
= expand_location (loc
);
767 pp_left_bracket (buffer
);
770 pp_string (buffer
, xloc
.file
);
771 pp_string (buffer
, " : ");
773 pp_decimal_int (buffer
, xloc
.line
);
774 pp_string (buffer
, "] ");
778 /* Dump lexical block BLOCK. BUFFER, SPC and FLAGS are as in
779 dump_generic_node. */
782 dump_block_node (pretty_printer
*buffer
, tree block
, int spc
, int flags
)
786 pp_printf (buffer
, "BLOCK #%d ", BLOCK_NUMBER (block
));
788 if (flags
& TDF_ADDRESS
)
789 pp_printf (buffer
, "[%p] ", (void *) block
);
791 if (BLOCK_ABSTRACT (block
))
792 pp_string (buffer
, "[abstract] ");
794 if (TREE_ASM_WRITTEN (block
))
795 pp_string (buffer
, "[written] ");
797 if (flags
& TDF_SLIM
)
800 if (BLOCK_SOURCE_LOCATION (block
))
801 dump_location (buffer
, BLOCK_SOURCE_LOCATION (block
));
803 newline_and_indent (buffer
, spc
+ 2);
805 if (BLOCK_SUPERCONTEXT (block
))
807 pp_string (buffer
, "SUPERCONTEXT: ");
808 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (block
), 0,
809 flags
| TDF_SLIM
, false);
810 newline_and_indent (buffer
, spc
+ 2);
813 if (BLOCK_SUBBLOCKS (block
))
815 pp_string (buffer
, "SUBBLOCKS: ");
816 for (t
= BLOCK_SUBBLOCKS (block
); t
; t
= BLOCK_CHAIN (t
))
818 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
821 newline_and_indent (buffer
, spc
+ 2);
824 if (BLOCK_CHAIN (block
))
826 pp_string (buffer
, "SIBLINGS: ");
827 for (t
= BLOCK_CHAIN (block
); t
; t
= BLOCK_CHAIN (t
))
829 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
832 newline_and_indent (buffer
, spc
+ 2);
835 if (BLOCK_VARS (block
))
837 pp_string (buffer
, "VARS: ");
838 for (t
= BLOCK_VARS (block
); t
; t
= TREE_CHAIN (t
))
840 dump_generic_node (buffer
, t
, 0, flags
, false);
843 newline_and_indent (buffer
, spc
+ 2);
846 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block
)) > 0)
849 vec
<tree
, va_gc
> *nlv
= BLOCK_NONLOCALIZED_VARS (block
);
851 pp_string (buffer
, "NONLOCALIZED_VARS: ");
852 FOR_EACH_VEC_ELT (*nlv
, i
, t
)
854 dump_generic_node (buffer
, t
, 0, flags
, false);
857 newline_and_indent (buffer
, spc
+ 2);
860 if (BLOCK_ABSTRACT_ORIGIN (block
))
862 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
863 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (block
), 0,
864 flags
| TDF_SLIM
, false);
865 newline_and_indent (buffer
, spc
+ 2);
868 if (BLOCK_FRAGMENT_ORIGIN (block
))
870 pp_string (buffer
, "FRAGMENT_ORIGIN: ");
871 dump_generic_node (buffer
, BLOCK_FRAGMENT_ORIGIN (block
), 0,
872 flags
| TDF_SLIM
, false);
873 newline_and_indent (buffer
, spc
+ 2);
876 if (BLOCK_FRAGMENT_CHAIN (block
))
878 pp_string (buffer
, "FRAGMENT_CHAIN: ");
879 for (t
= BLOCK_FRAGMENT_CHAIN (block
); t
; t
= BLOCK_FRAGMENT_CHAIN (t
))
881 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
884 newline_and_indent (buffer
, spc
+ 2);
889 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
890 indent. FLAGS specifies details to show in the dump (see TDF_* in
891 dumpfile.h). If IS_STMT is true, the object printed is considered
892 to be a statement and it is terminated by ';' if appropriate. */
895 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
904 if (node
== NULL_TREE
)
907 is_expr
= EXPR_P (node
);
909 if (is_stmt
&& (flags
& TDF_STMTADDR
))
910 pp_printf (buffer
, "<&%p> ", (void *)node
);
912 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
913 dump_location (buffer
, EXPR_LOCATION (node
));
915 code
= TREE_CODE (node
);
919 pp_string (buffer
, "<<< error >>>");
922 case IDENTIFIER_NODE
:
923 pp_tree_identifier (buffer
, node
);
927 while (node
&& node
!= error_mark_node
)
929 if (TREE_PURPOSE (node
))
931 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
934 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
935 node
= TREE_CHAIN (node
);
936 if (node
&& TREE_CODE (node
) == TREE_LIST
)
945 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
951 if (TREE_VEC_LENGTH (node
) > 0)
953 size_t len
= TREE_VEC_LENGTH (node
);
954 for (i
= 0; i
< len
- 1; i
++)
956 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
961 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
970 case FIXED_POINT_TYPE
:
976 unsigned int quals
= TYPE_QUALS (node
);
977 enum tree_code_class tclass
;
979 if (quals
& TYPE_QUAL_ATOMIC
)
980 pp_string (buffer
, "atomic ");
981 if (quals
& TYPE_QUAL_CONST
)
982 pp_string (buffer
, "const ");
983 else if (quals
& TYPE_QUAL_VOLATILE
)
984 pp_string (buffer
, "volatile ");
985 else if (quals
& TYPE_QUAL_RESTRICT
)
986 pp_string (buffer
, "restrict ");
988 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
990 pp_string (buffer
, "<address-space-");
991 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
992 pp_string (buffer
, "> ");
995 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
997 if (tclass
== tcc_declaration
)
999 if (DECL_NAME (node
))
1000 dump_decl_name (buffer
, node
, flags
);
1002 pp_string (buffer
, "<unnamed type decl>");
1004 else if (tclass
== tcc_type
)
1006 if (TYPE_NAME (node
))
1008 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
1009 pp_tree_identifier (buffer
, TYPE_NAME (node
));
1010 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
1011 && DECL_NAME (TYPE_NAME (node
)))
1012 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1014 pp_string (buffer
, "<unnamed type>");
1016 else if (TREE_CODE (node
) == VECTOR_TYPE
)
1018 pp_string (buffer
, "vector");
1019 pp_left_paren (buffer
);
1020 pp_wide_integer (buffer
, TYPE_VECTOR_SUBPARTS (node
));
1021 pp_string (buffer
, ") ");
1022 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1024 else if (TREE_CODE (node
) == INTEGER_TYPE
)
1026 if (TYPE_PRECISION (node
) == CHAR_TYPE_SIZE
)
1027 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1030 else if (TYPE_PRECISION (node
) == SHORT_TYPE_SIZE
)
1031 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1034 else if (TYPE_PRECISION (node
) == INT_TYPE_SIZE
)
1035 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1038 else if (TYPE_PRECISION (node
) == LONG_TYPE_SIZE
)
1039 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1042 else if (TYPE_PRECISION (node
) == LONG_LONG_TYPE_SIZE
)
1043 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1044 ? "unsigned long long"
1045 : "signed long long"));
1046 else if (TYPE_PRECISION (node
) >= CHAR_TYPE_SIZE
1047 && exact_log2 (TYPE_PRECISION (node
)) != -1)
1049 pp_string (buffer
, (TYPE_UNSIGNED (node
) ? "uint" : "int"));
1050 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1051 pp_string (buffer
, "_t");
1055 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1056 ? "<unnamed-unsigned:"
1057 : "<unnamed-signed:"));
1058 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1059 pp_greater (buffer
);
1062 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
1064 pp_string (buffer
, "__complex__ ");
1065 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1067 else if (TREE_CODE (node
) == REAL_TYPE
)
1069 pp_string (buffer
, "<float:");
1070 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1071 pp_greater (buffer
);
1073 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
1075 pp_string (buffer
, "<fixed-point-");
1076 pp_string (buffer
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
1077 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1078 pp_greater (buffer
);
1080 else if (TREE_CODE (node
) == VOID_TYPE
)
1081 pp_string (buffer
, "void");
1083 pp_string (buffer
, "<unnamed type>");
1089 case REFERENCE_TYPE
:
1090 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
1092 if (TREE_TYPE (node
) == NULL
)
1094 pp_string (buffer
, str
);
1095 pp_string (buffer
, "<null type>");
1097 else if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
1099 tree fnode
= TREE_TYPE (node
);
1101 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
1103 pp_left_paren (buffer
);
1104 pp_string (buffer
, str
);
1105 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1106 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1107 else if (flags
& TDF_NOUID
)
1108 pp_printf (buffer
, "<Txxxx>");
1110 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1112 pp_right_paren (buffer
);
1113 dump_function_declaration (buffer
, fnode
, spc
, flags
);
1117 unsigned int quals
= TYPE_QUALS (node
);
1119 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1121 pp_string (buffer
, str
);
1123 if (quals
& TYPE_QUAL_CONST
)
1124 pp_string (buffer
, " const");
1125 if (quals
& TYPE_QUAL_VOLATILE
)
1126 pp_string (buffer
, " volatile");
1127 if (quals
& TYPE_QUAL_RESTRICT
)
1128 pp_string (buffer
, " restrict");
1130 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1132 pp_string (buffer
, " <address-space-");
1133 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
1134 pp_greater (buffer
);
1137 if (TYPE_REF_CAN_ALIAS_ALL (node
))
1138 pp_string (buffer
, " {ref-all}");
1148 if (integer_zerop (TREE_OPERAND (node
, 1))
1149 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1150 infer them and MEM_ATTR caching will share MEM_REFs
1151 with differently-typed op0s. */
1152 && TREE_CODE (TREE_OPERAND (node
, 0)) != INTEGER_CST
1153 /* Released SSA_NAMES have no TREE_TYPE. */
1154 && TREE_TYPE (TREE_OPERAND (node
, 0)) != NULL_TREE
1155 /* Same pointer types, but ignoring POINTER_TYPE vs.
1157 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1158 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1159 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1160 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1161 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 0)))
1162 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 1))))
1163 /* Same value types ignoring qualifiers. */
1164 && (TYPE_MAIN_VARIANT (TREE_TYPE (node
))
1165 == TYPE_MAIN_VARIANT
1166 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))))
1168 if (TREE_CODE (TREE_OPERAND (node
, 0)) != ADDR_EXPR
)
1171 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1175 dump_generic_node (buffer
,
1176 TREE_OPERAND (TREE_OPERAND (node
, 0), 0),
1183 pp_string (buffer
, "MEM[");
1184 pp_left_paren (buffer
);
1185 ptype
= TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node
, 1)));
1186 dump_generic_node (buffer
, ptype
,
1187 spc
, flags
| TDF_SLIM
, false);
1188 pp_right_paren (buffer
);
1189 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1191 if (!integer_zerop (TREE_OPERAND (node
, 1)))
1193 pp_string (buffer
, " + ");
1194 dump_generic_node (buffer
, TREE_OPERAND (node
, 1),
1197 pp_right_bracket (buffer
);
1202 case TARGET_MEM_REF
:
1204 const char *sep
= "";
1207 pp_string (buffer
, "MEM[");
1209 if (TREE_CODE (TMR_BASE (node
)) == ADDR_EXPR
)
1211 pp_string (buffer
, sep
);
1213 pp_string (buffer
, "symbol: ");
1214 dump_generic_node (buffer
, TREE_OPERAND (TMR_BASE (node
), 0),
1219 pp_string (buffer
, sep
);
1221 pp_string (buffer
, "base: ");
1222 dump_generic_node (buffer
, TMR_BASE (node
), spc
, flags
, false);
1224 tmp
= TMR_INDEX2 (node
);
1227 pp_string (buffer
, sep
);
1229 pp_string (buffer
, "base: ");
1230 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1232 tmp
= TMR_INDEX (node
);
1235 pp_string (buffer
, sep
);
1237 pp_string (buffer
, "index: ");
1238 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1240 tmp
= TMR_STEP (node
);
1243 pp_string (buffer
, sep
);
1245 pp_string (buffer
, "step: ");
1246 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1248 tmp
= TMR_OFFSET (node
);
1251 pp_string (buffer
, sep
);
1253 pp_string (buffer
, "offset: ");
1254 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1256 pp_right_bracket (buffer
);
1264 /* Print the innermost component type. */
1265 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
1266 tmp
= TREE_TYPE (tmp
))
1268 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1270 /* Print the dimensions. */
1271 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
1272 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
1278 case QUAL_UNION_TYPE
:
1280 unsigned int quals
= TYPE_QUALS (node
);
1282 if (quals
& TYPE_QUAL_ATOMIC
)
1283 pp_string (buffer
, "atomic ");
1284 if (quals
& TYPE_QUAL_CONST
)
1285 pp_string (buffer
, "const ");
1286 if (quals
& TYPE_QUAL_VOLATILE
)
1287 pp_string (buffer
, "volatile ");
1289 /* Print the name of the structure. */
1290 if (TREE_CODE (node
) == RECORD_TYPE
)
1291 pp_string (buffer
, "struct ");
1292 else if (TREE_CODE (node
) == UNION_TYPE
)
1293 pp_string (buffer
, "union ");
1295 if (TYPE_NAME (node
))
1296 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
1297 else if (!(flags
& TDF_SLIM
))
1298 /* FIXME: If we eliminate the 'else' above and attempt
1299 to show the fields for named types, we may get stuck
1300 following a cycle of pointers to structs. The alleged
1301 self-reference check in print_struct_decl will not detect
1302 cycles involving more than one pointer or struct type. */
1303 print_struct_decl (buffer
, node
, spc
, flags
);
1312 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
1314 /* In the case of a pointer, one may want to divide by the
1315 size of the pointed-to type. Unfortunately, this not
1316 straightforward. The C front-end maps expressions
1321 in such a way that the two INTEGER_CST nodes for "5" have
1322 different values but identical types. In the latter
1323 case, the 5 is multiplied by sizeof (int) in c-common.c
1324 (pointer_int_sum) to convert it to a byte address, and
1325 yet the type of the node is left unchanged. Argh. What
1326 is consistent though is that the number value corresponds
1327 to bytes (UNITS) offset.
1329 NB: Neither of the following divisors can be trivially
1330 used to recover the original literal:
1332 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1333 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1334 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
1335 pp_string (buffer
, "B"); /* pseudo-unit */
1337 else if (tree_fits_shwi_p (node
))
1338 pp_wide_integer (buffer
, tree_to_shwi (node
));
1339 else if (tree_fits_uhwi_p (node
))
1340 pp_unsigned_wide_integer (buffer
, tree_to_uhwi (node
));
1343 wide_int val
= node
;
1345 if (wi::neg_p (val
, TYPE_SIGN (TREE_TYPE (node
))))
1350 print_hex (val
, pp_buffer (buffer
)->digit_buffer
);
1351 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
1353 if (TREE_OVERFLOW (node
))
1354 pp_string (buffer
, "(OVF)");
1358 /* Code copied from print_node. */
1361 if (TREE_OVERFLOW (node
))
1362 pp_string (buffer
, " overflow");
1364 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
1365 d
= TREE_REAL_CST (node
);
1366 if (REAL_VALUE_ISINF (d
))
1367 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
1368 else if (REAL_VALUE_ISNAN (d
))
1369 pp_string (buffer
, " Nan");
1373 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
1374 pp_string (buffer
, string
);
1379 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
1380 pp_string (buffer
, "0x");
1381 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
1382 output_formatted_integer (buffer
, "%02x", *p
++);
1391 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
1392 pp_string (buffer
, string
);
1397 pp_string (buffer
, "__complex__ (");
1398 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
1399 pp_string (buffer
, ", ");
1400 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
1401 pp_right_paren (buffer
);
1405 pp_string (buffer
, "\"");
1406 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
1407 pp_string (buffer
, "\"");
1413 pp_string (buffer
, "{ ");
1414 for (i
= 0; i
< VECTOR_CST_NELTS (node
); ++i
)
1417 pp_string (buffer
, ", ");
1418 dump_generic_node (buffer
, VECTOR_CST_ELT (node
, i
),
1421 pp_string (buffer
, " }");
1427 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1429 if (TREE_CODE (node
) == METHOD_TYPE
)
1431 if (TYPE_METHOD_BASETYPE (node
))
1432 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
1435 pp_string (buffer
, "<null method basetype>");
1436 pp_colon_colon (buffer
);
1438 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1439 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1440 else if (flags
& TDF_NOUID
)
1441 pp_printf (buffer
, "<Txxxx>");
1443 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1444 dump_function_declaration (buffer
, node
, spc
, flags
);
1449 dump_decl_name (buffer
, node
, flags
);
1453 if (DECL_NAME (node
))
1454 dump_decl_name (buffer
, node
, flags
);
1455 else if (LABEL_DECL_UID (node
) != -1)
1456 pp_printf (buffer
, "<L%d>", (int) LABEL_DECL_UID (node
));
1459 if (flags
& TDF_NOUID
)
1460 pp_string (buffer
, "<D.xxxx>");
1462 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
1467 if (DECL_IS_BUILTIN (node
))
1469 /* Don't print the declaration of built-in types. */
1472 if (DECL_NAME (node
))
1473 dump_decl_name (buffer
, node
, flags
);
1474 else if (TYPE_NAME (TREE_TYPE (node
)) != node
)
1476 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1477 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1478 && TYPE_METHODS (TREE_TYPE (node
)))
1480 /* The type is a c++ class: all structures have at least
1482 pp_string (buffer
, "class ");
1483 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1488 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
1489 ? "union" : "struct "));
1490 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1494 pp_string (buffer
, "<anon>");
1500 case DEBUG_EXPR_DECL
:
1501 case NAMESPACE_DECL
:
1503 dump_decl_name (buffer
, node
, flags
);
1507 pp_string (buffer
, "<retval>");
1511 op0
= TREE_OPERAND (node
, 0);
1514 && (TREE_CODE (op0
) == INDIRECT_REF
1515 || (TREE_CODE (op0
) == MEM_REF
1516 && TREE_CODE (TREE_OPERAND (op0
, 0)) != ADDR_EXPR
1517 && integer_zerop (TREE_OPERAND (op0
, 1))
1518 /* Dump the types of INTEGER_CSTs explicitly, for we
1519 can't infer them and MEM_ATTR caching will share
1520 MEM_REFs with differently-typed op0s. */
1521 && TREE_CODE (TREE_OPERAND (op0
, 0)) != INTEGER_CST
1522 /* Released SSA_NAMES have no TREE_TYPE. */
1523 && TREE_TYPE (TREE_OPERAND (op0
, 0)) != NULL_TREE
1524 /* Same pointer types, but ignoring POINTER_TYPE vs.
1526 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1527 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1528 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1529 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1530 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1531 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1532 /* Same value types ignoring qualifiers. */
1533 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0
))
1534 == TYPE_MAIN_VARIANT
1535 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))))))
1537 op0
= TREE_OPERAND (op0
, 0);
1540 if (op_prio (op0
) < op_prio (node
))
1541 pp_left_paren (buffer
);
1542 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1543 if (op_prio (op0
) < op_prio (node
))
1544 pp_right_paren (buffer
);
1545 pp_string (buffer
, str
);
1546 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1547 op0
= component_ref_field_offset (node
);
1548 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
1550 pp_string (buffer
, "{off: ");
1551 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1552 pp_right_brace (buffer
);
1557 pp_string (buffer
, "BIT_FIELD_REF <");
1558 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1559 pp_string (buffer
, ", ");
1560 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1561 pp_string (buffer
, ", ");
1562 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1563 pp_greater (buffer
);
1567 case ARRAY_RANGE_REF
:
1568 op0
= TREE_OPERAND (node
, 0);
1569 if (op_prio (op0
) < op_prio (node
))
1570 pp_left_paren (buffer
);
1571 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1572 if (op_prio (op0
) < op_prio (node
))
1573 pp_right_paren (buffer
);
1574 pp_left_bracket (buffer
);
1575 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1576 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
1577 pp_string (buffer
, " ...");
1578 pp_right_bracket (buffer
);
1580 op0
= array_ref_low_bound (node
);
1581 op1
= array_ref_element_size (node
);
1583 if (!integer_zerop (op0
)
1584 || TREE_OPERAND (node
, 2)
1585 || TREE_OPERAND (node
, 3))
1587 pp_string (buffer
, "{lb: ");
1588 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1589 pp_string (buffer
, " sz: ");
1590 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1591 pp_right_brace (buffer
);
1597 unsigned HOST_WIDE_INT ix
;
1599 bool is_struct_init
= false;
1600 bool is_array_init
= false;
1602 pp_left_brace (buffer
);
1603 if (TREE_CLOBBER_P (node
))
1604 pp_string (buffer
, "CLOBBER");
1605 else if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1606 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1607 is_struct_init
= true;
1608 else if (TREE_CODE (TREE_TYPE (node
)) == ARRAY_TYPE
1609 && TYPE_DOMAIN (TREE_TYPE (node
))
1610 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)))
1611 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
))))
1614 tree minv
= TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)));
1615 is_array_init
= true;
1616 curidx
= wi::to_widest (minv
);
1618 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1625 dump_generic_node (buffer
, field
, spc
, flags
, false);
1628 else if (is_array_init
1629 && (TREE_CODE (field
) != INTEGER_CST
1630 || curidx
!= wi::to_widest (field
)))
1632 pp_left_bracket (buffer
);
1633 if (TREE_CODE (field
) == RANGE_EXPR
)
1635 dump_generic_node (buffer
, TREE_OPERAND (field
, 0), spc
,
1637 pp_string (buffer
, " ... ");
1638 dump_generic_node (buffer
, TREE_OPERAND (field
, 1), spc
,
1640 if (TREE_CODE (TREE_OPERAND (field
, 1)) == INTEGER_CST
)
1641 curidx
= wi::to_widest (TREE_OPERAND (field
, 1));
1644 dump_generic_node (buffer
, field
, spc
, flags
, false);
1645 if (TREE_CODE (field
) == INTEGER_CST
)
1646 curidx
= wi::to_widest (field
);
1647 pp_string (buffer
, "]=");
1652 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1653 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1654 val
= TREE_OPERAND (val
, 0);
1655 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1656 dump_decl_name (buffer
, val
, flags
);
1658 dump_generic_node (buffer
, val
, spc
, flags
, false);
1659 if (ix
!= vec_safe_length (CONSTRUCTOR_ELTS (node
)) - 1)
1665 pp_right_brace (buffer
);
1672 if (flags
& TDF_SLIM
)
1674 pp_string (buffer
, "<COMPOUND_EXPR>");
1678 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1679 spc
, flags
, !(flags
& TDF_SLIM
));
1680 if (flags
& TDF_SLIM
)
1681 newline_and_indent (buffer
, spc
);
1688 for (tp
= &TREE_OPERAND (node
, 1);
1689 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1690 tp
= &TREE_OPERAND (*tp
, 1))
1692 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1693 spc
, flags
, !(flags
& TDF_SLIM
));
1694 if (flags
& TDF_SLIM
)
1695 newline_and_indent (buffer
, spc
);
1703 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1707 case STATEMENT_LIST
:
1709 tree_stmt_iterator si
;
1712 if (flags
& TDF_SLIM
)
1714 pp_string (buffer
, "<STATEMENT_LIST>");
1718 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1721 newline_and_indent (buffer
, spc
);
1724 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1731 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
,
1736 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
,
1741 pp_string (buffer
, "TARGET_EXPR <");
1742 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1745 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1746 pp_greater (buffer
);
1750 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1755 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1757 pp_string (buffer
, "if (");
1758 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1759 pp_right_paren (buffer
);
1760 /* The lowered cond_exprs should always be printed in full. */
1761 if (COND_EXPR_THEN (node
)
1762 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1763 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1764 && COND_EXPR_ELSE (node
)
1765 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1766 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1769 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1771 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1773 pp_string (buffer
, " else ");
1774 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1778 else if (!(flags
& TDF_SLIM
))
1780 /* Output COND_EXPR_THEN. */
1781 if (COND_EXPR_THEN (node
))
1783 newline_and_indent (buffer
, spc
+2);
1784 pp_left_brace (buffer
);
1785 newline_and_indent (buffer
, spc
+4);
1786 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1788 newline_and_indent (buffer
, spc
+2);
1789 pp_right_brace (buffer
);
1792 /* Output COND_EXPR_ELSE. */
1793 if (COND_EXPR_ELSE (node
)
1794 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1796 newline_and_indent (buffer
, spc
);
1797 pp_string (buffer
, "else");
1798 newline_and_indent (buffer
, spc
+2);
1799 pp_left_brace (buffer
);
1800 newline_and_indent (buffer
, spc
+4);
1801 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1803 newline_and_indent (buffer
, spc
+2);
1804 pp_right_brace (buffer
);
1811 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1813 pp_question (buffer
);
1815 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1819 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1824 pp_left_brace (buffer
);
1825 if (!(flags
& TDF_SLIM
))
1827 if (BIND_EXPR_VARS (node
))
1829 pp_newline (buffer
);
1831 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= DECL_CHAIN (op0
))
1833 print_declaration (buffer
, op0
, spc
+2, flags
);
1834 pp_newline (buffer
);
1838 newline_and_indent (buffer
, spc
+2);
1839 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1840 newline_and_indent (buffer
, spc
);
1841 pp_right_brace (buffer
);
1847 print_call_name (buffer
, CALL_EXPR_FN (node
), flags
);
1849 /* Print parameters. */
1851 pp_left_paren (buffer
);
1854 call_expr_arg_iterator iter
;
1855 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1857 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1858 if (more_call_expr_args_p (&iter
))
1865 if (CALL_EXPR_VA_ARG_PACK (node
))
1867 if (call_expr_nargs (node
) > 0)
1872 pp_string (buffer
, "__builtin_va_arg_pack ()");
1874 pp_right_paren (buffer
);
1876 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1879 pp_string (buffer
, " [static-chain: ");
1880 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1881 pp_right_bracket (buffer
);
1884 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1885 pp_string (buffer
, " [return slot optimization]");
1886 if (CALL_EXPR_TAILCALL (node
))
1887 pp_string (buffer
, " [tail call]");
1890 case WITH_CLEANUP_EXPR
:
1894 case CLEANUP_POINT_EXPR
:
1895 pp_string (buffer
, "<<cleanup_point ");
1896 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1897 pp_string (buffer
, ">>");
1900 case PLACEHOLDER_EXPR
:
1901 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1902 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1903 pp_greater (buffer
);
1906 /* Binary arithmetic and logic expressions. */
1907 case WIDEN_SUM_EXPR
:
1908 case WIDEN_MULT_EXPR
:
1910 case MULT_HIGHPART_EXPR
:
1912 case POINTER_PLUS_EXPR
:
1914 case TRUNC_DIV_EXPR
:
1916 case FLOOR_DIV_EXPR
:
1917 case ROUND_DIV_EXPR
:
1918 case TRUNC_MOD_EXPR
:
1920 case FLOOR_MOD_EXPR
:
1921 case ROUND_MOD_EXPR
:
1923 case EXACT_DIV_EXPR
:
1928 case VEC_LSHIFT_EXPR
:
1929 case VEC_RSHIFT_EXPR
:
1930 case WIDEN_LSHIFT_EXPR
:
1934 case TRUTH_ANDIF_EXPR
:
1935 case TRUTH_ORIF_EXPR
:
1936 case TRUTH_AND_EXPR
:
1938 case TRUTH_XOR_EXPR
:
1952 case UNORDERED_EXPR
:
1954 const char *op
= op_symbol (node
);
1955 op0
= TREE_OPERAND (node
, 0);
1956 op1
= TREE_OPERAND (node
, 1);
1958 /* When the operands are expressions with less priority,
1959 keep semantics of the tree representation. */
1960 if (op_prio (op0
) <= op_prio (node
))
1962 pp_left_paren (buffer
);
1963 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1964 pp_right_paren (buffer
);
1967 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1970 pp_string (buffer
, op
);
1973 /* When the operands are expressions with less priority,
1974 keep semantics of the tree representation. */
1975 if (op_prio (op1
) <= op_prio (node
))
1977 pp_left_paren (buffer
);
1978 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1979 pp_right_paren (buffer
);
1982 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1986 /* Unary arithmetic and logic expressions. */
1989 case TRUTH_NOT_EXPR
:
1991 case PREDECREMENT_EXPR
:
1992 case PREINCREMENT_EXPR
:
1994 if (TREE_CODE (node
) == ADDR_EXPR
1995 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
1996 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
1997 ; /* Do not output '&' for strings and function pointers. */
1999 pp_string (buffer
, op_symbol (node
));
2001 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2003 pp_left_paren (buffer
);
2004 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2005 pp_right_paren (buffer
);
2008 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2011 case POSTDECREMENT_EXPR
:
2012 case POSTINCREMENT_EXPR
:
2013 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2015 pp_left_paren (buffer
);
2016 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2017 pp_right_paren (buffer
);
2020 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2021 pp_string (buffer
, op_symbol (node
));
2025 pp_string (buffer
, "MIN_EXPR <");
2026 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2027 pp_string (buffer
, ", ");
2028 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2029 pp_greater (buffer
);
2033 pp_string (buffer
, "MAX_EXPR <");
2034 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2035 pp_string (buffer
, ", ");
2036 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2037 pp_greater (buffer
);
2041 pp_string (buffer
, "ABS_EXPR <");
2042 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2043 pp_greater (buffer
);
2050 case ADDR_SPACE_CONVERT_EXPR
:
2051 case FIXED_CONVERT_EXPR
:
2052 case FIX_TRUNC_EXPR
:
2055 type
= TREE_TYPE (node
);
2056 op0
= TREE_OPERAND (node
, 0);
2057 if (type
!= TREE_TYPE (op0
))
2059 pp_left_paren (buffer
);
2060 dump_generic_node (buffer
, type
, spc
, flags
, false);
2061 pp_string (buffer
, ") ");
2063 if (op_prio (op0
) < op_prio (node
))
2064 pp_left_paren (buffer
);
2065 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2066 if (op_prio (op0
) < op_prio (node
))
2067 pp_right_paren (buffer
);
2070 case VIEW_CONVERT_EXPR
:
2071 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
2072 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
2073 pp_string (buffer
, ">(");
2074 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2075 pp_right_paren (buffer
);
2079 pp_string (buffer
, "((");
2080 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2081 pp_string (buffer
, "))");
2084 case NON_LVALUE_EXPR
:
2085 pp_string (buffer
, "NON_LVALUE_EXPR <");
2086 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2087 pp_greater (buffer
);
2091 pp_string (buffer
, "SAVE_EXPR <");
2092 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2093 pp_greater (buffer
);
2097 pp_string (buffer
, "COMPLEX_EXPR <");
2098 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2099 pp_string (buffer
, ", ");
2100 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2101 pp_greater (buffer
);
2105 pp_string (buffer
, "CONJ_EXPR <");
2106 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2107 pp_greater (buffer
);
2111 pp_string (buffer
, "REALPART_EXPR <");
2112 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2113 pp_greater (buffer
);
2117 pp_string (buffer
, "IMAGPART_EXPR <");
2118 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2119 pp_greater (buffer
);
2123 pp_string (buffer
, "VA_ARG_EXPR <");
2124 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2125 pp_greater (buffer
);
2128 case TRY_FINALLY_EXPR
:
2129 case TRY_CATCH_EXPR
:
2130 pp_string (buffer
, "try");
2131 newline_and_indent (buffer
, spc
+2);
2132 pp_left_brace (buffer
);
2133 newline_and_indent (buffer
, spc
+4);
2134 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
2135 newline_and_indent (buffer
, spc
+2);
2136 pp_right_brace (buffer
);
2137 newline_and_indent (buffer
, spc
);
2139 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
2140 newline_and_indent (buffer
, spc
+2);
2141 pp_left_brace (buffer
);
2142 newline_and_indent (buffer
, spc
+4);
2143 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
2144 newline_and_indent (buffer
, spc
+2);
2145 pp_right_brace (buffer
);
2150 pp_string (buffer
, "catch (");
2151 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
2152 pp_right_paren (buffer
);
2153 newline_and_indent (buffer
, spc
+2);
2154 pp_left_brace (buffer
);
2155 newline_and_indent (buffer
, spc
+4);
2156 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
2157 newline_and_indent (buffer
, spc
+2);
2158 pp_right_brace (buffer
);
2162 case EH_FILTER_EXPR
:
2163 pp_string (buffer
, "<<<eh_filter (");
2164 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
2165 pp_string (buffer
, ")>>>");
2166 newline_and_indent (buffer
, spc
+2);
2167 pp_left_brace (buffer
);
2168 newline_and_indent (buffer
, spc
+4);
2169 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
2170 newline_and_indent (buffer
, spc
+2);
2171 pp_right_brace (buffer
);
2176 op0
= TREE_OPERAND (node
, 0);
2177 /* If this is for break or continue, don't bother printing it. */
2178 if (DECL_NAME (op0
))
2180 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2181 if (strcmp (name
, "break") == 0
2182 || strcmp (name
, "continue") == 0)
2185 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2187 if (DECL_NONLOCAL (op0
))
2188 pp_string (buffer
, " [non-local]");
2192 pp_string (buffer
, "while (1)");
2193 if (!(flags
& TDF_SLIM
))
2195 newline_and_indent (buffer
, spc
+2);
2196 pp_left_brace (buffer
);
2197 newline_and_indent (buffer
, spc
+4);
2198 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
2199 newline_and_indent (buffer
, spc
+2);
2200 pp_right_brace (buffer
);
2206 pp_string (buffer
, "// predicted ");
2207 if (PREDICT_EXPR_OUTCOME (node
))
2208 pp_string (buffer
, "likely by ");
2210 pp_string (buffer
, "unlikely by ");
2211 pp_string (buffer
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
2212 pp_string (buffer
, " predictor.");
2216 pp_string (buffer
, "ANNOTATE_EXPR <");
2217 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2218 switch ((enum annot_expr_kind
) TREE_INT_CST_LOW (TREE_OPERAND (node
, 1)))
2220 case annot_expr_ivdep_kind
:
2221 pp_string (buffer
, ", ivdep");
2223 case annot_expr_no_vector_kind
:
2224 pp_string (buffer
, ", no-vector");
2226 case annot_expr_vector_kind
:
2227 pp_string (buffer
, ", vector");
2232 pp_greater (buffer
);
2236 pp_string (buffer
, "return");
2237 op0
= TREE_OPERAND (node
, 0);
2241 if (TREE_CODE (op0
) == MODIFY_EXPR
)
2242 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1),
2245 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2250 pp_string (buffer
, "if (");
2251 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2252 pp_string (buffer
, ") break");
2256 pp_string (buffer
, "switch (");
2257 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
2258 pp_right_paren (buffer
);
2259 if (!(flags
& TDF_SLIM
))
2261 newline_and_indent (buffer
, spc
+2);
2262 pp_left_brace (buffer
);
2263 if (SWITCH_BODY (node
))
2265 newline_and_indent (buffer
, spc
+4);
2266 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
2271 tree vec
= SWITCH_LABELS (node
);
2272 size_t i
, n
= TREE_VEC_LENGTH (vec
);
2273 for (i
= 0; i
< n
; ++i
)
2275 tree elt
= TREE_VEC_ELT (vec
, i
);
2276 newline_and_indent (buffer
, spc
+4);
2279 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
2280 pp_string (buffer
, " goto ");
2281 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
2283 pp_semicolon (buffer
);
2286 pp_string (buffer
, "case ???: goto ???;");
2289 newline_and_indent (buffer
, spc
+2);
2290 pp_right_brace (buffer
);
2296 op0
= GOTO_DESTINATION (node
);
2297 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
2299 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2300 if (strcmp (name
, "break") == 0
2301 || strcmp (name
, "continue") == 0)
2303 pp_string (buffer
, name
);
2307 pp_string (buffer
, "goto ");
2308 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2312 pp_string (buffer
, "__asm__");
2313 if (ASM_VOLATILE_P (node
))
2314 pp_string (buffer
, " __volatile__");
2315 pp_left_paren (buffer
);
2316 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
2318 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
2320 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
2321 if (ASM_CLOBBERS (node
))
2324 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
2326 pp_right_paren (buffer
);
2329 case CASE_LABEL_EXPR
:
2330 if (CASE_LOW (node
) && CASE_HIGH (node
))
2332 pp_string (buffer
, "case ");
2333 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2334 pp_string (buffer
, " ... ");
2335 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
2337 else if (CASE_LOW (node
))
2339 pp_string (buffer
, "case ");
2340 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2343 pp_string (buffer
, "default");
2348 pp_string (buffer
, "OBJ_TYPE_REF(");
2349 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
2350 pp_semicolon (buffer
);
2351 if (!(flags
& TDF_SLIM
) && virtual_method_call_p (node
))
2353 pp_string (buffer
, "(");
2354 dump_generic_node (buffer
, obj_type_ref_class (node
), spc
, flags
, false);
2355 pp_string (buffer
, ")");
2357 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
2359 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
2360 pp_right_paren (buffer
);
2364 if (SSA_NAME_IDENTIFIER (node
))
2365 dump_generic_node (buffer
, SSA_NAME_IDENTIFIER (node
),
2367 pp_underscore (buffer
);
2368 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
2369 if (SSA_NAME_IS_DEFAULT_DEF (node
))
2370 pp_string (buffer
, "(D)");
2371 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
2372 pp_string (buffer
, "(ab)");
2375 case WITH_SIZE_EXPR
:
2376 pp_string (buffer
, "WITH_SIZE_EXPR <");
2377 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2378 pp_string (buffer
, ", ");
2379 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2380 pp_greater (buffer
);
2384 pp_string (buffer
, "ASSERT_EXPR <");
2385 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
2386 pp_string (buffer
, ", ");
2387 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
2388 pp_greater (buffer
);
2392 pp_string (buffer
, "scev_known");
2395 case SCEV_NOT_KNOWN
:
2396 pp_string (buffer
, "scev_not_known");
2399 case POLYNOMIAL_CHREC
:
2400 pp_left_brace (buffer
);
2401 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
2402 pp_string (buffer
, ", +, ");
2403 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
2404 pp_string (buffer
, "}_");
2405 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
2409 case REALIGN_LOAD_EXPR
:
2410 pp_string (buffer
, "REALIGN_LOAD <");
2411 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2412 pp_string (buffer
, ", ");
2413 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2414 pp_string (buffer
, ", ");
2415 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2416 pp_greater (buffer
);
2420 pp_string (buffer
, " VEC_COND_EXPR < ");
2421 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2422 pp_string (buffer
, " , ");
2423 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2424 pp_string (buffer
, " , ");
2425 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2426 pp_string (buffer
, " > ");
2430 pp_string (buffer
, " VEC_PERM_EXPR < ");
2431 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2432 pp_string (buffer
, " , ");
2433 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2434 pp_string (buffer
, " , ");
2435 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2436 pp_string (buffer
, " > ");
2440 pp_string (buffer
, " DOT_PROD_EXPR < ");
2441 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2442 pp_string (buffer
, ", ");
2443 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2444 pp_string (buffer
, ", ");
2445 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2446 pp_string (buffer
, " > ");
2449 case WIDEN_MULT_PLUS_EXPR
:
2450 pp_string (buffer
, " WIDEN_MULT_PLUS_EXPR < ");
2451 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2452 pp_string (buffer
, ", ");
2453 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2454 pp_string (buffer
, ", ");
2455 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2456 pp_string (buffer
, " > ");
2459 case WIDEN_MULT_MINUS_EXPR
:
2460 pp_string (buffer
, " WIDEN_MULT_MINUS_EXPR < ");
2461 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2462 pp_string (buffer
, ", ");
2463 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2464 pp_string (buffer
, ", ");
2465 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2466 pp_string (buffer
, " > ");
2470 pp_string (buffer
, " FMA_EXPR < ");
2471 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2472 pp_string (buffer
, ", ");
2473 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2474 pp_string (buffer
, ", ");
2475 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2476 pp_string (buffer
, " > ");
2480 pp_string (buffer
, "#pragma acc parallel");
2481 dump_omp_clauses (buffer
, OACC_PARALLEL_CLAUSES (node
), spc
, flags
);
2485 pp_string (buffer
, "#pragma acc kernels");
2486 dump_omp_clauses (buffer
, OACC_KERNELS_CLAUSES (node
), spc
, flags
);
2490 pp_string (buffer
, "#pragma acc data");
2491 dump_omp_clauses (buffer
, OACC_DATA_CLAUSES (node
), spc
, flags
);
2494 case OACC_HOST_DATA
:
2495 pp_string (buffer
, "#pragma acc host_data");
2496 dump_omp_clauses (buffer
, OACC_HOST_DATA_CLAUSES (node
), spc
, flags
);
2500 pp_string (buffer
, "#pragma acc declare");
2501 dump_omp_clauses (buffer
, OACC_DECLARE_CLAUSES (node
), spc
, flags
);
2505 pp_string (buffer
, "#pragma acc update");
2506 dump_omp_clauses (buffer
, OACC_UPDATE_CLAUSES (node
), spc
, flags
);
2509 case OACC_ENTER_DATA
:
2510 pp_string (buffer
, "#pragma acc enter data");
2511 dump_omp_clauses (buffer
, OACC_ENTER_DATA_CLAUSES (node
), spc
, flags
);
2514 case OACC_EXIT_DATA
:
2515 pp_string (buffer
, "#pragma acc exit data");
2516 dump_omp_clauses (buffer
, OACC_EXIT_DATA_CLAUSES (node
), spc
, flags
);
2520 pp_string (buffer
, "#pragma acc wait");
2521 dump_omp_clauses (buffer
, OACC_WAIT_CLAUSES (node
), spc
, flags
);
2525 pp_string (buffer
, "#pragma acc cache");
2526 dump_omp_clauses (buffer
, OACC_CACHE_CLAUSES(node
), spc
, flags
);
2530 pp_string (buffer
, "#pragma omp parallel");
2531 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
2534 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
2536 newline_and_indent (buffer
, spc
+ 2);
2537 pp_left_brace (buffer
);
2538 newline_and_indent (buffer
, spc
+ 4);
2539 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
2540 newline_and_indent (buffer
, spc
+ 2);
2541 pp_right_brace (buffer
);
2547 pp_string (buffer
, "#pragma omp task");
2548 dump_omp_clauses (buffer
, OMP_TASK_CLAUSES (node
), spc
, flags
);
2552 pp_string (buffer
, "#pragma omp for");
2556 pp_string (buffer
, "#pragma omp simd");
2560 pp_string (buffer
, "#pragma simd");
2563 case OMP_DISTRIBUTE
:
2564 pp_string (buffer
, "#pragma omp distribute");
2568 pp_string (buffer
, "#pragma acc loop");
2572 pp_string (buffer
, "#pragma omp teams");
2573 dump_omp_clauses (buffer
, OMP_TEAMS_CLAUSES (node
), spc
, flags
);
2576 case OMP_TARGET_DATA
:
2577 pp_string (buffer
, "#pragma omp target data");
2578 dump_omp_clauses (buffer
, OMP_TARGET_DATA_CLAUSES (node
), spc
, flags
);
2582 pp_string (buffer
, "#pragma omp target");
2583 dump_omp_clauses (buffer
, OMP_TARGET_CLAUSES (node
), spc
, flags
);
2586 case OMP_TARGET_UPDATE
:
2587 pp_string (buffer
, "#pragma omp target update");
2588 dump_omp_clauses (buffer
, OMP_TARGET_UPDATE_CLAUSES (node
), spc
, flags
);
2593 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2595 if (!(flags
& TDF_SLIM
))
2599 if (OMP_FOR_PRE_BODY (node
))
2601 newline_and_indent (buffer
, spc
+ 2);
2602 pp_left_brace (buffer
);
2604 newline_and_indent (buffer
, spc
);
2605 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
2608 if (OMP_FOR_INIT (node
))
2611 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
2614 newline_and_indent (buffer
, spc
);
2615 pp_string (buffer
, "for (");
2616 dump_generic_node (buffer
,
2617 TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
2619 pp_string (buffer
, "; ");
2620 dump_generic_node (buffer
,
2621 TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
2623 pp_string (buffer
, "; ");
2624 dump_generic_node (buffer
,
2625 TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
2627 pp_right_paren (buffer
);
2630 if (OMP_FOR_BODY (node
))
2632 newline_and_indent (buffer
, spc
+ 2);
2633 pp_left_brace (buffer
);
2634 newline_and_indent (buffer
, spc
+ 4);
2635 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
2637 newline_and_indent (buffer
, spc
+ 2);
2638 pp_right_brace (buffer
);
2640 if (OMP_FOR_INIT (node
))
2641 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
2642 if (OMP_FOR_PRE_BODY (node
))
2645 newline_and_indent (buffer
, spc
+ 2);
2646 pp_right_brace (buffer
);
2653 pp_string (buffer
, "#pragma omp sections");
2654 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
2658 pp_string (buffer
, "#pragma omp section");
2662 pp_string (buffer
, "#pragma omp master");
2666 pp_string (buffer
, "#pragma omp taskgroup");
2670 pp_string (buffer
, "#pragma omp ordered");
2674 pp_string (buffer
, "#pragma omp critical");
2675 if (OMP_CRITICAL_NAME (node
))
2678 pp_left_paren (buffer
);
2679 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
2681 pp_right_paren (buffer
);
2686 pp_string (buffer
, "#pragma omp atomic");
2687 if (OMP_ATOMIC_SEQ_CST (node
))
2688 pp_string (buffer
, " seq_cst");
2689 newline_and_indent (buffer
, spc
+ 2);
2690 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2694 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2697 case OMP_ATOMIC_READ
:
2698 pp_string (buffer
, "#pragma omp atomic read");
2699 if (OMP_ATOMIC_SEQ_CST (node
))
2700 pp_string (buffer
, " seq_cst");
2701 newline_and_indent (buffer
, spc
+ 2);
2702 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2706 case OMP_ATOMIC_CAPTURE_OLD
:
2707 case OMP_ATOMIC_CAPTURE_NEW
:
2708 pp_string (buffer
, "#pragma omp atomic capture");
2709 if (OMP_ATOMIC_SEQ_CST (node
))
2710 pp_string (buffer
, " seq_cst");
2711 newline_and_indent (buffer
, spc
+ 2);
2712 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2716 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2720 pp_string (buffer
, "#pragma omp single");
2721 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
2725 dump_omp_clause (buffer
, node
, spc
, flags
);
2729 case TRANSACTION_EXPR
:
2730 if (TRANSACTION_EXPR_OUTER (node
))
2731 pp_string (buffer
, "__transaction_atomic [[outer]]");
2732 else if (TRANSACTION_EXPR_RELAXED (node
))
2733 pp_string (buffer
, "__transaction_relaxed");
2735 pp_string (buffer
, "__transaction_atomic");
2736 if (!(flags
& TDF_SLIM
) && TRANSACTION_EXPR_BODY (node
))
2738 newline_and_indent (buffer
, spc
);
2739 pp_left_brace (buffer
);
2740 newline_and_indent (buffer
, spc
+ 2);
2741 dump_generic_node (buffer
, TRANSACTION_EXPR_BODY (node
),
2742 spc
+ 2, flags
, false);
2743 newline_and_indent (buffer
, spc
);
2744 pp_right_brace (buffer
);
2749 case REDUC_MAX_EXPR
:
2750 pp_string (buffer
, " REDUC_MAX_EXPR < ");
2751 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2752 pp_string (buffer
, " > ");
2755 case REDUC_MIN_EXPR
:
2756 pp_string (buffer
, " REDUC_MIN_EXPR < ");
2757 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2758 pp_string (buffer
, " > ");
2761 case REDUC_PLUS_EXPR
:
2762 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
2763 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2764 pp_string (buffer
, " > ");
2767 case VEC_WIDEN_MULT_HI_EXPR
:
2768 case VEC_WIDEN_MULT_LO_EXPR
:
2769 case VEC_WIDEN_MULT_EVEN_EXPR
:
2770 case VEC_WIDEN_MULT_ODD_EXPR
:
2771 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2772 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2774 for (str
= get_tree_code_name (code
); *str
; str
++)
2775 pp_character (buffer
, TOUPPER (*str
));
2776 pp_string (buffer
, " < ");
2777 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2778 pp_string (buffer
, ", ");
2779 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2780 pp_string (buffer
, " > ");
2783 case VEC_UNPACK_HI_EXPR
:
2784 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
2785 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2786 pp_string (buffer
, " > ");
2789 case VEC_UNPACK_LO_EXPR
:
2790 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
2791 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2792 pp_string (buffer
, " > ");
2795 case VEC_UNPACK_FLOAT_HI_EXPR
:
2796 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2797 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2798 pp_string (buffer
, " > ");
2801 case VEC_UNPACK_FLOAT_LO_EXPR
:
2802 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2803 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2804 pp_string (buffer
, " > ");
2807 case VEC_PACK_TRUNC_EXPR
:
2808 pp_string (buffer
, " VEC_PACK_TRUNC_EXPR < ");
2809 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2810 pp_string (buffer
, ", ");
2811 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2812 pp_string (buffer
, " > ");
2815 case VEC_PACK_SAT_EXPR
:
2816 pp_string (buffer
, " VEC_PACK_SAT_EXPR < ");
2817 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2818 pp_string (buffer
, ", ");
2819 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2820 pp_string (buffer
, " > ");
2823 case VEC_PACK_FIX_TRUNC_EXPR
:
2824 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2825 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2826 pp_string (buffer
, ", ");
2827 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2828 pp_string (buffer
, " > ");
2832 dump_block_node (buffer
, node
, spc
, flags
);
2835 case CILK_SPAWN_STMT
:
2836 pp_string (buffer
, "_Cilk_spawn ");
2837 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2840 case CILK_SYNC_STMT
:
2841 pp_string (buffer
, "_Cilk_sync");
2848 if (is_stmt
&& is_expr
)
2849 pp_semicolon (buffer
);
2854 /* Print the declaration of a variable. */
2857 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2861 if (TREE_CODE(t
) == NAMELIST_DECL
)
2863 pp_string(buffer
, "namelist ");
2864 dump_decl_name (buffer
, t
, flags
);
2865 pp_semicolon (buffer
);
2869 if (TREE_CODE (t
) == TYPE_DECL
)
2870 pp_string (buffer
, "typedef ");
2872 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2873 pp_string (buffer
, "register ");
2875 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2876 pp_string (buffer
, "extern ");
2877 else if (TREE_STATIC (t
))
2878 pp_string (buffer
, "static ");
2880 /* Print the type and name. */
2881 if (TREE_TYPE (t
) && TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2885 /* Print array's type. */
2886 tmp
= TREE_TYPE (t
);
2887 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2888 tmp
= TREE_TYPE (tmp
);
2889 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2891 /* Print variable's name. */
2893 dump_generic_node (buffer
, t
, spc
, flags
, false);
2895 /* Print the dimensions. */
2896 tmp
= TREE_TYPE (t
);
2897 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2899 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2900 tmp
= TREE_TYPE (tmp
);
2903 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2905 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2907 dump_decl_name (buffer
, t
, flags
);
2908 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2912 /* Print type declaration. */
2913 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2915 /* Print variable's name. */
2917 dump_generic_node (buffer
, t
, spc
, flags
, false);
2920 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2922 pp_string (buffer
, " __asm__ ");
2923 pp_left_paren (buffer
);
2924 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2925 pp_right_paren (buffer
);
2928 /* The initial value of a function serves to determine whether the function
2929 is declared or defined. So the following does not apply to function
2931 if (TREE_CODE (t
) != FUNCTION_DECL
)
2933 /* Print the initial value. */
2934 if (DECL_INITIAL (t
))
2939 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2943 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2945 pp_string (buffer
, " [value-expr: ");
2946 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2947 pp_right_bracket (buffer
);
2950 pp_semicolon (buffer
);
2954 /* Prints a structure: name, fields, and methods.
2955 FIXME: Still incomplete. */
2958 print_struct_decl (pretty_printer
*buffer
, const_tree node
, int spc
, int flags
)
2960 /* Print the name of the structure. */
2961 if (TYPE_NAME (node
))
2964 if (TREE_CODE (node
) == RECORD_TYPE
)
2965 pp_string (buffer
, "struct ");
2966 else if ((TREE_CODE (node
) == UNION_TYPE
2967 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
2968 pp_string (buffer
, "union ");
2970 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
2973 /* Print the contents of the structure. */
2974 pp_newline (buffer
);
2976 pp_left_brace (buffer
);
2977 pp_newline (buffer
);
2979 /* Print the fields of the structure. */
2982 tmp
= TYPE_FIELDS (node
);
2985 /* Avoid to print recursively the structure. */
2986 /* FIXME : Not implemented correctly...,
2987 what about the case when we have a cycle in the contain graph? ...
2988 Maybe this could be solved by looking at the scope in which the
2989 structure was declared. */
2990 if (TREE_TYPE (tmp
) != node
2991 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
2992 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
2994 print_declaration (buffer
, tmp
, spc
+2, flags
);
2995 pp_newline (buffer
);
2997 tmp
= DECL_CHAIN (tmp
);
3001 pp_right_brace (buffer
);
3004 /* Return the priority of the operator CODE.
3006 From lowest to highest precedence with either left-to-right (L-R)
3007 or right-to-left (R-L) associativity]:
3010 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
3022 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
3023 15 [L-R] fn() [] -> .
3025 unary +, - and * have higher precedence than the corresponding binary
3029 op_code_prio (enum tree_code code
)
3046 case TRUTH_ORIF_EXPR
:
3049 case TRUTH_AND_EXPR
:
3050 case TRUTH_ANDIF_EXPR
:
3057 case TRUTH_XOR_EXPR
:
3074 case UNORDERED_EXPR
:
3085 case VEC_WIDEN_LSHIFT_HI_EXPR
:
3086 case VEC_WIDEN_LSHIFT_LO_EXPR
:
3087 case WIDEN_LSHIFT_EXPR
:
3090 case WIDEN_SUM_EXPR
:
3092 case POINTER_PLUS_EXPR
:
3096 case VEC_WIDEN_MULT_HI_EXPR
:
3097 case VEC_WIDEN_MULT_LO_EXPR
:
3098 case WIDEN_MULT_EXPR
:
3100 case WIDEN_MULT_PLUS_EXPR
:
3101 case WIDEN_MULT_MINUS_EXPR
:
3103 case MULT_HIGHPART_EXPR
:
3104 case TRUNC_DIV_EXPR
:
3106 case FLOOR_DIV_EXPR
:
3107 case ROUND_DIV_EXPR
:
3109 case EXACT_DIV_EXPR
:
3110 case TRUNC_MOD_EXPR
:
3112 case FLOOR_MOD_EXPR
:
3113 case ROUND_MOD_EXPR
:
3117 case TRUTH_NOT_EXPR
:
3119 case POSTINCREMENT_EXPR
:
3120 case POSTDECREMENT_EXPR
:
3121 case PREINCREMENT_EXPR
:
3122 case PREDECREMENT_EXPR
:
3128 case FIX_TRUNC_EXPR
:
3134 case ARRAY_RANGE_REF
:
3138 /* Special expressions. */
3144 case REDUC_MAX_EXPR
:
3145 case REDUC_MIN_EXPR
:
3146 case REDUC_PLUS_EXPR
:
3147 case VEC_LSHIFT_EXPR
:
3148 case VEC_RSHIFT_EXPR
:
3149 case VEC_UNPACK_HI_EXPR
:
3150 case VEC_UNPACK_LO_EXPR
:
3151 case VEC_UNPACK_FLOAT_HI_EXPR
:
3152 case VEC_UNPACK_FLOAT_LO_EXPR
:
3153 case VEC_PACK_TRUNC_EXPR
:
3154 case VEC_PACK_SAT_EXPR
:
3158 /* Return an arbitrarily high precedence to avoid surrounding single
3159 VAR_DECLs in ()s. */
3164 /* Return the priority of the operator OP. */
3167 op_prio (const_tree op
)
3169 enum tree_code code
;
3174 code
= TREE_CODE (op
);
3175 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
3176 return op_prio (TREE_OPERAND (op
, 0));
3178 return op_code_prio (code
);
3181 /* Return the symbol associated with operator CODE. */
3184 op_symbol_code (enum tree_code code
)
3192 case TRUTH_ORIF_EXPR
:
3195 case TRUTH_AND_EXPR
:
3196 case TRUTH_ANDIF_EXPR
:
3202 case TRUTH_XOR_EXPR
:
3212 case UNORDERED_EXPR
:
3258 case VEC_LSHIFT_EXPR
:
3261 case VEC_RSHIFT_EXPR
:
3264 case WIDEN_LSHIFT_EXPR
:
3267 case POINTER_PLUS_EXPR
:
3273 case REDUC_PLUS_EXPR
:
3276 case WIDEN_SUM_EXPR
:
3279 case WIDEN_MULT_EXPR
:
3282 case MULT_HIGHPART_EXPR
:
3292 case TRUTH_NOT_EXPR
:
3299 case TRUNC_DIV_EXPR
:
3306 case FLOOR_DIV_EXPR
:
3309 case ROUND_DIV_EXPR
:
3312 case EXACT_DIV_EXPR
:
3315 case TRUNC_MOD_EXPR
:
3321 case FLOOR_MOD_EXPR
:
3324 case ROUND_MOD_EXPR
:
3327 case PREDECREMENT_EXPR
:
3330 case PREINCREMENT_EXPR
:
3333 case POSTDECREMENT_EXPR
:
3336 case POSTINCREMENT_EXPR
:
3346 return "<<< ??? >>>";
3350 /* Return the symbol associated with operator OP. */
3353 op_symbol (const_tree op
)
3355 return op_symbol_code (TREE_CODE (op
));
3358 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
3359 the gimple_call_fn of a GIMPLE_CALL. */
3362 print_call_name (pretty_printer
*buffer
, tree node
, int flags
)
3366 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
3367 op0
= TREE_OPERAND (op0
, 0);
3370 switch (TREE_CODE (op0
))
3375 dump_function_name (buffer
, op0
, flags
);
3381 op0
= TREE_OPERAND (op0
, 0);
3385 pp_left_paren (buffer
);
3386 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, flags
, false);
3387 pp_string (buffer
, ") ? ");
3388 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, flags
, false);
3389 pp_string (buffer
, " : ");
3390 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, flags
, false);
3394 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
3395 dump_function_name (buffer
, TREE_OPERAND (op0
, 0), flags
);
3397 dump_generic_node (buffer
, op0
, 0, flags
, false);
3401 if (integer_zerop (TREE_OPERAND (op0
, 1)))
3403 op0
= TREE_OPERAND (op0
, 0);
3410 dump_generic_node (buffer
, op0
, 0, flags
, false);
3418 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
3421 pretty_print_string (pretty_printer
*buffer
, const char *str
)
3431 pp_string (buffer
, "\\b");
3435 pp_string (buffer
, "\\f");
3439 pp_string (buffer
, "\\n");
3443 pp_string (buffer
, "\\r");
3447 pp_string (buffer
, "\\t");
3451 pp_string (buffer
, "\\v");
3455 pp_string (buffer
, "\\\\");
3459 pp_string (buffer
, "\\\"");
3463 pp_string (buffer
, "\\'");
3466 /* No need to handle \0; the loop terminates on \0. */
3469 pp_string (buffer
, "\\1");
3473 pp_string (buffer
, "\\2");
3477 pp_string (buffer
, "\\3");
3481 pp_string (buffer
, "\\4");
3485 pp_string (buffer
, "\\5");
3489 pp_string (buffer
, "\\6");
3493 pp_string (buffer
, "\\7");
3497 pp_character (buffer
, str
[0]);
3505 maybe_init_pretty_print (FILE *file
)
3509 new (&buffer
) pretty_printer ();
3510 pp_needs_newline (&buffer
) = true;
3511 pp_translate_identifiers (&buffer
) = false;
3515 buffer
.buffer
->stream
= file
;
3519 newline_and_indent (pretty_printer
*buffer
, int spc
)
3521 pp_newline (buffer
);
3525 /* Handle a %K format for TEXT. Separate from default_tree_printer so
3526 it can also be used in front ends.
3527 %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
3531 percent_K_format (text_info
*text
)
3533 tree t
= va_arg (*text
->args_ptr
, tree
), block
;
3534 gcc_assert (text
->locus
!= NULL
);
3535 *text
->locus
= EXPR_LOCATION (t
);
3536 gcc_assert (pp_ti_abstract_origin (text
) != NULL
);
3537 block
= TREE_BLOCK (t
);
3538 *pp_ti_abstract_origin (text
) = NULL
;
3542 /* ??? LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those
3543 representing the outermost block of an inlined function.
3544 So walk the BLOCK tree until we hit such a scope. */
3546 && TREE_CODE (block
) == BLOCK
)
3548 if (inlined_function_outer_scope_p (block
))
3550 *pp_ti_abstract_origin (text
) = block
;
3553 block
= BLOCK_SUPERCONTEXT (block
);
3559 && TREE_CODE (block
) == BLOCK
3560 && BLOCK_ABSTRACT_ORIGIN (block
))
3562 tree ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3564 while (TREE_CODE (ao
) == BLOCK
3565 && BLOCK_ABSTRACT_ORIGIN (ao
)
3566 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3567 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3569 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3571 *pp_ti_abstract_origin (text
) = block
;
3574 block
= BLOCK_SUPERCONTEXT (block
);
3578 /* Print the identifier ID to PRETTY-PRINTER. */
3581 pp_tree_identifier (pretty_printer
*pp
, tree id
)
3583 if (pp_translate_identifiers (pp
))
3585 const char *text
= identifier_to_locale (IDENTIFIER_POINTER (id
));
3586 pp_append_text (pp
, text
, text
+ strlen (text
));
3589 pp_append_text (pp
, IDENTIFIER_POINTER (id
),
3590 IDENTIFIER_POINTER (id
) + IDENTIFIER_LENGTH (id
));
3593 /* A helper function that is used to dump function information before the
3597 dump_function_header (FILE *dump_file
, tree fdecl
, int flags
)
3599 const char *dname
, *aname
;
3600 struct cgraph_node
*node
= cgraph_get_node (fdecl
);
3601 struct function
*fun
= DECL_STRUCT_FUNCTION (fdecl
);
3603 dname
= lang_hooks
.decl_printable_name (fdecl
, 2);
3605 if (DECL_ASSEMBLER_NAME_SET_P (fdecl
))
3606 aname
= (IDENTIFIER_POINTER
3607 (DECL_ASSEMBLER_NAME (fdecl
)));
3609 aname
= "<unset-asm-name>";
3611 fprintf (dump_file
, "\n;; Function %s (%s, funcdef_no=%d",
3612 dname
, aname
, fun
->funcdef_no
);
3613 if (!(flags
& TDF_NOUID
))
3614 fprintf (dump_file
, ", decl_uid=%d", DECL_UID (fdecl
));
3617 fprintf (dump_file
, ", symbol_order=%d)%s\n\n", node
->order
,
3618 node
->frequency
== NODE_FREQUENCY_HOT
3620 : node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
3621 ? " (unlikely executed)"
3622 : node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
3623 ? " (executed once)"
3627 fprintf (dump_file
, ")\n\n");
3630 /* Dump double_int D to pretty_printer PP. UNS is true
3631 if D is unsigned and false otherwise. */
3633 pp_double_int (pretty_printer
*pp
, double_int d
, bool uns
)
3636 pp_wide_integer (pp
, d
.low
);
3637 else if (d
.fits_uhwi ())
3638 pp_unsigned_wide_integer (pp
, d
.low
);
3639 else if (HOST_BITS_PER_DOUBLE_INT
== HOST_BITS_PER_WIDEST_INT
)
3642 ? HOST_WIDEST_INT_PRINT_UNSIGNED
: HOST_WIDEST_INT_PRINT_DEC
,
3643 (HOST_WIDEST_INT
) ((((unsigned HOST_WIDEST_INT
) d
.high
<< 1)
3644 << (HOST_BITS_PER_WIDE_INT
- 1)) | d
.low
));
3647 unsigned HOST_WIDE_INT low
= d
.low
;
3648 HOST_WIDE_INT high
= d
.high
;
3649 if (!uns
&& d
.is_negative ())
3652 high
= ~high
+ !low
;
3655 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
3657 sprintf (pp_buffer (pp
)->digit_buffer
,
3658 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
3659 (unsigned HOST_WIDE_INT
) high
, low
);
3660 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);