1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
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 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_struct_decl (pretty_printer *, const_tree, int, int);
47 static void do_niy (pretty_printer *, const_tree);
49 #define INDENT(SPACE) do { \
50 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
52 #define NIY do_niy(buffer,node)
54 #define PRINT_FUNCTION_NAME(NODE) pp_printf \
55 (buffer, "%s", TREE_CODE (NODE) == NOP_EXPR ? \
56 lang_hooks.decl_printable_name (TREE_OPERAND (NODE, 0), 1) : \
57 lang_hooks.decl_printable_name (NODE, 1))
59 static pretty_printer buffer;
60 static int initialized = 0;
62 /* Try to print something for an unknown tree code. */
65 do_niy (pretty_printer *buffer, const_tree node)
69 pp_string (buffer, "<<< Unknown tree: ");
70 pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
74 len = TREE_OPERAND_LENGTH (node);
75 for (i = 0; i < len; ++i)
77 newline_and_indent (buffer, 2);
78 dump_generic_node (buffer, TREE_OPERAND (node, i), 2, 0, false);
82 pp_string (buffer, " >>>\n");
85 /* Debugging function to print out a generic expression. */
88 debug_generic_expr (tree t)
90 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS);
91 fprintf (stderr, "\n");
94 /* Debugging function to print out a generic statement. */
97 debug_generic_stmt (tree t)
99 print_generic_stmt (stderr, t, TDF_VOPS|TDF_MEMSYMS);
100 fprintf (stderr, "\n");
103 /* Debugging function to print out a chain of trees . */
106 debug_tree_chain (tree t)
110 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
111 fprintf(stderr, " ");
114 fprintf (stderr, "\n");
117 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
119 print_generic_decl (FILE *file, tree decl, int flags)
121 maybe_init_pretty_print (file);
122 print_declaration (&buffer, decl, 2, flags);
123 pp_write_text_to_stream (&buffer);
126 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
127 to show in the dump. See TDF_* in tree-pass.h. */
130 print_generic_stmt (FILE *file, tree t, int flags)
132 maybe_init_pretty_print (file);
133 dump_generic_node (&buffer, t, 0, flags, true);
137 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
138 to show in the dump. See TDF_* in tree-pass.h. The output is indented by
142 print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
146 maybe_init_pretty_print (file);
148 for (i = 0; i < indent; i++)
150 dump_generic_node (&buffer, t, indent, flags, true);
154 /* Print a single expression T on file FILE. FLAGS specifies details to show
155 in the dump. See TDF_* in tree-pass.h. */
158 print_generic_expr (FILE *file, tree t, int flags)
160 maybe_init_pretty_print (file);
161 dump_generic_node (&buffer, t, 0, flags, false);
164 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
168 dump_decl_name (pretty_printer *buffer, tree node, int flags)
173 pp_tree_identifier (buffer, DECL_NAME (t));
174 if ((flags & TDF_UID)
175 || DECL_NAME (t) == NULL_TREE)
177 if (TREE_CODE (t) == LABEL_DECL
178 && LABEL_DECL_UID (t) != -1)
179 pp_printf (buffer, "L.%d", (int) LABEL_DECL_UID (t));
182 char c = TREE_CODE (t) == CONST_DECL ? 'C' : 'D';
183 pp_printf (buffer, "%c.%u", c, DECL_UID (t));
188 /* Like the above, but used for pretty printing function calls. */
191 dump_function_name (pretty_printer *buffer, tree node)
193 if (DECL_NAME (node))
194 PRINT_FUNCTION_NAME (node);
196 dump_decl_name (buffer, node, 0);
199 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
200 FLAGS are as in dump_generic_node. */
203 dump_function_declaration (pretty_printer *buffer, tree node,
206 bool wrote_arg = false;
210 pp_character (buffer, '(');
212 /* Print the argument types. The last element in the list is a VOID_TYPE.
213 The following avoids printing the last element. */
214 arg = TYPE_ARG_TYPES (node);
215 while (arg && TREE_CHAIN (arg) && arg != error_mark_node)
218 dump_generic_node (buffer, TREE_VALUE (arg), spc, flags, false);
219 arg = TREE_CHAIN (arg);
220 if (TREE_CHAIN (arg) && TREE_CODE (TREE_CHAIN (arg)) == TREE_LIST)
222 pp_character (buffer, ',');
228 pp_string (buffer, "void");
230 pp_character (buffer, ')');
233 /* Dump the domain associated with an array. */
236 dump_array_domain (pretty_printer *buffer, tree domain, int spc, int flags)
238 pp_character (buffer, '[');
241 tree min = TYPE_MIN_VALUE (domain);
242 tree max = TYPE_MAX_VALUE (domain);
245 && integer_zerop (min)
246 && host_integerp (max, 0))
247 pp_wide_integer (buffer, TREE_INT_CST_LOW (max) + 1);
251 dump_generic_node (buffer, min, spc, flags, false);
252 pp_character (buffer, ':');
254 dump_generic_node (buffer, max, spc, flags, false);
258 pp_string (buffer, "<unknown>");
259 pp_character (buffer, ']');
263 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
264 dump_generic_node. */
267 dump_omp_clause (pretty_printer *buffer, tree clause, int spc, int flags)
271 switch (OMP_CLAUSE_CODE (clause))
273 case OMP_CLAUSE_PRIVATE:
276 case OMP_CLAUSE_SHARED:
279 case OMP_CLAUSE_FIRSTPRIVATE:
280 name = "firstprivate";
282 case OMP_CLAUSE_LASTPRIVATE:
283 name = "lastprivate";
285 case OMP_CLAUSE_COPYIN:
288 case OMP_CLAUSE_COPYPRIVATE:
289 name = "copyprivate";
292 pp_string (buffer, name);
293 pp_character (buffer, '(');
294 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
296 pp_character (buffer, ')');
299 case OMP_CLAUSE_REDUCTION:
300 pp_string (buffer, "reduction(");
301 pp_string (buffer, op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause)));
302 pp_character (buffer, ':');
303 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
305 pp_character (buffer, ')');
309 pp_string (buffer, "if(");
310 dump_generic_node (buffer, OMP_CLAUSE_IF_EXPR (clause),
312 pp_character (buffer, ')');
315 case OMP_CLAUSE_NUM_THREADS:
316 pp_string (buffer, "num_threads(");
317 dump_generic_node (buffer, OMP_CLAUSE_NUM_THREADS_EXPR (clause),
319 pp_character (buffer, ')');
322 case OMP_CLAUSE_NOWAIT:
323 pp_string (buffer, "nowait");
325 case OMP_CLAUSE_ORDERED:
326 pp_string (buffer, "ordered");
329 case OMP_CLAUSE_DEFAULT:
330 pp_string (buffer, "default(");
331 switch (OMP_CLAUSE_DEFAULT_KIND (clause))
333 case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
335 case OMP_CLAUSE_DEFAULT_SHARED:
336 pp_string (buffer, "shared");
338 case OMP_CLAUSE_DEFAULT_NONE:
339 pp_string (buffer, "none");
341 case OMP_CLAUSE_DEFAULT_PRIVATE:
342 pp_string (buffer, "private");
344 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
345 pp_string (buffer, "firstprivate");
350 pp_character (buffer, ')');
353 case OMP_CLAUSE_SCHEDULE:
354 pp_string (buffer, "schedule(");
355 switch (OMP_CLAUSE_SCHEDULE_KIND (clause))
357 case OMP_CLAUSE_SCHEDULE_STATIC:
358 pp_string (buffer, "static");
360 case OMP_CLAUSE_SCHEDULE_DYNAMIC:
361 pp_string (buffer, "dynamic");
363 case OMP_CLAUSE_SCHEDULE_GUIDED:
364 pp_string (buffer, "guided");
366 case OMP_CLAUSE_SCHEDULE_RUNTIME:
367 pp_string (buffer, "runtime");
369 case OMP_CLAUSE_SCHEDULE_AUTO:
370 pp_string (buffer, "auto");
375 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
377 pp_character (buffer, ',');
378 dump_generic_node (buffer,
379 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
382 pp_character (buffer, ')');
385 case OMP_CLAUSE_UNTIED:
386 pp_string (buffer, "untied");
389 case OMP_CLAUSE_COLLAPSE:
390 pp_string (buffer, "collapse(");
391 dump_generic_node (buffer,
392 OMP_CLAUSE_COLLAPSE_EXPR (clause),
394 pp_character (buffer, ')');
398 /* Should never happen. */
399 dump_generic_node (buffer, clause, spc, flags, false);
405 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
406 dump_generic_node. */
409 dump_omp_clauses (pretty_printer *buffer, tree clause, int spc, int flags)
417 dump_omp_clause (buffer, clause, spc, flags);
418 clause = OMP_CLAUSE_CHAIN (clause);
426 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
427 indent. FLAGS specifies details to show in the dump (see TDF_* in
428 tree-pass.h). If IS_STMT is true, the object printed is considered
429 to be a statement and it is terminated by ';' if appropriate. */
432 dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
440 if (node == NULL_TREE)
443 is_expr = EXPR_P (node);
445 if (is_stmt && (flags & TDF_STMTADDR))
446 pp_printf (buffer, "<&%p> ", (void *)node);
448 if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
450 expanded_location xloc = expand_location (EXPR_LOCATION (node));
451 pp_character (buffer, '[');
454 pp_string (buffer, xloc.file);
455 pp_string (buffer, " : ");
457 pp_decimal_int (buffer, xloc.line);
458 pp_string (buffer, "] ");
461 switch (TREE_CODE (node))
464 pp_string (buffer, "<<< error >>>");
467 case IDENTIFIER_NODE:
468 pp_tree_identifier (buffer, node);
472 while (node && node != error_mark_node)
474 if (TREE_PURPOSE (node))
476 dump_generic_node (buffer, TREE_PURPOSE (node), spc, flags, false);
479 dump_generic_node (buffer, TREE_VALUE (node), spc, flags, false);
480 node = TREE_CHAIN (node);
481 if (node && TREE_CODE (node) == TREE_LIST)
483 pp_character (buffer, ',');
490 dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
496 if (TREE_VEC_LENGTH (node) > 0)
498 size_t len = TREE_VEC_LENGTH (node);
499 for (i = 0; i < len - 1; i++)
501 dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags,
503 pp_character (buffer, ',');
506 dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc,
515 case FIXED_POINT_TYPE:
521 unsigned int quals = TYPE_QUALS (node);
522 enum tree_code_class tclass;
524 if (quals & TYPE_QUAL_CONST)
525 pp_string (buffer, "const ");
526 else if (quals & TYPE_QUAL_VOLATILE)
527 pp_string (buffer, "volatile ");
528 else if (quals & TYPE_QUAL_RESTRICT)
529 pp_string (buffer, "restrict ");
531 tclass = TREE_CODE_CLASS (TREE_CODE (node));
533 if (tclass == tcc_declaration)
535 if (DECL_NAME (node))
536 dump_decl_name (buffer, node, flags);
538 pp_string (buffer, "<unnamed type decl>");
540 else if (tclass == tcc_type)
542 if (TYPE_NAME (node))
544 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
545 pp_tree_identifier (buffer, TYPE_NAME (node));
546 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
547 && DECL_NAME (TYPE_NAME (node)))
548 dump_decl_name (buffer, TYPE_NAME (node), flags);
550 pp_string (buffer, "<unnamed type>");
552 else if (TREE_CODE (node) == VECTOR_TYPE)
554 pp_string (buffer, "vector ");
555 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
557 else if (TREE_CODE (node) == INTEGER_TYPE)
559 pp_string (buffer, (TYPE_UNSIGNED (node)
560 ? "<unnamed-unsigned:"
561 : "<unnamed-signed:"));
562 pp_decimal_int (buffer, TYPE_PRECISION (node));
563 pp_string (buffer, ">");
565 else if (TREE_CODE (node) == COMPLEX_TYPE)
567 pp_string (buffer, "__complex__ ");
568 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
570 else if (TREE_CODE (node) == REAL_TYPE)
572 pp_string (buffer, "<float:");
573 pp_decimal_int (buffer, TYPE_PRECISION (node));
574 pp_string (buffer, ">");
576 else if (TREE_CODE (node) == FIXED_POINT_TYPE)
578 pp_string (buffer, "<fixed-point-");
579 pp_string (buffer, TYPE_SATURATING (node) ? "sat:" : "nonsat:");
580 pp_decimal_int (buffer, TYPE_PRECISION (node));
581 pp_string (buffer, ">");
584 pp_string (buffer, "<unnamed type>");
591 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
593 if (TREE_TYPE (node) == NULL)
595 pp_string (buffer, str);
596 pp_string (buffer, "<null type>");
598 else if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
600 tree fnode = TREE_TYPE (node);
602 dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false);
604 pp_character (buffer, '(');
605 pp_string (buffer, str);
606 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
607 dump_decl_name (buffer, TYPE_NAME (node), flags);
609 pp_printf (buffer, "<T%x>", TYPE_UID (node));
611 pp_character (buffer, ')');
612 dump_function_declaration (buffer, fnode, spc, flags);
616 unsigned int quals = TYPE_QUALS (node);
618 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
620 pp_string (buffer, str);
622 if (quals & TYPE_QUAL_CONST)
623 pp_string (buffer, " const");
624 if (quals & TYPE_QUAL_VOLATILE)
625 pp_string (buffer, " volatile");
626 if (quals & TYPE_QUAL_RESTRICT)
627 pp_string (buffer, " restrict");
629 if (TYPE_REF_CAN_ALIAS_ALL (node))
630 pp_string (buffer, " {ref-all}");
640 const char *sep = "";
643 pp_string (buffer, "MEM[");
645 tmp = TMR_SYMBOL (node);
648 pp_string (buffer, sep);
650 pp_string (buffer, "symbol: ");
651 dump_generic_node (buffer, tmp, spc, flags, false);
653 tmp = TMR_BASE (node);
656 pp_string (buffer, sep);
658 pp_string (buffer, "base: ");
659 dump_generic_node (buffer, tmp, spc, flags, false);
661 tmp = TMR_INDEX (node);
664 pp_string (buffer, sep);
666 pp_string (buffer, "index: ");
667 dump_generic_node (buffer, tmp, spc, flags, false);
669 tmp = TMR_STEP (node);
672 pp_string (buffer, sep);
674 pp_string (buffer, "step: ");
675 dump_generic_node (buffer, tmp, spc, flags, false);
677 tmp = TMR_OFFSET (node);
680 pp_string (buffer, sep);
682 pp_string (buffer, "offset: ");
683 dump_generic_node (buffer, tmp, spc, flags, false);
685 pp_string (buffer, "]");
686 if (flags & TDF_DETAILS)
688 pp_string (buffer, "{");
689 dump_generic_node (buffer, TMR_ORIGINAL (node), spc, flags,
691 pp_string (buffer, "}");
700 /* Print the innermost component type. */
701 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
702 tmp = TREE_TYPE (tmp))
704 dump_generic_node (buffer, tmp, spc, flags, false);
706 /* Print the dimensions. */
707 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
708 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
714 case QUAL_UNION_TYPE:
716 unsigned int quals = TYPE_QUALS (node);
718 if (quals & TYPE_QUAL_CONST)
719 pp_string (buffer, "const ");
720 if (quals & TYPE_QUAL_VOLATILE)
721 pp_string (buffer, "volatile ");
723 /* Print the name of the structure. */
724 if (TREE_CODE (node) == RECORD_TYPE)
725 pp_string (buffer, "struct ");
726 else if (TREE_CODE (node) == UNION_TYPE)
727 pp_string (buffer, "union ");
729 if (TYPE_NAME (node))
730 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
731 else if (!(flags & TDF_SLIM))
732 /* FIXME: If we eliminate the 'else' above and attempt
733 to show the fields for named types, we may get stuck
734 following a cycle of pointers to structs. The alleged
735 self-reference check in print_struct_decl will not detect
736 cycles involving more than one pointer or struct type. */
737 print_struct_decl (buffer, node, spc, flags);
746 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
748 /* In the case of a pointer, one may want to divide by the
749 size of the pointed-to type. Unfortunately, this not
750 straightforward. The C front-end maps expressions
755 in such a way that the two INTEGER_CST nodes for "5" have
756 different values but identical types. In the latter
757 case, the 5 is multiplied by sizeof (int) in c-common.c
758 (pointer_int_sum) to convert it to a byte address, and
759 yet the type of the node is left unchanged. Argh. What
760 is consistent though is that the number value corresponds
761 to bytes (UNITS) offset.
763 NB: Neither of the following divisors can be trivially
764 used to recover the original literal:
766 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
767 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
768 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
769 pp_string (buffer, "B"); /* pseudo-unit */
771 else if (! host_integerp (node, 0))
774 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (val);
775 HOST_WIDE_INT high = TREE_INT_CST_HIGH (val);
777 if (tree_int_cst_sgn (val) < 0)
779 pp_character (buffer, '-');
783 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
785 sprintf (pp_buffer (buffer)->digit_buffer,
786 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
787 (unsigned HOST_WIDE_INT) 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, " }");
863 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
865 if (TREE_CODE (node) == METHOD_TYPE)
867 if (TYPE_METHOD_BASETYPE (node))
868 dump_decl_name (buffer, TYPE_NAME (TYPE_METHOD_BASETYPE (node)),
871 pp_string (buffer, "<null method basetype>");
872 pp_string (buffer, "::");
874 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
875 dump_decl_name (buffer, TYPE_NAME (node), flags);
877 pp_printf (buffer, "<T%x>", TYPE_UID (node));
878 dump_function_declaration (buffer, node, spc, flags);
883 dump_decl_name (buffer, node, flags);
887 if (DECL_NAME (node))
888 dump_decl_name (buffer, node, flags);
889 else if (LABEL_DECL_UID (node) != -1)
890 pp_printf (buffer, "<L%d>", (int) LABEL_DECL_UID (node));
892 pp_printf (buffer, "<D.%u>", DECL_UID (node));
896 if (DECL_IS_BUILTIN (node))
898 /* Don't print the declaration of built-in types. */
901 if (DECL_NAME (node))
902 dump_decl_name (buffer, node, flags);
905 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
906 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
907 && TYPE_METHODS (TREE_TYPE (node)))
909 /* The type is a c++ class: all structures have at least
911 pp_string (buffer, "class ");
912 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
917 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
918 ? "union" : "struct "));
919 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
928 dump_decl_name (buffer, node, flags);
932 pp_string (buffer, "<retval>");
936 op0 = TREE_OPERAND (node, 0);
938 if (TREE_CODE (op0) == INDIRECT_REF)
940 op0 = TREE_OPERAND (op0, 0);
943 if (op_prio (op0) < op_prio (node))
944 pp_character (buffer, '(');
945 dump_generic_node (buffer, op0, spc, flags, false);
946 if (op_prio (op0) < op_prio (node))
947 pp_character (buffer, ')');
948 pp_string (buffer, str);
949 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
950 op0 = component_ref_field_offset (node);
951 if (op0 && TREE_CODE (op0) != INTEGER_CST)
953 pp_string (buffer, "{off: ");
954 dump_generic_node (buffer, op0, spc, flags, false);
955 pp_character (buffer, '}');
960 pp_string (buffer, "BIT_FIELD_REF <");
961 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
962 pp_string (buffer, ", ");
963 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
964 pp_string (buffer, ", ");
965 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
966 pp_string (buffer, ">");
970 case ARRAY_RANGE_REF:
971 op0 = TREE_OPERAND (node, 0);
972 if (op_prio (op0) < op_prio (node))
973 pp_character (buffer, '(');
974 dump_generic_node (buffer, op0, spc, flags, false);
975 if (op_prio (op0) < op_prio (node))
976 pp_character (buffer, ')');
977 pp_character (buffer, '[');
978 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
979 if (TREE_CODE (node) == ARRAY_RANGE_REF)
980 pp_string (buffer, " ...");
981 pp_character (buffer, ']');
983 op0 = array_ref_low_bound (node);
984 op1 = array_ref_element_size (node);
986 if (!integer_zerop (op0)
987 || TREE_OPERAND (node, 2)
988 || TREE_OPERAND (node, 3))
990 pp_string (buffer, "{lb: ");
991 dump_generic_node (buffer, op0, spc, flags, false);
992 pp_string (buffer, " sz: ");
993 dump_generic_node (buffer, op1, spc, flags, false);
994 pp_character (buffer, '}');
1000 unsigned HOST_WIDE_INT ix;
1002 bool is_struct_init = FALSE;
1003 pp_character (buffer, '{');
1004 if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
1005 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
1006 is_struct_init = TRUE;
1007 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
1009 if (field && is_struct_init)
1011 pp_character (buffer, '.');
1012 dump_generic_node (buffer, field, spc, flags, false);
1013 pp_string (buffer, "=");
1015 if (val && TREE_CODE (val) == ADDR_EXPR)
1016 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
1017 val = TREE_OPERAND (val, 0);
1018 if (val && TREE_CODE (val) == FUNCTION_DECL)
1019 dump_decl_name (buffer, val, flags);
1021 dump_generic_node (buffer, val, spc, flags, false);
1022 if (ix != VEC_length (constructor_elt, CONSTRUCTOR_ELTS (node)) - 1)
1024 pp_character (buffer, ',');
1028 pp_character (buffer, '}');
1035 if (flags & TDF_SLIM)
1037 pp_string (buffer, "<COMPOUND_EXPR>");
1041 dump_generic_node (buffer, TREE_OPERAND (node, 0),
1042 spc, flags, !(flags & TDF_SLIM));
1043 if (flags & TDF_SLIM)
1044 newline_and_indent (buffer, spc);
1047 pp_character (buffer, ',');
1051 for (tp = &TREE_OPERAND (node, 1);
1052 TREE_CODE (*tp) == COMPOUND_EXPR;
1053 tp = &TREE_OPERAND (*tp, 1))
1055 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
1056 spc, flags, !(flags & TDF_SLIM));
1057 if (flags & TDF_SLIM)
1058 newline_and_indent (buffer, spc);
1061 pp_character (buffer, ',');
1066 dump_generic_node (buffer, *tp, spc, flags, !(flags & TDF_SLIM));
1070 case STATEMENT_LIST:
1072 tree_stmt_iterator si;
1075 if (flags & TDF_SLIM)
1077 pp_string (buffer, "<STATEMENT_LIST>");
1081 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
1084 newline_and_indent (buffer, spc);
1087 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
1094 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags,
1097 pp_character (buffer, '=');
1098 if (TREE_CODE (node) == MODIFY_EXPR
1099 && MOVE_NONTEMPORAL (node))
1100 pp_string (buffer, "{nt}");
1102 dump_generic_node (buffer, 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:
1427 type = TREE_TYPE (node);
1428 op0 = TREE_OPERAND (node, 0);
1429 if (type != TREE_TYPE (op0))
1431 pp_character (buffer, '(');
1432 dump_generic_node (buffer, type, spc, flags, false);
1433 pp_string (buffer, ") ");
1435 if (op_prio (op0) < op_prio (node))
1436 pp_character (buffer, '(');
1437 dump_generic_node (buffer, op0, spc, flags, false);
1438 if (op_prio (op0) < op_prio (node))
1439 pp_character (buffer, ')');
1442 case VIEW_CONVERT_EXPR:
1443 pp_string (buffer, "VIEW_CONVERT_EXPR<");
1444 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1445 pp_string (buffer, ">(");
1446 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1447 pp_character (buffer, ')');
1451 pp_string (buffer, "((");
1452 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1453 pp_string (buffer, "))");
1456 case NON_LVALUE_EXPR:
1457 pp_string (buffer, "NON_LVALUE_EXPR <");
1458 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1459 pp_character (buffer, '>');
1463 pp_string (buffer, "SAVE_EXPR <");
1464 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1465 pp_character (buffer, '>');
1469 pp_string (buffer, "COMPLEX_EXPR <");
1470 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1471 pp_string (buffer, ", ");
1472 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1473 pp_string (buffer, ">");
1477 pp_string (buffer, "CONJ_EXPR <");
1478 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1479 pp_string (buffer, ">");
1483 pp_string (buffer, "REALPART_EXPR <");
1484 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1485 pp_string (buffer, ">");
1489 pp_string (buffer, "IMAGPART_EXPR <");
1490 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1491 pp_string (buffer, ">");
1495 pp_string (buffer, "VA_ARG_EXPR <");
1496 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1497 pp_string (buffer, ">");
1500 case TRY_FINALLY_EXPR:
1501 case TRY_CATCH_EXPR:
1502 pp_string (buffer, "try");
1503 newline_and_indent (buffer, spc+2);
1504 pp_string (buffer, "{");
1505 newline_and_indent (buffer, spc+4);
1506 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc+4, flags, true);
1507 newline_and_indent (buffer, spc+2);
1508 pp_string (buffer, "}");
1509 newline_and_indent (buffer, spc);
1511 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
1512 newline_and_indent (buffer, spc+2);
1513 pp_string (buffer, "{");
1514 newline_and_indent (buffer, spc+4);
1515 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
1516 newline_and_indent (buffer, spc+2);
1517 pp_string (buffer, "}");
1522 pp_string (buffer, "catch (");
1523 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
1524 pp_string (buffer, ")");
1525 newline_and_indent (buffer, spc+2);
1526 pp_string (buffer, "{");
1527 newline_and_indent (buffer, spc+4);
1528 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
1529 newline_and_indent (buffer, spc+2);
1530 pp_string (buffer, "}");
1534 case EH_FILTER_EXPR:
1535 pp_string (buffer, "<<<eh_filter (");
1536 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
1537 pp_string (buffer, ")>>>");
1538 newline_and_indent (buffer, spc+2);
1539 pp_string (buffer, "{");
1540 newline_and_indent (buffer, spc+4);
1541 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
1542 newline_and_indent (buffer, spc+2);
1543 pp_string (buffer, "}");
1548 op0 = TREE_OPERAND (node, 0);
1549 /* If this is for break or continue, don't bother printing it. */
1550 if (DECL_NAME (op0))
1552 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1553 if (strcmp (name, "break") == 0
1554 || strcmp (name, "continue") == 0)
1557 dump_generic_node (buffer, op0, spc, flags, false);
1558 pp_character (buffer, ':');
1559 if (DECL_NONLOCAL (op0))
1560 pp_string (buffer, " [non-local]");
1564 pp_string (buffer, "<<<exception object>>>");
1568 pp_string (buffer, "<<<filter object>>>");
1572 pp_string (buffer, "while (1)");
1573 if (!(flags & TDF_SLIM))
1575 newline_and_indent (buffer, spc+2);
1576 pp_character (buffer, '{');
1577 newline_and_indent (buffer, spc+4);
1578 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
1579 newline_and_indent (buffer, spc+2);
1580 pp_character (buffer, '}');
1586 pp_string (buffer, "// predicted ");
1587 if (PREDICT_EXPR_OUTCOME (node))
1588 pp_string (buffer, "likely by ");
1590 pp_string (buffer, "unlikely by ");
1591 pp_string (buffer, predictor_name (PREDICT_EXPR_PREDICTOR (node)));
1592 pp_string (buffer, " predictor.");
1596 pp_string (buffer, "return");
1597 op0 = TREE_OPERAND (node, 0);
1601 if (TREE_CODE (op0) == MODIFY_EXPR)
1602 dump_generic_node (buffer, TREE_OPERAND (op0, 1),
1605 dump_generic_node (buffer, op0, spc, flags, false);
1610 pp_string (buffer, "if (");
1611 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1612 pp_string (buffer, ") break");
1616 pp_string (buffer, "switch (");
1617 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
1618 pp_character (buffer, ')');
1619 if (!(flags & TDF_SLIM))
1621 newline_and_indent (buffer, spc+2);
1622 pp_character (buffer, '{');
1623 if (SWITCH_BODY (node))
1625 newline_and_indent (buffer, spc+4);
1626 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags,
1631 tree vec = SWITCH_LABELS (node);
1632 size_t i, n = TREE_VEC_LENGTH (vec);
1633 for (i = 0; i < n; ++i)
1635 tree elt = TREE_VEC_ELT (vec, i);
1636 newline_and_indent (buffer, spc+4);
1639 dump_generic_node (buffer, elt, spc+4, flags, false);
1640 pp_string (buffer, " goto ");
1641 dump_generic_node (buffer, CASE_LABEL (elt), spc+4,
1643 pp_semicolon (buffer);
1646 pp_string (buffer, "case ???: goto ???;");
1649 newline_and_indent (buffer, spc+2);
1650 pp_character (buffer, '}');
1656 op0 = GOTO_DESTINATION (node);
1657 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
1659 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1660 if (strcmp (name, "break") == 0
1661 || strcmp (name, "continue") == 0)
1663 pp_string (buffer, name);
1667 pp_string (buffer, "goto ");
1668 dump_generic_node (buffer, op0, spc, flags, false);
1672 pp_string (buffer, "resx ");
1673 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1677 pp_string (buffer, "__asm__");
1678 if (ASM_VOLATILE_P (node))
1679 pp_string (buffer, " __volatile__");
1680 pp_character (buffer, '(');
1681 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
1682 pp_character (buffer, ':');
1683 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
1684 pp_character (buffer, ':');
1685 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
1686 if (ASM_CLOBBERS (node))
1688 pp_character (buffer, ':');
1689 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
1691 pp_string (buffer, ")");
1694 case CASE_LABEL_EXPR:
1695 if (CASE_LOW (node) && CASE_HIGH (node))
1697 pp_string (buffer, "case ");
1698 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1699 pp_string (buffer, " ... ");
1700 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
1702 else if (CASE_LOW (node))
1704 pp_string (buffer, "case ");
1705 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1708 pp_string (buffer, "default");
1709 pp_character (buffer, ':');
1713 pp_string (buffer, "OBJ_TYPE_REF(");
1714 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
1715 pp_character (buffer, ';');
1716 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
1717 pp_character (buffer, '-');
1718 pp_character (buffer, '>');
1719 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
1720 pp_character (buffer, ')');
1724 dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
1725 pp_string (buffer, "_");
1726 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
1727 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
1728 pp_string (buffer, "(ab)");
1729 else if (SSA_NAME_IS_DEFAULT_DEF (node))
1730 pp_string (buffer, "(D)");
1733 case WITH_SIZE_EXPR:
1734 pp_string (buffer, "WITH_SIZE_EXPR <");
1735 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1736 pp_string (buffer, ", ");
1737 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1738 pp_string (buffer, ">");
1742 pp_string (buffer, "ASSERT_EXPR <");
1743 dump_generic_node (buffer, ASSERT_EXPR_VAR (node), spc, flags, false);
1744 pp_string (buffer, ", ");
1745 dump_generic_node (buffer, ASSERT_EXPR_COND (node), spc, flags, false);
1746 pp_string (buffer, ">");
1750 pp_string (buffer, "scev_known");
1753 case SCEV_NOT_KNOWN:
1754 pp_string (buffer, "scev_not_known");
1757 case POLYNOMIAL_CHREC:
1758 pp_string (buffer, "{");
1759 dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
1760 pp_string (buffer, ", +, ");
1761 dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
1762 pp_string (buffer, "}_");
1763 dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
1767 case REALIGN_LOAD_EXPR:
1768 pp_string (buffer, "REALIGN_LOAD <");
1769 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1770 pp_string (buffer, ", ");
1771 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1772 pp_string (buffer, ", ");
1773 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1774 pp_string (buffer, ">");
1778 pp_string (buffer, " VEC_COND_EXPR < ");
1779 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1780 pp_string (buffer, " , ");
1781 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1782 pp_string (buffer, " , ");
1783 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1784 pp_string (buffer, " > ");
1788 pp_string (buffer, " DOT_PROD_EXPR < ");
1789 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1790 pp_string (buffer, ", ");
1791 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1792 pp_string (buffer, ", ");
1793 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1794 pp_string (buffer, " > ");
1798 pp_string (buffer, "#pragma omp parallel");
1799 dump_omp_clauses (buffer, OMP_PARALLEL_CLAUSES (node), spc, flags);
1802 if (!(flags & TDF_SLIM) && OMP_BODY (node))
1804 newline_and_indent (buffer, spc + 2);
1805 pp_character (buffer, '{');
1806 newline_and_indent (buffer, spc + 4);
1807 dump_generic_node (buffer, OMP_BODY (node), spc + 4, flags, false);
1808 newline_and_indent (buffer, spc + 2);
1809 pp_character (buffer, '}');
1815 pp_string (buffer, "#pragma omp task");
1816 dump_omp_clauses (buffer, OMP_TASK_CLAUSES (node), spc, flags);
1820 pp_string (buffer, "#pragma omp for");
1821 dump_omp_clauses (buffer, OMP_FOR_CLAUSES (node), spc, flags);
1823 if (!(flags & TDF_SLIM))
1827 if (OMP_FOR_PRE_BODY (node))
1829 newline_and_indent (buffer, spc + 2);
1830 pp_character (buffer, '{');
1832 newline_and_indent (buffer, spc);
1833 dump_generic_node (buffer, OMP_FOR_PRE_BODY (node),
1837 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (node)); i++)
1840 newline_and_indent (buffer, spc);
1841 pp_string (buffer, "for (");
1842 dump_generic_node (buffer, TREE_VEC_ELT (OMP_FOR_INIT (node), i),
1844 pp_string (buffer, "; ");
1845 dump_generic_node (buffer, TREE_VEC_ELT (OMP_FOR_COND (node), i),
1847 pp_string (buffer, "; ");
1848 dump_generic_node (buffer, TREE_VEC_ELT (OMP_FOR_INCR (node), i),
1850 pp_string (buffer, ")");
1852 if (OMP_FOR_BODY (node))
1854 newline_and_indent (buffer, spc + 2);
1855 pp_character (buffer, '{');
1856 newline_and_indent (buffer, spc + 4);
1857 dump_generic_node (buffer, OMP_FOR_BODY (node), spc + 4, flags,
1859 newline_and_indent (buffer, spc + 2);
1860 pp_character (buffer, '}');
1862 spc -= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node)) - 2;
1863 if (OMP_FOR_PRE_BODY (node))
1866 newline_and_indent (buffer, spc + 2);
1867 pp_character (buffer, '}');
1874 pp_string (buffer, "#pragma omp sections");
1875 dump_omp_clauses (buffer, OMP_SECTIONS_CLAUSES (node), spc, flags);
1879 pp_string (buffer, "#pragma omp section");
1883 pp_string (buffer, "#pragma omp master");
1887 pp_string (buffer, "#pragma omp ordered");
1891 pp_string (buffer, "#pragma omp critical");
1892 if (OMP_CRITICAL_NAME (node))
1895 pp_character (buffer, '(');
1896 dump_generic_node (buffer, OMP_CRITICAL_NAME (node), spc,
1898 pp_character (buffer, ')');
1903 pp_string (buffer, "#pragma omp atomic");
1904 newline_and_indent (buffer, spc + 2);
1905 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1907 pp_character (buffer, '=');
1909 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1913 pp_string (buffer, "#pragma omp single");
1914 dump_omp_clauses (buffer, OMP_SINGLE_CLAUSES (node), spc, flags);
1918 dump_omp_clause (buffer, node, spc, flags);
1922 case REDUC_MAX_EXPR:
1923 pp_string (buffer, " REDUC_MAX_EXPR < ");
1924 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1925 pp_string (buffer, " > ");
1928 case REDUC_MIN_EXPR:
1929 pp_string (buffer, " REDUC_MIN_EXPR < ");
1930 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1931 pp_string (buffer, " > ");
1934 case REDUC_PLUS_EXPR:
1935 pp_string (buffer, " REDUC_PLUS_EXPR < ");
1936 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1937 pp_string (buffer, " > ");
1940 case VEC_WIDEN_MULT_HI_EXPR:
1941 pp_string (buffer, " VEC_WIDEN_MULT_HI_EXPR < ");
1942 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1943 pp_string (buffer, ", ");
1944 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1945 pp_string (buffer, " > ");
1948 case VEC_WIDEN_MULT_LO_EXPR:
1949 pp_string (buffer, " VEC_WIDEN_MULT_LO_EXPR < ");
1950 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1951 pp_string (buffer, ", ");
1952 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1953 pp_string (buffer, " > ");
1956 case VEC_UNPACK_HI_EXPR:
1957 pp_string (buffer, " VEC_UNPACK_HI_EXPR < ");
1958 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1959 pp_string (buffer, " > ");
1962 case VEC_UNPACK_LO_EXPR:
1963 pp_string (buffer, " VEC_UNPACK_LO_EXPR < ");
1964 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1965 pp_string (buffer, " > ");
1968 case VEC_UNPACK_FLOAT_HI_EXPR:
1969 pp_string (buffer, " VEC_UNPACK_FLOAT_HI_EXPR < ");
1970 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1971 pp_string (buffer, " > ");
1974 case VEC_UNPACK_FLOAT_LO_EXPR:
1975 pp_string (buffer, " VEC_UNPACK_FLOAT_LO_EXPR < ");
1976 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1977 pp_string (buffer, " > ");
1980 case VEC_PACK_TRUNC_EXPR:
1981 pp_string (buffer, " VEC_PACK_TRUNC_EXPR < ");
1982 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1983 pp_string (buffer, ", ");
1984 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1985 pp_string (buffer, " > ");
1988 case VEC_PACK_SAT_EXPR:
1989 pp_string (buffer, " VEC_PACK_SAT_EXPR < ");
1990 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1991 pp_string (buffer, ", ");
1992 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1993 pp_string (buffer, " > ");
1996 case VEC_PACK_FIX_TRUNC_EXPR:
1997 pp_string (buffer, " VEC_PACK_FIX_TRUNC_EXPR < ");
1998 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1999 pp_string (buffer, ", ");
2000 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2001 pp_string (buffer, " > ");
2007 pp_string (buffer, "BLOCK");
2009 if (BLOCK_ABSTRACT (node))
2010 pp_string (buffer, " [abstract]");
2012 if (TREE_ASM_WRITTEN (node))
2013 pp_string (buffer, " [written]");
2015 newline_and_indent (buffer, spc + 2);
2017 if (BLOCK_SUPERCONTEXT (node))
2019 pp_string (buffer, "SUPERCONTEXT: ");
2020 if (TREE_CODE (BLOCK_SUPERCONTEXT (node)) == BLOCK)
2021 pp_printf (buffer, "BLOCK %p",
2022 (void *)BLOCK_SUPERCONTEXT (node));
2024 dump_generic_node (buffer, BLOCK_SUPERCONTEXT (node), 0, flags,
2026 newline_and_indent (buffer, spc + 2);
2029 if (BLOCK_SUBBLOCKS (node))
2031 pp_string (buffer, "SUBBLOCKS: ");
2032 for (t = BLOCK_SUBBLOCKS (node); t; t = BLOCK_CHAIN (t))
2033 pp_printf (buffer, "%p ", (void *)t);
2034 newline_and_indent (buffer, spc + 2);
2037 if (BLOCK_VARS (node))
2039 pp_string (buffer, "VARS: ");
2040 for (t = BLOCK_VARS (node); t; t = TREE_CHAIN (t))
2042 dump_generic_node (buffer, t, 0, flags, false);
2043 pp_string (buffer, " ");
2045 newline_and_indent (buffer, spc + 2);
2048 if (BLOCK_ABSTRACT_ORIGIN (node))
2050 pp_string (buffer, "ABSTRACT_ORIGIN: ");
2051 if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node)) == BLOCK)
2052 pp_printf (buffer, "BLOCK %p",
2053 (void *)BLOCK_ABSTRACT_ORIGIN (node));
2055 dump_generic_node (buffer, BLOCK_ABSTRACT_ORIGIN (node), 0, flags,
2057 newline_and_indent (buffer, spc + 2);
2062 case VEC_EXTRACT_EVEN_EXPR:
2063 pp_string (buffer, " VEC_EXTRACT_EVEN_EXPR < ");
2064 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2065 pp_string (buffer, ", ");
2066 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2067 pp_string (buffer, " > ");
2070 case VEC_EXTRACT_ODD_EXPR:
2071 pp_string (buffer, " VEC_EXTRACT_ODD_EXPR < ");
2072 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2073 pp_string (buffer, ", ");
2074 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2075 pp_string (buffer, " > ");
2078 case VEC_INTERLEAVE_HIGH_EXPR:
2079 pp_string (buffer, " VEC_INTERLEAVE_HIGH_EXPR < ");
2080 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2081 pp_string (buffer, ", ");
2082 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2083 pp_string (buffer, " > ");
2086 case VEC_INTERLEAVE_LOW_EXPR:
2087 pp_string (buffer, " VEC_INTERLEAVE_LOW_EXPR < ");
2088 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2089 pp_string (buffer, ", ");
2090 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2091 pp_string (buffer, " > ");
2098 if (is_stmt && is_expr)
2099 pp_semicolon (buffer);
2101 /* If we're building a diagnostic, the formatted text will be written
2102 into BUFFER's stream by the caller; otherwise, write it now. */
2103 if (!(flags & TDF_DIAGNOSTIC))
2104 pp_write_text_to_stream (buffer);
2109 /* Print the declaration of a variable. */
2112 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
2116 if (TREE_CODE (t) == TYPE_DECL)
2117 pp_string (buffer, "typedef ");
2119 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
2120 pp_string (buffer, "register ");
2122 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
2123 pp_string (buffer, "extern ");
2124 else if (TREE_STATIC (t))
2125 pp_string (buffer, "static ");
2127 /* Print the type and name. */
2128 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
2132 /* Print array's type. */
2133 tmp = TREE_TYPE (t);
2134 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
2135 tmp = TREE_TYPE (tmp);
2136 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
2138 /* Print variable's name. */
2140 dump_generic_node (buffer, t, spc, flags, false);
2142 /* Print the dimensions. */
2143 tmp = TREE_TYPE (t);
2144 while (TREE_CODE (tmp) == ARRAY_TYPE)
2146 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
2147 tmp = TREE_TYPE (tmp);
2150 else if (TREE_CODE (t) == FUNCTION_DECL)
2152 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
2154 dump_decl_name (buffer, t, flags);
2155 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
2159 /* Print type declaration. */
2160 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
2162 /* Print variable's name. */
2164 dump_generic_node (buffer, t, spc, flags, false);
2167 if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
2169 pp_string (buffer, " __asm__ ");
2170 pp_character (buffer, '(');
2171 dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
2172 pp_character (buffer, ')');
2175 /* The initial value of a function serves to determine whether the function
2176 is declared or defined. So the following does not apply to function
2178 if (TREE_CODE (t) != FUNCTION_DECL)
2180 /* Print the initial value. */
2181 if (DECL_INITIAL (t))
2184 pp_character (buffer, '=');
2186 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
2190 if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
2192 pp_string (buffer, " [value-expr: ");
2193 dump_generic_node (buffer, DECL_VALUE_EXPR (t), spc, flags, false);
2194 pp_character (buffer, ']');
2197 pp_character (buffer, ';');
2201 /* Prints a structure: name, fields, and methods.
2202 FIXME: Still incomplete. */
2205 print_struct_decl (pretty_printer *buffer, const_tree node, int spc, int flags)
2207 /* Print the name of the structure. */
2208 if (TYPE_NAME (node))
2211 if (TREE_CODE (node) == RECORD_TYPE)
2212 pp_string (buffer, "struct ");
2213 else if ((TREE_CODE (node) == UNION_TYPE
2214 || TREE_CODE (node) == QUAL_UNION_TYPE))
2215 pp_string (buffer, "union ");
2217 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
2220 /* Print the contents of the structure. */
2221 pp_newline (buffer);
2223 pp_character (buffer, '{');
2224 pp_newline (buffer);
2226 /* Print the fields of the structure. */
2229 tmp = TYPE_FIELDS (node);
2232 /* Avoid to print recursively the structure. */
2233 /* FIXME : Not implemented correctly...,
2234 what about the case when we have a cycle in the contain graph? ...
2235 Maybe this could be solved by looking at the scope in which the
2236 structure was declared. */
2237 if (TREE_TYPE (tmp) != node
2238 && (TREE_CODE (TREE_TYPE (tmp)) != POINTER_TYPE
2239 || TREE_TYPE (TREE_TYPE (tmp)) != node))
2241 print_declaration (buffer, tmp, spc+2, flags);
2242 pp_newline (buffer);
2244 tmp = TREE_CHAIN (tmp);
2248 pp_character (buffer, '}');
2251 /* Return the priority of the operator CODE.
2253 From lowest to highest precedence with either left-to-right (L-R)
2254 or right-to-left (R-L) associativity]:
2257 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2269 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2270 15 [L-R] fn() [] -> .
2272 unary +, - and * have higher precedence than the corresponding binary
2276 op_code_prio (enum tree_code code)
2293 case TRUTH_ORIF_EXPR:
2296 case TRUTH_AND_EXPR:
2297 case TRUTH_ANDIF_EXPR:
2304 case TRUTH_XOR_EXPR:
2321 case UNORDERED_EXPR:
2334 case WIDEN_SUM_EXPR:
2336 case POINTER_PLUS_EXPR:
2340 case VEC_WIDEN_MULT_HI_EXPR:
2341 case VEC_WIDEN_MULT_LO_EXPR:
2342 case WIDEN_MULT_EXPR:
2345 case TRUNC_DIV_EXPR:
2347 case FLOOR_DIV_EXPR:
2348 case ROUND_DIV_EXPR:
2350 case EXACT_DIV_EXPR:
2351 case TRUNC_MOD_EXPR:
2353 case FLOOR_MOD_EXPR:
2354 case ROUND_MOD_EXPR:
2357 case TRUTH_NOT_EXPR:
2359 case POSTINCREMENT_EXPR:
2360 case POSTDECREMENT_EXPR:
2361 case PREINCREMENT_EXPR:
2362 case PREDECREMENT_EXPR:
2364 case ALIGN_INDIRECT_REF:
2365 case MISALIGNED_INDIRECT_REF:
2370 case FIX_TRUNC_EXPR:
2376 case ARRAY_RANGE_REF:
2380 /* Special expressions. */
2386 case REDUC_MAX_EXPR:
2387 case REDUC_MIN_EXPR:
2388 case REDUC_PLUS_EXPR:
2389 case VEC_LSHIFT_EXPR:
2390 case VEC_RSHIFT_EXPR:
2391 case VEC_UNPACK_HI_EXPR:
2392 case VEC_UNPACK_LO_EXPR:
2393 case VEC_UNPACK_FLOAT_HI_EXPR:
2394 case VEC_UNPACK_FLOAT_LO_EXPR:
2395 case VEC_PACK_TRUNC_EXPR:
2396 case VEC_PACK_SAT_EXPR:
2400 /* Return an arbitrarily high precedence to avoid surrounding single
2401 VAR_DECLs in ()s. */
2406 /* Return the priority of the operator OP. */
2409 op_prio (const_tree op)
2411 enum tree_code code;
2416 code = TREE_CODE (op);
2417 if (code == SAVE_EXPR || code == NON_LVALUE_EXPR)
2418 return op_prio (TREE_OPERAND (op, 0));
2420 return op_code_prio (code);
2423 /* Return the symbol associated with operator CODE. */
2426 op_symbol_code (enum tree_code code)
2434 case TRUTH_ORIF_EXPR:
2437 case TRUTH_AND_EXPR:
2438 case TRUTH_ANDIF_EXPR:
2444 case TRUTH_XOR_EXPR:
2454 case UNORDERED_EXPR:
2500 case VEC_LSHIFT_EXPR:
2503 case VEC_RSHIFT_EXPR:
2506 case POINTER_PLUS_EXPR:
2512 case REDUC_PLUS_EXPR:
2515 case WIDEN_SUM_EXPR:
2518 case WIDEN_MULT_EXPR:
2528 case TRUTH_NOT_EXPR:
2535 case ALIGN_INDIRECT_REF:
2538 case MISALIGNED_INDIRECT_REF:
2541 case TRUNC_DIV_EXPR:
2548 case FLOOR_DIV_EXPR:
2551 case ROUND_DIV_EXPR:
2554 case EXACT_DIV_EXPR:
2557 case TRUNC_MOD_EXPR:
2563 case FLOOR_MOD_EXPR:
2566 case ROUND_MOD_EXPR:
2569 case PREDECREMENT_EXPR:
2572 case PREINCREMENT_EXPR:
2575 case POSTDECREMENT_EXPR:
2578 case POSTINCREMENT_EXPR:
2588 return "<<< ??? >>>";
2592 /* Return the symbol associated with operator OP. */
2595 op_symbol (const_tree op)
2597 return op_symbol_code (TREE_CODE (op));
2600 /* Prints the name of a CALL_EXPR. */
2603 print_call_name (pretty_printer *buffer, const_tree node)
2607 gcc_assert (TREE_CODE (node) == CALL_EXPR);
2609 op0 = CALL_EXPR_FN (node);
2611 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
2612 op0 = TREE_OPERAND (op0, 0);
2614 switch (TREE_CODE (op0))
2618 dump_function_name (buffer, op0);
2624 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2628 pp_string (buffer, "(");
2629 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2630 pp_string (buffer, ") ? ");
2631 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, 0, false);
2632 pp_string (buffer, " : ");
2633 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, 0, false);
2637 /* The function is a pointer contained in a structure. */
2638 if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
2639 TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2640 dump_function_name (buffer, TREE_OPERAND (op0, 1));
2642 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2644 We can have several levels of structures and a function
2645 pointer inside. This is not implemented yet... */
2650 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2651 dump_function_name (buffer, TREE_OPERAND (op0, 0));
2653 dump_generic_node (buffer, op0, 0, 0, false);
2658 dump_generic_node (buffer, op0, 0, 0, false);
2666 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2669 pretty_print_string (pretty_printer *buffer, const char *str)
2679 pp_string (buffer, "\\b");
2683 pp_string (buffer, "\\f");
2687 pp_string (buffer, "\\n");
2691 pp_string (buffer, "\\r");
2695 pp_string (buffer, "\\t");
2699 pp_string (buffer, "\\v");
2703 pp_string (buffer, "\\\\");
2707 pp_string (buffer, "\\\"");
2711 pp_string (buffer, "\\'");
2714 /* No need to handle \0; the loop terminates on \0. */
2717 pp_string (buffer, "\\1");
2721 pp_string (buffer, "\\2");
2725 pp_string (buffer, "\\3");
2729 pp_string (buffer, "\\4");
2733 pp_string (buffer, "\\5");
2737 pp_string (buffer, "\\6");
2741 pp_string (buffer, "\\7");
2745 pp_character (buffer, str[0]);
2753 maybe_init_pretty_print (FILE *file)
2757 pp_construct (&buffer, /* prefix */NULL, /* line-width */0);
2758 pp_needs_newline (&buffer) = true;
2759 pp_translate_identifiers (&buffer) = false;
2763 buffer.buffer->stream = file;
2767 newline_and_indent (pretty_printer *buffer, int spc)
2769 pp_newline (buffer);