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"
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_
:
331 pp_string (buffer
, name
);
332 pp_left_paren (buffer
);
333 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
335 pp_right_paren (buffer
);
338 case OMP_CLAUSE_REDUCTION
:
339 pp_string (buffer
, "reduction(");
340 if (OMP_CLAUSE_REDUCTION_CODE (clause
) != ERROR_MARK
)
343 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause
)));
346 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
348 pp_right_paren (buffer
);
352 pp_string (buffer
, "if(");
353 dump_generic_node (buffer
, OMP_CLAUSE_IF_EXPR (clause
),
355 pp_right_paren (buffer
);
358 case OMP_CLAUSE_NUM_THREADS
:
359 pp_string (buffer
, "num_threads(");
360 dump_generic_node (buffer
, OMP_CLAUSE_NUM_THREADS_EXPR (clause
),
362 pp_right_paren (buffer
);
365 case OMP_CLAUSE_NOWAIT
:
366 pp_string (buffer
, "nowait");
368 case OMP_CLAUSE_ORDERED
:
369 pp_string (buffer
, "ordered");
372 case OMP_CLAUSE_DEFAULT
:
373 pp_string (buffer
, "default(");
374 switch (OMP_CLAUSE_DEFAULT_KIND (clause
))
376 case OMP_CLAUSE_DEFAULT_UNSPECIFIED
:
378 case OMP_CLAUSE_DEFAULT_SHARED
:
379 pp_string (buffer
, "shared");
381 case OMP_CLAUSE_DEFAULT_NONE
:
382 pp_string (buffer
, "none");
384 case OMP_CLAUSE_DEFAULT_PRIVATE
:
385 pp_string (buffer
, "private");
387 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE
:
388 pp_string (buffer
, "firstprivate");
393 pp_right_paren (buffer
);
396 case OMP_CLAUSE_SCHEDULE
:
397 pp_string (buffer
, "schedule(");
398 switch (OMP_CLAUSE_SCHEDULE_KIND (clause
))
400 case OMP_CLAUSE_SCHEDULE_STATIC
:
401 pp_string (buffer
, "static");
403 case OMP_CLAUSE_SCHEDULE_DYNAMIC
:
404 pp_string (buffer
, "dynamic");
406 case OMP_CLAUSE_SCHEDULE_GUIDED
:
407 pp_string (buffer
, "guided");
409 case OMP_CLAUSE_SCHEDULE_RUNTIME
:
410 pp_string (buffer
, "runtime");
412 case OMP_CLAUSE_SCHEDULE_AUTO
:
413 pp_string (buffer
, "auto");
418 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
))
421 dump_generic_node (buffer
, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause
),
424 pp_right_paren (buffer
);
427 case OMP_CLAUSE_UNTIED
:
428 pp_string (buffer
, "untied");
431 case OMP_CLAUSE_COLLAPSE
:
432 pp_string (buffer
, "collapse(");
433 dump_generic_node (buffer
, OMP_CLAUSE_COLLAPSE_EXPR (clause
),
435 pp_right_paren (buffer
);
438 case OMP_CLAUSE_FINAL
:
439 pp_string (buffer
, "final(");
440 dump_generic_node (buffer
, OMP_CLAUSE_FINAL_EXPR (clause
),
442 pp_right_paren (buffer
);
445 case OMP_CLAUSE_MERGEABLE
:
446 pp_string (buffer
, "mergeable");
449 case OMP_CLAUSE_LINEAR
:
450 pp_string (buffer
, "linear(");
451 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
454 dump_generic_node (buffer
, OMP_CLAUSE_LINEAR_STEP (clause
),
456 pp_right_paren (buffer
);
459 case OMP_CLAUSE_ALIGNED
:
460 pp_string (buffer
, "aligned(");
461 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
463 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
))
466 dump_generic_node (buffer
, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause
),
469 pp_right_paren (buffer
);
472 case OMP_CLAUSE_DEPEND
:
473 pp_string (buffer
, "depend(");
474 switch (OMP_CLAUSE_DEPEND_KIND (clause
))
476 case OMP_CLAUSE_DEPEND_IN
:
477 pp_string (buffer
, "in");
479 case OMP_CLAUSE_DEPEND_OUT
:
480 pp_string (buffer
, "out");
482 case OMP_CLAUSE_DEPEND_INOUT
:
483 pp_string (buffer
, "inout");
489 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
491 pp_right_paren (buffer
);
495 pp_string (buffer
, "map(");
496 switch (OMP_CLAUSE_MAP_KIND (clause
))
498 case OMP_CLAUSE_MAP_ALLOC
:
499 case OMP_CLAUSE_MAP_POINTER
:
500 pp_string (buffer
, "alloc");
502 case OMP_CLAUSE_MAP_TO
:
503 pp_string (buffer
, "to");
505 case OMP_CLAUSE_MAP_FROM
:
506 pp_string (buffer
, "from");
508 case OMP_CLAUSE_MAP_TOFROM
:
509 pp_string (buffer
, "tofrom");
515 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
518 if (OMP_CLAUSE_SIZE (clause
))
520 if (OMP_CLAUSE_CODE (clause
) == OMP_CLAUSE_MAP
521 && OMP_CLAUSE_MAP_KIND (clause
) == OMP_CLAUSE_MAP_POINTER
)
522 pp_string (buffer
, " [pointer assign, bias: ");
524 pp_string (buffer
, " [len: ");
525 dump_generic_node (buffer
, OMP_CLAUSE_SIZE (clause
),
527 pp_right_bracket (buffer
);
529 pp_right_paren (buffer
);
532 case OMP_CLAUSE_FROM
:
533 pp_string (buffer
, "from(");
534 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
536 goto print_clause_size
;
539 pp_string (buffer
, "to(");
540 dump_generic_node (buffer
, OMP_CLAUSE_DECL (clause
),
542 goto print_clause_size
;
544 case OMP_CLAUSE_NUM_TEAMS
:
545 pp_string (buffer
, "num_teams(");
546 dump_generic_node (buffer
, OMP_CLAUSE_NUM_TEAMS_EXPR (clause
),
548 pp_right_paren (buffer
);
551 case OMP_CLAUSE_THREAD_LIMIT
:
552 pp_string (buffer
, "thread_limit(");
553 dump_generic_node (buffer
, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause
),
555 pp_right_paren (buffer
);
558 case OMP_CLAUSE_DEVICE
:
559 pp_string (buffer
, "device(");
560 dump_generic_node (buffer
, OMP_CLAUSE_DEVICE_ID (clause
),
562 pp_right_paren (buffer
);
565 case OMP_CLAUSE_DIST_SCHEDULE
:
566 pp_string (buffer
, "dist_schedule(static");
567 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
))
570 dump_generic_node (buffer
,
571 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause
),
574 pp_right_paren (buffer
);
577 case OMP_CLAUSE_PROC_BIND
:
578 pp_string (buffer
, "proc_bind(");
579 switch (OMP_CLAUSE_PROC_BIND_KIND (clause
))
581 case OMP_CLAUSE_PROC_BIND_MASTER
:
582 pp_string (buffer
, "master");
584 case OMP_CLAUSE_PROC_BIND_CLOSE
:
585 pp_string (buffer
, "close");
587 case OMP_CLAUSE_PROC_BIND_SPREAD
:
588 pp_string (buffer
, "spread");
593 pp_right_paren (buffer
);
596 case OMP_CLAUSE_SAFELEN
:
597 pp_string (buffer
, "safelen(");
598 dump_generic_node (buffer
, OMP_CLAUSE_SAFELEN_EXPR (clause
),
600 pp_right_paren (buffer
);
603 case OMP_CLAUSE_SIMDLEN
:
604 pp_string (buffer
, "simdlen(");
605 dump_generic_node (buffer
, OMP_CLAUSE_SIMDLEN_EXPR (clause
),
607 pp_right_paren (buffer
);
610 case OMP_CLAUSE__SIMDUID_
:
611 pp_string (buffer
, "_simduid_(");
612 dump_generic_node (buffer
, OMP_CLAUSE__SIMDUID__DECL (clause
),
614 pp_right_paren (buffer
);
617 case OMP_CLAUSE_INBRANCH
:
618 pp_string (buffer
, "inbranch");
620 case OMP_CLAUSE_NOTINBRANCH
:
621 pp_string (buffer
, "notinbranch");
624 pp_string (buffer
, "for");
626 case OMP_CLAUSE_PARALLEL
:
627 pp_string (buffer
, "parallel");
629 case OMP_CLAUSE_SECTIONS
:
630 pp_string (buffer
, "sections");
632 case OMP_CLAUSE_TASKGROUP
:
633 pp_string (buffer
, "taskgroup");
637 /* Should never happen. */
638 dump_generic_node (buffer
, clause
, spc
, flags
, false);
644 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
645 dump_generic_node. */
648 dump_omp_clauses (pretty_printer
*buffer
, tree clause
, int spc
, int flags
)
656 dump_omp_clause (buffer
, clause
, spc
, flags
);
657 clause
= OMP_CLAUSE_CHAIN (clause
);
665 /* Dump location LOC to BUFFER. */
668 dump_location (pretty_printer
*buffer
, location_t loc
)
670 expanded_location xloc
= expand_location (loc
);
672 pp_left_bracket (buffer
);
675 pp_string (buffer
, xloc
.file
);
676 pp_string (buffer
, " : ");
678 pp_decimal_int (buffer
, xloc
.line
);
679 pp_string (buffer
, "] ");
683 /* Dump lexical block BLOCK. BUFFER, SPC and FLAGS are as in
684 dump_generic_node. */
687 dump_block_node (pretty_printer
*buffer
, tree block
, int spc
, int flags
)
691 pp_printf (buffer
, "BLOCK #%d ", BLOCK_NUMBER (block
));
693 if (flags
& TDF_ADDRESS
)
694 pp_printf (buffer
, "[%p] ", (void *) block
);
696 if (BLOCK_ABSTRACT (block
))
697 pp_string (buffer
, "[abstract] ");
699 if (TREE_ASM_WRITTEN (block
))
700 pp_string (buffer
, "[written] ");
702 if (flags
& TDF_SLIM
)
705 if (BLOCK_SOURCE_LOCATION (block
))
706 dump_location (buffer
, BLOCK_SOURCE_LOCATION (block
));
708 newline_and_indent (buffer
, spc
+ 2);
710 if (BLOCK_SUPERCONTEXT (block
))
712 pp_string (buffer
, "SUPERCONTEXT: ");
713 dump_generic_node (buffer
, BLOCK_SUPERCONTEXT (block
), 0,
714 flags
| TDF_SLIM
, false);
715 newline_and_indent (buffer
, spc
+ 2);
718 if (BLOCK_SUBBLOCKS (block
))
720 pp_string (buffer
, "SUBBLOCKS: ");
721 for (t
= BLOCK_SUBBLOCKS (block
); t
; t
= BLOCK_CHAIN (t
))
723 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
726 newline_and_indent (buffer
, spc
+ 2);
729 if (BLOCK_CHAIN (block
))
731 pp_string (buffer
, "SIBLINGS: ");
732 for (t
= BLOCK_CHAIN (block
); t
; t
= BLOCK_CHAIN (t
))
734 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
737 newline_and_indent (buffer
, spc
+ 2);
740 if (BLOCK_VARS (block
))
742 pp_string (buffer
, "VARS: ");
743 for (t
= BLOCK_VARS (block
); t
; t
= TREE_CHAIN (t
))
745 dump_generic_node (buffer
, t
, 0, flags
, false);
748 newline_and_indent (buffer
, spc
+ 2);
751 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block
)) > 0)
754 vec
<tree
, va_gc
> *nlv
= BLOCK_NONLOCALIZED_VARS (block
);
756 pp_string (buffer
, "NONLOCALIZED_VARS: ");
757 FOR_EACH_VEC_ELT (*nlv
, i
, t
)
759 dump_generic_node (buffer
, t
, 0, flags
, false);
762 newline_and_indent (buffer
, spc
+ 2);
765 if (BLOCK_ABSTRACT_ORIGIN (block
))
767 pp_string (buffer
, "ABSTRACT_ORIGIN: ");
768 dump_generic_node (buffer
, BLOCK_ABSTRACT_ORIGIN (block
), 0,
769 flags
| TDF_SLIM
, false);
770 newline_and_indent (buffer
, spc
+ 2);
773 if (BLOCK_FRAGMENT_ORIGIN (block
))
775 pp_string (buffer
, "FRAGMENT_ORIGIN: ");
776 dump_generic_node (buffer
, BLOCK_FRAGMENT_ORIGIN (block
), 0,
777 flags
| TDF_SLIM
, false);
778 newline_and_indent (buffer
, spc
+ 2);
781 if (BLOCK_FRAGMENT_CHAIN (block
))
783 pp_string (buffer
, "FRAGMENT_CHAIN: ");
784 for (t
= BLOCK_FRAGMENT_CHAIN (block
); t
; t
= BLOCK_FRAGMENT_CHAIN (t
))
786 dump_generic_node (buffer
, t
, 0, flags
| TDF_SLIM
, false);
789 newline_and_indent (buffer
, spc
+ 2);
794 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
795 indent. FLAGS specifies details to show in the dump (see TDF_* in
796 dumpfile.h). If IS_STMT is true, the object printed is considered
797 to be a statement and it is terminated by ';' if appropriate. */
800 dump_generic_node (pretty_printer
*buffer
, tree node
, int spc
, int flags
,
809 if (node
== NULL_TREE
)
812 is_expr
= EXPR_P (node
);
814 if (is_stmt
&& (flags
& TDF_STMTADDR
))
815 pp_printf (buffer
, "<&%p> ", (void *)node
);
817 if ((flags
& TDF_LINENO
) && EXPR_HAS_LOCATION (node
))
818 dump_location (buffer
, EXPR_LOCATION (node
));
820 code
= TREE_CODE (node
);
824 pp_string (buffer
, "<<< error >>>");
827 case IDENTIFIER_NODE
:
828 pp_tree_identifier (buffer
, node
);
832 while (node
&& node
!= error_mark_node
)
834 if (TREE_PURPOSE (node
))
836 dump_generic_node (buffer
, TREE_PURPOSE (node
), spc
, flags
, false);
839 dump_generic_node (buffer
, TREE_VALUE (node
), spc
, flags
, false);
840 node
= TREE_CHAIN (node
);
841 if (node
&& TREE_CODE (node
) == TREE_LIST
)
850 dump_generic_node (buffer
, BINFO_TYPE (node
), spc
, flags
, false);
856 if (TREE_VEC_LENGTH (node
) > 0)
858 size_t len
= TREE_VEC_LENGTH (node
);
859 for (i
= 0; i
< len
- 1; i
++)
861 dump_generic_node (buffer
, TREE_VEC_ELT (node
, i
), spc
, flags
,
866 dump_generic_node (buffer
, TREE_VEC_ELT (node
, len
- 1), spc
,
875 case FIXED_POINT_TYPE
:
881 unsigned int quals
= TYPE_QUALS (node
);
882 enum tree_code_class tclass
;
884 if (quals
& TYPE_QUAL_ATOMIC
)
885 pp_string (buffer
, "atomic ");
886 if (quals
& TYPE_QUAL_CONST
)
887 pp_string (buffer
, "const ");
888 else if (quals
& TYPE_QUAL_VOLATILE
)
889 pp_string (buffer
, "volatile ");
890 else if (quals
& TYPE_QUAL_RESTRICT
)
891 pp_string (buffer
, "restrict ");
893 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
895 pp_string (buffer
, "<address-space-");
896 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
897 pp_string (buffer
, "> ");
900 tclass
= TREE_CODE_CLASS (TREE_CODE (node
));
902 if (tclass
== tcc_declaration
)
904 if (DECL_NAME (node
))
905 dump_decl_name (buffer
, node
, flags
);
907 pp_string (buffer
, "<unnamed type decl>");
909 else if (tclass
== tcc_type
)
911 if (TYPE_NAME (node
))
913 if (TREE_CODE (TYPE_NAME (node
)) == IDENTIFIER_NODE
)
914 pp_tree_identifier (buffer
, TYPE_NAME (node
));
915 else if (TREE_CODE (TYPE_NAME (node
)) == TYPE_DECL
916 && DECL_NAME (TYPE_NAME (node
)))
917 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
919 pp_string (buffer
, "<unnamed type>");
921 else if (TREE_CODE (node
) == VECTOR_TYPE
)
923 pp_string (buffer
, "vector");
924 pp_left_paren (buffer
);
925 pp_wide_integer (buffer
, TYPE_VECTOR_SUBPARTS (node
));
926 pp_string (buffer
, ") ");
927 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
929 else if (TREE_CODE (node
) == INTEGER_TYPE
)
931 if (TYPE_PRECISION (node
) == CHAR_TYPE_SIZE
)
932 pp_string (buffer
, (TYPE_UNSIGNED (node
)
935 else if (TYPE_PRECISION (node
) == SHORT_TYPE_SIZE
)
936 pp_string (buffer
, (TYPE_UNSIGNED (node
)
939 else if (TYPE_PRECISION (node
) == INT_TYPE_SIZE
)
940 pp_string (buffer
, (TYPE_UNSIGNED (node
)
943 else if (TYPE_PRECISION (node
) == LONG_TYPE_SIZE
)
944 pp_string (buffer
, (TYPE_UNSIGNED (node
)
947 else if (TYPE_PRECISION (node
) == LONG_LONG_TYPE_SIZE
)
948 pp_string (buffer
, (TYPE_UNSIGNED (node
)
949 ? "unsigned long long"
950 : "signed long long"));
951 else if (TYPE_PRECISION (node
) >= CHAR_TYPE_SIZE
952 && exact_log2 (TYPE_PRECISION (node
)) != -1)
954 pp_string (buffer
, (TYPE_UNSIGNED (node
) ? "uint" : "int"));
955 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
956 pp_string (buffer
, "_t");
960 pp_string (buffer
, (TYPE_UNSIGNED (node
)
961 ? "<unnamed-unsigned:"
962 : "<unnamed-signed:"));
963 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
967 else if (TREE_CODE (node
) == COMPLEX_TYPE
)
969 pp_string (buffer
, "__complex__ ");
970 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
972 else if (TREE_CODE (node
) == REAL_TYPE
)
974 pp_string (buffer
, "<float:");
975 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
978 else if (TREE_CODE (node
) == FIXED_POINT_TYPE
)
980 pp_string (buffer
, "<fixed-point-");
981 pp_string (buffer
, TYPE_SATURATING (node
) ? "sat:" : "nonsat:");
982 pp_decimal_int (buffer
, TYPE_PRECISION (node
));
985 else if (TREE_CODE (node
) == VOID_TYPE
)
986 pp_string (buffer
, "void");
988 pp_string (buffer
, "<unnamed type>");
995 str
= (TREE_CODE (node
) == POINTER_TYPE
? "*" : "&");
997 if (TREE_TYPE (node
) == NULL
)
999 pp_string (buffer
, str
);
1000 pp_string (buffer
, "<null type>");
1002 else if (TREE_CODE (TREE_TYPE (node
)) == FUNCTION_TYPE
)
1004 tree fnode
= TREE_TYPE (node
);
1006 dump_generic_node (buffer
, TREE_TYPE (fnode
), spc
, flags
, false);
1008 pp_left_paren (buffer
);
1009 pp_string (buffer
, str
);
1010 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1011 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1012 else if (flags
& TDF_NOUID
)
1013 pp_printf (buffer
, "<Txxxx>");
1015 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1017 pp_right_paren (buffer
);
1018 dump_function_declaration (buffer
, fnode
, spc
, flags
);
1022 unsigned int quals
= TYPE_QUALS (node
);
1024 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1026 pp_string (buffer
, str
);
1028 if (quals
& TYPE_QUAL_CONST
)
1029 pp_string (buffer
, " const");
1030 if (quals
& TYPE_QUAL_VOLATILE
)
1031 pp_string (buffer
, " volatile");
1032 if (quals
& TYPE_QUAL_RESTRICT
)
1033 pp_string (buffer
, " restrict");
1035 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node
)))
1037 pp_string (buffer
, " <address-space-");
1038 pp_decimal_int (buffer
, TYPE_ADDR_SPACE (node
));
1039 pp_greater (buffer
);
1042 if (TYPE_REF_CAN_ALIAS_ALL (node
))
1043 pp_string (buffer
, " {ref-all}");
1053 if (integer_zerop (TREE_OPERAND (node
, 1))
1054 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1055 infer them and MEM_ATTR caching will share MEM_REFs
1056 with differently-typed op0s. */
1057 && TREE_CODE (TREE_OPERAND (node
, 0)) != INTEGER_CST
1058 /* Released SSA_NAMES have no TREE_TYPE. */
1059 && TREE_TYPE (TREE_OPERAND (node
, 0)) != NULL_TREE
1060 /* Same pointer types, but ignoring POINTER_TYPE vs.
1062 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1063 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1064 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 0)))
1065 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node
, 1))))
1066 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 0)))
1067 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node
, 1))))
1068 /* Same value types ignoring qualifiers. */
1069 && (TYPE_MAIN_VARIANT (TREE_TYPE (node
))
1070 == TYPE_MAIN_VARIANT
1071 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node
, 1))))))
1073 if (TREE_CODE (TREE_OPERAND (node
, 0)) != ADDR_EXPR
)
1076 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1080 dump_generic_node (buffer
,
1081 TREE_OPERAND (TREE_OPERAND (node
, 0), 0),
1088 pp_string (buffer
, "MEM[");
1089 pp_left_paren (buffer
);
1090 ptype
= TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node
, 1)));
1091 dump_generic_node (buffer
, ptype
,
1092 spc
, flags
| TDF_SLIM
, false);
1093 pp_right_paren (buffer
);
1094 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1096 if (!integer_zerop (TREE_OPERAND (node
, 1)))
1098 pp_string (buffer
, " + ");
1099 dump_generic_node (buffer
, TREE_OPERAND (node
, 1),
1102 pp_right_bracket (buffer
);
1107 case TARGET_MEM_REF
:
1109 const char *sep
= "";
1112 pp_string (buffer
, "MEM[");
1114 if (TREE_CODE (TMR_BASE (node
)) == ADDR_EXPR
)
1116 pp_string (buffer
, sep
);
1118 pp_string (buffer
, "symbol: ");
1119 dump_generic_node (buffer
, TREE_OPERAND (TMR_BASE (node
), 0),
1124 pp_string (buffer
, sep
);
1126 pp_string (buffer
, "base: ");
1127 dump_generic_node (buffer
, TMR_BASE (node
), spc
, flags
, false);
1129 tmp
= TMR_INDEX2 (node
);
1132 pp_string (buffer
, sep
);
1134 pp_string (buffer
, "base: ");
1135 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1137 tmp
= TMR_INDEX (node
);
1140 pp_string (buffer
, sep
);
1142 pp_string (buffer
, "index: ");
1143 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1145 tmp
= TMR_STEP (node
);
1148 pp_string (buffer
, sep
);
1150 pp_string (buffer
, "step: ");
1151 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1153 tmp
= TMR_OFFSET (node
);
1156 pp_string (buffer
, sep
);
1158 pp_string (buffer
, "offset: ");
1159 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1161 pp_right_bracket (buffer
);
1169 /* Print the innermost component type. */
1170 for (tmp
= TREE_TYPE (node
); TREE_CODE (tmp
) == ARRAY_TYPE
;
1171 tmp
= TREE_TYPE (tmp
))
1173 dump_generic_node (buffer
, tmp
, spc
, flags
, false);
1175 /* Print the dimensions. */
1176 for (tmp
= node
; TREE_CODE (tmp
) == ARRAY_TYPE
; tmp
= TREE_TYPE (tmp
))
1177 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
1183 case QUAL_UNION_TYPE
:
1185 unsigned int quals
= TYPE_QUALS (node
);
1187 if (quals
& TYPE_QUAL_ATOMIC
)
1188 pp_string (buffer
, "atomic ");
1189 if (quals
& TYPE_QUAL_CONST
)
1190 pp_string (buffer
, "const ");
1191 if (quals
& TYPE_QUAL_VOLATILE
)
1192 pp_string (buffer
, "volatile ");
1194 /* Print the name of the structure. */
1195 if (TREE_CODE (node
) == RECORD_TYPE
)
1196 pp_string (buffer
, "struct ");
1197 else if (TREE_CODE (node
) == UNION_TYPE
)
1198 pp_string (buffer
, "union ");
1200 if (TYPE_NAME (node
))
1201 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, flags
, false);
1202 else if (!(flags
& TDF_SLIM
))
1203 /* FIXME: If we eliminate the 'else' above and attempt
1204 to show the fields for named types, we may get stuck
1205 following a cycle of pointers to structs. The alleged
1206 self-reference check in print_struct_decl will not detect
1207 cycles involving more than one pointer or struct type. */
1208 print_struct_decl (buffer
, node
, spc
, flags
);
1217 if (TREE_CODE (TREE_TYPE (node
)) == POINTER_TYPE
)
1219 /* In the case of a pointer, one may want to divide by the
1220 size of the pointed-to type. Unfortunately, this not
1221 straightforward. The C front-end maps expressions
1226 in such a way that the two INTEGER_CST nodes for "5" have
1227 different values but identical types. In the latter
1228 case, the 5 is multiplied by sizeof (int) in c-common.c
1229 (pointer_int_sum) to convert it to a byte address, and
1230 yet the type of the node is left unchanged. Argh. What
1231 is consistent though is that the number value corresponds
1232 to bytes (UNITS) offset.
1234 NB: Neither of the following divisors can be trivially
1235 used to recover the original literal:
1237 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1238 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1239 pp_wide_integer (buffer
, TREE_INT_CST_LOW (node
));
1240 pp_string (buffer
, "B"); /* pseudo-unit */
1243 pp_double_int (buffer
, tree_to_double_int (node
),
1244 TYPE_UNSIGNED (TREE_TYPE (node
)));
1245 if (TREE_OVERFLOW (node
))
1246 pp_string (buffer
, "(OVF)");
1250 /* Code copied from print_node. */
1253 if (TREE_OVERFLOW (node
))
1254 pp_string (buffer
, " overflow");
1256 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
1257 d
= TREE_REAL_CST (node
);
1258 if (REAL_VALUE_ISINF (d
))
1259 pp_string (buffer
, REAL_VALUE_NEGATIVE (d
) ? " -Inf" : " Inf");
1260 else if (REAL_VALUE_ISNAN (d
))
1261 pp_string (buffer
, " Nan");
1265 real_to_decimal (string
, &d
, sizeof (string
), 0, 1);
1266 pp_string (buffer
, string
);
1271 unsigned char *p
= (unsigned char *) &TREE_REAL_CST (node
);
1272 pp_string (buffer
, "0x");
1273 for (i
= 0; i
< sizeof TREE_REAL_CST (node
); i
++)
1274 output_formatted_integer (buffer
, "%02x", *p
++);
1283 fixed_to_decimal (string
, TREE_FIXED_CST_PTR (node
), sizeof (string
));
1284 pp_string (buffer
, string
);
1289 pp_string (buffer
, "__complex__ (");
1290 dump_generic_node (buffer
, TREE_REALPART (node
), spc
, flags
, false);
1291 pp_string (buffer
, ", ");
1292 dump_generic_node (buffer
, TREE_IMAGPART (node
), spc
, flags
, false);
1293 pp_right_paren (buffer
);
1297 pp_string (buffer
, "\"");
1298 pretty_print_string (buffer
, TREE_STRING_POINTER (node
));
1299 pp_string (buffer
, "\"");
1305 pp_string (buffer
, "{ ");
1306 for (i
= 0; i
< VECTOR_CST_NELTS (node
); ++i
)
1309 pp_string (buffer
, ", ");
1310 dump_generic_node (buffer
, VECTOR_CST_ELT (node
, i
),
1313 pp_string (buffer
, " }");
1319 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1321 if (TREE_CODE (node
) == METHOD_TYPE
)
1323 if (TYPE_METHOD_BASETYPE (node
))
1324 dump_decl_name (buffer
, TYPE_NAME (TYPE_METHOD_BASETYPE (node
)),
1327 pp_string (buffer
, "<null method basetype>");
1328 pp_colon_colon (buffer
);
1330 if (TYPE_NAME (node
) && DECL_NAME (TYPE_NAME (node
)))
1331 dump_decl_name (buffer
, TYPE_NAME (node
), flags
);
1332 else if (flags
& TDF_NOUID
)
1333 pp_printf (buffer
, "<Txxxx>");
1335 pp_printf (buffer
, "<T%x>", TYPE_UID (node
));
1336 dump_function_declaration (buffer
, node
, spc
, flags
);
1341 dump_decl_name (buffer
, node
, flags
);
1345 if (DECL_NAME (node
))
1346 dump_decl_name (buffer
, node
, flags
);
1347 else if (LABEL_DECL_UID (node
) != -1)
1348 pp_printf (buffer
, "<L%d>", (int) LABEL_DECL_UID (node
));
1351 if (flags
& TDF_NOUID
)
1352 pp_string (buffer
, "<D.xxxx>");
1354 pp_printf (buffer
, "<D.%u>", DECL_UID (node
));
1359 if (DECL_IS_BUILTIN (node
))
1361 /* Don't print the declaration of built-in types. */
1364 if (DECL_NAME (node
))
1365 dump_decl_name (buffer
, node
, flags
);
1366 else if (TYPE_NAME (TREE_TYPE (node
)) != node
)
1368 if ((TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1369 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1370 && TYPE_METHODS (TREE_TYPE (node
)))
1372 /* The type is a c++ class: all structures have at least
1374 pp_string (buffer
, "class ");
1375 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1380 (TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
1381 ? "union" : "struct "));
1382 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1386 pp_string (buffer
, "<anon>");
1392 case DEBUG_EXPR_DECL
:
1393 case NAMESPACE_DECL
:
1395 dump_decl_name (buffer
, node
, flags
);
1399 pp_string (buffer
, "<retval>");
1403 op0
= TREE_OPERAND (node
, 0);
1406 && (TREE_CODE (op0
) == INDIRECT_REF
1407 || (TREE_CODE (op0
) == MEM_REF
1408 && TREE_CODE (TREE_OPERAND (op0
, 0)) != ADDR_EXPR
1409 && integer_zerop (TREE_OPERAND (op0
, 1))
1410 /* Dump the types of INTEGER_CSTs explicitly, for we
1411 can't infer them and MEM_ATTR caching will share
1412 MEM_REFs with differently-typed op0s. */
1413 && TREE_CODE (TREE_OPERAND (op0
, 0)) != INTEGER_CST
1414 /* Released SSA_NAMES have no TREE_TYPE. */
1415 && TREE_TYPE (TREE_OPERAND (op0
, 0)) != NULL_TREE
1416 /* Same pointer types, but ignoring POINTER_TYPE vs.
1418 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1419 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1420 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1421 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1422 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 0)))
1423 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0
, 1))))
1424 /* Same value types ignoring qualifiers. */
1425 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0
))
1426 == TYPE_MAIN_VARIANT
1427 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0
, 1))))))))
1429 op0
= TREE_OPERAND (op0
, 0);
1432 if (op_prio (op0
) < op_prio (node
))
1433 pp_left_paren (buffer
);
1434 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1435 if (op_prio (op0
) < op_prio (node
))
1436 pp_right_paren (buffer
);
1437 pp_string (buffer
, str
);
1438 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1439 op0
= component_ref_field_offset (node
);
1440 if (op0
&& TREE_CODE (op0
) != INTEGER_CST
)
1442 pp_string (buffer
, "{off: ");
1443 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1444 pp_right_brace (buffer
);
1449 pp_string (buffer
, "BIT_FIELD_REF <");
1450 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1451 pp_string (buffer
, ", ");
1452 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1453 pp_string (buffer
, ", ");
1454 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1455 pp_greater (buffer
);
1459 case ARRAY_RANGE_REF
:
1460 op0
= TREE_OPERAND (node
, 0);
1461 if (op_prio (op0
) < op_prio (node
))
1462 pp_left_paren (buffer
);
1463 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1464 if (op_prio (op0
) < op_prio (node
))
1465 pp_right_paren (buffer
);
1466 pp_left_bracket (buffer
);
1467 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1468 if (TREE_CODE (node
) == ARRAY_RANGE_REF
)
1469 pp_string (buffer
, " ...");
1470 pp_right_bracket (buffer
);
1472 op0
= array_ref_low_bound (node
);
1473 op1
= array_ref_element_size (node
);
1475 if (!integer_zerop (op0
)
1476 || TREE_OPERAND (node
, 2)
1477 || TREE_OPERAND (node
, 3))
1479 pp_string (buffer
, "{lb: ");
1480 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1481 pp_string (buffer
, " sz: ");
1482 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1483 pp_right_brace (buffer
);
1489 unsigned HOST_WIDE_INT ix
;
1491 bool is_struct_init
= false;
1492 bool is_array_init
= false;
1493 double_int curidx
= double_int_zero
;
1494 pp_left_brace (buffer
);
1495 if (TREE_CLOBBER_P (node
))
1496 pp_string (buffer
, "CLOBBER");
1497 else if (TREE_CODE (TREE_TYPE (node
)) == RECORD_TYPE
1498 || TREE_CODE (TREE_TYPE (node
)) == UNION_TYPE
)
1499 is_struct_init
= true;
1500 else if (TREE_CODE (TREE_TYPE (node
)) == ARRAY_TYPE
1501 && TYPE_DOMAIN (TREE_TYPE (node
))
1502 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)))
1503 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
))))
1506 tree minv
= TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node
)));
1507 is_array_init
= true;
1508 curidx
= tree_to_double_int (minv
);
1510 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node
), ix
, field
, val
)
1517 dump_generic_node (buffer
, field
, spc
, flags
, false);
1520 else if (is_array_init
1521 && (TREE_CODE (field
) != INTEGER_CST
1522 || tree_to_double_int (field
) != curidx
))
1524 pp_left_bracket (buffer
);
1525 if (TREE_CODE (field
) == RANGE_EXPR
)
1527 dump_generic_node (buffer
, TREE_OPERAND (field
, 0), spc
,
1529 pp_string (buffer
, " ... ");
1530 dump_generic_node (buffer
, TREE_OPERAND (field
, 1), spc
,
1532 if (TREE_CODE (TREE_OPERAND (field
, 1)) == INTEGER_CST
)
1533 curidx
= tree_to_double_int (TREE_OPERAND (field
, 1));
1536 dump_generic_node (buffer
, field
, spc
, flags
, false);
1537 if (TREE_CODE (field
) == INTEGER_CST
)
1538 curidx
= tree_to_double_int (field
);
1539 pp_string (buffer
, "]=");
1543 curidx
+= double_int_one
;
1544 if (val
&& TREE_CODE (val
) == ADDR_EXPR
)
1545 if (TREE_CODE (TREE_OPERAND (val
, 0)) == FUNCTION_DECL
)
1546 val
= TREE_OPERAND (val
, 0);
1547 if (val
&& TREE_CODE (val
) == FUNCTION_DECL
)
1548 dump_decl_name (buffer
, val
, flags
);
1550 dump_generic_node (buffer
, val
, spc
, flags
, false);
1551 if (ix
!= vec_safe_length (CONSTRUCTOR_ELTS (node
)) - 1)
1557 pp_right_brace (buffer
);
1564 if (flags
& TDF_SLIM
)
1566 pp_string (buffer
, "<COMPOUND_EXPR>");
1570 dump_generic_node (buffer
, TREE_OPERAND (node
, 0),
1571 spc
, flags
, !(flags
& TDF_SLIM
));
1572 if (flags
& TDF_SLIM
)
1573 newline_and_indent (buffer
, spc
);
1580 for (tp
= &TREE_OPERAND (node
, 1);
1581 TREE_CODE (*tp
) == COMPOUND_EXPR
;
1582 tp
= &TREE_OPERAND (*tp
, 1))
1584 dump_generic_node (buffer
, TREE_OPERAND (*tp
, 0),
1585 spc
, flags
, !(flags
& TDF_SLIM
));
1586 if (flags
& TDF_SLIM
)
1587 newline_and_indent (buffer
, spc
);
1595 dump_generic_node (buffer
, *tp
, spc
, flags
, !(flags
& TDF_SLIM
));
1599 case STATEMENT_LIST
:
1601 tree_stmt_iterator si
;
1604 if (flags
& TDF_SLIM
)
1606 pp_string (buffer
, "<STATEMENT_LIST>");
1610 for (si
= tsi_start (node
); !tsi_end_p (si
); tsi_next (&si
))
1613 newline_and_indent (buffer
, spc
);
1616 dump_generic_node (buffer
, tsi_stmt (si
), spc
, flags
, true);
1623 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
,
1628 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
,
1633 pp_string (buffer
, "TARGET_EXPR <");
1634 dump_generic_node (buffer
, TARGET_EXPR_SLOT (node
), spc
, flags
, false);
1637 dump_generic_node (buffer
, TARGET_EXPR_INITIAL (node
), spc
, flags
, false);
1638 pp_greater (buffer
);
1642 print_declaration (buffer
, DECL_EXPR_DECL (node
), spc
, flags
);
1647 if (TREE_TYPE (node
) == NULL
|| TREE_TYPE (node
) == void_type_node
)
1649 pp_string (buffer
, "if (");
1650 dump_generic_node (buffer
, COND_EXPR_COND (node
), spc
, flags
, false);
1651 pp_right_paren (buffer
);
1652 /* The lowered cond_exprs should always be printed in full. */
1653 if (COND_EXPR_THEN (node
)
1654 && (IS_EMPTY_STMT (COND_EXPR_THEN (node
))
1655 || TREE_CODE (COND_EXPR_THEN (node
)) == GOTO_EXPR
)
1656 && COND_EXPR_ELSE (node
)
1657 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node
))
1658 || TREE_CODE (COND_EXPR_ELSE (node
)) == GOTO_EXPR
))
1661 dump_generic_node (buffer
, COND_EXPR_THEN (node
),
1663 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1665 pp_string (buffer
, " else ");
1666 dump_generic_node (buffer
, COND_EXPR_ELSE (node
),
1670 else if (!(flags
& TDF_SLIM
))
1672 /* Output COND_EXPR_THEN. */
1673 if (COND_EXPR_THEN (node
))
1675 newline_and_indent (buffer
, spc
+2);
1676 pp_left_brace (buffer
);
1677 newline_and_indent (buffer
, spc
+4);
1678 dump_generic_node (buffer
, COND_EXPR_THEN (node
), spc
+4,
1680 newline_and_indent (buffer
, spc
+2);
1681 pp_right_brace (buffer
);
1684 /* Output COND_EXPR_ELSE. */
1685 if (COND_EXPR_ELSE (node
)
1686 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node
)))
1688 newline_and_indent (buffer
, spc
);
1689 pp_string (buffer
, "else");
1690 newline_and_indent (buffer
, spc
+2);
1691 pp_left_brace (buffer
);
1692 newline_and_indent (buffer
, spc
+4);
1693 dump_generic_node (buffer
, COND_EXPR_ELSE (node
), spc
+4,
1695 newline_and_indent (buffer
, spc
+2);
1696 pp_right_brace (buffer
);
1703 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1705 pp_question (buffer
);
1707 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1711 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
1716 pp_left_brace (buffer
);
1717 if (!(flags
& TDF_SLIM
))
1719 if (BIND_EXPR_VARS (node
))
1721 pp_newline (buffer
);
1723 for (op0
= BIND_EXPR_VARS (node
); op0
; op0
= DECL_CHAIN (op0
))
1725 print_declaration (buffer
, op0
, spc
+2, flags
);
1726 pp_newline (buffer
);
1730 newline_and_indent (buffer
, spc
+2);
1731 dump_generic_node (buffer
, BIND_EXPR_BODY (node
), spc
+2, flags
, true);
1732 newline_and_indent (buffer
, spc
);
1733 pp_right_brace (buffer
);
1739 print_call_name (buffer
, CALL_EXPR_FN (node
), flags
);
1741 /* Print parameters. */
1743 pp_left_paren (buffer
);
1746 call_expr_arg_iterator iter
;
1747 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, node
)
1749 dump_generic_node (buffer
, arg
, spc
, flags
, false);
1750 if (more_call_expr_args_p (&iter
))
1757 if (CALL_EXPR_VA_ARG_PACK (node
))
1759 if (call_expr_nargs (node
) > 0)
1764 pp_string (buffer
, "__builtin_va_arg_pack ()");
1766 pp_right_paren (buffer
);
1768 op1
= CALL_EXPR_STATIC_CHAIN (node
);
1771 pp_string (buffer
, " [static-chain: ");
1772 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1773 pp_right_bracket (buffer
);
1776 if (CALL_EXPR_RETURN_SLOT_OPT (node
))
1777 pp_string (buffer
, " [return slot optimization]");
1778 if (CALL_EXPR_TAILCALL (node
))
1779 pp_string (buffer
, " [tail call]");
1782 case WITH_CLEANUP_EXPR
:
1786 case CLEANUP_POINT_EXPR
:
1787 pp_string (buffer
, "<<cleanup_point ");
1788 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1789 pp_string (buffer
, ">>");
1792 case PLACEHOLDER_EXPR
:
1793 pp_string (buffer
, "<PLACEHOLDER_EXPR ");
1794 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1795 pp_greater (buffer
);
1798 /* Binary arithmetic and logic expressions. */
1799 case WIDEN_SUM_EXPR
:
1800 case WIDEN_MULT_EXPR
:
1802 case MULT_HIGHPART_EXPR
:
1804 case POINTER_PLUS_EXPR
:
1806 case TRUNC_DIV_EXPR
:
1808 case FLOOR_DIV_EXPR
:
1809 case ROUND_DIV_EXPR
:
1810 case TRUNC_MOD_EXPR
:
1812 case FLOOR_MOD_EXPR
:
1813 case ROUND_MOD_EXPR
:
1815 case EXACT_DIV_EXPR
:
1820 case VEC_LSHIFT_EXPR
:
1821 case VEC_RSHIFT_EXPR
:
1822 case WIDEN_LSHIFT_EXPR
:
1826 case TRUTH_ANDIF_EXPR
:
1827 case TRUTH_ORIF_EXPR
:
1828 case TRUTH_AND_EXPR
:
1830 case TRUTH_XOR_EXPR
:
1844 case UNORDERED_EXPR
:
1846 const char *op
= op_symbol (node
);
1847 op0
= TREE_OPERAND (node
, 0);
1848 op1
= TREE_OPERAND (node
, 1);
1850 /* When the operands are expressions with less priority,
1851 keep semantics of the tree representation. */
1852 if (op_prio (op0
) <= op_prio (node
))
1854 pp_left_paren (buffer
);
1855 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1856 pp_right_paren (buffer
);
1859 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1862 pp_string (buffer
, op
);
1865 /* When the operands are expressions with less priority,
1866 keep semantics of the tree representation. */
1867 if (op_prio (op1
) <= op_prio (node
))
1869 pp_left_paren (buffer
);
1870 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1871 pp_right_paren (buffer
);
1874 dump_generic_node (buffer
, op1
, spc
, flags
, false);
1878 /* Unary arithmetic and logic expressions. */
1881 case TRUTH_NOT_EXPR
:
1883 case PREDECREMENT_EXPR
:
1884 case PREINCREMENT_EXPR
:
1886 if (TREE_CODE (node
) == ADDR_EXPR
1887 && (TREE_CODE (TREE_OPERAND (node
, 0)) == STRING_CST
1888 || TREE_CODE (TREE_OPERAND (node
, 0)) == FUNCTION_DECL
))
1889 ; /* Do not output '&' for strings and function pointers. */
1891 pp_string (buffer
, op_symbol (node
));
1893 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1895 pp_left_paren (buffer
);
1896 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1897 pp_right_paren (buffer
);
1900 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1903 case POSTDECREMENT_EXPR
:
1904 case POSTINCREMENT_EXPR
:
1905 if (op_prio (TREE_OPERAND (node
, 0)) < op_prio (node
))
1907 pp_left_paren (buffer
);
1908 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1909 pp_right_paren (buffer
);
1912 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1913 pp_string (buffer
, op_symbol (node
));
1917 pp_string (buffer
, "MIN_EXPR <");
1918 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1919 pp_string (buffer
, ", ");
1920 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1921 pp_greater (buffer
);
1925 pp_string (buffer
, "MAX_EXPR <");
1926 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1927 pp_string (buffer
, ", ");
1928 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1929 pp_greater (buffer
);
1933 pp_string (buffer
, "ABS_EXPR <");
1934 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1935 pp_greater (buffer
);
1942 case ADDR_SPACE_CONVERT_EXPR
:
1943 case FIXED_CONVERT_EXPR
:
1944 case FIX_TRUNC_EXPR
:
1947 type
= TREE_TYPE (node
);
1948 op0
= TREE_OPERAND (node
, 0);
1949 if (type
!= TREE_TYPE (op0
))
1951 pp_left_paren (buffer
);
1952 dump_generic_node (buffer
, type
, spc
, flags
, false);
1953 pp_string (buffer
, ") ");
1955 if (op_prio (op0
) < op_prio (node
))
1956 pp_left_paren (buffer
);
1957 dump_generic_node (buffer
, op0
, spc
, flags
, false);
1958 if (op_prio (op0
) < op_prio (node
))
1959 pp_right_paren (buffer
);
1962 case VIEW_CONVERT_EXPR
:
1963 pp_string (buffer
, "VIEW_CONVERT_EXPR<");
1964 dump_generic_node (buffer
, TREE_TYPE (node
), spc
, flags
, false);
1965 pp_string (buffer
, ">(");
1966 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1967 pp_right_paren (buffer
);
1971 pp_string (buffer
, "((");
1972 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1973 pp_string (buffer
, "))");
1976 case NON_LVALUE_EXPR
:
1977 pp_string (buffer
, "NON_LVALUE_EXPR <");
1978 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1979 pp_greater (buffer
);
1983 pp_string (buffer
, "SAVE_EXPR <");
1984 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1985 pp_greater (buffer
);
1989 pp_string (buffer
, "COMPLEX_EXPR <");
1990 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1991 pp_string (buffer
, ", ");
1992 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
1993 pp_greater (buffer
);
1997 pp_string (buffer
, "CONJ_EXPR <");
1998 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
1999 pp_greater (buffer
);
2003 pp_string (buffer
, "REALPART_EXPR <");
2004 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2005 pp_greater (buffer
);
2009 pp_string (buffer
, "IMAGPART_EXPR <");
2010 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2011 pp_greater (buffer
);
2015 pp_string (buffer
, "VA_ARG_EXPR <");
2016 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2017 pp_greater (buffer
);
2020 case TRY_FINALLY_EXPR
:
2021 case TRY_CATCH_EXPR
:
2022 pp_string (buffer
, "try");
2023 newline_and_indent (buffer
, spc
+2);
2024 pp_left_brace (buffer
);
2025 newline_and_indent (buffer
, spc
+4);
2026 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
+4, flags
, true);
2027 newline_and_indent (buffer
, spc
+2);
2028 pp_right_brace (buffer
);
2029 newline_and_indent (buffer
, spc
);
2031 (TREE_CODE (node
) == TRY_CATCH_EXPR
) ? "catch" : "finally");
2032 newline_and_indent (buffer
, spc
+2);
2033 pp_left_brace (buffer
);
2034 newline_and_indent (buffer
, spc
+4);
2035 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
+4, flags
, true);
2036 newline_and_indent (buffer
, spc
+2);
2037 pp_right_brace (buffer
);
2042 pp_string (buffer
, "catch (");
2043 dump_generic_node (buffer
, CATCH_TYPES (node
), spc
+2, flags
, false);
2044 pp_right_paren (buffer
);
2045 newline_and_indent (buffer
, spc
+2);
2046 pp_left_brace (buffer
);
2047 newline_and_indent (buffer
, spc
+4);
2048 dump_generic_node (buffer
, CATCH_BODY (node
), spc
+4, flags
, true);
2049 newline_and_indent (buffer
, spc
+2);
2050 pp_right_brace (buffer
);
2054 case EH_FILTER_EXPR
:
2055 pp_string (buffer
, "<<<eh_filter (");
2056 dump_generic_node (buffer
, EH_FILTER_TYPES (node
), spc
+2, flags
, false);
2057 pp_string (buffer
, ")>>>");
2058 newline_and_indent (buffer
, spc
+2);
2059 pp_left_brace (buffer
);
2060 newline_and_indent (buffer
, spc
+4);
2061 dump_generic_node (buffer
, EH_FILTER_FAILURE (node
), spc
+4, flags
, true);
2062 newline_and_indent (buffer
, spc
+2);
2063 pp_right_brace (buffer
);
2068 op0
= TREE_OPERAND (node
, 0);
2069 /* If this is for break or continue, don't bother printing it. */
2070 if (DECL_NAME (op0
))
2072 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2073 if (strcmp (name
, "break") == 0
2074 || strcmp (name
, "continue") == 0)
2077 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2079 if (DECL_NONLOCAL (op0
))
2080 pp_string (buffer
, " [non-local]");
2084 pp_string (buffer
, "while (1)");
2085 if (!(flags
& TDF_SLIM
))
2087 newline_and_indent (buffer
, spc
+2);
2088 pp_left_brace (buffer
);
2089 newline_and_indent (buffer
, spc
+4);
2090 dump_generic_node (buffer
, LOOP_EXPR_BODY (node
), spc
+4, flags
, true);
2091 newline_and_indent (buffer
, spc
+2);
2092 pp_right_brace (buffer
);
2098 pp_string (buffer
, "// predicted ");
2099 if (PREDICT_EXPR_OUTCOME (node
))
2100 pp_string (buffer
, "likely by ");
2102 pp_string (buffer
, "unlikely by ");
2103 pp_string (buffer
, predictor_name (PREDICT_EXPR_PREDICTOR (node
)));
2104 pp_string (buffer
, " predictor.");
2108 pp_string (buffer
, "ANNOTATE_EXPR <");
2109 switch ((enum annot_expr_kind
) TREE_INT_CST_LOW (TREE_OPERAND (node
, 1)))
2111 case annot_expr_ivdep_kind
:
2112 pp_string (buffer
, "ivdep, ");
2115 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2116 pp_greater (buffer
);
2120 pp_string (buffer
, "return");
2121 op0
= TREE_OPERAND (node
, 0);
2125 if (TREE_CODE (op0
) == MODIFY_EXPR
)
2126 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1),
2129 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2134 pp_string (buffer
, "if (");
2135 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2136 pp_string (buffer
, ") break");
2140 pp_string (buffer
, "switch (");
2141 dump_generic_node (buffer
, SWITCH_COND (node
), spc
, flags
, false);
2142 pp_right_paren (buffer
);
2143 if (!(flags
& TDF_SLIM
))
2145 newline_and_indent (buffer
, spc
+2);
2146 pp_left_brace (buffer
);
2147 if (SWITCH_BODY (node
))
2149 newline_and_indent (buffer
, spc
+4);
2150 dump_generic_node (buffer
, SWITCH_BODY (node
), spc
+4, flags
,
2155 tree vec
= SWITCH_LABELS (node
);
2156 size_t i
, n
= TREE_VEC_LENGTH (vec
);
2157 for (i
= 0; i
< n
; ++i
)
2159 tree elt
= TREE_VEC_ELT (vec
, i
);
2160 newline_and_indent (buffer
, spc
+4);
2163 dump_generic_node (buffer
, elt
, spc
+4, flags
, false);
2164 pp_string (buffer
, " goto ");
2165 dump_generic_node (buffer
, CASE_LABEL (elt
), spc
+4,
2167 pp_semicolon (buffer
);
2170 pp_string (buffer
, "case ???: goto ???;");
2173 newline_and_indent (buffer
, spc
+2);
2174 pp_right_brace (buffer
);
2180 op0
= GOTO_DESTINATION (node
);
2181 if (TREE_CODE (op0
) != SSA_NAME
&& DECL_P (op0
) && DECL_NAME (op0
))
2183 const char *name
= IDENTIFIER_POINTER (DECL_NAME (op0
));
2184 if (strcmp (name
, "break") == 0
2185 || strcmp (name
, "continue") == 0)
2187 pp_string (buffer
, name
);
2191 pp_string (buffer
, "goto ");
2192 dump_generic_node (buffer
, op0
, spc
, flags
, false);
2196 pp_string (buffer
, "__asm__");
2197 if (ASM_VOLATILE_P (node
))
2198 pp_string (buffer
, " __volatile__");
2199 pp_left_paren (buffer
);
2200 dump_generic_node (buffer
, ASM_STRING (node
), spc
, flags
, false);
2202 dump_generic_node (buffer
, ASM_OUTPUTS (node
), spc
, flags
, false);
2204 dump_generic_node (buffer
, ASM_INPUTS (node
), spc
, flags
, false);
2205 if (ASM_CLOBBERS (node
))
2208 dump_generic_node (buffer
, ASM_CLOBBERS (node
), spc
, flags
, false);
2210 pp_right_paren (buffer
);
2213 case CASE_LABEL_EXPR
:
2214 if (CASE_LOW (node
) && CASE_HIGH (node
))
2216 pp_string (buffer
, "case ");
2217 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2218 pp_string (buffer
, " ... ");
2219 dump_generic_node (buffer
, CASE_HIGH (node
), spc
, flags
, false);
2221 else if (CASE_LOW (node
))
2223 pp_string (buffer
, "case ");
2224 dump_generic_node (buffer
, CASE_LOW (node
), spc
, flags
, false);
2227 pp_string (buffer
, "default");
2232 pp_string (buffer
, "OBJ_TYPE_REF(");
2233 dump_generic_node (buffer
, OBJ_TYPE_REF_EXPR (node
), spc
, flags
, false);
2234 pp_semicolon (buffer
);
2235 if (!(flags
& TDF_SLIM
) && virtual_method_call_p (node
))
2237 pp_string (buffer
, "(");
2238 dump_generic_node (buffer
, obj_type_ref_class (node
), spc
, flags
, false);
2239 pp_string (buffer
, ")");
2241 dump_generic_node (buffer
, OBJ_TYPE_REF_OBJECT (node
), spc
, flags
, false);
2243 dump_generic_node (buffer
, OBJ_TYPE_REF_TOKEN (node
), spc
, flags
, false);
2244 pp_right_paren (buffer
);
2248 if (SSA_NAME_IDENTIFIER (node
))
2249 dump_generic_node (buffer
, SSA_NAME_IDENTIFIER (node
),
2251 pp_underscore (buffer
);
2252 pp_decimal_int (buffer
, SSA_NAME_VERSION (node
));
2253 if (SSA_NAME_IS_DEFAULT_DEF (node
))
2254 pp_string (buffer
, "(D)");
2255 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node
))
2256 pp_string (buffer
, "(ab)");
2259 case WITH_SIZE_EXPR
:
2260 pp_string (buffer
, "WITH_SIZE_EXPR <");
2261 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2262 pp_string (buffer
, ", ");
2263 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2264 pp_greater (buffer
);
2268 pp_string (buffer
, "ASSERT_EXPR <");
2269 dump_generic_node (buffer
, ASSERT_EXPR_VAR (node
), spc
, flags
, false);
2270 pp_string (buffer
, ", ");
2271 dump_generic_node (buffer
, ASSERT_EXPR_COND (node
), spc
, flags
, false);
2272 pp_greater (buffer
);
2276 pp_string (buffer
, "scev_known");
2279 case SCEV_NOT_KNOWN
:
2280 pp_string (buffer
, "scev_not_known");
2283 case POLYNOMIAL_CHREC
:
2284 pp_left_brace (buffer
);
2285 dump_generic_node (buffer
, CHREC_LEFT (node
), spc
, flags
, false);
2286 pp_string (buffer
, ", +, ");
2287 dump_generic_node (buffer
, CHREC_RIGHT (node
), spc
, flags
, false);
2288 pp_string (buffer
, "}_");
2289 dump_generic_node (buffer
, CHREC_VAR (node
), spc
, flags
, false);
2293 case REALIGN_LOAD_EXPR
:
2294 pp_string (buffer
, "REALIGN_LOAD <");
2295 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2296 pp_string (buffer
, ", ");
2297 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2298 pp_string (buffer
, ", ");
2299 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2300 pp_greater (buffer
);
2304 pp_string (buffer
, " VEC_COND_EXPR < ");
2305 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2306 pp_string (buffer
, " , ");
2307 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2308 pp_string (buffer
, " , ");
2309 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2310 pp_string (buffer
, " > ");
2314 pp_string (buffer
, " VEC_PERM_EXPR < ");
2315 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2316 pp_string (buffer
, " , ");
2317 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2318 pp_string (buffer
, " , ");
2319 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2320 pp_string (buffer
, " > ");
2324 pp_string (buffer
, " DOT_PROD_EXPR < ");
2325 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2326 pp_string (buffer
, ", ");
2327 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2328 pp_string (buffer
, ", ");
2329 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2330 pp_string (buffer
, " > ");
2333 case WIDEN_MULT_PLUS_EXPR
:
2334 pp_string (buffer
, " WIDEN_MULT_PLUS_EXPR < ");
2335 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2336 pp_string (buffer
, ", ");
2337 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2338 pp_string (buffer
, ", ");
2339 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2340 pp_string (buffer
, " > ");
2343 case WIDEN_MULT_MINUS_EXPR
:
2344 pp_string (buffer
, " WIDEN_MULT_MINUS_EXPR < ");
2345 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2346 pp_string (buffer
, ", ");
2347 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2348 pp_string (buffer
, ", ");
2349 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2350 pp_string (buffer
, " > ");
2354 pp_string (buffer
, " FMA_EXPR < ");
2355 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2356 pp_string (buffer
, ", ");
2357 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2358 pp_string (buffer
, ", ");
2359 dump_generic_node (buffer
, TREE_OPERAND (node
, 2), spc
, flags
, false);
2360 pp_string (buffer
, " > ");
2364 pp_string (buffer
, "#pragma omp parallel");
2365 dump_omp_clauses (buffer
, OMP_PARALLEL_CLAUSES (node
), spc
, flags
);
2368 if (!(flags
& TDF_SLIM
) && OMP_BODY (node
))
2370 newline_and_indent (buffer
, spc
+ 2);
2371 pp_left_brace (buffer
);
2372 newline_and_indent (buffer
, spc
+ 4);
2373 dump_generic_node (buffer
, OMP_BODY (node
), spc
+ 4, flags
, false);
2374 newline_and_indent (buffer
, spc
+ 2);
2375 pp_right_brace (buffer
);
2381 pp_string (buffer
, "#pragma omp task");
2382 dump_omp_clauses (buffer
, OMP_TASK_CLAUSES (node
), spc
, flags
);
2386 pp_string (buffer
, "#pragma omp for");
2390 pp_string (buffer
, "#pragma omp simd");
2394 pp_string (buffer
, "#pragma simd");
2397 case OMP_DISTRIBUTE
:
2398 pp_string (buffer
, "#pragma omp distribute");
2402 pp_string (buffer
, "#pragma omp teams");
2403 dump_omp_clauses (buffer
, OMP_TEAMS_CLAUSES (node
), spc
, flags
);
2406 case OMP_TARGET_DATA
:
2407 pp_string (buffer
, "#pragma omp target data");
2408 dump_omp_clauses (buffer
, OMP_TARGET_DATA_CLAUSES (node
), spc
, flags
);
2412 pp_string (buffer
, "#pragma omp target");
2413 dump_omp_clauses (buffer
, OMP_TARGET_CLAUSES (node
), spc
, flags
);
2416 case OMP_TARGET_UPDATE
:
2417 pp_string (buffer
, "#pragma omp target update");
2418 dump_omp_clauses (buffer
, OMP_TARGET_UPDATE_CLAUSES (node
), spc
, flags
);
2423 dump_omp_clauses (buffer
, OMP_FOR_CLAUSES (node
), spc
, flags
);
2425 if (!(flags
& TDF_SLIM
))
2429 if (OMP_FOR_PRE_BODY (node
))
2431 newline_and_indent (buffer
, spc
+ 2);
2432 pp_left_brace (buffer
);
2434 newline_and_indent (buffer
, spc
);
2435 dump_generic_node (buffer
, OMP_FOR_PRE_BODY (node
),
2438 if (OMP_FOR_INIT (node
))
2441 for (i
= 0; i
< TREE_VEC_LENGTH (OMP_FOR_INIT (node
)); i
++)
2444 newline_and_indent (buffer
, spc
);
2445 pp_string (buffer
, "for (");
2446 dump_generic_node (buffer
,
2447 TREE_VEC_ELT (OMP_FOR_INIT (node
), i
),
2449 pp_string (buffer
, "; ");
2450 dump_generic_node (buffer
,
2451 TREE_VEC_ELT (OMP_FOR_COND (node
), i
),
2453 pp_string (buffer
, "; ");
2454 dump_generic_node (buffer
,
2455 TREE_VEC_ELT (OMP_FOR_INCR (node
), i
),
2457 pp_right_paren (buffer
);
2460 if (OMP_FOR_BODY (node
))
2462 newline_and_indent (buffer
, spc
+ 2);
2463 pp_left_brace (buffer
);
2464 newline_and_indent (buffer
, spc
+ 4);
2465 dump_generic_node (buffer
, OMP_FOR_BODY (node
), spc
+ 4, flags
,
2467 newline_and_indent (buffer
, spc
+ 2);
2468 pp_right_brace (buffer
);
2470 if (OMP_FOR_INIT (node
))
2471 spc
-= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node
)) - 2;
2472 if (OMP_FOR_PRE_BODY (node
))
2475 newline_and_indent (buffer
, spc
+ 2);
2476 pp_right_brace (buffer
);
2483 pp_string (buffer
, "#pragma omp sections");
2484 dump_omp_clauses (buffer
, OMP_SECTIONS_CLAUSES (node
), spc
, flags
);
2488 pp_string (buffer
, "#pragma omp section");
2492 pp_string (buffer
, "#pragma omp master");
2496 pp_string (buffer
, "#pragma omp taskgroup");
2500 pp_string (buffer
, "#pragma omp ordered");
2504 pp_string (buffer
, "#pragma omp critical");
2505 if (OMP_CRITICAL_NAME (node
))
2508 pp_left_paren (buffer
);
2509 dump_generic_node (buffer
, OMP_CRITICAL_NAME (node
), spc
,
2511 pp_right_paren (buffer
);
2516 pp_string (buffer
, "#pragma omp atomic");
2517 if (OMP_ATOMIC_SEQ_CST (node
))
2518 pp_string (buffer
, " seq_cst");
2519 newline_and_indent (buffer
, spc
+ 2);
2520 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2524 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2527 case OMP_ATOMIC_READ
:
2528 pp_string (buffer
, "#pragma omp atomic read");
2529 if (OMP_ATOMIC_SEQ_CST (node
))
2530 pp_string (buffer
, " seq_cst");
2531 newline_and_indent (buffer
, spc
+ 2);
2532 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2536 case OMP_ATOMIC_CAPTURE_OLD
:
2537 case OMP_ATOMIC_CAPTURE_NEW
:
2538 pp_string (buffer
, "#pragma omp atomic capture");
2539 if (OMP_ATOMIC_SEQ_CST (node
))
2540 pp_string (buffer
, " seq_cst");
2541 newline_and_indent (buffer
, spc
+ 2);
2542 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2546 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2550 pp_string (buffer
, "#pragma omp single");
2551 dump_omp_clauses (buffer
, OMP_SINGLE_CLAUSES (node
), spc
, flags
);
2555 dump_omp_clause (buffer
, node
, spc
, flags
);
2559 case TRANSACTION_EXPR
:
2560 if (TRANSACTION_EXPR_OUTER (node
))
2561 pp_string (buffer
, "__transaction_atomic [[outer]]");
2562 else if (TRANSACTION_EXPR_RELAXED (node
))
2563 pp_string (buffer
, "__transaction_relaxed");
2565 pp_string (buffer
, "__transaction_atomic");
2566 if (!(flags
& TDF_SLIM
) && TRANSACTION_EXPR_BODY (node
))
2568 newline_and_indent (buffer
, spc
);
2569 pp_left_brace (buffer
);
2570 newline_and_indent (buffer
, spc
+ 2);
2571 dump_generic_node (buffer
, TRANSACTION_EXPR_BODY (node
),
2572 spc
+ 2, flags
, false);
2573 newline_and_indent (buffer
, spc
);
2574 pp_right_brace (buffer
);
2579 case REDUC_MAX_EXPR
:
2580 pp_string (buffer
, " REDUC_MAX_EXPR < ");
2581 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2582 pp_string (buffer
, " > ");
2585 case REDUC_MIN_EXPR
:
2586 pp_string (buffer
, " REDUC_MIN_EXPR < ");
2587 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2588 pp_string (buffer
, " > ");
2591 case REDUC_PLUS_EXPR
:
2592 pp_string (buffer
, " REDUC_PLUS_EXPR < ");
2593 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2594 pp_string (buffer
, " > ");
2597 case VEC_WIDEN_MULT_HI_EXPR
:
2598 case VEC_WIDEN_MULT_LO_EXPR
:
2599 case VEC_WIDEN_MULT_EVEN_EXPR
:
2600 case VEC_WIDEN_MULT_ODD_EXPR
:
2601 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2602 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2604 for (str
= get_tree_code_name (code
); *str
; str
++)
2605 pp_character (buffer
, TOUPPER (*str
));
2606 pp_string (buffer
, " < ");
2607 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2608 pp_string (buffer
, ", ");
2609 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2610 pp_string (buffer
, " > ");
2613 case VEC_UNPACK_HI_EXPR
:
2614 pp_string (buffer
, " VEC_UNPACK_HI_EXPR < ");
2615 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2616 pp_string (buffer
, " > ");
2619 case VEC_UNPACK_LO_EXPR
:
2620 pp_string (buffer
, " VEC_UNPACK_LO_EXPR < ");
2621 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2622 pp_string (buffer
, " > ");
2625 case VEC_UNPACK_FLOAT_HI_EXPR
:
2626 pp_string (buffer
, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2627 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2628 pp_string (buffer
, " > ");
2631 case VEC_UNPACK_FLOAT_LO_EXPR
:
2632 pp_string (buffer
, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2633 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2634 pp_string (buffer
, " > ");
2637 case VEC_PACK_TRUNC_EXPR
:
2638 pp_string (buffer
, " VEC_PACK_TRUNC_EXPR < ");
2639 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2640 pp_string (buffer
, ", ");
2641 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2642 pp_string (buffer
, " > ");
2645 case VEC_PACK_SAT_EXPR
:
2646 pp_string (buffer
, " VEC_PACK_SAT_EXPR < ");
2647 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2648 pp_string (buffer
, ", ");
2649 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2650 pp_string (buffer
, " > ");
2653 case VEC_PACK_FIX_TRUNC_EXPR
:
2654 pp_string (buffer
, " VEC_PACK_FIX_TRUNC_EXPR < ");
2655 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2656 pp_string (buffer
, ", ");
2657 dump_generic_node (buffer
, TREE_OPERAND (node
, 1), spc
, flags
, false);
2658 pp_string (buffer
, " > ");
2662 dump_block_node (buffer
, node
, spc
, flags
);
2665 case CILK_SPAWN_STMT
:
2666 pp_string (buffer
, "_Cilk_spawn ");
2667 dump_generic_node (buffer
, TREE_OPERAND (node
, 0), spc
, flags
, false);
2670 case CILK_SYNC_STMT
:
2671 pp_string (buffer
, "_Cilk_sync");
2678 if (is_stmt
&& is_expr
)
2679 pp_semicolon (buffer
);
2684 /* Print the declaration of a variable. */
2687 print_declaration (pretty_printer
*buffer
, tree t
, int spc
, int flags
)
2691 if (TREE_CODE(t
) == NAMELIST_DECL
)
2693 pp_string(buffer
, "namelist ");
2694 dump_decl_name (buffer
, t
, flags
);
2695 pp_semicolon (buffer
);
2699 if (TREE_CODE (t
) == TYPE_DECL
)
2700 pp_string (buffer
, "typedef ");
2702 if (CODE_CONTAINS_STRUCT (TREE_CODE (t
), TS_DECL_WRTL
) && DECL_REGISTER (t
))
2703 pp_string (buffer
, "register ");
2705 if (TREE_PUBLIC (t
) && DECL_EXTERNAL (t
))
2706 pp_string (buffer
, "extern ");
2707 else if (TREE_STATIC (t
))
2708 pp_string (buffer
, "static ");
2710 /* Print the type and name. */
2711 if (TREE_TYPE (t
) && TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
)
2715 /* Print array's type. */
2716 tmp
= TREE_TYPE (t
);
2717 while (TREE_CODE (TREE_TYPE (tmp
)) == ARRAY_TYPE
)
2718 tmp
= TREE_TYPE (tmp
);
2719 dump_generic_node (buffer
, TREE_TYPE (tmp
), spc
, flags
, false);
2721 /* Print variable's name. */
2723 dump_generic_node (buffer
, t
, spc
, flags
, false);
2725 /* Print the dimensions. */
2726 tmp
= TREE_TYPE (t
);
2727 while (TREE_CODE (tmp
) == ARRAY_TYPE
)
2729 dump_array_domain (buffer
, TYPE_DOMAIN (tmp
), spc
, flags
);
2730 tmp
= TREE_TYPE (tmp
);
2733 else if (TREE_CODE (t
) == FUNCTION_DECL
)
2735 dump_generic_node (buffer
, TREE_TYPE (TREE_TYPE (t
)), spc
, flags
, false);
2737 dump_decl_name (buffer
, t
, flags
);
2738 dump_function_declaration (buffer
, TREE_TYPE (t
), spc
, flags
);
2742 /* Print type declaration. */
2743 dump_generic_node (buffer
, TREE_TYPE (t
), spc
, flags
, false);
2745 /* Print variable's name. */
2747 dump_generic_node (buffer
, t
, spc
, flags
, false);
2750 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HARD_REGISTER (t
))
2752 pp_string (buffer
, " __asm__ ");
2753 pp_left_paren (buffer
);
2754 dump_generic_node (buffer
, DECL_ASSEMBLER_NAME (t
), spc
, flags
, false);
2755 pp_right_paren (buffer
);
2758 /* The initial value of a function serves to determine whether the function
2759 is declared or defined. So the following does not apply to function
2761 if (TREE_CODE (t
) != FUNCTION_DECL
)
2763 /* Print the initial value. */
2764 if (DECL_INITIAL (t
))
2769 dump_generic_node (buffer
, DECL_INITIAL (t
), spc
, flags
, false);
2773 if (TREE_CODE (t
) == VAR_DECL
&& DECL_HAS_VALUE_EXPR_P (t
))
2775 pp_string (buffer
, " [value-expr: ");
2776 dump_generic_node (buffer
, DECL_VALUE_EXPR (t
), spc
, flags
, false);
2777 pp_right_bracket (buffer
);
2780 pp_semicolon (buffer
);
2784 /* Prints a structure: name, fields, and methods.
2785 FIXME: Still incomplete. */
2788 print_struct_decl (pretty_printer
*buffer
, const_tree node
, int spc
, int flags
)
2790 /* Print the name of the structure. */
2791 if (TYPE_NAME (node
))
2794 if (TREE_CODE (node
) == RECORD_TYPE
)
2795 pp_string (buffer
, "struct ");
2796 else if ((TREE_CODE (node
) == UNION_TYPE
2797 || TREE_CODE (node
) == QUAL_UNION_TYPE
))
2798 pp_string (buffer
, "union ");
2800 dump_generic_node (buffer
, TYPE_NAME (node
), spc
, 0, false);
2803 /* Print the contents of the structure. */
2804 pp_newline (buffer
);
2806 pp_left_brace (buffer
);
2807 pp_newline (buffer
);
2809 /* Print the fields of the structure. */
2812 tmp
= TYPE_FIELDS (node
);
2815 /* Avoid to print recursively the structure. */
2816 /* FIXME : Not implemented correctly...,
2817 what about the case when we have a cycle in the contain graph? ...
2818 Maybe this could be solved by looking at the scope in which the
2819 structure was declared. */
2820 if (TREE_TYPE (tmp
) != node
2821 && (TREE_CODE (TREE_TYPE (tmp
)) != POINTER_TYPE
2822 || TREE_TYPE (TREE_TYPE (tmp
)) != node
))
2824 print_declaration (buffer
, tmp
, spc
+2, flags
);
2825 pp_newline (buffer
);
2827 tmp
= DECL_CHAIN (tmp
);
2831 pp_right_brace (buffer
);
2834 /* Return the priority of the operator CODE.
2836 From lowest to highest precedence with either left-to-right (L-R)
2837 or right-to-left (R-L) associativity]:
2840 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2852 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2853 15 [L-R] fn() [] -> .
2855 unary +, - and * have higher precedence than the corresponding binary
2859 op_code_prio (enum tree_code code
)
2876 case TRUTH_ORIF_EXPR
:
2879 case TRUTH_AND_EXPR
:
2880 case TRUTH_ANDIF_EXPR
:
2887 case TRUTH_XOR_EXPR
:
2904 case UNORDERED_EXPR
:
2915 case VEC_WIDEN_LSHIFT_HI_EXPR
:
2916 case VEC_WIDEN_LSHIFT_LO_EXPR
:
2917 case WIDEN_LSHIFT_EXPR
:
2920 case WIDEN_SUM_EXPR
:
2922 case POINTER_PLUS_EXPR
:
2926 case VEC_WIDEN_MULT_HI_EXPR
:
2927 case VEC_WIDEN_MULT_LO_EXPR
:
2928 case WIDEN_MULT_EXPR
:
2930 case WIDEN_MULT_PLUS_EXPR
:
2931 case WIDEN_MULT_MINUS_EXPR
:
2933 case MULT_HIGHPART_EXPR
:
2934 case TRUNC_DIV_EXPR
:
2936 case FLOOR_DIV_EXPR
:
2937 case ROUND_DIV_EXPR
:
2939 case EXACT_DIV_EXPR
:
2940 case TRUNC_MOD_EXPR
:
2942 case FLOOR_MOD_EXPR
:
2943 case ROUND_MOD_EXPR
:
2947 case TRUTH_NOT_EXPR
:
2949 case POSTINCREMENT_EXPR
:
2950 case POSTDECREMENT_EXPR
:
2951 case PREINCREMENT_EXPR
:
2952 case PREDECREMENT_EXPR
:
2958 case FIX_TRUNC_EXPR
:
2964 case ARRAY_RANGE_REF
:
2968 /* Special expressions. */
2974 case REDUC_MAX_EXPR
:
2975 case REDUC_MIN_EXPR
:
2976 case REDUC_PLUS_EXPR
:
2977 case VEC_LSHIFT_EXPR
:
2978 case VEC_RSHIFT_EXPR
:
2979 case VEC_UNPACK_HI_EXPR
:
2980 case VEC_UNPACK_LO_EXPR
:
2981 case VEC_UNPACK_FLOAT_HI_EXPR
:
2982 case VEC_UNPACK_FLOAT_LO_EXPR
:
2983 case VEC_PACK_TRUNC_EXPR
:
2984 case VEC_PACK_SAT_EXPR
:
2988 /* Return an arbitrarily high precedence to avoid surrounding single
2989 VAR_DECLs in ()s. */
2994 /* Return the priority of the operator OP. */
2997 op_prio (const_tree op
)
2999 enum tree_code code
;
3004 code
= TREE_CODE (op
);
3005 if (code
== SAVE_EXPR
|| code
== NON_LVALUE_EXPR
)
3006 return op_prio (TREE_OPERAND (op
, 0));
3008 return op_code_prio (code
);
3011 /* Return the symbol associated with operator CODE. */
3014 op_symbol_code (enum tree_code code
)
3022 case TRUTH_ORIF_EXPR
:
3025 case TRUTH_AND_EXPR
:
3026 case TRUTH_ANDIF_EXPR
:
3032 case TRUTH_XOR_EXPR
:
3042 case UNORDERED_EXPR
:
3088 case VEC_LSHIFT_EXPR
:
3091 case VEC_RSHIFT_EXPR
:
3094 case WIDEN_LSHIFT_EXPR
:
3097 case POINTER_PLUS_EXPR
:
3103 case REDUC_PLUS_EXPR
:
3106 case WIDEN_SUM_EXPR
:
3109 case WIDEN_MULT_EXPR
:
3112 case MULT_HIGHPART_EXPR
:
3122 case TRUTH_NOT_EXPR
:
3129 case TRUNC_DIV_EXPR
:
3136 case FLOOR_DIV_EXPR
:
3139 case ROUND_DIV_EXPR
:
3142 case EXACT_DIV_EXPR
:
3145 case TRUNC_MOD_EXPR
:
3151 case FLOOR_MOD_EXPR
:
3154 case ROUND_MOD_EXPR
:
3157 case PREDECREMENT_EXPR
:
3160 case PREINCREMENT_EXPR
:
3163 case POSTDECREMENT_EXPR
:
3166 case POSTINCREMENT_EXPR
:
3176 return "<<< ??? >>>";
3180 /* Return the symbol associated with operator OP. */
3183 op_symbol (const_tree op
)
3185 return op_symbol_code (TREE_CODE (op
));
3188 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
3189 the gimple_call_fn of a GIMPLE_CALL. */
3192 print_call_name (pretty_printer
*buffer
, tree node
, int flags
)
3196 if (TREE_CODE (op0
) == NON_LVALUE_EXPR
)
3197 op0
= TREE_OPERAND (op0
, 0);
3200 switch (TREE_CODE (op0
))
3205 dump_function_name (buffer
, op0
, flags
);
3211 op0
= TREE_OPERAND (op0
, 0);
3215 pp_left_paren (buffer
);
3216 dump_generic_node (buffer
, TREE_OPERAND (op0
, 0), 0, flags
, false);
3217 pp_string (buffer
, ") ? ");
3218 dump_generic_node (buffer
, TREE_OPERAND (op0
, 1), 0, flags
, false);
3219 pp_string (buffer
, " : ");
3220 dump_generic_node (buffer
, TREE_OPERAND (op0
, 2), 0, flags
, false);
3224 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == VAR_DECL
)
3225 dump_function_name (buffer
, TREE_OPERAND (op0
, 0), flags
);
3227 dump_generic_node (buffer
, op0
, 0, flags
, false);
3231 if (integer_zerop (TREE_OPERAND (op0
, 1)))
3233 op0
= TREE_OPERAND (op0
, 0);
3240 dump_generic_node (buffer
, op0
, 0, flags
, false);
3248 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
3251 pretty_print_string (pretty_printer
*buffer
, const char *str
)
3261 pp_string (buffer
, "\\b");
3265 pp_string (buffer
, "\\f");
3269 pp_string (buffer
, "\\n");
3273 pp_string (buffer
, "\\r");
3277 pp_string (buffer
, "\\t");
3281 pp_string (buffer
, "\\v");
3285 pp_string (buffer
, "\\\\");
3289 pp_string (buffer
, "\\\"");
3293 pp_string (buffer
, "\\'");
3296 /* No need to handle \0; the loop terminates on \0. */
3299 pp_string (buffer
, "\\1");
3303 pp_string (buffer
, "\\2");
3307 pp_string (buffer
, "\\3");
3311 pp_string (buffer
, "\\4");
3315 pp_string (buffer
, "\\5");
3319 pp_string (buffer
, "\\6");
3323 pp_string (buffer
, "\\7");
3327 pp_character (buffer
, str
[0]);
3335 maybe_init_pretty_print (FILE *file
)
3339 new (&buffer
) pretty_printer ();
3340 pp_needs_newline (&buffer
) = true;
3341 pp_translate_identifiers (&buffer
) = false;
3345 buffer
.buffer
->stream
= file
;
3349 newline_and_indent (pretty_printer
*buffer
, int spc
)
3351 pp_newline (buffer
);
3355 /* Handle a %K format for TEXT. Separate from default_tree_printer so
3356 it can also be used in front ends.
3357 %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
3361 percent_K_format (text_info
*text
)
3363 tree t
= va_arg (*text
->args_ptr
, tree
), block
;
3364 gcc_assert (text
->locus
!= NULL
);
3365 *text
->locus
= EXPR_LOCATION (t
);
3366 gcc_assert (pp_ti_abstract_origin (text
) != NULL
);
3367 block
= TREE_BLOCK (t
);
3368 *pp_ti_abstract_origin (text
) = NULL
;
3372 /* ??? LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those
3373 representing the outermost block of an inlined function.
3374 So walk the BLOCK tree until we hit such a scope. */
3376 && TREE_CODE (block
) == BLOCK
)
3378 if (inlined_function_outer_scope_p (block
))
3380 *pp_ti_abstract_origin (text
) = block
;
3383 block
= BLOCK_SUPERCONTEXT (block
);
3389 && TREE_CODE (block
) == BLOCK
3390 && BLOCK_ABSTRACT_ORIGIN (block
))
3392 tree ao
= BLOCK_ABSTRACT_ORIGIN (block
);
3394 while (TREE_CODE (ao
) == BLOCK
3395 && BLOCK_ABSTRACT_ORIGIN (ao
)
3396 && BLOCK_ABSTRACT_ORIGIN (ao
) != ao
)
3397 ao
= BLOCK_ABSTRACT_ORIGIN (ao
);
3399 if (TREE_CODE (ao
) == FUNCTION_DECL
)
3401 *pp_ti_abstract_origin (text
) = block
;
3404 block
= BLOCK_SUPERCONTEXT (block
);
3408 /* Print the identifier ID to PRETTY-PRINTER. */
3411 pp_tree_identifier (pretty_printer
*pp
, tree id
)
3413 if (pp_translate_identifiers (pp
))
3415 const char *text
= identifier_to_locale (IDENTIFIER_POINTER (id
));
3416 pp_append_text (pp
, text
, text
+ strlen (text
));
3419 pp_append_text (pp
, IDENTIFIER_POINTER (id
),
3420 IDENTIFIER_POINTER (id
) + IDENTIFIER_LENGTH (id
));
3423 /* A helper function that is used to dump function information before the
3427 dump_function_header (FILE *dump_file
, tree fdecl
, int flags
)
3429 const char *dname
, *aname
;
3430 struct cgraph_node
*node
= cgraph_get_node (fdecl
);
3431 struct function
*fun
= DECL_STRUCT_FUNCTION (fdecl
);
3433 dname
= lang_hooks
.decl_printable_name (fdecl
, 2);
3435 if (DECL_ASSEMBLER_NAME_SET_P (fdecl
))
3436 aname
= (IDENTIFIER_POINTER
3437 (DECL_ASSEMBLER_NAME (fdecl
)));
3439 aname
= "<unset-asm-name>";
3441 if (L_IPO_COMP_MODE
)
3442 fprintf (dump_file
, "\n;; Function %s (%s, funcdef_no=%d:%d",
3443 dname
, aname
, FUNC_DECL_MODULE_ID (fun
),
3444 FUNC_DECL_FUNC_ID (fun
));
3446 fprintf (dump_file
, "\n;; Function %s (%s, funcdef_no=%d",
3447 dname
, aname
, fun
->funcdef_no
+ (flag_dyn_ipa
? 1 : 0));
3448 if (!(flags
& TDF_NOUID
))
3449 fprintf (dump_file
, ", decl_uid=%d", DECL_UID (fdecl
));
3452 fprintf (dump_file
, ", cgraph_uid=%d", node
->uid
);
3453 fprintf (dump_file
, ", symbol_order=%d)%s\n\n", node
->order
,
3454 node
->frequency
== NODE_FREQUENCY_HOT
3456 : node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
3457 ? " (unlikely executed)"
3458 : node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
3459 ? " (executed once)"
3463 fprintf (dump_file
, ")\n\n");
3466 /* Dump double_int D to pretty_printer PP. UNS is true
3467 if D is unsigned and false otherwise. */
3469 pp_double_int (pretty_printer
*pp
, double_int d
, bool uns
)
3472 pp_wide_integer (pp
, d
.low
);
3473 else if (d
.fits_uhwi ())
3474 pp_unsigned_wide_integer (pp
, d
.low
);
3475 else if (HOST_BITS_PER_DOUBLE_INT
== HOST_BITS_PER_WIDEST_INT
)
3478 ? HOST_WIDEST_INT_PRINT_UNSIGNED
: HOST_WIDEST_INT_PRINT_DEC
,
3479 (HOST_WIDEST_INT
) ((((unsigned HOST_WIDEST_INT
) d
.high
<< 1)
3480 << (HOST_BITS_PER_WIDE_INT
- 1)) | d
.low
));
3483 unsigned HOST_WIDE_INT low
= d
.low
;
3484 HOST_WIDE_INT high
= d
.high
;
3485 if (!uns
&& d
.is_negative ())
3488 high
= ~high
+ !low
;
3491 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
3493 sprintf (pp_buffer (pp
)->digit_buffer
,
3494 HOST_WIDE_INT_PRINT_DOUBLE_HEX
,
3495 (unsigned HOST_WIDE_INT
) high
, low
);
3496 pp_string (pp
, pp_buffer (pp
)->digit_buffer
);