PR tree-optimization/43833
[official-gcc/alias-decl.git] / gcc / tree-pretty-print.c
blob331d93d6178a289a97261728df60ec9c3cc06dbe
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
11 version.
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
16 for more details.
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/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "output.h"
28 #include "diagnostic.h"
29 #include "real.h"
30 #include "hashtab.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"
38 #include "predict.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 newline_and_indent (pretty_printer *, int);
44 static void maybe_init_pretty_print (FILE *);
45 static void print_struct_decl (pretty_printer *, const_tree, int, int);
46 static void do_niy (pretty_printer *, const_tree);
48 #define INDENT(SPACE) do { \
49 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
51 #define NIY do_niy(buffer,node)
53 static pretty_printer buffer;
54 static int initialized = 0;
56 /* Try to print something for an unknown tree code. */
58 static void
59 do_niy (pretty_printer *buffer, const_tree node)
61 int i, len;
63 pp_string (buffer, "<<< Unknown tree: ");
64 pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
66 if (EXPR_P (node))
68 len = TREE_OPERAND_LENGTH (node);
69 for (i = 0; i < len; ++i)
71 newline_and_indent (buffer, 2);
72 dump_generic_node (buffer, TREE_OPERAND (node, i), 2, 0, false);
76 pp_string (buffer, " >>>\n");
79 /* Debugging function to print out a generic expression. */
81 void
82 debug_generic_expr (tree t)
84 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS);
85 fprintf (stderr, "\n");
88 /* Debugging function to print out a generic statement. */
90 void
91 debug_generic_stmt (tree t)
93 print_generic_stmt (stderr, t, TDF_VOPS|TDF_MEMSYMS);
94 fprintf (stderr, "\n");
97 /* Debugging function to print out a chain of trees . */
99 void
100 debug_tree_chain (tree t)
102 struct pointer_set_t *seen = pointer_set_create ();
104 while (t)
106 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
107 fprintf (stderr, " ");
108 t = TREE_CHAIN (t);
109 if (pointer_set_insert (seen, t))
111 fprintf (stderr, "... [cycled back to ");
112 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
113 fprintf (stderr, "]");
114 break;
117 fprintf (stderr, "\n");
119 pointer_set_destroy (seen);
122 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
123 void
124 print_generic_decl (FILE *file, tree decl, int flags)
126 maybe_init_pretty_print (file);
127 print_declaration (&buffer, decl, 2, flags);
128 pp_write_text_to_stream (&buffer);
131 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
132 to show in the dump. See TDF_* in tree-pass.h. */
134 void
135 print_generic_stmt (FILE *file, tree t, int flags)
137 maybe_init_pretty_print (file);
138 dump_generic_node (&buffer, t, 0, flags, true);
139 pp_flush (&buffer);
142 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
143 to show in the dump. See TDF_* in tree-pass.h. The output is indented by
144 INDENT spaces. */
146 void
147 print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
149 int i;
151 maybe_init_pretty_print (file);
153 for (i = 0; i < indent; i++)
154 pp_space (&buffer);
155 dump_generic_node (&buffer, t, indent, flags, true);
156 pp_flush (&buffer);
159 /* Print a single expression T on file FILE. FLAGS specifies details to show
160 in the dump. See TDF_* in tree-pass.h. */
162 void
163 print_generic_expr (FILE *file, tree t, int flags)
165 maybe_init_pretty_print (file);
166 dump_generic_node (&buffer, t, 0, flags, false);
169 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
170 in FLAGS. */
172 static void
173 dump_decl_name (pretty_printer *buffer, tree node, int flags)
175 if (DECL_NAME (node))
177 if ((flags & TDF_ASMNAME) && DECL_ASSEMBLER_NAME_SET_P (node))
178 pp_tree_identifier (buffer, DECL_ASSEMBLER_NAME (node));
179 else
180 pp_tree_identifier (buffer, DECL_NAME (node));
182 if ((flags & TDF_UID) || DECL_NAME (node) == NULL_TREE)
184 if (TREE_CODE (node) == LABEL_DECL && LABEL_DECL_UID (node) != -1)
185 pp_printf (buffer, "L.%d", (int) LABEL_DECL_UID (node));
186 else if (TREE_CODE (node) == DEBUG_EXPR_DECL)
188 if (flags & TDF_NOUID)
189 pp_string (buffer, "D#xxxx");
190 else
191 pp_printf (buffer, "D#%i", DEBUG_TEMP_UID (node));
193 else
195 char c = TREE_CODE (node) == CONST_DECL ? 'C' : 'D';
196 if (flags & TDF_NOUID)
197 pp_printf (buffer, "%c.xxxx", c);
198 else
199 pp_printf (buffer, "%c.%u", c, DECL_UID (node));
202 if ((flags & TDF_ALIAS) && DECL_PT_UID (node) != DECL_UID (node))
204 if (flags & TDF_NOUID)
205 pp_printf (buffer, "ptD.xxxx");
206 else
207 pp_printf (buffer, "ptD.%u", DECL_PT_UID (node));
211 /* Like the above, but used for pretty printing function calls. */
213 static void
214 dump_function_name (pretty_printer *buffer, tree node, int flags)
216 if (TREE_CODE (node) == NOP_EXPR)
217 node = TREE_OPERAND (node, 0);
218 if (DECL_NAME (node) && (flags & TDF_ASMNAME) == 0)
219 pp_string (buffer, lang_hooks.decl_printable_name (node, 1));
220 else
221 dump_decl_name (buffer, node, flags);
224 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
225 FLAGS are as in dump_generic_node. */
227 static void
228 dump_function_declaration (pretty_printer *buffer, tree node,
229 int spc, int flags)
231 bool wrote_arg = false;
232 tree arg;
234 pp_space (buffer);
235 pp_character (buffer, '(');
237 /* Print the argument types. The last element in the list is a VOID_TYPE.
238 The following avoids printing the last element. */
239 arg = TYPE_ARG_TYPES (node);
240 while (arg && TREE_CHAIN (arg) && arg != error_mark_node)
242 wrote_arg = true;
243 dump_generic_node (buffer, TREE_VALUE (arg), spc, flags, false);
244 arg = TREE_CHAIN (arg);
245 if (TREE_CHAIN (arg) && TREE_CODE (TREE_CHAIN (arg)) == TREE_LIST)
247 pp_character (buffer, ',');
248 pp_space (buffer);
252 if (!wrote_arg)
253 pp_string (buffer, "void");
255 pp_character (buffer, ')');
258 /* Dump the domain associated with an array. */
260 static void
261 dump_array_domain (pretty_printer *buffer, tree domain, int spc, int flags)
263 pp_character (buffer, '[');
264 if (domain)
266 tree min = TYPE_MIN_VALUE (domain);
267 tree max = TYPE_MAX_VALUE (domain);
269 if (min && max
270 && integer_zerop (min)
271 && host_integerp (max, 0))
272 pp_wide_integer (buffer, TREE_INT_CST_LOW (max) + 1);
273 else
275 if (min)
276 dump_generic_node (buffer, min, spc, flags, false);
277 pp_character (buffer, ':');
278 if (max)
279 dump_generic_node (buffer, max, spc, flags, false);
282 else
283 pp_string (buffer, "<unknown>");
284 pp_character (buffer, ']');
288 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
289 dump_generic_node. */
291 static void
292 dump_omp_clause (pretty_printer *buffer, tree clause, int spc, int flags)
294 const char *name;
296 switch (OMP_CLAUSE_CODE (clause))
298 case OMP_CLAUSE_PRIVATE:
299 name = "private";
300 goto print_remap;
301 case OMP_CLAUSE_SHARED:
302 name = "shared";
303 goto print_remap;
304 case OMP_CLAUSE_FIRSTPRIVATE:
305 name = "firstprivate";
306 goto print_remap;
307 case OMP_CLAUSE_LASTPRIVATE:
308 name = "lastprivate";
309 goto print_remap;
310 case OMP_CLAUSE_COPYIN:
311 name = "copyin";
312 goto print_remap;
313 case OMP_CLAUSE_COPYPRIVATE:
314 name = "copyprivate";
315 goto print_remap;
316 print_remap:
317 pp_string (buffer, name);
318 pp_character (buffer, '(');
319 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
320 spc, flags, false);
321 pp_character (buffer, ')');
322 break;
324 case OMP_CLAUSE_REDUCTION:
325 pp_string (buffer, "reduction(");
326 pp_string (buffer, op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause)));
327 pp_character (buffer, ':');
328 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
329 spc, flags, false);
330 pp_character (buffer, ')');
331 break;
333 case OMP_CLAUSE_IF:
334 pp_string (buffer, "if(");
335 dump_generic_node (buffer, OMP_CLAUSE_IF_EXPR (clause),
336 spc, flags, false);
337 pp_character (buffer, ')');
338 break;
340 case OMP_CLAUSE_NUM_THREADS:
341 pp_string (buffer, "num_threads(");
342 dump_generic_node (buffer, OMP_CLAUSE_NUM_THREADS_EXPR (clause),
343 spc, flags, false);
344 pp_character (buffer, ')');
345 break;
347 case OMP_CLAUSE_NOWAIT:
348 pp_string (buffer, "nowait");
349 break;
350 case OMP_CLAUSE_ORDERED:
351 pp_string (buffer, "ordered");
352 break;
354 case OMP_CLAUSE_DEFAULT:
355 pp_string (buffer, "default(");
356 switch (OMP_CLAUSE_DEFAULT_KIND (clause))
358 case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
359 break;
360 case OMP_CLAUSE_DEFAULT_SHARED:
361 pp_string (buffer, "shared");
362 break;
363 case OMP_CLAUSE_DEFAULT_NONE:
364 pp_string (buffer, "none");
365 break;
366 case OMP_CLAUSE_DEFAULT_PRIVATE:
367 pp_string (buffer, "private");
368 break;
369 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
370 pp_string (buffer, "firstprivate");
371 break;
372 default:
373 gcc_unreachable ();
375 pp_character (buffer, ')');
376 break;
378 case OMP_CLAUSE_SCHEDULE:
379 pp_string (buffer, "schedule(");
380 switch (OMP_CLAUSE_SCHEDULE_KIND (clause))
382 case OMP_CLAUSE_SCHEDULE_STATIC:
383 pp_string (buffer, "static");
384 break;
385 case OMP_CLAUSE_SCHEDULE_DYNAMIC:
386 pp_string (buffer, "dynamic");
387 break;
388 case OMP_CLAUSE_SCHEDULE_GUIDED:
389 pp_string (buffer, "guided");
390 break;
391 case OMP_CLAUSE_SCHEDULE_RUNTIME:
392 pp_string (buffer, "runtime");
393 break;
394 case OMP_CLAUSE_SCHEDULE_AUTO:
395 pp_string (buffer, "auto");
396 break;
397 default:
398 gcc_unreachable ();
400 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
402 pp_character (buffer, ',');
403 dump_generic_node (buffer,
404 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
405 spc, flags, false);
407 pp_character (buffer, ')');
408 break;
410 case OMP_CLAUSE_UNTIED:
411 pp_string (buffer, "untied");
412 break;
414 case OMP_CLAUSE_COLLAPSE:
415 pp_string (buffer, "collapse(");
416 dump_generic_node (buffer,
417 OMP_CLAUSE_COLLAPSE_EXPR (clause),
418 spc, flags, false);
419 pp_character (buffer, ')');
420 break;
422 default:
423 /* Should never happen. */
424 dump_generic_node (buffer, clause, spc, flags, false);
425 break;
430 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
431 dump_generic_node. */
433 void
434 dump_omp_clauses (pretty_printer *buffer, tree clause, int spc, int flags)
436 if (clause == NULL)
437 return;
439 pp_space (buffer);
440 while (1)
442 dump_omp_clause (buffer, clause, spc, flags);
443 clause = OMP_CLAUSE_CHAIN (clause);
444 if (clause == NULL)
445 return;
446 pp_space (buffer);
451 /* Dump location LOC to BUFFER. */
453 static void
454 dump_location (pretty_printer *buffer, location_t loc)
456 expanded_location xloc = expand_location (loc);
458 pp_character (buffer, '[');
459 if (xloc.file)
461 pp_string (buffer, xloc.file);
462 pp_string (buffer, " : ");
464 pp_decimal_int (buffer, xloc.line);
465 pp_string (buffer, "] ");
469 /* Dump lexical block BLOCK. BUFFER, SPC and FLAGS are as in
470 dump_generic_node. */
472 static void
473 dump_block_node (pretty_printer *buffer, tree block, int spc, int flags)
475 tree t;
477 pp_printf (buffer, "BLOCK #%d ", BLOCK_NUMBER (block));
479 if (flags & TDF_ADDRESS)
480 pp_printf (buffer, "[%p] ", (void *) block);
482 if (BLOCK_ABSTRACT (block))
483 pp_string (buffer, "[abstract] ");
485 if (TREE_ASM_WRITTEN (block))
486 pp_string (buffer, "[written] ");
488 if (flags & TDF_SLIM)
489 return;
491 if (BLOCK_SOURCE_LOCATION (block))
492 dump_location (buffer, BLOCK_SOURCE_LOCATION (block));
494 newline_and_indent (buffer, spc + 2);
496 if (BLOCK_SUPERCONTEXT (block))
498 pp_string (buffer, "SUPERCONTEXT: ");
499 dump_generic_node (buffer, BLOCK_SUPERCONTEXT (block), 0,
500 flags | TDF_SLIM, false);
501 newline_and_indent (buffer, spc + 2);
504 if (BLOCK_SUBBLOCKS (block))
506 pp_string (buffer, "SUBBLOCKS: ");
507 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
509 dump_generic_node (buffer, t, 0, flags | TDF_SLIM, false);
510 pp_string (buffer, " ");
512 newline_and_indent (buffer, spc + 2);
515 if (BLOCK_CHAIN (block))
517 pp_string (buffer, "SIBLINGS: ");
518 for (t = BLOCK_CHAIN (block); t; t = BLOCK_CHAIN (t))
520 dump_generic_node (buffer, t, 0, flags | TDF_SLIM, false);
521 pp_string (buffer, " ");
523 newline_and_indent (buffer, spc + 2);
526 if (BLOCK_VARS (block))
528 pp_string (buffer, "VARS: ");
529 for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
531 dump_generic_node (buffer, t, 0, flags, false);
532 pp_string (buffer, " ");
534 newline_and_indent (buffer, spc + 2);
537 if (VEC_length (tree, BLOCK_NONLOCALIZED_VARS (block)) > 0)
539 unsigned i;
540 VEC(tree,gc) *nlv = BLOCK_NONLOCALIZED_VARS (block);
542 pp_string (buffer, "NONLOCALIZED_VARS: ");
543 for (i = 0; VEC_iterate (tree, nlv, i, t); i++)
545 dump_generic_node (buffer, t, 0, flags, false);
546 pp_string (buffer, " ");
548 newline_and_indent (buffer, spc + 2);
551 if (BLOCK_ABSTRACT_ORIGIN (block))
553 pp_string (buffer, "ABSTRACT_ORIGIN: ");
554 dump_generic_node (buffer, BLOCK_ABSTRACT_ORIGIN (block), 0,
555 flags | TDF_SLIM, false);
556 newline_and_indent (buffer, spc + 2);
559 if (BLOCK_FRAGMENT_ORIGIN (block))
561 pp_string (buffer, "FRAGMENT_ORIGIN: ");
562 dump_generic_node (buffer, BLOCK_FRAGMENT_ORIGIN (block), 0,
563 flags | TDF_SLIM, false);
564 newline_and_indent (buffer, spc + 2);
567 if (BLOCK_FRAGMENT_CHAIN (block))
569 pp_string (buffer, "FRAGMENT_CHAIN: ");
570 for (t = BLOCK_FRAGMENT_CHAIN (block); t; t = BLOCK_FRAGMENT_CHAIN (t))
572 dump_generic_node (buffer, t, 0, flags | TDF_SLIM, false);
573 pp_string (buffer, " ");
575 newline_and_indent (buffer, spc + 2);
580 /* Dump the node NODE on the pretty_printer BUFFER, SPC spaces of
581 indent. FLAGS specifies details to show in the dump (see TDF_* in
582 tree-pass.h). If IS_STMT is true, the object printed is considered
583 to be a statement and it is terminated by ';' if appropriate. */
586 dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
587 bool is_stmt)
589 tree type;
590 tree op0, op1;
591 const char *str;
592 bool is_expr;
594 if (node == NULL_TREE)
595 return spc;
597 is_expr = EXPR_P (node);
599 if (is_stmt && (flags & TDF_STMTADDR))
600 pp_printf (buffer, "<&%p> ", (void *)node);
602 if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
603 dump_location (buffer, EXPR_LOCATION (node));
605 switch (TREE_CODE (node))
607 case ERROR_MARK:
608 pp_string (buffer, "<<< error >>>");
609 break;
611 case IDENTIFIER_NODE:
612 pp_tree_identifier (buffer, node);
613 break;
615 case TREE_LIST:
616 while (node && node != error_mark_node)
618 if (TREE_PURPOSE (node))
620 dump_generic_node (buffer, TREE_PURPOSE (node), spc, flags, false);
621 pp_space (buffer);
623 dump_generic_node (buffer, TREE_VALUE (node), spc, flags, false);
624 node = TREE_CHAIN (node);
625 if (node && TREE_CODE (node) == TREE_LIST)
627 pp_character (buffer, ',');
628 pp_space (buffer);
631 break;
633 case TREE_BINFO:
634 dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
635 break;
637 case TREE_VEC:
639 size_t i;
640 if (TREE_VEC_LENGTH (node) > 0)
642 size_t len = TREE_VEC_LENGTH (node);
643 for (i = 0; i < len - 1; i++)
645 dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags,
646 false);
647 pp_character (buffer, ',');
648 pp_space (buffer);
650 dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc,
651 flags, false);
654 break;
656 case VOID_TYPE:
657 case INTEGER_TYPE:
658 case REAL_TYPE:
659 case FIXED_POINT_TYPE:
660 case COMPLEX_TYPE:
661 case VECTOR_TYPE:
662 case ENUMERAL_TYPE:
663 case BOOLEAN_TYPE:
665 unsigned int quals = TYPE_QUALS (node);
666 enum tree_code_class tclass;
668 if (quals & TYPE_QUAL_CONST)
669 pp_string (buffer, "const ");
670 else if (quals & TYPE_QUAL_VOLATILE)
671 pp_string (buffer, "volatile ");
672 else if (quals & TYPE_QUAL_RESTRICT)
673 pp_string (buffer, "restrict ");
675 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
677 pp_string (buffer, "<address-space-");
678 pp_decimal_int (buffer, TYPE_ADDR_SPACE (node));
679 pp_string (buffer, "> ");
682 tclass = TREE_CODE_CLASS (TREE_CODE (node));
684 if (tclass == tcc_declaration)
686 if (DECL_NAME (node))
687 dump_decl_name (buffer, node, flags);
688 else
689 pp_string (buffer, "<unnamed type decl>");
691 else if (tclass == tcc_type)
693 if (TYPE_NAME (node))
695 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
696 pp_tree_identifier (buffer, TYPE_NAME (node));
697 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
698 && DECL_NAME (TYPE_NAME (node)))
699 dump_decl_name (buffer, TYPE_NAME (node), flags);
700 else
701 pp_string (buffer, "<unnamed type>");
703 else if (TREE_CODE (node) == VECTOR_TYPE)
705 pp_string (buffer, "vector");
706 pp_character (buffer, '(');
707 pp_wide_integer (buffer, TYPE_VECTOR_SUBPARTS (node));
708 pp_string (buffer, ") ");
709 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
711 else if (TREE_CODE (node) == INTEGER_TYPE)
713 pp_string (buffer, (TYPE_UNSIGNED (node)
714 ? "<unnamed-unsigned:"
715 : "<unnamed-signed:"));
716 pp_decimal_int (buffer, TYPE_PRECISION (node));
717 pp_string (buffer, ">");
719 else if (TREE_CODE (node) == COMPLEX_TYPE)
721 pp_string (buffer, "__complex__ ");
722 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
724 else if (TREE_CODE (node) == REAL_TYPE)
726 pp_string (buffer, "<float:");
727 pp_decimal_int (buffer, TYPE_PRECISION (node));
728 pp_string (buffer, ">");
730 else if (TREE_CODE (node) == FIXED_POINT_TYPE)
732 pp_string (buffer, "<fixed-point-");
733 pp_string (buffer, TYPE_SATURATING (node) ? "sat:" : "nonsat:");
734 pp_decimal_int (buffer, TYPE_PRECISION (node));
735 pp_string (buffer, ">");
737 else
738 pp_string (buffer, "<unnamed type>");
740 break;
743 case POINTER_TYPE:
744 case REFERENCE_TYPE:
745 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
747 if (TREE_TYPE (node) == NULL)
749 pp_string (buffer, str);
750 pp_string (buffer, "<null type>");
752 else if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
754 tree fnode = TREE_TYPE (node);
756 dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false);
757 pp_space (buffer);
758 pp_character (buffer, '(');
759 pp_string (buffer, str);
760 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
761 dump_decl_name (buffer, TYPE_NAME (node), flags);
762 else
763 pp_printf (buffer, "<T%x>", TYPE_UID (node));
765 pp_character (buffer, ')');
766 dump_function_declaration (buffer, fnode, spc, flags);
768 else
770 unsigned int quals = TYPE_QUALS (node);
772 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
773 pp_space (buffer);
774 pp_string (buffer, str);
776 if (quals & TYPE_QUAL_CONST)
777 pp_string (buffer, " const");
778 if (quals & TYPE_QUAL_VOLATILE)
779 pp_string (buffer, " volatile");
780 if (quals & TYPE_QUAL_RESTRICT)
781 pp_string (buffer, " restrict");
783 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
785 pp_string (buffer, " <address-space-");
786 pp_decimal_int (buffer, TYPE_ADDR_SPACE (node));
787 pp_string (buffer, ">");
790 if (TYPE_REF_CAN_ALIAS_ALL (node))
791 pp_string (buffer, " {ref-all}");
793 break;
795 case OFFSET_TYPE:
796 NIY;
797 break;
799 case TARGET_MEM_REF:
801 const char *sep = "";
802 tree tmp;
804 pp_string (buffer, "MEM[");
806 tmp = TMR_SYMBOL (node);
807 if (tmp)
809 pp_string (buffer, sep);
810 sep = ", ";
811 pp_string (buffer, "symbol: ");
812 dump_generic_node (buffer, tmp, spc, flags, false);
814 tmp = TMR_BASE (node);
815 if (tmp)
817 pp_string (buffer, sep);
818 sep = ", ";
819 pp_string (buffer, "base: ");
820 dump_generic_node (buffer, tmp, spc, flags, false);
822 tmp = TMR_INDEX (node);
823 if (tmp)
825 pp_string (buffer, sep);
826 sep = ", ";
827 pp_string (buffer, "index: ");
828 dump_generic_node (buffer, tmp, spc, flags, false);
830 tmp = TMR_STEP (node);
831 if (tmp)
833 pp_string (buffer, sep);
834 sep = ", ";
835 pp_string (buffer, "step: ");
836 dump_generic_node (buffer, tmp, spc, flags, false);
838 tmp = TMR_OFFSET (node);
839 if (tmp)
841 pp_string (buffer, sep);
842 sep = ", ";
843 pp_string (buffer, "offset: ");
844 dump_generic_node (buffer, tmp, spc, flags, false);
846 pp_string (buffer, "]");
847 if (flags & TDF_DETAILS)
849 pp_string (buffer, "{");
850 dump_generic_node (buffer, TMR_ORIGINAL (node), spc, flags,
851 false);
852 pp_string (buffer, "}");
855 break;
857 case ARRAY_TYPE:
859 tree tmp;
861 /* Print the innermost component type. */
862 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
863 tmp = TREE_TYPE (tmp))
865 dump_generic_node (buffer, tmp, spc, flags, false);
867 /* Print the dimensions. */
868 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
869 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
870 break;
873 case RECORD_TYPE:
874 case UNION_TYPE:
875 case QUAL_UNION_TYPE:
877 unsigned int quals = TYPE_QUALS (node);
879 if (quals & TYPE_QUAL_CONST)
880 pp_string (buffer, "const ");
881 if (quals & TYPE_QUAL_VOLATILE)
882 pp_string (buffer, "volatile ");
884 /* Print the name of the structure. */
885 if (TREE_CODE (node) == RECORD_TYPE)
886 pp_string (buffer, "struct ");
887 else if (TREE_CODE (node) == UNION_TYPE)
888 pp_string (buffer, "union ");
890 if (TYPE_NAME (node))
891 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
892 else if (!(flags & TDF_SLIM))
893 /* FIXME: If we eliminate the 'else' above and attempt
894 to show the fields for named types, we may get stuck
895 following a cycle of pointers to structs. The alleged
896 self-reference check in print_struct_decl will not detect
897 cycles involving more than one pointer or struct type. */
898 print_struct_decl (buffer, node, spc, flags);
899 break;
902 case LANG_TYPE:
903 NIY;
904 break;
906 case INTEGER_CST:
907 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
909 /* In the case of a pointer, one may want to divide by the
910 size of the pointed-to type. Unfortunately, this not
911 straightforward. The C front-end maps expressions
913 (int *) 5
914 int *p; (p + 5)
916 in such a way that the two INTEGER_CST nodes for "5" have
917 different values but identical types. In the latter
918 case, the 5 is multiplied by sizeof (int) in c-common.c
919 (pointer_int_sum) to convert it to a byte address, and
920 yet the type of the node is left unchanged. Argh. What
921 is consistent though is that the number value corresponds
922 to bytes (UNITS) offset.
924 NB: Neither of the following divisors can be trivially
925 used to recover the original literal:
927 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
928 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
929 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
930 pp_string (buffer, "B"); /* pseudo-unit */
932 else if (! host_integerp (node, 0))
934 tree val = node;
935 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (val);
936 HOST_WIDE_INT high = TREE_INT_CST_HIGH (val);
938 if (tree_int_cst_sgn (val) < 0)
940 pp_character (buffer, '-');
941 high = ~high + !low;
942 low = -low;
944 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
945 systems? */
946 sprintf (pp_buffer (buffer)->digit_buffer,
947 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
948 (unsigned HOST_WIDE_INT) high, low);
949 pp_string (buffer, pp_buffer (buffer)->digit_buffer);
951 else
952 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
953 break;
955 case REAL_CST:
956 /* Code copied from print_node. */
958 REAL_VALUE_TYPE d;
959 if (TREE_OVERFLOW (node))
960 pp_string (buffer, " overflow");
962 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
963 d = TREE_REAL_CST (node);
964 if (REAL_VALUE_ISINF (d))
965 pp_string (buffer, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
966 else if (REAL_VALUE_ISNAN (d))
967 pp_string (buffer, " Nan");
968 else
970 char string[100];
971 real_to_decimal (string, &d, sizeof (string), 0, 1);
972 pp_string (buffer, string);
974 #else
976 HOST_WIDE_INT i;
977 unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
978 pp_string (buffer, "0x");
979 for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
980 output_formatted_integer (buffer, "%02x", *p++);
982 #endif
983 break;
986 case FIXED_CST:
988 char string[100];
989 fixed_to_decimal (string, TREE_FIXED_CST_PTR (node), sizeof (string));
990 pp_string (buffer, string);
991 break;
994 case COMPLEX_CST:
995 pp_string (buffer, "__complex__ (");
996 dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
997 pp_string (buffer, ", ");
998 dump_generic_node (buffer, TREE_IMAGPART (node), spc, flags, false);
999 pp_string (buffer, ")");
1000 break;
1002 case STRING_CST:
1003 pp_string (buffer, "\"");
1004 pretty_print_string (buffer, TREE_STRING_POINTER (node));
1005 pp_string (buffer, "\"");
1006 break;
1008 case VECTOR_CST:
1010 tree elt;
1011 pp_string (buffer, "{ ");
1012 for (elt = TREE_VECTOR_CST_ELTS (node); elt; elt = TREE_CHAIN (elt))
1014 dump_generic_node (buffer, TREE_VALUE (elt), spc, flags, false);
1015 if (TREE_CHAIN (elt))
1016 pp_string (buffer, ", ");
1018 pp_string (buffer, " }");
1020 break;
1022 case FUNCTION_TYPE:
1023 case METHOD_TYPE:
1024 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1025 pp_space (buffer);
1026 if (TREE_CODE (node) == METHOD_TYPE)
1028 if (TYPE_METHOD_BASETYPE (node))
1029 dump_decl_name (buffer, TYPE_NAME (TYPE_METHOD_BASETYPE (node)),
1030 flags);
1031 else
1032 pp_string (buffer, "<null method basetype>");
1033 pp_string (buffer, "::");
1035 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
1036 dump_decl_name (buffer, TYPE_NAME (node), flags);
1037 else
1038 pp_printf (buffer, "<T%x>", TYPE_UID (node));
1039 dump_function_declaration (buffer, node, spc, flags);
1040 break;
1042 case FUNCTION_DECL:
1043 case CONST_DECL:
1044 dump_decl_name (buffer, node, flags);
1045 break;
1047 case LABEL_DECL:
1048 if (DECL_NAME (node))
1049 dump_decl_name (buffer, node, flags);
1050 else if (LABEL_DECL_UID (node) != -1)
1051 pp_printf (buffer, "<L%d>", (int) LABEL_DECL_UID (node));
1052 else
1054 if (flags & TDF_NOUID)
1055 pp_string (buffer, "<D.xxxx>");
1056 else
1057 pp_printf (buffer, "<D.%u>", DECL_UID (node));
1059 break;
1061 case TYPE_DECL:
1062 if (DECL_IS_BUILTIN (node))
1064 /* Don't print the declaration of built-in types. */
1065 break;
1067 if (DECL_NAME (node))
1068 dump_decl_name (buffer, node, flags);
1069 else
1071 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
1072 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
1073 && TYPE_METHODS (TREE_TYPE (node)))
1075 /* The type is a c++ class: all structures have at least
1076 4 methods. */
1077 pp_string (buffer, "class ");
1078 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1080 else
1082 pp_string (buffer,
1083 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
1084 ? "union" : "struct "));
1085 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1088 break;
1090 case VAR_DECL:
1091 case PARM_DECL:
1092 case FIELD_DECL:
1093 case DEBUG_EXPR_DECL:
1094 case NAMESPACE_DECL:
1095 dump_decl_name (buffer, node, flags);
1096 break;
1098 case RESULT_DECL:
1099 pp_string (buffer, "<retval>");
1100 break;
1102 case COMPONENT_REF:
1103 op0 = TREE_OPERAND (node, 0);
1104 str = ".";
1105 if (op0 && TREE_CODE (op0) == INDIRECT_REF)
1107 op0 = TREE_OPERAND (op0, 0);
1108 str = "->";
1110 if (op_prio (op0) < op_prio (node))
1111 pp_character (buffer, '(');
1112 dump_generic_node (buffer, op0, spc, flags, false);
1113 if (op_prio (op0) < op_prio (node))
1114 pp_character (buffer, ')');
1115 pp_string (buffer, str);
1116 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1117 op0 = component_ref_field_offset (node);
1118 if (op0 && TREE_CODE (op0) != INTEGER_CST)
1120 pp_string (buffer, "{off: ");
1121 dump_generic_node (buffer, op0, spc, flags, false);
1122 pp_character (buffer, '}');
1124 break;
1126 case BIT_FIELD_REF:
1127 pp_string (buffer, "BIT_FIELD_REF <");
1128 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1129 pp_string (buffer, ", ");
1130 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1131 pp_string (buffer, ", ");
1132 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1133 pp_string (buffer, ">");
1134 break;
1136 case ARRAY_REF:
1137 case ARRAY_RANGE_REF:
1138 op0 = TREE_OPERAND (node, 0);
1139 if (op_prio (op0) < op_prio (node))
1140 pp_character (buffer, '(');
1141 dump_generic_node (buffer, op0, spc, flags, false);
1142 if (op_prio (op0) < op_prio (node))
1143 pp_character (buffer, ')');
1144 pp_character (buffer, '[');
1145 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1146 if (TREE_CODE (node) == ARRAY_RANGE_REF)
1147 pp_string (buffer, " ...");
1148 pp_character (buffer, ']');
1150 op0 = array_ref_low_bound (node);
1151 op1 = array_ref_element_size (node);
1153 if (!integer_zerop (op0)
1154 || TREE_OPERAND (node, 2)
1155 || TREE_OPERAND (node, 3))
1157 pp_string (buffer, "{lb: ");
1158 dump_generic_node (buffer, op0, spc, flags, false);
1159 pp_string (buffer, " sz: ");
1160 dump_generic_node (buffer, op1, spc, flags, false);
1161 pp_character (buffer, '}');
1163 break;
1165 case CONSTRUCTOR:
1167 unsigned HOST_WIDE_INT ix;
1168 tree field, val;
1169 bool is_struct_init = FALSE;
1170 pp_character (buffer, '{');
1171 if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
1172 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
1173 is_struct_init = TRUE;
1174 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
1176 if (field && is_struct_init)
1178 pp_character (buffer, '.');
1179 dump_generic_node (buffer, field, spc, flags, false);
1180 pp_string (buffer, "=");
1182 if (val && TREE_CODE (val) == ADDR_EXPR)
1183 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
1184 val = TREE_OPERAND (val, 0);
1185 if (val && TREE_CODE (val) == FUNCTION_DECL)
1186 dump_decl_name (buffer, val, flags);
1187 else
1188 dump_generic_node (buffer, val, spc, flags, false);
1189 if (ix != VEC_length (constructor_elt, CONSTRUCTOR_ELTS (node)) - 1)
1191 pp_character (buffer, ',');
1192 pp_space (buffer);
1195 pp_character (buffer, '}');
1197 break;
1199 case COMPOUND_EXPR:
1201 tree *tp;
1202 if (flags & TDF_SLIM)
1204 pp_string (buffer, "<COMPOUND_EXPR>");
1205 break;
1208 dump_generic_node (buffer, TREE_OPERAND (node, 0),
1209 spc, flags, !(flags & TDF_SLIM));
1210 if (flags & TDF_SLIM)
1211 newline_and_indent (buffer, spc);
1212 else
1214 pp_character (buffer, ',');
1215 pp_space (buffer);
1218 for (tp = &TREE_OPERAND (node, 1);
1219 TREE_CODE (*tp) == COMPOUND_EXPR;
1220 tp = &TREE_OPERAND (*tp, 1))
1222 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
1223 spc, flags, !(flags & TDF_SLIM));
1224 if (flags & TDF_SLIM)
1225 newline_and_indent (buffer, spc);
1226 else
1228 pp_character (buffer, ',');
1229 pp_space (buffer);
1233 dump_generic_node (buffer, *tp, spc, flags, !(flags & TDF_SLIM));
1235 break;
1237 case STATEMENT_LIST:
1239 tree_stmt_iterator si;
1240 bool first = true;
1242 if (flags & TDF_SLIM)
1244 pp_string (buffer, "<STATEMENT_LIST>");
1245 break;
1248 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
1250 if (!first)
1251 newline_and_indent (buffer, spc);
1252 else
1253 first = false;
1254 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
1257 break;
1259 case MODIFY_EXPR:
1260 case INIT_EXPR:
1261 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags,
1262 false);
1263 pp_space (buffer);
1264 pp_character (buffer, '=');
1265 if (TREE_CODE (node) == MODIFY_EXPR
1266 && MOVE_NONTEMPORAL (node))
1267 pp_string (buffer, "{nt}");
1268 pp_space (buffer);
1269 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags,
1270 false);
1271 break;
1273 case TARGET_EXPR:
1274 pp_string (buffer, "TARGET_EXPR <");
1275 dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false);
1276 pp_character (buffer, ',');
1277 pp_space (buffer);
1278 dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false);
1279 pp_character (buffer, '>');
1280 break;
1282 case DECL_EXPR:
1283 print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags);
1284 is_stmt = false;
1285 break;
1287 case COND_EXPR:
1288 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
1290 pp_string (buffer, "if (");
1291 dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false);
1292 pp_character (buffer, ')');
1293 /* The lowered cond_exprs should always be printed in full. */
1294 if (COND_EXPR_THEN (node)
1295 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
1296 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
1297 && COND_EXPR_ELSE (node)
1298 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
1299 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
1301 pp_space (buffer);
1302 dump_generic_node (buffer, COND_EXPR_THEN (node),
1303 0, flags, true);
1304 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
1306 pp_string (buffer, " else ");
1307 dump_generic_node (buffer, COND_EXPR_ELSE (node),
1308 0, flags, true);
1311 else if (!(flags & TDF_SLIM))
1313 /* Output COND_EXPR_THEN. */
1314 if (COND_EXPR_THEN (node))
1316 newline_and_indent (buffer, spc+2);
1317 pp_character (buffer, '{');
1318 newline_and_indent (buffer, spc+4);
1319 dump_generic_node (buffer, COND_EXPR_THEN (node), spc+4,
1320 flags, true);
1321 newline_and_indent (buffer, spc+2);
1322 pp_character (buffer, '}');
1325 /* Output COND_EXPR_ELSE. */
1326 if (COND_EXPR_ELSE (node)
1327 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
1329 newline_and_indent (buffer, spc);
1330 pp_string (buffer, "else");
1331 newline_and_indent (buffer, spc+2);
1332 pp_character (buffer, '{');
1333 newline_and_indent (buffer, spc+4);
1334 dump_generic_node (buffer, COND_EXPR_ELSE (node), spc+4,
1335 flags, true);
1336 newline_and_indent (buffer, spc+2);
1337 pp_character (buffer, '}');
1340 is_expr = false;
1342 else
1344 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1345 pp_space (buffer);
1346 pp_character (buffer, '?');
1347 pp_space (buffer);
1348 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1349 pp_space (buffer);
1350 pp_character (buffer, ':');
1351 pp_space (buffer);
1352 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1354 break;
1356 case BIND_EXPR:
1357 pp_character (buffer, '{');
1358 if (!(flags & TDF_SLIM))
1360 if (BIND_EXPR_VARS (node))
1362 pp_newline (buffer);
1364 for (op0 = BIND_EXPR_VARS (node); op0; op0 = TREE_CHAIN (op0))
1366 print_declaration (buffer, op0, spc+2, flags);
1367 pp_newline (buffer);
1371 newline_and_indent (buffer, spc+2);
1372 dump_generic_node (buffer, BIND_EXPR_BODY (node), spc+2, flags, true);
1373 newline_and_indent (buffer, spc);
1374 pp_character (buffer, '}');
1376 is_expr = false;
1377 break;
1379 case CALL_EXPR:
1380 print_call_name (buffer, CALL_EXPR_FN (node), flags);
1382 /* Print parameters. */
1383 pp_space (buffer);
1384 pp_character (buffer, '(');
1386 tree arg;
1387 call_expr_arg_iterator iter;
1388 FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
1390 dump_generic_node (buffer, arg, spc, flags, false);
1391 if (more_call_expr_args_p (&iter))
1393 pp_character (buffer, ',');
1394 pp_space (buffer);
1398 if (CALL_EXPR_VA_ARG_PACK (node))
1400 if (call_expr_nargs (node) > 0)
1402 pp_character (buffer, ',');
1403 pp_space (buffer);
1405 pp_string (buffer, "__builtin_va_arg_pack ()");
1407 pp_character (buffer, ')');
1409 op1 = CALL_EXPR_STATIC_CHAIN (node);
1410 if (op1)
1412 pp_string (buffer, " [static-chain: ");
1413 dump_generic_node (buffer, op1, spc, flags, false);
1414 pp_character (buffer, ']');
1417 if (CALL_EXPR_RETURN_SLOT_OPT (node))
1418 pp_string (buffer, " [return slot optimization]");
1419 if (CALL_EXPR_TAILCALL (node))
1420 pp_string (buffer, " [tail call]");
1421 break;
1423 case WITH_CLEANUP_EXPR:
1424 NIY;
1425 break;
1427 case CLEANUP_POINT_EXPR:
1428 pp_string (buffer, "<<cleanup_point ");
1429 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1430 pp_string (buffer, ">>");
1431 break;
1433 case PLACEHOLDER_EXPR:
1434 pp_string (buffer, "<PLACEHOLDER_EXPR ");
1435 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1436 pp_character (buffer, '>');
1437 break;
1439 /* Binary arithmetic and logic expressions. */
1440 case WIDEN_SUM_EXPR:
1441 case WIDEN_MULT_EXPR:
1442 case MULT_EXPR:
1443 case PLUS_EXPR:
1444 case POINTER_PLUS_EXPR:
1445 case MINUS_EXPR:
1446 case TRUNC_DIV_EXPR:
1447 case CEIL_DIV_EXPR:
1448 case FLOOR_DIV_EXPR:
1449 case ROUND_DIV_EXPR:
1450 case TRUNC_MOD_EXPR:
1451 case CEIL_MOD_EXPR:
1452 case FLOOR_MOD_EXPR:
1453 case ROUND_MOD_EXPR:
1454 case RDIV_EXPR:
1455 case EXACT_DIV_EXPR:
1456 case LSHIFT_EXPR:
1457 case RSHIFT_EXPR:
1458 case LROTATE_EXPR:
1459 case RROTATE_EXPR:
1460 case VEC_LSHIFT_EXPR:
1461 case VEC_RSHIFT_EXPR:
1462 case BIT_IOR_EXPR:
1463 case BIT_XOR_EXPR:
1464 case BIT_AND_EXPR:
1465 case TRUTH_ANDIF_EXPR:
1466 case TRUTH_ORIF_EXPR:
1467 case TRUTH_AND_EXPR:
1468 case TRUTH_OR_EXPR:
1469 case TRUTH_XOR_EXPR:
1470 case LT_EXPR:
1471 case LE_EXPR:
1472 case GT_EXPR:
1473 case GE_EXPR:
1474 case EQ_EXPR:
1475 case NE_EXPR:
1476 case UNLT_EXPR:
1477 case UNLE_EXPR:
1478 case UNGT_EXPR:
1479 case UNGE_EXPR:
1480 case UNEQ_EXPR:
1481 case LTGT_EXPR:
1482 case ORDERED_EXPR:
1483 case UNORDERED_EXPR:
1485 const char *op = op_symbol (node);
1486 op0 = TREE_OPERAND (node, 0);
1487 op1 = TREE_OPERAND (node, 1);
1489 /* When the operands are expressions with less priority,
1490 keep semantics of the tree representation. */
1491 if (op_prio (op0) <= op_prio (node))
1493 pp_character (buffer, '(');
1494 dump_generic_node (buffer, op0, spc, flags, false);
1495 pp_character (buffer, ')');
1497 else
1498 dump_generic_node (buffer, op0, spc, flags, false);
1500 pp_space (buffer);
1501 pp_string (buffer, op);
1502 pp_space (buffer);
1504 /* When the operands are expressions with less priority,
1505 keep semantics of the tree representation. */
1506 if (op_prio (op1) <= op_prio (node))
1508 pp_character (buffer, '(');
1509 dump_generic_node (buffer, op1, spc, flags, false);
1510 pp_character (buffer, ')');
1512 else
1513 dump_generic_node (buffer, op1, spc, flags, false);
1515 break;
1517 /* Unary arithmetic and logic expressions. */
1518 case NEGATE_EXPR:
1519 case BIT_NOT_EXPR:
1520 case TRUTH_NOT_EXPR:
1521 case ADDR_EXPR:
1522 case PREDECREMENT_EXPR:
1523 case PREINCREMENT_EXPR:
1524 case ALIGN_INDIRECT_REF:
1525 case MISALIGNED_INDIRECT_REF:
1526 case INDIRECT_REF:
1527 if (TREE_CODE (node) == ADDR_EXPR
1528 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
1529 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
1530 ; /* Do not output '&' for strings and function pointers. */
1531 else
1532 pp_string (buffer, op_symbol (node));
1534 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1536 pp_character (buffer, '(');
1537 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1538 pp_character (buffer, ')');
1540 else
1541 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1543 if (TREE_CODE (node) == MISALIGNED_INDIRECT_REF)
1545 pp_string (buffer, "{misalignment: ");
1546 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1547 pp_character (buffer, '}');
1549 break;
1551 case POSTDECREMENT_EXPR:
1552 case POSTINCREMENT_EXPR:
1553 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1555 pp_character (buffer, '(');
1556 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1557 pp_character (buffer, ')');
1559 else
1560 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1561 pp_string (buffer, op_symbol (node));
1562 break;
1564 case MIN_EXPR:
1565 pp_string (buffer, "MIN_EXPR <");
1566 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1567 pp_string (buffer, ", ");
1568 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1569 pp_character (buffer, '>');
1570 break;
1572 case MAX_EXPR:
1573 pp_string (buffer, "MAX_EXPR <");
1574 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1575 pp_string (buffer, ", ");
1576 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1577 pp_character (buffer, '>');
1578 break;
1580 case ABS_EXPR:
1581 pp_string (buffer, "ABS_EXPR <");
1582 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1583 pp_character (buffer, '>');
1584 break;
1586 case RANGE_EXPR:
1587 NIY;
1588 break;
1590 case ADDR_SPACE_CONVERT_EXPR:
1591 case FIXED_CONVERT_EXPR:
1592 case FIX_TRUNC_EXPR:
1593 case FLOAT_EXPR:
1594 CASE_CONVERT:
1595 type = TREE_TYPE (node);
1596 op0 = TREE_OPERAND (node, 0);
1597 if (type != TREE_TYPE (op0))
1599 pp_character (buffer, '(');
1600 dump_generic_node (buffer, type, spc, flags, false);
1601 pp_string (buffer, ") ");
1603 if (op_prio (op0) < op_prio (node))
1604 pp_character (buffer, '(');
1605 dump_generic_node (buffer, op0, spc, flags, false);
1606 if (op_prio (op0) < op_prio (node))
1607 pp_character (buffer, ')');
1608 break;
1610 case VIEW_CONVERT_EXPR:
1611 pp_string (buffer, "VIEW_CONVERT_EXPR<");
1612 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1613 pp_string (buffer, ">(");
1614 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1615 pp_character (buffer, ')');
1616 break;
1618 case PAREN_EXPR:
1619 pp_string (buffer, "((");
1620 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1621 pp_string (buffer, "))");
1622 break;
1624 case NON_LVALUE_EXPR:
1625 pp_string (buffer, "NON_LVALUE_EXPR <");
1626 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1627 pp_character (buffer, '>');
1628 break;
1630 case SAVE_EXPR:
1631 pp_string (buffer, "SAVE_EXPR <");
1632 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1633 pp_character (buffer, '>');
1634 break;
1636 case COMPLEX_EXPR:
1637 pp_string (buffer, "COMPLEX_EXPR <");
1638 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1639 pp_string (buffer, ", ");
1640 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1641 pp_string (buffer, ">");
1642 break;
1644 case CONJ_EXPR:
1645 pp_string (buffer, "CONJ_EXPR <");
1646 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1647 pp_string (buffer, ">");
1648 break;
1650 case REALPART_EXPR:
1651 pp_string (buffer, "REALPART_EXPR <");
1652 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1653 pp_string (buffer, ">");
1654 break;
1656 case IMAGPART_EXPR:
1657 pp_string (buffer, "IMAGPART_EXPR <");
1658 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1659 pp_string (buffer, ">");
1660 break;
1662 case VA_ARG_EXPR:
1663 pp_string (buffer, "VA_ARG_EXPR <");
1664 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1665 pp_string (buffer, ">");
1666 break;
1668 case TRY_FINALLY_EXPR:
1669 case TRY_CATCH_EXPR:
1670 pp_string (buffer, "try");
1671 newline_and_indent (buffer, spc+2);
1672 pp_string (buffer, "{");
1673 newline_and_indent (buffer, spc+4);
1674 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc+4, flags, true);
1675 newline_and_indent (buffer, spc+2);
1676 pp_string (buffer, "}");
1677 newline_and_indent (buffer, spc);
1678 pp_string (buffer,
1679 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
1680 newline_and_indent (buffer, spc+2);
1681 pp_string (buffer, "{");
1682 newline_and_indent (buffer, spc+4);
1683 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
1684 newline_and_indent (buffer, spc+2);
1685 pp_string (buffer, "}");
1686 is_expr = false;
1687 break;
1689 case CATCH_EXPR:
1690 pp_string (buffer, "catch (");
1691 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
1692 pp_string (buffer, ")");
1693 newline_and_indent (buffer, spc+2);
1694 pp_string (buffer, "{");
1695 newline_and_indent (buffer, spc+4);
1696 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
1697 newline_and_indent (buffer, spc+2);
1698 pp_string (buffer, "}");
1699 is_expr = false;
1700 break;
1702 case EH_FILTER_EXPR:
1703 pp_string (buffer, "<<<eh_filter (");
1704 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
1705 pp_string (buffer, ")>>>");
1706 newline_and_indent (buffer, spc+2);
1707 pp_string (buffer, "{");
1708 newline_and_indent (buffer, spc+4);
1709 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
1710 newline_and_indent (buffer, spc+2);
1711 pp_string (buffer, "}");
1712 is_expr = false;
1713 break;
1715 case LABEL_EXPR:
1716 op0 = TREE_OPERAND (node, 0);
1717 /* If this is for break or continue, don't bother printing it. */
1718 if (DECL_NAME (op0))
1720 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1721 if (strcmp (name, "break") == 0
1722 || strcmp (name, "continue") == 0)
1723 break;
1725 dump_generic_node (buffer, op0, spc, flags, false);
1726 pp_character (buffer, ':');
1727 if (DECL_NONLOCAL (op0))
1728 pp_string (buffer, " [non-local]");
1729 break;
1731 case LOOP_EXPR:
1732 pp_string (buffer, "while (1)");
1733 if (!(flags & TDF_SLIM))
1735 newline_and_indent (buffer, spc+2);
1736 pp_character (buffer, '{');
1737 newline_and_indent (buffer, spc+4);
1738 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
1739 newline_and_indent (buffer, spc+2);
1740 pp_character (buffer, '}');
1742 is_expr = false;
1743 break;
1745 case PREDICT_EXPR:
1746 pp_string (buffer, "// predicted ");
1747 if (PREDICT_EXPR_OUTCOME (node))
1748 pp_string (buffer, "likely by ");
1749 else
1750 pp_string (buffer, "unlikely by ");
1751 pp_string (buffer, predictor_name (PREDICT_EXPR_PREDICTOR (node)));
1752 pp_string (buffer, " predictor.");
1753 break;
1755 case RETURN_EXPR:
1756 pp_string (buffer, "return");
1757 op0 = TREE_OPERAND (node, 0);
1758 if (op0)
1760 pp_space (buffer);
1761 if (TREE_CODE (op0) == MODIFY_EXPR)
1762 dump_generic_node (buffer, TREE_OPERAND (op0, 1),
1763 spc, flags, false);
1764 else
1765 dump_generic_node (buffer, op0, spc, flags, false);
1767 break;
1769 case EXIT_EXPR:
1770 pp_string (buffer, "if (");
1771 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1772 pp_string (buffer, ") break");
1773 break;
1775 case SWITCH_EXPR:
1776 pp_string (buffer, "switch (");
1777 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
1778 pp_character (buffer, ')');
1779 if (!(flags & TDF_SLIM))
1781 newline_and_indent (buffer, spc+2);
1782 pp_character (buffer, '{');
1783 if (SWITCH_BODY (node))
1785 newline_and_indent (buffer, spc+4);
1786 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags,
1787 true);
1789 else
1791 tree vec = SWITCH_LABELS (node);
1792 size_t i, n = TREE_VEC_LENGTH (vec);
1793 for (i = 0; i < n; ++i)
1795 tree elt = TREE_VEC_ELT (vec, i);
1796 newline_and_indent (buffer, spc+4);
1797 if (elt)
1799 dump_generic_node (buffer, elt, spc+4, flags, false);
1800 pp_string (buffer, " goto ");
1801 dump_generic_node (buffer, CASE_LABEL (elt), spc+4,
1802 flags, true);
1803 pp_semicolon (buffer);
1805 else
1806 pp_string (buffer, "case ???: goto ???;");
1809 newline_and_indent (buffer, spc+2);
1810 pp_character (buffer, '}');
1812 is_expr = false;
1813 break;
1815 case GOTO_EXPR:
1816 op0 = GOTO_DESTINATION (node);
1817 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
1819 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1820 if (strcmp (name, "break") == 0
1821 || strcmp (name, "continue") == 0)
1823 pp_string (buffer, name);
1824 break;
1827 pp_string (buffer, "goto ");
1828 dump_generic_node (buffer, op0, spc, flags, false);
1829 break;
1831 case ASM_EXPR:
1832 pp_string (buffer, "__asm__");
1833 if (ASM_VOLATILE_P (node))
1834 pp_string (buffer, " __volatile__");
1835 pp_character (buffer, '(');
1836 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
1837 pp_character (buffer, ':');
1838 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
1839 pp_character (buffer, ':');
1840 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
1841 if (ASM_CLOBBERS (node))
1843 pp_character (buffer, ':');
1844 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
1846 pp_string (buffer, ")");
1847 break;
1849 case CASE_LABEL_EXPR:
1850 if (CASE_LOW (node) && CASE_HIGH (node))
1852 pp_string (buffer, "case ");
1853 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1854 pp_string (buffer, " ... ");
1855 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
1857 else if (CASE_LOW (node))
1859 pp_string (buffer, "case ");
1860 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1862 else
1863 pp_string (buffer, "default");
1864 pp_character (buffer, ':');
1865 break;
1867 case OBJ_TYPE_REF:
1868 pp_string (buffer, "OBJ_TYPE_REF(");
1869 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
1870 pp_character (buffer, ';');
1871 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
1872 pp_character (buffer, '-');
1873 pp_character (buffer, '>');
1874 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
1875 pp_character (buffer, ')');
1876 break;
1878 case SSA_NAME:
1879 dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
1880 pp_string (buffer, "_");
1881 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
1882 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
1883 pp_string (buffer, "(ab)");
1884 else if (SSA_NAME_IS_DEFAULT_DEF (node))
1885 pp_string (buffer, "(D)");
1886 break;
1888 case WITH_SIZE_EXPR:
1889 pp_string (buffer, "WITH_SIZE_EXPR <");
1890 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1891 pp_string (buffer, ", ");
1892 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1893 pp_string (buffer, ">");
1894 break;
1896 case ASSERT_EXPR:
1897 pp_string (buffer, "ASSERT_EXPR <");
1898 dump_generic_node (buffer, ASSERT_EXPR_VAR (node), spc, flags, false);
1899 pp_string (buffer, ", ");
1900 dump_generic_node (buffer, ASSERT_EXPR_COND (node), spc, flags, false);
1901 pp_string (buffer, ">");
1902 break;
1904 case SCEV_KNOWN:
1905 pp_string (buffer, "scev_known");
1906 break;
1908 case SCEV_NOT_KNOWN:
1909 pp_string (buffer, "scev_not_known");
1910 break;
1912 case POLYNOMIAL_CHREC:
1913 pp_string (buffer, "{");
1914 dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
1915 pp_string (buffer, ", +, ");
1916 dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
1917 pp_string (buffer, "}_");
1918 dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
1919 is_stmt = false;
1920 break;
1922 case REALIGN_LOAD_EXPR:
1923 pp_string (buffer, "REALIGN_LOAD <");
1924 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1925 pp_string (buffer, ", ");
1926 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1927 pp_string (buffer, ", ");
1928 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1929 pp_string (buffer, ">");
1930 break;
1932 case VEC_COND_EXPR:
1933 pp_string (buffer, " VEC_COND_EXPR < ");
1934 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1935 pp_string (buffer, " , ");
1936 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1937 pp_string (buffer, " , ");
1938 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1939 pp_string (buffer, " > ");
1940 break;
1942 case DOT_PROD_EXPR:
1943 pp_string (buffer, " DOT_PROD_EXPR < ");
1944 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1945 pp_string (buffer, ", ");
1946 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1947 pp_string (buffer, ", ");
1948 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1949 pp_string (buffer, " > ");
1950 break;
1952 case OMP_PARALLEL:
1953 pp_string (buffer, "#pragma omp parallel");
1954 dump_omp_clauses (buffer, OMP_PARALLEL_CLAUSES (node), spc, flags);
1956 dump_omp_body:
1957 if (!(flags & TDF_SLIM) && OMP_BODY (node))
1959 newline_and_indent (buffer, spc + 2);
1960 pp_character (buffer, '{');
1961 newline_and_indent (buffer, spc + 4);
1962 dump_generic_node (buffer, OMP_BODY (node), spc + 4, flags, false);
1963 newline_and_indent (buffer, spc + 2);
1964 pp_character (buffer, '}');
1966 is_expr = false;
1967 break;
1969 case OMP_TASK:
1970 pp_string (buffer, "#pragma omp task");
1971 dump_omp_clauses (buffer, OMP_TASK_CLAUSES (node), spc, flags);
1972 goto dump_omp_body;
1974 case OMP_FOR:
1975 pp_string (buffer, "#pragma omp for");
1976 dump_omp_clauses (buffer, OMP_FOR_CLAUSES (node), spc, flags);
1978 if (!(flags & TDF_SLIM))
1980 int i;
1982 if (OMP_FOR_PRE_BODY (node))
1984 newline_and_indent (buffer, spc + 2);
1985 pp_character (buffer, '{');
1986 spc += 4;
1987 newline_and_indent (buffer, spc);
1988 dump_generic_node (buffer, OMP_FOR_PRE_BODY (node),
1989 spc, flags, false);
1991 spc -= 2;
1992 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (node)); i++)
1994 spc += 2;
1995 newline_and_indent (buffer, spc);
1996 pp_string (buffer, "for (");
1997 dump_generic_node (buffer, TREE_VEC_ELT (OMP_FOR_INIT (node), i),
1998 spc, flags, false);
1999 pp_string (buffer, "; ");
2000 dump_generic_node (buffer, TREE_VEC_ELT (OMP_FOR_COND (node), i),
2001 spc, flags, false);
2002 pp_string (buffer, "; ");
2003 dump_generic_node (buffer, TREE_VEC_ELT (OMP_FOR_INCR (node), i),
2004 spc, flags, false);
2005 pp_string (buffer, ")");
2007 if (OMP_FOR_BODY (node))
2009 newline_and_indent (buffer, spc + 2);
2010 pp_character (buffer, '{');
2011 newline_and_indent (buffer, spc + 4);
2012 dump_generic_node (buffer, OMP_FOR_BODY (node), spc + 4, flags,
2013 false);
2014 newline_and_indent (buffer, spc + 2);
2015 pp_character (buffer, '}');
2017 spc -= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node)) - 2;
2018 if (OMP_FOR_PRE_BODY (node))
2020 spc -= 4;
2021 newline_and_indent (buffer, spc + 2);
2022 pp_character (buffer, '}');
2025 is_expr = false;
2026 break;
2028 case OMP_SECTIONS:
2029 pp_string (buffer, "#pragma omp sections");
2030 dump_omp_clauses (buffer, OMP_SECTIONS_CLAUSES (node), spc, flags);
2031 goto dump_omp_body;
2033 case OMP_SECTION:
2034 pp_string (buffer, "#pragma omp section");
2035 goto dump_omp_body;
2037 case OMP_MASTER:
2038 pp_string (buffer, "#pragma omp master");
2039 goto dump_omp_body;
2041 case OMP_ORDERED:
2042 pp_string (buffer, "#pragma omp ordered");
2043 goto dump_omp_body;
2045 case OMP_CRITICAL:
2046 pp_string (buffer, "#pragma omp critical");
2047 if (OMP_CRITICAL_NAME (node))
2049 pp_space (buffer);
2050 pp_character (buffer, '(');
2051 dump_generic_node (buffer, OMP_CRITICAL_NAME (node), spc,
2052 flags, false);
2053 pp_character (buffer, ')');
2055 goto dump_omp_body;
2057 case OMP_ATOMIC:
2058 pp_string (buffer, "#pragma omp atomic");
2059 newline_and_indent (buffer, spc + 2);
2060 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2061 pp_space (buffer);
2062 pp_character (buffer, '=');
2063 pp_space (buffer);
2064 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2065 break;
2067 case OMP_SINGLE:
2068 pp_string (buffer, "#pragma omp single");
2069 dump_omp_clauses (buffer, OMP_SINGLE_CLAUSES (node), spc, flags);
2070 goto dump_omp_body;
2072 case OMP_CLAUSE:
2073 dump_omp_clause (buffer, node, spc, flags);
2074 is_expr = false;
2075 break;
2077 case REDUC_MAX_EXPR:
2078 pp_string (buffer, " REDUC_MAX_EXPR < ");
2079 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2080 pp_string (buffer, " > ");
2081 break;
2083 case REDUC_MIN_EXPR:
2084 pp_string (buffer, " REDUC_MIN_EXPR < ");
2085 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2086 pp_string (buffer, " > ");
2087 break;
2089 case REDUC_PLUS_EXPR:
2090 pp_string (buffer, " REDUC_PLUS_EXPR < ");
2091 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2092 pp_string (buffer, " > ");
2093 break;
2095 case VEC_WIDEN_MULT_HI_EXPR:
2096 pp_string (buffer, " VEC_WIDEN_MULT_HI_EXPR < ");
2097 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2098 pp_string (buffer, ", ");
2099 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2100 pp_string (buffer, " > ");
2101 break;
2103 case VEC_WIDEN_MULT_LO_EXPR:
2104 pp_string (buffer, " VEC_WIDEN_MULT_LO_EXPR < ");
2105 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2106 pp_string (buffer, ", ");
2107 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2108 pp_string (buffer, " > ");
2109 break;
2111 case VEC_UNPACK_HI_EXPR:
2112 pp_string (buffer, " VEC_UNPACK_HI_EXPR < ");
2113 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2114 pp_string (buffer, " > ");
2115 break;
2117 case VEC_UNPACK_LO_EXPR:
2118 pp_string (buffer, " VEC_UNPACK_LO_EXPR < ");
2119 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2120 pp_string (buffer, " > ");
2121 break;
2123 case VEC_UNPACK_FLOAT_HI_EXPR:
2124 pp_string (buffer, " VEC_UNPACK_FLOAT_HI_EXPR < ");
2125 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2126 pp_string (buffer, " > ");
2127 break;
2129 case VEC_UNPACK_FLOAT_LO_EXPR:
2130 pp_string (buffer, " VEC_UNPACK_FLOAT_LO_EXPR < ");
2131 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2132 pp_string (buffer, " > ");
2133 break;
2135 case VEC_PACK_TRUNC_EXPR:
2136 pp_string (buffer, " VEC_PACK_TRUNC_EXPR < ");
2137 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2138 pp_string (buffer, ", ");
2139 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2140 pp_string (buffer, " > ");
2141 break;
2143 case VEC_PACK_SAT_EXPR:
2144 pp_string (buffer, " VEC_PACK_SAT_EXPR < ");
2145 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2146 pp_string (buffer, ", ");
2147 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2148 pp_string (buffer, " > ");
2149 break;
2151 case VEC_PACK_FIX_TRUNC_EXPR:
2152 pp_string (buffer, " VEC_PACK_FIX_TRUNC_EXPR < ");
2153 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2154 pp_string (buffer, ", ");
2155 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2156 pp_string (buffer, " > ");
2157 break;
2159 case BLOCK:
2160 dump_block_node (buffer, node, spc, flags);
2161 break;
2163 case VEC_EXTRACT_EVEN_EXPR:
2164 pp_string (buffer, " VEC_EXTRACT_EVEN_EXPR < ");
2165 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2166 pp_string (buffer, ", ");
2167 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2168 pp_string (buffer, " > ");
2169 break;
2171 case VEC_EXTRACT_ODD_EXPR:
2172 pp_string (buffer, " VEC_EXTRACT_ODD_EXPR < ");
2173 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2174 pp_string (buffer, ", ");
2175 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2176 pp_string (buffer, " > ");
2177 break;
2179 case VEC_INTERLEAVE_HIGH_EXPR:
2180 pp_string (buffer, " VEC_INTERLEAVE_HIGH_EXPR < ");
2181 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2182 pp_string (buffer, ", ");
2183 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2184 pp_string (buffer, " > ");
2185 break;
2187 case VEC_INTERLEAVE_LOW_EXPR:
2188 pp_string (buffer, " VEC_INTERLEAVE_LOW_EXPR < ");
2189 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2190 pp_string (buffer, ", ");
2191 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2192 pp_string (buffer, " > ");
2193 break;
2195 default:
2196 NIY;
2199 if (is_stmt && is_expr)
2200 pp_semicolon (buffer);
2202 /* If we're building a diagnostic, the formatted text will be written
2203 into BUFFER's stream by the caller; otherwise, write it now. */
2204 if (!(flags & TDF_DIAGNOSTIC))
2205 pp_write_text_to_stream (buffer);
2207 return spc;
2210 /* Print the declaration of a variable. */
2212 void
2213 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
2215 INDENT (spc);
2217 if (TREE_CODE (t) == TYPE_DECL)
2218 pp_string (buffer, "typedef ");
2220 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
2221 pp_string (buffer, "register ");
2223 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
2224 pp_string (buffer, "extern ");
2225 else if (TREE_STATIC (t))
2226 pp_string (buffer, "static ");
2228 /* Print the type and name. */
2229 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
2231 tree tmp;
2233 /* Print array's type. */
2234 tmp = TREE_TYPE (t);
2235 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
2236 tmp = TREE_TYPE (tmp);
2237 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
2239 /* Print variable's name. */
2240 pp_space (buffer);
2241 dump_generic_node (buffer, t, spc, flags, false);
2243 /* Print the dimensions. */
2244 tmp = TREE_TYPE (t);
2245 while (TREE_CODE (tmp) == ARRAY_TYPE)
2247 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
2248 tmp = TREE_TYPE (tmp);
2251 else if (TREE_CODE (t) == FUNCTION_DECL)
2253 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
2254 pp_space (buffer);
2255 dump_decl_name (buffer, t, flags);
2256 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
2258 else
2260 /* Print type declaration. */
2261 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
2263 /* Print variable's name. */
2264 pp_space (buffer);
2265 dump_generic_node (buffer, t, spc, flags, false);
2268 if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
2270 pp_string (buffer, " __asm__ ");
2271 pp_character (buffer, '(');
2272 dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
2273 pp_character (buffer, ')');
2276 /* The initial value of a function serves to determine whether the function
2277 is declared or defined. So the following does not apply to function
2278 nodes. */
2279 if (TREE_CODE (t) != FUNCTION_DECL)
2281 /* Print the initial value. */
2282 if (DECL_INITIAL (t))
2284 pp_space (buffer);
2285 pp_character (buffer, '=');
2286 pp_space (buffer);
2287 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
2291 if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
2293 pp_string (buffer, " [value-expr: ");
2294 dump_generic_node (buffer, DECL_VALUE_EXPR (t), spc, flags, false);
2295 pp_character (buffer, ']');
2298 pp_character (buffer, ';');
2302 /* Prints a structure: name, fields, and methods.
2303 FIXME: Still incomplete. */
2305 static void
2306 print_struct_decl (pretty_printer *buffer, const_tree node, int spc, int flags)
2308 /* Print the name of the structure. */
2309 if (TYPE_NAME (node))
2311 INDENT (spc);
2312 if (TREE_CODE (node) == RECORD_TYPE)
2313 pp_string (buffer, "struct ");
2314 else if ((TREE_CODE (node) == UNION_TYPE
2315 || TREE_CODE (node) == QUAL_UNION_TYPE))
2316 pp_string (buffer, "union ");
2318 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
2321 /* Print the contents of the structure. */
2322 pp_newline (buffer);
2323 INDENT (spc);
2324 pp_character (buffer, '{');
2325 pp_newline (buffer);
2327 /* Print the fields of the structure. */
2329 tree tmp;
2330 tmp = TYPE_FIELDS (node);
2331 while (tmp)
2333 /* Avoid to print recursively the structure. */
2334 /* FIXME : Not implemented correctly...,
2335 what about the case when we have a cycle in the contain graph? ...
2336 Maybe this could be solved by looking at the scope in which the
2337 structure was declared. */
2338 if (TREE_TYPE (tmp) != node
2339 && (TREE_CODE (TREE_TYPE (tmp)) != POINTER_TYPE
2340 || TREE_TYPE (TREE_TYPE (tmp)) != node))
2342 print_declaration (buffer, tmp, spc+2, flags);
2343 pp_newline (buffer);
2345 tmp = TREE_CHAIN (tmp);
2348 INDENT (spc);
2349 pp_character (buffer, '}');
2352 /* Return the priority of the operator CODE.
2354 From lowest to highest precedence with either left-to-right (L-R)
2355 or right-to-left (R-L) associativity]:
2357 1 [L-R] ,
2358 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2359 3 [R-L] ?:
2360 4 [L-R] ||
2361 5 [L-R] &&
2362 6 [L-R] |
2363 7 [L-R] ^
2364 8 [L-R] &
2365 9 [L-R] == !=
2366 10 [L-R] < <= > >=
2367 11 [L-R] << >>
2368 12 [L-R] + -
2369 13 [L-R] * / %
2370 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2371 15 [L-R] fn() [] -> .
2373 unary +, - and * have higher precedence than the corresponding binary
2374 operators. */
2377 op_code_prio (enum tree_code code)
2379 switch (code)
2381 case TREE_LIST:
2382 case COMPOUND_EXPR:
2383 case BIND_EXPR:
2384 return 1;
2386 case MODIFY_EXPR:
2387 case INIT_EXPR:
2388 return 2;
2390 case COND_EXPR:
2391 return 3;
2393 case TRUTH_OR_EXPR:
2394 case TRUTH_ORIF_EXPR:
2395 return 4;
2397 case TRUTH_AND_EXPR:
2398 case TRUTH_ANDIF_EXPR:
2399 return 5;
2401 case BIT_IOR_EXPR:
2402 return 6;
2404 case BIT_XOR_EXPR:
2405 case TRUTH_XOR_EXPR:
2406 return 7;
2408 case BIT_AND_EXPR:
2409 return 8;
2411 case EQ_EXPR:
2412 case NE_EXPR:
2413 return 9;
2415 case UNLT_EXPR:
2416 case UNLE_EXPR:
2417 case UNGT_EXPR:
2418 case UNGE_EXPR:
2419 case UNEQ_EXPR:
2420 case LTGT_EXPR:
2421 case ORDERED_EXPR:
2422 case UNORDERED_EXPR:
2423 case LT_EXPR:
2424 case LE_EXPR:
2425 case GT_EXPR:
2426 case GE_EXPR:
2427 return 10;
2429 case LSHIFT_EXPR:
2430 case RSHIFT_EXPR:
2431 case LROTATE_EXPR:
2432 case RROTATE_EXPR:
2433 return 11;
2435 case WIDEN_SUM_EXPR:
2436 case PLUS_EXPR:
2437 case POINTER_PLUS_EXPR:
2438 case MINUS_EXPR:
2439 return 12;
2441 case VEC_WIDEN_MULT_HI_EXPR:
2442 case VEC_WIDEN_MULT_LO_EXPR:
2443 case WIDEN_MULT_EXPR:
2444 case DOT_PROD_EXPR:
2445 case MULT_EXPR:
2446 case TRUNC_DIV_EXPR:
2447 case CEIL_DIV_EXPR:
2448 case FLOOR_DIV_EXPR:
2449 case ROUND_DIV_EXPR:
2450 case RDIV_EXPR:
2451 case EXACT_DIV_EXPR:
2452 case TRUNC_MOD_EXPR:
2453 case CEIL_MOD_EXPR:
2454 case FLOOR_MOD_EXPR:
2455 case ROUND_MOD_EXPR:
2456 return 13;
2458 case TRUTH_NOT_EXPR:
2459 case BIT_NOT_EXPR:
2460 case POSTINCREMENT_EXPR:
2461 case POSTDECREMENT_EXPR:
2462 case PREINCREMENT_EXPR:
2463 case PREDECREMENT_EXPR:
2464 case NEGATE_EXPR:
2465 case ALIGN_INDIRECT_REF:
2466 case MISALIGNED_INDIRECT_REF:
2467 case INDIRECT_REF:
2468 case ADDR_EXPR:
2469 case FLOAT_EXPR:
2470 CASE_CONVERT:
2471 case FIX_TRUNC_EXPR:
2472 case TARGET_EXPR:
2473 return 14;
2475 case CALL_EXPR:
2476 case ARRAY_REF:
2477 case ARRAY_RANGE_REF:
2478 case COMPONENT_REF:
2479 return 15;
2481 /* Special expressions. */
2482 case MIN_EXPR:
2483 case MAX_EXPR:
2484 case ABS_EXPR:
2485 case REALPART_EXPR:
2486 case IMAGPART_EXPR:
2487 case REDUC_MAX_EXPR:
2488 case REDUC_MIN_EXPR:
2489 case REDUC_PLUS_EXPR:
2490 case VEC_LSHIFT_EXPR:
2491 case VEC_RSHIFT_EXPR:
2492 case VEC_UNPACK_HI_EXPR:
2493 case VEC_UNPACK_LO_EXPR:
2494 case VEC_UNPACK_FLOAT_HI_EXPR:
2495 case VEC_UNPACK_FLOAT_LO_EXPR:
2496 case VEC_PACK_TRUNC_EXPR:
2497 case VEC_PACK_SAT_EXPR:
2498 return 16;
2500 default:
2501 /* Return an arbitrarily high precedence to avoid surrounding single
2502 VAR_DECLs in ()s. */
2503 return 9999;
2507 /* Return the priority of the operator OP. */
2510 op_prio (const_tree op)
2512 enum tree_code code;
2514 if (op == NULL)
2515 return 9999;
2517 code = TREE_CODE (op);
2518 if (code == SAVE_EXPR || code == NON_LVALUE_EXPR)
2519 return op_prio (TREE_OPERAND (op, 0));
2521 return op_code_prio (code);
2524 /* Return the symbol associated with operator CODE. */
2526 const char *
2527 op_symbol_code (enum tree_code code)
2529 switch (code)
2531 case MODIFY_EXPR:
2532 return "=";
2534 case TRUTH_OR_EXPR:
2535 case TRUTH_ORIF_EXPR:
2536 return "||";
2538 case TRUTH_AND_EXPR:
2539 case TRUTH_ANDIF_EXPR:
2540 return "&&";
2542 case BIT_IOR_EXPR:
2543 return "|";
2545 case TRUTH_XOR_EXPR:
2546 case BIT_XOR_EXPR:
2547 return "^";
2549 case ADDR_EXPR:
2550 case BIT_AND_EXPR:
2551 return "&";
2553 case ORDERED_EXPR:
2554 return "ord";
2555 case UNORDERED_EXPR:
2556 return "unord";
2558 case EQ_EXPR:
2559 return "==";
2560 case UNEQ_EXPR:
2561 return "u==";
2563 case NE_EXPR:
2564 return "!=";
2566 case LT_EXPR:
2567 return "<";
2568 case UNLT_EXPR:
2569 return "u<";
2571 case LE_EXPR:
2572 return "<=";
2573 case UNLE_EXPR:
2574 return "u<=";
2576 case GT_EXPR:
2577 return ">";
2578 case UNGT_EXPR:
2579 return "u>";
2581 case GE_EXPR:
2582 return ">=";
2583 case UNGE_EXPR:
2584 return "u>=";
2586 case LTGT_EXPR:
2587 return "<>";
2589 case LSHIFT_EXPR:
2590 return "<<";
2592 case RSHIFT_EXPR:
2593 return ">>";
2595 case LROTATE_EXPR:
2596 return "r<<";
2598 case RROTATE_EXPR:
2599 return "r>>";
2601 case VEC_LSHIFT_EXPR:
2602 return "v<<";
2604 case VEC_RSHIFT_EXPR:
2605 return "v>>";
2607 case POINTER_PLUS_EXPR:
2608 return "+";
2610 case PLUS_EXPR:
2611 return "+";
2613 case REDUC_PLUS_EXPR:
2614 return "r+";
2616 case WIDEN_SUM_EXPR:
2617 return "w+";
2619 case WIDEN_MULT_EXPR:
2620 return "w*";
2622 case NEGATE_EXPR:
2623 case MINUS_EXPR:
2624 return "-";
2626 case BIT_NOT_EXPR:
2627 return "~";
2629 case TRUTH_NOT_EXPR:
2630 return "!";
2632 case MULT_EXPR:
2633 case INDIRECT_REF:
2634 return "*";
2636 case ALIGN_INDIRECT_REF:
2637 return "A*";
2639 case MISALIGNED_INDIRECT_REF:
2640 return "M*";
2642 case TRUNC_DIV_EXPR:
2643 case RDIV_EXPR:
2644 return "/";
2646 case CEIL_DIV_EXPR:
2647 return "/[cl]";
2649 case FLOOR_DIV_EXPR:
2650 return "/[fl]";
2652 case ROUND_DIV_EXPR:
2653 return "/[rd]";
2655 case EXACT_DIV_EXPR:
2656 return "/[ex]";
2658 case TRUNC_MOD_EXPR:
2659 return "%";
2661 case CEIL_MOD_EXPR:
2662 return "%[cl]";
2664 case FLOOR_MOD_EXPR:
2665 return "%[fl]";
2667 case ROUND_MOD_EXPR:
2668 return "%[rd]";
2670 case PREDECREMENT_EXPR:
2671 return " --";
2673 case PREINCREMENT_EXPR:
2674 return " ++";
2676 case POSTDECREMENT_EXPR:
2677 return "-- ";
2679 case POSTINCREMENT_EXPR:
2680 return "++ ";
2682 case MAX_EXPR:
2683 return "max";
2685 case MIN_EXPR:
2686 return "min";
2688 default:
2689 return "<<< ??? >>>";
2693 /* Return the symbol associated with operator OP. */
2695 static const char *
2696 op_symbol (const_tree op)
2698 return op_symbol_code (TREE_CODE (op));
2701 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
2702 the gimple_call_fn of a GIMPLE_CALL. */
2704 void
2705 print_call_name (pretty_printer *buffer, tree node, int flags)
2707 tree op0 = node;
2709 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
2710 op0 = TREE_OPERAND (op0, 0);
2712 again:
2713 switch (TREE_CODE (op0))
2715 case VAR_DECL:
2716 case PARM_DECL:
2717 case FUNCTION_DECL:
2718 dump_function_name (buffer, op0, flags);
2719 break;
2721 case ADDR_EXPR:
2722 case INDIRECT_REF:
2723 case NOP_EXPR:
2724 op0 = TREE_OPERAND (op0, 0);
2725 goto again;
2727 case COND_EXPR:
2728 pp_string (buffer, "(");
2729 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, flags, false);
2730 pp_string (buffer, ") ? ");
2731 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, flags, false);
2732 pp_string (buffer, " : ");
2733 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, flags, false);
2734 break;
2736 case ARRAY_REF:
2737 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2738 dump_function_name (buffer, TREE_OPERAND (op0, 0), flags);
2739 else
2740 dump_generic_node (buffer, op0, 0, flags, false);
2741 break;
2743 case COMPONENT_REF:
2744 case SSA_NAME:
2745 case OBJ_TYPE_REF:
2746 dump_generic_node (buffer, op0, 0, flags, false);
2747 break;
2749 default:
2750 NIY;
2754 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2756 static void
2757 pretty_print_string (pretty_printer *buffer, const char *str)
2759 if (str == NULL)
2760 return;
2762 while (*str)
2764 switch (str[0])
2766 case '\b':
2767 pp_string (buffer, "\\b");
2768 break;
2770 case '\f':
2771 pp_string (buffer, "\\f");
2772 break;
2774 case '\n':
2775 pp_string (buffer, "\\n");
2776 break;
2778 case '\r':
2779 pp_string (buffer, "\\r");
2780 break;
2782 case '\t':
2783 pp_string (buffer, "\\t");
2784 break;
2786 case '\v':
2787 pp_string (buffer, "\\v");
2788 break;
2790 case '\\':
2791 pp_string (buffer, "\\\\");
2792 break;
2794 case '\"':
2795 pp_string (buffer, "\\\"");
2796 break;
2798 case '\'':
2799 pp_string (buffer, "\\'");
2800 break;
2802 /* No need to handle \0; the loop terminates on \0. */
2804 case '\1':
2805 pp_string (buffer, "\\1");
2806 break;
2808 case '\2':
2809 pp_string (buffer, "\\2");
2810 break;
2812 case '\3':
2813 pp_string (buffer, "\\3");
2814 break;
2816 case '\4':
2817 pp_string (buffer, "\\4");
2818 break;
2820 case '\5':
2821 pp_string (buffer, "\\5");
2822 break;
2824 case '\6':
2825 pp_string (buffer, "\\6");
2826 break;
2828 case '\7':
2829 pp_string (buffer, "\\7");
2830 break;
2832 default:
2833 pp_character (buffer, str[0]);
2834 break;
2836 str++;
2840 static void
2841 maybe_init_pretty_print (FILE *file)
2843 if (!initialized)
2845 pp_construct (&buffer, /* prefix */NULL, /* line-width */0);
2846 pp_needs_newline (&buffer) = true;
2847 pp_translate_identifiers (&buffer) = false;
2848 initialized = 1;
2851 buffer.buffer->stream = file;
2854 static void
2855 newline_and_indent (pretty_printer *buffer, int spc)
2857 pp_newline (buffer);
2858 INDENT (spc);