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