comparison gcc/tree-pretty-print.c @ 0:a06113de4d67

first commit
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 17 Jul 2009 14:47:48 +0900
parents
children 77e2b8dfacca
comparison
equal deleted inserted replaced
-1:000000000000 0:a06113de4d67
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>
5
6 This file is part of GCC.
7
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.
12
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.
17
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/>. */
21
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"
39
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);
48
49 #define INDENT(SPACE) do { \
50 int i; for (i = 0; i<SPACE; i++) pp_space (buffer); } while (0)
51
52 #define NIY do_niy(buffer,node)
53
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))
58
59 static pretty_printer buffer;
60 static int initialized = 0;
61
62 /* Try to print something for an unknown tree code. */
63
64 static void
65 do_niy (pretty_printer *buffer, const_tree node)
66 {
67 int i, len;
68
69 pp_string (buffer, "<<< Unknown tree: ");
70 pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
71
72 if (EXPR_P (node))
73 {
74 len = TREE_OPERAND_LENGTH (node);
75 for (i = 0; i < len; ++i)
76 {
77 newline_and_indent (buffer, 2);
78 dump_generic_node (buffer, TREE_OPERAND (node, i), 2, 0, false);
79 }
80 }
81
82 pp_string (buffer, " >>>\n");
83 }
84
85 /* Debugging function to print out a generic expression. */
86
87 void
88 debug_generic_expr (tree t)
89 {
90 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS);
91 fprintf (stderr, "\n");
92 }
93
94 /* Debugging function to print out a generic statement. */
95
96 void
97 debug_generic_stmt (tree t)
98 {
99 print_generic_stmt (stderr, t, TDF_VOPS|TDF_MEMSYMS);
100 fprintf (stderr, "\n");
101 }
102
103 /* Debugging function to print out a chain of trees . */
104
105 void
106 debug_tree_chain (tree t)
107 {
108 while (t)
109 {
110 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
111 fprintf(stderr, " ");
112 t = TREE_CHAIN (t);
113 }
114 fprintf (stderr, "\n");
115 }
116
117 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
118 void
119 print_generic_decl (FILE *file, tree decl, int flags)
120 {
121 maybe_init_pretty_print (file);
122 print_declaration (&buffer, decl, 2, flags);
123 pp_write_text_to_stream (&buffer);
124 }
125
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. */
128
129 void
130 print_generic_stmt (FILE *file, tree t, int flags)
131 {
132 maybe_init_pretty_print (file);
133 dump_generic_node (&buffer, t, 0, flags, true);
134 pp_flush (&buffer);
135 }
136
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
139 INDENT spaces. */
140
141 void
142 print_generic_stmt_indented (FILE *file, tree t, int flags, int indent)
143 {
144 int i;
145
146 maybe_init_pretty_print (file);
147
148 for (i = 0; i < indent; i++)
149 pp_space (&buffer);
150 dump_generic_node (&buffer, t, indent, flags, true);
151 pp_flush (&buffer);
152 }
153
154 /* Print a single expression T on file FILE. FLAGS specifies details to show
155 in the dump. See TDF_* in tree-pass.h. */
156
157 void
158 print_generic_expr (FILE *file, tree t, int flags)
159 {
160 maybe_init_pretty_print (file);
161 dump_generic_node (&buffer, t, 0, flags, false);
162 }
163
164 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
165 in FLAGS. */
166
167 static void
168 dump_decl_name (pretty_printer *buffer, tree node, int flags)
169 {
170 tree t = node;
171
172 if (DECL_NAME (t))
173 pp_tree_identifier (buffer, DECL_NAME (t));
174 if ((flags & TDF_UID)
175 || DECL_NAME (t) == NULL_TREE)
176 {
177 if (TREE_CODE (t) == LABEL_DECL
178 && LABEL_DECL_UID (t) != -1)
179 pp_printf (buffer, "L.%d", (int) LABEL_DECL_UID (t));
180 else
181 {
182 char c = TREE_CODE (t) == CONST_DECL ? 'C' : 'D';
183 pp_printf (buffer, "%c.%u", c, DECL_UID (t));
184 }
185 }
186 }
187
188 /* Like the above, but used for pretty printing function calls. */
189
190 static void
191 dump_function_name (pretty_printer *buffer, tree node)
192 {
193 if (DECL_NAME (node))
194 PRINT_FUNCTION_NAME (node);
195 else
196 dump_decl_name (buffer, node, 0);
197 }
198
199 /* Dump a function declaration. NODE is the FUNCTION_TYPE. BUFFER, SPC and
200 FLAGS are as in dump_generic_node. */
201
202 static void
203 dump_function_declaration (pretty_printer *buffer, tree node,
204 int spc, int flags)
205 {
206 bool wrote_arg = false;
207 tree arg;
208
209 pp_space (buffer);
210 pp_character (buffer, '(');
211
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)
216 {
217 wrote_arg = true;
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)
221 {
222 pp_character (buffer, ',');
223 pp_space (buffer);
224 }
225 }
226
227 if (!wrote_arg)
228 pp_string (buffer, "void");
229
230 pp_character (buffer, ')');
231 }
232
233 /* Dump the domain associated with an array. */
234
235 static void
236 dump_array_domain (pretty_printer *buffer, tree domain, int spc, int flags)
237 {
238 pp_character (buffer, '[');
239 if (domain)
240 {
241 tree min = TYPE_MIN_VALUE (domain);
242 tree max = TYPE_MAX_VALUE (domain);
243
244 if (min && max
245 && integer_zerop (min)
246 && host_integerp (max, 0))
247 pp_wide_integer (buffer, TREE_INT_CST_LOW (max) + 1);
248 else
249 {
250 if (min)
251 dump_generic_node (buffer, min, spc, flags, false);
252 pp_character (buffer, ':');
253 if (max)
254 dump_generic_node (buffer, max, spc, flags, false);
255 }
256 }
257 else
258 pp_string (buffer, "<unknown>");
259 pp_character (buffer, ']');
260 }
261
262
263 /* Dump OpenMP clause CLAUSE. BUFFER, CLAUSE, SPC and FLAGS are as in
264 dump_generic_node. */
265
266 static void
267 dump_omp_clause (pretty_printer *buffer, tree clause, int spc, int flags)
268 {
269 const char *name;
270
271 switch (OMP_CLAUSE_CODE (clause))
272 {
273 case OMP_CLAUSE_PRIVATE:
274 name = "private";
275 goto print_remap;
276 case OMP_CLAUSE_SHARED:
277 name = "shared";
278 goto print_remap;
279 case OMP_CLAUSE_FIRSTPRIVATE:
280 name = "firstprivate";
281 goto print_remap;
282 case OMP_CLAUSE_LASTPRIVATE:
283 name = "lastprivate";
284 goto print_remap;
285 case OMP_CLAUSE_COPYIN:
286 name = "copyin";
287 goto print_remap;
288 case OMP_CLAUSE_COPYPRIVATE:
289 name = "copyprivate";
290 goto print_remap;
291 print_remap:
292 pp_string (buffer, name);
293 pp_character (buffer, '(');
294 dump_generic_node (buffer, OMP_CLAUSE_DECL (clause),
295 spc, flags, false);
296 pp_character (buffer, ')');
297 break;
298
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),
304 spc, flags, false);
305 pp_character (buffer, ')');
306 break;
307
308 case OMP_CLAUSE_IF:
309 pp_string (buffer, "if(");
310 dump_generic_node (buffer, OMP_CLAUSE_IF_EXPR (clause),
311 spc, flags, false);
312 pp_character (buffer, ')');
313 break;
314
315 case OMP_CLAUSE_NUM_THREADS:
316 pp_string (buffer, "num_threads(");
317 dump_generic_node (buffer, OMP_CLAUSE_NUM_THREADS_EXPR (clause),
318 spc, flags, false);
319 pp_character (buffer, ')');
320 break;
321
322 case OMP_CLAUSE_NOWAIT:
323 pp_string (buffer, "nowait");
324 break;
325 case OMP_CLAUSE_ORDERED:
326 pp_string (buffer, "ordered");
327 break;
328
329 case OMP_CLAUSE_DEFAULT:
330 pp_string (buffer, "default(");
331 switch (OMP_CLAUSE_DEFAULT_KIND (clause))
332 {
333 case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
334 break;
335 case OMP_CLAUSE_DEFAULT_SHARED:
336 pp_string (buffer, "shared");
337 break;
338 case OMP_CLAUSE_DEFAULT_NONE:
339 pp_string (buffer, "none");
340 break;
341 case OMP_CLAUSE_DEFAULT_PRIVATE:
342 pp_string (buffer, "private");
343 break;
344 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
345 pp_string (buffer, "firstprivate");
346 break;
347 default:
348 gcc_unreachable ();
349 }
350 pp_character (buffer, ')');
351 break;
352
353 case OMP_CLAUSE_SCHEDULE:
354 pp_string (buffer, "schedule(");
355 switch (OMP_CLAUSE_SCHEDULE_KIND (clause))
356 {
357 case OMP_CLAUSE_SCHEDULE_STATIC:
358 pp_string (buffer, "static");
359 break;
360 case OMP_CLAUSE_SCHEDULE_DYNAMIC:
361 pp_string (buffer, "dynamic");
362 break;
363 case OMP_CLAUSE_SCHEDULE_GUIDED:
364 pp_string (buffer, "guided");
365 break;
366 case OMP_CLAUSE_SCHEDULE_RUNTIME:
367 pp_string (buffer, "runtime");
368 break;
369 case OMP_CLAUSE_SCHEDULE_AUTO:
370 pp_string (buffer, "auto");
371 break;
372 default:
373 gcc_unreachable ();
374 }
375 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
376 {
377 pp_character (buffer, ',');
378 dump_generic_node (buffer,
379 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
380 spc, flags, false);
381 }
382 pp_character (buffer, ')');
383 break;
384
385 case OMP_CLAUSE_UNTIED:
386 pp_string (buffer, "untied");
387 break;
388
389 case OMP_CLAUSE_COLLAPSE:
390 pp_string (buffer, "collapse(");
391 dump_generic_node (buffer,
392 OMP_CLAUSE_COLLAPSE_EXPR (clause),
393 spc, flags, false);
394 pp_character (buffer, ')');
395 break;
396
397 default:
398 /* Should never happen. */
399 dump_generic_node (buffer, clause, spc, flags, false);
400 break;
401 }
402 }
403
404
405 /* Dump the list of OpenMP clauses. BUFFER, SPC and FLAGS are as in
406 dump_generic_node. */
407
408 void
409 dump_omp_clauses (pretty_printer *buffer, tree clause, int spc, int flags)
410 {
411 if (clause == NULL)
412 return;
413
414 pp_space (buffer);
415 while (1)
416 {
417 dump_omp_clause (buffer, clause, spc, flags);
418 clause = OMP_CLAUSE_CHAIN (clause);
419 if (clause == NULL)
420 return;
421 pp_space (buffer);
422 }
423 }
424
425
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. */
430
431 int
432 dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
433 bool is_stmt)
434 {
435 tree type;
436 tree op0, op1;
437 const char *str;
438 bool is_expr;
439
440 if (node == NULL_TREE)
441 return spc;
442
443 is_expr = EXPR_P (node);
444
445 if (is_stmt && (flags & TDF_STMTADDR))
446 pp_printf (buffer, "<&%p> ", (void *)node);
447
448 if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
449 {
450 expanded_location xloc = expand_location (EXPR_LOCATION (node));
451 pp_character (buffer, '[');
452 if (xloc.file)
453 {
454 pp_string (buffer, xloc.file);
455 pp_string (buffer, " : ");
456 }
457 pp_decimal_int (buffer, xloc.line);
458 pp_string (buffer, "] ");
459 }
460
461 switch (TREE_CODE (node))
462 {
463 case ERROR_MARK:
464 pp_string (buffer, "<<< error >>>");
465 break;
466
467 case IDENTIFIER_NODE:
468 pp_tree_identifier (buffer, node);
469 break;
470
471 case TREE_LIST:
472 while (node && node != error_mark_node)
473 {
474 if (TREE_PURPOSE (node))
475 {
476 dump_generic_node (buffer, TREE_PURPOSE (node), spc, flags, false);
477 pp_space (buffer);
478 }
479 dump_generic_node (buffer, TREE_VALUE (node), spc, flags, false);
480 node = TREE_CHAIN (node);
481 if (node && TREE_CODE (node) == TREE_LIST)
482 {
483 pp_character (buffer, ',');
484 pp_space (buffer);
485 }
486 }
487 break;
488
489 case TREE_BINFO:
490 dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false);
491
492 case TREE_VEC:
493 {
494 size_t i;
495 if (TREE_VEC_LENGTH (node) > 0)
496 {
497 size_t len = TREE_VEC_LENGTH (node);
498 for (i = 0; i < len - 1; i++)
499 {
500 dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags,
501 false);
502 pp_character (buffer, ',');
503 pp_space (buffer);
504 }
505 dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc,
506 flags, false);
507 }
508 }
509 break;
510
511 case VOID_TYPE:
512 case INTEGER_TYPE:
513 case REAL_TYPE:
514 case FIXED_POINT_TYPE:
515 case COMPLEX_TYPE:
516 case VECTOR_TYPE:
517 case ENUMERAL_TYPE:
518 case BOOLEAN_TYPE:
519 {
520 unsigned int quals = TYPE_QUALS (node);
521 enum tree_code_class tclass;
522
523 if (quals & TYPE_QUAL_CONST)
524 pp_string (buffer, "const ");
525 else if (quals & TYPE_QUAL_VOLATILE)
526 pp_string (buffer, "volatile ");
527 else if (quals & TYPE_QUAL_RESTRICT)
528 pp_string (buffer, "restrict ");
529
530 tclass = TREE_CODE_CLASS (TREE_CODE (node));
531
532 if (tclass == tcc_declaration)
533 {
534 if (DECL_NAME (node))
535 dump_decl_name (buffer, node, flags);
536 else
537 pp_string (buffer, "<unnamed type decl>");
538 }
539 else if (tclass == tcc_type)
540 {
541 if (TYPE_NAME (node))
542 {
543 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
544 pp_tree_identifier (buffer, TYPE_NAME (node));
545 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
546 && DECL_NAME (TYPE_NAME (node)))
547 dump_decl_name (buffer, TYPE_NAME (node), flags);
548 else
549 pp_string (buffer, "<unnamed type>");
550 }
551 else if (TREE_CODE (node) == VECTOR_TYPE)
552 {
553 pp_string (buffer, "vector ");
554 dump_generic_node (buffer, TREE_TYPE (node),
555 spc, flags, false);
556 }
557 else if (TREE_CODE (node) == INTEGER_TYPE)
558 {
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, ">");
564 }
565 else
566 pp_string (buffer, "<unnamed type>");
567 }
568 break;
569 }
570
571 case POINTER_TYPE:
572 case REFERENCE_TYPE:
573 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
574
575 if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
576 {
577 tree fnode = TREE_TYPE (node);
578
579 dump_generic_node (buffer, TREE_TYPE (fnode), spc, flags, false);
580 pp_space (buffer);
581 pp_character (buffer, '(');
582 pp_string (buffer, str);
583 if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
584 dump_decl_name (buffer, TYPE_NAME (node), flags);
585 else
586 pp_printf (buffer, "<T%x>", TYPE_UID (node));
587
588 pp_character (buffer, ')');
589 dump_function_declaration (buffer, fnode, spc, flags);
590 }
591 else
592 {
593 unsigned int quals = TYPE_QUALS (node);
594
595 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
596 pp_space (buffer);
597 pp_string (buffer, str);
598
599 if (quals & TYPE_QUAL_CONST)
600 pp_string (buffer, " const");
601 if (quals & TYPE_QUAL_VOLATILE)
602 pp_string (buffer, " volatile");
603 if (quals & TYPE_QUAL_RESTRICT)
604 pp_string (buffer, " restrict");
605
606 if (TYPE_REF_CAN_ALIAS_ALL (node))
607 pp_string (buffer, " {ref-all}");
608 }
609 break;
610
611 case OFFSET_TYPE:
612 NIY;
613 break;
614
615 case METHOD_TYPE:
616 dump_decl_name (buffer, TYPE_NAME (TYPE_METHOD_BASETYPE (node)), flags);
617 pp_string (buffer, "::");
618 break;
619
620 case TARGET_MEM_REF:
621 {
622 const char *sep = "";
623 tree tmp;
624
625 pp_string (buffer, "MEM[");
626
627 tmp = TMR_SYMBOL (node);
628 if (tmp)
629 {
630 pp_string (buffer, sep);
631 sep = ", ";
632 pp_string (buffer, "symbol: ");
633 dump_generic_node (buffer, tmp, spc, flags, false);
634 }
635 tmp = TMR_BASE (node);
636 if (tmp)
637 {
638 pp_string (buffer, sep);
639 sep = ", ";
640 pp_string (buffer, "base: ");
641 dump_generic_node (buffer, tmp, spc, flags, false);
642 }
643 tmp = TMR_INDEX (node);
644 if (tmp)
645 {
646 pp_string (buffer, sep);
647 sep = ", ";
648 pp_string (buffer, "index: ");
649 dump_generic_node (buffer, tmp, spc, flags, false);
650 }
651 tmp = TMR_STEP (node);
652 if (tmp)
653 {
654 pp_string (buffer, sep);
655 sep = ", ";
656 pp_string (buffer, "step: ");
657 dump_generic_node (buffer, tmp, spc, flags, false);
658 }
659 tmp = TMR_OFFSET (node);
660 if (tmp)
661 {
662 pp_string (buffer, sep);
663 sep = ", ";
664 pp_string (buffer, "offset: ");
665 dump_generic_node (buffer, tmp, spc, flags, false);
666 }
667 pp_string (buffer, "]");
668 if (flags & TDF_DETAILS)
669 {
670 pp_string (buffer, "{");
671 dump_generic_node (buffer, TMR_ORIGINAL (node), spc, flags,
672 false);
673 pp_string (buffer, "}");
674 }
675 }
676 break;
677
678 case ARRAY_TYPE:
679 {
680 tree tmp;
681
682 /* Print the innermost component type. */
683 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
684 tmp = TREE_TYPE (tmp))
685 ;
686 dump_generic_node (buffer, tmp, spc, flags, false);
687
688 /* Print the dimensions. */
689 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
690 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
691 break;
692 }
693
694 case RECORD_TYPE:
695 case UNION_TYPE:
696 case QUAL_UNION_TYPE:
697 {
698 unsigned int quals = TYPE_QUALS (node);
699
700 if (quals & TYPE_QUAL_CONST)
701 pp_string (buffer, "const ");
702 if (quals & TYPE_QUAL_VOLATILE)
703 pp_string (buffer, "volatile ");
704
705 /* Print the name of the structure. */
706 if (TREE_CODE (node) == RECORD_TYPE)
707 pp_string (buffer, "struct ");
708 else if (TREE_CODE (node) == UNION_TYPE)
709 pp_string (buffer, "union ");
710
711 if (TYPE_NAME (node))
712 dump_generic_node (buffer, TYPE_NAME (node), spc, flags, false);
713 else
714 print_struct_decl (buffer, node, spc, flags);
715 break;
716 }
717
718 case LANG_TYPE:
719 NIY;
720 break;
721
722 case INTEGER_CST:
723 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE)
724 {
725 /* In the case of a pointer, one may want to divide by the
726 size of the pointed-to type. Unfortunately, this not
727 straightforward. The C front-end maps expressions
728
729 (int *) 5
730 int *p; (p + 5)
731
732 in such a way that the two INTEGER_CST nodes for "5" have
733 different values but identical types. In the latter
734 case, the 5 is multiplied by sizeof (int) in c-common.c
735 (pointer_int_sum) to convert it to a byte address, and
736 yet the type of the node is left unchanged. Argh. What
737 is consistent though is that the number value corresponds
738 to bytes (UNITS) offset.
739
740 NB: Neither of the following divisors can be trivially
741 used to recover the original literal:
742
743 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
744 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
745 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
746 pp_string (buffer, "B"); /* pseudo-unit */
747 }
748 else if (! host_integerp (node, 0))
749 {
750 tree val = node;
751 unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (val);
752 HOST_WIDE_INT high = TREE_INT_CST_HIGH (val);
753
754 if (tree_int_cst_sgn (val) < 0)
755 {
756 pp_character (buffer, '-');
757 high = ~high + !low;
758 low = -low;
759 }
760 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
761 systems? */
762 sprintf (pp_buffer (buffer)->digit_buffer,
763 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
764 (unsigned HOST_WIDE_INT) high, low);
765 pp_string (buffer, pp_buffer (buffer)->digit_buffer);
766 }
767 else
768 pp_wide_integer (buffer, TREE_INT_CST_LOW (node));
769 break;
770
771 case REAL_CST:
772 /* Code copied from print_node. */
773 {
774 REAL_VALUE_TYPE d;
775 if (TREE_OVERFLOW (node))
776 pp_string (buffer, " overflow");
777
778 #if !defined(REAL_IS_NOT_DOUBLE) || defined(REAL_ARITHMETIC)
779 d = TREE_REAL_CST (node);
780 if (REAL_VALUE_ISINF (d))
781 pp_string (buffer, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
782 else if (REAL_VALUE_ISNAN (d))
783 pp_string (buffer, " Nan");
784 else
785 {
786 char string[100];
787 real_to_decimal (string, &d, sizeof (string), 0, 1);
788 pp_string (buffer, string);
789 }
790 #else
791 {
792 HOST_WIDE_INT i;
793 unsigned char *p = (unsigned char *) &TREE_REAL_CST (node);
794 pp_string (buffer, "0x");
795 for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
796 output_formatted_integer (buffer, "%02x", *p++);
797 }
798 #endif
799 break;
800 }
801
802 case FIXED_CST:
803 {
804 char string[100];
805 fixed_to_decimal (string, TREE_FIXED_CST_PTR (node), sizeof (string));
806 pp_string (buffer, string);
807 break;
808 }
809
810 case COMPLEX_CST:
811 pp_string (buffer, "__complex__ (");
812 dump_generic_node (buffer, TREE_REALPART (node), spc, flags, false);
813 pp_string (buffer, ", ");
814 dump_generic_node (buffer, TREE_IMAGPART (node), spc, flags, false);
815 pp_string (buffer, ")");
816 break;
817
818 case STRING_CST:
819 pp_string (buffer, "\"");
820 pretty_print_string (buffer, TREE_STRING_POINTER (node));
821 pp_string (buffer, "\"");
822 break;
823
824 case VECTOR_CST:
825 {
826 tree elt;
827 pp_string (buffer, "{ ");
828 for (elt = TREE_VECTOR_CST_ELTS (node); elt; elt = TREE_CHAIN (elt))
829 {
830 dump_generic_node (buffer, TREE_VALUE (elt), spc, flags, false);
831 if (TREE_CHAIN (elt))
832 pp_string (buffer, ", ");
833 }
834 pp_string (buffer, " }");
835 }
836 break;
837
838 case FUNCTION_TYPE:
839 break;
840
841 case FUNCTION_DECL:
842 case CONST_DECL:
843 dump_decl_name (buffer, node, flags);
844 break;
845
846 case LABEL_DECL:
847 if (DECL_NAME (node))
848 dump_decl_name (buffer, node, flags);
849 else if (LABEL_DECL_UID (node) != -1)
850 pp_printf (buffer, "<L%d>", (int) LABEL_DECL_UID (node));
851 else
852 pp_printf (buffer, "<D.%u>", DECL_UID (node));
853 break;
854
855 case TYPE_DECL:
856 if (DECL_IS_BUILTIN (node))
857 {
858 /* Don't print the declaration of built-in types. */
859 break;
860 }
861 if (DECL_NAME (node))
862 dump_decl_name (buffer, node, flags);
863 else
864 {
865 if ((TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
866 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
867 && TYPE_METHODS (TREE_TYPE (node)))
868 {
869 /* The type is a c++ class: all structures have at least
870 4 methods. */
871 pp_string (buffer, "class ");
872 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
873 }
874 else
875 {
876 pp_string (buffer,
877 (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
878 ? "union" : "struct "));
879 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
880 }
881 }
882 break;
883
884 case SYMBOL_MEMORY_TAG:
885 case NAME_MEMORY_TAG:
886 case VAR_DECL:
887 case PARM_DECL:
888 case FIELD_DECL:
889 case NAMESPACE_DECL:
890 case MEMORY_PARTITION_TAG:
891 dump_decl_name (buffer, node, flags);
892 break;
893
894 case RESULT_DECL:
895 pp_string (buffer, "<retval>");
896 break;
897
898 case COMPONENT_REF:
899 op0 = TREE_OPERAND (node, 0);
900 str = ".";
901 if (TREE_CODE (op0) == INDIRECT_REF)
902 {
903 op0 = TREE_OPERAND (op0, 0);
904 str = "->";
905 }
906 if (op_prio (op0) < op_prio (node))
907 pp_character (buffer, '(');
908 dump_generic_node (buffer, op0, spc, flags, false);
909 if (op_prio (op0) < op_prio (node))
910 pp_character (buffer, ')');
911 pp_string (buffer, str);
912 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
913 op0 = component_ref_field_offset (node);
914 if (op0 && TREE_CODE (op0) != INTEGER_CST)
915 {
916 pp_string (buffer, "{off: ");
917 dump_generic_node (buffer, op0, spc, flags, false);
918 pp_character (buffer, '}');
919 }
920 break;
921
922 case BIT_FIELD_REF:
923 pp_string (buffer, "BIT_FIELD_REF <");
924 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
925 pp_string (buffer, ", ");
926 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
927 pp_string (buffer, ", ");
928 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
929 pp_string (buffer, ">");
930 break;
931
932 case ARRAY_REF:
933 case ARRAY_RANGE_REF:
934 op0 = TREE_OPERAND (node, 0);
935 if (op_prio (op0) < op_prio (node))
936 pp_character (buffer, '(');
937 dump_generic_node (buffer, op0, spc, flags, false);
938 if (op_prio (op0) < op_prio (node))
939 pp_character (buffer, ')');
940 pp_character (buffer, '[');
941 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
942 if (TREE_CODE (node) == ARRAY_RANGE_REF)
943 pp_string (buffer, " ...");
944 pp_character (buffer, ']');
945
946 op0 = array_ref_low_bound (node);
947 op1 = array_ref_element_size (node);
948
949 if (!integer_zerop (op0)
950 || TREE_OPERAND (node, 2)
951 || TREE_OPERAND (node, 3))
952 {
953 pp_string (buffer, "{lb: ");
954 dump_generic_node (buffer, op0, spc, flags, false);
955 pp_string (buffer, " sz: ");
956 dump_generic_node (buffer, op1, spc, flags, false);
957 pp_character (buffer, '}');
958 }
959 break;
960
961 case CONSTRUCTOR:
962 {
963 unsigned HOST_WIDE_INT ix;
964 tree field, val;
965 bool is_struct_init = FALSE;
966 pp_character (buffer, '{');
967 if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
968 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
969 is_struct_init = TRUE;
970 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
971 {
972 if (field && is_struct_init)
973 {
974 pp_character (buffer, '.');
975 dump_generic_node (buffer, field, spc, flags, false);
976 pp_string (buffer, "=");
977 }
978 if (val && TREE_CODE (val) == ADDR_EXPR)
979 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
980 val = TREE_OPERAND (val, 0);
981 if (val && TREE_CODE (val) == FUNCTION_DECL)
982 dump_decl_name (buffer, val, flags);
983 else
984 dump_generic_node (buffer, val, spc, flags, false);
985 if (ix != VEC_length (constructor_elt, CONSTRUCTOR_ELTS (node)) - 1)
986 {
987 pp_character (buffer, ',');
988 pp_space (buffer);
989 }
990 }
991 pp_character (buffer, '}');
992 }
993 break;
994
995 case COMPOUND_EXPR:
996 {
997 tree *tp;
998 if (flags & TDF_SLIM)
999 {
1000 pp_string (buffer, "<COMPOUND_EXPR>");
1001 break;
1002 }
1003
1004 dump_generic_node (buffer, TREE_OPERAND (node, 0),
1005 spc, flags, !(flags & TDF_SLIM));
1006 if (flags & TDF_SLIM)
1007 newline_and_indent (buffer, spc);
1008 else
1009 {
1010 pp_character (buffer, ',');
1011 pp_space (buffer);
1012 }
1013
1014 for (tp = &TREE_OPERAND (node, 1);
1015 TREE_CODE (*tp) == COMPOUND_EXPR;
1016 tp = &TREE_OPERAND (*tp, 1))
1017 {
1018 dump_generic_node (buffer, TREE_OPERAND (*tp, 0),
1019 spc, flags, !(flags & TDF_SLIM));
1020 if (flags & TDF_SLIM)
1021 newline_and_indent (buffer, spc);
1022 else
1023 {
1024 pp_character (buffer, ',');
1025 pp_space (buffer);
1026 }
1027 }
1028
1029 dump_generic_node (buffer, *tp, spc, flags, !(flags & TDF_SLIM));
1030 }
1031 break;
1032
1033 case STATEMENT_LIST:
1034 {
1035 tree_stmt_iterator si;
1036 bool first = true;
1037
1038 if (flags & TDF_SLIM)
1039 {
1040 pp_string (buffer, "<STATEMENT_LIST>");
1041 break;
1042 }
1043
1044 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
1045 {
1046 if (!first)
1047 newline_and_indent (buffer, spc);
1048 else
1049 first = false;
1050 dump_generic_node (buffer, tsi_stmt (si), spc, flags, true);
1051 }
1052 }
1053 break;
1054
1055 case MODIFY_EXPR:
1056 case INIT_EXPR:
1057 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags,
1058 false);
1059 pp_space (buffer);
1060 pp_character (buffer, '=');
1061 if (TREE_CODE (node) == MODIFY_EXPR
1062 && MOVE_NONTEMPORAL (node))
1063 pp_string (buffer, "{nt}");
1064 pp_space (buffer);
1065 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags,
1066 false);
1067 break;
1068
1069 case TARGET_EXPR:
1070 pp_string (buffer, "TARGET_EXPR <");
1071 dump_generic_node (buffer, TARGET_EXPR_SLOT (node), spc, flags, false);
1072 pp_character (buffer, ',');
1073 pp_space (buffer);
1074 dump_generic_node (buffer, TARGET_EXPR_INITIAL (node), spc, flags, false);
1075 pp_character (buffer, '>');
1076 break;
1077
1078 case DECL_EXPR:
1079 print_declaration (buffer, DECL_EXPR_DECL (node), spc, flags);
1080 is_stmt = false;
1081 break;
1082
1083 case COND_EXPR:
1084 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
1085 {
1086 pp_string (buffer, "if (");
1087 dump_generic_node (buffer, COND_EXPR_COND (node), spc, flags, false);
1088 pp_character (buffer, ')');
1089 /* The lowered cond_exprs should always be printed in full. */
1090 if (COND_EXPR_THEN (node)
1091 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
1092 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
1093 && COND_EXPR_ELSE (node)
1094 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
1095 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
1096 {
1097 pp_space (buffer);
1098 dump_generic_node (buffer, COND_EXPR_THEN (node),
1099 0, flags, true);
1100 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
1101 {
1102 pp_string (buffer, " else ");
1103 dump_generic_node (buffer, COND_EXPR_ELSE (node),
1104 0, flags, true);
1105 }
1106 }
1107 else if (!(flags & TDF_SLIM))
1108 {
1109 /* Output COND_EXPR_THEN. */
1110 if (COND_EXPR_THEN (node))
1111 {
1112 newline_and_indent (buffer, spc+2);
1113 pp_character (buffer, '{');
1114 newline_and_indent (buffer, spc+4);
1115 dump_generic_node (buffer, COND_EXPR_THEN (node), spc+4,
1116 flags, true);
1117 newline_and_indent (buffer, spc+2);
1118 pp_character (buffer, '}');
1119 }
1120
1121 /* Output COND_EXPR_ELSE. */
1122 if (COND_EXPR_ELSE (node)
1123 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
1124 {
1125 newline_and_indent (buffer, spc);
1126 pp_string (buffer, "else");
1127 newline_and_indent (buffer, spc+2);
1128 pp_character (buffer, '{');
1129 newline_and_indent (buffer, spc+4);
1130 dump_generic_node (buffer, COND_EXPR_ELSE (node), spc+4,
1131 flags, true);
1132 newline_and_indent (buffer, spc+2);
1133 pp_character (buffer, '}');
1134 }
1135 }
1136 is_expr = false;
1137 }
1138 else
1139 {
1140 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1141 pp_space (buffer);
1142 pp_character (buffer, '?');
1143 pp_space (buffer);
1144 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1145 pp_space (buffer);
1146 pp_character (buffer, ':');
1147 pp_space (buffer);
1148 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1149 }
1150 break;
1151
1152 case BIND_EXPR:
1153 pp_character (buffer, '{');
1154 if (!(flags & TDF_SLIM))
1155 {
1156 if (BIND_EXPR_VARS (node))
1157 {
1158 pp_newline (buffer);
1159
1160 for (op0 = BIND_EXPR_VARS (node); op0; op0 = TREE_CHAIN (op0))
1161 {
1162 print_declaration (buffer, op0, spc+2, flags);
1163 pp_newline (buffer);
1164 }
1165 }
1166
1167 newline_and_indent (buffer, spc+2);
1168 dump_generic_node (buffer, BIND_EXPR_BODY (node), spc+2, flags, true);
1169 newline_and_indent (buffer, spc);
1170 pp_character (buffer, '}');
1171 }
1172 is_expr = false;
1173 break;
1174
1175 case CALL_EXPR:
1176 print_call_name (buffer, node);
1177
1178 /* Print parameters. */
1179 pp_space (buffer);
1180 pp_character (buffer, '(');
1181 {
1182 tree arg;
1183 call_expr_arg_iterator iter;
1184 FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
1185 {
1186 dump_generic_node (buffer, arg, spc, flags, false);
1187 if (more_call_expr_args_p (&iter))
1188 {
1189 pp_character (buffer, ',');
1190 pp_space (buffer);
1191 }
1192 }
1193 }
1194 if (CALL_EXPR_VA_ARG_PACK (node))
1195 {
1196 if (call_expr_nargs (node) > 0)
1197 {
1198 pp_character (buffer, ',');
1199 pp_space (buffer);
1200 }
1201 pp_string (buffer, "__builtin_va_arg_pack ()");
1202 }
1203 pp_character (buffer, ')');
1204
1205 op1 = CALL_EXPR_STATIC_CHAIN (node);
1206 if (op1)
1207 {
1208 pp_string (buffer, " [static-chain: ");
1209 dump_generic_node (buffer, op1, spc, flags, false);
1210 pp_character (buffer, ']');
1211 }
1212
1213 if (CALL_EXPR_RETURN_SLOT_OPT (node))
1214 pp_string (buffer, " [return slot optimization]");
1215 if (CALL_EXPR_TAILCALL (node))
1216 pp_string (buffer, " [tail call]");
1217 break;
1218
1219 case WITH_CLEANUP_EXPR:
1220 NIY;
1221 break;
1222
1223 case CLEANUP_POINT_EXPR:
1224 pp_string (buffer, "<<cleanup_point ");
1225 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1226 pp_string (buffer, ">>");
1227 break;
1228
1229 case PLACEHOLDER_EXPR:
1230 pp_string (buffer, "<PLACEHOLDER_EXPR ");
1231 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1232 pp_character (buffer, '>');
1233 break;
1234
1235 /* Binary arithmetic and logic expressions. */
1236 case WIDEN_SUM_EXPR:
1237 case WIDEN_MULT_EXPR:
1238 case MULT_EXPR:
1239 case PLUS_EXPR:
1240 case POINTER_PLUS_EXPR:
1241 case MINUS_EXPR:
1242 case TRUNC_DIV_EXPR:
1243 case CEIL_DIV_EXPR:
1244 case FLOOR_DIV_EXPR:
1245 case ROUND_DIV_EXPR:
1246 case TRUNC_MOD_EXPR:
1247 case CEIL_MOD_EXPR:
1248 case FLOOR_MOD_EXPR:
1249 case ROUND_MOD_EXPR:
1250 case RDIV_EXPR:
1251 case EXACT_DIV_EXPR:
1252 case LSHIFT_EXPR:
1253 case RSHIFT_EXPR:
1254 case LROTATE_EXPR:
1255 case RROTATE_EXPR:
1256 case VEC_LSHIFT_EXPR:
1257 case VEC_RSHIFT_EXPR:
1258 case BIT_IOR_EXPR:
1259 case BIT_XOR_EXPR:
1260 case BIT_AND_EXPR:
1261 case TRUTH_ANDIF_EXPR:
1262 case TRUTH_ORIF_EXPR:
1263 case TRUTH_AND_EXPR:
1264 case TRUTH_OR_EXPR:
1265 case TRUTH_XOR_EXPR:
1266 case LT_EXPR:
1267 case LE_EXPR:
1268 case GT_EXPR:
1269 case GE_EXPR:
1270 case EQ_EXPR:
1271 case NE_EXPR:
1272 case UNLT_EXPR:
1273 case UNLE_EXPR:
1274 case UNGT_EXPR:
1275 case UNGE_EXPR:
1276 case UNEQ_EXPR:
1277 case LTGT_EXPR:
1278 case ORDERED_EXPR:
1279 case UNORDERED_EXPR:
1280 {
1281 const char *op = op_symbol (node);
1282 op0 = TREE_OPERAND (node, 0);
1283 op1 = TREE_OPERAND (node, 1);
1284
1285 /* When the operands are expressions with less priority,
1286 keep semantics of the tree representation. */
1287 if (op_prio (op0) <= op_prio (node))
1288 {
1289 pp_character (buffer, '(');
1290 dump_generic_node (buffer, op0, spc, flags, false);
1291 pp_character (buffer, ')');
1292 }
1293 else
1294 dump_generic_node (buffer, op0, spc, flags, false);
1295
1296 pp_space (buffer);
1297 pp_string (buffer, op);
1298 pp_space (buffer);
1299
1300 /* When the operands are expressions with less priority,
1301 keep semantics of the tree representation. */
1302 if (op_prio (op1) <= op_prio (node))
1303 {
1304 pp_character (buffer, '(');
1305 dump_generic_node (buffer, op1, spc, flags, false);
1306 pp_character (buffer, ')');
1307 }
1308 else
1309 dump_generic_node (buffer, op1, spc, flags, false);
1310 }
1311 break;
1312
1313 /* Unary arithmetic and logic expressions. */
1314 case NEGATE_EXPR:
1315 case BIT_NOT_EXPR:
1316 case TRUTH_NOT_EXPR:
1317 case ADDR_EXPR:
1318 case PREDECREMENT_EXPR:
1319 case PREINCREMENT_EXPR:
1320 case ALIGN_INDIRECT_REF:
1321 case MISALIGNED_INDIRECT_REF:
1322 case INDIRECT_REF:
1323 if (TREE_CODE (node) == ADDR_EXPR
1324 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
1325 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
1326 ; /* Do not output '&' for strings and function pointers. */
1327 else
1328 pp_string (buffer, op_symbol (node));
1329
1330 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1331 {
1332 pp_character (buffer, '(');
1333 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1334 pp_character (buffer, ')');
1335 }
1336 else
1337 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1338
1339 if (TREE_CODE (node) == MISALIGNED_INDIRECT_REF)
1340 {
1341 pp_string (buffer, "{misalignment: ");
1342 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1343 pp_character (buffer, '}');
1344 }
1345 break;
1346
1347 case POSTDECREMENT_EXPR:
1348 case POSTINCREMENT_EXPR:
1349 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
1350 {
1351 pp_character (buffer, '(');
1352 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1353 pp_character (buffer, ')');
1354 }
1355 else
1356 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1357 pp_string (buffer, op_symbol (node));
1358 break;
1359
1360 case MIN_EXPR:
1361 pp_string (buffer, "MIN_EXPR <");
1362 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1363 pp_string (buffer, ", ");
1364 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1365 pp_character (buffer, '>');
1366 break;
1367
1368 case MAX_EXPR:
1369 pp_string (buffer, "MAX_EXPR <");
1370 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1371 pp_string (buffer, ", ");
1372 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1373 pp_character (buffer, '>');
1374 break;
1375
1376 case ABS_EXPR:
1377 pp_string (buffer, "ABS_EXPR <");
1378 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1379 pp_character (buffer, '>');
1380 break;
1381
1382 case RANGE_EXPR:
1383 NIY;
1384 break;
1385
1386 case FIXED_CONVERT_EXPR:
1387 case FIX_TRUNC_EXPR:
1388 case FLOAT_EXPR:
1389 CASE_CONVERT:
1390 type = TREE_TYPE (node);
1391 op0 = TREE_OPERAND (node, 0);
1392 if (type != TREE_TYPE (op0))
1393 {
1394 pp_character (buffer, '(');
1395 dump_generic_node (buffer, type, spc, flags, false);
1396 pp_string (buffer, ") ");
1397 }
1398 if (op_prio (op0) < op_prio (node))
1399 pp_character (buffer, '(');
1400 dump_generic_node (buffer, op0, spc, flags, false);
1401 if (op_prio (op0) < op_prio (node))
1402 pp_character (buffer, ')');
1403 break;
1404
1405 case VIEW_CONVERT_EXPR:
1406 pp_string (buffer, "VIEW_CONVERT_EXPR<");
1407 dump_generic_node (buffer, TREE_TYPE (node), spc, flags, false);
1408 pp_string (buffer, ">(");
1409 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1410 pp_character (buffer, ')');
1411 break;
1412
1413 case PAREN_EXPR:
1414 pp_string (buffer, "((");
1415 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1416 pp_string (buffer, "))");
1417 break;
1418
1419 case NON_LVALUE_EXPR:
1420 pp_string (buffer, "NON_LVALUE_EXPR <");
1421 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1422 pp_character (buffer, '>');
1423 break;
1424
1425 case SAVE_EXPR:
1426 pp_string (buffer, "SAVE_EXPR <");
1427 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1428 pp_character (buffer, '>');
1429 break;
1430
1431 case COMPLEX_EXPR:
1432 pp_string (buffer, "COMPLEX_EXPR <");
1433 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1434 pp_string (buffer, ", ");
1435 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1436 pp_string (buffer, ">");
1437 break;
1438
1439 case CONJ_EXPR:
1440 pp_string (buffer, "CONJ_EXPR <");
1441 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1442 pp_string (buffer, ">");
1443 break;
1444
1445 case REALPART_EXPR:
1446 pp_string (buffer, "REALPART_EXPR <");
1447 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1448 pp_string (buffer, ">");
1449 break;
1450
1451 case IMAGPART_EXPR:
1452 pp_string (buffer, "IMAGPART_EXPR <");
1453 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1454 pp_string (buffer, ">");
1455 break;
1456
1457 case VA_ARG_EXPR:
1458 pp_string (buffer, "VA_ARG_EXPR <");
1459 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1460 pp_string (buffer, ">");
1461 break;
1462
1463 case TRY_FINALLY_EXPR:
1464 case TRY_CATCH_EXPR:
1465 pp_string (buffer, "try");
1466 newline_and_indent (buffer, spc+2);
1467 pp_string (buffer, "{");
1468 newline_and_indent (buffer, spc+4);
1469 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc+4, flags, true);
1470 newline_and_indent (buffer, spc+2);
1471 pp_string (buffer, "}");
1472 newline_and_indent (buffer, spc);
1473 pp_string (buffer,
1474 (TREE_CODE (node) == TRY_CATCH_EXPR) ? "catch" : "finally");
1475 newline_and_indent (buffer, spc+2);
1476 pp_string (buffer, "{");
1477 newline_and_indent (buffer, spc+4);
1478 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc+4, flags, true);
1479 newline_and_indent (buffer, spc+2);
1480 pp_string (buffer, "}");
1481 is_expr = false;
1482 break;
1483
1484 case CATCH_EXPR:
1485 pp_string (buffer, "catch (");
1486 dump_generic_node (buffer, CATCH_TYPES (node), spc+2, flags, false);
1487 pp_string (buffer, ")");
1488 newline_and_indent (buffer, spc+2);
1489 pp_string (buffer, "{");
1490 newline_and_indent (buffer, spc+4);
1491 dump_generic_node (buffer, CATCH_BODY (node), spc+4, flags, true);
1492 newline_and_indent (buffer, spc+2);
1493 pp_string (buffer, "}");
1494 is_expr = false;
1495 break;
1496
1497 case EH_FILTER_EXPR:
1498 pp_string (buffer, "<<<eh_filter (");
1499 dump_generic_node (buffer, EH_FILTER_TYPES (node), spc+2, flags, false);
1500 pp_string (buffer, ")>>>");
1501 newline_and_indent (buffer, spc+2);
1502 pp_string (buffer, "{");
1503 newline_and_indent (buffer, spc+4);
1504 dump_generic_node (buffer, EH_FILTER_FAILURE (node), spc+4, flags, true);
1505 newline_and_indent (buffer, spc+2);
1506 pp_string (buffer, "}");
1507 is_expr = false;
1508 break;
1509
1510 case CHANGE_DYNAMIC_TYPE_EXPR:
1511 pp_string (buffer, "<<<change_dynamic_type (");
1512 dump_generic_node (buffer, CHANGE_DYNAMIC_TYPE_NEW_TYPE (node), spc + 2,
1513 flags, false);
1514 pp_string (buffer, ") ");
1515 dump_generic_node (buffer, CHANGE_DYNAMIC_TYPE_LOCATION (node), spc + 2,
1516 flags, false);
1517 pp_string (buffer, ")>>>");
1518 is_expr = false;
1519 break;
1520
1521 case LABEL_EXPR:
1522 op0 = TREE_OPERAND (node, 0);
1523 /* If this is for break or continue, don't bother printing it. */
1524 if (DECL_NAME (op0))
1525 {
1526 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1527 if (strcmp (name, "break") == 0
1528 || strcmp (name, "continue") == 0)
1529 break;
1530 }
1531 dump_generic_node (buffer, op0, spc, flags, false);
1532 pp_character (buffer, ':');
1533 if (DECL_NONLOCAL (op0))
1534 pp_string (buffer, " [non-local]");
1535 break;
1536
1537 case EXC_PTR_EXPR:
1538 pp_string (buffer, "<<<exception object>>>");
1539 break;
1540
1541 case FILTER_EXPR:
1542 pp_string (buffer, "<<<filter object>>>");
1543 break;
1544
1545 case LOOP_EXPR:
1546 pp_string (buffer, "while (1)");
1547 if (!(flags & TDF_SLIM))
1548 {
1549 newline_and_indent (buffer, spc+2);
1550 pp_character (buffer, '{');
1551 newline_and_indent (buffer, spc+4);
1552 dump_generic_node (buffer, LOOP_EXPR_BODY (node), spc+4, flags, true);
1553 newline_and_indent (buffer, spc+2);
1554 pp_character (buffer, '}');
1555 }
1556 is_expr = false;
1557 break;
1558
1559 case PREDICT_EXPR:
1560 pp_string (buffer, "// predicted ");
1561 if (PREDICT_EXPR_OUTCOME (node))
1562 pp_string (buffer, "likely by ");
1563 else
1564 pp_string (buffer, "unlikely by ");
1565 pp_string (buffer, predictor_name (PREDICT_EXPR_PREDICTOR (node)));
1566 pp_string (buffer, " predictor.");
1567 break;
1568
1569 case RETURN_EXPR:
1570 pp_string (buffer, "return");
1571 op0 = TREE_OPERAND (node, 0);
1572 if (op0)
1573 {
1574 pp_space (buffer);
1575 if (TREE_CODE (op0) == MODIFY_EXPR)
1576 dump_generic_node (buffer, TREE_OPERAND (op0, 1),
1577 spc, flags, false);
1578 else
1579 dump_generic_node (buffer, op0, spc, flags, false);
1580 }
1581 break;
1582
1583 case EXIT_EXPR:
1584 pp_string (buffer, "if (");
1585 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1586 pp_string (buffer, ") break");
1587 break;
1588
1589 case SWITCH_EXPR:
1590 pp_string (buffer, "switch (");
1591 dump_generic_node (buffer, SWITCH_COND (node), spc, flags, false);
1592 pp_character (buffer, ')');
1593 if (!(flags & TDF_SLIM))
1594 {
1595 newline_and_indent (buffer, spc+2);
1596 pp_character (buffer, '{');
1597 if (SWITCH_BODY (node))
1598 {
1599 newline_and_indent (buffer, spc+4);
1600 dump_generic_node (buffer, SWITCH_BODY (node), spc+4, flags,
1601 true);
1602 }
1603 else
1604 {
1605 tree vec = SWITCH_LABELS (node);
1606 size_t i, n = TREE_VEC_LENGTH (vec);
1607 for (i = 0; i < n; ++i)
1608 {
1609 tree elt = TREE_VEC_ELT (vec, i);
1610 newline_and_indent (buffer, spc+4);
1611 if (elt)
1612 {
1613 dump_generic_node (buffer, elt, spc+4, flags, false);
1614 pp_string (buffer, " goto ");
1615 dump_generic_node (buffer, CASE_LABEL (elt), spc+4,
1616 flags, true);
1617 pp_semicolon (buffer);
1618 }
1619 else
1620 pp_string (buffer, "case ???: goto ???;");
1621 }
1622 }
1623 newline_and_indent (buffer, spc+2);
1624 pp_character (buffer, '}');
1625 }
1626 is_expr = false;
1627 break;
1628
1629 case GOTO_EXPR:
1630 op0 = GOTO_DESTINATION (node);
1631 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
1632 {
1633 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
1634 if (strcmp (name, "break") == 0
1635 || strcmp (name, "continue") == 0)
1636 {
1637 pp_string (buffer, name);
1638 break;
1639 }
1640 }
1641 pp_string (buffer, "goto ");
1642 dump_generic_node (buffer, op0, spc, flags, false);
1643 break;
1644
1645 case RESX_EXPR:
1646 pp_string (buffer, "resx ");
1647 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1648 break;
1649
1650 case ASM_EXPR:
1651 pp_string (buffer, "__asm__");
1652 if (ASM_VOLATILE_P (node))
1653 pp_string (buffer, " __volatile__");
1654 pp_character (buffer, '(');
1655 dump_generic_node (buffer, ASM_STRING (node), spc, flags, false);
1656 pp_character (buffer, ':');
1657 dump_generic_node (buffer, ASM_OUTPUTS (node), spc, flags, false);
1658 pp_character (buffer, ':');
1659 dump_generic_node (buffer, ASM_INPUTS (node), spc, flags, false);
1660 if (ASM_CLOBBERS (node))
1661 {
1662 pp_character (buffer, ':');
1663 dump_generic_node (buffer, ASM_CLOBBERS (node), spc, flags, false);
1664 }
1665 pp_string (buffer, ")");
1666 break;
1667
1668 case CASE_LABEL_EXPR:
1669 if (CASE_LOW (node) && CASE_HIGH (node))
1670 {
1671 pp_string (buffer, "case ");
1672 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1673 pp_string (buffer, " ... ");
1674 dump_generic_node (buffer, CASE_HIGH (node), spc, flags, false);
1675 }
1676 else if (CASE_LOW (node))
1677 {
1678 pp_string (buffer, "case ");
1679 dump_generic_node (buffer, CASE_LOW (node), spc, flags, false);
1680 }
1681 else
1682 pp_string (buffer, "default");
1683 pp_character (buffer, ':');
1684 break;
1685
1686 case OBJ_TYPE_REF:
1687 pp_string (buffer, "OBJ_TYPE_REF(");
1688 dump_generic_node (buffer, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
1689 pp_character (buffer, ';');
1690 dump_generic_node (buffer, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
1691 pp_character (buffer, '-');
1692 pp_character (buffer, '>');
1693 dump_generic_node (buffer, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
1694 pp_character (buffer, ')');
1695 break;
1696
1697 case SSA_NAME:
1698 dump_generic_node (buffer, SSA_NAME_VAR (node), spc, flags, false);
1699 pp_string (buffer, "_");
1700 pp_decimal_int (buffer, SSA_NAME_VERSION (node));
1701 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
1702 pp_string (buffer, "(ab)");
1703 else if (SSA_NAME_IS_DEFAULT_DEF (node))
1704 pp_string (buffer, "(D)");
1705 break;
1706
1707 case WITH_SIZE_EXPR:
1708 pp_string (buffer, "WITH_SIZE_EXPR <");
1709 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1710 pp_string (buffer, ", ");
1711 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1712 pp_string (buffer, ">");
1713 break;
1714
1715 case ASSERT_EXPR:
1716 pp_string (buffer, "ASSERT_EXPR <");
1717 dump_generic_node (buffer, ASSERT_EXPR_VAR (node), spc, flags, false);
1718 pp_string (buffer, ", ");
1719 dump_generic_node (buffer, ASSERT_EXPR_COND (node), spc, flags, false);
1720 pp_string (buffer, ">");
1721 break;
1722
1723 case SCEV_KNOWN:
1724 pp_string (buffer, "scev_known");
1725 break;
1726
1727 case SCEV_NOT_KNOWN:
1728 pp_string (buffer, "scev_not_known");
1729 break;
1730
1731 case POLYNOMIAL_CHREC:
1732 pp_string (buffer, "{");
1733 dump_generic_node (buffer, CHREC_LEFT (node), spc, flags, false);
1734 pp_string (buffer, ", +, ");
1735 dump_generic_node (buffer, CHREC_RIGHT (node), spc, flags, false);
1736 pp_string (buffer, "}_");
1737 dump_generic_node (buffer, CHREC_VAR (node), spc, flags, false);
1738 is_stmt = false;
1739 break;
1740
1741 case REALIGN_LOAD_EXPR:
1742 pp_string (buffer, "REALIGN_LOAD <");
1743 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1744 pp_string (buffer, ", ");
1745 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1746 pp_string (buffer, ", ");
1747 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1748 pp_string (buffer, ">");
1749 break;
1750
1751 case VEC_COND_EXPR:
1752 pp_string (buffer, " VEC_COND_EXPR < ");
1753 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1754 pp_string (buffer, " , ");
1755 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1756 pp_string (buffer, " , ");
1757 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1758 pp_string (buffer, " > ");
1759 break;
1760
1761 case DOT_PROD_EXPR:
1762 pp_string (buffer, " DOT_PROD_EXPR < ");
1763 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1764 pp_string (buffer, ", ");
1765 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1766 pp_string (buffer, ", ");
1767 dump_generic_node (buffer, TREE_OPERAND (node, 2), spc, flags, false);
1768 pp_string (buffer, " > ");
1769 break;
1770
1771 case OMP_PARALLEL:
1772 pp_string (buffer, "#pragma omp parallel");
1773 dump_omp_clauses (buffer, OMP_PARALLEL_CLAUSES (node), spc, flags);
1774
1775 dump_omp_body:
1776 if (!(flags & TDF_SLIM) && OMP_BODY (node))
1777 {
1778 newline_and_indent (buffer, spc + 2);
1779 pp_character (buffer, '{');
1780 newline_and_indent (buffer, spc + 4);
1781 dump_generic_node (buffer, OMP_BODY (node), spc + 4, flags, false);
1782 newline_and_indent (buffer, spc + 2);
1783 pp_character (buffer, '}');
1784 }
1785 is_expr = false;
1786 break;
1787
1788 case OMP_TASK:
1789 pp_string (buffer, "#pragma omp task");
1790 dump_omp_clauses (buffer, OMP_TASK_CLAUSES (node), spc, flags);
1791 goto dump_omp_body;
1792
1793 case OMP_FOR:
1794 pp_string (buffer, "#pragma omp for");
1795 dump_omp_clauses (buffer, OMP_FOR_CLAUSES (node), spc, flags);
1796
1797 if (!(flags & TDF_SLIM))
1798 {
1799 int i;
1800
1801 if (OMP_FOR_PRE_BODY (node))
1802 {
1803 newline_and_indent (buffer, spc + 2);
1804 pp_character (buffer, '{');
1805 spc += 4;
1806 newline_and_indent (buffer, spc);
1807 dump_generic_node (buffer, OMP_FOR_PRE_BODY (node),
1808 spc, flags, false);
1809 }
1810 spc -= 2;
1811 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (node)); i++)
1812 {
1813 spc += 2;
1814 newline_and_indent (buffer, spc);
1815 pp_string (buffer, "for (");
1816 dump_generic_node (buffer, TREE_VEC_ELT (OMP_FOR_INIT (node), i),
1817 spc, flags, false);
1818 pp_string (buffer, "; ");
1819 dump_generic_node (buffer, TREE_VEC_ELT (OMP_FOR_COND (node), i),
1820 spc, flags, false);
1821 pp_string (buffer, "; ");
1822 dump_generic_node (buffer, TREE_VEC_ELT (OMP_FOR_INCR (node), i),
1823 spc, flags, false);
1824 pp_string (buffer, ")");
1825 }
1826 if (OMP_FOR_BODY (node))
1827 {
1828 newline_and_indent (buffer, spc + 2);
1829 pp_character (buffer, '{');
1830 newline_and_indent (buffer, spc + 4);
1831 dump_generic_node (buffer, OMP_FOR_BODY (node), spc + 4, flags,
1832 false);
1833 newline_and_indent (buffer, spc + 2);
1834 pp_character (buffer, '}');
1835 }
1836 spc -= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node)) - 2;
1837 if (OMP_FOR_PRE_BODY (node))
1838 {
1839 spc -= 4;
1840 newline_and_indent (buffer, spc + 2);
1841 pp_character (buffer, '}');
1842 }
1843 }
1844 is_expr = false;
1845 break;
1846
1847 case OMP_SECTIONS:
1848 pp_string (buffer, "#pragma omp sections");
1849 dump_omp_clauses (buffer, OMP_SECTIONS_CLAUSES (node), spc, flags);
1850 goto dump_omp_body;
1851
1852 case OMP_SECTION:
1853 pp_string (buffer, "#pragma omp section");
1854 goto dump_omp_body;
1855
1856 case OMP_MASTER:
1857 pp_string (buffer, "#pragma omp master");
1858 goto dump_omp_body;
1859
1860 case OMP_ORDERED:
1861 pp_string (buffer, "#pragma omp ordered");
1862 goto dump_omp_body;
1863
1864 case OMP_CRITICAL:
1865 pp_string (buffer, "#pragma omp critical");
1866 if (OMP_CRITICAL_NAME (node))
1867 {
1868 pp_space (buffer);
1869 pp_character (buffer, '(');
1870 dump_generic_node (buffer, OMP_CRITICAL_NAME (node), spc,
1871 flags, false);
1872 pp_character (buffer, ')');
1873 }
1874 goto dump_omp_body;
1875
1876 case OMP_ATOMIC:
1877 pp_string (buffer, "#pragma omp atomic");
1878 newline_and_indent (buffer, spc + 2);
1879 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1880 pp_space (buffer);
1881 pp_character (buffer, '=');
1882 pp_space (buffer);
1883 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1884 break;
1885
1886 case OMP_SINGLE:
1887 pp_string (buffer, "#pragma omp single");
1888 dump_omp_clauses (buffer, OMP_SINGLE_CLAUSES (node), spc, flags);
1889 goto dump_omp_body;
1890
1891 case OMP_CLAUSE:
1892 dump_omp_clause (buffer, node, spc, flags);
1893 is_expr = false;
1894 break;
1895
1896 case REDUC_MAX_EXPR:
1897 pp_string (buffer, " REDUC_MAX_EXPR < ");
1898 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1899 pp_string (buffer, " > ");
1900 break;
1901
1902 case REDUC_MIN_EXPR:
1903 pp_string (buffer, " REDUC_MIN_EXPR < ");
1904 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1905 pp_string (buffer, " > ");
1906 break;
1907
1908 case REDUC_PLUS_EXPR:
1909 pp_string (buffer, " REDUC_PLUS_EXPR < ");
1910 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1911 pp_string (buffer, " > ");
1912 break;
1913
1914 case VEC_WIDEN_MULT_HI_EXPR:
1915 pp_string (buffer, " VEC_WIDEN_MULT_HI_EXPR < ");
1916 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1917 pp_string (buffer, ", ");
1918 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1919 pp_string (buffer, " > ");
1920 break;
1921
1922 case VEC_WIDEN_MULT_LO_EXPR:
1923 pp_string (buffer, " VEC_WIDEN_MULT_LO_EXPR < ");
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 break;
1929
1930 case VEC_UNPACK_HI_EXPR:
1931 pp_string (buffer, " VEC_UNPACK_HI_EXPR < ");
1932 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1933 pp_string (buffer, " > ");
1934 break;
1935
1936 case VEC_UNPACK_LO_EXPR:
1937 pp_string (buffer, " VEC_UNPACK_LO_EXPR < ");
1938 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1939 pp_string (buffer, " > ");
1940 break;
1941
1942 case VEC_UNPACK_FLOAT_HI_EXPR:
1943 pp_string (buffer, " VEC_UNPACK_FLOAT_HI_EXPR < ");
1944 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1945 pp_string (buffer, " > ");
1946 break;
1947
1948 case VEC_UNPACK_FLOAT_LO_EXPR:
1949 pp_string (buffer, " VEC_UNPACK_FLOAT_LO_EXPR < ");
1950 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1951 pp_string (buffer, " > ");
1952 break;
1953
1954 case VEC_PACK_TRUNC_EXPR:
1955 pp_string (buffer, " VEC_PACK_TRUNC_EXPR < ");
1956 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1957 pp_string (buffer, ", ");
1958 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1959 pp_string (buffer, " > ");
1960 break;
1961
1962 case VEC_PACK_SAT_EXPR:
1963 pp_string (buffer, " VEC_PACK_SAT_EXPR < ");
1964 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1965 pp_string (buffer, ", ");
1966 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1967 pp_string (buffer, " > ");
1968 break;
1969
1970 case VEC_PACK_FIX_TRUNC_EXPR:
1971 pp_string (buffer, " VEC_PACK_FIX_TRUNC_EXPR < ");
1972 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
1973 pp_string (buffer, ", ");
1974 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
1975 pp_string (buffer, " > ");
1976 break;
1977
1978 case BLOCK:
1979 {
1980 tree t;
1981 pp_string (buffer, "BLOCK");
1982
1983 if (BLOCK_ABSTRACT (node))
1984 pp_string (buffer, " [abstract]");
1985
1986 if (TREE_ASM_WRITTEN (node))
1987 pp_string (buffer, " [written]");
1988
1989 newline_and_indent (buffer, spc + 2);
1990
1991 if (BLOCK_SUPERCONTEXT (node))
1992 {
1993 pp_string (buffer, "SUPERCONTEXT: ");
1994 if (TREE_CODE (BLOCK_SUPERCONTEXT (node)) == BLOCK)
1995 pp_printf (buffer, "BLOCK %p",
1996 (void *)BLOCK_SUPERCONTEXT (node));
1997 else
1998 dump_generic_node (buffer, BLOCK_SUPERCONTEXT (node), 0, flags,
1999 false);
2000 newline_and_indent (buffer, spc + 2);
2001 }
2002
2003 if (BLOCK_SUBBLOCKS (node))
2004 {
2005 pp_string (buffer, "SUBBLOCKS: ");
2006 for (t = BLOCK_SUBBLOCKS (node); t; t = BLOCK_CHAIN (t))
2007 pp_printf (buffer, "%p ", (void *)t);
2008 newline_and_indent (buffer, spc + 2);
2009 }
2010
2011 if (BLOCK_VARS (node))
2012 {
2013 pp_string (buffer, "VARS: ");
2014 for (t = BLOCK_VARS (node); t; t = TREE_CHAIN (t))
2015 {
2016 dump_generic_node (buffer, t, 0, flags, false);
2017 pp_string (buffer, " ");
2018 }
2019 newline_and_indent (buffer, spc + 2);
2020 }
2021
2022 if (BLOCK_ABSTRACT_ORIGIN (node))
2023 {
2024 pp_string (buffer, "ABSTRACT_ORIGIN: ");
2025 if (TREE_CODE (BLOCK_ABSTRACT_ORIGIN (node)) == BLOCK)
2026 pp_printf (buffer, "BLOCK %p",
2027 (void *)BLOCK_ABSTRACT_ORIGIN (node));
2028 else
2029 dump_generic_node (buffer, BLOCK_ABSTRACT_ORIGIN (node), 0, flags,
2030 false);
2031 newline_and_indent (buffer, spc + 2);
2032 }
2033 }
2034 break;
2035
2036 case VEC_EXTRACT_EVEN_EXPR:
2037 pp_string (buffer, " VEC_EXTRACT_EVEN_EXPR < ");
2038 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2039 pp_string (buffer, ", ");
2040 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2041 pp_string (buffer, " > ");
2042 break;
2043
2044 case VEC_EXTRACT_ODD_EXPR:
2045 pp_string (buffer, " VEC_EXTRACT_ODD_EXPR < ");
2046 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2047 pp_string (buffer, ", ");
2048 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2049 pp_string (buffer, " > ");
2050 break;
2051
2052 case VEC_INTERLEAVE_HIGH_EXPR:
2053 pp_string (buffer, " VEC_INTERLEAVE_HIGH_EXPR < ");
2054 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2055 pp_string (buffer, ", ");
2056 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2057 pp_string (buffer, " > ");
2058 break;
2059
2060 case VEC_INTERLEAVE_LOW_EXPR:
2061 pp_string (buffer, " VEC_INTERLEAVE_LOW_EXPR < ");
2062 dump_generic_node (buffer, TREE_OPERAND (node, 0), spc, flags, false);
2063 pp_string (buffer, ", ");
2064 dump_generic_node (buffer, TREE_OPERAND (node, 1), spc, flags, false);
2065 pp_string (buffer, " > ");
2066 break;
2067
2068 default:
2069 NIY;
2070 }
2071
2072 if (is_stmt && is_expr)
2073 pp_semicolon (buffer);
2074
2075 /* If we're building a diagnostic, the formatted text will be written
2076 into BUFFER's stream by the caller; otherwise, write it now. */
2077 if (!(flags & TDF_DIAGNOSTIC))
2078 pp_write_text_to_stream (buffer);
2079
2080 return spc;
2081 }
2082
2083 /* Print the declaration of a variable. */
2084
2085 void
2086 print_declaration (pretty_printer *buffer, tree t, int spc, int flags)
2087 {
2088 INDENT (spc);
2089
2090 if (TREE_CODE (t) == TYPE_DECL)
2091 pp_string (buffer, "typedef ");
2092
2093 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
2094 pp_string (buffer, "register ");
2095
2096 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
2097 pp_string (buffer, "extern ");
2098 else if (TREE_STATIC (t))
2099 pp_string (buffer, "static ");
2100
2101 /* Print the type and name. */
2102 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
2103 {
2104 tree tmp;
2105
2106 /* Print array's type. */
2107 tmp = TREE_TYPE (t);
2108 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
2109 tmp = TREE_TYPE (tmp);
2110 dump_generic_node (buffer, TREE_TYPE (tmp), spc, flags, false);
2111
2112 /* Print variable's name. */
2113 pp_space (buffer);
2114 dump_generic_node (buffer, t, spc, flags, false);
2115
2116 /* Print the dimensions. */
2117 tmp = TREE_TYPE (t);
2118 while (TREE_CODE (tmp) == ARRAY_TYPE)
2119 {
2120 dump_array_domain (buffer, TYPE_DOMAIN (tmp), spc, flags);
2121 tmp = TREE_TYPE (tmp);
2122 }
2123 }
2124 else if (TREE_CODE (t) == FUNCTION_DECL)
2125 {
2126 dump_generic_node (buffer, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
2127 pp_space (buffer);
2128 dump_decl_name (buffer, t, flags);
2129 dump_function_declaration (buffer, TREE_TYPE (t), spc, flags);
2130 }
2131 else
2132 {
2133 /* Print type declaration. */
2134 dump_generic_node (buffer, TREE_TYPE (t), spc, flags, false);
2135
2136 /* Print variable's name. */
2137 pp_space (buffer);
2138 dump_generic_node (buffer, t, spc, flags, false);
2139 }
2140
2141 if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
2142 {
2143 pp_string (buffer, " __asm__ ");
2144 pp_character (buffer, '(');
2145 dump_generic_node (buffer, DECL_ASSEMBLER_NAME (t), spc, flags, false);
2146 pp_character (buffer, ')');
2147 }
2148
2149 /* The initial value of a function serves to determine whether the function
2150 is declared or defined. So the following does not apply to function
2151 nodes. */
2152 if (TREE_CODE (t) != FUNCTION_DECL)
2153 {
2154 /* Print the initial value. */
2155 if (DECL_INITIAL (t))
2156 {
2157 pp_space (buffer);
2158 pp_character (buffer, '=');
2159 pp_space (buffer);
2160 dump_generic_node (buffer, DECL_INITIAL (t), spc, flags, false);
2161 }
2162 }
2163
2164 if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
2165 {
2166 pp_string (buffer, " [value-expr: ");
2167 dump_generic_node (buffer, DECL_VALUE_EXPR (t), spc, flags, false);
2168 pp_character (buffer, ']');
2169 }
2170
2171 pp_character (buffer, ';');
2172 }
2173
2174
2175 /* Prints a structure: name, fields, and methods.
2176 FIXME: Still incomplete. */
2177
2178 static void
2179 print_struct_decl (pretty_printer *buffer, const_tree node, int spc, int flags)
2180 {
2181 /* Print the name of the structure. */
2182 if (TYPE_NAME (node))
2183 {
2184 INDENT (spc);
2185 if (TREE_CODE (node) == RECORD_TYPE)
2186 pp_string (buffer, "struct ");
2187 else if ((TREE_CODE (node) == UNION_TYPE
2188 || TREE_CODE (node) == QUAL_UNION_TYPE))
2189 pp_string (buffer, "union ");
2190
2191 dump_generic_node (buffer, TYPE_NAME (node), spc, 0, false);
2192 }
2193
2194 /* Print the contents of the structure. */
2195 pp_newline (buffer);
2196 INDENT (spc);
2197 pp_character (buffer, '{');
2198 pp_newline (buffer);
2199
2200 /* Print the fields of the structure. */
2201 {
2202 tree tmp;
2203 tmp = TYPE_FIELDS (node);
2204 while (tmp)
2205 {
2206 /* Avoid to print recursively the structure. */
2207 /* FIXME : Not implemented correctly...,
2208 what about the case when we have a cycle in the contain graph? ...
2209 Maybe this could be solved by looking at the scope in which the
2210 structure was declared. */
2211 if (TREE_TYPE (tmp) != node
2212 || (TREE_CODE (TREE_TYPE (tmp)) == POINTER_TYPE
2213 && TREE_TYPE (TREE_TYPE (tmp)) != node))
2214 {
2215 print_declaration (buffer, tmp, spc+2, flags);
2216 pp_newline (buffer);
2217 }
2218 tmp = TREE_CHAIN (tmp);
2219 }
2220 }
2221 INDENT (spc);
2222 pp_character (buffer, '}');
2223 }
2224
2225 /* Return the priority of the operator CODE.
2226
2227 From lowest to highest precedence with either left-to-right (L-R)
2228 or right-to-left (R-L) associativity]:
2229
2230 1 [L-R] ,
2231 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
2232 3 [R-L] ?:
2233 4 [L-R] ||
2234 5 [L-R] &&
2235 6 [L-R] |
2236 7 [L-R] ^
2237 8 [L-R] &
2238 9 [L-R] == !=
2239 10 [L-R] < <= > >=
2240 11 [L-R] << >>
2241 12 [L-R] + -
2242 13 [L-R] * / %
2243 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
2244 15 [L-R] fn() [] -> .
2245
2246 unary +, - and * have higher precedence than the corresponding binary
2247 operators. */
2248
2249 int
2250 op_code_prio (enum tree_code code)
2251 {
2252 switch (code)
2253 {
2254 case TREE_LIST:
2255 case COMPOUND_EXPR:
2256 case BIND_EXPR:
2257 return 1;
2258
2259 case MODIFY_EXPR:
2260 case INIT_EXPR:
2261 return 2;
2262
2263 case COND_EXPR:
2264 return 3;
2265
2266 case TRUTH_OR_EXPR:
2267 case TRUTH_ORIF_EXPR:
2268 return 4;
2269
2270 case TRUTH_AND_EXPR:
2271 case TRUTH_ANDIF_EXPR:
2272 return 5;
2273
2274 case BIT_IOR_EXPR:
2275 return 6;
2276
2277 case BIT_XOR_EXPR:
2278 case TRUTH_XOR_EXPR:
2279 return 7;
2280
2281 case BIT_AND_EXPR:
2282 return 8;
2283
2284 case EQ_EXPR:
2285 case NE_EXPR:
2286 return 9;
2287
2288 case UNLT_EXPR:
2289 case UNLE_EXPR:
2290 case UNGT_EXPR:
2291 case UNGE_EXPR:
2292 case UNEQ_EXPR:
2293 case LTGT_EXPR:
2294 case ORDERED_EXPR:
2295 case UNORDERED_EXPR:
2296 case LT_EXPR:
2297 case LE_EXPR:
2298 case GT_EXPR:
2299 case GE_EXPR:
2300 return 10;
2301
2302 case LSHIFT_EXPR:
2303 case RSHIFT_EXPR:
2304 case LROTATE_EXPR:
2305 case RROTATE_EXPR:
2306 return 11;
2307
2308 case WIDEN_SUM_EXPR:
2309 case PLUS_EXPR:
2310 case POINTER_PLUS_EXPR:
2311 case MINUS_EXPR:
2312 return 12;
2313
2314 case VEC_WIDEN_MULT_HI_EXPR:
2315 case VEC_WIDEN_MULT_LO_EXPR:
2316 case WIDEN_MULT_EXPR:
2317 case DOT_PROD_EXPR:
2318 case MULT_EXPR:
2319 case TRUNC_DIV_EXPR:
2320 case CEIL_DIV_EXPR:
2321 case FLOOR_DIV_EXPR:
2322 case ROUND_DIV_EXPR:
2323 case RDIV_EXPR:
2324 case EXACT_DIV_EXPR:
2325 case TRUNC_MOD_EXPR:
2326 case CEIL_MOD_EXPR:
2327 case FLOOR_MOD_EXPR:
2328 case ROUND_MOD_EXPR:
2329 return 13;
2330
2331 case TRUTH_NOT_EXPR:
2332 case BIT_NOT_EXPR:
2333 case POSTINCREMENT_EXPR:
2334 case POSTDECREMENT_EXPR:
2335 case PREINCREMENT_EXPR:
2336 case PREDECREMENT_EXPR:
2337 case NEGATE_EXPR:
2338 case ALIGN_INDIRECT_REF:
2339 case MISALIGNED_INDIRECT_REF:
2340 case INDIRECT_REF:
2341 case ADDR_EXPR:
2342 case FLOAT_EXPR:
2343 CASE_CONVERT:
2344 case FIX_TRUNC_EXPR:
2345 case TARGET_EXPR:
2346 return 14;
2347
2348 case CALL_EXPR:
2349 case ARRAY_REF:
2350 case ARRAY_RANGE_REF:
2351 case COMPONENT_REF:
2352 return 15;
2353
2354 /* Special expressions. */
2355 case MIN_EXPR:
2356 case MAX_EXPR:
2357 case ABS_EXPR:
2358 case REALPART_EXPR:
2359 case IMAGPART_EXPR:
2360 case REDUC_MAX_EXPR:
2361 case REDUC_MIN_EXPR:
2362 case REDUC_PLUS_EXPR:
2363 case VEC_LSHIFT_EXPR:
2364 case VEC_RSHIFT_EXPR:
2365 case VEC_UNPACK_HI_EXPR:
2366 case VEC_UNPACK_LO_EXPR:
2367 case VEC_UNPACK_FLOAT_HI_EXPR:
2368 case VEC_UNPACK_FLOAT_LO_EXPR:
2369 case VEC_PACK_TRUNC_EXPR:
2370 case VEC_PACK_SAT_EXPR:
2371 return 16;
2372
2373 default:
2374 /* Return an arbitrarily high precedence to avoid surrounding single
2375 VAR_DECLs in ()s. */
2376 return 9999;
2377 }
2378 }
2379
2380 /* Return the priority of the operator OP. */
2381
2382 int
2383 op_prio (const_tree op)
2384 {
2385 enum tree_code code;
2386
2387 if (op == NULL)
2388 return 9999;
2389
2390 code = TREE_CODE (op);
2391 if (code == SAVE_EXPR || code == NON_LVALUE_EXPR)
2392 return op_prio (TREE_OPERAND (op, 0));
2393
2394 return op_code_prio (code);
2395 }
2396
2397 /* Return the symbol associated with operator CODE. */
2398
2399 const char *
2400 op_symbol_code (enum tree_code code)
2401 {
2402 switch (code)
2403 {
2404 case MODIFY_EXPR:
2405 return "=";
2406
2407 case TRUTH_OR_EXPR:
2408 case TRUTH_ORIF_EXPR:
2409 return "||";
2410
2411 case TRUTH_AND_EXPR:
2412 case TRUTH_ANDIF_EXPR:
2413 return "&&";
2414
2415 case BIT_IOR_EXPR:
2416 return "|";
2417
2418 case TRUTH_XOR_EXPR:
2419 case BIT_XOR_EXPR:
2420 return "^";
2421
2422 case ADDR_EXPR:
2423 case BIT_AND_EXPR:
2424 return "&";
2425
2426 case ORDERED_EXPR:
2427 return "ord";
2428 case UNORDERED_EXPR:
2429 return "unord";
2430
2431 case EQ_EXPR:
2432 return "==";
2433 case UNEQ_EXPR:
2434 return "u==";
2435
2436 case NE_EXPR:
2437 return "!=";
2438
2439 case LT_EXPR:
2440 return "<";
2441 case UNLT_EXPR:
2442 return "u<";
2443
2444 case LE_EXPR:
2445 return "<=";
2446 case UNLE_EXPR:
2447 return "u<=";
2448
2449 case GT_EXPR:
2450 return ">";
2451 case UNGT_EXPR:
2452 return "u>";
2453
2454 case GE_EXPR:
2455 return ">=";
2456 case UNGE_EXPR:
2457 return "u>=";
2458
2459 case LTGT_EXPR:
2460 return "<>";
2461
2462 case LSHIFT_EXPR:
2463 return "<<";
2464
2465 case RSHIFT_EXPR:
2466 return ">>";
2467
2468 case LROTATE_EXPR:
2469 return "r<<";
2470
2471 case RROTATE_EXPR:
2472 return "r>>";
2473
2474 case VEC_LSHIFT_EXPR:
2475 return "v<<";
2476
2477 case VEC_RSHIFT_EXPR:
2478 return "v>>";
2479
2480 case POINTER_PLUS_EXPR:
2481 return "+";
2482
2483 case PLUS_EXPR:
2484 return "+";
2485
2486 case REDUC_PLUS_EXPR:
2487 return "r+";
2488
2489 case WIDEN_SUM_EXPR:
2490 return "w+";
2491
2492 case WIDEN_MULT_EXPR:
2493 return "w*";
2494
2495 case NEGATE_EXPR:
2496 case MINUS_EXPR:
2497 return "-";
2498
2499 case BIT_NOT_EXPR:
2500 return "~";
2501
2502 case TRUTH_NOT_EXPR:
2503 return "!";
2504
2505 case MULT_EXPR:
2506 case INDIRECT_REF:
2507 return "*";
2508
2509 case ALIGN_INDIRECT_REF:
2510 return "A*";
2511
2512 case MISALIGNED_INDIRECT_REF:
2513 return "M*";
2514
2515 case TRUNC_DIV_EXPR:
2516 case RDIV_EXPR:
2517 return "/";
2518
2519 case CEIL_DIV_EXPR:
2520 return "/[cl]";
2521
2522 case FLOOR_DIV_EXPR:
2523 return "/[fl]";
2524
2525 case ROUND_DIV_EXPR:
2526 return "/[rd]";
2527
2528 case EXACT_DIV_EXPR:
2529 return "/[ex]";
2530
2531 case TRUNC_MOD_EXPR:
2532 return "%";
2533
2534 case CEIL_MOD_EXPR:
2535 return "%[cl]";
2536
2537 case FLOOR_MOD_EXPR:
2538 return "%[fl]";
2539
2540 case ROUND_MOD_EXPR:
2541 return "%[rd]";
2542
2543 case PREDECREMENT_EXPR:
2544 return " --";
2545
2546 case PREINCREMENT_EXPR:
2547 return " ++";
2548
2549 case POSTDECREMENT_EXPR:
2550 return "-- ";
2551
2552 case POSTINCREMENT_EXPR:
2553 return "++ ";
2554
2555 case MAX_EXPR:
2556 return "max";
2557
2558 case MIN_EXPR:
2559 return "min";
2560
2561 default:
2562 return "<<< ??? >>>";
2563 }
2564 }
2565
2566 /* Return the symbol associated with operator OP. */
2567
2568 static const char *
2569 op_symbol (const_tree op)
2570 {
2571 return op_symbol_code (TREE_CODE (op));
2572 }
2573
2574 /* Prints the name of a CALL_EXPR. */
2575
2576 static void
2577 print_call_name (pretty_printer *buffer, const_tree node)
2578 {
2579 tree op0;
2580
2581 gcc_assert (TREE_CODE (node) == CALL_EXPR);
2582
2583 op0 = CALL_EXPR_FN (node);
2584
2585 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
2586 op0 = TREE_OPERAND (op0, 0);
2587
2588 switch (TREE_CODE (op0))
2589 {
2590 case VAR_DECL:
2591 case PARM_DECL:
2592 dump_function_name (buffer, op0);
2593 break;
2594
2595 case ADDR_EXPR:
2596 case INDIRECT_REF:
2597 case NOP_EXPR:
2598 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2599 break;
2600
2601 case COND_EXPR:
2602 pp_string (buffer, "(");
2603 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2604 pp_string (buffer, ") ? ");
2605 dump_generic_node (buffer, TREE_OPERAND (op0, 1), 0, 0, false);
2606 pp_string (buffer, " : ");
2607 dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, 0, false);
2608 break;
2609
2610 case COMPONENT_REF:
2611 /* The function is a pointer contained in a structure. */
2612 if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
2613 TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2614 dump_function_name (buffer, TREE_OPERAND (op0, 1));
2615 else
2616 dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, 0, false);
2617 /* else
2618 We can have several levels of structures and a function
2619 pointer inside. This is not implemented yet... */
2620 /* NIY;*/
2621 break;
2622
2623 case ARRAY_REF:
2624 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
2625 dump_function_name (buffer, TREE_OPERAND (op0, 0));
2626 else
2627 dump_generic_node (buffer, op0, 0, 0, false);
2628 break;
2629
2630 case SSA_NAME:
2631 case OBJ_TYPE_REF:
2632 dump_generic_node (buffer, op0, 0, 0, false);
2633 break;
2634
2635 default:
2636 NIY;
2637 }
2638 }
2639
2640 /* Parses the string STR and replaces new-lines by '\n', tabs by '\t', ... */
2641
2642 static void
2643 pretty_print_string (pretty_printer *buffer, const char *str)
2644 {
2645 if (str == NULL)
2646 return;
2647
2648 while (*str)
2649 {
2650 switch (str[0])
2651 {
2652 case '\b':
2653 pp_string (buffer, "\\b");
2654 break;
2655
2656 case '\f':
2657 pp_string (buffer, "\\f");
2658 break;
2659
2660 case '\n':
2661 pp_string (buffer, "\\n");
2662 break;
2663
2664 case '\r':
2665 pp_string (buffer, "\\r");
2666 break;
2667
2668 case '\t':
2669 pp_string (buffer, "\\t");
2670 break;
2671
2672 case '\v':
2673 pp_string (buffer, "\\v");
2674 break;
2675
2676 case '\\':
2677 pp_string (buffer, "\\\\");
2678 break;
2679
2680 case '\"':
2681 pp_string (buffer, "\\\"");
2682 break;
2683
2684 case '\'':
2685 pp_string (buffer, "\\'");
2686 break;
2687
2688 /* No need to handle \0; the loop terminates on \0. */
2689
2690 case '\1':
2691 pp_string (buffer, "\\1");
2692 break;
2693
2694 case '\2':
2695 pp_string (buffer, "\\2");
2696 break;
2697
2698 case '\3':
2699 pp_string (buffer, "\\3");
2700 break;
2701
2702 case '\4':
2703 pp_string (buffer, "\\4");
2704 break;
2705
2706 case '\5':
2707 pp_string (buffer, "\\5");
2708 break;
2709
2710 case '\6':
2711 pp_string (buffer, "\\6");
2712 break;
2713
2714 case '\7':
2715 pp_string (buffer, "\\7");
2716 break;
2717
2718 default:
2719 pp_character (buffer, str[0]);
2720 break;
2721 }
2722 str++;
2723 }
2724 }
2725
2726 static void
2727 maybe_init_pretty_print (FILE *file)
2728 {
2729 if (!initialized)
2730 {
2731 pp_construct (&buffer, /* prefix */NULL, /* line-width */0);
2732 pp_needs_newline (&buffer) = true;
2733 initialized = 1;
2734 }
2735
2736 buffer.buffer->stream = file;
2737 }
2738
2739 static void
2740 newline_and_indent (pretty_printer *buffer, int spc)
2741 {
2742 pp_newline (buffer);
2743 INDENT (spc);
2744 }