1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
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"
37 /* Local functions, macros and variables. */
38 static int op_prio (tree);
39 static const char *op_symbol_1 (enum tree_code);
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_CODE_LENGTH (TREE_CODE (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_1 (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.h). If
434 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),
574 pp_string (buffer, "<unnamed type>");
581 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
583 if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
585 tree fnode = TREE_TYPE (node);
587 dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false);
589 pp_character (buffer, '(');
590 pp_string (buffer, str);
591 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
592 dump_decl_name (buffer, TYPE_NAME (node), flags);
594 pp_printf (buffer, "<T%x>", TYPE_UID (node));
596 pp_character (buffer, ')');
597 dump_function_declaration (buffer, fnode, spc, flags);
601 unsigned int quals = TYPE_QUALS (node);
603 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
605 pp_string (buffer, str);
607 if (quals & TYPE_QUAL_CONST)
608 pp_string (buffer, " const");
609 else if (quals & TYPE_QUAL_VOLATILE)
610 pp_string (buffer, "volatile");
611 else if (quals & TYPE_QUAL_RESTRICT)
612 pp_string (buffer, " restrict");
614 if (TYPE_REF_CAN_ALIAS_ALL (node))
615 pp_string (buffer, " {ref-all}");
624 dump_decl_name (buffer, TYPE_NAME (TYPE_METHOD_BASETYPE (node)), flags);
625 pp_string (buffer, "::");
630 const char *sep = "";
633 pp_string (buffer, "MEM[");
635 tmp = TMR_SYMBOL (node);
638 pp_string (buffer, sep);
640 pp_string (buffer, "symbol: ");
641 dump_generic_node (buffer, tmp, spc, flags, false);
643 tmp = TMR_BASE (node);
646 pp_string (buffer, sep);
648 pp_string (buffer, "base: ");
649 dump_generic_node (buffer, tmp, spc, flags, false);
651 tmp = TMR_INDEX (node);
654 pp_string (buffer, sep);
656 pp_string (buffer, "index: ");
657 dump_generic_node (buffer, tmp, spc, flags, false);
659 tmp = TMR_STEP (node);
662 pp_string (buffer, sep);
664 pp_string (buffer, "step: ");
665 dump_generic_node (buffer, tmp, spc, flags, false);
667 tmp = TMR_OFFSET (node);
670 pp_string (buffer, sep);
672 pp_string (buffer, "offset: ");
673 dump_generic_node (buffer, tmp, spc, flags, false);
675 pp_string (buffer, "]");
676 if (flags & TDF_DETAILS)
678 pp_string (buffer, "{");
679 dump_generic_node (buffer, TMR_ORIGINAL (node), spc, flags,
681 pp_string (buffer, "}");
690 /* Print the innermost component type. */
691 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
692 tmp = TREE_TYPE (tmp))
694 dump_generic_node (buffer, tmp, spc, flags, false);
696 /* Print the dimensions. */
697 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
698 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
704 case QUAL_UNION_TYPE:
705 /* Print the name of the structure. */
706 if (TREE_CODE (node) == RECORD_TYPE)
707 pp_string (buffer, "struct ");
708 else if (TREE_CODE (node) == UNION_TYPE)
709 pp_string (buffer, "union ");
711 if (TYPE_NAME (node))
712 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
714 print_struct_decl (buffer, node, spc, flags);
722 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
724 /* In the case of a pointer, one may want to divide by the
725 size of the pointed-to type. Unfortunately, this not
726 straightforward. The C front-end maps expressions
731 in such a way that the two INTEGER_CST nodes for "5" have
732 different values but identical types. In the latter
733 case, the 5 is multiplied by sizeof (int) in c-common.c
734 (pointer_int_sum) to convert it to a byte address, and
735 yet the type of the node is left unchanged. Argh. What
736 is consistent though is that the number value corresponds
737 to bytes (UNITS) offset.
739 NB: Neither of the following divisors can be trivially
740 used to recover the original literal:
742 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
743 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
744 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
745 pp_string (buffer, "B"); /* pseudo-unit */
747 else if (! host_integerp (node, 0))
751 if (tree_int_cst_sgn (val) < 0)
753 pp_character (buffer, '-');
754 val = build_int_cst_wide (NULL_TREE,
755 -TREE_INT_CST_LOW (val),
756 ~TREE_INT_CST_HIGH (val)
757 + !TREE_INT_CST_LOW (val));
759 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
762 sprintf (pp_buffer (buffer)->digit_buffer, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
763 TREE_INT_CST_HIGH (val),
764 TREE_INT_CST_LOW (val));
765 pp_string (buffer, pp_buffer (buffer)->digit_buffer);
769 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
773 /* Code copied from print_node. */
776 if (TREE_OVERFLOW (node))
777 pp_string (buffer, " overflow");
779 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
780 d = TREE_REAL_CST (node);
781 if (REAL_VALUE_ISINF (d))
782 pp_string (buffer, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
783 else if (REAL_VALUE_ISNAN (d))
784 pp_string (buffer, " Nan");
788 real_to_decimal (string, &d, sizeof (string), 0, 1);
789 pp_string (buffer, string);
794 unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
795 pp_string (buffer, "0x");
796 for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
797 output_formatted_integer (buffer, "%02x", *p++);
804 pp_string (buffer, "__complex__ (");
805 dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
806 pp_string (buffer, ", ");
807 dump_generic_node (buffer, TREE_IMAGPART (node), spc, flags, false);
808 pp_string (buffer, ")");
812 pp_string (buffer, "\"");
813 pretty_print_string (buffer, TREE_STRING_POINTER (node));
814 pp_string (buffer, "\"");
820 pp_string (buffer, "{ ");
821 for (elt = TREE_VECTOR_CST_ELTS (node); elt; elt = TREE_CHAIN (elt))
823 dump_generic_node (buffer, TREE_VALUE (elt), spc, flags, false);
824 if (TREE_CHAIN (elt))
825 pp_string (buffer, ", ");
827 pp_string (buffer, " }");
836 dump_decl_name (buffer, node, flags);
840 if (DECL_NAME (node))
841 dump_decl_name (buffer, node, flags);
842 else if (LABEL_DECL_UID (node) != -1)
843 pp_printf (buffer, "<L" HOST_WIDE_INT_PRINT_DEC ">",
844 LABEL_DECL_UID (node));
846 pp_printf (buffer, "<D%u>", DECL_UID (node));
850 if (DECL_IS_BUILTIN (node))
852 /* Don't print the declaration of built-in types. */
855 if (DECL_NAME (node))
856 dump_decl_name (buffer, node, flags);
859 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
860 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
861 && TYPE_METHODS (TREE_TYPE (node)))
863 /* The type is a c++ class: all structures have at least
865 pp_string (buffer, "class ");
866 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
871 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
872 ? "union" : "struct "));
873 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
878 case SYMBOL_MEMORY_TAG:
879 case NAME_MEMORY_TAG:
880 case STRUCT_FIELD_TAG:
885 case MEMORY_PARTITION_TAG:
886 dump_decl_name (buffer, node, flags);
890 pp_string (buffer, "<retval>");
894 op0 = TREE_OPERAND (node, 0);
896 if (TREE_CODE (op0) == INDIRECT_REF)
898 op0 = TREE_OPERAND (op0, 0);
901 if (op_prio (op0) < op_prio (node))
902 pp_character (buffer, '(');
903 dump_generic_node (buffer, op0, spc, flags, false);
904 if (op_prio (op0) < op_prio (node))
905 pp_character (buffer, ')');
906 pp_string (buffer, str);
907 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
909 if (TREE_CODE (op0) != VALUE_HANDLE)
911 op0 = component_ref_field_offset (node);
912 if (op0 && TREE_CODE (op0) != INTEGER_CST)
914 pp_string (buffer, "{off: ");
915 dump_generic_node (buffer, op0, spc, flags, false);
916 pp_character (buffer, '}');
922 pp_string (buffer, "BIT_FIELD_REF <");
923 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
924 pp_string (buffer, ", ");
925 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
926 pp_string (buffer, ", ");
927 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
928 pp_string (buffer, ">");
932 case ARRAY_RANGE_REF:
933 op0 = TREE_OPERAND (node, 0);
934 if (op_prio (op0) < op_prio (node))
935 pp_character (buffer, '(');
936 dump_generic_node (buffer, op0, spc, flags, false);
937 if (op_prio (op0) < op_prio (node))
938 pp_character (buffer, ')');
939 pp_character (buffer, '[');
940 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
941 if (TREE_CODE (node) == ARRAY_RANGE_REF)
942 pp_string (buffer, " ...");
943 pp_character (buffer, ']');
945 op0 = array_ref_low_bound (node);
946 op1 = array_ref_element_size (node);
948 if (!integer_zerop (op0)
949 || (TYPE_SIZE_UNIT (TREE_TYPE (node))
950 && !operand_equal_p (op1, TYPE_SIZE_UNIT (TREE_TYPE (node)), 0)))
952 pp_string (buffer, "{lb: ");
953 dump_generic_node (buffer, op0, spc, flags, false);
954 pp_string (buffer, " sz: ");
955 dump_generic_node (buffer, op1, spc, flags, false);
956 pp_character (buffer, '}');
962 unsigned HOST_WIDE_INT ix;
964 bool is_struct_init = FALSE;
965 pp_character (buffer, '{');
966 if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
967 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
968 is_struct_init = TRUE;
969 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
971 if (field && is_struct_init)
973 pp_character (buffer, '.');
974 dump_generic_node (buffer, field, spc, flags, false);
975 pp_string (buffer, "=");
977 if (val && TREE_CODE (val) == ADDR_EXPR)
978 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
979 val = TREE_OPERAND (val, 0);
980 if (val && TREE_CODE (val) == FUNCTION_DECL)
981 dump_decl_name (buffer, val, flags);
983 dump_generic_node (buffer, val, spc, flags, false);
984 if (ix != VEC_length (constructor_elt, CONSTRUCTOR_ELTS (node)) - 1)
986 pp_character (buffer, ',');
990 pp_character (buffer, '}');
997 if (flags & TDF_SLIM)
999 pp_string (buffer, "<COMPOUND_EXPR>");
1003 dump_generic_node (buffer, TREE_OPERAND (node, 0),
1004 spc, flags, !(flags & TDF_SLIM));
1005 if (flags & TDF_SLIM)
1006 newline_and_indent (buffer, spc);
1009 pp_character (buffer, ',');
1013 for (tp = &TREE_OPERAND (node, 1);
1014 TREE_CODE (*tp) == COMPOUND_EXPR;
1015 tp = &TREE_OPERAND (*tp, 1))
1017 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
1018 spc, flags, !(flags & TDF_SLIM));
1019 if (flags & TDF_SLIM)
1020 newline_and_indent (buffer, spc);
1023 pp_character (buffer, ',');
1028 dump_generic_node (buffer, *tp, spc, flags, !(flags & TDF_SLIM));
1032 case STATEMENT_LIST:
1034 tree_stmt_iterator si;
1037 if (flags & TDF_SLIM)
1039 pp_string (buffer, "<STATEMENT_LIST>");
1043 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
1046 newline_and_indent (buffer, spc);
1049 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
1055 case GIMPLE_MODIFY_STMT:
1057 dump_generic_node (buffer, GENERIC_TREE_OPERAND (node, 0), spc, flags,
1060 pp_character (buffer, '=');
1062 dump_generic_node (buffer, GENERIC_TREE_OPERAND (node, 1), spc, flags,
1067 pp_string (buffer, "TARGET_EXPR <");
1068 dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false);
1069 pp_character (buffer, ',');
1071 dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false);
1072 pp_character (buffer, '>');
1076 print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags);
1081 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
1083 pp_string (buffer, "if (");
1084 dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false);
1085 pp_character (buffer, ')');
1086 /* The lowered cond_exprs should always be printed in full. */
1087 if (COND_EXPR_THEN (node)
1088 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
1089 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
1090 && COND_EXPR_ELSE (node)
1091 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
1092 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
1095 dump_generic_node (buffer, COND_EXPR_THEN (node), 0, flags, true);
1096 pp_string (buffer, " else ");
1097 dump_generic_node (buffer, COND_EXPR_ELSE (node), 0, flags, true);
1099 else if (!(flags & TDF_SLIM))
1101 /* Output COND_EXPR_THEN. */
1102 if (COND_EXPR_THEN (node))
1104 newline_and_indent (buffer, spc+2);
1105 pp_character (buffer, '{');
1106 newline_and_indent (buffer, spc+4);
1107 dump_generic_node (buffer, COND_EXPR_THEN (node), spc+4,
1109 newline_and_indent (buffer, spc+2);
1110 pp_character (buffer, '}');
1113 /* Output COND_EXPR_ELSE. */
1114 if (COND_EXPR_ELSE (node))
1116 newline_and_indent (buffer, spc);
1117 pp_string (buffer, "else");
1118 newline_and_indent (buffer, spc+2);
1119 pp_character (buffer, '{');
1120 newline_and_indent (buffer, spc+4);
1121 dump_generic_node (buffer, COND_EXPR_ELSE (node), spc+4,
1123 newline_and_indent (buffer, spc+2);
1124 pp_character (buffer, '}');
1131 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1133 pp_character (buffer, '?');
1135 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1137 pp_character (buffer, ':');
1139 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1144 pp_character (buffer, '{');
1145 if (!(flags & TDF_SLIM))
1147 if (BIND_EXPR_VARS (node))
1149 pp_newline (buffer);
1151 for (op0 = BIND_EXPR_VARS (node); op0; op0 = TREE_CHAIN (op0))
1153 print_declaration (buffer, op0, spc+2, flags);
1154 pp_newline (buffer);
1158 newline_and_indent (buffer, spc+2);
1159 dump_generic_node (buffer, BIND_EXPR_BODY (node), spc+2, flags, true);
1160 newline_and_indent (buffer, spc);
1161 pp_character (buffer, '}');
1167 print_call_name (buffer, node);
1169 /* Print parameters. */
1171 pp_character (buffer, '(');
1172 op1 = TREE_OPERAND (node, 1);
1174 dump_generic_node (buffer, op1, spc, flags, false);
1175 pp_character (buffer, ')');
1177 op1 = TREE_OPERAND (node, 2);
1180 pp_string (buffer, " [static-chain: ");
1181 dump_generic_node (buffer, op1, spc, flags, false);
1182 pp_character (buffer, ']');
1185 if (CALL_EXPR_RETURN_SLOT_OPT (node))
1186 pp_string (buffer, " [return slot optimization]");
1187 if (CALL_EXPR_TAILCALL (node))
1188 pp_string (buffer, " [tail call]");
1191 case WITH_CLEANUP_EXPR:
1195 case CLEANUP_POINT_EXPR:
1196 pp_string (buffer, "<<cleanup_point ");
1197 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1198 pp_string (buffer, ">>");
1201 case PLACEHOLDER_EXPR:
1202 pp_string (buffer, "<PLACEHOLDER_EXPR ");
1203 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1204 pp_character (buffer, '>');
1207 /* Binary arithmetic and logic expressions. */
1208 case WIDEN_SUM_EXPR:
1209 case WIDEN_MULT_EXPR:
1213 case TRUNC_DIV_EXPR:
1215 case FLOOR_DIV_EXPR:
1216 case ROUND_DIV_EXPR:
1217 case TRUNC_MOD_EXPR:
1219 case FLOOR_MOD_EXPR:
1220 case ROUND_MOD_EXPR:
1222 case EXACT_DIV_EXPR:
1227 case VEC_LSHIFT_EXPR:
1228 case VEC_RSHIFT_EXPR:
1232 case TRUTH_ANDIF_EXPR:
1233 case TRUTH_ORIF_EXPR:
1234 case TRUTH_AND_EXPR:
1236 case TRUTH_XOR_EXPR:
1250 case UNORDERED_EXPR:
1252 const char *op = op_symbol (node);
1253 op0 = TREE_OPERAND (node, 0);
1254 op1 = TREE_OPERAND (node, 1);
1256 /* When the operands are expressions with less priority,
1257 keep semantics of the tree representation. */
1258 if (op_prio (op0) < op_prio (node))
1260 pp_character (buffer, '(');
1261 dump_generic_node (buffer, op0, spc, flags, false);
1262 pp_character (buffer, ')');
1265 dump_generic_node (buffer, op0, spc, flags, false);
1268 pp_string (buffer, op);
1271 /* When the operands are expressions with less priority,
1272 keep semantics of the tree representation. */
1273 if (op_prio (op1) < op_prio (node))
1275 pp_character (buffer, '(');
1276 dump_generic_node (buffer, op1, spc, flags, false);
1277 pp_character (buffer, ')');
1280 dump_generic_node (buffer, op1, spc, flags, false);
1284 /* Unary arithmetic and logic expressions. */
1287 case TRUTH_NOT_EXPR:
1289 case PREDECREMENT_EXPR:
1290 case PREINCREMENT_EXPR:
1291 case ALIGN_INDIRECT_REF:
1292 case MISALIGNED_INDIRECT_REF:
1294 if (TREE_CODE (node) == ADDR_EXPR
1295 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
1296 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
1297 ; /* Do not output '&' for strings and function pointers. */
1299 pp_string (buffer, op_symbol (node));
1301 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1303 pp_character (buffer, '(');
1304 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1305 pp_character (buffer, ')');
1308 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1310 if (TREE_CODE (node) == MISALIGNED_INDIRECT_REF)
1312 pp_string (buffer, "{misalignment: ");
1313 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1314 pp_character (buffer, '}');
1318 case POSTDECREMENT_EXPR:
1319 case POSTINCREMENT_EXPR:
1320 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1322 pp_character (buffer, '(');
1323 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1324 pp_character (buffer, ')');
1327 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1328 pp_string (buffer, op_symbol (node));
1332 pp_string (buffer, "MIN_EXPR <");
1333 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1334 pp_string (buffer, ", ");
1335 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1336 pp_character (buffer, '>');
1340 pp_string (buffer, "MAX_EXPR <");
1341 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1342 pp_string (buffer, ", ");
1343 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1344 pp_character (buffer, '>');
1348 pp_string (buffer, "ABS_EXPR <");
1349 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1350 pp_character (buffer, '>');
1357 case FIX_TRUNC_EXPR:
1361 type = TREE_TYPE (node);
1362 op0 = TREE_OPERAND (node, 0);
1363 if (type != TREE_TYPE (op0))
1365 pp_character (buffer, '(');
1366 dump_generic_node (buffer, type, spc, flags, false);
1367 pp_string (buffer, ") ");
1369 if (op_prio (op0) < op_prio (node))
1370 pp_character (buffer, '(');
1371 dump_generic_node (buffer, op0, spc, flags, false);
1372 if (op_prio (op0) < op_prio (node))
1373 pp_character (buffer, ')');
1376 case VIEW_CONVERT_EXPR:
1377 pp_string (buffer, "VIEW_CONVERT_EXPR<");
1378 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1379 pp_string (buffer, ">(");
1380 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1381 pp_character (buffer, ')');
1384 case NON_LVALUE_EXPR:
1385 pp_string (buffer, "NON_LVALUE_EXPR <");
1386 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1387 pp_character (buffer, '>');
1391 pp_string (buffer, "SAVE_EXPR <");
1392 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1393 pp_character (buffer, '>');
1397 pp_string (buffer, "COMPLEX_EXPR <");
1398 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1399 pp_string (buffer, ", ");
1400 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1401 pp_string (buffer, ">");
1405 pp_string (buffer, "CONJ_EXPR <");
1406 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1407 pp_string (buffer, ">");
1411 pp_string (buffer, "REALPART_EXPR <");
1412 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1413 pp_string (buffer, ">");
1417 pp_string (buffer, "IMAGPART_EXPR <");
1418 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1419 pp_string (buffer, ">");
1423 pp_string (buffer, "VA_ARG_EXPR <");
1424 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1425 pp_string (buffer, ">");
1428 case TRY_FINALLY_EXPR:
1429 case TRY_CATCH_EXPR:
1430 pp_string (buffer, "try");
1431 newline_and_indent (buffer, spc+2);
1432 pp_string (buffer, "{");
1433 newline_and_indent (buffer, spc+4);
1434 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc+4, flags, true);
1435 newline_and_indent (buffer, spc+2);
1436 pp_string (buffer, "}");
1437 newline_and_indent (buffer, spc);
1439 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
1440 newline_and_indent (buffer, spc+2);
1441 pp_string (buffer, "{");
1442 newline_and_indent (buffer, spc+4);
1443 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
1444 newline_and_indent (buffer, spc+2);
1445 pp_string (buffer, "}");
1450 pp_string (buffer, "catch (");
1451 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
1452 pp_string (buffer, ")");
1453 newline_and_indent (buffer, spc+2);
1454 pp_string (buffer, "{");
1455 newline_and_indent (buffer, spc+4);
1456 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
1457 newline_and_indent (buffer, spc+2);
1458 pp_string (buffer, "}");
1462 case EH_FILTER_EXPR:
1463 pp_string (buffer, "<<<eh_filter (");
1464 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
1465 pp_string (buffer, ")>>>");
1466 newline_and_indent (buffer, spc+2);
1467 pp_string (buffer, "{");
1468 newline_and_indent (buffer, spc+4);
1469 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
1470 newline_and_indent (buffer, spc+2);
1471 pp_string (buffer, "}");
1476 op0 = TREE_OPERAND (node, 0);
1477 /* If this is for break or continue, don't bother printing it. */
1478 if (DECL_NAME (op0))
1480 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1481 if (strcmp (name, "break") == 0
1482 || strcmp (name, "continue") == 0)
1485 dump_generic_node (buffer, op0, spc, flags, false);
1486 pp_character (buffer, ':');
1487 if (DECL_NONLOCAL (op0))
1488 pp_string (buffer, " [non-local]");
1492 pp_string (buffer, "<<<exception object>>>");
1496 pp_string (buffer, "<<<filter object>>>");
1500 pp_string (buffer, "while (1)");
1501 if (!(flags & TDF_SLIM))
1503 newline_and_indent (buffer, spc+2);
1504 pp_character (buffer, '{');
1505 newline_and_indent (buffer, spc+4);
1506 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
1507 newline_and_indent (buffer, spc+2);
1508 pp_character (buffer, '}');
1514 pp_string (buffer, "return");
1515 op0 = TREE_OPERAND (node, 0);
1519 if (TREE_CODE (op0) == MODIFY_EXPR
1520 || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
1521 dump_generic_node (buffer, GENERIC_TREE_OPERAND (op0, 1),
1524 dump_generic_node (buffer, op0, spc, flags, false);
1529 pp_string (buffer, "if (");
1530 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1531 pp_string (buffer, ") break");
1535 pp_string (buffer, "switch (");
1536 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
1537 pp_character (buffer, ')');
1538 if (!(flags & TDF_SLIM))
1540 newline_and_indent (buffer, spc+2);
1541 pp_character (buffer, '{');
1542 if (SWITCH_BODY (node))
1544 newline_and_indent (buffer, spc+4);
1545 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags,
1550 tree vec = SWITCH_LABELS (node);
1551 size_t i, n = TREE_VEC_LENGTH (vec);
1552 for (i = 0; i < n; ++i)
1554 tree elt = TREE_VEC_ELT (vec, i);
1555 newline_and_indent (buffer, spc+4);
1558 dump_generic_node (buffer, elt, spc+4, flags, false);
1559 pp_string (buffer, " goto ");
1560 dump_generic_node (buffer, CASE_LABEL (elt), spc+4,
1562 pp_semicolon (buffer);
1565 pp_string (buffer, "case ???: goto ???;");
1568 newline_and_indent (buffer, spc+2);
1569 pp_character (buffer, '}');
1575 op0 = GOTO_DESTINATION (node);
1576 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
1578 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1579 if (strcmp (name, "break") == 0
1580 || strcmp (name, "continue") == 0)
1582 pp_string (buffer, name);
1586 pp_string (buffer, "goto ");
1587 dump_generic_node (buffer, op0, spc, flags, false);
1591 pp_string (buffer, "resx ");
1592 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1596 pp_string (buffer, "__asm__");
1597 if (ASM_VOLATILE_P (node))
1598 pp_string (buffer, " __volatile__");
1599 pp_character (buffer, '(');
1600 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
1601 pp_character (buffer, ':');
1602 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
1603 pp_character (buffer, ':');
1604 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
1605 if (ASM_CLOBBERS (node))
1607 pp_character (buffer, ':');
1608 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
1610 pp_string (buffer, ")");
1613 case CASE_LABEL_EXPR:
1614 if (CASE_LOW (node) && CASE_HIGH (node))
1616 pp_string (buffer, "case ");
1617 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1618 pp_string (buffer, " ... ");
1619 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
1621 else if (CASE_LOW (node))
1623 pp_string (buffer, "case ");
1624 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1627 pp_string (buffer, "default ");
1628 pp_character (buffer, ':');
1632 pp_string (buffer, "OBJ_TYPE_REF(");
1633 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
1634 pp_character (buffer, ';');
1635 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
1636 pp_character (buffer, '-');
1637 pp_character (buffer, '>');
1638 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
1639 pp_character (buffer, ')');
1646 dump_generic_node (buffer, PHI_RESULT (node), spc, flags, false);
1647 pp_string (buffer, " = PHI <");
1648 for (i = 0; i < PHI_NUM_ARGS (node); i++)
1650 dump_generic_node (buffer, PHI_ARG_DEF (node, i), spc, flags, false);
1651 pp_string (buffer, "(");
1652 pp_decimal_int (buffer, PHI_ARG_EDGE (node, i)->src->index);
1653 pp_string (buffer, ")");
1654 if (i < PHI_NUM_ARGS (node) - 1)
1655 pp_string (buffer, ", ");
1657 pp_string (buffer, ">");
1659 if (stmt_references_memory_p (node) && (flags & TDF_MEMSYMS))
1660 dump_symbols (buffer, STORED_SYMS (node), flags);
1665 dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
1666 pp_string (buffer, "_");
1667 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
1668 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
1669 pp_string (buffer, "(ab)");
1670 else if (SSA_NAME_IS_DEFAULT_DEF (node))
1671 pp_string (buffer, "(D)");
1674 case WITH_SIZE_EXPR:
1675 pp_string (buffer, "WITH_SIZE_EXPR <");
1676 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1677 pp_string (buffer, ", ");
1678 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1679 pp_string (buffer, ">");
1683 pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node));
1687 pp_string (buffer, "ASSERT_EXPR <");
1688 dump_generic_node (buffer, ASSERT_EXPR_VAR (node), spc, flags, false);
1689 pp_string (buffer, ", ");
1690 dump_generic_node (buffer, ASSERT_EXPR_COND (node), spc, flags, false);
1691 pp_string (buffer, ">");
1695 pp_string (buffer, "scev_known");
1698 case SCEV_NOT_KNOWN:
1699 pp_string (buffer, "scev_not_known");
1702 case POLYNOMIAL_CHREC:
1703 pp_string (buffer, "{");
1704 dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
1705 pp_string (buffer, ", +, ");
1706 dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
1707 pp_string (buffer, "}_");
1708 dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
1712 case REALIGN_LOAD_EXPR:
1713 pp_string (buffer, "REALIGN_LOAD <");
1714 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1715 pp_string (buffer, ", ");
1716 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1717 pp_string (buffer, ", ");
1718 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1719 pp_string (buffer, ">");
1723 pp_string (buffer, " VEC_COND_EXPR < ");
1724 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1725 pp_string (buffer, " , ");
1726 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1727 pp_string (buffer, " , ");
1728 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1729 pp_string (buffer, " > ");
1733 pp_string (buffer, " DOT_PROD_EXPR < ");
1734 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1735 pp_string (buffer, ", ");
1736 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1737 pp_string (buffer, ", ");
1738 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1739 pp_string (buffer, " > ");
1743 pp_string (buffer, "#pragma omp parallel");
1744 dump_omp_clauses (buffer, OMP_PARALLEL_CLAUSES (node), spc, flags);
1745 if (OMP_PARALLEL_FN (node))
1747 pp_string (buffer, " [child fn: ");
1748 dump_generic_node (buffer, OMP_PARALLEL_FN (node), spc, flags, false);
1750 pp_string (buffer, " (");
1752 if (OMP_PARALLEL_DATA_ARG (node))
1753 dump_generic_node (buffer, OMP_PARALLEL_DATA_ARG (node), spc, flags,
1756 pp_string (buffer, "???");
1758 pp_string (buffer, ")]");
1762 if (!(flags & TDF_SLIM) && OMP_BODY (node))
1764 newline_and_indent (buffer, spc + 2);
1765 pp_character (buffer, '{');
1766 newline_and_indent (buffer, spc + 4);
1767 dump_generic_node (buffer, OMP_BODY (node), spc + 4, flags, false);
1768 newline_and_indent (buffer, spc + 2);
1769 pp_character (buffer, '}');
1775 pp_string (buffer, "#pragma omp for");
1776 dump_omp_clauses (buffer, OMP_FOR_CLAUSES (node), spc, flags);
1778 if (!(flags & TDF_SLIM))
1780 if (OMP_FOR_PRE_BODY (node))
1782 newline_and_indent (buffer, spc + 2);
1783 pp_character (buffer, '{');
1785 newline_and_indent (buffer, spc);
1786 dump_generic_node (buffer, OMP_FOR_PRE_BODY (node),
1789 newline_and_indent (buffer, spc);
1790 pp_string (buffer, "for (");
1791 dump_generic_node (buffer, OMP_FOR_INIT (node), spc, flags, false);
1792 pp_string (buffer, "; ");
1793 dump_generic_node (buffer, OMP_FOR_COND (node), spc, flags, false);
1794 pp_string (buffer, "; ");
1795 dump_generic_node (buffer, OMP_FOR_INCR (node), spc, flags, false);
1796 pp_string (buffer, ")");
1797 if (OMP_FOR_BODY (node))
1799 newline_and_indent (buffer, spc + 2);
1800 pp_character (buffer, '{');
1801 newline_and_indent (buffer, spc + 4);
1802 dump_generic_node (buffer, OMP_FOR_BODY (node), spc + 4, flags,
1804 newline_and_indent (buffer, spc + 2);
1805 pp_character (buffer, '}');
1807 if (OMP_FOR_PRE_BODY (node))
1810 newline_and_indent (buffer, spc + 2);
1811 pp_character (buffer, '}');
1818 pp_string (buffer, "#pragma omp sections");
1819 dump_omp_clauses (buffer, OMP_SECTIONS_CLAUSES (node), spc, flags);
1823 pp_string (buffer, "#pragma omp section");
1827 pp_string (buffer, "#pragma omp master");
1831 pp_string (buffer, "#pragma omp ordered");
1835 pp_string (buffer, "#pragma omp critical");
1836 if (OMP_CRITICAL_NAME (node))
1839 pp_character (buffer, '(');
1840 dump_generic_node (buffer, OMP_CRITICAL_NAME (node), spc,
1842 pp_character (buffer, ')');
1847 pp_string (buffer, "#pragma omp atomic");
1848 newline_and_indent (buffer, spc + 2);
1849 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1851 pp_character (buffer, '=');
1853 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1857 pp_string (buffer, "#pragma omp single");
1858 dump_omp_clauses (buffer, OMP_SINGLE_CLAUSES (node), spc, flags);
1862 pp_string (buffer, "OMP_RETURN");
1863 if (OMP_RETURN_NOWAIT (node))
1864 pp_string (buffer, " [nowait]");
1869 pp_string (buffer, "OMP_CONTINUE");
1874 dump_omp_clause (buffer, node, spc, flags);
1878 case REDUC_MAX_EXPR:
1879 pp_string (buffer, " REDUC_MAX_EXPR < ");
1880 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1881 pp_string (buffer, " > ");
1884 case REDUC_MIN_EXPR:
1885 pp_string (buffer, " REDUC_MIN_EXPR < ");
1886 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1887 pp_string (buffer, " > ");
1890 case REDUC_PLUS_EXPR:
1891 pp_string (buffer, " REDUC_PLUS_EXPR < ");
1892 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1893 pp_string (buffer, " > ");
1896 case VEC_WIDEN_MULT_HI_EXPR:
1897 pp_string (buffer, " VEC_WIDEN_MULT_HI_EXPR < ");
1898 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1899 pp_string (buffer, ", ");
1900 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1901 pp_string (buffer, " > ");
1904 case VEC_WIDEN_MULT_LO_EXPR:
1905 pp_string (buffer, " VEC_WIDEN_MULT_LO_EXPR < ");
1906 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1907 pp_string (buffer, ", ");
1908 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1909 pp_string (buffer, " > ");
1912 case VEC_UNPACK_HI_EXPR:
1913 pp_string (buffer, " VEC_UNPACK_HI_EXPR < ");
1914 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1915 pp_string (buffer, " > ");
1918 case VEC_UNPACK_LO_EXPR:
1919 pp_string (buffer, " VEC_UNPACK_LO_EXPR < ");
1920 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1921 pp_string (buffer, " > ");
1924 case VEC_PACK_MOD_EXPR:
1925 pp_string (buffer, " VEC_PACK_MOD_EXPR < ");
1926 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1927 pp_string (buffer, ", ");
1928 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1929 pp_string (buffer, " > ");
1932 case VEC_PACK_SAT_EXPR:
1933 pp_string (buffer, " VEC_PACK_SAT_EXPR < ");
1934 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1935 pp_string (buffer, ", ");
1936 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1937 pp_string (buffer, " > ");
1943 pp_string (buffer, "BLOCK");
1945 if (BLOCK_ABSTRACT (node))
1946 pp_string (buffer, " [abstract]");
1948 if (TREE_ASM_WRITTEN (node))
1949 pp_string (buffer, " [written]");
1951 newline_and_indent (buffer, spc + 2);
1953 if (BLOCK_SUPERCONTEXT (node))
1955 pp_string (buffer, "SUPERCONTEXT: ");
1956 if (TREE_CODE (BLOCK_SUPERCONTEXT (node)) == BLOCK)
1957 pp_printf (buffer, "BLOCK %p",
1958 (void *)BLOCK_SUPERCONTEXT (node));
1960 dump_generic_node (buffer, BLOCK_SUPERCONTEXT (node), 0, flags,
1962 newline_and_indent (buffer, spc + 2);
1965 if (BLOCK_SUBBLOCKS (node))
1967 pp_string (buffer, "SUBBLOCKS: ");
1968 for (t = BLOCK_SUBBLOCKS (node); t; t = BLOCK_CHAIN (t))
1969 pp_printf (buffer, "%p ", (void *)t);
1970 newline_and_indent (buffer, spc + 2);
1973 if (BLOCK_VARS (node))
1975 pp_string (buffer, "VARS: ");
1976 for (t = BLOCK_VARS (node); t; t = TREE_CHAIN (t))
1978 dump_generic_node (buffer, t, 0, flags, false);
1979 pp_string (buffer, " ");
1981 newline_and_indent (buffer, spc + 2);
1984 if (BLOCK_ABSTRACT_ORIGIN (node))
1986 pp_string (buffer, "ABSTRACT_ORIGIN: ");
1987 if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node)) == BLOCK)
1988 pp_printf (buffer, "BLOCK %p",
1989 (void *)BLOCK_ABSTRACT_ORIGIN (node));
1991 dump_generic_node (buffer, BLOCK_ABSTRACT_ORIGIN (node), 0, flags,
1993 newline_and_indent (buffer, spc + 2);
1998 case VEC_EXTRACT_EVEN_EXPR:
1999 pp_string (buffer, " VEC_EXTRACT_EVEN_EXPR < ");
2000 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2001 pp_string (buffer, ", ");
2002 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2003 pp_string (buffer, " > ");
2006 case VEC_EXTRACT_ODD_EXPR:
2007 pp_string (buffer, " VEC_EXTRACT_ODD_EXPR < ");
2008 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2009 pp_string (buffer, ", ");
2010 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2011 pp_string (buffer, " > ");
2014 case VEC_INTERLEAVE_HIGH_EXPR:
2015 pp_string (buffer, " VEC_INTERLEAVE_HIGH_EXPR < ");
2016 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2017 pp_string (buffer, ", ");
2018 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2019 pp_string (buffer, " > ");
2022 case VEC_INTERLEAVE_LOW_EXPR:
2023 pp_string (buffer, " VEC_INTERLEAVE_LOW_EXPR < ");
2024 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2025 pp_string (buffer, ", ");
2026 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2027 pp_string (buffer, " > ");
2034 if (is_stmt && is_expr)
2035 pp_semicolon (buffer);
2036 pp_write_text_to_stream (buffer);
2041 /* Print the declaration of a variable. */
2044 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
2048 if (TREE_CODE (t) == TYPE_DECL)
2049 pp_string (buffer, "typedef ");
2051 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
2052 pp_string (buffer, "register ");
2054 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
2055 pp_string (buffer, "extern ");
2056 else if (TREE_STATIC (t))
2057 pp_string (buffer, "static ");
2059 /* Print the type and name. */
2060 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
2064 /* Print array's type. */
2065 tmp = TREE_TYPE (t);
2066 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
2067 tmp = TREE_TYPE (tmp);
2068 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
2070 /* Print variable's name. */
2072 dump_generic_node (buffer, t, spc, flags, false);
2074 /* Print the dimensions. */
2075 tmp = TREE_TYPE (t);
2076 while (TREE_CODE (tmp) == ARRAY_TYPE)
2078 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
2079 tmp = TREE_TYPE (tmp);
2082 else if (TREE_CODE (t) == FUNCTION_DECL)
2084 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
2086 dump_decl_name (buffer, t, flags);
2087 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
2091 /* Print type declaration. */
2092 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
2094 /* Print variable's name. */
2096 dump_generic_node (buffer, t, spc, flags, false);
2099 if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
2101 pp_string (buffer, " __asm__ ");
2102 pp_character (buffer, '(');
2103 dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
2104 pp_character (buffer, ')');
2107 /* The initial value of a function serves to determine wether the function
2108 is declared or defined. So the following does not apply to function
2110 if (TREE_CODE (t) != FUNCTION_DECL)
2112 /* Print the initial value. */
2113 if (DECL_INITIAL (t))
2116 pp_character (buffer, '=');
2118 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
2122 if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
2124 pp_string (buffer, " [value-expr: ");
2125 dump_generic_node (buffer, DECL_VALUE_EXPR (t), spc, flags, false);
2126 pp_character (buffer, ']');
2129 pp_character (buffer, ';');
2133 /* Prints a structure: name, fields, and methods.
2134 FIXME: Still incomplete. */
2137 print_struct_decl (pretty_printer *buffer, tree node, int spc, int flags)
2139 /* Print the name of the structure. */
2140 if (TYPE_NAME (node))
2143 if (TREE_CODE (node) == RECORD_TYPE)
2144 pp_string (buffer, "struct ");
2145 else if ((TREE_CODE (node) == UNION_TYPE
2146 || TREE_CODE (node) == QUAL_UNION_TYPE))
2147 pp_string (buffer, "union ");
2149 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
2152 /* Print the contents of the structure. */
2153 pp_newline (buffer);
2155 pp_character (buffer, '{');
2156 pp_newline (buffer);
2158 /* Print the fields of the structure. */
2161 tmp = TYPE_FIELDS (node);
2164 /* Avoid to print recursively the structure. */
2165 /* FIXME : Not implemented correctly...,
2166 what about the case when we have a cycle in the contain graph? ...
2167 Maybe this could be solved by looking at the scope in which the
2168 structure was declared. */
2169 if (TREE_TYPE (tmp) != node
2170 || (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
2171 && TREE_TYPE (TREE_TYPE (tmp)) != node))
2173 print_declaration (buffer, tmp, spc+2, flags);
2174 pp_newline (buffer);
2176 tmp = TREE_CHAIN (tmp);
2180 pp_character (buffer, '}');
2183 /* Return the priority of the operator OP.
2185 From lowest to highest precedence with either left-to-right (L-R)
2186 or right-to-left (R-L) associativity]:
2189 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2201 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2202 15 [L-R] fn() [] -> .
2204 unary +, - and * have higher precedence than the corresponding binary
2213 switch (TREE_CODE (op))
2221 case GIMPLE_MODIFY_STMT:
2229 case TRUTH_ORIF_EXPR:
2232 case TRUTH_AND_EXPR:
2233 case TRUTH_ANDIF_EXPR:
2240 case TRUTH_XOR_EXPR:
2257 case UNORDERED_EXPR:
2270 case WIDEN_SUM_EXPR:
2275 case VEC_WIDEN_MULT_HI_EXPR:
2276 case VEC_WIDEN_MULT_LO_EXPR:
2277 case WIDEN_MULT_EXPR:
2280 case TRUNC_DIV_EXPR:
2282 case FLOOR_DIV_EXPR:
2283 case ROUND_DIV_EXPR:
2285 case EXACT_DIV_EXPR:
2286 case TRUNC_MOD_EXPR:
2288 case FLOOR_MOD_EXPR:
2289 case ROUND_MOD_EXPR:
2292 case TRUTH_NOT_EXPR:
2294 case POSTINCREMENT_EXPR:
2295 case POSTDECREMENT_EXPR:
2296 case PREINCREMENT_EXPR:
2297 case PREDECREMENT_EXPR:
2299 case ALIGN_INDIRECT_REF:
2300 case MISALIGNED_INDIRECT_REF:
2306 case FIX_TRUNC_EXPR:
2312 case ARRAY_RANGE_REF:
2316 /* Special expressions. */
2322 case REDUC_MAX_EXPR:
2323 case REDUC_MIN_EXPR:
2324 case REDUC_PLUS_EXPR:
2325 case VEC_LSHIFT_EXPR:
2326 case VEC_RSHIFT_EXPR:
2327 case VEC_UNPACK_HI_EXPR:
2328 case VEC_UNPACK_LO_EXPR:
2329 case VEC_PACK_MOD_EXPR:
2330 case VEC_PACK_SAT_EXPR:
2334 case NON_LVALUE_EXPR:
2335 return op_prio (TREE_OPERAND (op, 0));
2338 /* Return an arbitrarily high precedence to avoid surrounding single
2339 VAR_DECLs in ()s. */
2345 /* Return the symbol associated with operator OP. */
2348 op_symbol_1 (enum tree_code code)
2353 case GIMPLE_MODIFY_STMT:
2357 case TRUTH_ORIF_EXPR:
2360 case TRUTH_AND_EXPR:
2361 case TRUTH_ANDIF_EXPR:
2367 case TRUTH_XOR_EXPR:
2377 case UNORDERED_EXPR:
2423 case VEC_LSHIFT_EXPR:
2426 case VEC_RSHIFT_EXPR:
2432 case REDUC_PLUS_EXPR:
2435 case WIDEN_SUM_EXPR:
2438 case WIDEN_MULT_EXPR:
2448 case TRUTH_NOT_EXPR:
2455 case ALIGN_INDIRECT_REF:
2458 case MISALIGNED_INDIRECT_REF:
2461 case TRUNC_DIV_EXPR:
2468 case FLOOR_DIV_EXPR:
2471 case ROUND_DIV_EXPR:
2474 case EXACT_DIV_EXPR:
2477 case TRUNC_MOD_EXPR:
2483 case FLOOR_MOD_EXPR:
2486 case ROUND_MOD_EXPR:
2489 case PREDECREMENT_EXPR:
2492 case PREINCREMENT_EXPR:
2495 case POSTDECREMENT_EXPR:
2498 case POSTINCREMENT_EXPR:
2508 return "<<< ??? >>>";
2515 return op_symbol_1 (TREE_CODE (op));
2518 /* Prints the name of a CALL_EXPR. */
2521 print_call_name (pretty_printer *buffer, tree node)
2525 gcc_assert (TREE_CODE (node) == CALL_EXPR);
2527 op0 = TREE_OPERAND (node, 0);
2529 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
2530 op0 = TREE_OPERAND (op0, 0);
2532 switch (TREE_CODE (op0))
2536 dump_function_name (buffer, op0);
2542 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2546 pp_string (buffer, "(");
2547 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2548 pp_string (buffer, ") ? ");
2549 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, 0, false);
2550 pp_string (buffer, " : ");
2551 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, 0, false);
2555 /* The function is a pointer contained in a structure. */
2556 if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
2557 TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2558 dump_function_name (buffer, TREE_OPERAND (op0, 1));
2560 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2562 We can have several levels of structures and a function
2563 pointer inside. This is not implemented yet... */
2568 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2569 dump_function_name (buffer, TREE_OPERAND (op0, 0));
2571 dump_generic_node (buffer, op0, 0, 0, false);
2576 dump_generic_node (buffer, op0, 0, 0, false);
2584 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2587 pretty_print_string (pretty_printer *buffer, const char *str)
2597 pp_string (buffer, "\\b");
2601 pp_string (buffer, "\\f");
2605 pp_string (buffer, "\\n");
2609 pp_string (buffer, "\\r");
2613 pp_string (buffer, "\\t");
2617 pp_string (buffer, "\\v");
2621 pp_string (buffer, "\\\\");
2625 pp_string (buffer, "\\\"");
2629 pp_string (buffer, "\\'");
2632 /* No need to handle \0; the loop terminates on \0. */
2635 pp_string (buffer, "\\1");
2639 pp_string (buffer, "\\2");
2643 pp_string (buffer, "\\3");
2647 pp_string (buffer, "\\4");
2651 pp_string (buffer, "\\5");
2655 pp_string (buffer, "\\6");
2659 pp_string (buffer, "\\7");
2663 pp_character (buffer, str[0]);
2671 maybe_init_pretty_print (FILE *file)
2675 pp_construct (&buffer, /* prefix */NULL, /* line-width */0);
2676 pp_needs_newline (&buffer) = true;
2680 buffer.buffer->stream = file;
2684 newline_and_indent (pretty_printer *buffer, int spc)
2686 pp_newline (buffer);
2692 dump_vops (pretty_printer *buffer, tree stmt, int spc, int flags)
2694 struct vdef_optype_d *vdefs;
2695 struct vuse_optype_d *vuses;
2698 if (!ssa_operands_active () || !stmt_references_memory_p (stmt))
2701 /* Even if the statement doesn't have virtual operators yet, it may
2702 contain symbol information (this happens before aliases have been
2704 if ((flags & TDF_MEMSYMS)
2705 && VUSE_OPS (stmt) == NULL
2706 && VDEF_OPS (stmt) == NULL)
2708 if (LOADED_SYMS (stmt))
2710 pp_string (buffer, "# LOADS: ");
2711 dump_symbols (buffer, LOADED_SYMS (stmt), flags);
2712 newline_and_indent (buffer, spc);
2715 if (STORED_SYMS (stmt))
2717 pp_string (buffer, "# STORES: ");
2718 dump_symbols (buffer, STORED_SYMS (stmt), flags);
2719 newline_and_indent (buffer, spc);
2725 vuses = VUSE_OPS (stmt);
2728 pp_string (buffer, "# VUSE <");
2730 n = VUSE_NUM (vuses);
2731 for (i = 0; i < n; i++)
2733 dump_generic_node (buffer, VUSE_OP (vuses, i), spc + 2, flags, false);
2735 pp_string (buffer, ", ");
2738 pp_string (buffer, ">");
2740 if (flags & TDF_MEMSYMS)
2741 dump_symbols (buffer, LOADED_SYMS (stmt), flags);
2743 newline_and_indent (buffer, spc);
2744 vuses = vuses->next;
2747 vdefs = VDEF_OPS (stmt);
2750 pp_string (buffer, "# ");
2751 dump_generic_node (buffer, VDEF_RESULT (vdefs), spc + 2, flags, false);
2752 pp_string (buffer, " = VDEF <");
2754 n = VDEF_NUM (vdefs);
2755 for (i = 0; i < n; i++)
2757 dump_generic_node (buffer, VDEF_OP (vdefs, i), spc + 2, flags, 0);
2759 pp_string (buffer, ", ");
2762 pp_string (buffer, ">");
2764 if ((flags & TDF_MEMSYMS) && vdefs->next == NULL)
2765 dump_symbols (buffer, STORED_SYMS (stmt), flags);
2767 newline_and_indent (buffer, spc);
2768 vdefs = vdefs->next;
2773 /* Dumps basic block BB to FILE with details described by FLAGS and
2774 indented by INDENT spaces. */
2777 dump_generic_bb (FILE *file, basic_block bb, int indent, int flags)
2779 maybe_init_pretty_print (file);
2780 dump_generic_bb_buff (&buffer, bb, indent, flags);
2784 /* Dumps header of basic block BB to buffer BUFFER indented by INDENT
2785 spaces and details described by flags. */
2788 dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
2794 if (flags & TDF_BLOCKS)
2797 pp_string (buffer, "# BLOCK ");
2798 pp_decimal_int (buffer, bb->index);
2801 pp_string (buffer, " freq:");
2802 pp_decimal_int (buffer, bb->frequency);
2806 pp_string (buffer, " count:");
2807 pp_widest_integer (buffer, bb->count);
2810 if (flags & TDF_LINENO)
2812 block_stmt_iterator bsi;
2814 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2815 if (get_lineno (bsi_stmt (bsi)) != -1)
2817 pp_string (buffer, ", starting at line ");
2818 pp_decimal_int (buffer, get_lineno (bsi_stmt (bsi)));
2822 newline_and_indent (buffer, indent);
2824 pp_string (buffer, "# PRED:");
2825 pp_write_text_to_stream (buffer);
2826 FOR_EACH_EDGE (e, ei, bb->preds)
2827 if (flags & TDF_SLIM)
2829 pp_string (buffer, " ");
2830 if (e->src == ENTRY_BLOCK_PTR)
2831 pp_string (buffer, "ENTRY");
2833 pp_decimal_int (buffer, e->src->index);
2836 dump_edge_info (buffer->buffer->stream, e, 0);
2837 pp_newline (buffer);
2841 stmt = first_stmt (bb);
2842 if (!stmt || TREE_CODE (stmt) != LABEL_EXPR)
2844 INDENT (indent - 2);
2845 pp_string (buffer, "<bb ");
2846 pp_decimal_int (buffer, bb->index);
2847 pp_string (buffer, ">:");
2848 pp_newline (buffer);
2851 pp_write_text_to_stream (buffer);
2852 check_bb_profile (bb, buffer->buffer->stream);
2855 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
2859 dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
2865 pp_string (buffer, "# SUCC:");
2866 pp_write_text_to_stream (buffer);
2867 FOR_EACH_EDGE (e, ei, bb->succs)
2868 if (flags & TDF_SLIM)
2870 pp_string (buffer, " ");
2871 if (e->dest == EXIT_BLOCK_PTR)
2872 pp_string (buffer, "EXIT");
2874 pp_decimal_int (buffer, e->dest->index);
2877 dump_edge_info (buffer->buffer->stream, e, 1);
2878 pp_newline (buffer);
2881 /* Dump PHI nodes of basic block BB to BUFFER with details described
2882 by FLAGS and indented by INDENT spaces. */
2885 dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags)
2887 tree phi = phi_nodes (bb);
2891 for (; phi; phi = PHI_CHAIN (phi))
2893 if (is_gimple_reg (PHI_RESULT (phi)) || (flags & TDF_VOPS))
2896 pp_string (buffer, "# ");
2897 dump_generic_node (buffer, phi, indent, flags, false);
2898 pp_newline (buffer);
2904 /* Dump jump to basic block BB that is represented implicitly in the cfg
2908 pp_cfg_jump (pretty_printer *buffer, basic_block bb)
2912 stmt = first_stmt (bb);
2914 pp_string (buffer, "goto <bb ");
2915 pp_decimal_int (buffer, bb->index);
2916 pp_string (buffer, ">");
2917 if (stmt && TREE_CODE (stmt) == LABEL_EXPR)
2919 pp_string (buffer, " (");
2920 dump_generic_node (buffer, LABEL_EXPR_LABEL (stmt), 0, 0, false);
2921 pp_string (buffer, ")");
2923 pp_semicolon (buffer);
2926 /* Dump edges represented implicitly in basic block BB to BUFFER, indented
2927 by INDENT spaces, with details given by FLAGS. */
2930 dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent,
2936 /* If there is a fallthru edge, we may need to add an artificial goto to the
2938 FOR_EACH_EDGE (e, ei, bb->succs)
2939 if (e->flags & EDGE_FALLTHRU)
2941 if (e && e->dest != bb->next_bb)
2945 if ((flags & TDF_LINENO)
2946 #ifdef USE_MAPPED_LOCATION
2947 && e->goto_locus != UNKNOWN_LOCATION
2953 expanded_location goto_xloc;
2954 #ifdef USE_MAPPED_LOCATION
2955 goto_xloc = expand_location (e->goto_locus);
2957 goto_xloc = *e->goto_locus;
2959 pp_character (buffer, '[');
2962 pp_string (buffer, goto_xloc.file);
2963 pp_string (buffer, " : ");
2965 pp_decimal_int (buffer, goto_xloc.line);
2966 pp_string (buffer, "] ");
2969 pp_cfg_jump (buffer, e->dest);
2970 pp_newline (buffer);
2974 /* Dumps basic block BB to buffer BUFFER with details described by FLAGS and
2975 indented by INDENT spaces. */
2978 dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
2979 int indent, int flags)
2981 block_stmt_iterator bsi;
2983 int label_indent = indent - 2;
2985 if (label_indent < 0)
2988 dump_bb_header (buffer, bb, indent, flags);
2990 dump_phi_nodes (buffer, bb, indent, flags);
2992 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2996 stmt = bsi_stmt (bsi);
2998 curr_indent = TREE_CODE (stmt) == LABEL_EXPR ? label_indent : indent;
3000 INDENT (curr_indent);
3001 dump_generic_node (buffer, stmt, curr_indent, flags, true);
3002 pp_newline (buffer);
3005 dump_implicit_edges (buffer, bb, indent, flags);
3007 if (flags & TDF_BLOCKS)
3008 dump_bb_end (buffer, bb, indent, flags);