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 3, 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 COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #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 "fixed-value.h"
37 #include "value-prof.h"
39 /* Local functions, macros and variables. */
40 static int op_prio (const_tree);
41 static const char *op_symbol (const_tree);
42 static void pretty_print_string (pretty_printer *, const char*);
43 static void print_call_name (pretty_printer *, const_tree);
44 static void newline_and_indent (pretty_printer *, int);
45 static void maybe_init_pretty_print (FILE *);
46 static void print_declaration (pretty_printer *, tree, int, int);
47 static void print_struct_decl (pretty_printer *, const_tree, int, int);
48 static void do_niy (pretty_printer *, const_tree);
49 static void dump_vops (pretty_printer *, tree, int, int);
50 static void dump_generic_bb_buff (pretty_printer *, basic_block, int, int);
52 #define INDENT(SPACE) do { \
53 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
55 #define NIY do_niy(buffer,node)
57 #define PRINT_FUNCTION_NAME(NODE) pp_printf \
58 (buffer, "%s", TREE_CODE (NODE) == NOP_EXPR ? \
59 lang_hooks.decl_printable_name (TREE_OPERAND (NODE, 0), 1) : \
60 lang_hooks.decl_printable_name (NODE, 1))
62 static pretty_printer buffer;
63 static int initialized = 0;
65 /* Try to print something for an unknown tree code. */
68 do_niy (pretty_printer *buffer, const_tree node)
72 pp_string (buffer, "<<< Unknown tree: ");
73 pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
77 len = TREE_OPERAND_LENGTH (node);
78 for (i = 0; i < len; ++i)
80 newline_and_indent (buffer, 2);
81 dump_generic_node (buffer, TREE_OPERAND (node, i), 2, 0, false);
85 pp_string (buffer, " >>>\n");
88 /* Debugging function to print out a generic expression. */
91 debug_generic_expr (tree t)
93 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS);
94 fprintf (stderr, "\n");
97 /* Debugging function to print out a generic statement. */
100 debug_generic_stmt (tree t)
102 print_generic_stmt (stderr, t, TDF_VOPS|TDF_MEMSYMS);
103 fprintf (stderr, "\n");
106 /* Debugging function to print out a chain of trees . */
109 debug_tree_chain (tree t)
113 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
114 fprintf(stderr, " ");
117 fprintf (stderr, "\n");
120 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
122 print_generic_decl (FILE *file, tree decl, int flags)
124 maybe_init_pretty_print (file);
125 print_declaration (&buffer, decl, 2, flags);
126 pp_write_text_to_stream (&buffer);
129 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
130 to show in the dump. See TDF_* in tree.h. */
133 print_generic_stmt (FILE *file, tree t, int flags)
135 maybe_init_pretty_print (file);
136 dump_generic_node (&buffer, t, 0, flags, true);
140 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
141 to show in the dump. See TDF_* in tree.h. The output is indented by
145 print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
149 maybe_init_pretty_print (file);
151 for (i = 0; i < indent; i++)
153 dump_generic_node (&buffer, t, indent, flags, true);
157 /* Print a single expression T on file FILE. FLAGS specifies details to show
158 in the dump. See TDF_* in tree.h. */
161 print_generic_expr (FILE *file, tree t, int flags)
163 maybe_init_pretty_print (file);
164 dump_generic_node (&buffer, t, 0, flags, false);
167 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
171 dump_decl_name (pretty_printer *buffer, tree node, int flags)
176 pp_tree_identifier (buffer, DECL_NAME (t));
177 if ((flags & TDF_UID)
178 || DECL_NAME (t) == NULL_TREE)
180 if (TREE_CODE (t) == LABEL_DECL
181 && LABEL_DECL_UID (t) != -1)
182 pp_printf (buffer, "L.%wd",
186 char c = TREE_CODE (t) == CONST_DECL ? 'C' : 'D';
187 pp_printf (buffer, "%c.%u", c, DECL_UID (t));
192 /* Like the above, but used for pretty printing function calls. */
195 dump_function_name (pretty_printer *buffer, tree node)
197 if (DECL_NAME (node))
198 PRINT_FUNCTION_NAME (node);
200 dump_decl_name (buffer, node, 0);
203 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
204 FLAGS are as in dump_generic_node. */
207 dump_function_declaration (pretty_printer *buffer, tree node,
210 bool wrote_arg = false;
214 pp_character (buffer, '(');
216 /* Print the argument types. The last element in the list is a VOID_TYPE.
217 The following avoids printing the last element. */
218 arg = TYPE_ARG_TYPES (node);
219 while (arg && TREE_CHAIN (arg) && arg != error_mark_node)
222 dump_generic_node (buffer, TREE_VALUE (arg), spc, flags, false);
223 arg = TREE_CHAIN (arg);
224 if (TREE_CHAIN (arg) && TREE_CODE (TREE_CHAIN (arg)) == TREE_LIST)
226 pp_character (buffer, ',');
232 pp_string (buffer, "void");
234 pp_character (buffer, ')');
237 /* Dump the domain associated with an array. */
240 dump_array_domain (pretty_printer *buffer, tree domain, int spc, int flags)
242 pp_character (buffer, '[');
245 tree min = TYPE_MIN_VALUE (domain);
246 tree max = TYPE_MAX_VALUE (domain);
249 && integer_zerop (min)
250 && host_integerp (max, 0))
251 pp_wide_integer (buffer, TREE_INT_CST_LOW (max) + 1);
255 dump_generic_node (buffer, min, spc, flags, false);
256 pp_character (buffer, ':');
258 dump_generic_node (buffer, max, spc, flags, false);
262 pp_string (buffer, "<unknown>");
263 pp_character (buffer, ']');
267 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
268 dump_generic_node. */
271 dump_omp_clause (pretty_printer *buffer, tree clause, int spc, int flags)
275 switch (OMP_CLAUSE_CODE (clause))
277 case OMP_CLAUSE_PRIVATE:
280 case OMP_CLAUSE_SHARED:
283 case OMP_CLAUSE_FIRSTPRIVATE:
284 name = "firstprivate";
286 case OMP_CLAUSE_LASTPRIVATE:
287 name = "lastprivate";
289 case OMP_CLAUSE_COPYIN:
292 case OMP_CLAUSE_COPYPRIVATE:
293 name = "copyprivate";
296 pp_string (buffer, name);
297 pp_character (buffer, '(');
298 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
300 pp_character (buffer, ')');
303 case OMP_CLAUSE_REDUCTION:
304 pp_string (buffer, "reduction(");
305 pp_string (buffer, op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause)));
306 pp_character (buffer, ':');
307 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
309 pp_character (buffer, ')');
313 pp_string (buffer, "if(");
314 dump_generic_node (buffer, OMP_CLAUSE_IF_EXPR (clause),
316 pp_character (buffer, ')');
319 case OMP_CLAUSE_NUM_THREADS:
320 pp_string (buffer, "num_threads(");
321 dump_generic_node (buffer, OMP_CLAUSE_NUM_THREADS_EXPR (clause),
323 pp_character (buffer, ')');
326 case OMP_CLAUSE_NOWAIT:
327 pp_string (buffer, "nowait");
329 case OMP_CLAUSE_ORDERED:
330 pp_string (buffer, "ordered");
333 case OMP_CLAUSE_DEFAULT:
334 pp_string (buffer, "default(");
335 switch (OMP_CLAUSE_DEFAULT_KIND (clause))
337 case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
339 case OMP_CLAUSE_DEFAULT_SHARED:
340 pp_string (buffer, "shared");
342 case OMP_CLAUSE_DEFAULT_NONE:
343 pp_string (buffer, "none");
345 case OMP_CLAUSE_DEFAULT_PRIVATE:
346 pp_string (buffer, "private");
351 pp_character (buffer, ')');
354 case OMP_CLAUSE_SCHEDULE:
355 pp_string (buffer, "schedule(");
356 switch (OMP_CLAUSE_SCHEDULE_KIND (clause))
358 case OMP_CLAUSE_SCHEDULE_STATIC:
359 pp_string (buffer, "static");
361 case OMP_CLAUSE_SCHEDULE_DYNAMIC:
362 pp_string (buffer, "dynamic");
364 case OMP_CLAUSE_SCHEDULE_GUIDED:
365 pp_string (buffer, "guided");
367 case OMP_CLAUSE_SCHEDULE_RUNTIME:
368 pp_string (buffer, "runtime");
373 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
375 pp_character (buffer, ',');
376 dump_generic_node (buffer,
377 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
380 pp_character (buffer, ')');
384 /* Should never happen. */
385 dump_generic_node (buffer, clause, spc, flags, false);
391 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
392 dump_generic_node. */
395 dump_omp_clauses (pretty_printer *buffer, tree clause, int spc, int flags)
403 dump_omp_clause (buffer, clause, spc, flags);
404 clause = OMP_CLAUSE_CHAIN (clause);
412 /* Dump the set of decls SYMS. BUFFER, SPC and FLAGS are as in
413 dump_generic_node. */
416 dump_symbols (pretty_printer *buffer, bitmap syms, int flags)
422 pp_string (buffer, "NIL");
425 pp_string (buffer, " { ");
427 EXECUTE_IF_SET_IN_BITMAP (syms, 0, i, bi)
429 tree sym = referenced_var_lookup (i);
430 dump_generic_node (buffer, sym, 0, flags, false);
431 pp_string (buffer, " ");
434 pp_string (buffer, "}");
439 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of indent.
440 FLAGS specifies details to show in the dump (see TDF_* in tree-pass.h).
441 If IS_STMT is true, the object printed is considered to be a statement
442 and it is terminated by ';' if appropriate. */
445 dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
453 if (node == NULL_TREE)
456 is_expr = EXPR_P (node) || GIMPLE_STMT_P (node);
458 /* We use has_stmt_ann because CALL_EXPR can be both an expression
459 and a statement, and we have no guarantee that it will have a
460 stmt_ann when it is used as an RHS expression. stmt_ann will assert
461 if you call it on something with a non-stmt annotation attached. */
462 if (TREE_CODE (node) != ERROR_MARK
463 && is_gimple_stmt (node)
464 && (flags & (TDF_VOPS|TDF_MEMSYMS))
465 && has_stmt_ann (node)
466 && TREE_CODE (node) != PHI_NODE)
467 dump_vops (buffer, node, spc, flags);
469 if (is_stmt && (flags & TDF_STMTADDR))
470 pp_printf (buffer, "<&%p> ", (void *)node);
472 if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
474 expanded_location xloc = expand_location (EXPR_LOCATION (node));
475 pp_character (buffer, '[');
478 pp_string (buffer, xloc.file);
479 pp_string (buffer, " : ");
481 pp_decimal_int (buffer, xloc.line);
482 pp_string (buffer, "] ");
485 switch (TREE_CODE (node))
488 pp_string (buffer, "<<< error >>>");
491 case IDENTIFIER_NODE:
492 pp_tree_identifier (buffer, node);
496 while (node && node != error_mark_node)
498 if (TREE_PURPOSE (node))
500 dump_generic_node (buffer, TREE_PURPOSE (node), spc, flags, false);
503 dump_generic_node (buffer, TREE_VALUE (node), spc, flags, false);
504 node = TREE_CHAIN (node);
505 if (node && TREE_CODE (node) == TREE_LIST)
507 pp_character (buffer, ',');
514 dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
519 if (TREE_VEC_LENGTH (node) > 0)
521 size_t len = TREE_VEC_LENGTH (node);
522 for (i = 0; i < len - 1; i++)
524 dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags,
526 pp_character (buffer, ',');
529 dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc,
538 case FIXED_POINT_TYPE:
544 unsigned int quals = TYPE_QUALS (node);
545 enum tree_code_class class;
547 if (quals & TYPE_QUAL_CONST)
548 pp_string (buffer, "const ");
549 else if (quals & TYPE_QUAL_VOLATILE)
550 pp_string (buffer, "volatile ");
551 else if (quals & TYPE_QUAL_RESTRICT)
552 pp_string (buffer, "restrict ");
554 class = TREE_CODE_CLASS (TREE_CODE (node));
556 if (class == tcc_declaration)
558 if (DECL_NAME (node))
559 dump_decl_name (buffer, node, flags);
561 pp_string (buffer, "<unnamed type decl>");
563 else if (class == tcc_type)
565 if (TYPE_NAME (node))
567 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
568 pp_tree_identifier (buffer, TYPE_NAME (node));
569 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
570 && DECL_NAME (TYPE_NAME (node)))
571 dump_decl_name (buffer, TYPE_NAME (node), flags);
573 pp_string (buffer, "<unnamed type>");
575 else if (TREE_CODE (node) == VECTOR_TYPE)
577 pp_string (buffer, "vector ");
578 dump_generic_node (buffer, TREE_TYPE (node),
581 else if (TREE_CODE (node) == INTEGER_TYPE)
583 pp_string (buffer, (TYPE_UNSIGNED (node)
584 ? "<unnamed-unsigned:"
585 : "<unnamed-signed:"));
586 pp_decimal_int (buffer, TYPE_PRECISION (node));
587 pp_string (buffer, ">");
590 pp_string (buffer, "<unnamed type>");
597 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
599 if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
601 tree fnode = TREE_TYPE (node);
603 dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false);
605 pp_character (buffer, '(');
606 pp_string (buffer, str);
607 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
608 dump_decl_name (buffer, TYPE_NAME (node), flags);
610 pp_printf (buffer, "<T%x>", TYPE_UID (node));
612 pp_character (buffer, ')');
613 dump_function_declaration (buffer, fnode, spc, flags);
617 unsigned int quals = TYPE_QUALS (node);
619 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
621 pp_string (buffer, str);
623 if (quals & TYPE_QUAL_CONST)
624 pp_string (buffer, " const");
625 if (quals & TYPE_QUAL_VOLATILE)
626 pp_string (buffer, " volatile");
627 if (quals & TYPE_QUAL_RESTRICT)
628 pp_string (buffer, " restrict");
630 if (TYPE_REF_CAN_ALIAS_ALL (node))
631 pp_string (buffer, " {ref-all}");
640 dump_decl_name (buffer, TYPE_NAME (TYPE_METHOD_BASETYPE (node)), flags);
641 pp_string (buffer, "::");
646 const char *sep = "";
649 pp_string (buffer, "MEM[");
651 tmp = TMR_SYMBOL (node);
654 pp_string (buffer, sep);
656 pp_string (buffer, "symbol: ");
657 dump_generic_node (buffer, tmp, spc, flags, false);
659 tmp = TMR_BASE (node);
662 pp_string (buffer, sep);
664 pp_string (buffer, "base: ");
665 dump_generic_node (buffer, tmp, spc, flags, false);
667 tmp = TMR_INDEX (node);
670 pp_string (buffer, sep);
672 pp_string (buffer, "index: ");
673 dump_generic_node (buffer, tmp, spc, flags, false);
675 tmp = TMR_STEP (node);
678 pp_string (buffer, sep);
680 pp_string (buffer, "step: ");
681 dump_generic_node (buffer, tmp, spc, flags, false);
683 tmp = TMR_OFFSET (node);
686 pp_string (buffer, sep);
688 pp_string (buffer, "offset: ");
689 dump_generic_node (buffer, tmp, spc, flags, false);
691 pp_string (buffer, "]");
692 if (flags & TDF_DETAILS)
694 pp_string (buffer, "{");
695 dump_generic_node (buffer, TMR_ORIGINAL (node), spc, flags,
697 pp_string (buffer, "}");
706 /* Print the innermost component type. */
707 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
708 tmp = TREE_TYPE (tmp))
710 dump_generic_node (buffer, tmp, spc, flags, false);
712 /* Print the dimensions. */
713 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
714 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
720 case QUAL_UNION_TYPE:
722 unsigned int quals = TYPE_QUALS (node);
724 if (quals & TYPE_QUAL_CONST)
725 pp_string (buffer, "const ");
726 if (quals & TYPE_QUAL_VOLATILE)
727 pp_string (buffer, "volatile ");
729 /* Print the name of the structure. */
730 if (TREE_CODE (node) == RECORD_TYPE)
731 pp_string (buffer, "struct ");
732 else if (TREE_CODE (node) == UNION_TYPE)
733 pp_string (buffer, "union ");
735 if (TYPE_NAME (node))
736 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
738 print_struct_decl (buffer, node, spc, flags);
747 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
749 /* In the case of a pointer, one may want to divide by the
750 size of the pointed-to type. Unfortunately, this not
751 straightforward. The C front-end maps expressions
756 in such a way that the two INTEGER_CST nodes for "5" have
757 different values but identical types. In the latter
758 case, the 5 is multiplied by sizeof (int) in c-common.c
759 (pointer_int_sum) to convert it to a byte address, and
760 yet the type of the node is left unchanged. Argh. What
761 is consistent though is that the number value corresponds
762 to bytes (UNITS) offset.
764 NB: Neither of the following divisors can be trivially
765 used to recover the original literal:
767 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
768 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
769 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
770 pp_string (buffer, "B"); /* pseudo-unit */
772 else if (! host_integerp (node, 0))
775 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (val);
776 HOST_WIDE_INT high = TREE_INT_CST_HIGH (val);
778 if (tree_int_cst_sgn (val) < 0)
780 pp_character (buffer, '-');
784 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
786 sprintf (pp_buffer (buffer)->digit_buffer,
787 HOST_WIDE_INT_PRINT_DOUBLE_HEX, high, low);
788 pp_string (buffer, pp_buffer (buffer)->digit_buffer);
791 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
795 /* Code copied from print_node. */
798 if (TREE_OVERFLOW (node))
799 pp_string (buffer, " overflow");
801 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
802 d = TREE_REAL_CST (node);
803 if (REAL_VALUE_ISINF (d))
804 pp_string (buffer, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
805 else if (REAL_VALUE_ISNAN (d))
806 pp_string (buffer, " Nan");
810 real_to_decimal (string, &d, sizeof (string), 0, 1);
811 pp_string (buffer, string);
816 unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
817 pp_string (buffer, "0x");
818 for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
819 output_formatted_integer (buffer, "%02x", *p++);
828 fixed_to_decimal (string, TREE_FIXED_CST_PTR (node), sizeof (string));
829 pp_string (buffer, string);
834 pp_string (buffer, "__complex__ (");
835 dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
836 pp_string (buffer, ", ");
837 dump_generic_node (buffer, TREE_IMAGPART (node), spc, flags, false);
838 pp_string (buffer, ")");
842 pp_string (buffer, "\"");
843 pretty_print_string (buffer, TREE_STRING_POINTER (node));
844 pp_string (buffer, "\"");
850 pp_string (buffer, "{ ");
851 for (elt = TREE_VECTOR_CST_ELTS (node); elt; elt = TREE_CHAIN (elt))
853 dump_generic_node (buffer, TREE_VALUE (elt), spc, flags, false);
854 if (TREE_CHAIN (elt))
855 pp_string (buffer, ", ");
857 pp_string (buffer, " }");
866 dump_decl_name (buffer, node, flags);
870 if (DECL_NAME (node))
871 dump_decl_name (buffer, node, flags);
872 else if (LABEL_DECL_UID (node) != -1)
873 pp_printf (buffer, "<L%wd>",
874 LABEL_DECL_UID (node));
876 pp_printf (buffer, "<D.%u>", DECL_UID (node));
880 if (DECL_IS_BUILTIN (node))
882 /* Don't print the declaration of built-in types. */
885 if (DECL_NAME (node))
886 dump_decl_name (buffer, node, flags);
889 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
890 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
891 && TYPE_METHODS (TREE_TYPE (node)))
893 /* The type is a c++ class: all structures have at least
895 pp_string (buffer, "class ");
896 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
901 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
902 ? "union" : "struct "));
903 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
908 case SYMBOL_MEMORY_TAG:
909 case NAME_MEMORY_TAG:
910 case STRUCT_FIELD_TAG:
915 case MEMORY_PARTITION_TAG:
916 dump_decl_name (buffer, node, flags);
920 pp_string (buffer, "<retval>");
924 op0 = TREE_OPERAND (node, 0);
926 if (TREE_CODE (op0) == INDIRECT_REF)
928 op0 = TREE_OPERAND (op0, 0);
931 if (op_prio (op0) < op_prio (node))
932 pp_character (buffer, '(');
933 dump_generic_node (buffer, op0, spc, flags, false);
934 if (op_prio (op0) < op_prio (node))
935 pp_character (buffer, ')');
936 pp_string (buffer, str);
937 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
939 if (TREE_CODE (op0) != VALUE_HANDLE)
941 op0 = component_ref_field_offset (node);
942 if (op0 && TREE_CODE (op0) != INTEGER_CST)
944 pp_string (buffer, "{off: ");
945 dump_generic_node (buffer, op0, spc, flags, false);
946 pp_character (buffer, '}');
952 pp_string (buffer, "BIT_FIELD_REF <");
953 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
954 pp_string (buffer, ", ");
955 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
956 pp_string (buffer, ", ");
957 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
958 pp_string (buffer, ">");
962 case ARRAY_RANGE_REF:
963 op0 = TREE_OPERAND (node, 0);
964 if (op_prio (op0) < op_prio (node))
965 pp_character (buffer, '(');
966 dump_generic_node (buffer, op0, spc, flags, false);
967 if (op_prio (op0) < op_prio (node))
968 pp_character (buffer, ')');
969 pp_character (buffer, '[');
970 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
971 if (TREE_CODE (node) == ARRAY_RANGE_REF)
972 pp_string (buffer, " ...");
973 pp_character (buffer, ']');
975 op0 = array_ref_low_bound (node);
976 op1 = array_ref_element_size (node);
978 if (!integer_zerop (op0)
979 || TREE_OPERAND (node, 2)
980 || TREE_OPERAND (node, 3))
982 pp_string (buffer, "{lb: ");
983 dump_generic_node (buffer, op0, spc, flags, false);
984 pp_string (buffer, " sz: ");
985 dump_generic_node (buffer, op1, spc, flags, false);
986 pp_character (buffer, '}');
992 unsigned HOST_WIDE_INT ix;
994 bool is_struct_init = FALSE;
995 pp_character (buffer, '{');
996 if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
997 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
998 is_struct_init = TRUE;
999 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
1001 if (field && is_struct_init)
1003 pp_character (buffer, '.');
1004 dump_generic_node (buffer, field, spc, flags, false);
1005 pp_string (buffer, "=");
1007 if (val && TREE_CODE (val) == ADDR_EXPR)
1008 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
1009 val = TREE_OPERAND (val, 0);
1010 if (val && TREE_CODE (val) == FUNCTION_DECL)
1011 dump_decl_name (buffer, val, flags);
1013 dump_generic_node (buffer, val, spc, flags, false);
1014 if (ix != VEC_length (constructor_elt, CONSTRUCTOR_ELTS (node)) - 1)
1016 pp_character (buffer, ',');
1020 pp_character (buffer, '}');
1027 if (flags & TDF_SLIM)
1029 pp_string (buffer, "<COMPOUND_EXPR>");
1033 dump_generic_node (buffer, TREE_OPERAND (node, 0),
1034 spc, flags, !(flags & TDF_SLIM));
1035 if (flags & TDF_SLIM)
1036 newline_and_indent (buffer, spc);
1039 pp_character (buffer, ',');
1043 for (tp = &TREE_OPERAND (node, 1);
1044 TREE_CODE (*tp) == COMPOUND_EXPR;
1045 tp = &TREE_OPERAND (*tp, 1))
1047 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
1048 spc, flags, !(flags & TDF_SLIM));
1049 if (flags & TDF_SLIM)
1050 newline_and_indent (buffer, spc);
1053 pp_character (buffer, ',');
1058 dump_generic_node (buffer, *tp, spc, flags, !(flags & TDF_SLIM));
1062 case STATEMENT_LIST:
1064 tree_stmt_iterator si;
1067 if (flags & TDF_SLIM)
1069 pp_string (buffer, "<STATEMENT_LIST>");
1073 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
1076 newline_and_indent (buffer, spc);
1079 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
1085 case GIMPLE_MODIFY_STMT:
1087 dump_generic_node (buffer, GENERIC_TREE_OPERAND (node, 0), spc, flags,
1090 pp_character (buffer, '=');
1091 if (TREE_CODE (node) == GIMPLE_MODIFY_STMT
1092 && MOVE_NONTEMPORAL (node))
1093 pp_string (buffer, "{nt}");
1094 if (TREE_CODE (node) == GIMPLE_MODIFY_STMT)
1097 if ((ann = stmt_ann (node))
1098 && ann->has_volatile_ops)
1099 pp_string (buffer, "{v}");
1102 dump_generic_node (buffer, GENERIC_TREE_OPERAND (node, 1), spc, flags,
1107 pp_string (buffer, "TARGET_EXPR <");
1108 dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false);
1109 pp_character (buffer, ',');
1111 dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false);
1112 pp_character (buffer, '>');
1116 print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags);
1121 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
1123 pp_string (buffer, "if (");
1124 dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false);
1125 pp_character (buffer, ')');
1126 /* The lowered cond_exprs should always be printed in full. */
1127 if (COND_EXPR_THEN (node)
1128 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
1129 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
1130 && COND_EXPR_ELSE (node)
1131 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
1132 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
1135 dump_generic_node (buffer, COND_EXPR_THEN (node),
1137 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
1139 pp_string (buffer, " else ");
1140 dump_generic_node (buffer, COND_EXPR_ELSE (node),
1144 else if (!(flags & TDF_SLIM))
1146 /* Output COND_EXPR_THEN. */
1147 if (COND_EXPR_THEN (node))
1149 newline_and_indent (buffer, spc+2);
1150 pp_character (buffer, '{');
1151 newline_and_indent (buffer, spc+4);
1152 dump_generic_node (buffer, COND_EXPR_THEN (node), spc+4,
1154 newline_and_indent (buffer, spc+2);
1155 pp_character (buffer, '}');
1158 /* Output COND_EXPR_ELSE. */
1159 if (COND_EXPR_ELSE (node)
1160 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
1162 newline_and_indent (buffer, spc);
1163 pp_string (buffer, "else");
1164 newline_and_indent (buffer, spc+2);
1165 pp_character (buffer, '{');
1166 newline_and_indent (buffer, spc+4);
1167 dump_generic_node (buffer, COND_EXPR_ELSE (node), spc+4,
1169 newline_and_indent (buffer, spc+2);
1170 pp_character (buffer, '}');
1177 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1179 pp_character (buffer, '?');
1181 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1183 pp_character (buffer, ':');
1185 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1190 pp_character (buffer, '{');
1191 if (!(flags & TDF_SLIM))
1193 if (BIND_EXPR_VARS (node))
1195 pp_newline (buffer);
1197 for (op0 = BIND_EXPR_VARS (node); op0; op0 = TREE_CHAIN (op0))
1199 print_declaration (buffer, op0, spc+2, flags);
1200 pp_newline (buffer);
1204 newline_and_indent (buffer, spc+2);
1205 dump_generic_node (buffer, BIND_EXPR_BODY (node), spc+2, flags, true);
1206 newline_and_indent (buffer, spc);
1207 pp_character (buffer, '}');
1213 print_call_name (buffer, node);
1215 /* Print parameters. */
1217 pp_character (buffer, '(');
1220 call_expr_arg_iterator iter;
1221 FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
1223 dump_generic_node (buffer, arg, spc, flags, false);
1224 if (more_call_expr_args_p (&iter))
1226 pp_character (buffer, ',');
1231 if (CALL_EXPR_VA_ARG_PACK (node))
1233 if (call_expr_nargs (node) > 0)
1235 pp_character (buffer, ',');
1238 pp_string (buffer, "__builtin_va_arg_pack ()");
1240 pp_character (buffer, ')');
1242 op1 = CALL_EXPR_STATIC_CHAIN (node);
1245 pp_string (buffer, " [static-chain: ");
1246 dump_generic_node (buffer, op1, spc, flags, false);
1247 pp_character (buffer, ']');
1250 if (CALL_EXPR_RETURN_SLOT_OPT (node))
1251 pp_string (buffer, " [return slot optimization]");
1252 if (CALL_EXPR_TAILCALL (node))
1253 pp_string (buffer, " [tail call]");
1256 case WITH_CLEANUP_EXPR:
1260 case CLEANUP_POINT_EXPR:
1261 pp_string (buffer, "<<cleanup_point ");
1262 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1263 pp_string (buffer, ">>");
1266 case PLACEHOLDER_EXPR:
1267 pp_string (buffer, "<PLACEHOLDER_EXPR ");
1268 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1269 pp_character (buffer, '>');
1272 /* Binary arithmetic and logic expressions. */
1273 case WIDEN_SUM_EXPR:
1274 case WIDEN_MULT_EXPR:
1277 case POINTER_PLUS_EXPR:
1279 case TRUNC_DIV_EXPR:
1281 case FLOOR_DIV_EXPR:
1282 case ROUND_DIV_EXPR:
1283 case TRUNC_MOD_EXPR:
1285 case FLOOR_MOD_EXPR:
1286 case ROUND_MOD_EXPR:
1288 case EXACT_DIV_EXPR:
1293 case VEC_LSHIFT_EXPR:
1294 case VEC_RSHIFT_EXPR:
1298 case TRUTH_ANDIF_EXPR:
1299 case TRUTH_ORIF_EXPR:
1300 case TRUTH_AND_EXPR:
1302 case TRUTH_XOR_EXPR:
1316 case UNORDERED_EXPR:
1318 const char *op = op_symbol (node);
1319 op0 = TREE_OPERAND (node, 0);
1320 op1 = TREE_OPERAND (node, 1);
1322 /* When the operands are expressions with less priority,
1323 keep semantics of the tree representation. */
1324 if (op_prio (op0) <= op_prio (node))
1326 pp_character (buffer, '(');
1327 dump_generic_node (buffer, op0, spc, flags, false);
1328 pp_character (buffer, ')');
1331 dump_generic_node (buffer, op0, spc, flags, false);
1334 pp_string (buffer, op);
1337 /* When the operands are expressions with less priority,
1338 keep semantics of the tree representation. */
1339 if (op_prio (op1) <= op_prio (node))
1341 pp_character (buffer, '(');
1342 dump_generic_node (buffer, op1, spc, flags, false);
1343 pp_character (buffer, ')');
1346 dump_generic_node (buffer, op1, spc, flags, false);
1350 /* Unary arithmetic and logic expressions. */
1353 case TRUTH_NOT_EXPR:
1355 case PREDECREMENT_EXPR:
1356 case PREINCREMENT_EXPR:
1357 case ALIGN_INDIRECT_REF:
1358 case MISALIGNED_INDIRECT_REF:
1360 if (TREE_CODE (node) == ADDR_EXPR
1361 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
1362 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
1363 ; /* Do not output '&' for strings and function pointers. */
1365 pp_string (buffer, op_symbol (node));
1367 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1369 pp_character (buffer, '(');
1370 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1371 pp_character (buffer, ')');
1374 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1376 if (TREE_CODE (node) == MISALIGNED_INDIRECT_REF)
1378 pp_string (buffer, "{misalignment: ");
1379 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1380 pp_character (buffer, '}');
1384 case POSTDECREMENT_EXPR:
1385 case POSTINCREMENT_EXPR:
1386 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1388 pp_character (buffer, '(');
1389 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1390 pp_character (buffer, ')');
1393 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1394 pp_string (buffer, op_symbol (node));
1398 pp_string (buffer, "MIN_EXPR <");
1399 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1400 pp_string (buffer, ", ");
1401 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1402 pp_character (buffer, '>');
1406 pp_string (buffer, "MAX_EXPR <");
1407 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1408 pp_string (buffer, ", ");
1409 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1410 pp_character (buffer, '>');
1414 pp_string (buffer, "ABS_EXPR <");
1415 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1416 pp_character (buffer, '>');
1423 case FIXED_CONVERT_EXPR:
1424 case FIX_TRUNC_EXPR:
1428 type = TREE_TYPE (node);
1429 op0 = TREE_OPERAND (node, 0);
1430 if (type != TREE_TYPE (op0))
1432 pp_character (buffer, '(');
1433 dump_generic_node (buffer, type, spc, flags, false);
1434 pp_string (buffer, ") ");
1436 if (op_prio (op0) < op_prio (node))
1437 pp_character (buffer, '(');
1438 dump_generic_node (buffer, op0, spc, flags, false);
1439 if (op_prio (op0) < op_prio (node))
1440 pp_character (buffer, ')');
1443 case VIEW_CONVERT_EXPR:
1444 pp_string (buffer, "VIEW_CONVERT_EXPR<");
1445 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1446 pp_string (buffer, ">(");
1447 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1448 pp_character (buffer, ')');
1451 case NON_LVALUE_EXPR:
1452 pp_string (buffer, "NON_LVALUE_EXPR <");
1453 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1454 pp_character (buffer, '>');
1458 pp_string (buffer, "SAVE_EXPR <");
1459 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1460 pp_character (buffer, '>');
1464 pp_string (buffer, "COMPLEX_EXPR <");
1465 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1466 pp_string (buffer, ", ");
1467 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1468 pp_string (buffer, ">");
1472 pp_string (buffer, "CONJ_EXPR <");
1473 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1474 pp_string (buffer, ">");
1478 pp_string (buffer, "REALPART_EXPR <");
1479 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1480 pp_string (buffer, ">");
1484 pp_string (buffer, "IMAGPART_EXPR <");
1485 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1486 pp_string (buffer, ">");
1490 pp_string (buffer, "VA_ARG_EXPR <");
1491 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1492 pp_string (buffer, ">");
1495 case TRY_FINALLY_EXPR:
1496 case TRY_CATCH_EXPR:
1497 pp_string (buffer, "try");
1498 newline_and_indent (buffer, spc+2);
1499 pp_string (buffer, "{");
1500 newline_and_indent (buffer, spc+4);
1501 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc+4, flags, true);
1502 newline_and_indent (buffer, spc+2);
1503 pp_string (buffer, "}");
1504 newline_and_indent (buffer, spc);
1506 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
1507 newline_and_indent (buffer, spc+2);
1508 pp_string (buffer, "{");
1509 newline_and_indent (buffer, spc+4);
1510 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
1511 newline_and_indent (buffer, spc+2);
1512 pp_string (buffer, "}");
1517 pp_string (buffer, "catch (");
1518 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
1519 pp_string (buffer, ")");
1520 newline_and_indent (buffer, spc+2);
1521 pp_string (buffer, "{");
1522 newline_and_indent (buffer, spc+4);
1523 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
1524 newline_and_indent (buffer, spc+2);
1525 pp_string (buffer, "}");
1529 case EH_FILTER_EXPR:
1530 pp_string (buffer, "<<<eh_filter (");
1531 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
1532 pp_string (buffer, ")>>>");
1533 newline_and_indent (buffer, spc+2);
1534 pp_string (buffer, "{");
1535 newline_and_indent (buffer, spc+4);
1536 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
1537 newline_and_indent (buffer, spc+2);
1538 pp_string (buffer, "}");
1542 case CHANGE_DYNAMIC_TYPE_EXPR:
1543 pp_string (buffer, "<<<change_dynamic_type (");
1544 dump_generic_node (buffer, CHANGE_DYNAMIC_TYPE_NEW_TYPE (node), spc + 2,
1546 pp_string (buffer, ") ");
1547 dump_generic_node (buffer, CHANGE_DYNAMIC_TYPE_LOCATION (node), spc + 2,
1549 pp_string (buffer, ")>>>");
1554 op0 = TREE_OPERAND (node, 0);
1555 /* If this is for break or continue, don't bother printing it. */
1556 if (DECL_NAME (op0))
1558 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1559 if (strcmp (name, "break") == 0
1560 || strcmp (name, "continue") == 0)
1563 dump_generic_node (buffer, op0, spc, flags, false);
1564 pp_character (buffer, ':');
1565 if (DECL_NONLOCAL (op0))
1566 pp_string (buffer, " [non-local]");
1570 pp_string (buffer, "<<<exception object>>>");
1574 pp_string (buffer, "<<<filter object>>>");
1578 pp_string (buffer, "while (1)");
1579 if (!(flags & TDF_SLIM))
1581 newline_and_indent (buffer, spc+2);
1582 pp_character (buffer, '{');
1583 newline_and_indent (buffer, spc+4);
1584 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
1585 newline_and_indent (buffer, spc+2);
1586 pp_character (buffer, '}');
1592 pp_string (buffer, "return");
1593 op0 = TREE_OPERAND (node, 0);
1597 if (TREE_CODE (op0) == MODIFY_EXPR
1598 || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
1599 dump_generic_node (buffer, GENERIC_TREE_OPERAND (op0, 1),
1602 dump_generic_node (buffer, op0, spc, flags, false);
1607 pp_string (buffer, "if (");
1608 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1609 pp_string (buffer, ") break");
1613 pp_string (buffer, "switch (");
1614 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
1615 pp_character (buffer, ')');
1616 if (!(flags & TDF_SLIM))
1618 newline_and_indent (buffer, spc+2);
1619 pp_character (buffer, '{');
1620 if (SWITCH_BODY (node))
1622 newline_and_indent (buffer, spc+4);
1623 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags,
1628 tree vec = SWITCH_LABELS (node);
1629 size_t i, n = TREE_VEC_LENGTH (vec);
1630 for (i = 0; i < n; ++i)
1632 tree elt = TREE_VEC_ELT (vec, i);
1633 newline_and_indent (buffer, spc+4);
1636 dump_generic_node (buffer, elt, spc+4, flags, false);
1637 pp_string (buffer, " goto ");
1638 dump_generic_node (buffer, CASE_LABEL (elt), spc+4,
1640 pp_semicolon (buffer);
1643 pp_string (buffer, "case ???: goto ???;");
1646 newline_and_indent (buffer, spc+2);
1647 pp_character (buffer, '}');
1653 op0 = GOTO_DESTINATION (node);
1654 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
1656 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1657 if (strcmp (name, "break") == 0
1658 || strcmp (name, "continue") == 0)
1660 pp_string (buffer, name);
1664 pp_string (buffer, "goto ");
1665 dump_generic_node (buffer, op0, spc, flags, false);
1669 pp_string (buffer, "resx ");
1670 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1674 pp_string (buffer, "__asm__");
1675 if (ASM_VOLATILE_P (node))
1676 pp_string (buffer, " __volatile__");
1677 pp_character (buffer, '(');
1678 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
1679 pp_character (buffer, ':');
1680 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
1681 pp_character (buffer, ':');
1682 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
1683 if (ASM_CLOBBERS (node))
1685 pp_character (buffer, ':');
1686 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
1688 pp_string (buffer, ")");
1691 case CASE_LABEL_EXPR:
1692 if (CASE_LOW (node) && CASE_HIGH (node))
1694 pp_string (buffer, "case ");
1695 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1696 pp_string (buffer, " ... ");
1697 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
1699 else if (CASE_LOW (node))
1701 pp_string (buffer, "case ");
1702 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1705 pp_string (buffer, "default ");
1706 pp_character (buffer, ':');
1710 pp_string (buffer, "OBJ_TYPE_REF(");
1711 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
1712 pp_character (buffer, ';');
1713 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
1714 pp_character (buffer, '-');
1715 pp_character (buffer, '>');
1716 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
1717 pp_character (buffer, ')');
1724 dump_generic_node (buffer, PHI_RESULT (node), spc, flags, false);
1725 pp_string (buffer, " = PHI <");
1726 for (i = 0; i < PHI_NUM_ARGS (node); i++)
1728 dump_generic_node (buffer, PHI_ARG_DEF (node, i), spc, flags, false);
1729 pp_string (buffer, "(");
1730 pp_decimal_int (buffer, PHI_ARG_EDGE (node, i)->src->index);
1731 pp_string (buffer, ")");
1732 if (i < PHI_NUM_ARGS (node) - 1)
1733 pp_string (buffer, ", ");
1735 pp_string (buffer, ">");
1737 if (stmt_references_memory_p (node) && (flags & TDF_MEMSYMS))
1738 dump_symbols (buffer, STORED_SYMS (node), flags);
1743 dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
1744 pp_string (buffer, "_");
1745 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
1746 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
1747 pp_string (buffer, "(ab)");
1748 else if (SSA_NAME_IS_DEFAULT_DEF (node))
1749 pp_string (buffer, "(D)");
1752 case WITH_SIZE_EXPR:
1753 pp_string (buffer, "WITH_SIZE_EXPR <");
1754 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1755 pp_string (buffer, ", ");
1756 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1757 pp_string (buffer, ">");
1761 pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node));
1765 pp_string (buffer, "ASSERT_EXPR <");
1766 dump_generic_node (buffer, ASSERT_EXPR_VAR (node), spc, flags, false);
1767 pp_string (buffer, ", ");
1768 dump_generic_node (buffer, ASSERT_EXPR_COND (node), spc, flags, false);
1769 pp_string (buffer, ">");
1773 pp_string (buffer, "scev_known");
1776 case SCEV_NOT_KNOWN:
1777 pp_string (buffer, "scev_not_known");
1780 case POLYNOMIAL_CHREC:
1781 pp_string (buffer, "{");
1782 dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
1783 pp_string (buffer, ", +, ");
1784 dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
1785 pp_string (buffer, "}_");
1786 dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
1790 case REALIGN_LOAD_EXPR:
1791 pp_string (buffer, "REALIGN_LOAD <");
1792 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1793 pp_string (buffer, ", ");
1794 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1795 pp_string (buffer, ", ");
1796 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1797 pp_string (buffer, ">");
1801 pp_string (buffer, " VEC_COND_EXPR < ");
1802 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1803 pp_string (buffer, " , ");
1804 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1805 pp_string (buffer, " , ");
1806 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1807 pp_string (buffer, " > ");
1811 pp_string (buffer, " DOT_PROD_EXPR < ");
1812 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1813 pp_string (buffer, ", ");
1814 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1815 pp_string (buffer, ", ");
1816 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1817 pp_string (buffer, " > ");
1821 pp_string (buffer, "#pragma omp parallel");
1822 dump_omp_clauses (buffer, OMP_PARALLEL_CLAUSES (node), spc, flags);
1823 if (OMP_PARALLEL_FN (node))
1825 pp_string (buffer, " [child fn: ");
1826 dump_generic_node (buffer, OMP_PARALLEL_FN (node), spc, flags, false);
1828 pp_string (buffer, " (");
1830 if (OMP_PARALLEL_DATA_ARG (node))
1831 dump_generic_node (buffer, OMP_PARALLEL_DATA_ARG (node), spc, flags,
1834 pp_string (buffer, "???");
1836 pp_string (buffer, ")]");
1840 if (!(flags & TDF_SLIM) && OMP_BODY (node))
1842 newline_and_indent (buffer, spc + 2);
1843 pp_character (buffer, '{');
1844 newline_and_indent (buffer, spc + 4);
1845 dump_generic_node (buffer, OMP_BODY (node), spc + 4, flags, false);
1846 newline_and_indent (buffer, spc + 2);
1847 pp_character (buffer, '}');
1853 pp_string (buffer, "#pragma omp for");
1854 dump_omp_clauses (buffer, OMP_FOR_CLAUSES (node), spc, flags);
1856 if (!(flags & TDF_SLIM))
1858 if (OMP_FOR_PRE_BODY (node))
1860 newline_and_indent (buffer, spc + 2);
1861 pp_character (buffer, '{');
1863 newline_and_indent (buffer, spc);
1864 dump_generic_node (buffer, OMP_FOR_PRE_BODY (node),
1867 newline_and_indent (buffer, spc);
1868 pp_string (buffer, "for (");
1869 dump_generic_node (buffer, OMP_FOR_INIT (node), spc, flags, false);
1870 pp_string (buffer, "; ");
1871 dump_generic_node (buffer, OMP_FOR_COND (node), spc, flags, false);
1872 pp_string (buffer, "; ");
1873 dump_generic_node (buffer, OMP_FOR_INCR (node), spc, flags, false);
1874 pp_string (buffer, ")");
1875 if (OMP_FOR_BODY (node))
1877 newline_and_indent (buffer, spc + 2);
1878 pp_character (buffer, '{');
1879 newline_and_indent (buffer, spc + 4);
1880 dump_generic_node (buffer, OMP_FOR_BODY (node), spc + 4, flags,
1882 newline_and_indent (buffer, spc + 2);
1883 pp_character (buffer, '}');
1885 if (OMP_FOR_PRE_BODY (node))
1888 newline_and_indent (buffer, spc + 2);
1889 pp_character (buffer, '}');
1896 pp_string (buffer, "#pragma omp sections");
1897 if (OMP_SECTIONS_CONTROL (node))
1899 pp_string (buffer, " <");
1900 dump_generic_node (buffer, OMP_SECTIONS_CONTROL (node), spc,
1902 pp_string (buffer, ">");
1904 dump_omp_clauses (buffer, OMP_SECTIONS_CLAUSES (node), spc, flags);
1907 case OMP_SECTIONS_SWITCH:
1908 pp_string (buffer, "OMP_SECTIONS_SWITCH");
1913 pp_string (buffer, "#pragma omp section");
1917 pp_string (buffer, "#pragma omp master");
1921 pp_string (buffer, "#pragma omp ordered");
1925 pp_string (buffer, "#pragma omp critical");
1926 if (OMP_CRITICAL_NAME (node))
1929 pp_character (buffer, '(');
1930 dump_generic_node (buffer, OMP_CRITICAL_NAME (node), spc,
1932 pp_character (buffer, ')');
1937 pp_string (buffer, "#pragma omp atomic");
1938 newline_and_indent (buffer, spc + 2);
1939 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1941 pp_character (buffer, '=');
1943 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1947 pp_string (buffer, "#pragma omp single");
1948 dump_omp_clauses (buffer, OMP_SINGLE_CLAUSES (node), spc, flags);
1952 pp_string (buffer, "OMP_RETURN");
1953 if (OMP_RETURN_NOWAIT (node))
1954 pp_string (buffer, " [nowait]");
1959 pp_string (buffer, "OMP_CONTINUE <");
1960 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1961 pp_string (buffer, " <- ");
1962 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1963 pp_string (buffer, ">");
1968 dump_omp_clause (buffer, node, spc, flags);
1972 case REDUC_MAX_EXPR:
1973 pp_string (buffer, " REDUC_MAX_EXPR < ");
1974 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1975 pp_string (buffer, " > ");
1978 case REDUC_MIN_EXPR:
1979 pp_string (buffer, " REDUC_MIN_EXPR < ");
1980 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1981 pp_string (buffer, " > ");
1984 case REDUC_PLUS_EXPR:
1985 pp_string (buffer, " REDUC_PLUS_EXPR < ");
1986 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1987 pp_string (buffer, " > ");
1990 case VEC_WIDEN_MULT_HI_EXPR:
1991 pp_string (buffer, " VEC_WIDEN_MULT_HI_EXPR < ");
1992 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1993 pp_string (buffer, ", ");
1994 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1995 pp_string (buffer, " > ");
1998 case VEC_WIDEN_MULT_LO_EXPR:
1999 pp_string (buffer, " VEC_WIDEN_MULT_LO_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_UNPACK_HI_EXPR:
2007 pp_string (buffer, " VEC_UNPACK_HI_EXPR < ");
2008 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2009 pp_string (buffer, " > ");
2012 case VEC_UNPACK_LO_EXPR:
2013 pp_string (buffer, " VEC_UNPACK_LO_EXPR < ");
2014 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2015 pp_string (buffer, " > ");
2018 case VEC_UNPACK_FLOAT_HI_EXPR:
2019 pp_string (buffer, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2020 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2021 pp_string (buffer, " > ");
2024 case VEC_UNPACK_FLOAT_LO_EXPR:
2025 pp_string (buffer, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2026 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2027 pp_string (buffer, " > ");
2030 case VEC_PACK_TRUNC_EXPR:
2031 pp_string (buffer, " VEC_PACK_TRUNC_EXPR < ");
2032 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2033 pp_string (buffer, ", ");
2034 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2035 pp_string (buffer, " > ");
2038 case VEC_PACK_SAT_EXPR:
2039 pp_string (buffer, " VEC_PACK_SAT_EXPR < ");
2040 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2041 pp_string (buffer, ", ");
2042 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2043 pp_string (buffer, " > ");
2046 case VEC_PACK_FIX_TRUNC_EXPR:
2047 pp_string (buffer, " VEC_PACK_FIX_TRUNC_EXPR < ");
2048 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2049 pp_string (buffer, ", ");
2050 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2051 pp_string (buffer, " > ");
2057 pp_string (buffer, "BLOCK");
2059 if (BLOCK_ABSTRACT (node))
2060 pp_string (buffer, " [abstract]");
2062 if (TREE_ASM_WRITTEN (node))
2063 pp_string (buffer, " [written]");
2065 newline_and_indent (buffer, spc + 2);
2067 if (BLOCK_SUPERCONTEXT (node))
2069 pp_string (buffer, "SUPERCONTEXT: ");
2070 if (TREE_CODE (BLOCK_SUPERCONTEXT (node)) == BLOCK)
2071 pp_printf (buffer, "BLOCK %p",
2072 (void *)BLOCK_SUPERCONTEXT (node));
2074 dump_generic_node (buffer, BLOCK_SUPERCONTEXT (node), 0, flags,
2076 newline_and_indent (buffer, spc + 2);
2079 if (BLOCK_SUBBLOCKS (node))
2081 pp_string (buffer, "SUBBLOCKS: ");
2082 for (t = BLOCK_SUBBLOCKS (node); t; t = BLOCK_CHAIN (t))
2083 pp_printf (buffer, "%p ", (void *)t);
2084 newline_and_indent (buffer, spc + 2);
2087 if (BLOCK_VARS (node))
2089 pp_string (buffer, "VARS: ");
2090 for (t = BLOCK_VARS (node); t; t = TREE_CHAIN (t))
2092 dump_generic_node (buffer, t, 0, flags, false);
2093 pp_string (buffer, " ");
2095 newline_and_indent (buffer, spc + 2);
2098 if (BLOCK_ABSTRACT_ORIGIN (node))
2100 pp_string (buffer, "ABSTRACT_ORIGIN: ");
2101 if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node)) == BLOCK)
2102 pp_printf (buffer, "BLOCK %p",
2103 (void *)BLOCK_ABSTRACT_ORIGIN (node));
2105 dump_generic_node (buffer, BLOCK_ABSTRACT_ORIGIN (node), 0, flags,
2107 newline_and_indent (buffer, spc + 2);
2112 case VEC_EXTRACT_EVEN_EXPR:
2113 pp_string (buffer, " VEC_EXTRACT_EVEN_EXPR < ");
2114 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2115 pp_string (buffer, ", ");
2116 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2117 pp_string (buffer, " > ");
2120 case VEC_EXTRACT_ODD_EXPR:
2121 pp_string (buffer, " VEC_EXTRACT_ODD_EXPR < ");
2122 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2123 pp_string (buffer, ", ");
2124 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2125 pp_string (buffer, " > ");
2128 case VEC_INTERLEAVE_HIGH_EXPR:
2129 pp_string (buffer, " VEC_INTERLEAVE_HIGH_EXPR < ");
2130 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2131 pp_string (buffer, ", ");
2132 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2133 pp_string (buffer, " > ");
2136 case VEC_INTERLEAVE_LOW_EXPR:
2137 pp_string (buffer, " VEC_INTERLEAVE_LOW_EXPR < ");
2138 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2139 pp_string (buffer, ", ");
2140 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2141 pp_string (buffer, " > ");
2148 if (is_stmt && is_expr)
2149 pp_semicolon (buffer);
2151 /* If we're building a diagnostic, the formatted text will be written
2152 into BUFFER's stream by the caller; otherwise, write it now. */
2153 if (!(flags & TDF_DIAGNOSTIC))
2154 pp_write_text_to_stream (buffer);
2159 /* Print the declaration of a variable. */
2162 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
2166 if (TREE_CODE (t) == TYPE_DECL)
2167 pp_string (buffer, "typedef ");
2169 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
2170 pp_string (buffer, "register ");
2172 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
2173 pp_string (buffer, "extern ");
2174 else if (TREE_STATIC (t))
2175 pp_string (buffer, "static ");
2177 /* Print the type and name. */
2178 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
2182 /* Print array's type. */
2183 tmp = TREE_TYPE (t);
2184 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
2185 tmp = TREE_TYPE (tmp);
2186 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
2188 /* Print variable's name. */
2190 dump_generic_node (buffer, t, spc, flags, false);
2192 /* Print the dimensions. */
2193 tmp = TREE_TYPE (t);
2194 while (TREE_CODE (tmp) == ARRAY_TYPE)
2196 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
2197 tmp = TREE_TYPE (tmp);
2200 else if (TREE_CODE (t) == FUNCTION_DECL)
2202 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
2204 dump_decl_name (buffer, t, flags);
2205 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
2209 /* Print type declaration. */
2210 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
2212 /* Print variable's name. */
2214 dump_generic_node (buffer, t, spc, flags, false);
2217 if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
2219 pp_string (buffer, " __asm__ ");
2220 pp_character (buffer, '(');
2221 dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
2222 pp_character (buffer, ')');
2225 /* The initial value of a function serves to determine wether the function
2226 is declared or defined. So the following does not apply to function
2228 if (TREE_CODE (t) != FUNCTION_DECL)
2230 /* Print the initial value. */
2231 if (DECL_INITIAL (t))
2234 pp_character (buffer, '=');
2236 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
2240 if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
2242 pp_string (buffer, " [value-expr: ");
2243 dump_generic_node (buffer, DECL_VALUE_EXPR (t), spc, flags, false);
2244 pp_character (buffer, ']');
2247 pp_character (buffer, ';');
2251 /* Prints a structure: name, fields, and methods.
2252 FIXME: Still incomplete. */
2255 print_struct_decl (pretty_printer *buffer, const_tree node, int spc, int flags)
2257 /* Print the name of the structure. */
2258 if (TYPE_NAME (node))
2261 if (TREE_CODE (node) == RECORD_TYPE)
2262 pp_string (buffer, "struct ");
2263 else if ((TREE_CODE (node) == UNION_TYPE
2264 || TREE_CODE (node) == QUAL_UNION_TYPE))
2265 pp_string (buffer, "union ");
2267 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
2270 /* Print the contents of the structure. */
2271 pp_newline (buffer);
2273 pp_character (buffer, '{');
2274 pp_newline (buffer);
2276 /* Print the fields of the structure. */
2279 tmp = TYPE_FIELDS (node);
2282 /* Avoid to print recursively the structure. */
2283 /* FIXME : Not implemented correctly...,
2284 what about the case when we have a cycle in the contain graph? ...
2285 Maybe this could be solved by looking at the scope in which the
2286 structure was declared. */
2287 if (TREE_TYPE (tmp) != node
2288 || (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
2289 && TREE_TYPE (TREE_TYPE (tmp)) != node))
2291 print_declaration (buffer, tmp, spc+2, flags);
2292 pp_newline (buffer);
2294 tmp = TREE_CHAIN (tmp);
2298 pp_character (buffer, '}');
2301 /* Return the priority of the operator OP.
2303 From lowest to highest precedence with either left-to-right (L-R)
2304 or right-to-left (R-L) associativity]:
2307 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2319 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2320 15 [L-R] fn() [] -> .
2322 unary +, - and * have higher precedence than the corresponding binary
2326 op_prio (const_tree op)
2331 switch (TREE_CODE (op))
2339 case GIMPLE_MODIFY_STMT:
2347 case TRUTH_ORIF_EXPR:
2350 case TRUTH_AND_EXPR:
2351 case TRUTH_ANDIF_EXPR:
2358 case TRUTH_XOR_EXPR:
2375 case UNORDERED_EXPR:
2388 case WIDEN_SUM_EXPR:
2390 case POINTER_PLUS_EXPR:
2394 case VEC_WIDEN_MULT_HI_EXPR:
2395 case VEC_WIDEN_MULT_LO_EXPR:
2396 case WIDEN_MULT_EXPR:
2399 case TRUNC_DIV_EXPR:
2401 case FLOOR_DIV_EXPR:
2402 case ROUND_DIV_EXPR:
2404 case EXACT_DIV_EXPR:
2405 case TRUNC_MOD_EXPR:
2407 case FLOOR_MOD_EXPR:
2408 case ROUND_MOD_EXPR:
2411 case TRUTH_NOT_EXPR:
2413 case POSTINCREMENT_EXPR:
2414 case POSTDECREMENT_EXPR:
2415 case PREINCREMENT_EXPR:
2416 case PREDECREMENT_EXPR:
2418 case ALIGN_INDIRECT_REF:
2419 case MISALIGNED_INDIRECT_REF:
2425 case FIX_TRUNC_EXPR:
2431 case ARRAY_RANGE_REF:
2435 /* Special expressions. */
2441 case REDUC_MAX_EXPR:
2442 case REDUC_MIN_EXPR:
2443 case REDUC_PLUS_EXPR:
2444 case VEC_LSHIFT_EXPR:
2445 case VEC_RSHIFT_EXPR:
2446 case VEC_UNPACK_HI_EXPR:
2447 case VEC_UNPACK_LO_EXPR:
2448 case VEC_UNPACK_FLOAT_HI_EXPR:
2449 case VEC_UNPACK_FLOAT_LO_EXPR:
2450 case VEC_PACK_TRUNC_EXPR:
2451 case VEC_PACK_SAT_EXPR:
2455 case NON_LVALUE_EXPR:
2456 return op_prio (TREE_OPERAND (op, 0));
2459 /* Return an arbitrarily high precedence to avoid surrounding single
2460 VAR_DECLs in ()s. */
2466 /* Return the symbol associated with operator CODE. */
2469 op_symbol_code (enum tree_code code)
2474 case GIMPLE_MODIFY_STMT:
2478 case TRUTH_ORIF_EXPR:
2481 case TRUTH_AND_EXPR:
2482 case TRUTH_ANDIF_EXPR:
2488 case TRUTH_XOR_EXPR:
2498 case UNORDERED_EXPR:
2544 case VEC_LSHIFT_EXPR:
2547 case VEC_RSHIFT_EXPR:
2550 case POINTER_PLUS_EXPR:
2556 case REDUC_PLUS_EXPR:
2559 case WIDEN_SUM_EXPR:
2562 case WIDEN_MULT_EXPR:
2572 case TRUTH_NOT_EXPR:
2579 case ALIGN_INDIRECT_REF:
2582 case MISALIGNED_INDIRECT_REF:
2585 case TRUNC_DIV_EXPR:
2592 case FLOOR_DIV_EXPR:
2595 case ROUND_DIV_EXPR:
2598 case EXACT_DIV_EXPR:
2601 case TRUNC_MOD_EXPR:
2607 case FLOOR_MOD_EXPR:
2610 case ROUND_MOD_EXPR:
2613 case PREDECREMENT_EXPR:
2616 case PREINCREMENT_EXPR:
2619 case POSTDECREMENT_EXPR:
2622 case POSTINCREMENT_EXPR:
2632 return "<<< ??? >>>";
2636 /* Return the symbol associated with operator OP. */
2639 op_symbol (const_tree op)
2641 return op_symbol_code (TREE_CODE (op));
2644 /* Prints the name of a CALL_EXPR. */
2647 print_call_name (pretty_printer *buffer, const_tree node)
2651 gcc_assert (TREE_CODE (node) == CALL_EXPR);
2653 op0 = CALL_EXPR_FN (node);
2655 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
2656 op0 = TREE_OPERAND (op0, 0);
2658 switch (TREE_CODE (op0))
2662 dump_function_name (buffer, op0);
2668 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2672 pp_string (buffer, "(");
2673 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2674 pp_string (buffer, ") ? ");
2675 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, 0, false);
2676 pp_string (buffer, " : ");
2677 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, 0, false);
2681 /* The function is a pointer contained in a structure. */
2682 if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
2683 TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2684 dump_function_name (buffer, TREE_OPERAND (op0, 1));
2686 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2688 We can have several levels of structures and a function
2689 pointer inside. This is not implemented yet... */
2694 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2695 dump_function_name (buffer, TREE_OPERAND (op0, 0));
2697 dump_generic_node (buffer, op0, 0, 0, false);
2702 dump_generic_node (buffer, op0, 0, 0, false);
2710 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2713 pretty_print_string (pretty_printer *buffer, const char *str)
2723 pp_string (buffer, "\\b");
2727 pp_string (buffer, "\\f");
2731 pp_string (buffer, "\\n");
2735 pp_string (buffer, "\\r");
2739 pp_string (buffer, "\\t");
2743 pp_string (buffer, "\\v");
2747 pp_string (buffer, "\\\\");
2751 pp_string (buffer, "\\\"");
2755 pp_string (buffer, "\\'");
2758 /* No need to handle \0; the loop terminates on \0. */
2761 pp_string (buffer, "\\1");
2765 pp_string (buffer, "\\2");
2769 pp_string (buffer, "\\3");
2773 pp_string (buffer, "\\4");
2777 pp_string (buffer, "\\5");
2781 pp_string (buffer, "\\6");
2785 pp_string (buffer, "\\7");
2789 pp_character (buffer, str[0]);
2797 maybe_init_pretty_print (FILE *file)
2801 pp_construct (&buffer, /* prefix */NULL, /* line-width */0);
2802 pp_needs_newline (&buffer) = true;
2806 buffer.buffer->stream = file;
2810 newline_and_indent (pretty_printer *buffer, int spc)
2812 pp_newline (buffer);
2818 dump_vops (pretty_printer *buffer, tree stmt, int spc, int flags)
2820 struct voptype_d *vdefs;
2821 struct voptype_d *vuses;
2824 if (!ssa_operands_active () || !stmt_references_memory_p (stmt))
2827 /* Even if the statement doesn't have virtual operators yet, it may
2828 contain symbol information (this happens before aliases have been
2830 if ((flags & TDF_MEMSYMS)
2831 && VUSE_OPS (stmt) == NULL
2832 && VDEF_OPS (stmt) == NULL)
2834 if (LOADED_SYMS (stmt))
2836 pp_string (buffer, "# LOADS: ");
2837 dump_symbols (buffer, LOADED_SYMS (stmt), flags);
2838 newline_and_indent (buffer, spc);
2841 if (STORED_SYMS (stmt))
2843 pp_string (buffer, "# STORES: ");
2844 dump_symbols (buffer, STORED_SYMS (stmt), flags);
2845 newline_and_indent (buffer, spc);
2851 vuses = VUSE_OPS (stmt);
2854 pp_string (buffer, "# VUSE <");
2856 n = VUSE_NUM (vuses);
2857 for (i = 0; i < n; i++)
2859 dump_generic_node (buffer, VUSE_OP (vuses, i), spc + 2, flags, false);
2861 pp_string (buffer, ", ");
2864 pp_string (buffer, ">");
2866 if (flags & TDF_MEMSYMS)
2867 dump_symbols (buffer, LOADED_SYMS (stmt), flags);
2869 newline_and_indent (buffer, spc);
2870 vuses = vuses->next;
2873 vdefs = VDEF_OPS (stmt);
2876 pp_string (buffer, "# ");
2877 dump_generic_node (buffer, VDEF_RESULT (vdefs), spc + 2, flags, false);
2878 pp_string (buffer, " = VDEF <");
2880 n = VDEF_NUM (vdefs);
2881 for (i = 0; i < n; i++)
2883 dump_generic_node (buffer, VDEF_OP (vdefs, i), spc + 2, flags, 0);
2885 pp_string (buffer, ", ");
2888 pp_string (buffer, ">");
2890 if ((flags & TDF_MEMSYMS) && vdefs->next == NULL)
2891 dump_symbols (buffer, STORED_SYMS (stmt), flags);
2893 newline_and_indent (buffer, spc);
2894 vdefs = vdefs->next;
2899 /* Dumps basic block BB to FILE with details described by FLAGS and
2900 indented by INDENT spaces. */
2903 dump_generic_bb (FILE *file, basic_block bb, int indent, int flags)
2905 maybe_init_pretty_print (file);
2906 dump_generic_bb_buff (&buffer, bb, indent, flags);
2910 /* Dumps header of basic block BB to buffer BUFFER indented by INDENT
2911 spaces and details described by flags. */
2914 dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
2920 if (flags & TDF_BLOCKS)
2923 pp_string (buffer, "# BLOCK ");
2924 pp_decimal_int (buffer, bb->index);
2927 pp_string (buffer, " freq:");
2928 pp_decimal_int (buffer, bb->frequency);
2932 pp_string (buffer, " count:");
2933 pp_widest_integer (buffer, bb->count);
2936 if (flags & TDF_LINENO)
2938 block_stmt_iterator bsi;
2940 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2941 if (get_lineno (bsi_stmt (bsi)) != -1)
2943 pp_string (buffer, ", starting at line ");
2944 pp_decimal_int (buffer, get_lineno (bsi_stmt (bsi)));
2948 newline_and_indent (buffer, indent);
2950 pp_string (buffer, "# PRED:");
2951 pp_write_text_to_stream (buffer);
2952 FOR_EACH_EDGE (e, ei, bb->preds)
2953 if (flags & TDF_SLIM)
2955 pp_string (buffer, " ");
2956 if (e->src == ENTRY_BLOCK_PTR)
2957 pp_string (buffer, "ENTRY");
2959 pp_decimal_int (buffer, e->src->index);
2962 dump_edge_info (buffer->buffer->stream, e, 0);
2963 pp_newline (buffer);
2967 stmt = first_stmt (bb);
2968 if (!stmt || TREE_CODE (stmt) != LABEL_EXPR)
2970 INDENT (indent - 2);
2971 pp_string (buffer, "<bb ");
2972 pp_decimal_int (buffer, bb->index);
2973 pp_string (buffer, ">:");
2974 pp_newline (buffer);
2977 pp_write_text_to_stream (buffer);
2978 check_bb_profile (bb, buffer->buffer->stream);
2981 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
2985 dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
2991 pp_string (buffer, "# SUCC:");
2992 pp_write_text_to_stream (buffer);
2993 FOR_EACH_EDGE (e, ei, bb->succs)
2994 if (flags & TDF_SLIM)
2996 pp_string (buffer, " ");
2997 if (e->dest == EXIT_BLOCK_PTR)
2998 pp_string (buffer, "EXIT");
3000 pp_decimal_int (buffer, e->dest->index);
3003 dump_edge_info (buffer->buffer->stream, e, 1);
3004 pp_newline (buffer);
3007 /* Dump PHI nodes of basic block BB to BUFFER with details described
3008 by FLAGS and indented by INDENT spaces. */
3011 dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags)
3013 tree phi = phi_nodes (bb);
3017 for (; phi; phi = PHI_CHAIN (phi))
3019 if (is_gimple_reg (PHI_RESULT (phi)) || (flags & TDF_VOPS))
3022 pp_string (buffer, "# ");
3023 dump_generic_node (buffer, phi, indent, flags, false);
3024 pp_newline (buffer);
3030 /* Dump jump to basic block BB that is represented implicitly in the cfg
3034 pp_cfg_jump (pretty_printer *buffer, basic_block bb)
3038 stmt = first_stmt (bb);
3040 pp_string (buffer, "goto <bb ");
3041 pp_decimal_int (buffer, bb->index);
3042 pp_string (buffer, ">");
3043 if (stmt && TREE_CODE (stmt) == LABEL_EXPR)
3045 pp_string (buffer, " (");
3046 dump_generic_node (buffer, LABEL_EXPR_LABEL (stmt), 0, 0, false);
3047 pp_string (buffer, ")");
3049 pp_semicolon (buffer);
3052 /* Dump edges represented implicitly in basic block BB to BUFFER, indented
3053 by INDENT spaces, with details given by FLAGS. */
3056 dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent,
3063 stmt = last_stmt (bb);
3064 if (stmt && TREE_CODE (stmt) == COND_EXPR)
3066 edge true_edge, false_edge;
3068 /* When we are emitting the code or changing CFG, it is possible that
3069 the edges are not yet created. When we are using debug_bb in such
3070 a situation, we do not want it to crash. */
3071 if (EDGE_COUNT (bb->succs) != 2)
3073 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
3075 INDENT (indent + 2);
3076 pp_cfg_jump (buffer, true_edge->dest);
3077 newline_and_indent (buffer, indent);
3078 pp_string (buffer, "else");
3079 newline_and_indent (buffer, indent + 2);
3080 pp_cfg_jump (buffer, false_edge->dest);
3081 pp_newline (buffer);
3085 /* If there is a fallthru edge, we may need to add an artificial goto to the
3087 FOR_EACH_EDGE (e, ei, bb->succs)
3088 if (e->flags & EDGE_FALLTHRU)
3090 if (e && e->dest != bb->next_bb)
3094 if ((flags & TDF_LINENO)
3095 #ifdef USE_MAPPED_LOCATION
3096 && e->goto_locus != UNKNOWN_LOCATION
3102 expanded_location goto_xloc;
3103 #ifdef USE_MAPPED_LOCATION
3104 goto_xloc = expand_location (e->goto_locus);
3106 goto_xloc = *e->goto_locus;
3108 pp_character (buffer, '[');
3111 pp_string (buffer, goto_xloc.file);
3112 pp_string (buffer, " : ");
3114 pp_decimal_int (buffer, goto_xloc.line);
3115 pp_string (buffer, "] ");
3118 pp_cfg_jump (buffer, e->dest);
3119 pp_newline (buffer);
3123 /* Dumps basic block BB to buffer BUFFER with details described by FLAGS and
3124 indented by INDENT spaces. */
3127 dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
3128 int indent, int flags)
3130 block_stmt_iterator bsi;
3132 int label_indent = indent - 2;
3134 if (label_indent < 0)
3137 dump_bb_header (buffer, bb, indent, flags);
3139 dump_phi_nodes (buffer, bb, indent, flags);
3141 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3145 stmt = bsi_stmt (bsi);
3147 curr_indent = TREE_CODE (stmt) == LABEL_EXPR ? label_indent : indent;
3149 INDENT (curr_indent);
3150 dump_generic_node (buffer, stmt, curr_indent, flags, true);
3151 pp_newline (buffer);
3152 dump_histograms_for_stmt (cfun, buffer->buffer->stream, stmt);
3155 dump_implicit_edges (buffer, bb, indent, flags);
3157 if (flags & TDF_BLOCKS)
3158 dump_bb_end (buffer, bb, indent, flags);