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