1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
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"
40 /* Local functions, macros and variables. */
41 static int op_prio (const_tree);
42 static const char *op_symbol (const_tree);
43 static void pretty_print_string (pretty_printer *, const char*);
44 static void print_call_name (pretty_printer *, const_tree);
45 static void newline_and_indent (pretty_printer *, int);
46 static void maybe_init_pretty_print (FILE *);
47 static void print_declaration (pretty_printer *, tree, int, int);
48 static void print_struct_decl (pretty_printer *, const_tree, int, int);
49 static void do_niy (pretty_printer *, const_tree);
50 static void dump_vops (pretty_printer *, tree, int, int);
51 static void dump_generic_bb_buff (pretty_printer *, basic_block, int, int);
53 #define INDENT(SPACE) do { \
54 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
56 #define NIY do_niy(buffer,node)
58 #define PRINT_FUNCTION_NAME(NODE) pp_printf \
59 (buffer, "%s", TREE_CODE (NODE) == NOP_EXPR ? \
60 lang_hooks.decl_printable_name (TREE_OPERAND (NODE, 0), 1) : \
61 lang_hooks.decl_printable_name (NODE, 1))
63 static pretty_printer buffer;
64 static int initialized = 0;
66 /* Try to print something for an unknown tree code. */
69 do_niy (pretty_printer *buffer, const_tree node)
73 pp_string (buffer, "<<< Unknown tree: ");
74 pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
78 len = TREE_OPERAND_LENGTH (node);
79 for (i = 0; i < len; ++i)
81 newline_and_indent (buffer, 2);
82 dump_generic_node (buffer, TREE_OPERAND (node, i), 2, 0, false);
86 pp_string (buffer, " >>>\n");
89 /* Debugging function to print out a generic expression. */
92 debug_generic_expr (tree t)
94 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS);
95 fprintf (stderr, "\n");
98 /* Debugging function to print out a generic statement. */
101 debug_generic_stmt (tree t)
103 print_generic_stmt (stderr, t, TDF_VOPS|TDF_MEMSYMS);
104 fprintf (stderr, "\n");
107 /* Debugging function to print out a chain of trees . */
110 debug_tree_chain (tree t)
114 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
115 fprintf(stderr, " ");
118 fprintf (stderr, "\n");
121 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
123 print_generic_decl (FILE *file, tree decl, int flags)
125 maybe_init_pretty_print (file);
126 print_declaration (&buffer, decl, 2, flags);
127 pp_write_text_to_stream (&buffer);
130 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
131 to show in the dump. See TDF_* in tree-pass.h. */
134 print_generic_stmt (FILE *file, tree t, int flags)
136 maybe_init_pretty_print (file);
137 dump_generic_node (&buffer, t, 0, flags, true);
141 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
142 to show in the dump. See TDF_* in tree-pass.h. The output is indented by
146 print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
150 maybe_init_pretty_print (file);
152 for (i = 0; i < indent; i++)
154 dump_generic_node (&buffer, t, indent, flags, true);
158 /* Print a single expression T on file FILE. FLAGS specifies details to show
159 in the dump. See TDF_* in tree-pass.h. */
162 print_generic_expr (FILE *file, tree t, int flags)
164 maybe_init_pretty_print (file);
165 dump_generic_node (&buffer, t, 0, flags, false);
168 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
172 dump_decl_name (pretty_printer *buffer, tree node, int flags)
177 pp_tree_identifier (buffer, DECL_NAME (t));
178 if ((flags & TDF_UID)
179 || DECL_NAME (t) == NULL_TREE)
181 if (TREE_CODE (t) == LABEL_DECL
182 && LABEL_DECL_UID (t) != -1)
183 pp_printf (buffer, "L.%d", (int) LABEL_DECL_UID (t));
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");
348 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
349 pp_string (buffer, "firstprivate");
354 pp_character (buffer, ')');
357 case OMP_CLAUSE_SCHEDULE:
358 pp_string (buffer, "schedule(");
359 switch (OMP_CLAUSE_SCHEDULE_KIND (clause))
361 case OMP_CLAUSE_SCHEDULE_STATIC:
362 pp_string (buffer, "static");
364 case OMP_CLAUSE_SCHEDULE_DYNAMIC:
365 pp_string (buffer, "dynamic");
367 case OMP_CLAUSE_SCHEDULE_GUIDED:
368 pp_string (buffer, "guided");
370 case OMP_CLAUSE_SCHEDULE_RUNTIME:
371 pp_string (buffer, "runtime");
373 case OMP_CLAUSE_SCHEDULE_AUTO:
374 pp_string (buffer, "auto");
379 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
381 pp_character (buffer, ',');
382 dump_generic_node (buffer,
383 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
386 pp_character (buffer, ')');
389 case OMP_CLAUSE_UNTIED:
390 pp_string (buffer, "untied");
393 case OMP_CLAUSE_COLLAPSE:
394 pp_string (buffer, "collapse(");
395 dump_generic_node (buffer,
396 OMP_CLAUSE_COLLAPSE_EXPR (clause),
398 pp_character (buffer, ')');
402 /* Should never happen. */
403 dump_generic_node (buffer, clause, spc, flags, false);
409 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
410 dump_generic_node. */
413 dump_omp_clauses (pretty_printer *buffer, tree clause, int spc, int flags)
421 dump_omp_clause (buffer, clause, spc, flags);
422 clause = OMP_CLAUSE_CHAIN (clause);
430 /* Dump the set of decls SYMS. BUFFER, SPC and FLAGS are as in
431 dump_generic_node. */
434 dump_symbols (pretty_printer *buffer, bitmap syms, int flags)
440 pp_string (buffer, "NIL");
443 pp_string (buffer, " { ");
445 EXECUTE_IF_SET_IN_BITMAP (syms, 0, i, bi)
447 tree sym = referenced_var_lookup (i);
448 dump_generic_node (buffer, sym, 0, flags, false);
449 pp_string (buffer, " ");
452 pp_string (buffer, "}");
457 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
458 indent. FLAGS specifies details to show in the dump (see TDF_* in
459 tree-pass.h). If IS_STMT is true, the object printed is considered
460 to be a statement and it is terminated by ';' if appropriate. */
463 dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
471 if (node == NULL_TREE)
474 is_expr = EXPR_P (node) || GIMPLE_STMT_P (node);
476 /* We use has_stmt_ann because CALL_EXPR can be both an expression
477 and a statement, and we have no guarantee that it will have a
478 stmt_ann when it is used as an RHS expression. stmt_ann will assert
479 if you call it on something with a non-stmt annotation attached. */
480 if (TREE_CODE (node) != ERROR_MARK
481 && is_gimple_stmt (node)
482 && (flags & (TDF_VOPS|TDF_MEMSYMS))
483 && has_stmt_ann (node)
484 && TREE_CODE (node) != PHI_NODE)
485 dump_vops (buffer, node, spc, flags);
487 if (is_stmt && (flags & TDF_STMTADDR))
488 pp_printf (buffer, "<&%p> ", (void *)node);
490 if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
492 expanded_location xloc = expand_location (EXPR_LOCATION (node));
493 pp_character (buffer, '[');
496 pp_string (buffer, xloc.file);
497 pp_string (buffer, " : ");
499 pp_decimal_int (buffer, xloc.line);
500 pp_string (buffer, "] ");
503 switch (TREE_CODE (node))
506 pp_string (buffer, "<<< error >>>");
509 case IDENTIFIER_NODE:
510 pp_tree_identifier (buffer, node);
514 while (node && node != error_mark_node)
516 if (TREE_PURPOSE (node))
518 dump_generic_node (buffer, TREE_PURPOSE (node), spc, flags, false);
521 dump_generic_node (buffer, TREE_VALUE (node), spc, flags, false);
522 node = TREE_CHAIN (node);
523 if (node && TREE_CODE (node) == TREE_LIST)
525 pp_character (buffer, ',');
532 dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
537 if (TREE_VEC_LENGTH (node) > 0)
539 size_t len = TREE_VEC_LENGTH (node);
540 for (i = 0; i < len - 1; i++)
542 dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags,
544 pp_character (buffer, ',');
547 dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc,
556 case FIXED_POINT_TYPE:
562 unsigned int quals = TYPE_QUALS (node);
563 enum tree_code_class class;
565 if (quals & TYPE_QUAL_CONST)
566 pp_string (buffer, "const ");
567 else if (quals & TYPE_QUAL_VOLATILE)
568 pp_string (buffer, "volatile ");
569 else if (quals & TYPE_QUAL_RESTRICT)
570 pp_string (buffer, "restrict ");
572 class = TREE_CODE_CLASS (TREE_CODE (node));
574 if (class == tcc_declaration)
576 if (DECL_NAME (node))
577 dump_decl_name (buffer, node, flags);
579 pp_string (buffer, "<unnamed type decl>");
581 else if (class == tcc_type)
583 if (TYPE_NAME (node))
585 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
586 pp_tree_identifier (buffer, TYPE_NAME (node));
587 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
588 && DECL_NAME (TYPE_NAME (node)))
589 dump_decl_name (buffer, TYPE_NAME (node), flags);
591 pp_string (buffer, "<unnamed type>");
593 else if (TREE_CODE (node) == VECTOR_TYPE)
595 pp_string (buffer, "vector ");
596 dump_generic_node (buffer, TREE_TYPE (node),
599 else if (TREE_CODE (node) == INTEGER_TYPE)
601 pp_string (buffer, (TYPE_UNSIGNED (node)
602 ? "<unnamed-unsigned:"
603 : "<unnamed-signed:"));
604 pp_decimal_int (buffer, TYPE_PRECISION (node));
605 pp_string (buffer, ">");
608 pp_string (buffer, "<unnamed type>");
615 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
617 if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
619 tree fnode = TREE_TYPE (node);
621 dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false);
623 pp_character (buffer, '(');
624 pp_string (buffer, str);
625 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
626 dump_decl_name (buffer, TYPE_NAME (node), flags);
628 pp_printf (buffer, "<T%x>", TYPE_UID (node));
630 pp_character (buffer, ')');
631 dump_function_declaration (buffer, fnode, spc, flags);
635 unsigned int quals = TYPE_QUALS (node);
637 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
639 pp_string (buffer, str);
641 if (quals & TYPE_QUAL_CONST)
642 pp_string (buffer, " const");
643 if (quals & TYPE_QUAL_VOLATILE)
644 pp_string (buffer, " volatile");
645 if (quals & TYPE_QUAL_RESTRICT)
646 pp_string (buffer, " restrict");
648 if (TYPE_REF_CAN_ALIAS_ALL (node))
649 pp_string (buffer, " {ref-all}");
658 dump_decl_name (buffer, TYPE_NAME (TYPE_METHOD_BASETYPE (node)), flags);
659 pp_string (buffer, "::");
664 const char *sep = "";
667 pp_string (buffer, "MEM[");
669 tmp = TMR_SYMBOL (node);
672 pp_string (buffer, sep);
674 pp_string (buffer, "symbol: ");
675 dump_generic_node (buffer, tmp, spc, flags, false);
677 tmp = TMR_BASE (node);
680 pp_string (buffer, sep);
682 pp_string (buffer, "base: ");
683 dump_generic_node (buffer, tmp, spc, flags, false);
685 tmp = TMR_INDEX (node);
688 pp_string (buffer, sep);
690 pp_string (buffer, "index: ");
691 dump_generic_node (buffer, tmp, spc, flags, false);
693 tmp = TMR_STEP (node);
696 pp_string (buffer, sep);
698 pp_string (buffer, "step: ");
699 dump_generic_node (buffer, tmp, spc, flags, false);
701 tmp = TMR_OFFSET (node);
704 pp_string (buffer, sep);
706 pp_string (buffer, "offset: ");
707 dump_generic_node (buffer, tmp, spc, flags, false);
709 pp_string (buffer, "]");
710 if (flags & TDF_DETAILS)
712 pp_string (buffer, "{");
713 dump_generic_node (buffer, TMR_ORIGINAL (node), spc, flags,
715 pp_string (buffer, "}");
724 /* Print the innermost component type. */
725 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
726 tmp = TREE_TYPE (tmp))
728 dump_generic_node (buffer, tmp, spc, flags, false);
730 /* Print the dimensions. */
731 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
732 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
738 case QUAL_UNION_TYPE:
740 unsigned int quals = TYPE_QUALS (node);
742 if (quals & TYPE_QUAL_CONST)
743 pp_string (buffer, "const ");
744 if (quals & TYPE_QUAL_VOLATILE)
745 pp_string (buffer, "volatile ");
747 /* Print the name of the structure. */
748 if (TREE_CODE (node) == RECORD_TYPE)
749 pp_string (buffer, "struct ");
750 else if (TREE_CODE (node) == UNION_TYPE)
751 pp_string (buffer, "union ");
753 if (TYPE_NAME (node))
754 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
756 print_struct_decl (buffer, node, spc, flags);
765 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
767 /* In the case of a pointer, one may want to divide by the
768 size of the pointed-to type. Unfortunately, this not
769 straightforward. The C front-end maps expressions
774 in such a way that the two INTEGER_CST nodes for "5" have
775 different values but identical types. In the latter
776 case, the 5 is multiplied by sizeof (int) in c-common.c
777 (pointer_int_sum) to convert it to a byte address, and
778 yet the type of the node is left unchanged. Argh. What
779 is consistent though is that the number value corresponds
780 to bytes (UNITS) offset.
782 NB: Neither of the following divisors can be trivially
783 used to recover the original literal:
785 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
786 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
787 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
788 pp_string (buffer, "B"); /* pseudo-unit */
790 else if (! host_integerp (node, 0))
793 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (val);
794 HOST_WIDE_INT high = TREE_INT_CST_HIGH (val);
796 if (tree_int_cst_sgn (val) < 0)
798 pp_character (buffer, '-');
802 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
804 sprintf (pp_buffer (buffer)->digit_buffer,
805 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
806 (unsigned HOST_WIDE_INT) high, low);
807 pp_string (buffer, pp_buffer (buffer)->digit_buffer);
810 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
814 /* Code copied from print_node. */
817 if (TREE_OVERFLOW (node))
818 pp_string (buffer, " overflow");
820 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
821 d = TREE_REAL_CST (node);
822 if (REAL_VALUE_ISINF (d))
823 pp_string (buffer, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
824 else if (REAL_VALUE_ISNAN (d))
825 pp_string (buffer, " Nan");
829 real_to_decimal (string, &d, sizeof (string), 0, 1);
830 pp_string (buffer, string);
835 unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
836 pp_string (buffer, "0x");
837 for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
838 output_formatted_integer (buffer, "%02x", *p++);
847 fixed_to_decimal (string, TREE_FIXED_CST_PTR (node), sizeof (string));
848 pp_string (buffer, string);
853 pp_string (buffer, "__complex__ (");
854 dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
855 pp_string (buffer, ", ");
856 dump_generic_node (buffer, TREE_IMAGPART (node), spc, flags, false);
857 pp_string (buffer, ")");
861 pp_string (buffer, "\"");
862 pretty_print_string (buffer, TREE_STRING_POINTER (node));
863 pp_string (buffer, "\"");
869 pp_string (buffer, "{ ");
870 for (elt = TREE_VECTOR_CST_ELTS (node); elt; elt = TREE_CHAIN (elt))
872 dump_generic_node (buffer, TREE_VALUE (elt), spc, flags, false);
873 if (TREE_CHAIN (elt))
874 pp_string (buffer, ", ");
876 pp_string (buffer, " }");
885 dump_decl_name (buffer, node, flags);
889 if (DECL_NAME (node))
890 dump_decl_name (buffer, node, flags);
891 else if (LABEL_DECL_UID (node) != -1)
892 pp_printf (buffer, "<L%d>", (int) LABEL_DECL_UID (node));
894 pp_printf (buffer, "<D.%u>", DECL_UID (node));
898 if (DECL_IS_BUILTIN (node))
900 /* Don't print the declaration of built-in types. */
903 if (DECL_NAME (node))
904 dump_decl_name (buffer, node, flags);
907 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
908 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
909 && TYPE_METHODS (TREE_TYPE (node)))
911 /* The type is a c++ class: all structures have at least
913 pp_string (buffer, "class ");
914 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
919 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
920 ? "union" : "struct "));
921 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
926 case SYMBOL_MEMORY_TAG:
927 case NAME_MEMORY_TAG:
932 case MEMORY_PARTITION_TAG:
933 dump_decl_name (buffer, node, flags);
937 pp_string (buffer, "<retval>");
941 op0 = TREE_OPERAND (node, 0);
943 if (TREE_CODE (op0) == INDIRECT_REF)
945 op0 = TREE_OPERAND (op0, 0);
948 if (op_prio (op0) < op_prio (node))
949 pp_character (buffer, '(');
950 dump_generic_node (buffer, op0, spc, flags, false);
951 if (op_prio (op0) < op_prio (node))
952 pp_character (buffer, ')');
953 pp_string (buffer, str);
954 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
956 if (TREE_CODE (op0) != VALUE_HANDLE)
958 op0 = component_ref_field_offset (node);
959 if (op0 && TREE_CODE (op0) != INTEGER_CST)
961 pp_string (buffer, "{off: ");
962 dump_generic_node (buffer, op0, spc, flags, false);
963 pp_character (buffer, '}');
969 pp_string (buffer, "BIT_FIELD_REF <");
970 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
971 pp_string (buffer, ", ");
972 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
973 pp_string (buffer, ", ");
974 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
975 pp_string (buffer, ">");
979 case ARRAY_RANGE_REF:
980 op0 = TREE_OPERAND (node, 0);
981 if (op_prio (op0) < op_prio (node))
982 pp_character (buffer, '(');
983 dump_generic_node (buffer, op0, spc, flags, false);
984 if (op_prio (op0) < op_prio (node))
985 pp_character (buffer, ')');
986 pp_character (buffer, '[');
987 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
988 if (TREE_CODE (node) == ARRAY_RANGE_REF)
989 pp_string (buffer, " ...");
990 pp_character (buffer, ']');
992 op0 = array_ref_low_bound (node);
993 op1 = array_ref_element_size (node);
995 if (!integer_zerop (op0)
996 || TREE_OPERAND (node, 2)
997 || TREE_OPERAND (node, 3))
999 pp_string (buffer, "{lb: ");
1000 dump_generic_node (buffer, op0, spc, flags, false);
1001 pp_string (buffer, " sz: ");
1002 dump_generic_node (buffer, op1, spc, flags, false);
1003 pp_character (buffer, '}');
1009 unsigned HOST_WIDE_INT ix;
1011 bool is_struct_init = FALSE;
1012 pp_character (buffer, '{');
1013 if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
1014 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
1015 is_struct_init = TRUE;
1016 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
1018 if (field && is_struct_init)
1020 pp_character (buffer, '.');
1021 dump_generic_node (buffer, field, spc, flags, false);
1022 pp_string (buffer, "=");
1024 if (val && TREE_CODE (val) == ADDR_EXPR)
1025 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
1026 val = TREE_OPERAND (val, 0);
1027 if (val && TREE_CODE (val) == FUNCTION_DECL)
1028 dump_decl_name (buffer, val, flags);
1030 dump_generic_node (buffer, val, spc, flags, false);
1031 if (ix != VEC_length (constructor_elt, CONSTRUCTOR_ELTS (node)) - 1)
1033 pp_character (buffer, ',');
1037 pp_character (buffer, '}');
1044 if (flags & TDF_SLIM)
1046 pp_string (buffer, "<COMPOUND_EXPR>");
1050 dump_generic_node (buffer, TREE_OPERAND (node, 0),
1051 spc, flags, !(flags & TDF_SLIM));
1052 if (flags & TDF_SLIM)
1053 newline_and_indent (buffer, spc);
1056 pp_character (buffer, ',');
1060 for (tp = &TREE_OPERAND (node, 1);
1061 TREE_CODE (*tp) == COMPOUND_EXPR;
1062 tp = &TREE_OPERAND (*tp, 1))
1064 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
1065 spc, flags, !(flags & TDF_SLIM));
1066 if (flags & TDF_SLIM)
1067 newline_and_indent (buffer, spc);
1070 pp_character (buffer, ',');
1075 dump_generic_node (buffer, *tp, spc, flags, !(flags & TDF_SLIM));
1079 case STATEMENT_LIST:
1081 tree_stmt_iterator si;
1084 if (flags & TDF_SLIM)
1086 pp_string (buffer, "<STATEMENT_LIST>");
1090 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
1093 newline_and_indent (buffer, spc);
1096 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
1102 case GIMPLE_MODIFY_STMT:
1104 dump_generic_node (buffer, GENERIC_TREE_OPERAND (node, 0), spc, flags,
1107 pp_character (buffer, '=');
1108 if (TREE_CODE (node) == GIMPLE_MODIFY_STMT
1109 && MOVE_NONTEMPORAL (node))
1110 pp_string (buffer, "{nt}");
1111 if (TREE_CODE (node) == GIMPLE_MODIFY_STMT)
1114 if ((ann = stmt_ann (node))
1115 && ann->has_volatile_ops)
1116 pp_string (buffer, "{v}");
1119 dump_generic_node (buffer, GENERIC_TREE_OPERAND (node, 1), spc, flags,
1124 pp_string (buffer, "TARGET_EXPR <");
1125 dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false);
1126 pp_character (buffer, ',');
1128 dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false);
1129 pp_character (buffer, '>');
1133 print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags);
1138 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
1140 pp_string (buffer, "if (");
1141 dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false);
1142 pp_character (buffer, ')');
1143 /* The lowered cond_exprs should always be printed in full. */
1144 if (COND_EXPR_THEN (node)
1145 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
1146 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
1147 && COND_EXPR_ELSE (node)
1148 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
1149 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
1152 dump_generic_node (buffer, COND_EXPR_THEN (node),
1154 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
1156 pp_string (buffer, " else ");
1157 dump_generic_node (buffer, COND_EXPR_ELSE (node),
1161 else if (!(flags & TDF_SLIM))
1163 /* Output COND_EXPR_THEN. */
1164 if (COND_EXPR_THEN (node))
1166 newline_and_indent (buffer, spc+2);
1167 pp_character (buffer, '{');
1168 newline_and_indent (buffer, spc+4);
1169 dump_generic_node (buffer, COND_EXPR_THEN (node), spc+4,
1171 newline_and_indent (buffer, spc+2);
1172 pp_character (buffer, '}');
1175 /* Output COND_EXPR_ELSE. */
1176 if (COND_EXPR_ELSE (node)
1177 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
1179 newline_and_indent (buffer, spc);
1180 pp_string (buffer, "else");
1181 newline_and_indent (buffer, spc+2);
1182 pp_character (buffer, '{');
1183 newline_and_indent (buffer, spc+4);
1184 dump_generic_node (buffer, COND_EXPR_ELSE (node), spc+4,
1186 newline_and_indent (buffer, spc+2);
1187 pp_character (buffer, '}');
1194 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1196 pp_character (buffer, '?');
1198 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1200 pp_character (buffer, ':');
1202 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1207 pp_character (buffer, '{');
1208 if (!(flags & TDF_SLIM))
1210 if (BIND_EXPR_VARS (node))
1212 pp_newline (buffer);
1214 for (op0 = BIND_EXPR_VARS (node); op0; op0 = TREE_CHAIN (op0))
1216 print_declaration (buffer, op0, spc+2, flags);
1217 pp_newline (buffer);
1221 newline_and_indent (buffer, spc+2);
1222 dump_generic_node (buffer, BIND_EXPR_BODY (node), spc+2, flags, true);
1223 newline_and_indent (buffer, spc);
1224 pp_character (buffer, '}');
1230 print_call_name (buffer, node);
1232 /* Print parameters. */
1234 pp_character (buffer, '(');
1237 call_expr_arg_iterator iter;
1238 FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
1240 dump_generic_node (buffer, arg, spc, flags, false);
1241 if (more_call_expr_args_p (&iter))
1243 pp_character (buffer, ',');
1248 if (CALL_EXPR_VA_ARG_PACK (node))
1250 if (call_expr_nargs (node) > 0)
1252 pp_character (buffer, ',');
1255 pp_string (buffer, "__builtin_va_arg_pack ()");
1257 pp_character (buffer, ')');
1259 op1 = CALL_EXPR_STATIC_CHAIN (node);
1262 pp_string (buffer, " [static-chain: ");
1263 dump_generic_node (buffer, op1, spc, flags, false);
1264 pp_character (buffer, ']');
1267 if (CALL_EXPR_RETURN_SLOT_OPT (node))
1268 pp_string (buffer, " [return slot optimization]");
1269 if (CALL_EXPR_TAILCALL (node))
1270 pp_string (buffer, " [tail call]");
1273 case WITH_CLEANUP_EXPR:
1277 case CLEANUP_POINT_EXPR:
1278 pp_string (buffer, "<<cleanup_point ");
1279 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1280 pp_string (buffer, ">>");
1283 case PLACEHOLDER_EXPR:
1284 pp_string (buffer, "<PLACEHOLDER_EXPR ");
1285 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1286 pp_character (buffer, '>');
1289 /* Binary arithmetic and logic expressions. */
1290 case WIDEN_SUM_EXPR:
1291 case WIDEN_MULT_EXPR:
1294 case POINTER_PLUS_EXPR:
1296 case TRUNC_DIV_EXPR:
1298 case FLOOR_DIV_EXPR:
1299 case ROUND_DIV_EXPR:
1300 case TRUNC_MOD_EXPR:
1302 case FLOOR_MOD_EXPR:
1303 case ROUND_MOD_EXPR:
1305 case EXACT_DIV_EXPR:
1310 case VEC_LSHIFT_EXPR:
1311 case VEC_RSHIFT_EXPR:
1315 case TRUTH_ANDIF_EXPR:
1316 case TRUTH_ORIF_EXPR:
1317 case TRUTH_AND_EXPR:
1319 case TRUTH_XOR_EXPR:
1333 case UNORDERED_EXPR:
1335 const char *op = op_symbol (node);
1336 op0 = TREE_OPERAND (node, 0);
1337 op1 = TREE_OPERAND (node, 1);
1339 /* When the operands are expressions with less priority,
1340 keep semantics of the tree representation. */
1341 if (op_prio (op0) <= op_prio (node))
1343 pp_character (buffer, '(');
1344 dump_generic_node (buffer, op0, spc, flags, false);
1345 pp_character (buffer, ')');
1348 dump_generic_node (buffer, op0, spc, flags, false);
1351 pp_string (buffer, op);
1354 /* When the operands are expressions with less priority,
1355 keep semantics of the tree representation. */
1356 if (op_prio (op1) <= op_prio (node))
1358 pp_character (buffer, '(');
1359 dump_generic_node (buffer, op1, spc, flags, false);
1360 pp_character (buffer, ')');
1363 dump_generic_node (buffer, op1, spc, flags, false);
1367 /* Unary arithmetic and logic expressions. */
1370 case TRUTH_NOT_EXPR:
1372 case PREDECREMENT_EXPR:
1373 case PREINCREMENT_EXPR:
1374 case ALIGN_INDIRECT_REF:
1375 case MISALIGNED_INDIRECT_REF:
1377 if (TREE_CODE (node) == ADDR_EXPR
1378 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
1379 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
1380 ; /* Do not output '&' for strings and function pointers. */
1382 pp_string (buffer, op_symbol (node));
1384 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1386 pp_character (buffer, '(');
1387 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1388 pp_character (buffer, ')');
1391 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1393 if (TREE_CODE (node) == MISALIGNED_INDIRECT_REF)
1395 pp_string (buffer, "{misalignment: ");
1396 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1397 pp_character (buffer, '}');
1401 case POSTDECREMENT_EXPR:
1402 case POSTINCREMENT_EXPR:
1403 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1405 pp_character (buffer, '(');
1406 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1407 pp_character (buffer, ')');
1410 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1411 pp_string (buffer, op_symbol (node));
1415 pp_string (buffer, "MIN_EXPR <");
1416 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1417 pp_string (buffer, ", ");
1418 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1419 pp_character (buffer, '>');
1423 pp_string (buffer, "MAX_EXPR <");
1424 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1425 pp_string (buffer, ", ");
1426 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1427 pp_character (buffer, '>');
1431 pp_string (buffer, "ABS_EXPR <");
1432 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1433 pp_character (buffer, '>');
1440 case FIXED_CONVERT_EXPR:
1441 case FIX_TRUNC_EXPR:
1444 type = TREE_TYPE (node);
1445 op0 = TREE_OPERAND (node, 0);
1446 if (type != TREE_TYPE (op0))
1448 pp_character (buffer, '(');
1449 dump_generic_node (buffer, type, spc, flags, false);
1450 pp_string (buffer, ") ");
1452 if (op_prio (op0) < op_prio (node))
1453 pp_character (buffer, '(');
1454 dump_generic_node (buffer, op0, spc, flags, false);
1455 if (op_prio (op0) < op_prio (node))
1456 pp_character (buffer, ')');
1459 case VIEW_CONVERT_EXPR:
1460 pp_string (buffer, "VIEW_CONVERT_EXPR<");
1461 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1462 pp_string (buffer, ">(");
1463 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1464 pp_character (buffer, ')');
1468 pp_string (buffer, "((");
1469 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1470 pp_string (buffer, "))");
1473 case NON_LVALUE_EXPR:
1474 pp_string (buffer, "NON_LVALUE_EXPR <");
1475 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1476 pp_character (buffer, '>');
1480 pp_string (buffer, "SAVE_EXPR <");
1481 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1482 pp_character (buffer, '>');
1486 pp_string (buffer, "COMPLEX_EXPR <");
1487 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1488 pp_string (buffer, ", ");
1489 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1490 pp_string (buffer, ">");
1494 pp_string (buffer, "CONJ_EXPR <");
1495 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1496 pp_string (buffer, ">");
1500 pp_string (buffer, "REALPART_EXPR <");
1501 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1502 pp_string (buffer, ">");
1506 pp_string (buffer, "IMAGPART_EXPR <");
1507 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1508 pp_string (buffer, ">");
1512 pp_string (buffer, "VA_ARG_EXPR <");
1513 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1514 pp_string (buffer, ">");
1517 case TRY_FINALLY_EXPR:
1518 case TRY_CATCH_EXPR:
1519 pp_string (buffer, "try");
1520 newline_and_indent (buffer, spc+2);
1521 pp_string (buffer, "{");
1522 newline_and_indent (buffer, spc+4);
1523 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc+4, flags, true);
1524 newline_and_indent (buffer, spc+2);
1525 pp_string (buffer, "}");
1526 newline_and_indent (buffer, spc);
1528 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
1529 newline_and_indent (buffer, spc+2);
1530 pp_string (buffer, "{");
1531 newline_and_indent (buffer, spc+4);
1532 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
1533 newline_and_indent (buffer, spc+2);
1534 pp_string (buffer, "}");
1539 pp_string (buffer, "catch (");
1540 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
1541 pp_string (buffer, ")");
1542 newline_and_indent (buffer, spc+2);
1543 pp_string (buffer, "{");
1544 newline_and_indent (buffer, spc+4);
1545 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
1546 newline_and_indent (buffer, spc+2);
1547 pp_string (buffer, "}");
1551 case EH_FILTER_EXPR:
1552 pp_string (buffer, "<<<eh_filter (");
1553 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
1554 pp_string (buffer, ")>>>");
1555 newline_and_indent (buffer, spc+2);
1556 pp_string (buffer, "{");
1557 newline_and_indent (buffer, spc+4);
1558 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
1559 newline_and_indent (buffer, spc+2);
1560 pp_string (buffer, "}");
1564 case CHANGE_DYNAMIC_TYPE_EXPR:
1565 pp_string (buffer, "<<<change_dynamic_type (");
1566 dump_generic_node (buffer, CHANGE_DYNAMIC_TYPE_NEW_TYPE (node), spc + 2,
1568 pp_string (buffer, ") ");
1569 dump_generic_node (buffer, CHANGE_DYNAMIC_TYPE_LOCATION (node), spc + 2,
1571 pp_string (buffer, ")>>>");
1576 op0 = TREE_OPERAND (node, 0);
1577 /* If this is for break or continue, don't bother printing it. */
1578 if (DECL_NAME (op0))
1580 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1581 if (strcmp (name, "break") == 0
1582 || strcmp (name, "continue") == 0)
1585 dump_generic_node (buffer, op0, spc, flags, false);
1586 pp_character (buffer, ':');
1587 if (DECL_NONLOCAL (op0))
1588 pp_string (buffer, " [non-local]");
1592 pp_string (buffer, "<<<exception object>>>");
1596 pp_string (buffer, "<<<filter object>>>");
1600 pp_string (buffer, "while (1)");
1601 if (!(flags & TDF_SLIM))
1603 newline_and_indent (buffer, spc+2);
1604 pp_character (buffer, '{');
1605 newline_and_indent (buffer, spc+4);
1606 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
1607 newline_and_indent (buffer, spc+2);
1608 pp_character (buffer, '}');
1614 pp_string (buffer, "// predicted ");
1615 if (PREDICT_EXPR_OUTCOME (node))
1616 pp_string (buffer, "likely by ");
1618 pp_string (buffer, "unlikely by ");
1619 pp_string (buffer, predictor_name (PREDICT_EXPR_PREDICTOR (node)));
1620 pp_string (buffer, " predictor.");
1624 pp_string (buffer, "return");
1625 op0 = TREE_OPERAND (node, 0);
1629 if (TREE_CODE (op0) == MODIFY_EXPR
1630 || TREE_CODE (op0) == GIMPLE_MODIFY_STMT)
1631 dump_generic_node (buffer, GENERIC_TREE_OPERAND (op0, 1),
1634 dump_generic_node (buffer, op0, spc, flags, false);
1639 pp_string (buffer, "if (");
1640 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1641 pp_string (buffer, ") break");
1645 pp_string (buffer, "switch (");
1646 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
1647 pp_character (buffer, ')');
1648 if (!(flags & TDF_SLIM))
1650 newline_and_indent (buffer, spc+2);
1651 pp_character (buffer, '{');
1652 if (SWITCH_BODY (node))
1654 newline_and_indent (buffer, spc+4);
1655 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags,
1660 tree vec = SWITCH_LABELS (node);
1661 size_t i, n = TREE_VEC_LENGTH (vec);
1662 for (i = 0; i < n; ++i)
1664 tree elt = TREE_VEC_ELT (vec, i);
1665 newline_and_indent (buffer, spc+4);
1668 dump_generic_node (buffer, elt, spc+4, flags, false);
1669 pp_string (buffer, " goto ");
1670 dump_generic_node (buffer, CASE_LABEL (elt), spc+4,
1672 pp_semicolon (buffer);
1675 pp_string (buffer, "case ???: goto ???;");
1678 newline_and_indent (buffer, spc+2);
1679 pp_character (buffer, '}');
1685 op0 = GOTO_DESTINATION (node);
1686 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
1688 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1689 if (strcmp (name, "break") == 0
1690 || strcmp (name, "continue") == 0)
1692 pp_string (buffer, name);
1696 pp_string (buffer, "goto ");
1697 dump_generic_node (buffer, op0, spc, flags, false);
1701 pp_string (buffer, "resx ");
1702 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1706 pp_string (buffer, "__asm__");
1707 if (ASM_VOLATILE_P (node))
1708 pp_string (buffer, " __volatile__");
1709 pp_character (buffer, '(');
1710 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
1711 pp_character (buffer, ':');
1712 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
1713 pp_character (buffer, ':');
1714 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
1715 if (ASM_CLOBBERS (node))
1717 pp_character (buffer, ':');
1718 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
1720 pp_string (buffer, ")");
1723 case CASE_LABEL_EXPR:
1724 if (CASE_LOW (node) && CASE_HIGH (node))
1726 pp_string (buffer, "case ");
1727 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1728 pp_string (buffer, " ... ");
1729 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
1731 else if (CASE_LOW (node))
1733 pp_string (buffer, "case ");
1734 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1737 pp_string (buffer, "default ");
1738 pp_character (buffer, ':');
1742 pp_string (buffer, "OBJ_TYPE_REF(");
1743 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
1744 pp_character (buffer, ';');
1745 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
1746 pp_character (buffer, '-');
1747 pp_character (buffer, '>');
1748 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
1749 pp_character (buffer, ')');
1756 dump_generic_node (buffer, PHI_RESULT (node), spc, flags, false);
1757 pp_string (buffer, " = PHI <");
1758 for (i = 0; i < PHI_NUM_ARGS (node); i++)
1760 dump_generic_node (buffer, PHI_ARG_DEF (node, i), spc, flags, false);
1761 pp_string (buffer, "(");
1762 pp_decimal_int (buffer, PHI_ARG_EDGE (node, i)->src->index);
1763 pp_string (buffer, ")");
1764 if (i < PHI_NUM_ARGS (node) - 1)
1765 pp_string (buffer, ", ");
1767 pp_string (buffer, ">");
1769 if (stmt_references_memory_p (node) && (flags & TDF_MEMSYMS))
1770 dump_symbols (buffer, STORED_SYMS (node), flags);
1775 dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
1776 pp_string (buffer, "_");
1777 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
1778 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
1779 pp_string (buffer, "(ab)");
1780 else if (SSA_NAME_IS_DEFAULT_DEF (node))
1781 pp_string (buffer, "(D)");
1784 case WITH_SIZE_EXPR:
1785 pp_string (buffer, "WITH_SIZE_EXPR <");
1786 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1787 pp_string (buffer, ", ");
1788 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1789 pp_string (buffer, ">");
1793 pp_printf (buffer, "VH.%d", VALUE_HANDLE_ID (node));
1797 pp_string (buffer, "ASSERT_EXPR <");
1798 dump_generic_node (buffer, ASSERT_EXPR_VAR (node), spc, flags, false);
1799 pp_string (buffer, ", ");
1800 dump_generic_node (buffer, ASSERT_EXPR_COND (node), spc, flags, false);
1801 pp_string (buffer, ">");
1805 pp_string (buffer, "scev_known");
1808 case SCEV_NOT_KNOWN:
1809 pp_string (buffer, "scev_not_known");
1812 case POLYNOMIAL_CHREC:
1813 pp_string (buffer, "{");
1814 dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
1815 pp_string (buffer, ", +, ");
1816 dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
1817 pp_string (buffer, "}_");
1818 dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
1822 case REALIGN_LOAD_EXPR:
1823 pp_string (buffer, "REALIGN_LOAD <");
1824 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1825 pp_string (buffer, ", ");
1826 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1827 pp_string (buffer, ", ");
1828 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1829 pp_string (buffer, ">");
1833 pp_string (buffer, " VEC_COND_EXPR < ");
1834 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1835 pp_string (buffer, " , ");
1836 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1837 pp_string (buffer, " , ");
1838 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1839 pp_string (buffer, " > ");
1843 pp_string (buffer, " DOT_PROD_EXPR < ");
1844 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1845 pp_string (buffer, ", ");
1846 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1847 pp_string (buffer, ", ");
1848 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1849 pp_string (buffer, " > ");
1853 pp_string (buffer, "#pragma omp parallel");
1854 dump_omp_clauses (buffer, OMP_PARALLEL_CLAUSES (node), spc, flags);
1855 if (OMP_PARALLEL_FN (node))
1857 pp_string (buffer, " [child fn: ");
1858 dump_generic_node (buffer, OMP_PARALLEL_FN (node), spc, flags, false);
1860 pp_string (buffer, " (");
1862 if (OMP_PARALLEL_DATA_ARG (node))
1863 dump_generic_node (buffer, OMP_PARALLEL_DATA_ARG (node), spc, flags,
1866 pp_string (buffer, "???");
1868 pp_string (buffer, ")]");
1872 if (!(flags & TDF_SLIM) && OMP_BODY (node))
1874 newline_and_indent (buffer, spc + 2);
1875 pp_character (buffer, '{');
1876 newline_and_indent (buffer, spc + 4);
1877 dump_generic_node (buffer, OMP_BODY (node), spc + 4, flags, false);
1878 newline_and_indent (buffer, spc + 2);
1879 pp_character (buffer, '}');
1885 pp_string (buffer, "#pragma omp task");
1886 dump_omp_clauses (buffer, OMP_TASK_CLAUSES (node), spc, flags);
1887 if (OMP_TASK_FN (node))
1889 pp_string (buffer, " [child fn: ");
1890 dump_generic_node (buffer, OMP_TASK_FN (node), spc, flags, false);
1892 pp_string (buffer, " (");
1894 if (OMP_TASK_DATA_ARG (node))
1895 dump_generic_node (buffer, OMP_TASK_DATA_ARG (node), spc, flags,
1898 pp_string (buffer, "???");
1900 pp_character (buffer, ')');
1901 if (OMP_TASK_COPYFN (node))
1903 pp_string (buffer, ", copy fn: ");
1904 dump_generic_node (buffer, OMP_TASK_COPYFN (node), spc,
1907 pp_character (buffer, ']');
1912 pp_string (buffer, "#pragma omp for");
1913 dump_omp_clauses (buffer, OMP_FOR_CLAUSES (node), spc, flags);
1915 if (!(flags & TDF_SLIM))
1919 if (OMP_FOR_PRE_BODY (node))
1921 newline_and_indent (buffer, spc + 2);
1922 pp_character (buffer, '{');
1924 newline_and_indent (buffer, spc);
1925 dump_generic_node (buffer, OMP_FOR_PRE_BODY (node),
1929 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (node)); i++)
1932 newline_and_indent (buffer, spc);
1933 pp_string (buffer, "for (");
1934 dump_generic_node (buffer, TREE_VEC_ELT (OMP_FOR_INIT (node), i),
1936 pp_string (buffer, "; ");
1937 dump_generic_node (buffer, TREE_VEC_ELT (OMP_FOR_COND (node), i),
1939 pp_string (buffer, "; ");
1940 dump_generic_node (buffer, TREE_VEC_ELT (OMP_FOR_INCR (node), i),
1942 pp_string (buffer, ")");
1944 if (OMP_FOR_BODY (node))
1946 newline_and_indent (buffer, spc + 2);
1947 pp_character (buffer, '{');
1948 newline_and_indent (buffer, spc + 4);
1949 dump_generic_node (buffer, OMP_FOR_BODY (node), spc + 4, flags,
1951 newline_and_indent (buffer, spc + 2);
1952 pp_character (buffer, '}');
1954 spc -= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node)) - 2;
1955 if (OMP_FOR_PRE_BODY (node))
1958 newline_and_indent (buffer, spc + 2);
1959 pp_character (buffer, '}');
1966 pp_string (buffer, "#pragma omp sections");
1967 if (OMP_SECTIONS_CONTROL (node))
1969 pp_string (buffer, " <");
1970 dump_generic_node (buffer, OMP_SECTIONS_CONTROL (node), spc,
1972 pp_string (buffer, ">");
1974 dump_omp_clauses (buffer, OMP_SECTIONS_CLAUSES (node), spc, flags);
1977 case OMP_SECTIONS_SWITCH:
1978 pp_string (buffer, "OMP_SECTIONS_SWITCH");
1983 pp_string (buffer, "#pragma omp section");
1987 pp_string (buffer, "#pragma omp master");
1991 pp_string (buffer, "#pragma omp ordered");
1995 pp_string (buffer, "#pragma omp critical");
1996 if (OMP_CRITICAL_NAME (node))
1999 pp_character (buffer, '(');
2000 dump_generic_node (buffer, OMP_CRITICAL_NAME (node), spc,
2002 pp_character (buffer, ')');
2007 pp_string (buffer, "#pragma omp atomic");
2008 newline_and_indent (buffer, spc + 2);
2009 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2011 pp_character (buffer, '=');
2013 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2016 case OMP_ATOMIC_LOAD:
2017 pp_string (buffer, "#pragma omp atomic_load");
2018 newline_and_indent (buffer, spc + 2);
2019 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2021 pp_character (buffer, '=');
2023 pp_character (buffer, '*');
2024 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2027 case OMP_ATOMIC_STORE:
2028 pp_string (buffer, "#pragma omp atomic_store (");
2029 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2030 pp_character (buffer, ')');
2034 pp_string (buffer, "#pragma omp single");
2035 dump_omp_clauses (buffer, OMP_SINGLE_CLAUSES (node), spc, flags);
2039 pp_string (buffer, "OMP_RETURN");
2040 if (OMP_RETURN_NOWAIT (node))
2041 pp_string (buffer, " [nowait]");
2046 pp_string (buffer, "OMP_CONTINUE <");
2047 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2048 pp_string (buffer, " <- ");
2049 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2050 pp_string (buffer, ">");
2055 dump_omp_clause (buffer, node, spc, flags);
2059 case REDUC_MAX_EXPR:
2060 pp_string (buffer, " REDUC_MAX_EXPR < ");
2061 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2062 pp_string (buffer, " > ");
2065 case REDUC_MIN_EXPR:
2066 pp_string (buffer, " REDUC_MIN_EXPR < ");
2067 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2068 pp_string (buffer, " > ");
2071 case REDUC_PLUS_EXPR:
2072 pp_string (buffer, " REDUC_PLUS_EXPR < ");
2073 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2074 pp_string (buffer, " > ");
2077 case VEC_WIDEN_MULT_HI_EXPR:
2078 pp_string (buffer, " VEC_WIDEN_MULT_HI_EXPR < ");
2079 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2080 pp_string (buffer, ", ");
2081 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2082 pp_string (buffer, " > ");
2085 case VEC_WIDEN_MULT_LO_EXPR:
2086 pp_string (buffer, " VEC_WIDEN_MULT_LO_EXPR < ");
2087 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2088 pp_string (buffer, ", ");
2089 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2090 pp_string (buffer, " > ");
2093 case VEC_UNPACK_HI_EXPR:
2094 pp_string (buffer, " VEC_UNPACK_HI_EXPR < ");
2095 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2096 pp_string (buffer, " > ");
2099 case VEC_UNPACK_LO_EXPR:
2100 pp_string (buffer, " VEC_UNPACK_LO_EXPR < ");
2101 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2102 pp_string (buffer, " > ");
2105 case VEC_UNPACK_FLOAT_HI_EXPR:
2106 pp_string (buffer, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2107 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2108 pp_string (buffer, " > ");
2111 case VEC_UNPACK_FLOAT_LO_EXPR:
2112 pp_string (buffer, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2113 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2114 pp_string (buffer, " > ");
2117 case VEC_PACK_TRUNC_EXPR:
2118 pp_string (buffer, " VEC_PACK_TRUNC_EXPR < ");
2119 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2120 pp_string (buffer, ", ");
2121 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2122 pp_string (buffer, " > ");
2125 case VEC_PACK_SAT_EXPR:
2126 pp_string (buffer, " VEC_PACK_SAT_EXPR < ");
2127 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2128 pp_string (buffer, ", ");
2129 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2130 pp_string (buffer, " > ");
2133 case VEC_PACK_FIX_TRUNC_EXPR:
2134 pp_string (buffer, " VEC_PACK_FIX_TRUNC_EXPR < ");
2135 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2136 pp_string (buffer, ", ");
2137 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2138 pp_string (buffer, " > ");
2144 pp_string (buffer, "BLOCK");
2146 if (BLOCK_ABSTRACT (node))
2147 pp_string (buffer, " [abstract]");
2149 if (TREE_ASM_WRITTEN (node))
2150 pp_string (buffer, " [written]");
2152 newline_and_indent (buffer, spc + 2);
2154 if (BLOCK_SUPERCONTEXT (node))
2156 pp_string (buffer, "SUPERCONTEXT: ");
2157 if (TREE_CODE (BLOCK_SUPERCONTEXT (node)) == BLOCK)
2158 pp_printf (buffer, "BLOCK %p",
2159 (void *)BLOCK_SUPERCONTEXT (node));
2161 dump_generic_node (buffer, BLOCK_SUPERCONTEXT (node), 0, flags,
2163 newline_and_indent (buffer, spc + 2);
2166 if (BLOCK_SUBBLOCKS (node))
2168 pp_string (buffer, "SUBBLOCKS: ");
2169 for (t = BLOCK_SUBBLOCKS (node); t; t = BLOCK_CHAIN (t))
2170 pp_printf (buffer, "%p ", (void *)t);
2171 newline_and_indent (buffer, spc + 2);
2174 if (BLOCK_VARS (node))
2176 pp_string (buffer, "VARS: ");
2177 for (t = BLOCK_VARS (node); t; t = TREE_CHAIN (t))
2179 dump_generic_node (buffer, t, 0, flags, false);
2180 pp_string (buffer, " ");
2182 newline_and_indent (buffer, spc + 2);
2185 if (BLOCK_ABSTRACT_ORIGIN (node))
2187 pp_string (buffer, "ABSTRACT_ORIGIN: ");
2188 if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node)) == BLOCK)
2189 pp_printf (buffer, "BLOCK %p",
2190 (void *)BLOCK_ABSTRACT_ORIGIN (node));
2192 dump_generic_node (buffer, BLOCK_ABSTRACT_ORIGIN (node), 0, flags,
2194 newline_and_indent (buffer, spc + 2);
2199 case VEC_EXTRACT_EVEN_EXPR:
2200 pp_string (buffer, " VEC_EXTRACT_EVEN_EXPR < ");
2201 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2202 pp_string (buffer, ", ");
2203 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2204 pp_string (buffer, " > ");
2207 case VEC_EXTRACT_ODD_EXPR:
2208 pp_string (buffer, " VEC_EXTRACT_ODD_EXPR < ");
2209 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2210 pp_string (buffer, ", ");
2211 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2212 pp_string (buffer, " > ");
2215 case VEC_INTERLEAVE_HIGH_EXPR:
2216 pp_string (buffer, " VEC_INTERLEAVE_HIGH_EXPR < ");
2217 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2218 pp_string (buffer, ", ");
2219 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2220 pp_string (buffer, " > ");
2223 case VEC_INTERLEAVE_LOW_EXPR:
2224 pp_string (buffer, " VEC_INTERLEAVE_LOW_EXPR < ");
2225 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2226 pp_string (buffer, ", ");
2227 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2228 pp_string (buffer, " > ");
2235 if (is_stmt && is_expr)
2236 pp_semicolon (buffer);
2238 /* If we're building a diagnostic, the formatted text will be written
2239 into BUFFER's stream by the caller; otherwise, write it now. */
2240 if (!(flags & TDF_DIAGNOSTIC))
2241 pp_write_text_to_stream (buffer);
2246 /* Print the declaration of a variable. */
2249 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
2253 if (TREE_CODE (t) == TYPE_DECL)
2254 pp_string (buffer, "typedef ");
2256 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
2257 pp_string (buffer, "register ");
2259 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
2260 pp_string (buffer, "extern ");
2261 else if (TREE_STATIC (t))
2262 pp_string (buffer, "static ");
2264 /* Print the type and name. */
2265 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
2269 /* Print array's type. */
2270 tmp = TREE_TYPE (t);
2271 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
2272 tmp = TREE_TYPE (tmp);
2273 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
2275 /* Print variable's name. */
2277 dump_generic_node (buffer, t, spc, flags, false);
2279 /* Print the dimensions. */
2280 tmp = TREE_TYPE (t);
2281 while (TREE_CODE (tmp) == ARRAY_TYPE)
2283 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
2284 tmp = TREE_TYPE (tmp);
2287 else if (TREE_CODE (t) == FUNCTION_DECL)
2289 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
2291 dump_decl_name (buffer, t, flags);
2292 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
2296 /* Print type declaration. */
2297 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
2299 /* Print variable's name. */
2301 dump_generic_node (buffer, t, spc, flags, false);
2304 if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
2306 pp_string (buffer, " __asm__ ");
2307 pp_character (buffer, '(');
2308 dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
2309 pp_character (buffer, ')');
2312 /* The initial value of a function serves to determine whether the function
2313 is declared or defined. So the following does not apply to function
2315 if (TREE_CODE (t) != FUNCTION_DECL)
2317 /* Print the initial value. */
2318 if (DECL_INITIAL (t))
2321 pp_character (buffer, '=');
2323 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
2327 if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
2329 pp_string (buffer, " [value-expr: ");
2330 dump_generic_node (buffer, DECL_VALUE_EXPR (t), spc, flags, false);
2331 pp_character (buffer, ']');
2334 pp_character (buffer, ';');
2338 /* Prints a structure: name, fields, and methods.
2339 FIXME: Still incomplete. */
2342 print_struct_decl (pretty_printer *buffer, const_tree node, int spc, int flags)
2344 /* Print the name of the structure. */
2345 if (TYPE_NAME (node))
2348 if (TREE_CODE (node) == RECORD_TYPE)
2349 pp_string (buffer, "struct ");
2350 else if ((TREE_CODE (node) == UNION_TYPE
2351 || TREE_CODE (node) == QUAL_UNION_TYPE))
2352 pp_string (buffer, "union ");
2354 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
2357 /* Print the contents of the structure. */
2358 pp_newline (buffer);
2360 pp_character (buffer, '{');
2361 pp_newline (buffer);
2363 /* Print the fields of the structure. */
2366 tmp = TYPE_FIELDS (node);
2369 /* Avoid to print recursively the structure. */
2370 /* FIXME : Not implemented correctly...,
2371 what about the case when we have a cycle in the contain graph? ...
2372 Maybe this could be solved by looking at the scope in which the
2373 structure was declared. */
2374 if (TREE_TYPE (tmp) != node
2375 || (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
2376 && TREE_TYPE (TREE_TYPE (tmp)) != node))
2378 print_declaration (buffer, tmp, spc+2, flags);
2379 pp_newline (buffer);
2381 tmp = TREE_CHAIN (tmp);
2385 pp_character (buffer, '}');
2388 /* Return the priority of the operator OP.
2390 From lowest to highest precedence with either left-to-right (L-R)
2391 or right-to-left (R-L) associativity]:
2394 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2406 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2407 15 [L-R] fn() [] -> .
2409 unary +, - and * have higher precedence than the corresponding binary
2413 op_prio (const_tree op)
2418 switch (TREE_CODE (op))
2426 case GIMPLE_MODIFY_STMT:
2434 case TRUTH_ORIF_EXPR:
2437 case TRUTH_AND_EXPR:
2438 case TRUTH_ANDIF_EXPR:
2445 case TRUTH_XOR_EXPR:
2462 case UNORDERED_EXPR:
2475 case WIDEN_SUM_EXPR:
2477 case POINTER_PLUS_EXPR:
2481 case VEC_WIDEN_MULT_HI_EXPR:
2482 case VEC_WIDEN_MULT_LO_EXPR:
2483 case WIDEN_MULT_EXPR:
2486 case TRUNC_DIV_EXPR:
2488 case FLOOR_DIV_EXPR:
2489 case ROUND_DIV_EXPR:
2491 case EXACT_DIV_EXPR:
2492 case TRUNC_MOD_EXPR:
2494 case FLOOR_MOD_EXPR:
2495 case ROUND_MOD_EXPR:
2498 case TRUTH_NOT_EXPR:
2500 case POSTINCREMENT_EXPR:
2501 case POSTDECREMENT_EXPR:
2502 case PREINCREMENT_EXPR:
2503 case PREDECREMENT_EXPR:
2505 case ALIGN_INDIRECT_REF:
2506 case MISALIGNED_INDIRECT_REF:
2511 case FIX_TRUNC_EXPR:
2517 case ARRAY_RANGE_REF:
2521 /* Special expressions. */
2527 case REDUC_MAX_EXPR:
2528 case REDUC_MIN_EXPR:
2529 case REDUC_PLUS_EXPR:
2530 case VEC_LSHIFT_EXPR:
2531 case VEC_RSHIFT_EXPR:
2532 case VEC_UNPACK_HI_EXPR:
2533 case VEC_UNPACK_LO_EXPR:
2534 case VEC_UNPACK_FLOAT_HI_EXPR:
2535 case VEC_UNPACK_FLOAT_LO_EXPR:
2536 case VEC_PACK_TRUNC_EXPR:
2537 case VEC_PACK_SAT_EXPR:
2541 case NON_LVALUE_EXPR:
2542 return op_prio (TREE_OPERAND (op, 0));
2545 /* Return an arbitrarily high precedence to avoid surrounding single
2546 VAR_DECLs in ()s. */
2552 /* Return the symbol associated with operator CODE. */
2555 op_symbol_code (enum tree_code code)
2560 case GIMPLE_MODIFY_STMT:
2564 case TRUTH_ORIF_EXPR:
2567 case TRUTH_AND_EXPR:
2568 case TRUTH_ANDIF_EXPR:
2574 case TRUTH_XOR_EXPR:
2584 case UNORDERED_EXPR:
2630 case VEC_LSHIFT_EXPR:
2633 case VEC_RSHIFT_EXPR:
2636 case POINTER_PLUS_EXPR:
2642 case REDUC_PLUS_EXPR:
2645 case WIDEN_SUM_EXPR:
2648 case WIDEN_MULT_EXPR:
2658 case TRUTH_NOT_EXPR:
2665 case ALIGN_INDIRECT_REF:
2668 case MISALIGNED_INDIRECT_REF:
2671 case TRUNC_DIV_EXPR:
2678 case FLOOR_DIV_EXPR:
2681 case ROUND_DIV_EXPR:
2684 case EXACT_DIV_EXPR:
2687 case TRUNC_MOD_EXPR:
2693 case FLOOR_MOD_EXPR:
2696 case ROUND_MOD_EXPR:
2699 case PREDECREMENT_EXPR:
2702 case PREINCREMENT_EXPR:
2705 case POSTDECREMENT_EXPR:
2708 case POSTINCREMENT_EXPR:
2718 return "<<< ??? >>>";
2722 /* Return the symbol associated with operator OP. */
2725 op_symbol (const_tree op)
2727 return op_symbol_code (TREE_CODE (op));
2730 /* Prints the name of a CALL_EXPR. */
2733 print_call_name (pretty_printer *buffer, const_tree node)
2737 gcc_assert (TREE_CODE (node) == CALL_EXPR);
2739 op0 = CALL_EXPR_FN (node);
2741 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
2742 op0 = TREE_OPERAND (op0, 0);
2744 switch (TREE_CODE (op0))
2748 dump_function_name (buffer, op0);
2754 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2758 pp_string (buffer, "(");
2759 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2760 pp_string (buffer, ") ? ");
2761 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, 0, false);
2762 pp_string (buffer, " : ");
2763 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, 0, false);
2767 /* The function is a pointer contained in a structure. */
2768 if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
2769 TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2770 dump_function_name (buffer, TREE_OPERAND (op0, 1));
2772 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2774 We can have several levels of structures and a function
2775 pointer inside. This is not implemented yet... */
2780 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2781 dump_function_name (buffer, TREE_OPERAND (op0, 0));
2783 dump_generic_node (buffer, op0, 0, 0, false);
2788 dump_generic_node (buffer, op0, 0, 0, false);
2796 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2799 pretty_print_string (pretty_printer *buffer, const char *str)
2809 pp_string (buffer, "\\b");
2813 pp_string (buffer, "\\f");
2817 pp_string (buffer, "\\n");
2821 pp_string (buffer, "\\r");
2825 pp_string (buffer, "\\t");
2829 pp_string (buffer, "\\v");
2833 pp_string (buffer, "\\\\");
2837 pp_string (buffer, "\\\"");
2841 pp_string (buffer, "\\'");
2844 /* No need to handle \0; the loop terminates on \0. */
2847 pp_string (buffer, "\\1");
2851 pp_string (buffer, "\\2");
2855 pp_string (buffer, "\\3");
2859 pp_string (buffer, "\\4");
2863 pp_string (buffer, "\\5");
2867 pp_string (buffer, "\\6");
2871 pp_string (buffer, "\\7");
2875 pp_character (buffer, str[0]);
2883 maybe_init_pretty_print (FILE *file)
2887 pp_construct (&buffer, /* prefix */NULL, /* line-width */0);
2888 pp_needs_newline (&buffer) = true;
2892 buffer.buffer->stream = file;
2896 newline_and_indent (pretty_printer *buffer, int spc)
2898 pp_newline (buffer);
2904 dump_vops (pretty_printer *buffer, tree stmt, int spc, int flags)
2906 struct voptype_d *vdefs;
2907 struct voptype_d *vuses;
2910 if (!ssa_operands_active () || !stmt_references_memory_p (stmt))
2913 /* Even if the statement doesn't have virtual operators yet, it may
2914 contain symbol information (this happens before aliases have been
2916 if ((flags & TDF_MEMSYMS)
2917 && VUSE_OPS (stmt) == NULL
2918 && VDEF_OPS (stmt) == NULL)
2920 if (LOADED_SYMS (stmt))
2922 pp_string (buffer, "# LOADS: ");
2923 dump_symbols (buffer, LOADED_SYMS (stmt), flags);
2924 newline_and_indent (buffer, spc);
2927 if (STORED_SYMS (stmt))
2929 pp_string (buffer, "# STORES: ");
2930 dump_symbols (buffer, STORED_SYMS (stmt), flags);
2931 newline_and_indent (buffer, spc);
2937 vuses = VUSE_OPS (stmt);
2940 pp_string (buffer, "# VUSE <");
2942 n = VUSE_NUM (vuses);
2943 for (i = 0; i < n; i++)
2945 dump_generic_node (buffer, VUSE_OP (vuses, i), spc + 2, flags, false);
2947 pp_string (buffer, ", ");
2950 pp_string (buffer, ">");
2952 if (flags & TDF_MEMSYMS)
2953 dump_symbols (buffer, LOADED_SYMS (stmt), flags);
2955 newline_and_indent (buffer, spc);
2956 vuses = vuses->next;
2959 vdefs = VDEF_OPS (stmt);
2962 pp_string (buffer, "# ");
2963 dump_generic_node (buffer, VDEF_RESULT (vdefs), spc + 2, flags, false);
2964 pp_string (buffer, " = VDEF <");
2966 n = VDEF_NUM (vdefs);
2967 for (i = 0; i < n; i++)
2969 dump_generic_node (buffer, VDEF_OP (vdefs, i), spc + 2, flags, 0);
2971 pp_string (buffer, ", ");
2974 pp_string (buffer, ">");
2976 if ((flags & TDF_MEMSYMS) && vdefs->next == NULL)
2977 dump_symbols (buffer, STORED_SYMS (stmt), flags);
2979 newline_and_indent (buffer, spc);
2980 vdefs = vdefs->next;
2985 /* Dumps basic block BB to FILE with details described by FLAGS and
2986 indented by INDENT spaces. */
2989 dump_generic_bb (FILE *file, basic_block bb, int indent, int flags)
2991 maybe_init_pretty_print (file);
2992 dump_generic_bb_buff (&buffer, bb, indent, flags);
2996 /* Dumps header of basic block BB to buffer BUFFER indented by INDENT
2997 spaces and details described by flags. */
3000 dump_bb_header (pretty_printer *buffer, basic_block bb, int indent, int flags)
3006 if (flags & TDF_BLOCKS)
3009 pp_string (buffer, "# BLOCK ");
3010 pp_decimal_int (buffer, bb->index);
3013 pp_string (buffer, " freq:");
3014 pp_decimal_int (buffer, bb->frequency);
3018 pp_string (buffer, " count:");
3019 pp_widest_integer (buffer, bb->count);
3022 if (flags & TDF_LINENO)
3024 block_stmt_iterator bsi;
3026 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3027 if (get_lineno (bsi_stmt (bsi)) != -1)
3029 pp_string (buffer, ", starting at line ");
3030 pp_decimal_int (buffer, get_lineno (bsi_stmt (bsi)));
3034 newline_and_indent (buffer, indent);
3036 pp_string (buffer, "# PRED:");
3037 pp_write_text_to_stream (buffer);
3038 FOR_EACH_EDGE (e, ei, bb->preds)
3039 if (flags & TDF_SLIM)
3041 pp_string (buffer, " ");
3042 if (e->src == ENTRY_BLOCK_PTR)
3043 pp_string (buffer, "ENTRY");
3045 pp_decimal_int (buffer, e->src->index);
3048 dump_edge_info (buffer->buffer->stream, e, 0);
3049 pp_newline (buffer);
3053 stmt = first_stmt (bb);
3054 if (!stmt || TREE_CODE (stmt) != LABEL_EXPR)
3056 INDENT (indent - 2);
3057 pp_string (buffer, "<bb ");
3058 pp_decimal_int (buffer, bb->index);
3059 pp_string (buffer, ">:");
3060 pp_newline (buffer);
3063 pp_write_text_to_stream (buffer);
3064 check_bb_profile (bb, buffer->buffer->stream);
3067 /* Dumps end of basic block BB to buffer BUFFER indented by INDENT
3071 dump_bb_end (pretty_printer *buffer, basic_block bb, int indent, int flags)
3077 pp_string (buffer, "# SUCC:");
3078 pp_write_text_to_stream (buffer);
3079 FOR_EACH_EDGE (e, ei, bb->succs)
3080 if (flags & TDF_SLIM)
3082 pp_string (buffer, " ");
3083 if (e->dest == EXIT_BLOCK_PTR)
3084 pp_string (buffer, "EXIT");
3086 pp_decimal_int (buffer, e->dest->index);
3089 dump_edge_info (buffer->buffer->stream, e, 1);
3090 pp_newline (buffer);
3093 /* Dump PHI nodes of basic block BB to BUFFER with details described
3094 by FLAGS and indented by INDENT spaces. */
3097 dump_phi_nodes (pretty_printer *buffer, basic_block bb, int indent, int flags)
3099 tree phi = phi_nodes (bb);
3103 for (; phi; phi = PHI_CHAIN (phi))
3105 if (is_gimple_reg (PHI_RESULT (phi)) || (flags & TDF_VOPS))
3108 pp_string (buffer, "# ");
3109 dump_generic_node (buffer, phi, indent, flags, false);
3110 pp_newline (buffer);
3111 if (flags & TDF_VERBOSE)
3112 print_node (buffer->buffer->stream, "", phi, indent);
3118 /* Dump jump to basic block BB that is represented implicitly in the cfg
3122 pp_cfg_jump (pretty_printer *buffer, basic_block bb)
3126 stmt = first_stmt (bb);
3128 pp_string (buffer, "goto <bb ");
3129 pp_decimal_int (buffer, bb->index);
3130 pp_string (buffer, ">");
3131 if (stmt && TREE_CODE (stmt) == LABEL_EXPR)
3133 pp_string (buffer, " (");
3134 dump_generic_node (buffer, LABEL_EXPR_LABEL (stmt), 0, 0, false);
3135 pp_string (buffer, ")");
3137 pp_semicolon (buffer);
3140 /* Dump edges represented implicitly in basic block BB to BUFFER, indented
3141 by INDENT spaces, with details given by FLAGS. */
3144 dump_implicit_edges (pretty_printer *buffer, basic_block bb, int indent,
3151 stmt = last_stmt (bb);
3152 if (stmt && TREE_CODE (stmt) == COND_EXPR)
3154 edge true_edge, false_edge;
3156 /* When we are emitting the code or changing CFG, it is possible that
3157 the edges are not yet created. When we are using debug_bb in such
3158 a situation, we do not want it to crash. */
3159 if (EDGE_COUNT (bb->succs) != 2)
3161 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
3163 INDENT (indent + 2);
3164 pp_cfg_jump (buffer, true_edge->dest);
3165 newline_and_indent (buffer, indent);
3166 pp_string (buffer, "else");
3167 newline_and_indent (buffer, indent + 2);
3168 pp_cfg_jump (buffer, false_edge->dest);
3169 pp_newline (buffer);
3173 /* If there is a fallthru edge, we may need to add an artificial goto to the
3175 FOR_EACH_EDGE (e, ei, bb->succs)
3176 if (e->flags & EDGE_FALLTHRU)
3178 if (e && e->dest != bb->next_bb)
3182 if ((flags & TDF_LINENO) && e->goto_locus != UNKNOWN_LOCATION)
3184 expanded_location goto_xloc;
3185 goto_xloc = expand_location (e->goto_locus);
3186 pp_character (buffer, '[');
3189 pp_string (buffer, goto_xloc.file);
3190 pp_string (buffer, " : ");
3192 pp_decimal_int (buffer, goto_xloc.line);
3193 pp_string (buffer, "] ");
3196 pp_cfg_jump (buffer, e->dest);
3197 pp_newline (buffer);
3201 /* Dumps basic block BB to buffer BUFFER with details described by FLAGS and
3202 indented by INDENT spaces. */
3205 dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
3206 int indent, int flags)
3208 block_stmt_iterator bsi;
3210 int label_indent = indent - 2;
3212 if (label_indent < 0)
3215 dump_bb_header (buffer, bb, indent, flags);
3217 dump_phi_nodes (buffer, bb, indent, flags);
3219 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
3223 stmt = bsi_stmt (bsi);
3225 curr_indent = TREE_CODE (stmt) == LABEL_EXPR ? label_indent : indent;
3227 INDENT (curr_indent);
3228 dump_generic_node (buffer, stmt, curr_indent, flags, true);
3229 pp_newline (buffer);
3230 dump_histograms_for_stmt (cfun, buffer->buffer->stream, stmt);
3231 if (flags & TDF_VERBOSE)
3232 print_node (buffer->buffer->stream, "", stmt, curr_indent);
3235 dump_implicit_edges (buffer, bb, indent, flags);
3237 if (flags & TDF_BLOCKS)
3238 dump_bb_end (buffer, bb, indent, flags);