OSDN Git Service

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