1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001-2014 Free Software Foundation, Inc.
3 Adapted from c-pretty-print.c by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
26 #include "stor-layout.h"
28 #include "tree-pretty-print.h"
31 #include "gimple-expr.h"
35 #include "plugin-api.h"
38 #include "hard-reg-set.h"
43 #include "langhooks.h"
44 #include "tree-iterator.h"
45 #include "tree-chrec.h"
47 #include "value-prof.h"
48 #include "wide-int-print.h"
49 #include "internal-fn.h"
51 #include <new> // For placement-new.
53 /* Local functions, macros and variables. */
54 static const char *op_symbol (const_tree
);
55 static void pretty_print_string (pretty_printer
*, const char*);
56 static void newline_and_indent (pretty_printer
*, int);
57 static void maybe_init_pretty_print (FILE *);
58 static void print_struct_decl (pretty_printer
*, const_tree
, int, int);
59 static void do_niy (pretty_printer
*, const_tree
);
61 #define INDENT(SPACE) do { \
62 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
64 #define NIY do_niy (buffer, node)
66 static pretty_printer buffer
;
67 static int initialized
= 0;
69 /* Try to print something for an unknown tree code. */
72 do_niy (pretty_printer
*buffer
, const_tree node
)
76 pp_string (buffer
, "<<< Unknown tree: ");
77 pp_string (buffer
, get_tree_code_name (TREE_CODE (node
)));
81 len
= TREE_OPERAND_LENGTH (node
);
82 for (i
= 0; i
< len
; ++i
)
84 newline_and_indent (buffer
, 2);
85 dump_generic_node (buffer
, TREE_OPERAND (node
, i
), 2, 0, false);
89 pp_string (buffer
, " >>>");
92 /* Debugging function to print out a generic expression. */
95 debug_generic_expr (tree t
)
97 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
98 fprintf (stderr
, "\n");
101 /* Debugging function to print out a generic statement. */
104 debug_generic_stmt (tree t
)
106 print_generic_stmt (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
);
107 fprintf (stderr
, "\n");
110 /* Debugging function to print out a chain of trees . */
113 debug_tree_chain (tree t
)
119 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
120 fprintf (stderr
, " ");
124 fprintf (stderr
, "... [cycled back to ");
125 print_generic_expr (stderr
, t
, TDF_VOPS
|TDF_MEMSYMS
|TDF_UID
);
126 fprintf (stderr
, "]");
130 fprintf (stderr
, "\n");
133 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
135 print_generic_decl (FILE *file
, tree decl
, int flags
)
137 maybe_init_pretty_print (file
);
138 print_declaration (&buffer
, decl
, 2, flags
);
139 pp_write_text_to_stream (&buffer
);
142 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
143 to show in the dump. See TDF_* in dumpfile.h. */
146 print_generic_stmt (FILE *file
, tree t
, int flags
)
148 maybe_init_pretty_print (file
);
149 dump_generic_node (&buffer
, t
, 0, flags
, true);
150 pp_newline_and_flush (&buffer
);
153 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
154 to show in the dump. See TDF_* in dumpfile.h. The output is indented by
158 print_generic_stmt_indented (FILE *file
, tree t
, int flags
, int indent
)
162 maybe_init_pretty_print (file
);
164 for (i
= 0; i
< indent
; i
++)
166 dump_generic_node (&buffer
, t
, indent
, flags
, true);
167 pp_newline_and_flush (&buffer
);
170 /* Print a single expression T on file FILE. FLAGS specifies details to show
171 in the dump. See TDF_* in dumpfile.h. */
174 print_generic_expr (FILE *file
, tree t
, int flags
)
176 maybe_init_pretty_print (file
);
177 dump_generic_node (&buffer
, t
, 0, flags
, false);
181 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
185 dump_decl_name (pretty_printer
*buffer
, tree node
, int flags
)
187 if (DECL_NAME (node
))
189 if ((flags
& TDF_ASMNAME
) && DECL_ASSEMBLER_NAME_SET_P (node
))
190 pp_tree_identifier (buffer
, DECL_ASSEMBLER_NAME (node
));
192 pp_tree_identifier (buffer
, DECL_NAME (node
));
194 if ((flags
& TDF_UID
) || DECL_NAME (node
) == NULL_TREE
)
196 if (TREE_CODE (node
) == LABEL_DECL
&& LABEL_DECL_UID (node
) != -1)
197 pp_printf (buffer
, "L.%d", (int) LABEL_DECL_UID (node
));
198 else if (TREE_CODE (node
) == DEBUG_EXPR_DECL
)
200 if (flags
& TDF_NOUID
)
201 pp_string (buffer
, "D#xxxx");
203 pp_printf (buffer
, "D#%i", DEBUG_TEMP_UID (node
));
207 char c
= TREE_CODE (node
) == CONST_DECL
? 'C' : 'D';
208 if (flags
& TDF_NOUID
)
209 pp_printf (buffer
, "%c.xxxx", c
);
211 pp_printf (buffer
, "%c.%u", c
, DECL_UID (node
));
214 if ((flags
& TDF_ALIAS
) && DECL_PT_UID (node
) != DECL_UID (node
))
216 if (flags
& TDF_NOUID
)
217 pp_printf (buffer
, "ptD.xxxx");
219 pp_printf (buffer
, "ptD.%u", DECL_PT_UID (node
));
223 /* Like the above, but used for pretty printing function calls. */
226 dump_function_name (pretty_printer
*buffer
, tree node
, int flags
)
228 if (TREE_CODE (node
) == NOP_EXPR
)
229 node
= TREE_OPERAND (node
, 0);
230 if (DECL_NAME (node
) && (flags
& TDF_ASMNAME
) == 0)
231 pp_string (buffer
, lang_hooks
.decl_printable_name (node
, 1));
233 dump_decl_name (buffer
, node
, flags
);
236 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
237 FLAGS are as in dump_generic_node. */
240 dump_function_declaration (pretty_printer
*buffer
, tree node
,
243 bool wrote_arg
= false;
247 pp_left_paren (buffer
);
249 /* Print the argument types. */
250 arg
= TYPE_ARG_TYPES (node
);
251 while (arg
&& arg
!= void_list_node
&& arg
!= error_mark_node
)
259 dump_generic_node (buffer
, TREE_VALUE (arg
), spc
, flags
, false);
260 arg
= TREE_CHAIN (arg
);
263 /* Drop the trailing void_type_node if we had any previous argument. */
264 if (arg
== void_list_node
&& !wrote_arg
)
265 pp_string (buffer
, "void");
266 /* Properly dump vararg function types. */
267 else if (!arg
&& wrote_arg
)
268 pp_string (buffer
, ", ...");
269 /* Avoid printing any arg for unprototyped functions. */
271 pp_right_paren (buffer
);
274 /* Dump the domain associated with an array. */
277 dump_array_domain (pretty_printer
*buffer
, tree domain
, int spc
, int flags
)
279 pp_left_bracket (buffer
);
282 tree min
= TYPE_MIN_VALUE (domain
);
283 tree max
= TYPE_MAX_VALUE (domain
);
286 && integer_zerop (min
)
287 && tree_fits_shwi_p (max
))
288 pp_wide_integer (buffer
, tree_to_shwi (max
) + 1);
292 dump_generic_node (buffer
, min
, spc
, flags
, false);
295 dump_generic_node (buffer
, max
, spc
, flags
, false);
299 pp_string (buffer
, "<unknown>");
300 pp_right_bracket (buffer
);
304 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
305 dump_generic_node. */
308 dump_omp_clause (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
312 switch (OMP_CLAUSE_CODE (clause
))
314 case OMP_CLAUSE_PRIVATE
:
317 case OMP_CLAUSE_SHARED
:
320 case OMP_CLAUSE_FIRSTPRIVATE
:
321 name
= "firstprivate";
323 case OMP_CLAUSE_LASTPRIVATE
:
324 name
= "lastprivate";
326 case OMP_CLAUSE_COPYIN
:
329 case OMP_CLAUSE_COPYPRIVATE
:
330 name
= "copyprivate";
332 case OMP_CLAUSE_UNIFORM
:
335 case OMP_CLAUSE__LOOPTEMP_
:
338 case OMP_CLAUSE_HOST
:
341 case OMP_CLAUSE_OACC_DEVICE
:
344 case OMP_CLAUSE_DEVICE_RESIDENT
:
345 name
= "device_resident";
347 case OMP_CLAUSE_USE_DEVICE
:
350 case OMP_NO_CLAUSE_CACHE
:
354 pp_string (buffer
, name
);
355 pp_left_paren (buffer
);
356 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
358 pp_right_paren (buffer
);
361 case OMP_CLAUSE_REDUCTION
:
362 pp_string (buffer
, "reduction(");
363 if (OMP_CLAUSE_REDUCTION_CODE (clause
) != ERROR_MARK
)
366 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
369 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
371 pp_right_paren (buffer
);
375 pp_string (buffer
, "if(");
376 dump_generic_node (buffer
, OMP_CLAUSE_IF_EXPR (clause
),
378 pp_right_paren (buffer
);
381 case OMP_CLAUSE_NUM_THREADS
:
382 pp_string (buffer
, "num_threads(");
383 dump_generic_node (buffer
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
385 pp_right_paren (buffer
);
388 case OMP_CLAUSE__CILK_FOR_COUNT_
:
389 pp_string (buffer
, "_Cilk_for_count_(");
390 dump_generic_node (buffer
, OMP_CLAUSE_OPERAND (clause
, 0),
392 pp_right_paren (buffer
);
395 case OMP_CLAUSE_NOWAIT
:
396 pp_string (buffer
, "nowait");
398 case OMP_CLAUSE_ORDERED
:
399 pp_string (buffer
, "ordered");
402 case OMP_CLAUSE_DEFAULT
:
403 pp_string (buffer
, "default(");
404 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
406 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
408 case OMP_CLAUSE_DEFAULT_SHARED
:
409 pp_string (buffer
, "shared");
411 case OMP_CLAUSE_DEFAULT_NONE
:
412 pp_string (buffer
, "none");
414 case OMP_CLAUSE_DEFAULT_PRIVATE
:
415 pp_string (buffer
, "private");
417 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
418 pp_string (buffer
, "firstprivate");
423 pp_right_paren (buffer
);
426 case OMP_CLAUSE_SCHEDULE
:
427 pp_string (buffer
, "schedule(");
428 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
430 case OMP_CLAUSE_SCHEDULE_STATIC
:
431 pp_string (buffer
, "static");
433 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
434 pp_string (buffer
, "dynamic");
436 case OMP_CLAUSE_SCHEDULE_GUIDED
:
437 pp_string (buffer
, "guided");
439 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
440 pp_string (buffer
, "runtime");
442 case OMP_CLAUSE_SCHEDULE_AUTO
:
443 pp_string (buffer
, "auto");
445 case OMP_CLAUSE_SCHEDULE_CILKFOR
:
446 pp_string (buffer
, "cilk-for grain");
451 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
454 dump_generic_node (buffer
, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
457 pp_right_paren (buffer
);
460 case OMP_CLAUSE_UNTIED
:
461 pp_string (buffer
, "untied");
464 case OMP_CLAUSE_COLLAPSE
:
465 pp_string (buffer
, "collapse(");
466 dump_generic_node (buffer
, OMP_CLAUSE_COLLAPSE_EXPR (clause
),
468 pp_right_paren (buffer
);
471 case OMP_CLAUSE_FINAL
:
472 pp_string (buffer
, "final(");
473 dump_generic_node (buffer
, OMP_CLAUSE_FINAL_EXPR (clause
),
475 pp_right_paren (buffer
);
478 case OMP_CLAUSE_MERGEABLE
:
479 pp_string (buffer
, "mergeable");
482 case OMP_CLAUSE_LINEAR
:
483 pp_string (buffer
, "linear(");
484 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
487 dump_generic_node (buffer
, OMP_CLAUSE_LINEAR_STEP (clause
),
489 pp_right_paren (buffer
);
492 case OMP_CLAUSE_ALIGNED
:
493 pp_string (buffer
, "aligned(");
494 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
496 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
))
499 dump_generic_node (buffer
, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
),
502 pp_right_paren (buffer
);
505 case OMP_CLAUSE_DEPEND
:
506 pp_string (buffer
, "depend(");
507 switch (OMP_CLAUSE_DEPEND_KIND (clause
))
509 case OMP_CLAUSE_DEPEND_IN
:
510 pp_string (buffer
, "in");
512 case OMP_CLAUSE_DEPEND_OUT
:
513 pp_string (buffer
, "out");
515 case OMP_CLAUSE_DEPEND_INOUT
:
516 pp_string (buffer
, "inout");
522 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
524 pp_right_paren (buffer
);
528 pp_string (buffer
, "map(");
529 switch (OMP_CLAUSE_MAP_KIND (clause
))
531 case OMP_CLAUSE_MAP_ALLOC
:
532 case OMP_CLAUSE_MAP_POINTER
:
533 pp_string (buffer
, "alloc");
535 case OMP_CLAUSE_MAP_TO
:
536 case OMP_CLAUSE_MAP_TO_PSET
:
537 pp_string (buffer
, "to");
539 case OMP_CLAUSE_MAP_FROM
:
540 pp_string (buffer
, "from");
542 case OMP_CLAUSE_MAP_TOFROM
:
543 pp_string (buffer
, "tofrom");
545 case OMP_CLAUSE_MAP_FORCE_ALLOC
:
546 pp_string (buffer
, "force_alloc");
548 case OMP_CLAUSE_MAP_FORCE_TO
:
549 pp_string (buffer
, "force_to");
551 case OMP_CLAUSE_MAP_FORCE_FROM
:
552 pp_string (buffer
, "force_from");
554 case OMP_CLAUSE_MAP_FORCE_TOFROM
:
555 pp_string (buffer
, "force_tofrom");
557 case OMP_CLAUSE_MAP_FORCE_PRESENT
:
558 pp_string (buffer
, "force_present");
560 case OMP_CLAUSE_MAP_FORCE_DEALLOC
:
561 pp_string (buffer
, "force_dealloc");
563 case OMP_CLAUSE_MAP_FORCE_DEVICEPTR
:
564 pp_string (buffer
, "force_deviceptr");
570 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
573 if (OMP_CLAUSE_SIZE (clause
))
575 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
576 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_POINTER
)
577 pp_string (buffer
, " [pointer assign, bias: ");
578 else if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
579 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_TO_PSET
)
580 pp_string (buffer
, " [pointer set, len: ");
582 pp_string (buffer
, " [len: ");
583 dump_generic_node (buffer
, OMP_CLAUSE_SIZE (clause
),
585 pp_right_bracket (buffer
);
587 pp_right_paren (buffer
);
590 case OMP_CLAUSE_FROM
:
591 pp_string (buffer
, "from(");
592 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
594 goto print_clause_size
;
597 pp_string (buffer
, "to(");
598 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
600 goto print_clause_size
;
602 case OMP_CLAUSE_NUM_TEAMS
:
603 pp_string (buffer
, "num_teams(");
604 dump_generic_node (buffer
, OMP_CLAUSE_NUM_TEAMS_EXPR (clause
),
606 pp_right_paren (buffer
);
609 case OMP_CLAUSE_THREAD_LIMIT
:
610 pp_string (buffer
, "thread_limit(");
611 dump_generic_node (buffer
, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause
),
613 pp_right_paren (buffer
);
616 case OMP_CLAUSE_DEVICE
:
617 pp_string (buffer
, "device(");
618 dump_generic_node (buffer
, OMP_CLAUSE_DEVICE_ID (clause
),
620 pp_right_paren (buffer
);
623 case OMP_CLAUSE_DIST_SCHEDULE
:
624 pp_string (buffer
, "dist_schedule(static");
625 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
))
628 dump_generic_node (buffer
,
629 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
),
632 pp_right_paren (buffer
);
635 case OMP_CLAUSE_PROC_BIND
:
636 pp_string (buffer
, "proc_bind(");
637 switch (OMP_CLAUSE_PROC_BIND_KIND (clause
))
639 case OMP_CLAUSE_PROC_BIND_MASTER
:
640 pp_string (buffer
, "master");
642 case OMP_CLAUSE_PROC_BIND_CLOSE
:
643 pp_string (buffer
, "close");
645 case OMP_CLAUSE_PROC_BIND_SPREAD
:
646 pp_string (buffer
, "spread");
651 pp_right_paren (buffer
);
654 case OMP_CLAUSE_SAFELEN
:
655 pp_string (buffer
, "safelen(");
656 dump_generic_node (buffer
, OMP_CLAUSE_SAFELEN_EXPR (clause
),
658 pp_right_paren (buffer
);
661 case OMP_CLAUSE_SIMDLEN
:
662 pp_string (buffer
, "simdlen(");
663 dump_generic_node (buffer
, OMP_CLAUSE_SIMDLEN_EXPR (clause
),
665 pp_right_paren (buffer
);
668 case OMP_CLAUSE__SIMDUID_
:
669 pp_string (buffer
, "_simduid_(");
670 dump_generic_node (buffer
, OMP_CLAUSE__SIMDUID__DECL (clause
),
672 pp_right_paren (buffer
);
675 case OMP_CLAUSE_GANG
:
676 pp_string (buffer
, "gang(");
677 dump_generic_node (buffer
, OMP_CLAUSE_GANG_EXPR (clause
),
679 pp_character(buffer
, ')');
682 case OMP_CLAUSE_ASYNC
:
683 pp_string (buffer
, "async");
684 if (OMP_CLAUSE_ASYNC_EXPR (clause
))
686 pp_character(buffer
, '(');
687 dump_generic_node (buffer
, OMP_CLAUSE_ASYNC_EXPR (clause
),
689 pp_character(buffer
, ')');
693 case OMP_CLAUSE_WAIT
:
694 pp_string (buffer
, "wait(");
695 dump_generic_node (buffer
, OMP_CLAUSE_WAIT_EXPR (clause
),
697 pp_character(buffer
, ')');
700 case OMP_CLAUSE_WORKER
:
701 pp_string (buffer
, "worker(");
702 dump_generic_node (buffer
, OMP_CLAUSE_WORKER_EXPR (clause
),
704 pp_character(buffer
, ')');
707 case OMP_CLAUSE_VECTOR
:
708 pp_string (buffer
, "vector(");
709 dump_generic_node (buffer
, OMP_CLAUSE_VECTOR_EXPR (clause
),
711 pp_character(buffer
, ')');
714 case OMP_CLAUSE_NUM_GANGS
:
715 pp_string (buffer
, "num_gangs(");
716 dump_generic_node (buffer
, OMP_CLAUSE_NUM_GANGS_EXPR (clause
),
718 pp_character (buffer
, ')');
721 case OMP_CLAUSE_NUM_WORKERS
:
722 pp_string (buffer
, "num_workers(");
723 dump_generic_node (buffer
, OMP_CLAUSE_NUM_WORKERS_EXPR (clause
),
725 pp_character (buffer
, ')');
728 case OMP_CLAUSE_VECTOR_LENGTH
:
729 pp_string (buffer
, "vector_length(");
730 dump_generic_node (buffer
, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause
),
732 pp_character (buffer
, ')');
735 case OMP_CLAUSE_INBRANCH
:
736 pp_string (buffer
, "inbranch");
738 case OMP_CLAUSE_NOTINBRANCH
:
739 pp_string (buffer
, "notinbranch");
742 pp_string (buffer
, "for");
744 case OMP_CLAUSE_PARALLEL
:
745 pp_string (buffer
, "parallel");
747 case OMP_CLAUSE_SECTIONS
:
748 pp_string (buffer
, "sections");
750 case OMP_CLAUSE_TASKGROUP
:
751 pp_string (buffer
, "taskgroup");
753 case OMP_CLAUSE_INDEPENDENT
:
754 pp_string (buffer
, "independent");
758 /* Should never happen. */
759 dump_generic_node (buffer
, clause
, spc
, flags
, false);
765 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
766 dump_generic_node. */
769 dump_omp_clauses (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
777 dump_omp_clause (buffer
, clause
, spc
, flags
);
778 clause
= OMP_CLAUSE_CHAIN (clause
);
786 /* Dump location LOC to BUFFER. */
789 dump_location (pretty_printer
*buffer
, location_t loc
)
791 expanded_location xloc
= expand_location (loc
);
793 pp_left_bracket (buffer
);
796 pp_string (buffer
, xloc
.file
);
797 pp_string (buffer
, ":");
799 pp_decimal_int (buffer
, xloc
.line
);
801 pp_decimal_int (buffer
, xloc
.column
);
802 pp_string (buffer
, "] ");
806 /* Dump lexical block BLOCK. BUFFER, SPC and FLAGS are as in
807 dump_generic_node. */
810 dump_block_node (pretty_printer
*buffer
, tree block
, int spc
, int flags
)
814 pp_printf (buffer
, "BLOCK #%d ", BLOCK_NUMBER (block
));
816 if (flags
& TDF_ADDRESS
)
817 pp_printf (buffer
, "[%p] ", (void *) block
);
819 if (BLOCK_ABSTRACT (block
))
820 pp_string (buffer
, "[abstract] ");
822 if (TREE_ASM_WRITTEN (block
))
823 pp_string (buffer
, "[written] ");
825 if (flags
& TDF_SLIM
)
828 if (BLOCK_SOURCE_LOCATION (block
))
829 dump_location (buffer
, BLOCK_SOURCE_LOCATION (block
));
831 newline_and_indent (buffer
, spc
+ 2);
833 if (BLOCK_SUPERCONTEXT (block
))
835 pp_string (buffer
, "SUPERCONTEXT: ");
836 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (block
), 0,
837 flags
| TDF_SLIM
, false);
838 newline_and_indent (buffer
, spc
+ 2);
841 if (BLOCK_SUBBLOCKS (block
))
843 pp_string (buffer
, "SUBBLOCKS: ");
844 for (t
= BLOCK_SUBBLOCKS (block
); t
; t
= BLOCK_CHAIN (t
))
846 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
849 newline_and_indent (buffer
, spc
+ 2);
852 if (BLOCK_CHAIN (block
))
854 pp_string (buffer
, "SIBLINGS: ");
855 for (t
= BLOCK_CHAIN (block
); t
; t
= BLOCK_CHAIN (t
))
857 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
860 newline_and_indent (buffer
, spc
+ 2);
863 if (BLOCK_VARS (block
))
865 pp_string (buffer
, "VARS: ");
866 for (t
= BLOCK_VARS (block
); t
; t
= TREE_CHAIN (t
))
868 dump_generic_node (buffer
, t
, 0, flags
, false);
871 newline_and_indent (buffer
, spc
+ 2);
874 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block
)) > 0)
877 vec
<tree
, va_gc
> *nlv
= BLOCK_NONLOCALIZED_VARS (block
);
879 pp_string (buffer
, "NONLOCALIZED_VARS: ");
880 FOR_EACH_VEC_ELT (*nlv
, i
, t
)
882 dump_generic_node (buffer
, t
, 0, flags
, false);
885 newline_and_indent (buffer
, spc
+ 2);
888 if (BLOCK_ABSTRACT_ORIGIN (block
))
890 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
891 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (block
), 0,
892 flags
| TDF_SLIM
, false);
893 newline_and_indent (buffer
, spc
+ 2);
896 if (BLOCK_FRAGMENT_ORIGIN (block
))
898 pp_string (buffer
, "FRAGMENT_ORIGIN: ");
899 dump_generic_node (buffer
, BLOCK_FRAGMENT_ORIGIN (block
), 0,
900 flags
| TDF_SLIM
, false);
901 newline_and_indent (buffer
, spc
+ 2);
904 if (BLOCK_FRAGMENT_CHAIN (block
))
906 pp_string (buffer
, "FRAGMENT_CHAIN: ");
907 for (t
= BLOCK_FRAGMENT_CHAIN (block
); t
; t
= BLOCK_FRAGMENT_CHAIN (t
))
909 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
912 newline_and_indent (buffer
, spc
+ 2);
917 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
918 indent. FLAGS specifies details to show in the dump (see TDF_* in
919 dumpfile.h). If IS_STMT is true, the object printed is considered
920 to be a statement and it is terminated by ';' if appropriate. */
923 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
932 if (node
== NULL_TREE
)
935 is_expr
= EXPR_P (node
);
937 if (is_stmt
&& (flags
& TDF_STMTADDR
))
938 pp_printf (buffer
, "<&%p> ", (void *)node
);
940 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
941 dump_location (buffer
, EXPR_LOCATION (node
));
943 code
= TREE_CODE (node
);
947 pp_string (buffer
, "<<< error >>>");
950 case IDENTIFIER_NODE
:
951 pp_tree_identifier (buffer
, node
);
955 while (node
&& node
!= error_mark_node
)
957 if (TREE_PURPOSE (node
))
959 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
962 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
963 node
= TREE_CHAIN (node
);
964 if (node
&& TREE_CODE (node
) == TREE_LIST
)
973 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
979 if (TREE_VEC_LENGTH (node
) > 0)
981 size_t len
= TREE_VEC_LENGTH (node
);
982 for (i
= 0; i
< len
- 1; i
++)
984 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
989 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
998 case FIXED_POINT_TYPE
:
1004 unsigned int quals
= TYPE_QUALS (node
);
1005 enum tree_code_class tclass
;
1007 if (quals
& TYPE_QUAL_ATOMIC
)
1008 pp_string (buffer
, "atomic ");
1009 if (quals
& TYPE_QUAL_CONST
)
1010 pp_string (buffer
, "const ");
1011 else if (quals
& TYPE_QUAL_VOLATILE
)
1012 pp_string (buffer
, "volatile ");
1013 else if (quals
& TYPE_QUAL_RESTRICT
)
1014 pp_string (buffer
, "restrict ");
1016 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1018 pp_string (buffer
, "<address-space-");
1019 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
1020 pp_string (buffer
, "> ");
1023 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
1025 if (tclass
== tcc_declaration
)
1027 if (DECL_NAME (node
))
1028 dump_decl_name (buffer
, node
, flags
);
1030 pp_string (buffer
, "<unnamed type decl>");
1032 else if (tclass
== tcc_type
)
1034 if (TYPE_NAME (node
))
1036 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
1037 pp_tree_identifier (buffer
, TYPE_NAME (node
));
1038 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
1039 && DECL_NAME (TYPE_NAME (node
)))
1040 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1042 pp_string (buffer
, "<unnamed type>");
1044 else if (TREE_CODE (node
) == VECTOR_TYPE
)
1046 pp_string (buffer
, "vector");
1047 pp_left_paren (buffer
);
1048 pp_wide_integer (buffer
, TYPE_VECTOR_SUBPARTS (node
));
1049 pp_string (buffer
, ") ");
1050 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1052 else if (TREE_CODE (node
) == INTEGER_TYPE
)
1054 if (TYPE_PRECISION (node
) == CHAR_TYPE_SIZE
)
1055 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1058 else if (TYPE_PRECISION (node
) == SHORT_TYPE_SIZE
)
1059 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1062 else if (TYPE_PRECISION (node
) == INT_TYPE_SIZE
)
1063 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1066 else if (TYPE_PRECISION (node
) == LONG_TYPE_SIZE
)
1067 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1070 else if (TYPE_PRECISION (node
) == LONG_LONG_TYPE_SIZE
)
1071 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1072 ? "unsigned long long"
1073 : "signed long long"));
1074 else if (TYPE_PRECISION (node
) >= CHAR_TYPE_SIZE
1075 && exact_log2 (TYPE_PRECISION (node
)) != -1)
1077 pp_string (buffer
, (TYPE_UNSIGNED (node
) ? "uint" : "int"));
1078 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1079 pp_string (buffer
, "_t");
1083 pp_string (buffer
, (TYPE_UNSIGNED (node
)
1084 ? "<unnamed-unsigned:"
1085 : "<unnamed-signed:"));
1086 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1087 pp_greater (buffer
);
1090 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
1092 pp_string (buffer
, "__complex__ ");
1093 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1095 else if (TREE_CODE (node
) == REAL_TYPE
)
1097 pp_string (buffer
, "<float:");
1098 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1099 pp_greater (buffer
);
1101 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
1103 pp_string (buffer
, "<fixed-point-");
1104 pp_string (buffer
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
1105 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
1106 pp_greater (buffer
);
1108 else if (TREE_CODE (node
) == VOID_TYPE
)
1109 pp_string (buffer
, "void");
1111 pp_string (buffer
, "<unnamed type>");
1117 case REFERENCE_TYPE
:
1118 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
1120 if (TREE_TYPE (node
) == NULL
)
1122 pp_string (buffer
, str
);
1123 pp_string (buffer
, "<null type>");
1125 else if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
1127 tree fnode
= TREE_TYPE (node
);
1129 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
1131 pp_left_paren (buffer
);
1132 pp_string (buffer
, str
);
1133 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1134 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1135 else if (flags
& TDF_NOUID
)
1136 pp_printf (buffer
, "<Txxxx>");
1138 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1140 pp_right_paren (buffer
);
1141 dump_function_declaration (buffer
, fnode
, spc
, flags
);
1145 unsigned int quals
= TYPE_QUALS (node
);
1147 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1149 pp_string (buffer
, str
);
1151 if (quals
& TYPE_QUAL_CONST
)
1152 pp_string (buffer
, " const");
1153 if (quals
& TYPE_QUAL_VOLATILE
)
1154 pp_string (buffer
, " volatile");
1155 if (quals
& TYPE_QUAL_RESTRICT
)
1156 pp_string (buffer
, " restrict");
1158 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1160 pp_string (buffer
, " <address-space-");
1161 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
1162 pp_greater (buffer
);
1165 if (TYPE_REF_CAN_ALIAS_ALL (node
))
1166 pp_string (buffer
, " {ref-all}");
1176 if (integer_zerop (TREE_OPERAND (node
, 1))
1177 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1178 infer them and MEM_ATTR caching will share MEM_REFs
1179 with differently-typed op0s. */
1180 && TREE_CODE (TREE_OPERAND (node
, 0)) != INTEGER_CST
1181 /* Released SSA_NAMES have no TREE_TYPE. */
1182 && TREE_TYPE (TREE_OPERAND (node
, 0)) != NULL_TREE
1183 /* Same pointer types, but ignoring POINTER_TYPE vs.
1185 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1186 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1187 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1188 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1189 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 0)))
1190 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 1))))
1191 /* Same value types ignoring qualifiers. */
1192 && (TYPE_MAIN_VARIANT (TREE_TYPE (node
))
1193 == TYPE_MAIN_VARIANT
1194 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))))
1196 if (TREE_CODE (TREE_OPERAND (node
, 0)) != ADDR_EXPR
)
1199 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1203 dump_generic_node (buffer
,
1204 TREE_OPERAND (TREE_OPERAND (node
, 0), 0),
1211 pp_string (buffer
, "MEM[");
1212 pp_left_paren (buffer
);
1213 ptype
= TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node
, 1)));
1214 dump_generic_node (buffer
, ptype
,
1215 spc
, flags
| TDF_SLIM
, false);
1216 pp_right_paren (buffer
);
1217 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1219 if (!integer_zerop (TREE_OPERAND (node
, 1)))
1221 pp_string (buffer
, " + ");
1222 dump_generic_node (buffer
, TREE_OPERAND (node
, 1),
1225 pp_right_bracket (buffer
);
1230 case TARGET_MEM_REF
:
1232 const char *sep
= "";
1235 pp_string (buffer
, "MEM[");
1237 if (TREE_CODE (TMR_BASE (node
)) == ADDR_EXPR
)
1239 pp_string (buffer
, sep
);
1241 pp_string (buffer
, "symbol: ");
1242 dump_generic_node (buffer
, TREE_OPERAND (TMR_BASE (node
), 0),
1247 pp_string (buffer
, sep
);
1249 pp_string (buffer
, "base: ");
1250 dump_generic_node (buffer
, TMR_BASE (node
), spc
, flags
, false);
1252 tmp
= TMR_INDEX2 (node
);
1255 pp_string (buffer
, sep
);
1257 pp_string (buffer
, "base: ");
1258 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1260 tmp
= TMR_INDEX (node
);
1263 pp_string (buffer
, sep
);
1265 pp_string (buffer
, "index: ");
1266 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1268 tmp
= TMR_STEP (node
);
1271 pp_string (buffer
, sep
);
1273 pp_string (buffer
, "step: ");
1274 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1276 tmp
= TMR_OFFSET (node
);
1279 pp_string (buffer
, sep
);
1281 pp_string (buffer
, "offset: ");
1282 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1284 pp_right_bracket (buffer
);
1292 /* Print the innermost component type. */
1293 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
1294 tmp
= TREE_TYPE (tmp
))
1296 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1298 /* Print the dimensions. */
1299 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
1300 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
1306 case QUAL_UNION_TYPE
:
1308 unsigned int quals
= TYPE_QUALS (node
);
1310 if (quals
& TYPE_QUAL_ATOMIC
)
1311 pp_string (buffer
, "atomic ");
1312 if (quals
& TYPE_QUAL_CONST
)
1313 pp_string (buffer
, "const ");
1314 if (quals
& TYPE_QUAL_VOLATILE
)
1315 pp_string (buffer
, "volatile ");
1317 /* Print the name of the structure. */
1318 if (TREE_CODE (node
) == RECORD_TYPE
)
1319 pp_string (buffer
, "struct ");
1320 else if (TREE_CODE (node
) == UNION_TYPE
)
1321 pp_string (buffer
, "union ");
1323 if (TYPE_NAME (node
))
1324 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
1325 else if (!(flags
& TDF_SLIM
))
1326 /* FIXME: If we eliminate the 'else' above and attempt
1327 to show the fields for named types, we may get stuck
1328 following a cycle of pointers to structs. The alleged
1329 self-reference check in print_struct_decl will not detect
1330 cycles involving more than one pointer or struct type. */
1331 print_struct_decl (buffer
, node
, spc
, flags
);
1340 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
1342 /* In the case of a pointer, one may want to divide by the
1343 size of the pointed-to type. Unfortunately, this not
1344 straightforward. The C front-end maps expressions
1349 in such a way that the two INTEGER_CST nodes for "5" have
1350 different values but identical types. In the latter
1351 case, the 5 is multiplied by sizeof (int) in c-common.c
1352 (pointer_int_sum) to convert it to a byte address, and
1353 yet the type of the node is left unchanged. Argh. What
1354 is consistent though is that the number value corresponds
1355 to bytes (UNITS) offset.
1357 NB: Neither of the following divisors can be trivially
1358 used to recover the original literal:
1360 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1361 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1362 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
1363 pp_string (buffer
, "B"); /* pseudo-unit */
1365 else if (tree_fits_shwi_p (node
))
1366 pp_wide_integer (buffer
, tree_to_shwi (node
));
1367 else if (tree_fits_uhwi_p (node
))
1368 pp_unsigned_wide_integer (buffer
, tree_to_uhwi (node
));
1371 wide_int val
= node
;
1373 if (wi::neg_p (val
, TYPE_SIGN (TREE_TYPE (node
))))
1378 print_hex (val
, pp_buffer (buffer
)->digit_buffer
);
1379 pp_string (buffer
, pp_buffer (buffer
)->digit_buffer
);
1381 if (TREE_OVERFLOW (node
))
1382 pp_string (buffer
, "(OVF)");
1386 /* Code copied from print_node. */
1389 if (TREE_OVERFLOW (node
))
1390 pp_string (buffer
, " overflow");
1392 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
1393 d
= TREE_REAL_CST (node
);
1394 if (REAL_VALUE_ISINF (d
))
1395 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
1396 else if (REAL_VALUE_ISNAN (d
))
1397 pp_string (buffer
, " Nan");
1401 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
1402 pp_string (buffer
, string
);
1407 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
1408 pp_string (buffer
, "0x");
1409 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
1410 output_formatted_integer (buffer
, "%02x", *p
++);
1419 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
1420 pp_string (buffer
, string
);
1425 pp_string (buffer
, "__complex__ (");
1426 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
1427 pp_string (buffer
, ", ");
1428 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
1429 pp_right_paren (buffer
);
1433 pp_string (buffer
, "\"");
1434 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
1435 pp_string (buffer
, "\"");
1441 pp_string (buffer
, "{ ");
1442 for (i
= 0; i
< VECTOR_CST_NELTS (node
); ++i
)
1445 pp_string (buffer
, ", ");
1446 dump_generic_node (buffer
, VECTOR_CST_ELT (node
, i
),
1449 pp_string (buffer
, " }");
1455 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1457 if (TREE_CODE (node
) == METHOD_TYPE
)
1459 if (TYPE_METHOD_BASETYPE (node
))
1460 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
1463 pp_string (buffer
, "<null method basetype>");
1464 pp_colon_colon (buffer
);
1466 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1467 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1468 else if (flags
& TDF_NOUID
)
1469 pp_printf (buffer
, "<Txxxx>");
1471 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1472 dump_function_declaration (buffer
, node
, spc
, flags
);
1477 dump_decl_name (buffer
, node
, flags
);
1481 if (DECL_NAME (node
))
1482 dump_decl_name (buffer
, node
, flags
);
1483 else if (LABEL_DECL_UID (node
) != -1)
1484 pp_printf (buffer
, "<L%d>", (int) LABEL_DECL_UID (node
));
1487 if (flags
& TDF_NOUID
)
1488 pp_string (buffer
, "<D.xxxx>");
1490 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
1495 if (DECL_IS_BUILTIN (node
))
1497 /* Don't print the declaration of built-in types. */
1500 if (DECL_NAME (node
))
1501 dump_decl_name (buffer
, node
, flags
);
1502 else if (TYPE_NAME (TREE_TYPE (node
)) != node
)
1504 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1505 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1506 && TYPE_METHODS (TREE_TYPE (node
)))
1508 /* The type is a c++ class: all structures have at least
1510 pp_string (buffer
, "class ");
1511 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1516 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
1517 ? "union" : "struct "));
1518 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1522 pp_string (buffer
, "<anon>");
1528 case DEBUG_EXPR_DECL
:
1529 case NAMESPACE_DECL
:
1531 dump_decl_name (buffer
, node
, flags
);
1535 pp_string (buffer
, "<retval>");
1539 op0
= TREE_OPERAND (node
, 0);
1542 && (TREE_CODE (op0
) == INDIRECT_REF
1543 || (TREE_CODE (op0
) == MEM_REF
1544 && TREE_CODE (TREE_OPERAND (op0
, 0)) != ADDR_EXPR
1545 && integer_zerop (TREE_OPERAND (op0
, 1))
1546 /* Dump the types of INTEGER_CSTs explicitly, for we
1547 can't infer them and MEM_ATTR caching will share
1548 MEM_REFs with differently-typed op0s. */
1549 && TREE_CODE (TREE_OPERAND (op0
, 0)) != INTEGER_CST
1550 /* Released SSA_NAMES have no TREE_TYPE. */
1551 && TREE_TYPE (TREE_OPERAND (op0
, 0)) != NULL_TREE
1552 /* Same pointer types, but ignoring POINTER_TYPE vs.
1554 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1555 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1556 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1557 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1558 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1559 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1560 /* Same value types ignoring qualifiers. */
1561 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0
))
1562 == TYPE_MAIN_VARIANT
1563 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))))))
1565 op0
= TREE_OPERAND (op0
, 0);
1568 if (op_prio (op0
) < op_prio (node
))
1569 pp_left_paren (buffer
);
1570 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1571 if (op_prio (op0
) < op_prio (node
))
1572 pp_right_paren (buffer
);
1573 pp_string (buffer
, str
);
1574 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1575 op0
= component_ref_field_offset (node
);
1576 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
1578 pp_string (buffer
, "{off: ");
1579 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1580 pp_right_brace (buffer
);
1585 pp_string (buffer
, "BIT_FIELD_REF <");
1586 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1587 pp_string (buffer
, ", ");
1588 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1589 pp_string (buffer
, ", ");
1590 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1591 pp_greater (buffer
);
1595 case ARRAY_RANGE_REF
:
1596 op0
= TREE_OPERAND (node
, 0);
1597 if (op_prio (op0
) < op_prio (node
))
1598 pp_left_paren (buffer
);
1599 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1600 if (op_prio (op0
) < op_prio (node
))
1601 pp_right_paren (buffer
);
1602 pp_left_bracket (buffer
);
1603 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1604 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
1605 pp_string (buffer
, " ...");
1606 pp_right_bracket (buffer
);
1608 op0
= array_ref_low_bound (node
);
1609 op1
= array_ref_element_size (node
);
1611 if (!integer_zerop (op0
)
1612 || TREE_OPERAND (node
, 2)
1613 || TREE_OPERAND (node
, 3))
1615 pp_string (buffer
, "{lb: ");
1616 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1617 pp_string (buffer
, " sz: ");
1618 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1619 pp_right_brace (buffer
);
1625 unsigned HOST_WIDE_INT ix
;
1627 bool is_struct_init
= false;
1628 bool is_array_init
= false;
1630 pp_left_brace (buffer
);
1631 if (TREE_CLOBBER_P (node
))
1632 pp_string (buffer
, "CLOBBER");
1633 else if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1634 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1635 is_struct_init
= true;
1636 else if (TREE_CODE (TREE_TYPE (node
)) == ARRAY_TYPE
1637 && TYPE_DOMAIN (TREE_TYPE (node
))
1638 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)))
1639 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
))))
1642 tree minv
= TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)));
1643 is_array_init
= true;
1644 curidx
= wi::to_widest (minv
);
1646 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1653 dump_generic_node (buffer
, field
, spc
, flags
, false);
1656 else if (is_array_init
1657 && (TREE_CODE (field
) != INTEGER_CST
1658 || curidx
!= wi::to_widest (field
)))
1660 pp_left_bracket (buffer
);
1661 if (TREE_CODE (field
) == RANGE_EXPR
)
1663 dump_generic_node (buffer
, TREE_OPERAND (field
, 0), spc
,
1665 pp_string (buffer
, " ... ");
1666 dump_generic_node (buffer
, TREE_OPERAND (field
, 1), spc
,
1668 if (TREE_CODE (TREE_OPERAND (field
, 1)) == INTEGER_CST
)
1669 curidx
= wi::to_widest (TREE_OPERAND (field
, 1));
1672 dump_generic_node (buffer
, field
, spc
, flags
, false);
1673 if (TREE_CODE (field
) == INTEGER_CST
)
1674 curidx
= wi::to_widest (field
);
1675 pp_string (buffer
, "]=");
1680 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1681 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1682 val
= TREE_OPERAND (val
, 0);
1683 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1684 dump_decl_name (buffer
, val
, flags
);
1686 dump_generic_node (buffer
, val
, spc
, flags
, false);
1687 if (ix
!= vec_safe_length (CONSTRUCTOR_ELTS (node
)) - 1)
1693 pp_right_brace (buffer
);
1700 if (flags
& TDF_SLIM
)
1702 pp_string (buffer
, "<COMPOUND_EXPR>");
1706 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1707 spc
, flags
, !(flags
& TDF_SLIM
));
1708 if (flags
& TDF_SLIM
)
1709 newline_and_indent (buffer
, spc
);
1716 for (tp
= &TREE_OPERAND (node
, 1);
1717 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1718 tp
= &TREE_OPERAND (*tp
, 1))
1720 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1721 spc
, flags
, !(flags
& TDF_SLIM
));
1722 if (flags
& TDF_SLIM
)
1723 newline_and_indent (buffer
, spc
);
1731 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1735 case STATEMENT_LIST
:
1737 tree_stmt_iterator si
;
1740 if (flags
& TDF_SLIM
)
1742 pp_string (buffer
, "<STATEMENT_LIST>");
1746 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1749 newline_and_indent (buffer
, spc
);
1752 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1759 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
,
1764 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
,
1769 pp_string (buffer
, "TARGET_EXPR <");
1770 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1773 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1774 pp_greater (buffer
);
1778 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1783 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1785 pp_string (buffer
, "if (");
1786 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1787 pp_right_paren (buffer
);
1788 /* The lowered cond_exprs should always be printed in full. */
1789 if (COND_EXPR_THEN (node
)
1790 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1791 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1792 && COND_EXPR_ELSE (node
)
1793 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1794 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1797 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1799 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1801 pp_string (buffer
, " else ");
1802 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1806 else if (!(flags
& TDF_SLIM
))
1808 /* Output COND_EXPR_THEN. */
1809 if (COND_EXPR_THEN (node
))
1811 newline_and_indent (buffer
, spc
+2);
1812 pp_left_brace (buffer
);
1813 newline_and_indent (buffer
, spc
+4);
1814 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1816 newline_and_indent (buffer
, spc
+2);
1817 pp_right_brace (buffer
);
1820 /* Output COND_EXPR_ELSE. */
1821 if (COND_EXPR_ELSE (node
)
1822 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1824 newline_and_indent (buffer
, spc
);
1825 pp_string (buffer
, "else");
1826 newline_and_indent (buffer
, spc
+2);
1827 pp_left_brace (buffer
);
1828 newline_and_indent (buffer
, spc
+4);
1829 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1831 newline_and_indent (buffer
, spc
+2);
1832 pp_right_brace (buffer
);
1839 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1841 pp_question (buffer
);
1843 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1847 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1852 pp_left_brace (buffer
);
1853 if (!(flags
& TDF_SLIM
))
1855 if (BIND_EXPR_VARS (node
))
1857 pp_newline (buffer
);
1859 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= DECL_CHAIN (op0
))
1861 print_declaration (buffer
, op0
, spc
+2, flags
);
1862 pp_newline (buffer
);
1866 newline_and_indent (buffer
, spc
+2);
1867 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1868 newline_and_indent (buffer
, spc
);
1869 pp_right_brace (buffer
);
1875 if (CALL_EXPR_FN (node
) != NULL_TREE
)
1876 print_call_name (buffer
, CALL_EXPR_FN (node
), flags
);
1878 pp_string (buffer
, internal_fn_name (CALL_EXPR_IFN (node
)));
1880 /* Print parameters. */
1882 pp_left_paren (buffer
);
1885 call_expr_arg_iterator iter
;
1886 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1888 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1889 if (more_call_expr_args_p (&iter
))
1896 if (CALL_EXPR_VA_ARG_PACK (node
))
1898 if (call_expr_nargs (node
) > 0)
1903 pp_string (buffer
, "__builtin_va_arg_pack ()");
1905 pp_right_paren (buffer
);
1907 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1910 pp_string (buffer
, " [static-chain: ");
1911 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1912 pp_right_bracket (buffer
);
1915 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1916 pp_string (buffer
, " [return slot optimization]");
1917 if (CALL_EXPR_TAILCALL (node
))
1918 pp_string (buffer
, " [tail call]");
1921 case WITH_CLEANUP_EXPR
:
1925 case CLEANUP_POINT_EXPR
:
1926 pp_string (buffer
, "<<cleanup_point ");
1927 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1928 pp_string (buffer
, ">>");
1931 case PLACEHOLDER_EXPR
:
1932 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1933 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1934 pp_greater (buffer
);
1937 /* Binary arithmetic and logic expressions. */
1938 case WIDEN_SUM_EXPR
:
1939 case WIDEN_MULT_EXPR
:
1941 case MULT_HIGHPART_EXPR
:
1943 case POINTER_PLUS_EXPR
:
1945 case TRUNC_DIV_EXPR
:
1947 case FLOOR_DIV_EXPR
:
1948 case ROUND_DIV_EXPR
:
1949 case TRUNC_MOD_EXPR
:
1951 case FLOOR_MOD_EXPR
:
1952 case ROUND_MOD_EXPR
:
1954 case EXACT_DIV_EXPR
:
1959 case VEC_RSHIFT_EXPR
:
1960 case WIDEN_LSHIFT_EXPR
:
1964 case TRUTH_ANDIF_EXPR
:
1965 case TRUTH_ORIF_EXPR
:
1966 case TRUTH_AND_EXPR
:
1968 case TRUTH_XOR_EXPR
:
1982 case UNORDERED_EXPR
:
1984 const char *op
= op_symbol (node
);
1985 op0
= TREE_OPERAND (node
, 0);
1986 op1
= TREE_OPERAND (node
, 1);
1988 /* When the operands are expressions with less priority,
1989 keep semantics of the tree representation. */
1990 if (op_prio (op0
) <= op_prio (node
))
1992 pp_left_paren (buffer
);
1993 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1994 pp_right_paren (buffer
);
1997 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2000 pp_string (buffer
, op
);
2003 /* When the operands are expressions with less priority,
2004 keep semantics of the tree representation. */
2005 if (op_prio (op1
) <= op_prio (node
))
2007 pp_left_paren (buffer
);
2008 dump_generic_node (buffer
, op1
, spc
, flags
, false);
2009 pp_right_paren (buffer
);
2012 dump_generic_node (buffer
, op1
, spc
, flags
, false);
2016 /* Unary arithmetic and logic expressions. */
2019 case TRUTH_NOT_EXPR
:
2021 case PREDECREMENT_EXPR
:
2022 case PREINCREMENT_EXPR
:
2024 if (TREE_CODE (node
) == ADDR_EXPR
2025 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
2026 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
2027 ; /* Do not output '&' for strings and function pointers. */
2029 pp_string (buffer
, op_symbol (node
));
2031 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2033 pp_left_paren (buffer
);
2034 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2035 pp_right_paren (buffer
);
2038 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2041 case POSTDECREMENT_EXPR
:
2042 case POSTINCREMENT_EXPR
:
2043 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
2045 pp_left_paren (buffer
);
2046 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2047 pp_right_paren (buffer
);
2050 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2051 pp_string (buffer
, op_symbol (node
));
2055 pp_string (buffer
, "MIN_EXPR <");
2056 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2057 pp_string (buffer
, ", ");
2058 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2059 pp_greater (buffer
);
2063 pp_string (buffer
, "MAX_EXPR <");
2064 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2065 pp_string (buffer
, ", ");
2066 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2067 pp_greater (buffer
);
2071 pp_string (buffer
, "ABS_EXPR <");
2072 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2073 pp_greater (buffer
);
2080 case ADDR_SPACE_CONVERT_EXPR
:
2081 case FIXED_CONVERT_EXPR
:
2082 case FIX_TRUNC_EXPR
:
2085 type
= TREE_TYPE (node
);
2086 op0
= TREE_OPERAND (node
, 0);
2087 if (type
!= TREE_TYPE (op0
))
2089 pp_left_paren (buffer
);
2090 dump_generic_node (buffer
, type
, spc
, flags
, false);
2091 pp_string (buffer
, ") ");
2093 if (op_prio (op0
) < op_prio (node
))
2094 pp_left_paren (buffer
);
2095 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2096 if (op_prio (op0
) < op_prio (node
))
2097 pp_right_paren (buffer
);
2100 case VIEW_CONVERT_EXPR
:
2101 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
2102 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
2103 pp_string (buffer
, ">(");
2104 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2105 pp_right_paren (buffer
);
2109 pp_string (buffer
, "((");
2110 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2111 pp_string (buffer
, "))");
2114 case NON_LVALUE_EXPR
:
2115 pp_string (buffer
, "NON_LVALUE_EXPR <");
2116 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2117 pp_greater (buffer
);
2121 pp_string (buffer
, "SAVE_EXPR <");
2122 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2123 pp_greater (buffer
);
2127 pp_string (buffer
, "COMPLEX_EXPR <");
2128 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2129 pp_string (buffer
, ", ");
2130 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2131 pp_greater (buffer
);
2135 pp_string (buffer
, "CONJ_EXPR <");
2136 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2137 pp_greater (buffer
);
2141 pp_string (buffer
, "REALPART_EXPR <");
2142 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2143 pp_greater (buffer
);
2147 pp_string (buffer
, "IMAGPART_EXPR <");
2148 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2149 pp_greater (buffer
);
2153 pp_string (buffer
, "VA_ARG_EXPR <");
2154 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2155 pp_greater (buffer
);
2158 case TRY_FINALLY_EXPR
:
2159 case TRY_CATCH_EXPR
:
2160 pp_string (buffer
, "try");
2161 newline_and_indent (buffer
, spc
+2);
2162 pp_left_brace (buffer
);
2163 newline_and_indent (buffer
, spc
+4);
2164 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
2165 newline_and_indent (buffer
, spc
+2);
2166 pp_right_brace (buffer
);
2167 newline_and_indent (buffer
, spc
);
2169 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
2170 newline_and_indent (buffer
, spc
+2);
2171 pp_left_brace (buffer
);
2172 newline_and_indent (buffer
, spc
+4);
2173 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
2174 newline_and_indent (buffer
, spc
+2);
2175 pp_right_brace (buffer
);
2180 pp_string (buffer
, "catch (");
2181 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
2182 pp_right_paren (buffer
);
2183 newline_and_indent (buffer
, spc
+2);
2184 pp_left_brace (buffer
);
2185 newline_and_indent (buffer
, spc
+4);
2186 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
2187 newline_and_indent (buffer
, spc
+2);
2188 pp_right_brace (buffer
);
2192 case EH_FILTER_EXPR
:
2193 pp_string (buffer
, "<<<eh_filter (");
2194 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
2195 pp_string (buffer
, ")>>>");
2196 newline_and_indent (buffer
, spc
+2);
2197 pp_left_brace (buffer
);
2198 newline_and_indent (buffer
, spc
+4);
2199 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
2200 newline_and_indent (buffer
, spc
+2);
2201 pp_right_brace (buffer
);
2206 op0
= TREE_OPERAND (node
, 0);
2207 /* If this is for break or continue, don't bother printing it. */
2208 if (DECL_NAME (op0
))
2210 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2211 if (strcmp (name
, "break") == 0
2212 || strcmp (name
, "continue") == 0)
2215 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2217 if (DECL_NONLOCAL (op0
))
2218 pp_string (buffer
, " [non-local]");
2222 pp_string (buffer
, "while (1)");
2223 if (!(flags
& TDF_SLIM
))
2225 newline_and_indent (buffer
, spc
+2);
2226 pp_left_brace (buffer
);
2227 newline_and_indent (buffer
, spc
+4);
2228 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
2229 newline_and_indent (buffer
, spc
+2);
2230 pp_right_brace (buffer
);
2236 pp_string (buffer
, "// predicted ");
2237 if (PREDICT_EXPR_OUTCOME (node
))
2238 pp_string (buffer
, "likely by ");
2240 pp_string (buffer
, "unlikely by ");
2241 pp_string (buffer
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
2242 pp_string (buffer
, " predictor.");
2246 pp_string (buffer
, "ANNOTATE_EXPR <");
2247 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2248 switch ((enum annot_expr_kind
) TREE_INT_CST_LOW (TREE_OPERAND (node
, 1)))
2250 case annot_expr_ivdep_kind
:
2251 pp_string (buffer
, ", ivdep");
2253 case annot_expr_no_vector_kind
:
2254 pp_string (buffer
, ", no-vector");
2256 case annot_expr_vector_kind
:
2257 pp_string (buffer
, ", vector");
2262 pp_greater (buffer
);
2266 pp_string (buffer
, "return");
2267 op0
= TREE_OPERAND (node
, 0);
2271 if (TREE_CODE (op0
) == MODIFY_EXPR
)
2272 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1),
2275 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2280 pp_string (buffer
, "if (");
2281 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2282 pp_string (buffer
, ") break");
2286 pp_string (buffer
, "switch (");
2287 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
2288 pp_right_paren (buffer
);
2289 if (!(flags
& TDF_SLIM
))
2291 newline_and_indent (buffer
, spc
+2);
2292 pp_left_brace (buffer
);
2293 if (SWITCH_BODY (node
))
2295 newline_and_indent (buffer
, spc
+4);
2296 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
2301 tree vec
= SWITCH_LABELS (node
);
2302 size_t i
, n
= TREE_VEC_LENGTH (vec
);
2303 for (i
= 0; i
< n
; ++i
)
2305 tree elt
= TREE_VEC_ELT (vec
, i
);
2306 newline_and_indent (buffer
, spc
+4);
2309 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
2310 pp_string (buffer
, " goto ");
2311 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
2313 pp_semicolon (buffer
);
2316 pp_string (buffer
, "case ???: goto ???;");
2319 newline_and_indent (buffer
, spc
+2);
2320 pp_right_brace (buffer
);
2326 op0
= GOTO_DESTINATION (node
);
2327 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
2329 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2330 if (strcmp (name
, "break") == 0
2331 || strcmp (name
, "continue") == 0)
2333 pp_string (buffer
, name
);
2337 pp_string (buffer
, "goto ");
2338 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2342 pp_string (buffer
, "__asm__");
2343 if (ASM_VOLATILE_P (node
))
2344 pp_string (buffer
, " __volatile__");
2345 pp_left_paren (buffer
);
2346 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
2348 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
2350 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
2351 if (ASM_CLOBBERS (node
))
2354 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
2356 pp_right_paren (buffer
);
2359 case CASE_LABEL_EXPR
:
2360 if (CASE_LOW (node
) && CASE_HIGH (node
))
2362 pp_string (buffer
, "case ");
2363 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2364 pp_string (buffer
, " ... ");
2365 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
2367 else if (CASE_LOW (node
))
2369 pp_string (buffer
, "case ");
2370 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2373 pp_string (buffer
, "default");
2378 pp_string (buffer
, "OBJ_TYPE_REF(");
2379 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
2380 pp_semicolon (buffer
);
2381 if (!(flags
& TDF_SLIM
) && virtual_method_call_p (node
))
2383 pp_string (buffer
, "(");
2384 dump_generic_node (buffer
, obj_type_ref_class (node
), spc
, flags
, false);
2385 pp_string (buffer
, ")");
2387 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
2389 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
2390 pp_right_paren (buffer
);
2394 if (SSA_NAME_IDENTIFIER (node
))
2395 dump_generic_node (buffer
, SSA_NAME_IDENTIFIER (node
),
2397 pp_underscore (buffer
);
2398 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
2399 if (SSA_NAME_IS_DEFAULT_DEF (node
))
2400 pp_string (buffer
, "(D)");
2401 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
2402 pp_string (buffer
, "(ab)");
2405 case WITH_SIZE_EXPR
:
2406 pp_string (buffer
, "WITH_SIZE_EXPR <");
2407 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2408 pp_string (buffer
, ", ");
2409 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2410 pp_greater (buffer
);
2414 pp_string (buffer
, "ASSERT_EXPR <");
2415 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
2416 pp_string (buffer
, ", ");
2417 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
2418 pp_greater (buffer
);
2422 pp_string (buffer
, "scev_known");
2425 case SCEV_NOT_KNOWN
:
2426 pp_string (buffer
, "scev_not_known");
2429 case POLYNOMIAL_CHREC
:
2430 pp_left_brace (buffer
);
2431 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
2432 pp_string (buffer
, ", +, ");
2433 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
2434 pp_string (buffer
, "}_");
2435 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
2439 case REALIGN_LOAD_EXPR
:
2440 pp_string (buffer
, "REALIGN_LOAD <");
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_greater (buffer
);
2450 pp_string (buffer
, " VEC_COND_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
, " > ");
2460 pp_string (buffer
, " VEC_PERM_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
, " DOT_PROD_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
, " > ");
2479 case WIDEN_MULT_PLUS_EXPR
:
2480 pp_string (buffer
, " WIDEN_MULT_PLUS_EXPR < ");
2481 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2482 pp_string (buffer
, ", ");
2483 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2484 pp_string (buffer
, ", ");
2485 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2486 pp_string (buffer
, " > ");
2489 case WIDEN_MULT_MINUS_EXPR
:
2490 pp_string (buffer
, " WIDEN_MULT_MINUS_EXPR < ");
2491 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2492 pp_string (buffer
, ", ");
2493 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2494 pp_string (buffer
, ", ");
2495 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2496 pp_string (buffer
, " > ");
2500 pp_string (buffer
, " FMA_EXPR < ");
2501 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2502 pp_string (buffer
, ", ");
2503 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2504 pp_string (buffer
, ", ");
2505 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2506 pp_string (buffer
, " > ");
2510 pp_string (buffer
, "#pragma acc parallel");
2511 dump_omp_clauses (buffer
, OACC_PARALLEL_CLAUSES (node
), spc
, flags
);
2515 pp_string (buffer
, "#pragma acc kernels");
2516 dump_omp_clauses (buffer
, OACC_KERNELS_CLAUSES (node
), spc
, flags
);
2520 pp_string (buffer
, "#pragma acc data");
2521 dump_omp_clauses (buffer
, OACC_DATA_CLAUSES (node
), spc
, flags
);
2524 case OACC_HOST_DATA
:
2525 pp_string (buffer
, "#pragma acc host_data");
2526 dump_omp_clauses (buffer
, OACC_HOST_DATA_CLAUSES (node
), spc
, flags
);
2530 pp_string (buffer
, "#pragma acc declare");
2531 dump_omp_clauses (buffer
, OACC_DECLARE_CLAUSES (node
), spc
, flags
);
2535 pp_string (buffer
, "#pragma acc update");
2536 dump_omp_clauses (buffer
, OACC_UPDATE_CLAUSES (node
), spc
, flags
);
2539 case OACC_ENTER_DATA
:
2540 pp_string (buffer
, "#pragma acc enter data");
2541 dump_omp_clauses (buffer
, OACC_ENTER_DATA_CLAUSES (node
), spc
, flags
);
2544 case OACC_EXIT_DATA
:
2545 pp_string (buffer
, "#pragma acc exit data");
2546 dump_omp_clauses (buffer
, OACC_EXIT_DATA_CLAUSES (node
), spc
, flags
);
2550 pp_string (buffer
, "#pragma acc wait");
2551 dump_omp_clauses (buffer
, OACC_WAIT_CLAUSES (node
), spc
, flags
);
2555 pp_string (buffer
, "#pragma acc cache");
2556 dump_omp_clauses (buffer
, OACC_CACHE_CLAUSES(node
), spc
, flags
);
2560 pp_string (buffer
, "#pragma omp parallel");
2561 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
2564 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
2566 newline_and_indent (buffer
, spc
+ 2);
2567 pp_left_brace (buffer
);
2568 newline_and_indent (buffer
, spc
+ 4);
2569 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
2570 newline_and_indent (buffer
, spc
+ 2);
2571 pp_right_brace (buffer
);
2577 pp_string (buffer
, "#pragma omp task");
2578 dump_omp_clauses (buffer
, OMP_TASK_CLAUSES (node
), spc
, flags
);
2582 pp_string (buffer
, "#pragma omp for");
2586 pp_string (buffer
, "#pragma omp simd");
2590 pp_string (buffer
, "#pragma simd");
2594 /* This label points one line after dumping the clauses.
2595 For _Cilk_for the clauses are dumped after the _Cilk_for (...)
2596 parameters are printed out. */
2597 goto dump_omp_loop_cilk_for
;
2599 case OMP_DISTRIBUTE
:
2600 pp_string (buffer
, "#pragma omp distribute");
2604 pp_string (buffer
, "#pragma acc loop");
2608 pp_string (buffer
, "#pragma omp teams");
2609 dump_omp_clauses (buffer
, OMP_TEAMS_CLAUSES (node
), spc
, flags
);
2612 case OMP_TARGET_DATA
:
2613 pp_string (buffer
, "#pragma omp target data");
2614 dump_omp_clauses (buffer
, OMP_TARGET_DATA_CLAUSES (node
), spc
, flags
);
2618 pp_string (buffer
, "#pragma omp target");
2619 dump_omp_clauses (buffer
, OMP_TARGET_CLAUSES (node
), spc
, flags
);
2622 case OMP_TARGET_UPDATE
:
2623 pp_string (buffer
, "#pragma omp target update");
2624 dump_omp_clauses (buffer
, OMP_TARGET_UPDATE_CLAUSES (node
), spc
, flags
);
2629 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2631 dump_omp_loop_cilk_for
:
2632 if (!(flags
& TDF_SLIM
))
2636 if (OMP_FOR_PRE_BODY (node
))
2638 if (TREE_CODE (node
) == CILK_FOR
)
2639 pp_string (buffer
, " ");
2641 newline_and_indent (buffer
, spc
+ 2);
2642 pp_left_brace (buffer
);
2644 newline_and_indent (buffer
, spc
);
2645 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
2648 if (OMP_FOR_INIT (node
))
2651 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
2654 if (TREE_CODE (node
) != CILK_FOR
|| OMP_FOR_PRE_BODY (node
))
2655 newline_and_indent (buffer
, spc
);
2656 if (TREE_CODE (node
) == CILK_FOR
)
2657 pp_string (buffer
, "_Cilk_for (");
2659 pp_string (buffer
, "for (");
2660 dump_generic_node (buffer
,
2661 TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
2663 pp_string (buffer
, "; ");
2664 dump_generic_node (buffer
,
2665 TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
2667 pp_string (buffer
, "; ");
2668 dump_generic_node (buffer
,
2669 TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
2671 pp_right_paren (buffer
);
2673 if (TREE_CODE (node
) == CILK_FOR
)
2674 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2676 if (OMP_FOR_BODY (node
))
2678 newline_and_indent (buffer
, spc
+ 2);
2679 pp_left_brace (buffer
);
2680 newline_and_indent (buffer
, spc
+ 4);
2681 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
2683 newline_and_indent (buffer
, spc
+ 2);
2684 pp_right_brace (buffer
);
2686 if (OMP_FOR_INIT (node
))
2687 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
2688 if (OMP_FOR_PRE_BODY (node
))
2691 newline_and_indent (buffer
, spc
+ 2);
2692 pp_right_brace (buffer
);
2699 pp_string (buffer
, "#pragma omp sections");
2700 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
2704 pp_string (buffer
, "#pragma omp section");
2708 pp_string (buffer
, "#pragma omp master");
2712 pp_string (buffer
, "#pragma omp taskgroup");
2716 pp_string (buffer
, "#pragma omp ordered");
2720 pp_string (buffer
, "#pragma omp critical");
2721 if (OMP_CRITICAL_NAME (node
))
2724 pp_left_paren (buffer
);
2725 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
2727 pp_right_paren (buffer
);
2732 pp_string (buffer
, "#pragma omp atomic");
2733 if (OMP_ATOMIC_SEQ_CST (node
))
2734 pp_string (buffer
, " seq_cst");
2735 newline_and_indent (buffer
, spc
+ 2);
2736 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2740 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2743 case OMP_ATOMIC_READ
:
2744 pp_string (buffer
, "#pragma omp atomic read");
2745 if (OMP_ATOMIC_SEQ_CST (node
))
2746 pp_string (buffer
, " seq_cst");
2747 newline_and_indent (buffer
, spc
+ 2);
2748 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2752 case OMP_ATOMIC_CAPTURE_OLD
:
2753 case OMP_ATOMIC_CAPTURE_NEW
:
2754 pp_string (buffer
, "#pragma omp atomic capture");
2755 if (OMP_ATOMIC_SEQ_CST (node
))
2756 pp_string (buffer
, " seq_cst");
2757 newline_and_indent (buffer
, spc
+ 2);
2758 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2762 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2766 pp_string (buffer
, "#pragma omp single");
2767 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
2771 dump_omp_clause (buffer
, node
, spc
, flags
);
2775 case TRANSACTION_EXPR
:
2776 if (TRANSACTION_EXPR_OUTER (node
))
2777 pp_string (buffer
, "__transaction_atomic [[outer]]");
2778 else if (TRANSACTION_EXPR_RELAXED (node
))
2779 pp_string (buffer
, "__transaction_relaxed");
2781 pp_string (buffer
, "__transaction_atomic");
2782 if (!(flags
& TDF_SLIM
) && TRANSACTION_EXPR_BODY (node
))
2784 newline_and_indent (buffer
, spc
);
2785 pp_left_brace (buffer
);
2786 newline_and_indent (buffer
, spc
+ 2);
2787 dump_generic_node (buffer
, TRANSACTION_EXPR_BODY (node
),
2788 spc
+ 2, flags
, false);
2789 newline_and_indent (buffer
, spc
);
2790 pp_right_brace (buffer
);
2795 case REDUC_MAX_EXPR
:
2796 pp_string (buffer
, " REDUC_MAX_EXPR < ");
2797 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2798 pp_string (buffer
, " > ");
2801 case REDUC_MIN_EXPR
:
2802 pp_string (buffer
, " REDUC_MIN_EXPR < ");
2803 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2804 pp_string (buffer
, " > ");
2807 case REDUC_PLUS_EXPR
:
2808 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
2809 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2810 pp_string (buffer
, " > ");
2813 case VEC_WIDEN_MULT_HI_EXPR
:
2814 case VEC_WIDEN_MULT_LO_EXPR
:
2815 case VEC_WIDEN_MULT_EVEN_EXPR
:
2816 case VEC_WIDEN_MULT_ODD_EXPR
:
2817 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2818 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2820 for (str
= get_tree_code_name (code
); *str
; str
++)
2821 pp_character (buffer
, TOUPPER (*str
));
2822 pp_string (buffer
, " < ");
2823 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2824 pp_string (buffer
, ", ");
2825 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2826 pp_string (buffer
, " > ");
2829 case VEC_UNPACK_HI_EXPR
:
2830 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
2831 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2832 pp_string (buffer
, " > ");
2835 case VEC_UNPACK_LO_EXPR
:
2836 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
2837 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2838 pp_string (buffer
, " > ");
2841 case VEC_UNPACK_FLOAT_HI_EXPR
:
2842 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2843 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2844 pp_string (buffer
, " > ");
2847 case VEC_UNPACK_FLOAT_LO_EXPR
:
2848 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2849 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2850 pp_string (buffer
, " > ");
2853 case VEC_PACK_TRUNC_EXPR
:
2854 pp_string (buffer
, " VEC_PACK_TRUNC_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_SAT_EXPR
:
2862 pp_string (buffer
, " VEC_PACK_SAT_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
, " > ");
2869 case VEC_PACK_FIX_TRUNC_EXPR
:
2870 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2871 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2872 pp_string (buffer
, ", ");
2873 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2874 pp_string (buffer
, " > ");
2878 dump_block_node (buffer
, node
, spc
, flags
);
2881 case CILK_SPAWN_STMT
:
2882 pp_string (buffer
, "_Cilk_spawn ");
2883 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2886 case CILK_SYNC_STMT
:
2887 pp_string (buffer
, "_Cilk_sync");
2894 if (is_stmt
&& is_expr
)
2895 pp_semicolon (buffer
);
2900 /* Print the declaration of a variable. */
2903 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2907 if (TREE_CODE(t
) == NAMELIST_DECL
)
2909 pp_string(buffer
, "namelist ");
2910 dump_decl_name (buffer
, t
, flags
);
2911 pp_semicolon (buffer
);
2915 if (TREE_CODE (t
) == TYPE_DECL
)
2916 pp_string (buffer
, "typedef ");
2918 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2919 pp_string (buffer
, "register ");
2921 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2922 pp_string (buffer
, "extern ");
2923 else if (TREE_STATIC (t
))
2924 pp_string (buffer
, "static ");
2926 /* Print the type and name. */
2927 if (TREE_TYPE (t
) && TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2931 /* Print array's type. */
2932 tmp
= TREE_TYPE (t
);
2933 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2934 tmp
= TREE_TYPE (tmp
);
2935 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2937 /* Print variable's name. */
2939 dump_generic_node (buffer
, t
, spc
, flags
, false);
2941 /* Print the dimensions. */
2942 tmp
= TREE_TYPE (t
);
2943 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2945 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2946 tmp
= TREE_TYPE (tmp
);
2949 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2951 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2953 dump_decl_name (buffer
, t
, flags
);
2954 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2958 /* Print type declaration. */
2959 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2961 /* Print variable's name. */
2963 dump_generic_node (buffer
, t
, spc
, flags
, false);
2966 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2968 pp_string (buffer
, " __asm__ ");
2969 pp_left_paren (buffer
);
2970 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2971 pp_right_paren (buffer
);
2974 /* The initial value of a function serves to determine whether the function
2975 is declared or defined. So the following does not apply to function
2977 if (TREE_CODE (t
) != FUNCTION_DECL
)
2979 /* Print the initial value. */
2980 if (DECL_INITIAL (t
))
2985 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2989 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2991 pp_string (buffer
, " [value-expr: ");
2992 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2993 pp_right_bracket (buffer
);
2996 pp_semicolon (buffer
);
3000 /* Prints a structure: name, fields, and methods.
3001 FIXME: Still incomplete. */
3004 print_struct_decl (pretty_printer
*buffer
, const_tree node
, int spc
, int flags
)
3006 /* Print the name of the structure. */
3007 if (TYPE_NAME (node
))
3010 if (TREE_CODE (node
) == RECORD_TYPE
)
3011 pp_string (buffer
, "struct ");
3012 else if ((TREE_CODE (node
) == UNION_TYPE
3013 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
3014 pp_string (buffer
, "union ");
3016 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
3019 /* Print the contents of the structure. */
3020 pp_newline (buffer
);
3022 pp_left_brace (buffer
);
3023 pp_newline (buffer
);
3025 /* Print the fields of the structure. */
3028 tmp
= TYPE_FIELDS (node
);
3031 /* Avoid to print recursively the structure. */
3032 /* FIXME : Not implemented correctly...,
3033 what about the case when we have a cycle in the contain graph? ...
3034 Maybe this could be solved by looking at the scope in which the
3035 structure was declared. */
3036 if (TREE_TYPE (tmp
) != node
3037 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
3038 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
3040 print_declaration (buffer
, tmp
, spc
+2, flags
);
3041 pp_newline (buffer
);
3043 tmp
= DECL_CHAIN (tmp
);
3047 pp_right_brace (buffer
);
3050 /* Return the priority of the operator CODE.
3052 From lowest to highest precedence with either left-to-right (L-R)
3053 or right-to-left (R-L) associativity]:
3056 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
3068 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
3069 15 [L-R] fn() [] -> .
3071 unary +, - and * have higher precedence than the corresponding binary
3075 op_code_prio (enum tree_code code
)
3092 case TRUTH_ORIF_EXPR
:
3095 case TRUTH_AND_EXPR
:
3096 case TRUTH_ANDIF_EXPR
:
3103 case TRUTH_XOR_EXPR
:
3120 case UNORDERED_EXPR
:
3131 case VEC_WIDEN_LSHIFT_HI_EXPR
:
3132 case VEC_WIDEN_LSHIFT_LO_EXPR
:
3133 case WIDEN_LSHIFT_EXPR
:
3136 case WIDEN_SUM_EXPR
:
3138 case POINTER_PLUS_EXPR
:
3142 case VEC_WIDEN_MULT_HI_EXPR
:
3143 case VEC_WIDEN_MULT_LO_EXPR
:
3144 case WIDEN_MULT_EXPR
:
3146 case WIDEN_MULT_PLUS_EXPR
:
3147 case WIDEN_MULT_MINUS_EXPR
:
3149 case MULT_HIGHPART_EXPR
:
3150 case TRUNC_DIV_EXPR
:
3152 case FLOOR_DIV_EXPR
:
3153 case ROUND_DIV_EXPR
:
3155 case EXACT_DIV_EXPR
:
3156 case TRUNC_MOD_EXPR
:
3158 case FLOOR_MOD_EXPR
:
3159 case ROUND_MOD_EXPR
:
3163 case TRUTH_NOT_EXPR
:
3165 case POSTINCREMENT_EXPR
:
3166 case POSTDECREMENT_EXPR
:
3167 case PREINCREMENT_EXPR
:
3168 case PREDECREMENT_EXPR
:
3174 case FIX_TRUNC_EXPR
:
3180 case ARRAY_RANGE_REF
:
3184 /* Special expressions. */
3190 case REDUC_MAX_EXPR
:
3191 case REDUC_MIN_EXPR
:
3192 case REDUC_PLUS_EXPR
:
3193 case VEC_RSHIFT_EXPR
:
3194 case VEC_UNPACK_HI_EXPR
:
3195 case VEC_UNPACK_LO_EXPR
:
3196 case VEC_UNPACK_FLOAT_HI_EXPR
:
3197 case VEC_UNPACK_FLOAT_LO_EXPR
:
3198 case VEC_PACK_TRUNC_EXPR
:
3199 case VEC_PACK_SAT_EXPR
:
3203 /* Return an arbitrarily high precedence to avoid surrounding single
3204 VAR_DECLs in ()s. */
3209 /* Return the priority of the operator OP. */
3212 op_prio (const_tree op
)
3214 enum tree_code code
;
3219 code
= TREE_CODE (op
);
3220 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
3221 return op_prio (TREE_OPERAND (op
, 0));
3223 return op_code_prio (code
);
3226 /* Return the symbol associated with operator CODE. */
3229 op_symbol_code (enum tree_code code
)
3237 case TRUTH_ORIF_EXPR
:
3240 case TRUTH_AND_EXPR
:
3241 case TRUTH_ANDIF_EXPR
:
3247 case TRUTH_XOR_EXPR
:
3257 case UNORDERED_EXPR
:
3303 case VEC_RSHIFT_EXPR
:
3306 case WIDEN_LSHIFT_EXPR
:
3309 case POINTER_PLUS_EXPR
:
3315 case REDUC_PLUS_EXPR
:
3318 case WIDEN_SUM_EXPR
:
3321 case WIDEN_MULT_EXPR
:
3324 case MULT_HIGHPART_EXPR
:
3334 case TRUTH_NOT_EXPR
:
3341 case TRUNC_DIV_EXPR
:
3348 case FLOOR_DIV_EXPR
:
3351 case ROUND_DIV_EXPR
:
3354 case EXACT_DIV_EXPR
:
3357 case TRUNC_MOD_EXPR
:
3363 case FLOOR_MOD_EXPR
:
3366 case ROUND_MOD_EXPR
:
3369 case PREDECREMENT_EXPR
:
3372 case PREINCREMENT_EXPR
:
3375 case POSTDECREMENT_EXPR
:
3378 case POSTINCREMENT_EXPR
:
3388 return "<<< ??? >>>";
3392 /* Return the symbol associated with operator OP. */
3395 op_symbol (const_tree op
)
3397 return op_symbol_code (TREE_CODE (op
));
3400 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
3401 the gimple_call_fn of a GIMPLE_CALL. */
3404 print_call_name (pretty_printer
*buffer
, tree node
, int flags
)
3408 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
3409 op0
= TREE_OPERAND (op0
, 0);
3412 switch (TREE_CODE (op0
))
3417 dump_function_name (buffer
, op0
, flags
);
3423 op0
= TREE_OPERAND (op0
, 0);
3427 pp_left_paren (buffer
);
3428 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, flags
, false);
3429 pp_string (buffer
, ") ? ");
3430 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, flags
, false);
3431 pp_string (buffer
, " : ");
3432 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, flags
, false);
3436 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
3437 dump_function_name (buffer
, TREE_OPERAND (op0
, 0), flags
);
3439 dump_generic_node (buffer
, op0
, 0, flags
, false);
3443 if (integer_zerop (TREE_OPERAND (op0
, 1)))
3445 op0
= TREE_OPERAND (op0
, 0);
3452 dump_generic_node (buffer
, op0
, 0, flags
, false);
3460 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
3463 pretty_print_string (pretty_printer
*buffer
, const char *str
)
3473 pp_string (buffer
, "\\b");
3477 pp_string (buffer
, "\\f");
3481 pp_string (buffer
, "\\n");
3485 pp_string (buffer
, "\\r");
3489 pp_string (buffer
, "\\t");
3493 pp_string (buffer
, "\\v");
3497 pp_string (buffer
, "\\\\");
3501 pp_string (buffer
, "\\\"");
3505 pp_string (buffer
, "\\'");
3508 /* No need to handle \0; the loop terminates on \0. */
3511 pp_string (buffer
, "\\1");
3515 pp_string (buffer
, "\\2");
3519 pp_string (buffer
, "\\3");
3523 pp_string (buffer
, "\\4");
3527 pp_string (buffer
, "\\5");
3531 pp_string (buffer
, "\\6");
3535 pp_string (buffer
, "\\7");
3539 pp_character (buffer
, str
[0]);
3547 maybe_init_pretty_print (FILE *file
)
3551 new (&buffer
) pretty_printer ();
3552 pp_needs_newline (&buffer
) = true;
3553 pp_translate_identifiers (&buffer
) = false;
3557 buffer
.buffer
->stream
= file
;
3561 newline_and_indent (pretty_printer
*buffer
, int spc
)
3563 pp_newline (buffer
);
3567 /* Handle a %K format for TEXT. Separate from default_tree_printer so
3568 it can also be used in front ends.
3569 %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
3573 percent_K_format (text_info
*text
)
3575 tree t
= va_arg (*text
->args_ptr
, tree
), block
;
3576 gcc_assert (text
->locus
!= NULL
);
3577 *text
->locus
= EXPR_LOCATION (t
);
3578 gcc_assert (pp_ti_abstract_origin (text
) != NULL
);
3579 block
= TREE_BLOCK (t
);
3580 *pp_ti_abstract_origin (text
) = NULL
;
3584 /* ??? LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those
3585 representing the outermost block of an inlined function.
3586 So walk the BLOCK tree until we hit such a scope. */
3588 && TREE_CODE (block
) == BLOCK
)
3590 if (inlined_function_outer_scope_p (block
))
3592 *pp_ti_abstract_origin (text
) = block
;
3595 block
= BLOCK_SUPERCONTEXT (block
);
3601 && TREE_CODE (block
) == BLOCK
3602 && BLOCK_ABSTRACT_ORIGIN (block
))
3604 tree ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3606 while (TREE_CODE (ao
) == BLOCK
3607 && BLOCK_ABSTRACT_ORIGIN (ao
)
3608 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3609 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3611 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3613 *pp_ti_abstract_origin (text
) = block
;
3616 block
= BLOCK_SUPERCONTEXT (block
);
3620 /* Print the identifier ID to PRETTY-PRINTER. */
3623 pp_tree_identifier (pretty_printer
*pp
, tree id
)
3625 if (pp_translate_identifiers (pp
))
3627 const char *text
= identifier_to_locale (IDENTIFIER_POINTER (id
));
3628 pp_append_text (pp
, text
, text
+ strlen (text
));
3631 pp_append_text (pp
, IDENTIFIER_POINTER (id
),
3632 IDENTIFIER_POINTER (id
) + IDENTIFIER_LENGTH (id
));
3635 /* A helper function that is used to dump function information before the
3639 dump_function_header (FILE *dump_file
, tree fdecl
, int flags
)
3641 const char *dname
, *aname
;
3642 struct cgraph_node
*node
= cgraph_node::get (fdecl
);
3643 struct function
*fun
= DECL_STRUCT_FUNCTION (fdecl
);
3645 dname
= lang_hooks
.decl_printable_name (fdecl
, 2);
3647 if (DECL_ASSEMBLER_NAME_SET_P (fdecl
))
3648 aname
= (IDENTIFIER_POINTER
3649 (DECL_ASSEMBLER_NAME (fdecl
)));
3651 aname
= "<unset-asm-name>";
3653 fprintf (dump_file
, "\n;; Function %s (%s, funcdef_no=%d",
3654 dname
, aname
, fun
->funcdef_no
);
3655 if (!(flags
& TDF_NOUID
))
3656 fprintf (dump_file
, ", decl_uid=%d", DECL_UID (fdecl
));
3659 fprintf (dump_file
, ", cgraph_uid=%d", node
->uid
);
3660 fprintf (dump_file
, ", symbol_order=%d)%s\n\n", node
->order
,
3661 node
->frequency
== NODE_FREQUENCY_HOT
3663 : node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
3664 ? " (unlikely executed)"
3665 : node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
3666 ? " (executed once)"
3670 fprintf (dump_file
, ")\n\n");
3673 /* Dump double_int D to pretty_printer PP. UNS is true
3674 if D is unsigned and false otherwise. */
3676 pp_double_int (pretty_printer
*pp
, double_int d
, bool uns
)
3679 pp_wide_integer (pp
, d
.low
);
3680 else if (d
.fits_uhwi ())
3681 pp_unsigned_wide_integer (pp
, d
.low
);
3684 unsigned HOST_WIDE_INT low
= d
.low
;
3685 HOST_WIDE_INT high
= d
.high
;
3686 if (!uns
&& d
.is_negative ())
3689 high
= ~high
+ !low
;
3692 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
3694 sprintf (pp_buffer (pp
)->digit_buffer
,
3695 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
3696 (unsigned HOST_WIDE_INT
) high
, low
);
3697 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);