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"
40 #include <new> // For placement-new.
42 /* Local functions, macros and variables. */
43 static const char *op_symbol (const_tree);
44 static void pretty_print_string (pretty_printer *, const char*);
45 static void newline_and_indent (pretty_printer *, int);
46 static void maybe_init_pretty_print (FILE *);
47 static void print_struct_decl (pretty_printer *, const_tree, int, int);
48 static void do_niy (pretty_printer *, const_tree);
50 #define INDENT(SPACE) do { \
51 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
53 #define NIY do_niy (buffer, node)
55 static pretty_printer buffer;
56 static int initialized = 0;
58 /* Try to print something for an unknown tree code. */
61 do_niy (pretty_printer *buffer, const_tree node)
65 pp_string (buffer, "<<< Unknown tree: ");
66 pp_string (buffer, get_tree_code_name (TREE_CODE (node)));
70 len = TREE_OPERAND_LENGTH (node);
71 for (i = 0; i < len; ++i)
73 newline_and_indent (buffer, 2);
74 dump_generic_node (buffer, TREE_OPERAND (node, i), 2, 0, false);
78 pp_string (buffer, " >>>");
81 /* Debugging function to print out a generic expression. */
84 debug_generic_expr (tree t)
86 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS);
87 fprintf (stderr, "\n");
90 /* Debugging function to print out a generic statement. */
93 debug_generic_stmt (tree t)
95 print_generic_stmt (stderr, t, TDF_VOPS|TDF_MEMSYMS);
96 fprintf (stderr, "\n");
99 /* Debugging function to print out a chain of trees . */
102 debug_tree_chain (tree t)
104 struct pointer_set_t *seen = pointer_set_create ();
108 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
109 fprintf (stderr, " ");
111 if (pointer_set_insert (seen, t))
113 fprintf (stderr, "... [cycled back to ");
114 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
115 fprintf (stderr, "]");
119 fprintf (stderr, "\n");
121 pointer_set_destroy (seen);
124 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
126 print_generic_decl (FILE *file, tree decl, int flags)
128 maybe_init_pretty_print (file);
129 print_declaration (&buffer, decl, 2, flags);
130 pp_write_text_to_stream (&buffer);
133 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
134 to show in the dump. See TDF_* in dumpfile.h. */
137 print_generic_stmt (FILE *file, tree t, int flags)
139 maybe_init_pretty_print (file);
140 dump_generic_node (&buffer, t, 0, flags, true);
141 pp_newline_and_flush (&buffer);
144 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
145 to show in the dump. See TDF_* in dumpfile.h. The output is indented by
149 print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
153 maybe_init_pretty_print (file);
155 for (i = 0; i < indent; i++)
157 dump_generic_node (&buffer, t, indent, flags, true);
158 pp_newline_and_flush (&buffer);
161 /* Print a single expression T on file FILE. FLAGS specifies details to show
162 in the dump. See TDF_* in dumpfile.h. */
165 print_generic_expr (FILE *file, tree t, int flags)
167 maybe_init_pretty_print (file);
168 dump_generic_node (&buffer, t, 0, flags, false);
172 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
176 dump_decl_name (pretty_printer *buffer, tree node, int flags)
178 if (DECL_NAME (node))
180 if ((flags & TDF_ASMNAME) && DECL_ASSEMBLER_NAME_SET_P (node))
181 pp_tree_identifier (buffer, DECL_ASSEMBLER_NAME (node));
183 pp_tree_identifier (buffer, DECL_NAME (node));
185 if ((flags & TDF_UID) || DECL_NAME (node) == NULL_TREE)
187 if (TREE_CODE (node) == LABEL_DECL && LABEL_DECL_UID (node) != -1)
188 pp_printf (buffer, "L.%d", (int) LABEL_DECL_UID (node));
189 else if (TREE_CODE (node) == DEBUG_EXPR_DECL)
191 if (flags & TDF_NOUID)
192 pp_string (buffer, "D#xxxx");
194 pp_printf (buffer, "D#%i", DEBUG_TEMP_UID (node));
198 char c = TREE_CODE (node) == CONST_DECL ? 'C' : 'D';
199 if (flags & TDF_NOUID)
200 pp_printf (buffer, "%c.xxxx", c);
202 pp_printf (buffer, "%c.%u", c, DECL_UID (node));
205 if ((flags & TDF_ALIAS) && DECL_PT_UID (node) != DECL_UID (node))
207 if (flags & TDF_NOUID)
208 pp_printf (buffer, "ptD.xxxx");
210 pp_printf (buffer, "ptD.%u", DECL_PT_UID (node));
214 /* Like the above, but used for pretty printing function calls. */
217 dump_function_name (pretty_printer *buffer, tree node, int flags)
219 if (TREE_CODE (node) == NOP_EXPR)
220 node = TREE_OPERAND (node, 0);
221 if (DECL_NAME (node) && (flags & TDF_ASMNAME) == 0)
222 pp_string (buffer, lang_hooks.decl_printable_name (node, 1));
224 dump_decl_name (buffer, node, flags);
227 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
228 FLAGS are as in dump_generic_node. */
231 dump_function_declaration (pretty_printer *buffer, tree node,
234 bool wrote_arg = false;
238 pp_left_paren (buffer);
240 /* Print the argument types. */
241 arg = TYPE_ARG_TYPES (node);
242 while (arg && arg != void_list_node && arg != error_mark_node)
250 dump_generic_node (buffer, TREE_VALUE (arg), spc, flags, false);
251 arg = TREE_CHAIN (arg);
254 /* Drop the trailing void_type_node if we had any previous argument. */
255 if (arg == void_list_node && !wrote_arg)
256 pp_string (buffer, "void");
257 /* Properly dump vararg function types. */
258 else if (!arg && wrote_arg)
259 pp_string (buffer, ", ...");
260 /* Avoid printing any arg for unprototyped functions. */
262 pp_right_paren (buffer);
265 /* Dump the domain associated with an array. */
268 dump_array_domain (pretty_printer *buffer, tree domain, int spc, int flags)
270 pp_left_bracket (buffer);
273 tree min = TYPE_MIN_VALUE (domain);
274 tree max = TYPE_MAX_VALUE (domain);
277 && integer_zerop (min)
278 && tree_fits_shwi_p (max))
279 pp_wide_integer (buffer, tree_to_shwi (max) + 1);
283 dump_generic_node (buffer, min, spc, flags, false);
286 dump_generic_node (buffer, max, spc, flags, false);
290 pp_string (buffer, "<unknown>");
291 pp_right_bracket (buffer);
295 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
296 dump_generic_node. */
299 dump_omp_clause (pretty_printer *buffer, tree clause, int spc, int flags)
303 switch (OMP_CLAUSE_CODE (clause))
305 case OMP_CLAUSE_PRIVATE:
308 case OMP_CLAUSE_SHARED:
311 case OMP_CLAUSE_FIRSTPRIVATE:
312 name = "firstprivate";
314 case OMP_CLAUSE_LASTPRIVATE:
315 name = "lastprivate";
317 case OMP_CLAUSE_COPYIN:
320 case OMP_CLAUSE_COPYPRIVATE:
321 name = "copyprivate";
323 case OMP_CLAUSE_UNIFORM:
326 case OMP_CLAUSE__LOOPTEMP_:
330 pp_string (buffer, name);
331 pp_left_paren (buffer);
332 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
334 pp_right_paren (buffer);
337 case OMP_CLAUSE_REDUCTION:
338 pp_string (buffer, "reduction(");
339 if (OMP_CLAUSE_REDUCTION_CODE (clause) != ERROR_MARK)
342 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause)));
345 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
347 pp_right_paren (buffer);
351 pp_string (buffer, "if(");
352 dump_generic_node (buffer, OMP_CLAUSE_IF_EXPR (clause),
354 pp_right_paren (buffer);
357 case OMP_CLAUSE_NUM_THREADS:
358 pp_string (buffer, "num_threads(");
359 dump_generic_node (buffer, OMP_CLAUSE_NUM_THREADS_EXPR (clause),
361 pp_right_paren (buffer);
364 case OMP_CLAUSE_NOWAIT:
365 pp_string (buffer, "nowait");
367 case OMP_CLAUSE_ORDERED:
368 pp_string (buffer, "ordered");
371 case OMP_CLAUSE_DEFAULT:
372 pp_string (buffer, "default(");
373 switch (OMP_CLAUSE_DEFAULT_KIND (clause))
375 case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
377 case OMP_CLAUSE_DEFAULT_SHARED:
378 pp_string (buffer, "shared");
380 case OMP_CLAUSE_DEFAULT_NONE:
381 pp_string (buffer, "none");
383 case OMP_CLAUSE_DEFAULT_PRIVATE:
384 pp_string (buffer, "private");
386 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
387 pp_string (buffer, "firstprivate");
392 pp_right_paren (buffer);
395 case OMP_CLAUSE_SCHEDULE:
396 pp_string (buffer, "schedule(");
397 switch (OMP_CLAUSE_SCHEDULE_KIND (clause))
399 case OMP_CLAUSE_SCHEDULE_STATIC:
400 pp_string (buffer, "static");
402 case OMP_CLAUSE_SCHEDULE_DYNAMIC:
403 pp_string (buffer, "dynamic");
405 case OMP_CLAUSE_SCHEDULE_GUIDED:
406 pp_string (buffer, "guided");
408 case OMP_CLAUSE_SCHEDULE_RUNTIME:
409 pp_string (buffer, "runtime");
411 case OMP_CLAUSE_SCHEDULE_AUTO:
412 pp_string (buffer, "auto");
417 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
420 dump_generic_node (buffer, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
423 pp_right_paren (buffer);
426 case OMP_CLAUSE_UNTIED:
427 pp_string (buffer, "untied");
430 case OMP_CLAUSE_COLLAPSE:
431 pp_string (buffer, "collapse(");
432 dump_generic_node (buffer, OMP_CLAUSE_COLLAPSE_EXPR (clause),
434 pp_right_paren (buffer);
437 case OMP_CLAUSE_FINAL:
438 pp_string (buffer, "final(");
439 dump_generic_node (buffer, OMP_CLAUSE_FINAL_EXPR (clause),
441 pp_right_paren (buffer);
444 case OMP_CLAUSE_MERGEABLE:
445 pp_string (buffer, "mergeable");
448 case OMP_CLAUSE_LINEAR:
449 pp_string (buffer, "linear(");
450 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
453 dump_generic_node (buffer, OMP_CLAUSE_LINEAR_STEP (clause),
455 pp_right_paren (buffer);
458 case OMP_CLAUSE_ALIGNED:
459 pp_string (buffer, "aligned(");
460 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
462 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause))
465 dump_generic_node (buffer, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause),
468 pp_right_paren (buffer);
471 case OMP_CLAUSE_DEPEND:
472 pp_string (buffer, "depend(");
473 switch (OMP_CLAUSE_DEPEND_KIND (clause))
475 case OMP_CLAUSE_DEPEND_IN:
476 pp_string (buffer, "in");
478 case OMP_CLAUSE_DEPEND_OUT:
479 pp_string (buffer, "out");
481 case OMP_CLAUSE_DEPEND_INOUT:
482 pp_string (buffer, "inout");
488 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
490 pp_right_paren (buffer);
494 pp_string (buffer, "map(");
495 switch (OMP_CLAUSE_MAP_KIND (clause))
497 case OMP_CLAUSE_MAP_ALLOC:
498 case OMP_CLAUSE_MAP_POINTER:
499 pp_string (buffer, "alloc");
501 case OMP_CLAUSE_MAP_TO:
502 case OMP_CLAUSE_MAP_TO_PSET:
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: ");
523 else if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
524 && OMP_CLAUSE_MAP_KIND (clause) == OMP_CLAUSE_MAP_TO_PSET)
525 pp_string (buffer, " [pointer set, len: ");
527 pp_string (buffer, " [len: ");
528 dump_generic_node (buffer, OMP_CLAUSE_SIZE (clause),
530 pp_right_bracket (buffer);
532 pp_right_paren (buffer);
535 case OMP_CLAUSE_FROM:
536 pp_string (buffer, "from(");
537 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
539 goto print_clause_size;
542 pp_string (buffer, "to(");
543 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
545 goto print_clause_size;
547 case OMP_CLAUSE_NUM_TEAMS:
548 pp_string (buffer, "num_teams(");
549 dump_generic_node (buffer, OMP_CLAUSE_NUM_TEAMS_EXPR (clause),
551 pp_right_paren (buffer);
554 case OMP_CLAUSE_THREAD_LIMIT:
555 pp_string (buffer, "thread_limit(");
556 dump_generic_node (buffer, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause),
558 pp_right_paren (buffer);
561 case OMP_CLAUSE_DEVICE:
562 pp_string (buffer, "device(");
563 dump_generic_node (buffer, OMP_CLAUSE_DEVICE_ID (clause),
565 pp_right_paren (buffer);
568 case OMP_CLAUSE_DIST_SCHEDULE:
569 pp_string (buffer, "dist_schedule(static");
570 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause))
573 dump_generic_node (buffer,
574 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause),
577 pp_right_paren (buffer);
580 case OMP_CLAUSE_PROC_BIND:
581 pp_string (buffer, "proc_bind(");
582 switch (OMP_CLAUSE_PROC_BIND_KIND (clause))
584 case OMP_CLAUSE_PROC_BIND_MASTER:
585 pp_string (buffer, "master");
587 case OMP_CLAUSE_PROC_BIND_CLOSE:
588 pp_string (buffer, "close");
590 case OMP_CLAUSE_PROC_BIND_SPREAD:
591 pp_string (buffer, "spread");
596 pp_right_paren (buffer);
599 case OMP_CLAUSE_SAFELEN:
600 pp_string (buffer, "safelen(");
601 dump_generic_node (buffer, OMP_CLAUSE_SAFELEN_EXPR (clause),
603 pp_right_paren (buffer);
606 case OMP_CLAUSE_SIMDLEN:
607 pp_string (buffer, "simdlen(");
608 dump_generic_node (buffer, OMP_CLAUSE_SIMDLEN_EXPR (clause),
610 pp_right_paren (buffer);
613 case OMP_CLAUSE__SIMDUID_:
614 pp_string (buffer, "_simduid_(");
615 dump_generic_node (buffer, OMP_CLAUSE__SIMDUID__DECL (clause),
617 pp_right_paren (buffer);
620 case OMP_CLAUSE_INBRANCH:
621 pp_string (buffer, "inbranch");
623 case OMP_CLAUSE_NOTINBRANCH:
624 pp_string (buffer, "notinbranch");
627 pp_string (buffer, "for");
629 case OMP_CLAUSE_PARALLEL:
630 pp_string (buffer, "parallel");
632 case OMP_CLAUSE_SECTIONS:
633 pp_string (buffer, "sections");
635 case OMP_CLAUSE_TASKGROUP:
636 pp_string (buffer, "taskgroup");
640 /* Should never happen. */
641 dump_generic_node (buffer, clause, spc, flags, false);
647 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
648 dump_generic_node. */
651 dump_omp_clauses (pretty_printer *buffer, tree clause, int spc, int flags)
659 dump_omp_clause (buffer, clause, spc, flags);
660 clause = OMP_CLAUSE_CHAIN (clause);
668 /* Dump location LOC to BUFFER. */
671 dump_location (pretty_printer *buffer, location_t loc)
673 expanded_location xloc = expand_location (loc);
674 int discriminator = get_discriminator_from_locus (loc);
676 pp_left_bracket (buffer);
679 pp_string (buffer, xloc.file);
680 pp_string (buffer, " : ");
682 pp_decimal_int (buffer, xloc.line);
685 pp_string (buffer, " discrim ");
686 pp_decimal_int (buffer, discriminator);
688 pp_string (buffer, "] ");
692 /* Dump lexical block BLOCK. BUFFER, SPC and FLAGS are as in
693 dump_generic_node. */
696 dump_block_node (pretty_printer *buffer, tree block, int spc, int flags)
700 pp_printf (buffer, "BLOCK #%d ", BLOCK_NUMBER (block));
702 if (flags & TDF_ADDRESS)
703 pp_printf (buffer, "[%p] ", (void *) block);
705 if (BLOCK_ABSTRACT (block))
706 pp_string (buffer, "[abstract] ");
708 if (TREE_ASM_WRITTEN (block))
709 pp_string (buffer, "[written] ");
711 if (flags & TDF_SLIM)
714 if (BLOCK_SOURCE_LOCATION (block))
715 dump_location (buffer, BLOCK_SOURCE_LOCATION (block));
717 newline_and_indent (buffer, spc + 2);
719 if (BLOCK_SUPERCONTEXT (block))
721 pp_string (buffer, "SUPERCONTEXT: ");
722 dump_generic_node (buffer, BLOCK_SUPERCONTEXT (block), 0,
723 flags | TDF_SLIM, false);
724 newline_and_indent (buffer, spc + 2);
727 if (BLOCK_SUBBLOCKS (block))
729 pp_string (buffer, "SUBBLOCKS: ");
730 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
732 dump_generic_node (buffer, t, 0, flags | TDF_SLIM, false);
735 newline_and_indent (buffer, spc + 2);
738 if (BLOCK_CHAIN (block))
740 pp_string (buffer, "SIBLINGS: ");
741 for (t = BLOCK_CHAIN (block); t; t = BLOCK_CHAIN (t))
743 dump_generic_node (buffer, t, 0, flags | TDF_SLIM, false);
746 newline_and_indent (buffer, spc + 2);
749 if (BLOCK_VARS (block))
751 pp_string (buffer, "VARS: ");
752 for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
754 dump_generic_node (buffer, t, 0, flags, false);
757 newline_and_indent (buffer, spc + 2);
760 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block)) > 0)
763 vec<tree, va_gc> *nlv = BLOCK_NONLOCALIZED_VARS (block);
765 pp_string (buffer, "NONLOCALIZED_VARS: ");
766 FOR_EACH_VEC_ELT (*nlv, i, t)
768 dump_generic_node (buffer, t, 0, flags, false);
771 newline_and_indent (buffer, spc + 2);
774 if (BLOCK_ABSTRACT_ORIGIN (block))
776 pp_string (buffer, "ABSTRACT_ORIGIN: ");
777 dump_generic_node (buffer, BLOCK_ABSTRACT_ORIGIN (block), 0,
778 flags | TDF_SLIM, false);
779 newline_and_indent (buffer, spc + 2);
782 if (BLOCK_FRAGMENT_ORIGIN (block))
784 pp_string (buffer, "FRAGMENT_ORIGIN: ");
785 dump_generic_node (buffer, BLOCK_FRAGMENT_ORIGIN (block), 0,
786 flags | TDF_SLIM, false);
787 newline_and_indent (buffer, spc + 2);
790 if (BLOCK_FRAGMENT_CHAIN (block))
792 pp_string (buffer, "FRAGMENT_CHAIN: ");
793 for (t = BLOCK_FRAGMENT_CHAIN (block); t; t = BLOCK_FRAGMENT_CHAIN (t))
795 dump_generic_node (buffer, t, 0, flags | TDF_SLIM, false);
798 newline_and_indent (buffer, spc + 2);
803 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
804 indent. FLAGS specifies details to show in the dump (see TDF_* in
805 dumpfile.h). If IS_STMT is true, the object printed is considered
806 to be a statement and it is terminated by ';' if appropriate. */
809 dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
818 if (node == NULL_TREE)
821 is_expr = EXPR_P (node);
823 if (is_stmt && (flags & TDF_STMTADDR))
824 pp_printf (buffer, "<&%p> ", (void *)node);
826 if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
827 dump_location (buffer, EXPR_LOCATION (node));
829 code = TREE_CODE (node);
833 pp_string (buffer, "<<< error >>>");
836 case IDENTIFIER_NODE:
837 pp_tree_identifier (buffer, node);
841 while (node && node != error_mark_node)
843 if (TREE_PURPOSE (node))
845 dump_generic_node (buffer, TREE_PURPOSE (node), spc, flags, false);
848 dump_generic_node (buffer, TREE_VALUE (node), spc, flags, false);
849 node = TREE_CHAIN (node);
850 if (node && TREE_CODE (node) == TREE_LIST)
859 dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
865 if (TREE_VEC_LENGTH (node) > 0)
867 size_t len = TREE_VEC_LENGTH (node);
868 for (i = 0; i < len - 1; i++)
870 dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags,
875 dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc,
884 case FIXED_POINT_TYPE:
890 unsigned int quals = TYPE_QUALS (node);
891 enum tree_code_class tclass;
893 if (quals & TYPE_QUAL_ATOMIC)
894 pp_string (buffer, "atomic ");
895 if (quals & TYPE_QUAL_CONST)
896 pp_string (buffer, "const ");
897 else if (quals & TYPE_QUAL_VOLATILE)
898 pp_string (buffer, "volatile ");
899 else if (quals & TYPE_QUAL_RESTRICT)
900 pp_string (buffer, "restrict ");
902 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
904 pp_string (buffer, "<address-space-");
905 pp_decimal_int (buffer, TYPE_ADDR_SPACE (node));
906 pp_string (buffer, "> ");
909 tclass = TREE_CODE_CLASS (TREE_CODE (node));
911 if (tclass == tcc_declaration)
913 if (DECL_NAME (node))
914 dump_decl_name (buffer, node, flags);
916 pp_string (buffer, "<unnamed type decl>");
918 else if (tclass == tcc_type)
920 if (TYPE_NAME (node))
922 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
923 pp_tree_identifier (buffer, TYPE_NAME (node));
924 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
925 && DECL_NAME (TYPE_NAME (node)))
926 dump_decl_name (buffer, TYPE_NAME (node), flags);
928 pp_string (buffer, "<unnamed type>");
930 else if (TREE_CODE (node) == VECTOR_TYPE)
932 pp_string (buffer, "vector");
933 pp_left_paren (buffer);
934 pp_wide_integer (buffer, TYPE_VECTOR_SUBPARTS (node));
935 pp_string (buffer, ") ");
936 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
938 else if (TREE_CODE (node) == INTEGER_TYPE)
940 if (TYPE_PRECISION (node) == CHAR_TYPE_SIZE)
941 pp_string (buffer, (TYPE_UNSIGNED (node)
944 else if (TYPE_PRECISION (node) == SHORT_TYPE_SIZE)
945 pp_string (buffer, (TYPE_UNSIGNED (node)
948 else if (TYPE_PRECISION (node) == INT_TYPE_SIZE)
949 pp_string (buffer, (TYPE_UNSIGNED (node)
952 else if (TYPE_PRECISION (node) == LONG_TYPE_SIZE)
953 pp_string (buffer, (TYPE_UNSIGNED (node)
956 else if (TYPE_PRECISION (node) == LONG_LONG_TYPE_SIZE)
957 pp_string (buffer, (TYPE_UNSIGNED (node)
958 ? "unsigned long long"
959 : "signed long long"));
960 else if (TYPE_PRECISION (node) >= CHAR_TYPE_SIZE
961 && exact_log2 (TYPE_PRECISION (node)) != -1)
963 pp_string (buffer, (TYPE_UNSIGNED (node) ? "uint" : "int"));
964 pp_decimal_int (buffer, TYPE_PRECISION (node));
965 pp_string (buffer, "_t");
969 pp_string (buffer, (TYPE_UNSIGNED (node)
970 ? "<unnamed-unsigned:"
971 : "<unnamed-signed:"));
972 pp_decimal_int (buffer, TYPE_PRECISION (node));
976 else if (TREE_CODE (node) == COMPLEX_TYPE)
978 pp_string (buffer, "__complex__ ");
979 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
981 else if (TREE_CODE (node) == REAL_TYPE)
983 pp_string (buffer, "<float:");
984 pp_decimal_int (buffer, TYPE_PRECISION (node));
987 else if (TREE_CODE (node) == FIXED_POINT_TYPE)
989 pp_string (buffer, "<fixed-point-");
990 pp_string (buffer, TYPE_SATURATING (node) ? "sat:" : "nonsat:");
991 pp_decimal_int (buffer, TYPE_PRECISION (node));
994 else if (TREE_CODE (node) == VOID_TYPE)
995 pp_string (buffer, "void");
997 pp_string (buffer, "<unnamed type>");
1003 case REFERENCE_TYPE:
1004 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
1006 if (TREE_TYPE (node) == NULL)
1008 pp_string (buffer, str);
1009 pp_string (buffer, "<null type>");
1011 else if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
1013 tree fnode = TREE_TYPE (node);
1015 dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false);
1017 pp_left_paren (buffer);
1018 pp_string (buffer, str);
1019 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
1020 dump_decl_name (buffer, TYPE_NAME (node), flags);
1021 else if (flags & TDF_NOUID)
1022 pp_printf (buffer, "<Txxxx>");
1024 pp_printf (buffer, "<T%x>", TYPE_UID (node));
1026 pp_right_paren (buffer);
1027 dump_function_declaration (buffer, fnode, spc, flags);
1031 unsigned int quals = TYPE_QUALS (node);
1033 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1035 pp_string (buffer, str);
1037 if (quals & TYPE_QUAL_CONST)
1038 pp_string (buffer, " const");
1039 if (quals & TYPE_QUAL_VOLATILE)
1040 pp_string (buffer, " volatile");
1041 if (quals & TYPE_QUAL_RESTRICT)
1042 pp_string (buffer, " restrict");
1044 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
1046 pp_string (buffer, " <address-space-");
1047 pp_decimal_int (buffer, TYPE_ADDR_SPACE (node));
1048 pp_greater (buffer);
1051 if (TYPE_REF_CAN_ALIAS_ALL (node))
1052 pp_string (buffer, " {ref-all}");
1062 if (integer_zerop (TREE_OPERAND (node, 1))
1063 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1064 infer them and MEM_ATTR caching will share MEM_REFs
1065 with differently-typed op0s. */
1066 && TREE_CODE (TREE_OPERAND (node, 0)) != INTEGER_CST
1067 /* Released SSA_NAMES have no TREE_TYPE. */
1068 && TREE_TYPE (TREE_OPERAND (node, 0)) != NULL_TREE
1069 /* Same pointer types, but ignoring POINTER_TYPE vs.
1071 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 0)))
1072 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1))))
1073 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 0)))
1074 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 1))))
1075 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 0)))
1076 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 1))))
1077 /* Same value types ignoring qualifiers. */
1078 && (TYPE_MAIN_VARIANT (TREE_TYPE (node))
1079 == TYPE_MAIN_VARIANT
1080 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1))))))
1082 if (TREE_CODE (TREE_OPERAND (node, 0)) != ADDR_EXPR)
1085 dump_generic_node (buffer, TREE_OPERAND (node, 0),
1089 dump_generic_node (buffer,
1090 TREE_OPERAND (TREE_OPERAND (node, 0), 0),
1097 pp_string (buffer, "MEM[");
1098 pp_left_paren (buffer);
1099 ptype = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (node, 1)));
1100 dump_generic_node (buffer, ptype,
1101 spc, flags | TDF_SLIM, false);
1102 pp_right_paren (buffer);
1103 dump_generic_node (buffer, TREE_OPERAND (node, 0),
1105 if (!integer_zerop (TREE_OPERAND (node, 1)))
1107 pp_string (buffer, " + ");
1108 dump_generic_node (buffer, TREE_OPERAND (node, 1),
1111 pp_right_bracket (buffer);
1116 case TARGET_MEM_REF:
1118 const char *sep = "";
1121 pp_string (buffer, "MEM[");
1123 if (TREE_CODE (TMR_BASE (node)) == ADDR_EXPR)
1125 pp_string (buffer, sep);
1127 pp_string (buffer, "symbol: ");
1128 dump_generic_node (buffer, TREE_OPERAND (TMR_BASE (node), 0),
1133 pp_string (buffer, sep);
1135 pp_string (buffer, "base: ");
1136 dump_generic_node (buffer, TMR_BASE (node), spc, flags, false);
1138 tmp = TMR_INDEX2 (node);
1141 pp_string (buffer, sep);
1143 pp_string (buffer, "base: ");
1144 dump_generic_node (buffer, tmp, spc, flags, false);
1146 tmp = TMR_INDEX (node);
1149 pp_string (buffer, sep);
1151 pp_string (buffer, "index: ");
1152 dump_generic_node (buffer, tmp, spc, flags, false);
1154 tmp = TMR_STEP (node);
1157 pp_string (buffer, sep);
1159 pp_string (buffer, "step: ");
1160 dump_generic_node (buffer, tmp, spc, flags, false);
1162 tmp = TMR_OFFSET (node);
1165 pp_string (buffer, sep);
1167 pp_string (buffer, "offset: ");
1168 dump_generic_node (buffer, tmp, spc, flags, false);
1170 pp_right_bracket (buffer);
1178 /* Print the innermost component type. */
1179 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
1180 tmp = TREE_TYPE (tmp))
1182 dump_generic_node (buffer, tmp, spc, flags, false);
1184 /* Print the dimensions. */
1185 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
1186 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
1192 case QUAL_UNION_TYPE:
1194 unsigned int quals = TYPE_QUALS (node);
1196 if (quals & TYPE_QUAL_ATOMIC)
1197 pp_string (buffer, "atomic ");
1198 if (quals & TYPE_QUAL_CONST)
1199 pp_string (buffer, "const ");
1200 if (quals & TYPE_QUAL_VOLATILE)
1201 pp_string (buffer, "volatile ");
1203 /* Print the name of the structure. */
1204 if (TREE_CODE (node) == RECORD_TYPE)
1205 pp_string (buffer, "struct ");
1206 else if (TREE_CODE (node) == UNION_TYPE)
1207 pp_string (buffer, "union ");
1209 if (TYPE_NAME (node))
1210 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
1211 else if (!(flags & TDF_SLIM))
1212 /* FIXME: If we eliminate the 'else' above and attempt
1213 to show the fields for named types, we may get stuck
1214 following a cycle of pointers to structs. The alleged
1215 self-reference check in print_struct_decl will not detect
1216 cycles involving more than one pointer or struct type. */
1217 print_struct_decl (buffer, node, spc, flags);
1226 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
1228 /* In the case of a pointer, one may want to divide by the
1229 size of the pointed-to type. Unfortunately, this not
1230 straightforward. The C front-end maps expressions
1235 in such a way that the two INTEGER_CST nodes for "5" have
1236 different values but identical types. In the latter
1237 case, the 5 is multiplied by sizeof (int) in c-common.c
1238 (pointer_int_sum) to convert it to a byte address, and
1239 yet the type of the node is left unchanged. Argh. What
1240 is consistent though is that the number value corresponds
1241 to bytes (UNITS) offset.
1243 NB: Neither of the following divisors can be trivially
1244 used to recover the original literal:
1246 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1247 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1248 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
1249 pp_string (buffer, "B"); /* pseudo-unit */
1252 pp_double_int (buffer, tree_to_double_int (node),
1253 TYPE_UNSIGNED (TREE_TYPE (node)));
1254 if (TREE_OVERFLOW (node))
1255 pp_string (buffer, "(OVF)");
1259 /* Code copied from print_node. */
1262 if (TREE_OVERFLOW (node))
1263 pp_string (buffer, " overflow");
1265 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
1266 d = TREE_REAL_CST (node);
1267 if (REAL_VALUE_ISINF (d))
1268 pp_string (buffer, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
1269 else if (REAL_VALUE_ISNAN (d))
1270 pp_string (buffer, " Nan");
1274 real_to_decimal (string, &d, sizeof (string), 0, 1);
1275 pp_string (buffer, string);
1280 unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
1281 pp_string (buffer, "0x");
1282 for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
1283 output_formatted_integer (buffer, "%02x", *p++);
1292 fixed_to_decimal (string, TREE_FIXED_CST_PTR (node), sizeof (string));
1293 pp_string (buffer, string);
1298 pp_string (buffer, "__complex__ (");
1299 dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
1300 pp_string (buffer, ", ");
1301 dump_generic_node (buffer, TREE_IMAGPART (node), spc, flags, false);
1302 pp_right_paren (buffer);
1306 pp_string (buffer, "\"");
1307 pretty_print_string (buffer, TREE_STRING_POINTER (node));
1308 pp_string (buffer, "\"");
1314 pp_string (buffer, "{ ");
1315 for (i = 0; i < VECTOR_CST_NELTS (node); ++i)
1318 pp_string (buffer, ", ");
1319 dump_generic_node (buffer, VECTOR_CST_ELT (node, i),
1322 pp_string (buffer, " }");
1328 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1330 if (TREE_CODE (node) == METHOD_TYPE)
1332 if (TYPE_METHOD_BASETYPE (node))
1333 dump_decl_name (buffer, TYPE_NAME (TYPE_METHOD_BASETYPE (node)),
1336 pp_string (buffer, "<null method basetype>");
1337 pp_colon_colon (buffer);
1339 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
1340 dump_decl_name (buffer, TYPE_NAME (node), flags);
1341 else if (flags & TDF_NOUID)
1342 pp_printf (buffer, "<Txxxx>");
1344 pp_printf (buffer, "<T%x>", TYPE_UID (node));
1345 dump_function_declaration (buffer, node, spc, flags);
1350 dump_decl_name (buffer, node, flags);
1354 if (DECL_NAME (node))
1355 dump_decl_name (buffer, node, flags);
1356 else if (LABEL_DECL_UID (node) != -1)
1357 pp_printf (buffer, "<L%d>", (int) LABEL_DECL_UID (node));
1360 if (flags & TDF_NOUID)
1361 pp_string (buffer, "<D.xxxx>");
1363 pp_printf (buffer, "<D.%u>", DECL_UID (node));
1368 if (DECL_IS_BUILTIN (node))
1370 /* Don't print the declaration of built-in types. */
1373 if (DECL_NAME (node))
1374 dump_decl_name (buffer, node, flags);
1375 else if (TYPE_NAME (TREE_TYPE (node)) != node)
1377 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
1378 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
1379 && TYPE_METHODS (TREE_TYPE (node)))
1381 /* The type is a c++ class: all structures have at least
1383 pp_string (buffer, "class ");
1384 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1389 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
1390 ? "union" : "struct "));
1391 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1395 pp_string (buffer, "<anon>");
1401 case DEBUG_EXPR_DECL:
1402 case NAMESPACE_DECL:
1404 dump_decl_name (buffer, node, flags);
1408 pp_string (buffer, "<retval>");
1412 op0 = TREE_OPERAND (node, 0);
1415 && (TREE_CODE (op0) == INDIRECT_REF
1416 || (TREE_CODE (op0) == MEM_REF
1417 && TREE_CODE (TREE_OPERAND (op0, 0)) != ADDR_EXPR
1418 && integer_zerop (TREE_OPERAND (op0, 1))
1419 /* Dump the types of INTEGER_CSTs explicitly, for we
1420 can't infer them and MEM_ATTR caching will share
1421 MEM_REFs with differently-typed op0s. */
1422 && TREE_CODE (TREE_OPERAND (op0, 0)) != INTEGER_CST
1423 /* Released SSA_NAMES have no TREE_TYPE. */
1424 && TREE_TYPE (TREE_OPERAND (op0, 0)) != NULL_TREE
1425 /* Same pointer types, but ignoring POINTER_TYPE vs.
1427 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 0)))
1428 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1))))
1429 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 0)))
1430 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 1))))
1431 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 0)))
1432 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 1))))
1433 /* Same value types ignoring qualifiers. */
1434 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0))
1435 == TYPE_MAIN_VARIANT
1436 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1))))))))
1438 op0 = TREE_OPERAND (op0, 0);
1441 if (op_prio (op0) < op_prio (node))
1442 pp_left_paren (buffer);
1443 dump_generic_node (buffer, op0, spc, flags, false);
1444 if (op_prio (op0) < op_prio (node))
1445 pp_right_paren (buffer);
1446 pp_string (buffer, str);
1447 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1448 op0 = component_ref_field_offset (node);
1449 if (op0 && TREE_CODE (op0) != INTEGER_CST)
1451 pp_string (buffer, "{off: ");
1452 dump_generic_node (buffer, op0, spc, flags, false);
1453 pp_right_brace (buffer);
1458 pp_string (buffer, "BIT_FIELD_REF <");
1459 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1460 pp_string (buffer, ", ");
1461 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1462 pp_string (buffer, ", ");
1463 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1464 pp_greater (buffer);
1468 case ARRAY_RANGE_REF:
1469 op0 = TREE_OPERAND (node, 0);
1470 if (op_prio (op0) < op_prio (node))
1471 pp_left_paren (buffer);
1472 dump_generic_node (buffer, op0, spc, flags, false);
1473 if (op_prio (op0) < op_prio (node))
1474 pp_right_paren (buffer);
1475 pp_left_bracket (buffer);
1476 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1477 if (TREE_CODE (node) == ARRAY_RANGE_REF)
1478 pp_string (buffer, " ...");
1479 pp_right_bracket (buffer);
1481 op0 = array_ref_low_bound (node);
1482 op1 = array_ref_element_size (node);
1484 if (!integer_zerop (op0)
1485 || TREE_OPERAND (node, 2)
1486 || TREE_OPERAND (node, 3))
1488 pp_string (buffer, "{lb: ");
1489 dump_generic_node (buffer, op0, spc, flags, false);
1490 pp_string (buffer, " sz: ");
1491 dump_generic_node (buffer, op1, spc, flags, false);
1492 pp_right_brace (buffer);
1498 unsigned HOST_WIDE_INT ix;
1500 bool is_struct_init = false;
1501 bool is_array_init = false;
1502 double_int curidx = double_int_zero;
1503 pp_left_brace (buffer);
1504 if (TREE_CLOBBER_P (node))
1505 pp_string (buffer, "CLOBBER");
1506 else if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
1507 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
1508 is_struct_init = true;
1509 else if (TREE_CODE (TREE_TYPE (node)) == ARRAY_TYPE
1510 && TYPE_DOMAIN (TREE_TYPE (node))
1511 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)))
1512 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node))))
1515 tree minv = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)));
1516 is_array_init = true;
1517 curidx = tree_to_double_int (minv);
1519 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
1526 dump_generic_node (buffer, field, spc, flags, false);
1529 else if (is_array_init
1530 && (TREE_CODE (field) != INTEGER_CST
1531 || tree_to_double_int (field) != curidx))
1533 pp_left_bracket (buffer);
1534 if (TREE_CODE (field) == RANGE_EXPR)
1536 dump_generic_node (buffer, TREE_OPERAND (field, 0), spc,
1538 pp_string (buffer, " ... ");
1539 dump_generic_node (buffer, TREE_OPERAND (field, 1), spc,
1541 if (TREE_CODE (TREE_OPERAND (field, 1)) == INTEGER_CST)
1542 curidx = tree_to_double_int (TREE_OPERAND (field, 1));
1545 dump_generic_node (buffer, field, spc, flags, false);
1546 if (TREE_CODE (field) == INTEGER_CST)
1547 curidx = tree_to_double_int (field);
1548 pp_string (buffer, "]=");
1552 curidx += double_int_one;
1553 if (val && TREE_CODE (val) == ADDR_EXPR)
1554 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
1555 val = TREE_OPERAND (val, 0);
1556 if (val && TREE_CODE (val) == FUNCTION_DECL)
1557 dump_decl_name (buffer, val, flags);
1559 dump_generic_node (buffer, val, spc, flags, false);
1560 if (ix != vec_safe_length (CONSTRUCTOR_ELTS (node)) - 1)
1566 pp_right_brace (buffer);
1573 if (flags & TDF_SLIM)
1575 pp_string (buffer, "<COMPOUND_EXPR>");
1579 dump_generic_node (buffer, TREE_OPERAND (node, 0),
1580 spc, flags, !(flags & TDF_SLIM));
1581 if (flags & TDF_SLIM)
1582 newline_and_indent (buffer, spc);
1589 for (tp = &TREE_OPERAND (node, 1);
1590 TREE_CODE (*tp) == COMPOUND_EXPR;
1591 tp = &TREE_OPERAND (*tp, 1))
1593 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
1594 spc, flags, !(flags & TDF_SLIM));
1595 if (flags & TDF_SLIM)
1596 newline_and_indent (buffer, spc);
1604 dump_generic_node (buffer, *tp, spc, flags, !(flags & TDF_SLIM));
1608 case STATEMENT_LIST:
1610 tree_stmt_iterator si;
1613 if (flags & TDF_SLIM)
1615 pp_string (buffer, "<STATEMENT_LIST>");
1619 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
1622 newline_and_indent (buffer, spc);
1625 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
1632 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags,
1637 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags,
1642 pp_string (buffer, "TARGET_EXPR <");
1643 dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false);
1646 dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false);
1647 pp_greater (buffer);
1651 print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags);
1656 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
1658 pp_string (buffer, "if (");
1659 dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false);
1660 pp_right_paren (buffer);
1661 /* The lowered cond_exprs should always be printed in full. */
1662 if (COND_EXPR_THEN (node)
1663 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
1664 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
1665 && COND_EXPR_ELSE (node)
1666 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
1667 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
1670 dump_generic_node (buffer, COND_EXPR_THEN (node),
1672 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
1674 pp_string (buffer, " else ");
1675 dump_generic_node (buffer, COND_EXPR_ELSE (node),
1679 else if (!(flags & TDF_SLIM))
1681 /* Output COND_EXPR_THEN. */
1682 if (COND_EXPR_THEN (node))
1684 newline_and_indent (buffer, spc+2);
1685 pp_left_brace (buffer);
1686 newline_and_indent (buffer, spc+4);
1687 dump_generic_node (buffer, COND_EXPR_THEN (node), spc+4,
1689 newline_and_indent (buffer, spc+2);
1690 pp_right_brace (buffer);
1693 /* Output COND_EXPR_ELSE. */
1694 if (COND_EXPR_ELSE (node)
1695 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
1697 newline_and_indent (buffer, spc);
1698 pp_string (buffer, "else");
1699 newline_and_indent (buffer, spc+2);
1700 pp_left_brace (buffer);
1701 newline_and_indent (buffer, spc+4);
1702 dump_generic_node (buffer, COND_EXPR_ELSE (node), spc+4,
1704 newline_and_indent (buffer, spc+2);
1705 pp_right_brace (buffer);
1712 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1714 pp_question (buffer);
1716 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1720 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1725 pp_left_brace (buffer);
1726 if (!(flags & TDF_SLIM))
1728 if (BIND_EXPR_VARS (node))
1730 pp_newline (buffer);
1732 for (op0 = BIND_EXPR_VARS (node); op0; op0 = DECL_CHAIN (op0))
1734 print_declaration (buffer, op0, spc+2, flags);
1735 pp_newline (buffer);
1739 newline_and_indent (buffer, spc+2);
1740 dump_generic_node (buffer, BIND_EXPR_BODY (node), spc+2, flags, true);
1741 newline_and_indent (buffer, spc);
1742 pp_right_brace (buffer);
1748 print_call_name (buffer, CALL_EXPR_FN (node), flags);
1750 /* Print parameters. */
1752 pp_left_paren (buffer);
1755 call_expr_arg_iterator iter;
1756 FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
1758 dump_generic_node (buffer, arg, spc, flags, false);
1759 if (more_call_expr_args_p (&iter))
1766 if (CALL_EXPR_VA_ARG_PACK (node))
1768 if (call_expr_nargs (node) > 0)
1773 pp_string (buffer, "__builtin_va_arg_pack ()");
1775 pp_right_paren (buffer);
1777 op1 = CALL_EXPR_STATIC_CHAIN (node);
1780 pp_string (buffer, " [static-chain: ");
1781 dump_generic_node (buffer, op1, spc, flags, false);
1782 pp_right_bracket (buffer);
1785 if (CALL_EXPR_RETURN_SLOT_OPT (node))
1786 pp_string (buffer, " [return slot optimization]");
1787 if (CALL_EXPR_TAILCALL (node))
1788 pp_string (buffer, " [tail call]");
1791 case WITH_CLEANUP_EXPR:
1795 case CLEANUP_POINT_EXPR:
1796 pp_string (buffer, "<<cleanup_point ");
1797 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1798 pp_string (buffer, ">>");
1801 case PLACEHOLDER_EXPR:
1802 pp_string (buffer, "<PLACEHOLDER_EXPR ");
1803 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1804 pp_greater (buffer);
1807 /* Binary arithmetic and logic expressions. */
1808 case WIDEN_SUM_EXPR:
1809 case WIDEN_MULT_EXPR:
1811 case MULT_HIGHPART_EXPR:
1813 case POINTER_PLUS_EXPR:
1815 case TRUNC_DIV_EXPR:
1817 case FLOOR_DIV_EXPR:
1818 case ROUND_DIV_EXPR:
1819 case TRUNC_MOD_EXPR:
1821 case FLOOR_MOD_EXPR:
1822 case ROUND_MOD_EXPR:
1824 case EXACT_DIV_EXPR:
1829 case VEC_LSHIFT_EXPR:
1830 case VEC_RSHIFT_EXPR:
1831 case WIDEN_LSHIFT_EXPR:
1835 case TRUTH_ANDIF_EXPR:
1836 case TRUTH_ORIF_EXPR:
1837 case TRUTH_AND_EXPR:
1839 case TRUTH_XOR_EXPR:
1853 case UNORDERED_EXPR:
1855 const char *op = op_symbol (node);
1856 op0 = TREE_OPERAND (node, 0);
1857 op1 = TREE_OPERAND (node, 1);
1859 /* When the operands are expressions with less priority,
1860 keep semantics of the tree representation. */
1861 if (op_prio (op0) <= op_prio (node))
1863 pp_left_paren (buffer);
1864 dump_generic_node (buffer, op0, spc, flags, false);
1865 pp_right_paren (buffer);
1868 dump_generic_node (buffer, op0, spc, flags, false);
1871 pp_string (buffer, op);
1874 /* When the operands are expressions with less priority,
1875 keep semantics of the tree representation. */
1876 if (op_prio (op1) <= op_prio (node))
1878 pp_left_paren (buffer);
1879 dump_generic_node (buffer, op1, spc, flags, false);
1880 pp_right_paren (buffer);
1883 dump_generic_node (buffer, op1, spc, flags, false);
1887 /* Unary arithmetic and logic expressions. */
1890 case TRUTH_NOT_EXPR:
1892 case PREDECREMENT_EXPR:
1893 case PREINCREMENT_EXPR:
1895 if (TREE_CODE (node) == ADDR_EXPR
1896 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
1897 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
1898 ; /* Do not output '&' for strings and function pointers. */
1900 pp_string (buffer, op_symbol (node));
1902 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1904 pp_left_paren (buffer);
1905 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1906 pp_right_paren (buffer);
1909 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1912 case POSTDECREMENT_EXPR:
1913 case POSTINCREMENT_EXPR:
1914 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1916 pp_left_paren (buffer);
1917 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1918 pp_right_paren (buffer);
1921 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1922 pp_string (buffer, op_symbol (node));
1926 pp_string (buffer, "MIN_EXPR <");
1927 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1928 pp_string (buffer, ", ");
1929 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1930 pp_greater (buffer);
1934 pp_string (buffer, "MAX_EXPR <");
1935 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1936 pp_string (buffer, ", ");
1937 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1938 pp_greater (buffer);
1942 pp_string (buffer, "ABS_EXPR <");
1943 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1944 pp_greater (buffer);
1951 case ADDR_SPACE_CONVERT_EXPR:
1952 case FIXED_CONVERT_EXPR:
1953 case FIX_TRUNC_EXPR:
1956 type = TREE_TYPE (node);
1957 op0 = TREE_OPERAND (node, 0);
1958 if (type != TREE_TYPE (op0))
1960 pp_left_paren (buffer);
1961 dump_generic_node (buffer, type, spc, flags, false);
1962 pp_string (buffer, ") ");
1964 if (op_prio (op0) < op_prio (node))
1965 pp_left_paren (buffer);
1966 dump_generic_node (buffer, op0, spc, flags, false);
1967 if (op_prio (op0) < op_prio (node))
1968 pp_right_paren (buffer);
1971 case VIEW_CONVERT_EXPR:
1972 pp_string (buffer, "VIEW_CONVERT_EXPR<");
1973 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1974 pp_string (buffer, ">(");
1975 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1976 pp_right_paren (buffer);
1980 pp_string (buffer, "((");
1981 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1982 pp_string (buffer, "))");
1985 case NON_LVALUE_EXPR:
1986 pp_string (buffer, "NON_LVALUE_EXPR <");
1987 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1988 pp_greater (buffer);
1992 pp_string (buffer, "SAVE_EXPR <");
1993 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1994 pp_greater (buffer);
1998 pp_string (buffer, "COMPLEX_EXPR <");
1999 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2000 pp_string (buffer, ", ");
2001 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2002 pp_greater (buffer);
2006 pp_string (buffer, "CONJ_EXPR <");
2007 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2008 pp_greater (buffer);
2012 pp_string (buffer, "REALPART_EXPR <");
2013 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2014 pp_greater (buffer);
2018 pp_string (buffer, "IMAGPART_EXPR <");
2019 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2020 pp_greater (buffer);
2024 pp_string (buffer, "VA_ARG_EXPR <");
2025 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2026 pp_greater (buffer);
2029 case TRY_FINALLY_EXPR:
2030 case TRY_CATCH_EXPR:
2031 pp_string (buffer, "try");
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, 0), spc+4, flags, true);
2036 newline_and_indent (buffer, spc+2);
2037 pp_right_brace (buffer);
2038 newline_and_indent (buffer, spc);
2040 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
2041 newline_and_indent (buffer, spc+2);
2042 pp_left_brace (buffer);
2043 newline_and_indent (buffer, spc+4);
2044 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
2045 newline_and_indent (buffer, spc+2);
2046 pp_right_brace (buffer);
2051 pp_string (buffer, "catch (");
2052 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
2053 pp_right_paren (buffer);
2054 newline_and_indent (buffer, spc+2);
2055 pp_left_brace (buffer);
2056 newline_and_indent (buffer, spc+4);
2057 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
2058 newline_and_indent (buffer, spc+2);
2059 pp_right_brace (buffer);
2063 case EH_FILTER_EXPR:
2064 pp_string (buffer, "<<<eh_filter (");
2065 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
2066 pp_string (buffer, ")>>>");
2067 newline_and_indent (buffer, spc+2);
2068 pp_left_brace (buffer);
2069 newline_and_indent (buffer, spc+4);
2070 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
2071 newline_and_indent (buffer, spc+2);
2072 pp_right_brace (buffer);
2077 op0 = TREE_OPERAND (node, 0);
2078 /* If this is for break or continue, don't bother printing it. */
2079 if (DECL_NAME (op0))
2081 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
2082 if (strcmp (name, "break") == 0
2083 || strcmp (name, "continue") == 0)
2086 dump_generic_node (buffer, op0, spc, flags, false);
2088 if (DECL_NONLOCAL (op0))
2089 pp_string (buffer, " [non-local]");
2093 pp_string (buffer, "while (1)");
2094 if (!(flags & TDF_SLIM))
2096 newline_and_indent (buffer, spc+2);
2097 pp_left_brace (buffer);
2098 newline_and_indent (buffer, spc+4);
2099 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
2100 newline_and_indent (buffer, spc+2);
2101 pp_right_brace (buffer);
2107 pp_string (buffer, "// predicted ");
2108 if (PREDICT_EXPR_OUTCOME (node))
2109 pp_string (buffer, "likely by ");
2111 pp_string (buffer, "unlikely by ");
2112 pp_string (buffer, predictor_name (PREDICT_EXPR_PREDICTOR (node)));
2113 pp_string (buffer, " predictor.");
2117 pp_string (buffer, "ANNOTATE_EXPR <");
2118 switch ((enum annot_expr_kind) TREE_INT_CST_LOW (TREE_OPERAND (node, 1)))
2120 case annot_expr_ivdep_kind:
2121 pp_string (buffer, "ivdep, ");
2124 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2125 pp_greater (buffer);
2129 pp_string (buffer, "return");
2130 op0 = TREE_OPERAND (node, 0);
2134 if (TREE_CODE (op0) == MODIFY_EXPR)
2135 dump_generic_node (buffer, TREE_OPERAND (op0, 1),
2138 dump_generic_node (buffer, op0, spc, flags, false);
2143 pp_string (buffer, "if (");
2144 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2145 pp_string (buffer, ") break");
2149 pp_string (buffer, "switch (");
2150 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
2151 pp_right_paren (buffer);
2152 if (!(flags & TDF_SLIM))
2154 newline_and_indent (buffer, spc+2);
2155 pp_left_brace (buffer);
2156 if (SWITCH_BODY (node))
2158 newline_and_indent (buffer, spc+4);
2159 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags,
2164 tree vec = SWITCH_LABELS (node);
2165 size_t i, n = TREE_VEC_LENGTH (vec);
2166 for (i = 0; i < n; ++i)
2168 tree elt = TREE_VEC_ELT (vec, i);
2169 newline_and_indent (buffer, spc+4);
2172 dump_generic_node (buffer, elt, spc+4, flags, false);
2173 pp_string (buffer, " goto ");
2174 dump_generic_node (buffer, CASE_LABEL (elt), spc+4,
2176 pp_semicolon (buffer);
2179 pp_string (buffer, "case ???: goto ???;");
2182 newline_and_indent (buffer, spc+2);
2183 pp_right_brace (buffer);
2189 op0 = GOTO_DESTINATION (node);
2190 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
2192 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
2193 if (strcmp (name, "break") == 0
2194 || strcmp (name, "continue") == 0)
2196 pp_string (buffer, name);
2200 pp_string (buffer, "goto ");
2201 dump_generic_node (buffer, op0, spc, flags, false);
2205 pp_string (buffer, "__asm__");
2206 if (ASM_VOLATILE_P (node))
2207 pp_string (buffer, " __volatile__");
2208 pp_left_paren (buffer);
2209 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
2211 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
2213 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
2214 if (ASM_CLOBBERS (node))
2217 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
2219 pp_right_paren (buffer);
2222 case CASE_LABEL_EXPR:
2223 if (CASE_LOW (node) && CASE_HIGH (node))
2225 pp_string (buffer, "case ");
2226 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
2227 pp_string (buffer, " ... ");
2228 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
2230 else if (CASE_LOW (node))
2232 pp_string (buffer, "case ");
2233 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
2236 pp_string (buffer, "default");
2241 pp_string (buffer, "OBJ_TYPE_REF(");
2242 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
2243 pp_semicolon (buffer);
2244 if (!(flags & TDF_SLIM) && virtual_method_call_p (node))
2246 pp_string (buffer, "(");
2247 dump_generic_node (buffer, obj_type_ref_class (node), spc, flags, false);
2248 pp_string (buffer, ")");
2250 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
2252 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
2253 pp_right_paren (buffer);
2257 if (SSA_NAME_IDENTIFIER (node))
2258 dump_generic_node (buffer, SSA_NAME_IDENTIFIER (node),
2260 pp_underscore (buffer);
2261 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
2262 if (SSA_NAME_IS_DEFAULT_DEF (node))
2263 pp_string (buffer, "(D)");
2264 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
2265 pp_string (buffer, "(ab)");
2268 case WITH_SIZE_EXPR:
2269 pp_string (buffer, "WITH_SIZE_EXPR <");
2270 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2271 pp_string (buffer, ", ");
2272 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2273 pp_greater (buffer);
2277 pp_string (buffer, "ASSERT_EXPR <");
2278 dump_generic_node (buffer, ASSERT_EXPR_VAR (node), spc, flags, false);
2279 pp_string (buffer, ", ");
2280 dump_generic_node (buffer, ASSERT_EXPR_COND (node), spc, flags, false);
2281 pp_greater (buffer);
2285 pp_string (buffer, "scev_known");
2288 case SCEV_NOT_KNOWN:
2289 pp_string (buffer, "scev_not_known");
2292 case POLYNOMIAL_CHREC:
2293 pp_left_brace (buffer);
2294 dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
2295 pp_string (buffer, ", +, ");
2296 dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
2297 pp_string (buffer, "}_");
2298 dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
2302 case REALIGN_LOAD_EXPR:
2303 pp_string (buffer, "REALIGN_LOAD <");
2304 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2305 pp_string (buffer, ", ");
2306 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2307 pp_string (buffer, ", ");
2308 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
2309 pp_greater (buffer);
2313 pp_string (buffer, " VEC_COND_EXPR < ");
2314 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2315 pp_string (buffer, " , ");
2316 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2317 pp_string (buffer, " , ");
2318 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
2319 pp_string (buffer, " > ");
2323 pp_string (buffer, " VEC_PERM_EXPR < ");
2324 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2325 pp_string (buffer, " , ");
2326 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2327 pp_string (buffer, " , ");
2328 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
2329 pp_string (buffer, " > ");
2333 pp_string (buffer, " DOT_PROD_EXPR < ");
2334 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2335 pp_string (buffer, ", ");
2336 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2337 pp_string (buffer, ", ");
2338 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
2339 pp_string (buffer, " > ");
2342 case WIDEN_MULT_PLUS_EXPR:
2343 pp_string (buffer, " WIDEN_MULT_PLUS_EXPR < ");
2344 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2345 pp_string (buffer, ", ");
2346 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2347 pp_string (buffer, ", ");
2348 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
2349 pp_string (buffer, " > ");
2352 case WIDEN_MULT_MINUS_EXPR:
2353 pp_string (buffer, " WIDEN_MULT_MINUS_EXPR < ");
2354 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2355 pp_string (buffer, ", ");
2356 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2357 pp_string (buffer, ", ");
2358 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
2359 pp_string (buffer, " > ");
2363 pp_string (buffer, " FMA_EXPR < ");
2364 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2365 pp_string (buffer, ", ");
2366 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2367 pp_string (buffer, ", ");
2368 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
2369 pp_string (buffer, " > ");
2373 pp_string (buffer, "#pragma omp parallel");
2374 dump_omp_clauses (buffer, OMP_PARALLEL_CLAUSES (node), spc, flags);
2377 if (!(flags & TDF_SLIM) && OMP_BODY (node))
2379 newline_and_indent (buffer, spc + 2);
2380 pp_left_brace (buffer);
2381 newline_and_indent (buffer, spc + 4);
2382 dump_generic_node (buffer, OMP_BODY (node), spc + 4, flags, false);
2383 newline_and_indent (buffer, spc + 2);
2384 pp_right_brace (buffer);
2390 pp_string (buffer, "#pragma omp task");
2391 dump_omp_clauses (buffer, OMP_TASK_CLAUSES (node), spc, flags);
2395 pp_string (buffer, "#pragma omp for");
2399 pp_string (buffer, "#pragma omp simd");
2403 pp_string (buffer, "#pragma simd");
2406 case OMP_DISTRIBUTE:
2407 pp_string (buffer, "#pragma omp distribute");
2411 pp_string (buffer, "#pragma omp teams");
2412 dump_omp_clauses (buffer, OMP_TEAMS_CLAUSES (node), spc, flags);
2415 case OMP_TARGET_DATA:
2416 pp_string (buffer, "#pragma omp target data");
2417 dump_omp_clauses (buffer, OMP_TARGET_DATA_CLAUSES (node), spc, flags);
2421 pp_string (buffer, "#pragma omp target");
2422 dump_omp_clauses (buffer, OMP_TARGET_CLAUSES (node), spc, flags);
2425 case OMP_TARGET_UPDATE:
2426 pp_string (buffer, "#pragma omp target update");
2427 dump_omp_clauses (buffer, OMP_TARGET_UPDATE_CLAUSES (node), spc, flags);
2432 dump_omp_clauses (buffer, OMP_FOR_CLAUSES (node), spc, flags);
2434 if (!(flags & TDF_SLIM))
2438 if (OMP_FOR_PRE_BODY (node))
2440 newline_and_indent (buffer, spc + 2);
2441 pp_left_brace (buffer);
2443 newline_and_indent (buffer, spc);
2444 dump_generic_node (buffer, OMP_FOR_PRE_BODY (node),
2447 if (OMP_FOR_INIT (node))
2450 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (node)); i++)
2453 newline_and_indent (buffer, spc);
2454 pp_string (buffer, "for (");
2455 dump_generic_node (buffer,
2456 TREE_VEC_ELT (OMP_FOR_INIT (node), i),
2458 pp_string (buffer, "; ");
2459 dump_generic_node (buffer,
2460 TREE_VEC_ELT (OMP_FOR_COND (node), i),
2462 pp_string (buffer, "; ");
2463 dump_generic_node (buffer,
2464 TREE_VEC_ELT (OMP_FOR_INCR (node), i),
2466 pp_right_paren (buffer);
2469 if (OMP_FOR_BODY (node))
2471 newline_and_indent (buffer, spc + 2);
2472 pp_left_brace (buffer);
2473 newline_and_indent (buffer, spc + 4);
2474 dump_generic_node (buffer, OMP_FOR_BODY (node), spc + 4, flags,
2476 newline_and_indent (buffer, spc + 2);
2477 pp_right_brace (buffer);
2479 if (OMP_FOR_INIT (node))
2480 spc -= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node)) - 2;
2481 if (OMP_FOR_PRE_BODY (node))
2484 newline_and_indent (buffer, spc + 2);
2485 pp_right_brace (buffer);
2492 pp_string (buffer, "#pragma omp sections");
2493 dump_omp_clauses (buffer, OMP_SECTIONS_CLAUSES (node), spc, flags);
2497 pp_string (buffer, "#pragma omp section");
2501 pp_string (buffer, "#pragma omp master");
2505 pp_string (buffer, "#pragma omp taskgroup");
2509 pp_string (buffer, "#pragma omp ordered");
2513 pp_string (buffer, "#pragma omp critical");
2514 if (OMP_CRITICAL_NAME (node))
2517 pp_left_paren (buffer);
2518 dump_generic_node (buffer, OMP_CRITICAL_NAME (node), spc,
2520 pp_right_paren (buffer);
2525 pp_string (buffer, "#pragma omp atomic");
2526 if (OMP_ATOMIC_SEQ_CST (node))
2527 pp_string (buffer, " seq_cst");
2528 newline_and_indent (buffer, spc + 2);
2529 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2533 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2536 case OMP_ATOMIC_READ:
2537 pp_string (buffer, "#pragma omp atomic read");
2538 if (OMP_ATOMIC_SEQ_CST (node))
2539 pp_string (buffer, " seq_cst");
2540 newline_and_indent (buffer, spc + 2);
2541 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2545 case OMP_ATOMIC_CAPTURE_OLD:
2546 case OMP_ATOMIC_CAPTURE_NEW:
2547 pp_string (buffer, "#pragma omp atomic capture");
2548 if (OMP_ATOMIC_SEQ_CST (node))
2549 pp_string (buffer, " seq_cst");
2550 newline_and_indent (buffer, spc + 2);
2551 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2555 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2559 pp_string (buffer, "#pragma omp single");
2560 dump_omp_clauses (buffer, OMP_SINGLE_CLAUSES (node), spc, flags);
2564 dump_omp_clause (buffer, node, spc, flags);
2568 case TRANSACTION_EXPR:
2569 if (TRANSACTION_EXPR_OUTER (node))
2570 pp_string (buffer, "__transaction_atomic [[outer]]");
2571 else if (TRANSACTION_EXPR_RELAXED (node))
2572 pp_string (buffer, "__transaction_relaxed");
2574 pp_string (buffer, "__transaction_atomic");
2575 if (!(flags & TDF_SLIM) && TRANSACTION_EXPR_BODY (node))
2577 newline_and_indent (buffer, spc);
2578 pp_left_brace (buffer);
2579 newline_and_indent (buffer, spc + 2);
2580 dump_generic_node (buffer, TRANSACTION_EXPR_BODY (node),
2581 spc + 2, flags, false);
2582 newline_and_indent (buffer, spc);
2583 pp_right_brace (buffer);
2588 case REDUC_MAX_EXPR:
2589 pp_string (buffer, " REDUC_MAX_EXPR < ");
2590 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2591 pp_string (buffer, " > ");
2594 case REDUC_MIN_EXPR:
2595 pp_string (buffer, " REDUC_MIN_EXPR < ");
2596 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2597 pp_string (buffer, " > ");
2600 case REDUC_PLUS_EXPR:
2601 pp_string (buffer, " REDUC_PLUS_EXPR < ");
2602 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2603 pp_string (buffer, " > ");
2606 case VEC_WIDEN_MULT_HI_EXPR:
2607 case VEC_WIDEN_MULT_LO_EXPR:
2608 case VEC_WIDEN_MULT_EVEN_EXPR:
2609 case VEC_WIDEN_MULT_ODD_EXPR:
2610 case VEC_WIDEN_LSHIFT_HI_EXPR:
2611 case VEC_WIDEN_LSHIFT_LO_EXPR:
2613 for (str = get_tree_code_name (code); *str; str++)
2614 pp_character (buffer, TOUPPER (*str));
2615 pp_string (buffer, " < ");
2616 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2617 pp_string (buffer, ", ");
2618 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2619 pp_string (buffer, " > ");
2622 case VEC_UNPACK_HI_EXPR:
2623 pp_string (buffer, " VEC_UNPACK_HI_EXPR < ");
2624 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2625 pp_string (buffer, " > ");
2628 case VEC_UNPACK_LO_EXPR:
2629 pp_string (buffer, " VEC_UNPACK_LO_EXPR < ");
2630 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2631 pp_string (buffer, " > ");
2634 case VEC_UNPACK_FLOAT_HI_EXPR:
2635 pp_string (buffer, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2636 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2637 pp_string (buffer, " > ");
2640 case VEC_UNPACK_FLOAT_LO_EXPR:
2641 pp_string (buffer, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2642 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2643 pp_string (buffer, " > ");
2646 case VEC_PACK_TRUNC_EXPR:
2647 pp_string (buffer, " VEC_PACK_TRUNC_EXPR < ");
2648 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2649 pp_string (buffer, ", ");
2650 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2651 pp_string (buffer, " > ");
2654 case VEC_PACK_SAT_EXPR:
2655 pp_string (buffer, " VEC_PACK_SAT_EXPR < ");
2656 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2657 pp_string (buffer, ", ");
2658 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2659 pp_string (buffer, " > ");
2662 case VEC_PACK_FIX_TRUNC_EXPR:
2663 pp_string (buffer, " VEC_PACK_FIX_TRUNC_EXPR < ");
2664 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2665 pp_string (buffer, ", ");
2666 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2667 pp_string (buffer, " > ");
2671 dump_block_node (buffer, node, spc, flags);
2674 case CILK_SPAWN_STMT:
2675 pp_string (buffer, "_Cilk_spawn ");
2676 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2679 case CILK_SYNC_STMT:
2680 pp_string (buffer, "_Cilk_sync");
2687 if (is_stmt && is_expr)
2688 pp_semicolon (buffer);
2693 /* Print the declaration of a variable. */
2696 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
2700 if (TREE_CODE(t) == NAMELIST_DECL)
2702 pp_string(buffer, "namelist ");
2703 dump_decl_name (buffer, t, flags);
2704 pp_semicolon (buffer);
2708 if (TREE_CODE (t) == TYPE_DECL)
2709 pp_string (buffer, "typedef ");
2711 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
2712 pp_string (buffer, "register ");
2714 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
2715 pp_string (buffer, "extern ");
2716 else if (TREE_STATIC (t))
2717 pp_string (buffer, "static ");
2719 /* Print the type and name. */
2720 if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
2724 /* Print array's type. */
2725 tmp = TREE_TYPE (t);
2726 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
2727 tmp = TREE_TYPE (tmp);
2728 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
2730 /* Print variable's name. */
2732 dump_generic_node (buffer, t, spc, flags, false);
2734 /* Print the dimensions. */
2735 tmp = TREE_TYPE (t);
2736 while (TREE_CODE (tmp) == ARRAY_TYPE)
2738 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
2739 tmp = TREE_TYPE (tmp);
2742 else if (TREE_CODE (t) == FUNCTION_DECL)
2744 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
2746 dump_decl_name (buffer, t, flags);
2747 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
2751 /* Print type declaration. */
2752 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
2754 /* Print variable's name. */
2756 dump_generic_node (buffer, t, spc, flags, false);
2759 if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
2761 pp_string (buffer, " __asm__ ");
2762 pp_left_paren (buffer);
2763 dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
2764 pp_right_paren (buffer);
2767 /* The initial value of a function serves to determine whether the function
2768 is declared or defined. So the following does not apply to function
2770 if (TREE_CODE (t) != FUNCTION_DECL)
2772 /* Print the initial value. */
2773 if (DECL_INITIAL (t))
2778 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
2782 if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
2784 pp_string (buffer, " [value-expr: ");
2785 dump_generic_node (buffer, DECL_VALUE_EXPR (t), spc, flags, false);
2786 pp_right_bracket (buffer);
2789 pp_semicolon (buffer);
2793 /* Prints a structure: name, fields, and methods.
2794 FIXME: Still incomplete. */
2797 print_struct_decl (pretty_printer *buffer, const_tree node, int spc, int flags)
2799 /* Print the name of the structure. */
2800 if (TYPE_NAME (node))
2803 if (TREE_CODE (node) == RECORD_TYPE)
2804 pp_string (buffer, "struct ");
2805 else if ((TREE_CODE (node) == UNION_TYPE
2806 || TREE_CODE (node) == QUAL_UNION_TYPE))
2807 pp_string (buffer, "union ");
2809 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
2812 /* Print the contents of the structure. */
2813 pp_newline (buffer);
2815 pp_left_brace (buffer);
2816 pp_newline (buffer);
2818 /* Print the fields of the structure. */
2821 tmp = TYPE_FIELDS (node);
2824 /* Avoid to print recursively the structure. */
2825 /* FIXME : Not implemented correctly...,
2826 what about the case when we have a cycle in the contain graph? ...
2827 Maybe this could be solved by looking at the scope in which the
2828 structure was declared. */
2829 if (TREE_TYPE (tmp) != node
2830 && (TREE_CODE (TREE_TYPE (tmp)) != POINTER_TYPE
2831 || TREE_TYPE (TREE_TYPE (tmp)) != node))
2833 print_declaration (buffer, tmp, spc+2, flags);
2834 pp_newline (buffer);
2836 tmp = DECL_CHAIN (tmp);
2840 pp_right_brace (buffer);
2843 /* Return the priority of the operator CODE.
2845 From lowest to highest precedence with either left-to-right (L-R)
2846 or right-to-left (R-L) associativity]:
2849 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2861 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2862 15 [L-R] fn() [] -> .
2864 unary +, - and * have higher precedence than the corresponding binary
2868 op_code_prio (enum tree_code code)
2885 case TRUTH_ORIF_EXPR:
2888 case TRUTH_AND_EXPR:
2889 case TRUTH_ANDIF_EXPR:
2896 case TRUTH_XOR_EXPR:
2913 case UNORDERED_EXPR:
2924 case VEC_WIDEN_LSHIFT_HI_EXPR:
2925 case VEC_WIDEN_LSHIFT_LO_EXPR:
2926 case WIDEN_LSHIFT_EXPR:
2929 case WIDEN_SUM_EXPR:
2931 case POINTER_PLUS_EXPR:
2935 case VEC_WIDEN_MULT_HI_EXPR:
2936 case VEC_WIDEN_MULT_LO_EXPR:
2937 case WIDEN_MULT_EXPR:
2939 case WIDEN_MULT_PLUS_EXPR:
2940 case WIDEN_MULT_MINUS_EXPR:
2942 case MULT_HIGHPART_EXPR:
2943 case TRUNC_DIV_EXPR:
2945 case FLOOR_DIV_EXPR:
2946 case ROUND_DIV_EXPR:
2948 case EXACT_DIV_EXPR:
2949 case TRUNC_MOD_EXPR:
2951 case FLOOR_MOD_EXPR:
2952 case ROUND_MOD_EXPR:
2956 case TRUTH_NOT_EXPR:
2958 case POSTINCREMENT_EXPR:
2959 case POSTDECREMENT_EXPR:
2960 case PREINCREMENT_EXPR:
2961 case PREDECREMENT_EXPR:
2967 case FIX_TRUNC_EXPR:
2973 case ARRAY_RANGE_REF:
2977 /* Special expressions. */
2983 case REDUC_MAX_EXPR:
2984 case REDUC_MIN_EXPR:
2985 case REDUC_PLUS_EXPR:
2986 case VEC_LSHIFT_EXPR:
2987 case VEC_RSHIFT_EXPR:
2988 case VEC_UNPACK_HI_EXPR:
2989 case VEC_UNPACK_LO_EXPR:
2990 case VEC_UNPACK_FLOAT_HI_EXPR:
2991 case VEC_UNPACK_FLOAT_LO_EXPR:
2992 case VEC_PACK_TRUNC_EXPR:
2993 case VEC_PACK_SAT_EXPR:
2997 /* Return an arbitrarily high precedence to avoid surrounding single
2998 VAR_DECLs in ()s. */
3003 /* Return the priority of the operator OP. */
3006 op_prio (const_tree op)
3008 enum tree_code code;
3013 code = TREE_CODE (op);
3014 if (code == SAVE_EXPR || code == NON_LVALUE_EXPR)
3015 return op_prio (TREE_OPERAND (op, 0));
3017 return op_code_prio (code);
3020 /* Return the symbol associated with operator CODE. */
3023 op_symbol_code (enum tree_code code)
3031 case TRUTH_ORIF_EXPR:
3034 case TRUTH_AND_EXPR:
3035 case TRUTH_ANDIF_EXPR:
3041 case TRUTH_XOR_EXPR:
3051 case UNORDERED_EXPR:
3097 case VEC_LSHIFT_EXPR:
3100 case VEC_RSHIFT_EXPR:
3103 case WIDEN_LSHIFT_EXPR:
3106 case POINTER_PLUS_EXPR:
3112 case REDUC_PLUS_EXPR:
3115 case WIDEN_SUM_EXPR:
3118 case WIDEN_MULT_EXPR:
3121 case MULT_HIGHPART_EXPR:
3131 case TRUTH_NOT_EXPR:
3138 case TRUNC_DIV_EXPR:
3145 case FLOOR_DIV_EXPR:
3148 case ROUND_DIV_EXPR:
3151 case EXACT_DIV_EXPR:
3154 case TRUNC_MOD_EXPR:
3160 case FLOOR_MOD_EXPR:
3163 case ROUND_MOD_EXPR:
3166 case PREDECREMENT_EXPR:
3169 case PREINCREMENT_EXPR:
3172 case POSTDECREMENT_EXPR:
3175 case POSTINCREMENT_EXPR:
3185 return "<<< ??? >>>";
3189 /* Return the symbol associated with operator OP. */
3192 op_symbol (const_tree op)
3194 return op_symbol_code (TREE_CODE (op));
3197 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
3198 the gimple_call_fn of a GIMPLE_CALL. */
3201 print_call_name (pretty_printer *buffer, tree node, int flags)
3205 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
3206 op0 = TREE_OPERAND (op0, 0);
3209 switch (TREE_CODE (op0))
3214 dump_function_name (buffer, op0, flags);
3220 op0 = TREE_OPERAND (op0, 0);
3224 pp_left_paren (buffer);
3225 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, flags, false);
3226 pp_string (buffer, ") ? ");
3227 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, flags, false);
3228 pp_string (buffer, " : ");
3229 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, flags, false);
3233 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
3234 dump_function_name (buffer, TREE_OPERAND (op0, 0), flags);
3236 dump_generic_node (buffer, op0, 0, flags, false);
3240 if (integer_zerop (TREE_OPERAND (op0, 1)))
3242 op0 = TREE_OPERAND (op0, 0);
3249 dump_generic_node (buffer, op0, 0, flags, false);
3257 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
3260 pretty_print_string (pretty_printer *buffer, const char *str)
3270 pp_string (buffer, "\\b");
3274 pp_string (buffer, "\\f");
3278 pp_string (buffer, "\\n");
3282 pp_string (buffer, "\\r");
3286 pp_string (buffer, "\\t");
3290 pp_string (buffer, "\\v");
3294 pp_string (buffer, "\\\\");
3298 pp_string (buffer, "\\\"");
3302 pp_string (buffer, "\\'");
3305 /* No need to handle \0; the loop terminates on \0. */
3308 pp_string (buffer, "\\1");
3312 pp_string (buffer, "\\2");
3316 pp_string (buffer, "\\3");
3320 pp_string (buffer, "\\4");
3324 pp_string (buffer, "\\5");
3328 pp_string (buffer, "\\6");
3332 pp_string (buffer, "\\7");
3336 pp_character (buffer, str[0]);
3344 maybe_init_pretty_print (FILE *file)
3348 new (&buffer) pretty_printer ();
3349 pp_needs_newline (&buffer) = true;
3350 pp_translate_identifiers (&buffer) = false;
3354 buffer.buffer->stream = file;
3358 newline_and_indent (pretty_printer *buffer, int spc)
3360 pp_newline (buffer);
3364 /* Handle a %K format for TEXT. Separate from default_tree_printer so
3365 it can also be used in front ends.
3366 %K: a statement, from which EXPR_LOCATION and TREE_BLOCK will be recorded.
3370 percent_K_format (text_info *text)
3372 tree t = va_arg (*text->args_ptr, tree), block;
3373 gcc_assert (text->locus != NULL);
3374 *text->locus = EXPR_LOCATION (t);
3375 gcc_assert (pp_ti_abstract_origin (text) != NULL);
3376 block = TREE_BLOCK (t);
3377 *pp_ti_abstract_origin (text) = NULL;
3381 /* ??? LTO drops all BLOCK_ABSTRACT_ORIGINs apart from those
3382 representing the outermost block of an inlined function.
3383 So walk the BLOCK tree until we hit such a scope. */
3385 && TREE_CODE (block) == BLOCK)
3387 if (inlined_function_outer_scope_p (block))
3389 *pp_ti_abstract_origin (text) = block;
3392 block = BLOCK_SUPERCONTEXT (block);
3398 && TREE_CODE (block) == BLOCK
3399 && BLOCK_ABSTRACT_ORIGIN (block))
3401 tree ao = BLOCK_ABSTRACT_ORIGIN (block);
3403 while (TREE_CODE (ao) == BLOCK
3404 && BLOCK_ABSTRACT_ORIGIN (ao)
3405 && BLOCK_ABSTRACT_ORIGIN (ao) != ao)
3406 ao = BLOCK_ABSTRACT_ORIGIN (ao);
3408 if (TREE_CODE (ao) == FUNCTION_DECL)
3410 *pp_ti_abstract_origin (text) = block;
3413 block = BLOCK_SUPERCONTEXT (block);
3417 /* Print the identifier ID to PRETTY-PRINTER. */
3420 pp_tree_identifier (pretty_printer *pp, tree id)
3422 if (pp_translate_identifiers (pp))
3424 const char *text = identifier_to_locale (IDENTIFIER_POINTER (id));
3425 pp_append_text (pp, text, text + strlen (text));
3428 pp_append_text (pp, IDENTIFIER_POINTER (id),
3429 IDENTIFIER_POINTER (id) + IDENTIFIER_LENGTH (id));
3432 /* A helper function that is used to dump function information before the
3436 dump_function_header (FILE *dump_file, tree fdecl, int flags)
3438 const char *dname, *aname;
3439 struct cgraph_node *node = cgraph_get_node (fdecl);
3440 struct function *fun = DECL_STRUCT_FUNCTION (fdecl);
3442 dname = lang_hooks.decl_printable_name (fdecl, 2);
3444 if (DECL_ASSEMBLER_NAME_SET_P (fdecl))
3445 aname = (IDENTIFIER_POINTER
3446 (DECL_ASSEMBLER_NAME (fdecl)));
3448 aname = "<unset-asm-name>";
3450 fprintf (dump_file, "\n;; Function %s (%s, funcdef_no=%d",
3451 dname, aname, fun->funcdef_no);
3452 if (!(flags & TDF_NOUID))
3453 fprintf (dump_file, ", decl_uid=%d", DECL_UID (fdecl));
3456 fprintf (dump_file, ", symbol_order=%d)%s\n\n", node->order,
3457 node->frequency == NODE_FREQUENCY_HOT
3459 : node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
3460 ? " (unlikely executed)"
3461 : node->frequency == NODE_FREQUENCY_EXECUTED_ONCE
3462 ? " (executed once)"
3466 fprintf (dump_file, ")\n\n");
3469 /* Dump double_int D to pretty_printer PP. UNS is true
3470 if D is unsigned and false otherwise. */
3472 pp_double_int (pretty_printer *pp, double_int d, bool uns)
3475 pp_wide_integer (pp, d.low);
3476 else if (d.fits_uhwi ())
3477 pp_unsigned_wide_integer (pp, d.low);
3478 else if (HOST_BITS_PER_DOUBLE_INT == HOST_BITS_PER_WIDEST_INT)
3481 ? HOST_WIDEST_INT_PRINT_UNSIGNED : HOST_WIDEST_INT_PRINT_DEC,
3482 (HOST_WIDEST_INT) ((((unsigned HOST_WIDEST_INT) d.high << 1)
3483 << (HOST_BITS_PER_WIDE_INT - 1)) | d.low));
3486 unsigned HOST_WIDE_INT low = d.low;
3487 HOST_WIDE_INT high = d.high;
3488 if (!uns && d.is_negative ())
3491 high = ~high + !low;
3494 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
3496 sprintf (pp_buffer (pp)->digit_buffer,
3497 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
3498 (unsigned HOST_WIDE_INT) high, low);
3499 pp_string (pp, pp_buffer (pp)->digit_buffer);