1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
3 Free Software Foundation, Inc.
4 Adapted from c-pretty-print.c by Diego Novillo <dnovillo@redhat.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
25 #include "coretypes.h"
28 #include "diagnostic.h"
31 #include "tree-flow.h"
32 #include "langhooks.h"
33 #include "tree-iterator.h"
34 #include "tree-chrec.h"
35 #include "tree-pass.h"
36 #include "value-prof.h"
38 /* Local functions, macros and variables. */
39 static int op_prio (tree);
40 static const char *op_symbol (tree);
41 static void pretty_print_string (pretty_printer *, const char*);
42 static void print_call_name (pretty_printer *, tree);
43 static void newline_and_indent (pretty_printer *, int);
44 static void maybe_init_pretty_print (FILE *);
45 static void print_declaration (pretty_printer *, tree, int, int);
46 static void print_struct_decl (pretty_printer *, tree, int, int);
47 static void do_niy (pretty_printer *, tree);
48 static void dump_vops (pretty_printer *, tree, int, int);
49 static void dump_generic_bb_buff (pretty_printer *, basic_block, int, int);
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 #define PRINT_FUNCTION_NAME(NODE) pp_printf \
57 (buffer, "%s", TREE_CODE (NODE) == NOP_EXPR ? \
58 lang_hooks.decl_printable_name (TREE_OPERAND (NODE, 0), 1) : \
59 lang_hooks.decl_printable_name (NODE, 1))
61 static pretty_printer buffer;
62 static int initialized = 0;
64 /* Try to print something for an unknown tree code. */
67 do_niy (pretty_printer *buffer, tree node)
71 pp_string (buffer, "<<< Unknown tree: ");
72 pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
76 len = TREE_OPERAND_LENGTH (node);
77 for (i = 0; i < len; ++i)
79 newline_and_indent (buffer, 2);
80 dump_generic_node (buffer, TREE_OPERAND (node, i), 2, 0, false);
84 pp_string (buffer, " >>>\n");
88 debug_generic_expr (tree t)
90 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS);
91 fprintf (stderr, "\n");
95 debug_generic_stmt (tree t)
97 print_generic_stmt (stderr, t, TDF_VOPS|TDF_MEMSYMS);
98 fprintf (stderr, "\n");
102 debug_tree_chain (tree t)
106 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
107 fprintf(stderr, " ");
110 fprintf (stderr, "\n");
113 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
115 print_generic_decl (FILE *file, tree decl, int flags)
117 maybe_init_pretty_print (file);
118 print_declaration (&buffer, decl, 2, flags);
119 pp_write_text_to_stream (&buffer);
122 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
123 to show in the dump. See TDF_* in tree.h. */
126 print_generic_stmt (FILE *file, tree t, int flags)
128 maybe_init_pretty_print (file);
129 dump_generic_node (&buffer, t, 0, flags, true);
133 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
134 to show in the dump. See TDF_* in tree.h. The output is indented by
138 print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
142 maybe_init_pretty_print (file);
144 for (i = 0; i < indent; i++)
146 dump_generic_node (&buffer, t, indent, flags, true);
150 /* Print a single expression T on file FILE. FLAGS specifies details to show
151 in the dump. See TDF_* in tree.h. */
154 print_generic_expr (FILE *file, tree t, int flags)
156 maybe_init_pretty_print (file);
157 dump_generic_node (&buffer, t, 0, flags, false);
160 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
164 dump_decl_name (pretty_printer *buffer, tree node, int flags)
169 pp_tree_identifier (buffer, DECL_NAME (t));
170 if ((flags & TDF_UID)
171 || DECL_NAME (t) == NULL_TREE)
173 if (TREE_CODE (t) == LABEL_DECL
174 && LABEL_DECL_UID (t) != -1)
175 pp_printf (buffer, "L." HOST_WIDE_INT_PRINT_DEC,
179 char c = TREE_CODE (t) == CONST_DECL ? 'C' : 'D';
180 pp_printf (buffer, "%c.%u", c, DECL_UID (t));
185 /* Like the above, but used for pretty printing function calls. */
188 dump_function_name (pretty_printer *buffer, tree node)
190 if (DECL_NAME (node))
191 PRINT_FUNCTION_NAME (node);
193 dump_decl_name (buffer, node, 0);
196 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
197 FLAGS are as in dump_generic_node. */
200 dump_function_declaration (pretty_printer *buffer, tree node,
203 bool wrote_arg = false;
207 pp_character (buffer, '(');
209 /* Print the argument types. The last element in the list is a VOID_TYPE.
210 The following avoids printing the last element. */
211 arg = TYPE_ARG_TYPES (node);
212 while (arg && TREE_CHAIN (arg) && arg != error_mark_node)
215 dump_generic_node (buffer, TREE_VALUE (arg), spc, flags, false);
216 arg = TREE_CHAIN (arg);
217 if (TREE_CHAIN (arg) && TREE_CODE (TREE_CHAIN (arg)) == TREE_LIST)
219 pp_character (buffer, ',');
225 pp_string (buffer, "void");
227 pp_character (buffer, ')');
230 /* Dump the domain associated with an array. */
233 dump_array_domain (pretty_printer *buffer, tree domain, int spc, int flags)
235 pp_character (buffer, '[');
238 tree min = TYPE_MIN_VALUE (domain);
239 tree max = TYPE_MAX_VALUE (domain);
242 && integer_zerop (min)
243 && host_integerp (max, 0))
244 pp_wide_integer (buffer, TREE_INT_CST_LOW (max) + 1);
248 dump_generic_node (buffer, min, spc, flags, false);
249 pp_character (buffer, ':');
251 dump_generic_node (buffer, max, spc, flags, false);
255 pp_string (buffer, "<unknown>");
256 pp_character (buffer, ']');
260 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
261 dump_generic_node. */
264 dump_omp_clause (pretty_printer *buffer, tree clause, int spc, int flags)
268 switch (OMP_CLAUSE_CODE (clause))
270 case OMP_CLAUSE_PRIVATE:
273 case OMP_CLAUSE_SHARED:
276 case OMP_CLAUSE_FIRSTPRIVATE:
277 name = "firstprivate";
279 case OMP_CLAUSE_LASTPRIVATE:
280 name = "lastprivate";
282 case OMP_CLAUSE_COPYIN:
285 case OMP_CLAUSE_COPYPRIVATE:
286 name = "copyprivate";
289 pp_string (buffer, name);
290 pp_character (buffer, '(');
291 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
293 pp_character (buffer, ')');
296 case OMP_CLAUSE_REDUCTION:
297 pp_string (buffer, "reduction(");
298 pp_string (buffer, op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause)));
299 pp_character (buffer, ':');
300 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
302 pp_character (buffer, ')');
306 pp_string (buffer, "if(");
307 dump_generic_node (buffer, OMP_CLAUSE_IF_EXPR (clause),
309 pp_character (buffer, ')');
312 case OMP_CLAUSE_NUM_THREADS:
313 pp_string (buffer, "num_threads(");
314 dump_generic_node (buffer, OMP_CLAUSE_NUM_THREADS_EXPR (clause),
316 pp_character (buffer, ')');
319 case OMP_CLAUSE_NOWAIT:
320 pp_string (buffer, "nowait");
322 case OMP_CLAUSE_ORDERED:
323 pp_string (buffer, "ordered");
326 case OMP_CLAUSE_DEFAULT:
327 pp_string (buffer, "default(");
328 switch (OMP_CLAUSE_DEFAULT_KIND (clause))
330 case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
332 case OMP_CLAUSE_DEFAULT_SHARED:
333 pp_string (buffer, "shared");
335 case OMP_CLAUSE_DEFAULT_NONE:
336 pp_string (buffer, "none");
338 case OMP_CLAUSE_DEFAULT_PRIVATE:
339 pp_string (buffer, "private");
344 pp_character (buffer, ')');
347 case OMP_CLAUSE_SCHEDULE:
348 pp_string (buffer, "schedule(");
349 switch (OMP_CLAUSE_SCHEDULE_KIND (clause))
351 case OMP_CLAUSE_SCHEDULE_STATIC:
352 pp_string (buffer, "static");
354 case OMP_CLAUSE_SCHEDULE_DYNAMIC:
355 pp_string (buffer, "dynamic");
357 case OMP_CLAUSE_SCHEDULE_GUIDED:
358 pp_string (buffer, "guided");
360 case OMP_CLAUSE_SCHEDULE_RUNTIME:
361 pp_string (buffer, "runtime");
366 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
368 pp_character (buffer, ',');
369 dump_generic_node (buffer,
370 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
373 pp_character (buffer, ')');
377 /* Should never happen. */
378 dump_generic_node (buffer, clause, spc, flags, false);
384 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
385 dump_generic_node. */
388 dump_omp_clauses (pretty_printer *buffer, tree clause, int spc, int flags)
396 dump_omp_clause (buffer, clause, spc, flags);
397 clause = OMP_CLAUSE_CHAIN (clause);
405 /* Dump the set of decls SYMS. BUFFER, SPC and FLAGS are as in
406 dump_generic_node. */
409 dump_symbols (pretty_printer *buffer, bitmap syms, int flags)
415 pp_string (buffer, "NIL");
418 pp_string (buffer, " { ");
420 EXECUTE_IF_SET_IN_BITMAP (syms, 0, i, bi)
422 tree sym = referenced_var_lookup (i);
423 dump_generic_node (buffer, sym, 0, flags, false);
424 pp_string (buffer, " ");
427 pp_string (buffer, "}");
432 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of indent.
433 FLAGS specifies details to show in the dump (see TDF_* in tree-pass.h).
434 If IS_STMT is true, the object printed is considered to be a statement
435 and it is terminated by ';' if appropriate. */
438 dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
446 if (node == NULL_TREE)
449 is_expr = EXPR_P (node) || GIMPLE_STMT_P (node);
451 /* We use has_stmt_ann because CALL_EXPR can be both an expression
452 and a statement, and we have no guarantee that it will have a
453 stmt_ann when it is used as an RHS expression. stmt_ann will assert
454 if you call it on something with a non-stmt annotation attached. */
455 if (TREE_CODE (node) != ERROR_MARK
456 && is_gimple_stmt (node)
457 && (flags & (TDF_VOPS|TDF_MEMSYMS))
458 && has_stmt_ann (node)
459 && TREE_CODE (node) != PHI_NODE)
460 dump_vops (buffer, node, spc, flags);
462 if (is_stmt && (flags & TDF_STMTADDR))
463 pp_printf (buffer, "<&%p> ", (void *)node);
465 if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
467 expanded_location xloc = expand_location (EXPR_LOCATION (node));
468 pp_character (buffer, '[');
471 pp_string (buffer, xloc.file);
472 pp_string (buffer, " : ");
474 pp_decimal_int (buffer, xloc.line);
475 pp_string (buffer, "] ");
478 switch (TREE_CODE (node))
481 pp_string (buffer, "<<< error >>>");
484 case IDENTIFIER_NODE:
485 pp_tree_identifier (buffer, node);
489 while (node && node != error_mark_node)
491 if (TREE_PURPOSE (node))
493 dump_generic_node (buffer, TREE_PURPOSE (node), spc, flags, false);
496 dump_generic_node (buffer, TREE_VALUE (node), spc, flags, false);
497 node = TREE_CHAIN (node);
498 if (node && TREE_CODE (node) == TREE_LIST)
500 pp_character (buffer, ',');
507 dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
512 if (TREE_VEC_LENGTH (node) > 0)
514 size_t len = TREE_VEC_LENGTH (node);
515 for (i = 0; i < len - 1; i++)
517 dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags,
519 pp_character (buffer, ',');
522 dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc,
536 unsigned int quals = TYPE_QUALS (node);
537 enum tree_code_class class;
539 if (quals & TYPE_QUAL_CONST)
540 pp_string (buffer, "const ");
541 else if (quals & TYPE_QUAL_VOLATILE)
542 pp_string (buffer, "volatile ");
543 else if (quals & TYPE_QUAL_RESTRICT)
544 pp_string (buffer, "restrict ");
546 class = TREE_CODE_CLASS (TREE_CODE (node));
548 if (class == tcc_declaration)
550 if (DECL_NAME (node))
551 dump_decl_name (buffer, node, flags);
553 pp_string (buffer, "<unnamed type decl>");
555 else if (class == tcc_type)
557 if (TYPE_NAME (node))
559 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
560 pp_tree_identifier (buffer, TYPE_NAME (node));
561 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
562 && DECL_NAME (TYPE_NAME (node)))
563 dump_decl_name (buffer, TYPE_NAME (node), flags);
565 pp_string (buffer, "<unnamed type>");
567 else if (TREE_CODE (node) == VECTOR_TYPE)
569 pp_string (buffer, "vector ");
570 dump_generic_node (buffer, TREE_TYPE (node),
573 else if (TREE_CODE (node) == INTEGER_TYPE)
575 pp_string (buffer, (TYPE_UNSIGNED (node)
576 ? "<unnamed-unsigned:"
577 : "<unnamed-signed:"));
578 pp_decimal_int (buffer, TYPE_PRECISION (node));
579 pp_string (buffer, ">");
582 pp_string (buffer, "<unnamed type>");
589 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
591 if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
593 tree fnode = TREE_TYPE (node);
595 dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false);
597 pp_character (buffer, '(');
598 pp_string (buffer, str);
599 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
600 dump_decl_name (buffer, TYPE_NAME (node), flags);
602 pp_printf (buffer, "<T%x>", TYPE_UID (node));
604 pp_character (buffer, ')');
605 dump_function_declaration (buffer, fnode, spc, flags);
609 unsigned int quals = TYPE_QUALS (node);
611 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
613 pp_string (buffer, str);
615 if (quals & TYPE_QUAL_CONST)
616 pp_string (buffer, " const");
617 else if (quals & TYPE_QUAL_VOLATILE)
618 pp_string (buffer, "volatile");
619 else if (quals & TYPE_QUAL_RESTRICT)
620 pp_string (buffer, " restrict");
622 if (TYPE_REF_CAN_ALIAS_ALL (node))
623 pp_string (buffer, " {ref-all}");
632 dump_decl_name (buffer, TYPE_NAME (TYPE_METHOD_BASETYPE (node)), flags);
633 pp_string (buffer, "::");
638 const char *sep = "";
641 pp_string (buffer, "MEM[");
643 tmp = TMR_SYMBOL (node);
646 pp_string (buffer, sep);
648 pp_string (buffer, "symbol: ");
649 dump_generic_node (buffer, tmp, spc, flags, false);
651 tmp = TMR_BASE (node);
654 pp_string (buffer, sep);
656 pp_string (buffer, "base: ");
657 dump_generic_node (buffer, tmp, spc, flags, false);
659 tmp = TMR_INDEX (node);
662 pp_string (buffer, sep);
664 pp_string (buffer, "index: ");
665 dump_generic_node (buffer, tmp, spc, flags, false);
667 tmp = TMR_STEP (node);
670 pp_string (buffer, sep);
672 pp_string (buffer, "step: ");
673 dump_generic_node (buffer, tmp, spc, flags, false);
675 tmp = TMR_OFFSET (node);
678 pp_string (buffer, sep);
680 pp_string (buffer, "offset: ");
681 dump_generic_node (buffer, tmp, spc, flags, false);
683 pp_string (buffer, "]");
684 if (flags & TDF_DETAILS)
686 pp_string (buffer, "{");
687 dump_generic_node (buffer, TMR_ORIGINAL (node), spc, flags,
689 pp_string (buffer, "}");
698 /* Print the innermost component type. */
699 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
700 tmp = TREE_TYPE (tmp))
702 dump_generic_node (buffer, tmp, spc, flags, false);
704 /* Print the dimensions. */
705 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
706 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
712 case QUAL_UNION_TYPE:
713 /* Print the name of the structure. */
714 if (TREE_CODE (node) == RECORD_TYPE)
715 pp_string (buffer, "struct ");
716 else if (TREE_CODE (node) == UNION_TYPE)
717 pp_string (buffer, "union ");
719 if (TYPE_NAME (node))
720 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
722 print_struct_decl (buffer, node, spc, flags);
730 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
732 /* In the case of a pointer, one may want to divide by the
733 size of the pointed-to type. Unfortunately, this not
734 straightforward. The C front-end maps expressions
739 in such a way that the two INTEGER_CST nodes for "5" have
740 different values but identical types. In the latter
741 case, the 5 is multiplied by sizeof (int) in c-common.c
742 (pointer_int_sum) to convert it to a byte address, and
743 yet the type of the node is left unchanged. Argh. What
744 is consistent though is that the number value corresponds
745 to bytes (UNITS) offset.
747 NB: Neither of the following divisors can be trivially
748 used to recover the original literal:
750 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
751 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
752 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
753 pp_string (buffer, "B"); /* pseudo-unit */
755 else if (! host_integerp (node, 0))
758 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (val);
759 HOST_WIDE_INT high = TREE_INT_CST_HIGH (val);
761 if (tree_int_cst_sgn (val) < 0)
763 pp_character (buffer, '-');
767 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
769 sprintf (pp_buffer (buffer)->digit_buffer,
770 HOST_WIDE_INT_PRINT_DOUBLE_HEX, high, low);
771 pp_string (buffer, pp_buffer (buffer)->digit_buffer);
774 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
778 /* Code copied from print_node. */
781 if (TREE_OVERFLOW (node))
782 pp_string (buffer, " overflow");
784 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
785 d = TREE_REAL_CST (node);
786 if (REAL_VALUE_ISINF (d))
787 pp_string (buffer, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
788 else if (REAL_VALUE_ISNAN (d))
789 pp_string (buffer, " Nan");
793 real_to_decimal (string, &d, sizeof (string), 0, 1);
794 pp_string (buffer, string);
799 unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
800 pp_string (buffer, "0x");
801 for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
802 output_formatted_integer (buffer, "%02x", *p++);
809 pp_string (buffer, "__complex__ (");
810 dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
811 pp_string (buffer, ", ");
812 dump_generic_node (buffer, TREE_IMAGPART (node), spc, flags, false);
813 pp_string (buffer, ")");
817 pp_string (buffer, "\"");
818 pretty_print_string (buffer, TREE_STRING_POINTER (node));
819 pp_string (buffer, "\"");
825 pp_string (buffer, "{ ");
826 for (elt = TREE_VECTOR_CST_ELTS (node); elt; elt = TREE_CHAIN (elt))
828 dump_generic_node (buffer, TREE_VALUE (elt), spc, flags, false);
829 if (TREE_CHAIN (elt))
830 pp_string (buffer, ", ");
832 pp_string (buffer, " }");
841 dump_decl_name (buffer, node, flags);
845 if (DECL_NAME (node))
846 dump_decl_name (buffer, node, flags);
847 else if (LABEL_DECL_UID (node) != -1)
848 pp_printf (buffer, "<L" HOST_WIDE_INT_PRINT_DEC ">",
849 LABEL_DECL_UID (node));
851 pp_printf (buffer, "<D%u>", DECL_UID (node));
855 if (DECL_IS_BUILTIN (node))
857 /* Don't print the declaration of built-in types. */
860 if (DECL_NAME (node))
861 dump_decl_name (buffer, node, flags);
864 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
865 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
866 && TYPE_METHODS (TREE_TYPE (node)))
868 /* The type is a c++ class: all structures have at least
870 pp_string (buffer, "class ");
871 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
876 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
877 ? "union" : "struct "));
878 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
883 case SYMBOL_MEMORY_TAG:
884 case NAME_MEMORY_TAG:
885 case STRUCT_FIELD_TAG:
890 case MEMORY_PARTITION_TAG:
891 dump_decl_name (buffer, node, flags);
895 pp_string (buffer, "<retval>");
899 op0 = TREE_OPERAND (node, 0);
901 if (TREE_CODE (op0) == INDIRECT_REF)
903 op0 = TREE_OPERAND (op0, 0);
906 if (op_prio (op0) < op_prio (node))
907 pp_character (buffer, '(');
908 dump_generic_node (buffer, op0, spc, flags, false);
909 if (op_prio (op0) < op_prio (node))
910 pp_character (buffer, ')');
911 pp_string (buffer, str);
912 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
914 if (TREE_CODE (op0) != VALUE_HANDLE)
916 op0 = component_ref_field_offset (node);
917 if (op0 && TREE_CODE (op0) != INTEGER_CST)
919 pp_string (buffer, "{off: ");
920 dump_generic_node (buffer, op0, spc, flags, false);
921 pp_character (buffer, '}');
927 pp_string (buffer, "BIT_FIELD_REF <");
928 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
929 pp_string (buffer, ", ");
930 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
931 pp_string (buffer, ", ");
932 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
933 pp_string (buffer, ">");
937 case ARRAY_RANGE_REF:
938 op0 = TREE_OPERAND (node, 0);
939 if (op_prio (op0) < op_prio (node))
940 pp_character (buffer, '(');
941 dump_generic_node (buffer, op0, spc, flags, false);
942 if (op_prio (op0) < op_prio (node))
943 pp_character (buffer, ')');
944 pp_character (buffer, '[');
945 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
946 if (TREE_CODE (node) == ARRAY_RANGE_REF)
947 pp_string (buffer, " ...");
948 pp_character (buffer, ']');
950 op0 = array_ref_low_bound (node);
951 op1 = array_ref_element_size (node);
953 if (!integer_zerop (op0)
954 || TREE_OPERAND (node, 2)
955 || TREE_OPERAND (node, 3))
957 pp_string (buffer, "{lb: ");
958 dump_generic_node (buffer, op0, spc, flags, false);
959 pp_string (buffer, " sz: ");
960 dump_generic_node (buffer, op1, spc, flags, false);
961 pp_character (buffer, '}');
967 unsigned HOST_WIDE_INT ix;
969 bool is_struct_init = FALSE;
970 pp_character (buffer, '{');
971 if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
972 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
973 is_struct_init = TRUE;
974 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
976 if (field && is_struct_init)
978 pp_character (buffer, '.');
979 dump_generic_node (buffer, field, spc, flags, false);
980 pp_string (buffer, "=");
982 if (val && TREE_CODE (val) == ADDR_EXPR)
983 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
984 val = TREE_OPERAND (val, 0);
985 if (val && TREE_CODE (val) == FUNCTION_DECL)
986 dump_decl_name (buffer, val, flags);
988 dump_generic_node (buffer, val, spc, flags, false);
989 if (ix != VEC_length (constructor_elt, CONSTRUCTOR_ELTS (node)) - 1)
991 pp_character (buffer, ',');
995 pp_character (buffer, '}');
1002 if (flags & TDF_SLIM)
1004 pp_string (buffer, "<COMPOUND_EXPR>");
1008 dump_generic_node (buffer, TREE_OPERAND (node, 0),
1009 spc, flags, !(flags & TDF_SLIM));
1010 if (flags & TDF_SLIM)
1011 newline_and_indent (buffer, spc);
1014 pp_character (buffer, ',');
1018 for (tp = &TREE_OPERAND (node, 1);
1019 TREE_CODE (*tp) == COMPOUND_EXPR;
1020 tp = &TREE_OPERAND (*tp, 1))
1022 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
1023 spc, flags, !(flags & TDF_SLIM));
1024 if (flags & TDF_SLIM)
1025 newline_and_indent (buffer, spc);
1028 pp_character (buffer, ',');
1033 dump_generic_node (buffer, *tp, spc, flags, !(flags & TDF_SLIM));
1037 case STATEMENT_LIST:
1039 tree_stmt_iterator si;
1042 if (flags & TDF_SLIM)
1044 pp_string (buffer, "<STATEMENT_LIST>");
1048 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
1051 newline_and_indent (buffer, spc);
1054 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
1060 case GIMPLE_MODIFY_STMT:
1062 dump_generic_node (buffer, GENERIC_TREE_OPERAND (node, 0), spc, flags,
1065 pp_character (buffer, '=');
1066 if (TREE_CODE (node) == GIMPLE_MODIFY_STMT
1067 && MOVE_NONTEMPORAL (node))
1068 pp_string (buffer, "{nt}");
1070 dump_generic_node (buffer, GENERIC_TREE_OPERAND (node, 1), spc, flags,
1075 pp_string (buffer, "TARGET_EXPR <");
1076 dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false);
1077 pp_character (buffer, ',');
1079 dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false);
1080 pp_character (buffer, '>');
1084 print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags);
1089 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
1091 pp_string (buffer, "if (");
1092 dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false);
1093 pp_character (buffer, ')');
1094 /* The lowered cond_exprs should always be printed in full. */
1095 if (COND_EXPR_THEN (node)
1096 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
1097 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
1098 && COND_EXPR_ELSE (node)
1099 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
1100 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
1103 dump_generic_node (buffer, COND_EXPR_THEN (node),
1105 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
1107 pp_string (buffer, " else ");
1108 dump_generic_node (buffer, COND_EXPR_ELSE (node),
1112 else if (!(flags & TDF_SLIM))
1114 /* Output COND_EXPR_THEN. */
1115 if (COND_EXPR_THEN (node))
1117 newline_and_indent (buffer, spc+2);
1118 pp_character (buffer, '{');
1119 newline_and_indent (buffer, spc+4);
1120 dump_generic_node (buffer, COND_EXPR_THEN (node), spc+4,
1122 newline_and_indent (buffer, spc+2);
1123 pp_character (buffer, '}');
1126 /* Output COND_EXPR_ELSE. */
1127 if (COND_EXPR_ELSE (node)
1128 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
1130 newline_and_indent (buffer, spc);
1131 pp_string (buffer, "else");
1132 newline_and_indent (buffer, spc+2);
1133 pp_character (buffer, '{');
1134 newline_and_indent (buffer, spc+4);
1135 dump_generic_node (buffer, COND_EXPR_ELSE (node), spc+4,
1137 newline_and_indent (buffer, spc+2);
1138 pp_character (buffer, '}');
1145 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1147 pp_character (buffer, '?');
1149 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1151 pp_character (buffer, ':');
1153 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1158 pp_character (buffer, '{');
1159 if (!(flags & TDF_SLIM))
1161 if (BIND_EXPR_VARS (node))
1163 pp_newline (buffer);
1165 for (op0 = BIND_EXPR_VARS (node); op0; op0 = TREE_CHAIN (op0))
1167 print_declaration (buffer, op0, spc+2, flags);
1168 pp_newline (buffer);
1172 newline_and_indent (buffer, spc+2);
1173 dump_generic_node (buffer, BIND_EXPR_BODY (node), spc+2, flags, true);
1174 newline_and_indent (buffer, spc);
1175 pp_character (buffer, '}');
1181 print_call_name (buffer, node);
1183 /* Print parameters. */
1185 pp_character (buffer, '(');
1188 call_expr_arg_iterator iter;
1189 FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
1191 dump_generic_node (buffer, arg, spc, flags, false);
1192 if (more_call_expr_args_p (&iter))
1194 pp_character (buffer, ',');
1199 pp_character (buffer, ')');
1201 op1 = CALL_EXPR_STATIC_CHAIN (node);
1204 pp_string (buffer, " [static-chain: ");
1205 dump_generic_node (buffer, op1, spc, flags, false);
1206 pp_character (buffer, ']');
1209 if (CALL_EXPR_RETURN_SLOT_OPT (node))
1210 pp_string (buffer, " [return slot optimization]");
1211 if (CALL_EXPR_TAILCALL (node))
1212 pp_string (buffer, " [tail call]");
1215 case WITH_CLEANUP_EXPR:
1219 case CLEANUP_POINT_EXPR:
1220 pp_string (buffer, "<<cleanup_point ");
1221 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1222 pp_string (buffer, ">>");
1225 case PLACEHOLDER_EXPR:
1226 pp_string (buffer, "<PLACEHOLDER_EXPR ");
1227 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1228 pp_character (buffer, '>');
1231 /* Binary arithmetic and logic expressions. */
1232 case WIDEN_SUM_EXPR:
1233 case WIDEN_MULT_EXPR:
1237 case TRUNC_DIV_EXPR:
1239 case FLOOR_DIV_EXPR:
1240 case ROUND_DIV_EXPR:
1241 case TRUNC_MOD_EXPR:
1243 case FLOOR_MOD_EXPR:
1244 case ROUND_MOD_EXPR:
1246 case EXACT_DIV_EXPR:
1251 case VEC_LSHIFT_EXPR:
1252 case VEC_RSHIFT_EXPR:
1256 case TRUTH_ANDIF_EXPR:
1257 case TRUTH_ORIF_EXPR:
1258 case TRUTH_AND_EXPR:
1260 case TRUTH_XOR_EXPR:
1274 case UNORDERED_EXPR:
1276 const char *op = op_symbol (node);
1277 op0 = TREE_OPERAND (node, 0);
1278 op1 = TREE_OPERAND (node, 1);
1280 /* When the operands are expressions with less priority,
1281 keep semantics of the tree representation. */
1282 if (op_prio (op0) <= op_prio (node))
1284 pp_character (buffer, '(');
1285 dump_generic_node (buffer, op0, spc, flags, false);
1286 pp_character (buffer, ')');
1289 dump_generic_node (buffer, op0, spc, flags, false);
1292 pp_string (buffer, op);
1295 /* When the operands are expressions with less priority,
1296 keep semantics of the tree representation. */
1297 if (op_prio (op1) <= op_prio (node))
1299 pp_character (buffer, '(');
1300 dump_generic_node (buffer, op1, spc, flags, false);
1301 pp_character (buffer, ')');
1304 dump_generic_node (buffer, op1, spc, flags, false);
1308 /* Unary arithmetic and logic expressions. */
1311 case TRUTH_NOT_EXPR:
1313 case PREDECREMENT_EXPR:
1314 case PREINCREMENT_EXPR:
1315 case ALIGN_INDIRECT_REF:
1316 case MISALIGNED_INDIRECT_REF:
1318 if (TREE_CODE (node) == ADDR_EXPR
1319 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
1320 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
1321 ; /* Do not output '&' for strings and function pointers. */
1323 pp_string (buffer, op_symbol (node));
1325 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1327 pp_character (buffer, '(');
1328 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1329 pp_character (buffer, ')');
1332 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1334 if (TREE_CODE (node) == MISALIGNED_INDIRECT_REF)
1336 pp_string (buffer, "{misalignment: ");
1337 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1338 pp_character (buffer, '}');
1342 case POSTDECREMENT_EXPR:
1343 case POSTINCREMENT_EXPR:
1344 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1346 pp_character (buffer, '(');
1347 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1348 pp_character (buffer, ')');
1351 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1352 pp_string (buffer, op_symbol (node));
1356 pp_string (buffer, "MIN_EXPR <");
1357 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1358 pp_string (buffer, ", ");
1359 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1360 pp_character (buffer, '>');
1364 pp_string (buffer, "MAX_EXPR <");
1365 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1366 pp_string (buffer, ", ");
1367 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1368 pp_character (buffer, '>');
1372 pp_string (buffer, "ABS_EXPR <");
1373 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1374 pp_character (buffer, '>');
1381 case FIX_TRUNC_EXPR:
1385 type = TREE_TYPE (node);
1386 op0 = TREE_OPERAND (node, 0);
1387 if (type != TREE_TYPE (op0))
1389 pp_character (buffer, '(');
1390 dump_generic_node (buffer, type, spc, flags, false);
1391 pp_string (buffer, ") ");
1393 if (op_prio (op0) < op_prio (node))
1394 pp_character (buffer, '(');
1395 dump_generic_node (buffer, op0, spc, flags, false);
1396 if (op_prio (op0) < op_prio (node))
1397 pp_character (buffer, ')');
1400 case VIEW_CONVERT_EXPR:
1401 pp_string (buffer, "VIEW_CONVERT_EXPR<");
1402 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1403 pp_string (buffer, ">(");
1404 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1405 pp_character (buffer, ')');
1408 case NON_LVALUE_EXPR:
1409 pp_string (buffer, "NON_LVALUE_EXPR <");
1410 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1411 pp_character (buffer, '>');
1415 pp_string (buffer, "SAVE_EXPR <");
1416 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1417 pp_character (buffer, '>');
1421 pp_string (buffer, "COMPLEX_EXPR <");
1422 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1423 pp_string (buffer, ", ");
1424 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1425 pp_string (buffer, ">");
1429 pp_string (buffer, "CONJ_EXPR <");
1430 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1431 pp_string (buffer, ">");
1435 pp_string (buffer, "REALPART_EXPR <");
1436 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1437 pp_string (buffer, ">");
1441 pp_string (buffer, "IMAGPART_EXPR <");
1442 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1443 pp_string (buffer, ">");
1447 pp_string (buffer, "VA_ARG_EXPR <");
1448 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1449 pp_string (buffer, ">");
1452 case TRY_FINALLY_EXPR:
1453 case TRY_CATCH_EXPR:
1454 pp_string (buffer, "try");
1455 newline_and_indent (buffer, spc+2);
1456 pp_string (buffer, "{");
1457 newline_and_indent (buffer, spc+4);
1458 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc+4, flags, true);
1459 newline_and_indent (buffer, spc+2);
1460 pp_string (buffer, "}");
1461 newline_and_indent (buffer, spc);
1463 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
1464 newline_and_indent (buffer, spc+2);
1465 pp_string (buffer, "{");
1466 newline_and_indent (buffer, spc+4);
1467 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
1468 newline_and_indent (buffer, spc+2);
1469 pp_string (buffer, "}");
1474 pp_string (buffer, "catch (");
1475 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
1476 pp_string (buffer, ")");
1477 newline_and_indent (buffer, spc+2);
1478 pp_string (buffer, "{");
1479 newline_and_indent (buffer, spc+4);
1480 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
1481 newline_and_indent (buffer, spc+2);
1482 pp_string (buffer, "}");
1486 case EH_FILTER_EXPR:
1487 pp_string (buffer, "<<<eh_filter (");
1488 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
1489 pp_string (buffer, ")>>>");
1490 newline_and_indent (buffer, spc+2);
1491 pp_string (buffer, "{");
1492 newline_and_indent (buffer, spc+4);
1493 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
1494 newline_and_indent (buffer, spc+2);
1495 pp_string (buffer, "}");
1500 op0 = TREE_OPERAND (node, 0);
1501 /* If this is for break or continue, don't bother printing it. */
1502 if (DECL_NAME (op0))
1504 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1505 if (strcmp (name, "break") == 0
1506 || strcmp (name, "continue") == 0)
1509 dump_generic_node (buffer, op0, spc, flags, false);
1510 pp_character (buffer, ':');
1511 if (DECL_NONLOCAL (op0))
1512 pp_string (buffer, " [non-local]");
1516 pp_string (buffer, "<<<exception object>>>");
1520 pp_string (buffer, "<<<filter object>>>");
1524 pp_string (buffer, "while (1)");
1525 if (!(flags & TDF_SLIM))
1527 newline_and_indent (buffer, spc+2);
1528 pp_character (buffer, '{');
1529 newline_and_indent (buffer, spc+4);
1530 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
1531 newline_and_indent (buffer, spc+2);
1532 pp_character (buffer, '}');
1538 pp_string (buffer, "return");
1539 op0 = TREE_OPERAND (node, 0);
1543 if (TREE_CODE (op0) == MODIFY_EXPR
1544 || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
1545 dump_generic_node (buffer, GENERIC_TREE_OPERAND (op0, 1),
1548 dump_generic_node (buffer, op0, spc, flags, false);
1553 pp_string (buffer, "if (");
1554 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1555 pp_string (buffer, ") break");
1559 pp_string (buffer, "switch (");
1560 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
1561 pp_character (buffer, ')');
1562 if (!(flags & TDF_SLIM))
1564 newline_and_indent (buffer, spc+2);
1565 pp_character (buffer, '{');
1566 if (SWITCH_BODY (node))
1568 newline_and_indent (buffer, spc+4);
1569 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags,
1574 tree vec = SWITCH_LABELS (node);
1575 size_t i, n = TREE_VEC_LENGTH (vec);
1576 for (i = 0; i < n; ++i)
1578 tree elt = TREE_VEC_ELT (vec, i);
1579 newline_and_indent (buffer, spc+4);
1582 dump_generic_node (buffer, elt, spc+4, flags, false);
1583 pp_string (buffer, " goto ");
1584 dump_generic_node (buffer, CASE_LABEL (elt), spc+4,
1586 pp_semicolon (buffer);
1589 pp_string (buffer, "case ???: goto ???;");
1592 newline_and_indent (buffer, spc+2);
1593 pp_character (buffer, '}');
1599 op0 = GOTO_DESTINATION (node);
1600 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
1602 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1603 if (strcmp (name, "break") == 0
1604 || strcmp (name, "continue") == 0)
1606 pp_string (buffer, name);
1610 pp_string (buffer, "goto ");
1611 dump_generic_node (buffer, op0, spc, flags, false);
1615 pp_string (buffer, "resx ");
1616 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1620 pp_string (buffer, "__asm__");
1621 if (ASM_VOLATILE_P (node))
1622 pp_string (buffer, " __volatile__");
1623 pp_character (buffer, '(');
1624 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
1625 pp_character (buffer, ':');
1626 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
1627 pp_character (buffer, ':');
1628 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
1629 if (ASM_CLOBBERS (node))
1631 pp_character (buffer, ':');
1632 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
1634 pp_string (buffer, ")");
1637 case CASE_LABEL_EXPR:
1638 if (CASE_LOW (node) && CASE_HIGH (node))
1640 pp_string (buffer, "case ");
1641 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1642 pp_string (buffer, " ... ");
1643 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
1645 else if (CASE_LOW (node))
1647 pp_string (buffer, "case ");
1648 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1651 pp_string (buffer, "default ");
1652 pp_character (buffer, ':');
1656 pp_string (buffer, "OBJ_TYPE_REF(");
1657 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
1658 pp_character (buffer, ';');
1659 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
1660 pp_character (buffer, '-');
1661 pp_character (buffer, '>');
1662 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
1663 pp_character (buffer, ')');
1670 dump_generic_node (buffer, PHI_RESULT (node), spc, flags, false);
1671 pp_string (buffer, " = PHI <");
1672 for (i = 0; i < PHI_NUM_ARGS (node); i++)
1674 dump_generic_node (buffer, PHI_ARG_DEF (node, i), spc, flags, false);
1675 pp_string (buffer, "(");
1676 pp_decimal_int (buffer, PHI_ARG_EDGE (node, i)->src->index);
1677 pp_string (buffer, ")");
1678 if (i < PHI_NUM_ARGS (node) - 1)
1679 pp_string (buffer, ", ");
1681 pp_string (buffer, ">");
1683 if (stmt_references_memory_p (node) && (flags & TDF_MEMSYMS))
1684 dump_symbols (buffer, STORED_SYMS (node), flags);
1689 dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
1690 pp_string (buffer, "_");
1691 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
1692 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
1693 pp_string (buffer, "(ab)");
1694 else if (SSA_NAME_IS_DEFAULT_DEF (node))
1695 pp_string (buffer, "(D)");
1698 case WITH_SIZE_EXPR:
1699 pp_string (buffer, "WITH_SIZE_EXPR <");
1700 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1701 pp_string (buffer, ", ");
1702 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1703 pp_string (buffer, ">");
1707 pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node));
1711 pp_string (buffer, "ASSERT_EXPR <");
1712 dump_generic_node (buffer, ASSERT_EXPR_VAR (node), spc, flags, false);
1713 pp_string (buffer, ", ");
1714 dump_generic_node (buffer, ASSERT_EXPR_COND (node), spc, flags, false);
1715 pp_string (buffer, ">");
1719 pp_string (buffer, "scev_known");
1722 case SCEV_NOT_KNOWN:
1723 pp_string (buffer, "scev_not_known");
1726 case POLYNOMIAL_CHREC:
1727 pp_string (buffer, "{");
1728 dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
1729 pp_string (buffer, ", +, ");
1730 dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
1731 pp_string (buffer, "}_");
1732 dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
1736 case REALIGN_LOAD_EXPR:
1737 pp_string (buffer, "REALIGN_LOAD <");
1738 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1739 pp_string (buffer, ", ");
1740 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1741 pp_string (buffer, ", ");
1742 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1743 pp_string (buffer, ">");
1747 pp_string (buffer, " VEC_COND_EXPR < ");
1748 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1749 pp_string (buffer, " , ");
1750 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1751 pp_string (buffer, " , ");
1752 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1753 pp_string (buffer, " > ");
1757 pp_string (buffer, " DOT_PROD_EXPR < ");
1758 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1759 pp_string (buffer, ", ");
1760 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1761 pp_string (buffer, ", ");
1762 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1763 pp_string (buffer, " > ");
1767 pp_string (buffer, "#pragma omp parallel");
1768 dump_omp_clauses (buffer, OMP_PARALLEL_CLAUSES (node), spc, flags);
1769 if (OMP_PARALLEL_FN (node))
1771 pp_string (buffer, " [child fn: ");
1772 dump_generic_node (buffer, OMP_PARALLEL_FN (node), spc, flags, false);
1774 pp_string (buffer, " (");
1776 if (OMP_PARALLEL_DATA_ARG (node))
1777 dump_generic_node (buffer, OMP_PARALLEL_DATA_ARG (node), spc, flags,
1780 pp_string (buffer, "???");
1782 pp_string (buffer, ")]");
1786 if (!(flags & TDF_SLIM) && OMP_BODY (node))
1788 newline_and_indent (buffer, spc + 2);
1789 pp_character (buffer, '{');
1790 newline_and_indent (buffer, spc + 4);
1791 dump_generic_node (buffer, OMP_BODY (node), spc + 4, flags, false);
1792 newline_and_indent (buffer, spc + 2);
1793 pp_character (buffer, '}');
1799 pp_string (buffer, "#pragma omp for");
1800 dump_omp_clauses (buffer, OMP_FOR_CLAUSES (node), spc, flags);
1802 if (!(flags & TDF_SLIM))
1804 if (OMP_FOR_PRE_BODY (node))
1806 newline_and_indent (buffer, spc + 2);
1807 pp_character (buffer, '{');
1809 newline_and_indent (buffer, spc);
1810 dump_generic_node (buffer, OMP_FOR_PRE_BODY (node),
1813 newline_and_indent (buffer, spc);
1814 pp_string (buffer, "for (");
1815 dump_generic_node (buffer, OMP_FOR_INIT (node), spc, flags, false);
1816 pp_string (buffer, "; ");
1817 dump_generic_node (buffer, OMP_FOR_COND (node), spc, flags, false);
1818 pp_string (buffer, "; ");
1819 dump_generic_node (buffer, OMP_FOR_INCR (node), spc, flags, false);
1820 pp_string (buffer, ")");
1821 if (OMP_FOR_BODY (node))
1823 newline_and_indent (buffer, spc + 2);
1824 pp_character (buffer, '{');
1825 newline_and_indent (buffer, spc + 4);
1826 dump_generic_node (buffer, OMP_FOR_BODY (node), spc + 4, flags,
1828 newline_and_indent (buffer, spc + 2);
1829 pp_character (buffer, '}');
1831 if (OMP_FOR_PRE_BODY (node))
1834 newline_and_indent (buffer, spc + 2);
1835 pp_character (buffer, '}');
1842 pp_string (buffer, "#pragma omp sections");
1843 dump_omp_clauses (buffer, OMP_SECTIONS_CLAUSES (node), spc, flags);
1847 pp_string (buffer, "#pragma omp section");
1851 pp_string (buffer, "#pragma omp master");
1855 pp_string (buffer, "#pragma omp ordered");
1859 pp_string (buffer, "#pragma omp critical");
1860 if (OMP_CRITICAL_NAME (node))
1863 pp_character (buffer, '(');
1864 dump_generic_node (buffer, OMP_CRITICAL_NAME (node), spc,
1866 pp_character (buffer, ')');
1871 pp_string (buffer, "#pragma omp atomic");
1872 newline_and_indent (buffer, spc + 2);
1873 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1875 pp_character (buffer, '=');
1877 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1881 pp_string (buffer, "#pragma omp single");
1882 dump_omp_clauses (buffer, OMP_SINGLE_CLAUSES (node), spc, flags);
1886 pp_string (buffer, "OMP_RETURN");
1887 if (OMP_RETURN_NOWAIT (node))
1888 pp_string (buffer, " [nowait]");
1893 pp_string (buffer, "OMP_CONTINUE");
1898 dump_omp_clause (buffer, node, spc, flags);
1902 case REDUC_MAX_EXPR:
1903 pp_string (buffer, " REDUC_MAX_EXPR < ");
1904 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1905 pp_string (buffer, " > ");
1908 case REDUC_MIN_EXPR:
1909 pp_string (buffer, " REDUC_MIN_EXPR < ");
1910 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1911 pp_string (buffer, " > ");
1914 case REDUC_PLUS_EXPR:
1915 pp_string (buffer, " REDUC_PLUS_EXPR < ");
1916 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1917 pp_string (buffer, " > ");
1920 case VEC_WIDEN_MULT_HI_EXPR:
1921 pp_string (buffer, " VEC_WIDEN_MULT_HI_EXPR < ");
1922 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1923 pp_string (buffer, ", ");
1924 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1925 pp_string (buffer, " > ");
1928 case VEC_WIDEN_MULT_LO_EXPR:
1929 pp_string (buffer, " VEC_WIDEN_MULT_LO_EXPR < ");
1930 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1931 pp_string (buffer, ", ");
1932 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1933 pp_string (buffer, " > ");
1936 case VEC_UNPACK_HI_EXPR:
1937 pp_string (buffer, " VEC_UNPACK_HI_EXPR < ");
1938 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1939 pp_string (buffer, " > ");
1942 case VEC_UNPACK_LO_EXPR:
1943 pp_string (buffer, " VEC_UNPACK_LO_EXPR < ");
1944 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1945 pp_string (buffer, " > ");
1948 case VEC_UNPACK_FLOAT_HI_EXPR:
1949 pp_string (buffer, " VEC_UNPACK_FLOAT_HI_EXPR < ");
1950 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1951 pp_string (buffer, " > ");
1954 case VEC_UNPACK_FLOAT_LO_EXPR:
1955 pp_string (buffer, " VEC_UNPACK_FLOAT_LO_EXPR < ");
1956 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1957 pp_string (buffer, " > ");
1960 case VEC_PACK_TRUNC_EXPR:
1961 pp_string (buffer, " VEC_PACK_TRUNC_EXPR < ");
1962 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1963 pp_string (buffer, ", ");
1964 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1965 pp_string (buffer, " > ");
1968 case VEC_PACK_SAT_EXPR:
1969 pp_string (buffer, " VEC_PACK_SAT_EXPR < ");
1970 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1971 pp_string (buffer, ", ");
1972 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1973 pp_string (buffer, " > ");
1976 case VEC_PACK_FIX_TRUNC_EXPR:
1977 pp_string (buffer, " VEC_PACK_FIX_TRUNC_EXPR < ");
1978 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1979 pp_string (buffer, ", ");
1980 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1981 pp_string (buffer, " > ");
1987 pp_string (buffer, "BLOCK");
1989 if (BLOCK_ABSTRACT (node))
1990 pp_string (buffer, " [abstract]");
1992 if (TREE_ASM_WRITTEN (node))
1993 pp_string (buffer, " [written]");
1995 newline_and_indent (buffer, spc + 2);
1997 if (BLOCK_SUPERCONTEXT (node))
1999 pp_string (buffer, "SUPERCONTEXT: ");
2000 if (TREE_CODE (BLOCK_SUPERCONTEXT (node)) == BLOCK)
2001 pp_printf (buffer, "BLOCK %p",
2002 (void *)BLOCK_SUPERCONTEXT (node));
2004 dump_generic_node (buffer, BLOCK_SUPERCONTEXT (node), 0, flags,
2006 newline_and_indent (buffer, spc + 2);
2009 if (BLOCK_SUBBLOCKS (node))
2011 pp_string (buffer, "SUBBLOCKS: ");
2012 for (t = BLOCK_SUBBLOCKS (node); t; t = BLOCK_CHAIN (t))
2013 pp_printf (buffer, "%p ", (void *)t);
2014 newline_and_indent (buffer, spc + 2);
2017 if (BLOCK_VARS (node))
2019 pp_string (buffer, "VARS: ");
2020 for (t = BLOCK_VARS (node); t; t = TREE_CHAIN (t))
2022 dump_generic_node (buffer, t, 0, flags, false);
2023 pp_string (buffer, " ");
2025 newline_and_indent (buffer, spc + 2);
2028 if (BLOCK_ABSTRACT_ORIGIN (node))
2030 pp_string (buffer, "ABSTRACT_ORIGIN: ");
2031 if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node)) == BLOCK)
2032 pp_printf (buffer, "BLOCK %p",
2033 (void *)BLOCK_ABSTRACT_ORIGIN (node));
2035 dump_generic_node (buffer, BLOCK_ABSTRACT_ORIGIN (node), 0, flags,
2037 newline_and_indent (buffer, spc + 2);
2042 case VEC_EXTRACT_EVEN_EXPR:
2043 pp_string (buffer, " VEC_EXTRACT_EVEN_EXPR < ");
2044 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2045 pp_string (buffer, ", ");
2046 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2047 pp_string (buffer, " > ");
2050 case VEC_EXTRACT_ODD_EXPR:
2051 pp_string (buffer, " VEC_EXTRACT_ODD_EXPR < ");
2052 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2053 pp_string (buffer, ", ");
2054 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2055 pp_string (buffer, " > ");
2058 case VEC_INTERLEAVE_HIGH_EXPR:
2059 pp_string (buffer, " VEC_INTERLEAVE_HIGH_EXPR < ");
2060 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2061 pp_string (buffer, ", ");
2062 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2063 pp_string (buffer, " > ");
2066 case VEC_INTERLEAVE_LOW_EXPR:
2067 pp_string (buffer, " VEC_INTERLEAVE_LOW_EXPR < ");
2068 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2069 pp_string (buffer, ", ");
2070 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2071 pp_string (buffer, " > ");
2078 if (is_stmt && is_expr)
2079 pp_semicolon (buffer);
2081 /* If we're building a diagnostic, the formatted text will be written
2082 into BUFFER's stream by the caller; otherwise, write it now. */
2083 if (!(flags & TDF_DIAGNOSTIC))
2084 pp_write_text_to_stream (buffer);
2089 /* Print the declaration of a variable. */
2092 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
2096 if (TREE_CODE (t) == TYPE_DECL)
2097 pp_string (buffer, "typedef ");
2099 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
2100 pp_string (buffer, "register ");
2102 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
2103 pp_string (buffer, "extern ");
2104 else if (TREE_STATIC (t))
2105 pp_string (buffer, "static ");
2107 /* Print the type and name. */
2108 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
2112 /* Print array's type. */
2113 tmp = TREE_TYPE (t);
2114 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
2115 tmp = TREE_TYPE (tmp);
2116 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
2118 /* Print variable's name. */
2120 dump_generic_node (buffer, t, spc, flags, false);
2122 /* Print the dimensions. */
2123 tmp = TREE_TYPE (t);
2124 while (TREE_CODE (tmp) == ARRAY_TYPE)
2126 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
2127 tmp = TREE_TYPE (tmp);
2130 else if (TREE_CODE (t) == FUNCTION_DECL)
2132 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
2134 dump_decl_name (buffer, t, flags);
2135 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
2139 /* Print type declaration. */
2140 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
2142 /* Print variable's name. */
2144 dump_generic_node (buffer, t, spc, flags, false);
2147 if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
2149 pp_string (buffer, " __asm__ ");
2150 pp_character (buffer, '(');
2151 dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
2152 pp_character (buffer, ')');
2155 /* The initial value of a function serves to determine wether the function
2156 is declared or defined. So the following does not apply to function
2158 if (TREE_CODE (t) != FUNCTION_DECL)
2160 /* Print the initial value. */
2161 if (DECL_INITIAL (t))
2164 pp_character (buffer, '=');
2166 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
2170 if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
2172 pp_string (buffer, " [value-expr: ");
2173 dump_generic_node (buffer, DECL_VALUE_EXPR (t), spc, flags, false);
2174 pp_character (buffer, ']');
2177 pp_character (buffer, ';');
2181 /* Prints a structure: name, fields, and methods.
2182 FIXME: Still incomplete. */
2185 print_struct_decl (pretty_printer *buffer, tree node, int spc, int flags)
2187 /* Print the name of the structure. */
2188 if (TYPE_NAME (node))
2191 if (TREE_CODE (node) == RECORD_TYPE)
2192 pp_string (buffer, "struct ");
2193 else if ((TREE_CODE (node) == UNION_TYPE
2194 || TREE_CODE (node) == QUAL_UNION_TYPE))
2195 pp_string (buffer, "union ");
2197 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
2200 /* Print the contents of the structure. */
2201 pp_newline (buffer);
2203 pp_character (buffer, '{');
2204 pp_newline (buffer);
2206 /* Print the fields of the structure. */
2209 tmp = TYPE_FIELDS (node);
2212 /* Avoid to print recursively the structure. */
2213 /* FIXME : Not implemented correctly...,
2214 what about the case when we have a cycle in the contain graph? ...
2215 Maybe this could be solved by looking at the scope in which the
2216 structure was declared. */
2217 if (TREE_TYPE (tmp) != node
2218 || (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
2219 && TREE_TYPE (TREE_TYPE (tmp)) != node))
2221 print_declaration (buffer, tmp, spc+2, flags);
2222 pp_newline (buffer);
2224 tmp = TREE_CHAIN (tmp);
2228 pp_character (buffer, '}');
2231 /* Return the priority of the operator OP.
2233 From lowest to highest precedence with either left-to-right (L-R)
2234 or right-to-left (R-L) associativity]:
2237 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2249 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2250 15 [L-R] fn() [] -> .
2252 unary +, - and * have higher precedence than the corresponding binary
2261 switch (TREE_CODE (op))
2269 case GIMPLE_MODIFY_STMT:
2277 case TRUTH_ORIF_EXPR:
2280 case TRUTH_AND_EXPR:
2281 case TRUTH_ANDIF_EXPR:
2288 case TRUTH_XOR_EXPR:
2305 case UNORDERED_EXPR:
2318 case WIDEN_SUM_EXPR:
2323 case VEC_WIDEN_MULT_HI_EXPR:
2324 case VEC_WIDEN_MULT_LO_EXPR:
2325 case WIDEN_MULT_EXPR:
2328 case TRUNC_DIV_EXPR:
2330 case FLOOR_DIV_EXPR:
2331 case ROUND_DIV_EXPR:
2333 case EXACT_DIV_EXPR:
2334 case TRUNC_MOD_EXPR:
2336 case FLOOR_MOD_EXPR:
2337 case ROUND_MOD_EXPR:
2340 case TRUTH_NOT_EXPR:
2342 case POSTINCREMENT_EXPR:
2343 case POSTDECREMENT_EXPR:
2344 case PREINCREMENT_EXPR:
2345 case PREDECREMENT_EXPR:
2347 case ALIGN_INDIRECT_REF:
2348 case MISALIGNED_INDIRECT_REF:
2354 case FIX_TRUNC_EXPR:
2360 case ARRAY_RANGE_REF:
2364 /* Special expressions. */
2370 case REDUC_MAX_EXPR:
2371 case REDUC_MIN_EXPR:
2372 case REDUC_PLUS_EXPR:
2373 case VEC_LSHIFT_EXPR:
2374 case VEC_RSHIFT_EXPR:
2375 case VEC_UNPACK_HI_EXPR:
2376 case VEC_UNPACK_LO_EXPR:
2377 case VEC_UNPACK_FLOAT_HI_EXPR:
2378 case VEC_UNPACK_FLOAT_LO_EXPR:
2379 case VEC_PACK_TRUNC_EXPR:
2380 case VEC_PACK_SAT_EXPR:
2384 case NON_LVALUE_EXPR:
2385 return op_prio (TREE_OPERAND (op, 0));
2388 /* Return an arbitrarily high precedence to avoid surrounding single
2389 VAR_DECLs in ()s. */
2395 /* Return the symbol associated with operator CODE. */
2398 op_symbol_code (enum tree_code code)
2403 case GIMPLE_MODIFY_STMT:
2407 case TRUTH_ORIF_EXPR:
2410 case TRUTH_AND_EXPR:
2411 case TRUTH_ANDIF_EXPR:
2417 case TRUTH_XOR_EXPR:
2427 case UNORDERED_EXPR:
2473 case VEC_LSHIFT_EXPR:
2476 case VEC_RSHIFT_EXPR:
2482 case REDUC_PLUS_EXPR:
2485 case WIDEN_SUM_EXPR:
2488 case WIDEN_MULT_EXPR:
2498 case TRUTH_NOT_EXPR:
2505 case ALIGN_INDIRECT_REF:
2508 case MISALIGNED_INDIRECT_REF:
2511 case TRUNC_DIV_EXPR:
2518 case FLOOR_DIV_EXPR:
2521 case ROUND_DIV_EXPR:
2524 case EXACT_DIV_EXPR:
2527 case TRUNC_MOD_EXPR:
2533 case FLOOR_MOD_EXPR:
2536 case ROUND_MOD_EXPR:
2539 case PREDECREMENT_EXPR:
2542 case PREINCREMENT_EXPR:
2545 case POSTDECREMENT_EXPR:
2548 case POSTINCREMENT_EXPR:
2558 return "<<< ??? >>>";
2562 /* Return the symbol associated with operator OP. */
2567 return op_symbol_code (TREE_CODE (op));
2570 /* Prints the name of a CALL_EXPR. */
2573 print_call_name (pretty_printer *buffer, tree node)
2577 gcc_assert (TREE_CODE (node) == CALL_EXPR);
2579 op0 = CALL_EXPR_FN (node);
2581 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
2582 op0 = TREE_OPERAND (op0, 0);
2584 switch (TREE_CODE (op0))
2588 dump_function_name (buffer, op0);
2594 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2598 pp_string (buffer, "(");
2599 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2600 pp_string (buffer, ") ? ");
2601 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, 0, false);
2602 pp_string (buffer, " : ");
2603 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, 0, false);
2607 /* The function is a pointer contained in a structure. */
2608 if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
2609 TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2610 dump_function_name (buffer, TREE_OPERAND (op0, 1));
2612 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2614 We can have several levels of structures and a function
2615 pointer inside. This is not implemented yet... */
2620 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2621 dump_function_name (buffer, TREE_OPERAND (op0, 0));
2623 dump_generic_node (buffer, op0, 0, 0, false);
2628 dump_generic_node (buffer, op0, 0, 0, false);
2636 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2639 pretty_print_string (pretty_printer *buffer, const char *str)
2649 pp_string (buffer, "\\b");
2653 pp_string (buffer, "\\f");
2657 pp_string (buffer, "\\n");
2661 pp_string (buffer, "\\r");
2665 pp_string (buffer, "\\t");
2669 pp_string (buffer, "\\v");
2673 pp_string (buffer, "\\\\");
2677 pp_string (buffer, "\\\"");
2681 pp_string (buffer, "\\'");
2684 /* No need to handle \0; the loop terminates on \0. */
2687 pp_string (buffer, "\\1");
2691 pp_string (buffer, "\\2");
2695 pp_string (buffer, "\\3");
2699 pp_string (buffer, "\\4");
2703 pp_string (buffer, "\\5");
2707 pp_string (buffer, "\\6");
2711 pp_string (buffer, "\\7");
2715 pp_character (buffer, str[0]);
2723 maybe_init_pretty_print (FILE *file)
2727 pp_construct (&buffer, /* prefix */NULL, /* line-width */0);
2728 pp_needs_newline (&buffer) = true;
2732 buffer.buffer->stream = file;
2736 newline_and_indent (pretty_printer *buffer, int spc)
2738 pp_newline (buffer);
2744 dump_vops (pretty_printer *buffer, tree stmt, int spc, int flags)
2746 struct voptype_d *vdefs;
2747 struct voptype_d *vuses;
2750 if (!ssa_operands_active () || !stmt_references_memory_p (stmt))
2753 /* Even if the statement doesn't have virtual operators yet, it may
2754 contain symbol information (this happens before aliases have been
2756 if ((flags & TDF_MEMSYMS)
2757 && VUSE_OPS (stmt) == NULL
2758 && VDEF_OPS (stmt) == NULL)
2760 if (LOADED_SYMS (stmt))
2762 pp_string (buffer, "# LOADS: ");
2763 dump_symbols (buffer, LOADED_SYMS (stmt), flags);
2764 newline_and_indent (buffer, spc);
2767 if (STORED_SYMS (stmt))
2769 pp_string (buffer, "# STORES: ");
2770 dump_symbols (buffer, STORED_SYMS (stmt), flags);
2771 newline_and_indent (buffer, spc);
2777 vuses = VUSE_OPS (stmt);
2780 pp_string (buffer, "# VUSE <");
2782 n = VUSE_NUM (vuses);
2783 for (i = 0; i < n; i++)
2785 dump_generic_node (buffer, VUSE_OP (vuses, i), spc + 2, flags, false);
2787 pp_string (buffer, ", ");
2790 pp_string (buffer, ">");
2792 if (flags & TDF_MEMSYMS)
2793 dump_symbols (buffer, LOADED_SYMS (stmt), flags);
2795 newline_and_indent (buffer, spc);
2796 vuses = vuses->next;
2799 vdefs = VDEF_OPS (stmt);
2802 pp_string (buffer, "# ");
2803 dump_generic_node (buffer, VDEF_RESULT (vdefs), spc + 2, flags, false);
2804 pp_string (buffer, " = VDEF <");
2806 n = VDEF_NUM (vdefs);
2807 for (i = 0; i < n; i++)
2809 dump_generic_node (buffer, VDEF_OP (vdefs, i), spc + 2, flags, 0);
2811 pp_string (buffer, ", ");
2814 pp_string (buffer, ">");
2816 if ((flags & TDF_MEMSYMS) && vdefs->next == NULL)
2817 dump_symbols (buffer, STORED_SYMS (stmt), flags);
2819 newline_and_indent (buffer, spc);
2820 vdefs = vdefs->next;
2825 /* Dumps basic block BB to FILE with details described by FLAGS and
2826 indented by INDENT spaces. */
2829 dump_generic_bb (FILE *file, basic_block bb, int indent, int flags)
2831 maybe_init_pretty_print (file);
2832 dump_generic_bb_buff (&buffer, bb, indent, flags);
2836 /* Dumps header of basic block BB to buffer BUFFER indented by INDENT
2837 spaces and details described by flags. */
2840 dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
2846 if (flags & TDF_BLOCKS)
2849 pp_string (buffer, "# BLOCK ");
2850 pp_decimal_int (buffer, bb->index);
2853 pp_string (buffer, " freq:");
2854 pp_decimal_int (buffer, bb->frequency);
2858 pp_string (buffer, " count:");
2859 pp_widest_integer (buffer, bb->count);
2862 if (flags & TDF_LINENO)
2864 block_stmt_iterator bsi;
2866 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2867 if (get_lineno (bsi_stmt (bsi)) != -1)
2869 pp_string (buffer, ", starting at line ");
2870 pp_decimal_int (buffer, get_lineno (bsi_stmt (bsi)));
2874 newline_and_indent (buffer, indent);
2876 pp_string (buffer, "# PRED:");
2877 pp_write_text_to_stream (buffer);
2878 FOR_EACH_EDGE (e, ei, bb->preds)
2879 if (flags & TDF_SLIM)
2881 pp_string (buffer, " ");
2882 if (e->src == ENTRY_BLOCK_PTR)
2883 pp_string (buffer, "ENTRY");
2885 pp_decimal_int (buffer, e->src->index);
2888 dump_edge_info (buffer->buffer->stream, e, 0);
2889 pp_newline (buffer);
2893 stmt = first_stmt (bb);
2894 if (!stmt || TREE_CODE (stmt) != LABEL_EXPR)
2896 INDENT (indent - 2);
2897 pp_string (buffer, "<bb ");
2898 pp_decimal_int (buffer, bb->index);
2899 pp_string (buffer, ">:");
2900 pp_newline (buffer);
2903 pp_write_text_to_stream (buffer);
2904 check_bb_profile (bb, buffer->buffer->stream);
2907 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
2911 dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
2917 pp_string (buffer, "# SUCC:");
2918 pp_write_text_to_stream (buffer);
2919 FOR_EACH_EDGE (e, ei, bb->succs)
2920 if (flags & TDF_SLIM)
2922 pp_string (buffer, " ");
2923 if (e->dest == EXIT_BLOCK_PTR)
2924 pp_string (buffer, "EXIT");
2926 pp_decimal_int (buffer, e->dest->index);
2929 dump_edge_info (buffer->buffer->stream, e, 1);
2930 pp_newline (buffer);
2933 /* Dump PHI nodes of basic block BB to BUFFER with details described
2934 by FLAGS and indented by INDENT spaces. */
2937 dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags)
2939 tree phi = phi_nodes (bb);
2943 for (; phi; phi = PHI_CHAIN (phi))
2945 if (is_gimple_reg (PHI_RESULT (phi)) || (flags & TDF_VOPS))
2948 pp_string (buffer, "# ");
2949 dump_generic_node (buffer, phi, indent, flags, false);
2950 pp_newline (buffer);
2956 /* Dump jump to basic block BB that is represented implicitly in the cfg
2960 pp_cfg_jump (pretty_printer *buffer, basic_block bb)
2964 stmt = first_stmt (bb);
2966 pp_string (buffer, "goto <bb ");
2967 pp_decimal_int (buffer, bb->index);
2968 pp_string (buffer, ">");
2969 if (stmt && TREE_CODE (stmt) == LABEL_EXPR)
2971 pp_string (buffer, " (");
2972 dump_generic_node (buffer, LABEL_EXPR_LABEL (stmt), 0, 0, false);
2973 pp_string (buffer, ")");
2975 pp_semicolon (buffer);
2978 /* Dump edges represented implicitly in basic block BB to BUFFER, indented
2979 by INDENT spaces, with details given by FLAGS. */
2982 dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent,
2989 stmt = last_stmt (bb);
2990 if (stmt && TREE_CODE (stmt) == COND_EXPR)
2992 edge true_edge, false_edge;
2994 /* When we are emitting the code or changing CFG, it is possible that
2995 the edges are not yet created. When we are using debug_bb in such
2996 a situation, we do not want it to crash. */
2997 if (EDGE_COUNT (bb->succs) != 2)
2999 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
3001 INDENT (indent + 2);
3002 pp_cfg_jump (buffer, true_edge->dest);
3003 newline_and_indent (buffer, indent);
3004 pp_string (buffer, "else");
3005 newline_and_indent (buffer, indent + 2);
3006 pp_cfg_jump (buffer, false_edge->dest);
3007 pp_newline (buffer);
3011 /* If there is a fallthru edge, we may need to add an artificial goto to the
3013 FOR_EACH_EDGE (e, ei, bb->succs)
3014 if (e->flags & EDGE_FALLTHRU)
3016 if (e && e->dest != bb->next_bb)
3020 if ((flags & TDF_LINENO)
3021 #ifdef USE_MAPPED_LOCATION
3022 && e->goto_locus != UNKNOWN_LOCATION
3028 expanded_location goto_xloc;
3029 #ifdef USE_MAPPED_LOCATION
3030 goto_xloc = expand_location (e->goto_locus);
3032 goto_xloc = *e->goto_locus;
3034 pp_character (buffer, '[');
3037 pp_string (buffer, goto_xloc.file);
3038 pp_string (buffer, " : ");
3040 pp_decimal_int (buffer, goto_xloc.line);
3041 pp_string (buffer, "] ");
3044 pp_cfg_jump (buffer, e->dest);
3045 pp_newline (buffer);
3049 /* Dumps basic block BB to buffer BUFFER with details described by FLAGS and
3050 indented by INDENT spaces. */
3053 dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
3054 int indent, int flags)
3056 block_stmt_iterator bsi;
3058 int label_indent = indent - 2;
3060 if (label_indent < 0)
3063 dump_bb_header (buffer, bb, indent, flags);
3065 dump_phi_nodes (buffer, bb, indent, flags);
3067 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3071 stmt = bsi_stmt (bsi);
3073 curr_indent = TREE_CODE (stmt) == LABEL_EXPR ? label_indent : indent;
3075 INDENT (curr_indent);
3076 dump_generic_node (buffer, stmt, curr_indent, flags, true);
3077 pp_newline (buffer);
3078 dump_histograms_for_stmt (cfun, buffer->buffer->stream, stmt);
3081 dump_implicit_edges (buffer, bb, indent, flags);
3083 if (flags & TDF_BLOCKS)
3084 dump_bb_end (buffer, bb, indent, flags);