1 /* Pretty formatting of GENERIC trees in C syntax.
2    Copyright (C) 2001-2022 Free Software Foundation, Inc.
3    Adapted from c-pretty-print.cc 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 "backend.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "predict.h"
28 #include "cgraph.h"
29 #include "tree-pretty-print.h"
30 #include "stor-layout.h"
31 #include "langhooks.h"
32 #include "tree-iterator.h"
33 #include "dumpfile.h"
34 #include "internal-fn.h"
35 #include "gomp-constants.h"
36 #include "gimple.h"
37 #include "fold-const.h"
38 
39 /* Routines in this file get invoked via the default tree printer
40    used by diagnostics and thus they are called from pp_printf which
41    isn't reentrant.  Avoid using pp_printf in this file.  */
42 #pragma GCC poison pp_printf
43 
44 /* Disable warnings about quoting issues in the pp_xxx calls below
45    that (intentionally) don't follow GCC diagnostic conventions.  */
46 #if __GNUC__ >= 10
47 #  pragma GCC diagnostic push
48 #  pragma GCC diagnostic ignored "-Wformat-diag"
49 #endif
50 
51 /* Local functions, macros and variables.  */
52 static const char *op_symbol (const_tree);
53 static void newline_and_indent (pretty_printer *, int);
54 static void maybe_init_pretty_print (FILE *);
55 static void print_struct_decl (pretty_printer *, const_tree, int, dump_flags_t);
56 static void do_niy (pretty_printer *, const_tree, int, dump_flags_t);
57 
58 #define INDENT(SPACE) do { \
59   int i; for (i = 0; i<SPACE; i++) pp_space (pp); } while (0)
60 
61 #define NIY do_niy (pp, node, spc, flags)
62 
63 static pretty_printer *tree_pp;
64 
65 /* Try to print something for an unknown tree code.  */
66 
67 static void
do_niy(pretty_printer * pp,const_tree node,int spc,dump_flags_t flags)68 do_niy (pretty_printer *pp, const_tree node, int spc, dump_flags_t flags)
69 {
70   int i, len;
71 
72   pp_string (pp, "<<< Unknown tree: ");
73   pp_string (pp, get_tree_code_name (TREE_CODE (node)));
74 
75   if (EXPR_P (node))
76     {
77       len = TREE_OPERAND_LENGTH (node);
78       for (i = 0; i < len; ++i)
79           {
80             newline_and_indent (pp, spc+2);
81             dump_generic_node (pp, TREE_OPERAND (node, i), spc+2, flags, false);
82           }
83     }
84 
85   pp_string (pp, " >>>");
86 }
87 
88 /* Debugging function to print out a generic expression.  */
89 
90 DEBUG_FUNCTION void
debug_generic_expr(tree t)91 debug_generic_expr (tree t)
92 {
93   print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS);
94   fprintf (stderr, "\n");
95 }
96 
97 /* Debugging function to print out a generic statement.  */
98 
99 DEBUG_FUNCTION void
debug_generic_stmt(tree t)100 debug_generic_stmt (tree t)
101 {
102   print_generic_stmt (stderr, t, TDF_VOPS|TDF_MEMSYMS);
103   fprintf (stderr, "\n");
104 }
105 
106 /* Debugging function to print out a chain of trees .  */
107 
108 DEBUG_FUNCTION void
debug_tree_chain(tree t)109 debug_tree_chain (tree t)
110 {
111   hash_set<tree> seen;
112 
113   while (t)
114     {
115       print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
116       fprintf (stderr, " ");
117       t = TREE_CHAIN (t);
118       if (seen.add (t))
119           {
120             fprintf (stderr, "... [cycled back to ");
121             print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
122             fprintf (stderr, "]");
123             break;
124           }
125     }
126   fprintf (stderr, "\n");
127 }
128 
129 /* Prints declaration DECL to the FILE with details specified by FLAGS.  */
130 void
print_generic_decl(FILE * file,tree decl,dump_flags_t flags)131 print_generic_decl (FILE *file, tree decl, dump_flags_t flags)
132 {
133   maybe_init_pretty_print (file);
134   print_declaration (tree_pp, decl, 2, flags);
135   pp_write_text_to_stream (tree_pp);
136 }
137 
138 /* Print tree T, and its successors, on file FILE.  FLAGS specifies details
139    to show in the dump.  See TDF_* in dumpfile.h.  */
140 
141 void
print_generic_stmt(FILE * file,tree t,dump_flags_t flags)142 print_generic_stmt (FILE *file, tree t, dump_flags_t flags)
143 {
144   maybe_init_pretty_print (file);
145   dump_generic_node (tree_pp, t, 0, flags, true);
146   pp_newline_and_flush (tree_pp);
147 }
148 
149 /* Print tree T, and its successors, on file FILE.  FLAGS specifies details
150    to show in the dump.  See TDF_* in dumpfile.h.  The output is indented by
151    INDENT spaces.  */
152 
153 void
print_generic_stmt_indented(FILE * file,tree t,dump_flags_t flags,int indent)154 print_generic_stmt_indented (FILE *file, tree t, dump_flags_t flags, int indent)
155 {
156   int i;
157 
158   maybe_init_pretty_print (file);
159 
160   for (i = 0; i < indent; i++)
161     pp_space (tree_pp);
162   dump_generic_node (tree_pp, t, indent, flags, true);
163   pp_newline_and_flush (tree_pp);
164 }
165 
166 /* Print a single expression T on file FILE.  FLAGS specifies details to show
167    in the dump.  See TDF_* in dumpfile.h.  */
168 
169 void
print_generic_expr(FILE * file,tree t,dump_flags_t flags)170 print_generic_expr (FILE *file, tree t, dump_flags_t flags)
171 {
172   maybe_init_pretty_print (file);
173   dump_generic_node (tree_pp, t, 0, flags, false);
174   pp_flush (tree_pp);
175 }
176 
177 /* Print a single expression T to string, and return it.  The caller
178    must free the returned memory.  */
179 
180 char *
print_generic_expr_to_str(tree t)181 print_generic_expr_to_str (tree t)
182 {
183   pretty_printer pp;
184   dump_generic_node (&pp, t, 0, TDF_VOPS|TDF_MEMSYMS, false);
185   return xstrdup (pp_formatted_text (&pp));
186 }
187 
188 /* Dump NAME, an IDENTIFIER_POINTER, sanitized so that D<num> sequences
189    in it are replaced with Dxxxx, as long as they are at the start or
190    preceded by $ and at the end or followed by $.  See make_fancy_name
191    in tree-sra.cc.  */
192 
193 static void
dump_fancy_name(pretty_printer * pp,tree name)194 dump_fancy_name (pretty_printer *pp, tree name)
195 {
196   int cnt = 0;
197   int length = IDENTIFIER_LENGTH (name);
198   const char *n = IDENTIFIER_POINTER (name);
199   do
200     {
201       n = strchr (n, 'D');
202       if (n == NULL)
203           break;
204       if (ISDIGIT (n[1])
205             && (n == IDENTIFIER_POINTER (name) || n[-1] == '$'))
206           {
207             int l = 2;
208             while (ISDIGIT (n[l]))
209               l++;
210             if (n[l] == '\0' || n[l] == '$')
211               {
212                 cnt++;
213                 length += 5 - l;
214               }
215             n += l;
216           }
217       else
218           n++;
219     }
220   while (1);
221   if (cnt == 0)
222     {
223       pp_tree_identifier (pp, name);
224       return;
225     }
226 
227   char *str = XNEWVEC (char, length + 1);
228   char *p = str;
229   const char *q;
230   q = n = IDENTIFIER_POINTER (name);
231   do
232     {
233       q = strchr (q, 'D');
234       if (q == NULL)
235           break;
236       if (ISDIGIT (q[1])
237             && (q == IDENTIFIER_POINTER (name) || q[-1] == '$'))
238           {
239             int l = 2;
240             while (ISDIGIT (q[l]))
241               l++;
242             if (q[l] == '\0' || q[l] == '$')
243               {
244                 memcpy (p, n, q - n);
245                 memcpy (p + (q - n), "Dxxxx", 5);
246                 p += (q - n) + 5;
247                 n = q + l;
248               }
249             q += l;
250           }
251       else
252           q++;
253     }
254   while (1);
255   memcpy (p, n, IDENTIFIER_LENGTH (name) - (n - IDENTIFIER_POINTER (name)));
256   str[length] = '\0';
257   if (pp_translate_identifiers (pp))
258     {
259       const char *text = identifier_to_locale (str);
260       pp_append_text (pp, text, text + strlen (text));
261     }
262   else
263     pp_append_text (pp, str, str + length);
264   XDELETEVEC (str);
265 }
266 
267 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
268    in FLAGS.  */
269 
270 static void
dump_decl_name(pretty_printer * pp,tree node,dump_flags_t flags)271 dump_decl_name (pretty_printer *pp, tree node, dump_flags_t flags)
272 {
273   tree name = DECL_NAME (node);
274   if (name)
275     {
276       if ((flags & TDF_ASMNAME)
277             && HAS_DECL_ASSEMBLER_NAME_P (node)
278             && DECL_ASSEMBLER_NAME_SET_P (node))
279           pp_tree_identifier (pp, DECL_ASSEMBLER_NAME_RAW (node));
280       /* For -fcompare-debug don't dump DECL_NAMELESS names at all,
281            -g might have created more fancy names and their indexes
282            could get out of sync.  Usually those should be DECL_IGNORED_P
283            too, SRA can create even non-DECL_IGNORED_P DECL_NAMELESS fancy
284            names, let's hope those never get out of sync after doing the
285            dump_fancy_name sanitization.  */
286       else if ((flags & TDF_COMPARE_DEBUG)
287                  && DECL_NAMELESS (node)
288                  && DECL_IGNORED_P (node))
289           name = NULL_TREE;
290       /* For DECL_NAMELESS names look for embedded uids in the
291            names and sanitize them for TDF_NOUID.  */
292       else if ((flags & TDF_NOUID) && DECL_NAMELESS (node))
293           dump_fancy_name (pp, name);
294       else
295           pp_tree_identifier (pp, name);
296     }
297   char uid_sep = (flags & TDF_GIMPLE) ? '_' : '.';
298   if ((flags & TDF_UID) || name == NULL_TREE)
299     {
300       if (TREE_CODE (node) == LABEL_DECL && LABEL_DECL_UID (node) != -1)
301           {
302             pp_character (pp, 'L');
303             pp_character (pp, uid_sep);
304             pp_decimal_int (pp, (int) LABEL_DECL_UID (node));
305           }
306       else if (TREE_CODE (node) == DEBUG_EXPR_DECL)
307           {
308             if (flags & TDF_NOUID)
309               pp_string (pp, "D#xxxx");
310             else
311               {
312                 pp_string (pp, "D#");
313                 pp_decimal_int (pp, (int) DEBUG_TEMP_UID (node));
314               }
315           }
316       else
317           {
318             char c = TREE_CODE (node) == CONST_DECL ? 'C' : 'D';
319             pp_character (pp, c);
320             pp_character (pp, uid_sep);
321             if (flags & TDF_NOUID)
322               pp_string (pp, "xxxx");
323             else
324               pp_scalar (pp, "%u", DECL_UID (node));
325           }
326     }
327   if ((flags & TDF_ALIAS) && DECL_PT_UID (node) != DECL_UID (node))
328     {
329       if (flags & TDF_NOUID)
330           pp_string (pp, "ptD.xxxx");
331       else
332           {
333             pp_string (pp, "ptD.");
334             pp_scalar (pp, "%u", DECL_PT_UID (node));
335           }
336     }
337 }
338 
339 /* Like the above, but used for pretty printing function calls.  */
340 
341 static void
dump_function_name(pretty_printer * pp,tree node,dump_flags_t flags)342 dump_function_name (pretty_printer *pp, tree node, dump_flags_t flags)
343 {
344   if (CONVERT_EXPR_P (node))
345     node = TREE_OPERAND (node, 0);
346   if (DECL_NAME (node) && (flags & TDF_ASMNAME) == 0)
347     {
348       pp_string (pp, lang_hooks.decl_printable_name (node, 1));
349       if (flags & TDF_UID)
350           {
351             char uid_sep = (flags & TDF_GIMPLE) ? '_' : '.';
352             pp_character (pp, 'D');
353             pp_character (pp, uid_sep);
354             pp_scalar (pp, "%u", DECL_UID (node));
355           }
356     }
357   else
358     dump_decl_name (pp, node, flags);
359 }
360 
361 /* Dump a function declaration.  NODE is the FUNCTION_TYPE.  PP, SPC and
362    FLAGS are as in dump_generic_node.  */
363 
364 static void
dump_function_declaration(pretty_printer * pp,tree node,int spc,dump_flags_t flags)365 dump_function_declaration (pretty_printer *pp, tree node,
366                                  int spc, dump_flags_t flags)
367 {
368   bool wrote_arg = false;
369   tree arg;
370 
371   pp_space (pp);
372   pp_left_paren (pp);
373 
374   /* Print the argument types.  */
375   arg = TYPE_ARG_TYPES (node);
376   while (arg && arg != void_list_node && arg != error_mark_node)
377     {
378       if (wrote_arg)
379           {
380             pp_comma (pp);
381             pp_space (pp);
382           }
383       wrote_arg = true;
384       dump_generic_node (pp, TREE_VALUE (arg), spc, flags, false);
385       arg = TREE_CHAIN (arg);
386     }
387 
388   /* Drop the trailing void_type_node if we had any previous argument.  */
389   if (arg == void_list_node && !wrote_arg)
390     pp_string (pp, "void");
391   /* Properly dump vararg function types.  */
392   else if (!arg && wrote_arg)
393     pp_string (pp, ", ...");
394   /* Avoid printing any arg for unprototyped functions.  */
395 
396   pp_right_paren (pp);
397 }
398 
399 /* Dump the domain associated with an array.  */
400 
401 static void
dump_array_domain(pretty_printer * pp,tree domain,int spc,dump_flags_t flags)402 dump_array_domain (pretty_printer *pp, tree domain, int spc, dump_flags_t flags)
403 {
404   pp_left_bracket (pp);
405   if (domain)
406     {
407       tree min = TYPE_MIN_VALUE (domain);
408       tree max = TYPE_MAX_VALUE (domain);
409 
410       if (min && max
411             && integer_zerop (min)
412             && tree_fits_shwi_p (max))
413           pp_wide_integer (pp, tree_to_shwi (max) + 1);
414       else
415           {
416             if (min)
417               dump_generic_node (pp, min, spc, flags, false);
418             pp_colon (pp);
419             if (max)
420               dump_generic_node (pp, max, spc, flags, false);
421           }
422     }
423   else
424     pp_string (pp, "<unknown>");
425   pp_right_bracket (pp);
426 }
427 
428 
429 /* Dump OpenMP iterators ITER.  */
430 
431 static void
dump_omp_iterators(pretty_printer * pp,tree iter,int spc,dump_flags_t flags)432 dump_omp_iterators (pretty_printer *pp, tree iter, int spc, dump_flags_t flags)
433 {
434   pp_string (pp, "iterator(");
435   for (tree it = iter; it; it = TREE_CHAIN (it))
436     {
437       if (it != iter)
438           pp_string (pp, ", ");
439       dump_generic_node (pp, TREE_TYPE (TREE_VEC_ELT (it, 0)), spc, flags,
440                                false);
441       pp_space (pp);
442       dump_generic_node (pp, TREE_VEC_ELT (it, 0), spc, flags, false);
443       pp_equal (pp);
444       dump_generic_node (pp, TREE_VEC_ELT (it, 1), spc, flags, false);
445       pp_colon (pp);
446       dump_generic_node (pp, TREE_VEC_ELT (it, 2), spc, flags, false);
447       pp_colon (pp);
448       dump_generic_node (pp, TREE_VEC_ELT (it, 3), spc, flags, false);
449     }
450   pp_right_paren (pp);
451 }
452 
453 
454 /* Dump OMP clause CLAUSE, without following OMP_CLAUSE_CHAIN.
455 
456    PP, CLAUSE, SPC and FLAGS are as in dump_generic_node.  */
457 
458 static void
dump_omp_clause(pretty_printer * pp,tree clause,int spc,dump_flags_t flags)459 dump_omp_clause (pretty_printer *pp, tree clause, int spc, dump_flags_t flags)
460 {
461   const char *name;
462   const char *modifier = NULL;
463   switch (OMP_CLAUSE_CODE (clause))
464     {
465     case OMP_CLAUSE_PRIVATE:
466       name = "private";
467       goto print_remap;
468     case OMP_CLAUSE_SHARED:
469       name = "shared";
470       goto print_remap;
471     case OMP_CLAUSE_FIRSTPRIVATE:
472       name = "firstprivate";
473       goto print_remap;
474     case OMP_CLAUSE_LASTPRIVATE:
475       name = "lastprivate";
476       if (OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (clause))
477           modifier = "conditional:";
478       goto print_remap;
479     case OMP_CLAUSE_COPYIN:
480       name = "copyin";
481       goto print_remap;
482     case OMP_CLAUSE_COPYPRIVATE:
483       name = "copyprivate";
484       goto print_remap;
485     case OMP_CLAUSE_UNIFORM:
486       name = "uniform";
487       goto print_remap;
488     case OMP_CLAUSE_USE_DEVICE_PTR:
489       name = "use_device_ptr";
490       if (OMP_CLAUSE_USE_DEVICE_PTR_IF_PRESENT (clause))
491           modifier = "if_present:";
492       goto print_remap;
493     case OMP_CLAUSE_USE_DEVICE_ADDR:
494       name = "use_device_addr";
495       goto print_remap;
496     case OMP_CLAUSE_HAS_DEVICE_ADDR:
497       name = "has_device_addr";
498       goto print_remap;
499     case OMP_CLAUSE_IS_DEVICE_PTR:
500       name = "is_device_ptr";
501       goto print_remap;
502     case OMP_CLAUSE_INCLUSIVE:
503       name = "inclusive";
504       goto print_remap;
505     case OMP_CLAUSE_EXCLUSIVE:
506       name = "exclusive";
507       goto print_remap;
508     case OMP_CLAUSE__LOOPTEMP_:
509       name = "_looptemp_";
510       goto print_remap;
511     case OMP_CLAUSE__REDUCTEMP_:
512       name = "_reductemp_";
513       goto print_remap;
514     case OMP_CLAUSE__CONDTEMP_:
515       name = "_condtemp_";
516       goto print_remap;
517     case OMP_CLAUSE__SCANTEMP_:
518       name = "_scantemp_";
519       goto print_remap;
520     case OMP_CLAUSE_TO_DECLARE:
521       name = "to";
522       goto print_remap;
523     case OMP_CLAUSE_LINK:
524       name = "link";
525       goto print_remap;
526     case OMP_CLAUSE_NONTEMPORAL:
527       name = "nontemporal";
528       goto print_remap;
529   print_remap:
530       pp_string (pp, name);
531       pp_left_paren (pp);
532       if (modifier)
533           pp_string (pp, modifier);
534       dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
535                                spc, flags, false);
536       pp_right_paren (pp);
537       break;
538 
539     case OMP_CLAUSE_TASK_REDUCTION:
540     case OMP_CLAUSE_IN_REDUCTION:
541       pp_string (pp, OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_IN_REDUCTION
542                          ? "in_" : "task_");
543       /* FALLTHRU */
544     case OMP_CLAUSE_REDUCTION:
545       pp_string (pp, "reduction(");
546       if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_REDUCTION)
547           {
548             if (OMP_CLAUSE_REDUCTION_TASK (clause))
549               pp_string (pp, "task,");
550             else if (OMP_CLAUSE_REDUCTION_INSCAN (clause))
551               pp_string (pp, "inscan,");
552           }
553       if (OMP_CLAUSE_REDUCTION_CODE (clause) != ERROR_MARK)
554           {
555             pp_string (pp,
556                          op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause)));
557             pp_colon (pp);
558           }
559       dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
560                                spc, flags, false);
561       pp_right_paren (pp);
562       break;
563 
564     case OMP_CLAUSE_IF:
565       pp_string (pp, "if(");
566       switch (OMP_CLAUSE_IF_MODIFIER (clause))
567           {
568           case ERROR_MARK: break;
569           case VOID_CST: pp_string (pp, "cancel:"); break;
570           case OMP_PARALLEL: pp_string (pp, "parallel:"); break;
571           case OMP_SIMD: pp_string (pp, "simd:"); break;
572           case OMP_TASK: pp_string (pp, "task:"); break;
573           case OMP_TASKLOOP: pp_string (pp, "taskloop:"); break;
574           case OMP_TARGET_DATA: pp_string (pp, "target data:"); break;
575           case OMP_TARGET: pp_string (pp, "target:"); break;
576           case OMP_TARGET_UPDATE: pp_string (pp, "target update:"); break;
577           case OMP_TARGET_ENTER_DATA:
578             pp_string (pp, "target enter data:"); break;
579           case OMP_TARGET_EXIT_DATA: pp_string (pp, "target exit data:"); break;
580           default: gcc_unreachable ();
581           }
582       dump_generic_node (pp, OMP_CLAUSE_IF_EXPR (clause),
583                                spc, flags, false);
584       pp_right_paren (pp);
585       break;
586 
587     case OMP_CLAUSE_NUM_THREADS:
588       pp_string (pp, "num_threads(");
589       dump_generic_node (pp, OMP_CLAUSE_NUM_THREADS_EXPR (clause),
590                                spc, flags, false);
591       pp_right_paren (pp);
592       break;
593 
594     case OMP_CLAUSE_NOWAIT:
595       pp_string (pp, "nowait");
596       break;
597     case OMP_CLAUSE_ORDERED:
598       pp_string (pp, "ordered");
599       if (OMP_CLAUSE_ORDERED_EXPR (clause))
600           {
601             pp_left_paren (pp);
602             dump_generic_node (pp, OMP_CLAUSE_ORDERED_EXPR (clause),
603                                    spc, flags, false);
604             pp_right_paren (pp);
605           }
606       break;
607 
608     case OMP_CLAUSE_DEFAULT:
609       pp_string (pp, "default(");
610       switch (OMP_CLAUSE_DEFAULT_KIND (clause))
611           {
612           case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
613             break;
614           case OMP_CLAUSE_DEFAULT_SHARED:
615             pp_string (pp, "shared");
616             break;
617           case OMP_CLAUSE_DEFAULT_NONE:
618             pp_string (pp, "none");
619             break;
620           case OMP_CLAUSE_DEFAULT_PRIVATE:
621             pp_string (pp, "private");
622             break;
623           case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
624             pp_string (pp, "firstprivate");
625             break;
626           case OMP_CLAUSE_DEFAULT_PRESENT:
627             pp_string (pp, "present");
628             break;
629           default:
630             gcc_unreachable ();
631           }
632       pp_right_paren (pp);
633       break;
634 
635     case OMP_CLAUSE_SCHEDULE:
636       pp_string (pp, "schedule(");
637       if (OMP_CLAUSE_SCHEDULE_KIND (clause)
638             & (OMP_CLAUSE_SCHEDULE_MONOTONIC
639                | OMP_CLAUSE_SCHEDULE_NONMONOTONIC))
640           {
641             if (OMP_CLAUSE_SCHEDULE_KIND (clause)
642                 & OMP_CLAUSE_SCHEDULE_MONOTONIC)
643               pp_string (pp, "monotonic");
644             else
645               pp_string (pp, "nonmonotonic");
646             if (OMP_CLAUSE_SCHEDULE_SIMD (clause))
647               pp_comma (pp);
648             else
649               pp_colon (pp);
650           }
651       if (OMP_CLAUSE_SCHEDULE_SIMD (clause))
652           pp_string (pp, "simd:");
653 
654       switch (OMP_CLAUSE_SCHEDULE_KIND (clause) & OMP_CLAUSE_SCHEDULE_MASK)
655           {
656           case OMP_CLAUSE_SCHEDULE_STATIC:
657             pp_string (pp, "static");
658             break;
659           case OMP_CLAUSE_SCHEDULE_DYNAMIC:
660             pp_string (pp, "dynamic");
661             break;
662           case OMP_CLAUSE_SCHEDULE_GUIDED:
663             pp_string (pp, "guided");
664             break;
665           case OMP_CLAUSE_SCHEDULE_RUNTIME:
666             pp_string (pp, "runtime");
667             break;
668           case OMP_CLAUSE_SCHEDULE_AUTO:
669             pp_string (pp, "auto");
670             break;
671           default:
672             gcc_unreachable ();
673           }
674       if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
675           {
676             pp_comma (pp);
677             dump_generic_node (pp, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
678                                    spc, flags, false);
679           }
680       pp_right_paren (pp);
681       break;
682 
683     case OMP_CLAUSE_UNTIED:
684       pp_string (pp, "untied");
685       break;
686 
687     case OMP_CLAUSE_COLLAPSE:
688       pp_string (pp, "collapse(");
689       dump_generic_node (pp, OMP_CLAUSE_COLLAPSE_EXPR (clause),
690                                spc, flags, false);
691       pp_right_paren (pp);
692       break;
693 
694     case OMP_CLAUSE_FINAL:
695       pp_string (pp, "final(");
696       dump_generic_node (pp, OMP_CLAUSE_FINAL_EXPR (clause),
697                                spc, flags, false);
698       pp_right_paren (pp);
699       break;
700 
701     case OMP_CLAUSE_MERGEABLE:
702       pp_string (pp, "mergeable");
703       break;
704 
705     case OMP_CLAUSE_LINEAR:
706       pp_string (pp, "linear(");
707       switch (OMP_CLAUSE_LINEAR_KIND (clause))
708           {
709           case OMP_CLAUSE_LINEAR_DEFAULT:
710             break;
711           case OMP_CLAUSE_LINEAR_REF:
712             pp_string (pp, "ref(");
713             break;
714           case OMP_CLAUSE_LINEAR_VAL:
715             pp_string (pp, "val(");
716             break;
717           case OMP_CLAUSE_LINEAR_UVAL:
718             pp_string (pp, "uval(");
719             break;
720           default:
721             gcc_unreachable ();
722           }
723       dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
724                                spc, flags, false);
725       if (OMP_CLAUSE_LINEAR_KIND (clause) != OMP_CLAUSE_LINEAR_DEFAULT)
726           pp_right_paren (pp);
727       pp_colon (pp);
728       dump_generic_node (pp, OMP_CLAUSE_LINEAR_STEP (clause),
729                                spc, flags, false);
730       pp_right_paren (pp);
731       break;
732 
733     case OMP_CLAUSE_ALIGNED:
734       pp_string (pp, "aligned(");
735       dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
736                                spc, flags, false);
737       if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause))
738           {
739             pp_colon (pp);
740             dump_generic_node (pp, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause),
741                                    spc, flags, false);
742           }
743       pp_right_paren (pp);
744       break;
745 
746     case OMP_CLAUSE_ALLOCATE:
747       pp_string (pp, "allocate(");
748       if (OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause))
749           {
750             pp_string (pp, "allocator(");
751             dump_generic_node (pp, OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause),
752                                    spc, flags, false);
753             pp_right_paren (pp);
754           }
755       if (OMP_CLAUSE_ALLOCATE_ALIGN (clause))
756           {
757             if (OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause))
758               pp_comma (pp);
759             pp_string (pp, "align(");
760             dump_generic_node (pp, OMP_CLAUSE_ALLOCATE_ALIGN (clause),
761                                    spc, flags, false);
762             pp_right_paren (pp);
763           }
764       if (OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause)
765             || OMP_CLAUSE_ALLOCATE_ALIGN (clause))
766           pp_colon (pp);
767       dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
768                                spc, flags, false);
769       pp_right_paren (pp);
770       break;
771 
772     case OMP_CLAUSE_AFFINITY:
773       pp_string (pp, "affinity(");
774       {
775           tree t = OMP_CLAUSE_DECL (clause);
776           if (TREE_CODE (t) == TREE_LIST
777               && TREE_PURPOSE (t)
778               && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
779             {
780               dump_omp_iterators (pp, TREE_PURPOSE (t), spc, flags);
781               pp_colon (pp);
782               t = TREE_VALUE (t);
783             }
784           dump_generic_node (pp, t, spc, flags, false);
785       }
786       pp_right_paren (pp);
787       break;
788     case OMP_CLAUSE_DEPEND:
789       pp_string (pp, "depend(");
790       switch (OMP_CLAUSE_DEPEND_KIND (clause))
791           {
792           case OMP_CLAUSE_DEPEND_DEPOBJ:
793             name = "depobj";
794             break;
795           case OMP_CLAUSE_DEPEND_IN:
796             name = "in";
797             break;
798           case OMP_CLAUSE_DEPEND_OUT:
799             name = "out";
800             break;
801           case OMP_CLAUSE_DEPEND_INOUT:
802             name = "inout";
803             break;
804           case OMP_CLAUSE_DEPEND_MUTEXINOUTSET:
805             name = "mutexinoutset";
806             break;
807           case OMP_CLAUSE_DEPEND_SOURCE:
808             pp_string (pp, "source)");
809             return;
810           case OMP_CLAUSE_DEPEND_LAST:
811             name = "__internal__";
812             break;
813           case OMP_CLAUSE_DEPEND_SINK:
814             pp_string (pp, "sink:");
815             for (tree t = OMP_CLAUSE_DECL (clause); t; t = TREE_CHAIN (t))
816               if (TREE_CODE (t) == TREE_LIST)
817                 {
818                     dump_generic_node (pp, TREE_VALUE (t), spc, flags, false);
819                     if (TREE_PURPOSE (t) != integer_zero_node)
820                       {
821                         if (OMP_CLAUSE_DEPEND_SINK_NEGATIVE (t))
822                           pp_minus (pp);
823                         else
824                           pp_plus (pp);
825                         dump_generic_node (pp, TREE_PURPOSE (t), spc, flags,
826                                                false);
827                       }
828                     if (TREE_CHAIN (t))
829                       pp_comma (pp);
830                 }
831               else
832                 gcc_unreachable ();
833             pp_right_paren (pp);
834             return;
835           default:
836             gcc_unreachable ();
837           }
838       {
839           tree t = OMP_CLAUSE_DECL (clause);
840           if (TREE_CODE (t) == TREE_LIST
841               && TREE_PURPOSE (t)
842               && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
843             {
844               dump_omp_iterators (pp, TREE_PURPOSE (t), spc, flags);
845               pp_colon (pp);
846               t = TREE_VALUE (t);
847             }
848           if (name[0])
849             {
850               pp_string (pp, name);
851               pp_colon (pp);
852             }
853           dump_generic_node (pp, t, spc, flags, false);
854           pp_right_paren (pp);
855       }
856       break;
857 
858     case OMP_CLAUSE_MAP:
859       pp_string (pp, "map(");
860       switch (OMP_CLAUSE_MAP_KIND (clause))
861           {
862           case GOMP_MAP_ALLOC:
863           case GOMP_MAP_POINTER:
864           case GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION:
865             pp_string (pp, "alloc");
866             break;
867           case GOMP_MAP_IF_PRESENT:
868             pp_string (pp, "no_alloc");
869             break;
870           case GOMP_MAP_TO:
871           case GOMP_MAP_TO_PSET:
872             pp_string (pp, "to");
873             break;
874           case GOMP_MAP_FROM:
875             pp_string (pp, "from");
876             break;
877           case GOMP_MAP_TOFROM:
878             pp_string (pp, "tofrom");
879             break;
880           case GOMP_MAP_FORCE_ALLOC:
881             pp_string (pp, "force_alloc");
882             break;
883           case GOMP_MAP_FORCE_TO:
884             pp_string (pp, "force_to");
885             break;
886           case GOMP_MAP_FORCE_FROM:
887             pp_string (pp, "force_from");
888             break;
889           case GOMP_MAP_FORCE_TOFROM:
890             pp_string (pp, "force_tofrom");
891             break;
892           case GOMP_MAP_FORCE_PRESENT:
893             pp_string (pp, "force_present");
894             break;
895           case GOMP_MAP_DELETE:
896             pp_string (pp, "delete");
897             break;
898           case GOMP_MAP_FORCE_DEVICEPTR:
899             pp_string (pp, "force_deviceptr");
900             break;
901           case GOMP_MAP_ALWAYS_TO:
902             pp_string (pp, "always,to");
903             break;
904           case GOMP_MAP_ALWAYS_FROM:
905             pp_string (pp, "always,from");
906             break;
907           case GOMP_MAP_ALWAYS_TOFROM:
908             pp_string (pp, "always,tofrom");
909             break;
910           case GOMP_MAP_RELEASE:
911             pp_string (pp, "release");
912             break;
913           case GOMP_MAP_FIRSTPRIVATE_POINTER:
914             pp_string (pp, "firstprivate");
915             break;
916           case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
917             pp_string (pp, "firstprivate ref");
918             break;
919           case GOMP_MAP_STRUCT:
920             pp_string (pp, "struct");
921             break;
922           case GOMP_MAP_ALWAYS_POINTER:
923             pp_string (pp, "always_pointer");
924             break;
925           case GOMP_MAP_DEVICE_RESIDENT:
926             pp_string (pp, "device_resident");
927             break;
928           case GOMP_MAP_LINK:
929             pp_string (pp, "link");
930             break;
931           case GOMP_MAP_ATTACH:
932             pp_string (pp, "attach");
933             break;
934           case GOMP_MAP_DETACH:
935             pp_string (pp, "detach");
936             break;
937           case GOMP_MAP_FORCE_DETACH:
938             pp_string (pp, "force_detach");
939             break;
940           case GOMP_MAP_ATTACH_DETACH:
941             pp_string (pp, "attach_detach");
942             break;
943           case GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION:
944             pp_string (pp, "attach_zero_length_array_section");
945             break;
946           default:
947             gcc_unreachable ();
948           }
949       pp_colon (pp);
950       dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
951                                spc, flags, false);
952      print_clause_size:
953       if (OMP_CLAUSE_SIZE (clause))
954           {
955             switch (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
956                       ? OMP_CLAUSE_MAP_KIND (clause) : GOMP_MAP_TO)
957               {
958               case GOMP_MAP_POINTER:
959               case GOMP_MAP_FIRSTPRIVATE_POINTER:
960               case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
961               case GOMP_MAP_ALWAYS_POINTER:
962                 pp_string (pp, " [pointer assign, bias: ");
963                 break;
964               case GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION:
965                 pp_string (pp, " [pointer assign, zero-length array section, bias: ");
966                 break;
967               case GOMP_MAP_TO_PSET:
968                 pp_string (pp, " [pointer set, len: ");
969                 break;
970               case GOMP_MAP_ATTACH:
971               case GOMP_MAP_DETACH:
972               case GOMP_MAP_FORCE_DETACH:
973               case GOMP_MAP_ATTACH_DETACH:
974               case GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION:
975                 pp_string (pp, " [bias: ");
976                 break;
977               default:
978                 pp_string (pp, " [len: ");
979                 break;
980               }
981             dump_generic_node (pp, OMP_CLAUSE_SIZE (clause),
982                                    spc, flags, false);
983             pp_right_bracket (pp);
984           }
985       if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
986             && OMP_CLAUSE_MAP_RUNTIME_IMPLICIT_P (clause))
987           pp_string (pp, "[implicit]");
988       pp_right_paren (pp);
989       break;
990 
991     case OMP_CLAUSE_FROM:
992       pp_string (pp, "from(");
993       dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
994                                spc, flags, false);
995       goto print_clause_size;
996 
997     case OMP_CLAUSE_TO:
998       pp_string (pp, "to(");
999       dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
1000                                spc, flags, false);
1001       goto print_clause_size;
1002 
1003     case OMP_CLAUSE__CACHE_:
1004       pp_string (pp, "(");
1005       dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
1006                                spc, flags, false);
1007       goto print_clause_size;
1008 
1009     case OMP_CLAUSE_NUM_TEAMS:
1010       pp_string (pp, "num_teams(");
1011       if (OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (clause))
1012           {
1013             dump_generic_node (pp, OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (clause),
1014                                    spc, flags, false);
1015             pp_colon (pp);
1016           }
1017       dump_generic_node (pp, OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR (clause),
1018                                spc, flags, false);
1019       pp_right_paren (pp);
1020       break;
1021 
1022     case OMP_CLAUSE_THREAD_LIMIT:
1023       pp_string (pp, "thread_limit(");
1024       dump_generic_node (pp, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause),
1025                                spc, flags, false);
1026       pp_right_paren (pp);
1027       break;
1028 
1029     case OMP_CLAUSE_DEVICE:
1030       pp_string (pp, "device(");
1031       if (OMP_CLAUSE_DEVICE_ANCESTOR (clause))
1032           pp_string (pp, "ancestor:");
1033       dump_generic_node (pp, OMP_CLAUSE_DEVICE_ID (clause),
1034                                spc, flags, false);
1035       pp_right_paren (pp);
1036       break;
1037 
1038     case OMP_CLAUSE_DIST_SCHEDULE:
1039       pp_string (pp, "dist_schedule(static");
1040       if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause))
1041           {
1042             pp_comma (pp);
1043             dump_generic_node (pp,
1044                                    OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause),
1045                                    spc, flags, false);
1046           }
1047       pp_right_paren (pp);
1048       break;
1049 
1050     case OMP_CLAUSE_PROC_BIND:
1051       pp_string (pp, "proc_bind(");
1052       switch (OMP_CLAUSE_PROC_BIND_KIND (clause))
1053           {
1054           case OMP_CLAUSE_PROC_BIND_MASTER:
1055             /* Same enum value: case OMP_CLAUSE_PROC_BIND_PRIMARY: */
1056             /* TODO: Change to 'primary' for OpenMP 5.1.  */
1057             pp_string (pp, "master");
1058             break;
1059           case OMP_CLAUSE_PROC_BIND_CLOSE:
1060             pp_string (pp, "close");
1061             break;
1062           case OMP_CLAUSE_PROC_BIND_SPREAD:
1063             pp_string (pp, "spread");
1064             break;
1065           default:
1066             gcc_unreachable ();
1067           }
1068       pp_right_paren (pp);
1069       break;
1070 
1071     case OMP_CLAUSE_DEVICE_TYPE:
1072       pp_string (pp, "device_type(");
1073       switch (OMP_CLAUSE_DEVICE_TYPE_KIND (clause))
1074           {
1075           case OMP_CLAUSE_DEVICE_TYPE_HOST:
1076             pp_string (pp, "host");
1077             break;
1078           case OMP_CLAUSE_DEVICE_TYPE_NOHOST:
1079             pp_string (pp, "nohost");
1080             break;
1081           case OMP_CLAUSE_DEVICE_TYPE_ANY:
1082             pp_string (pp, "any");
1083             break;
1084           default:
1085             gcc_unreachable ();
1086           }
1087       pp_right_paren (pp);
1088       break;
1089 
1090     case OMP_CLAUSE_SAFELEN:
1091       pp_string (pp, "safelen(");
1092       dump_generic_node (pp, OMP_CLAUSE_SAFELEN_EXPR (clause),
1093                                spc, flags, false);
1094       pp_right_paren (pp);
1095       break;
1096 
1097     case OMP_CLAUSE_SIMDLEN:
1098       pp_string (pp, "simdlen(");
1099       dump_generic_node (pp, OMP_CLAUSE_SIMDLEN_EXPR (clause),
1100                                spc, flags, false);
1101       pp_right_paren (pp);
1102       break;
1103 
1104     case OMP_CLAUSE_PRIORITY:
1105       pp_string (pp, "priority(");
1106       dump_generic_node (pp, OMP_CLAUSE_PRIORITY_EXPR (clause),
1107                                spc, flags, false);
1108       pp_right_paren (pp);
1109       break;
1110 
1111     case OMP_CLAUSE_GRAINSIZE:
1112       pp_string (pp, "grainsize(");
1113       if (OMP_CLAUSE_GRAINSIZE_STRICT (clause))
1114           pp_string (pp, "strict:");
1115       dump_generic_node (pp, OMP_CLAUSE_GRAINSIZE_EXPR (clause),
1116                                spc, flags, false);
1117       pp_right_paren (pp);
1118       break;
1119 
1120     case OMP_CLAUSE_NUM_TASKS:
1121       pp_string (pp, "num_tasks(");
1122       if (OMP_CLAUSE_NUM_TASKS_STRICT (clause))
1123           pp_string (pp, "strict:");
1124       dump_generic_node (pp, OMP_CLAUSE_NUM_TASKS_EXPR (clause),
1125                                spc, flags, false);
1126       pp_right_paren (pp);
1127       break;
1128 
1129     case OMP_CLAUSE_HINT:
1130       pp_string (pp, "hint(");
1131       dump_generic_node (pp, OMP_CLAUSE_HINT_EXPR (clause),
1132                                spc, flags, false);
1133       pp_right_paren (pp);
1134       break;
1135 
1136     case OMP_CLAUSE_FILTER:
1137       pp_string (pp, "filter(");
1138       dump_generic_node (pp, OMP_CLAUSE_FILTER_EXPR (clause),
1139                                spc, flags, false);
1140       pp_right_paren (pp);
1141       break;
1142 
1143     case OMP_CLAUSE_DEFAULTMAP:
1144       pp_string (pp, "defaultmap(");
1145       switch (OMP_CLAUSE_DEFAULTMAP_BEHAVIOR (clause))
1146           {
1147           case OMP_CLAUSE_DEFAULTMAP_ALLOC:
1148             pp_string (pp, "alloc");
1149             break;
1150           case OMP_CLAUSE_DEFAULTMAP_TO:
1151             pp_string (pp, "to");
1152             break;
1153           case OMP_CLAUSE_DEFAULTMAP_FROM:
1154             pp_string (pp, "from");
1155             break;
1156           case OMP_CLAUSE_DEFAULTMAP_TOFROM:
1157             pp_string (pp, "tofrom");
1158             break;
1159           case OMP_CLAUSE_DEFAULTMAP_FIRSTPRIVATE:
1160             pp_string (pp, "firstprivate");
1161             break;
1162           case OMP_CLAUSE_DEFAULTMAP_NONE:
1163             pp_string (pp, "none");
1164             break;
1165           case OMP_CLAUSE_DEFAULTMAP_DEFAULT:
1166             pp_string (pp, "default");
1167             break;
1168           default:
1169             gcc_unreachable ();
1170           }
1171       switch (OMP_CLAUSE_DEFAULTMAP_CATEGORY (clause))
1172           {
1173           case OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED:
1174             break;
1175           case OMP_CLAUSE_DEFAULTMAP_CATEGORY_SCALAR:
1176             pp_string (pp, ":scalar");
1177             break;
1178           case OMP_CLAUSE_DEFAULTMAP_CATEGORY_AGGREGATE:
1179             pp_string (pp, ":aggregate");
1180             break;
1181           case OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALLOCATABLE:
1182             pp_string (pp, ":allocatable");
1183             break;
1184           case OMP_CLAUSE_DEFAULTMAP_CATEGORY_POINTER:
1185             pp_string (pp, ":pointer");
1186             break;
1187           default:
1188             gcc_unreachable ();
1189           }
1190       pp_right_paren (pp);
1191       break;
1192 
1193     case OMP_CLAUSE_ORDER:
1194       pp_string (pp, "order(");
1195       if (OMP_CLAUSE_ORDER_UNCONSTRAINED (clause))
1196           pp_string (pp, "unconstrained:");
1197       else if (OMP_CLAUSE_ORDER_REPRODUCIBLE (clause))
1198           pp_string (pp, "reproducible:");
1199       pp_string (pp, "concurrent)");
1200       break;
1201 
1202     case OMP_CLAUSE_BIND:
1203       pp_string (pp, "bind(");
1204       switch (OMP_CLAUSE_BIND_KIND (clause))
1205           {
1206           case OMP_CLAUSE_BIND_TEAMS:
1207             pp_string (pp, "teams");
1208             break;
1209           case OMP_CLAUSE_BIND_PARALLEL:
1210             pp_string (pp, "parallel");
1211             break;
1212           case OMP_CLAUSE_BIND_THREAD:
1213             pp_string (pp, "thread");
1214             break;
1215           default:
1216             gcc_unreachable ();
1217           }
1218       pp_right_paren (pp);
1219       break;
1220 
1221     case OMP_CLAUSE__SIMDUID_:
1222       pp_string (pp, "_simduid_(");
1223       dump_generic_node (pp, OMP_CLAUSE__SIMDUID__DECL (clause),
1224                                spc, flags, false);
1225       pp_right_paren (pp);
1226       break;
1227 
1228     case OMP_CLAUSE__SIMT_:
1229       pp_string (pp, "_simt_");
1230       break;
1231 
1232     case OMP_CLAUSE_GANG:
1233       pp_string (pp, "gang");
1234       if (OMP_CLAUSE_GANG_EXPR (clause) != NULL_TREE)
1235           {
1236             pp_string (pp, "(num: ");
1237             dump_generic_node (pp, OMP_CLAUSE_GANG_EXPR (clause),
1238                                    spc, flags, false);
1239           }
1240       if (OMP_CLAUSE_GANG_STATIC_EXPR (clause) != NULL_TREE)
1241           {
1242             if (OMP_CLAUSE_GANG_EXPR (clause) == NULL_TREE)
1243               pp_left_paren (pp);
1244             else
1245               pp_space (pp);
1246             pp_string (pp, "static:");
1247             if (OMP_CLAUSE_GANG_STATIC_EXPR (clause)
1248                 == integer_minus_one_node)
1249               pp_character (pp, '*');
1250             else
1251               dump_generic_node (pp, OMP_CLAUSE_GANG_STATIC_EXPR (clause),
1252                                      spc, flags, false);
1253           }
1254       if (OMP_CLAUSE_GANG_EXPR (clause) != NULL_TREE
1255             || OMP_CLAUSE_GANG_STATIC_EXPR (clause) != NULL_TREE)
1256           pp_right_paren (pp);
1257       break;
1258 
1259     case OMP_CLAUSE_ASYNC:
1260       pp_string (pp, "async");
1261       if (OMP_CLAUSE_ASYNC_EXPR (clause))
1262         {
1263           pp_character(pp, '(');
1264           dump_generic_node (pp, OMP_CLAUSE_ASYNC_EXPR (clause),
1265                              spc, flags, false);
1266           pp_character(pp, ')');
1267         }
1268       break;
1269 
1270     case OMP_CLAUSE_AUTO:
1271     case OMP_CLAUSE_SEQ:
1272       pp_string (pp, omp_clause_code_name[OMP_CLAUSE_CODE (clause)]);
1273       break;
1274 
1275     case OMP_CLAUSE_WAIT:
1276       pp_string (pp, "wait(");
1277       dump_generic_node (pp, OMP_CLAUSE_WAIT_EXPR (clause),
1278                                spc, flags, false);
1279       pp_character(pp, ')');
1280       break;
1281 
1282     case OMP_CLAUSE_WORKER:
1283       pp_string (pp, "worker");
1284       if (OMP_CLAUSE_WORKER_EXPR (clause) != NULL_TREE)
1285           {
1286             pp_left_paren (pp);
1287             dump_generic_node (pp, OMP_CLAUSE_WORKER_EXPR (clause),
1288                                    spc, flags, false);
1289             pp_right_paren (pp);
1290           }
1291       break;
1292 
1293     case OMP_CLAUSE_VECTOR:
1294       pp_string (pp, "vector");
1295       if (OMP_CLAUSE_VECTOR_EXPR (clause) != NULL_TREE)
1296           {
1297             pp_left_paren (pp);
1298             dump_generic_node (pp, OMP_CLAUSE_VECTOR_EXPR (clause),
1299                                    spc, flags, false);
1300             pp_right_paren (pp);
1301           }
1302       break;
1303 
1304     case OMP_CLAUSE_NUM_GANGS:
1305       pp_string (pp, "num_gangs(");
1306       dump_generic_node (pp, OMP_CLAUSE_NUM_GANGS_EXPR (clause),
1307                          spc, flags, false);
1308       pp_character (pp, ')');
1309       break;
1310 
1311     case OMP_CLAUSE_NUM_WORKERS:
1312       pp_string (pp, "num_workers(");
1313       dump_generic_node (pp, OMP_CLAUSE_NUM_WORKERS_EXPR (clause),
1314                          spc, flags, false);
1315       pp_character (pp, ')');
1316       break;
1317 
1318     case OMP_CLAUSE_VECTOR_LENGTH:
1319       pp_string (pp, "vector_length(");
1320       dump_generic_node (pp, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause),
1321                          spc, flags, false);
1322       pp_character (pp, ')');
1323       break;
1324 
1325     case OMP_CLAUSE_INBRANCH:
1326       pp_string (pp, "inbranch");
1327       break;
1328     case OMP_CLAUSE_NOTINBRANCH:
1329       pp_string (pp, "notinbranch");
1330       break;
1331     case OMP_CLAUSE_FOR:
1332       pp_string (pp, "for");
1333       break;
1334     case OMP_CLAUSE_PARALLEL:
1335       pp_string (pp, "parallel");
1336       break;
1337     case OMP_CLAUSE_SECTIONS:
1338       pp_string (pp, "sections");
1339       break;
1340     case OMP_CLAUSE_TASKGROUP:
1341       pp_string (pp, "taskgroup");
1342       break;
1343     case OMP_CLAUSE_NOGROUP:
1344       pp_string (pp, "nogroup");
1345       break;
1346     case OMP_CLAUSE_THREADS:
1347       pp_string (pp, "threads");
1348       break;
1349     case OMP_CLAUSE_SIMD:
1350       pp_string (pp, "simd");
1351       break;
1352     case OMP_CLAUSE_INDEPENDENT:
1353       pp_string (pp, "independent");
1354       break;
1355     case OMP_CLAUSE_TILE:
1356       pp_string (pp, "tile(");
1357       dump_generic_node (pp, OMP_CLAUSE_TILE_LIST (clause),
1358                                spc, flags, false);
1359       pp_right_paren (pp);
1360       break;
1361 
1362     case OMP_CLAUSE_IF_PRESENT:
1363       pp_string (pp, "if_present");
1364       break;
1365     case OMP_CLAUSE_FINALIZE:
1366       pp_string (pp, "finalize");
1367       break;
1368     case OMP_CLAUSE_NOHOST:
1369       pp_string (pp, "nohost");
1370       break;
1371     case OMP_CLAUSE_DETACH:
1372       pp_string (pp, "detach(");
1373       dump_generic_node (pp, OMP_CLAUSE_DECL (clause), spc, flags,
1374                                false);
1375       pp_right_paren (pp);
1376       break;
1377 
1378     default:
1379       gcc_unreachable ();
1380     }
1381 }
1382 
1383 
1384 /* Dump chain of OMP clauses.
1385 
1386    PP, SPC and FLAGS are as in dump_generic_node.  */
1387 
1388 void
dump_omp_clauses(pretty_printer * pp,tree clause,int spc,dump_flags_t flags,bool leading_space)1389 dump_omp_clauses (pretty_printer *pp, tree clause, int spc, dump_flags_t flags,
1390                       bool leading_space)
1391 {
1392   while (clause)
1393     {
1394       if (leading_space)
1395           pp_space (pp);
1396       dump_omp_clause (pp, clause, spc, flags);
1397       leading_space = true;
1398 
1399       clause = OMP_CLAUSE_CHAIN (clause);
1400     }
1401 }
1402 
1403 
1404 /* Dump location LOC to PP.  */
1405 
1406 void
dump_location(pretty_printer * pp,location_t loc)1407 dump_location (pretty_printer *pp, location_t loc)
1408 {
1409   expanded_location xloc = expand_location (loc);
1410 
1411   pp_left_bracket (pp);
1412   if (xloc.file)
1413     {
1414       pp_string (pp, xloc.file);
1415       pp_string (pp, ":");
1416     }
1417   pp_decimal_int (pp, xloc.line);
1418   pp_colon (pp);
1419   pp_decimal_int (pp, xloc.column);
1420   pp_string (pp, "] ");
1421 }
1422 
1423 
1424 /* Dump lexical block BLOCK.  PP, SPC and FLAGS are as in
1425    dump_generic_node.  */
1426 
1427 static void
dump_block_node(pretty_printer * pp,tree block,int spc,dump_flags_t flags)1428 dump_block_node (pretty_printer *pp, tree block, int spc, dump_flags_t flags)
1429 {
1430   tree t;
1431 
1432   pp_string (pp, "BLOCK #");
1433   pp_decimal_int (pp, BLOCK_NUMBER (block));
1434   pp_character (pp, ' ');
1435 
1436   if (flags & TDF_ADDRESS)
1437     {
1438       pp_character (pp, '[');
1439       pp_scalar (pp, "%p", (void *) block);
1440       pp_string (pp, "] ");
1441     }
1442 
1443   if (TREE_ASM_WRITTEN (block))
1444     pp_string (pp, "[written] ");
1445 
1446   if (flags & TDF_SLIM)
1447     return;
1448 
1449   if (BLOCK_SOURCE_LOCATION (block))
1450     dump_location (pp, BLOCK_SOURCE_LOCATION (block));
1451 
1452   newline_and_indent (pp, spc + 2);
1453 
1454   if (BLOCK_SUPERCONTEXT (block))
1455     {
1456       pp_string (pp, "SUPERCONTEXT: ");
1457       dump_generic_node (pp, BLOCK_SUPERCONTEXT (block), 0,
1458                                flags | TDF_SLIM, false);
1459       newline_and_indent (pp, spc + 2);
1460     }
1461 
1462   if (BLOCK_SUBBLOCKS (block))
1463     {
1464       pp_string (pp, "SUBBLOCKS: ");
1465       for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
1466           {
1467             dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1468             pp_space (pp);
1469           }
1470       newline_and_indent (pp, spc + 2);
1471     }
1472 
1473   if (BLOCK_CHAIN (block))
1474     {
1475       pp_string (pp, "SIBLINGS: ");
1476       for (t = BLOCK_CHAIN (block); t; t = BLOCK_CHAIN (t))
1477           {
1478             dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1479             pp_space (pp);
1480           }
1481       newline_and_indent (pp, spc + 2);
1482     }
1483 
1484   if (BLOCK_VARS (block))
1485     {
1486       pp_string (pp, "VARS: ");
1487       for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
1488           {
1489             dump_generic_node (pp, t, 0, flags, false);
1490             pp_space (pp);
1491           }
1492       newline_and_indent (pp, spc + 2);
1493     }
1494 
1495   if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block)) > 0)
1496     {
1497       unsigned i;
1498       vec<tree, va_gc> *nlv = BLOCK_NONLOCALIZED_VARS (block);
1499 
1500       pp_string (pp, "NONLOCALIZED_VARS: ");
1501       FOR_EACH_VEC_ELT (*nlv, i, t)
1502           {
1503             dump_generic_node (pp, t, 0, flags, false);
1504             pp_space (pp);
1505           }
1506       newline_and_indent (pp, spc + 2);
1507     }
1508 
1509   if (BLOCK_ABSTRACT_ORIGIN (block))
1510     {
1511       pp_string (pp, "ABSTRACT_ORIGIN: ");
1512       dump_generic_node (pp, BLOCK_ABSTRACT_ORIGIN (block), 0,
1513                                flags | TDF_SLIM, false);
1514       newline_and_indent (pp, spc + 2);
1515     }
1516 
1517   if (BLOCK_FRAGMENT_ORIGIN (block))
1518     {
1519       pp_string (pp, "FRAGMENT_ORIGIN: ");
1520       dump_generic_node (pp, BLOCK_FRAGMENT_ORIGIN (block), 0,
1521                                flags | TDF_SLIM, false);
1522       newline_and_indent (pp, spc + 2);
1523     }
1524 
1525   if (BLOCK_FRAGMENT_CHAIN (block))
1526     {
1527       pp_string (pp, "FRAGMENT_CHAIN: ");
1528       for (t = BLOCK_FRAGMENT_CHAIN (block); t; t = BLOCK_FRAGMENT_CHAIN (t))
1529           {
1530             dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1531             pp_space (pp);
1532           }
1533       newline_and_indent (pp, spc + 2);
1534     }
1535 }
1536 
1537 /* Dump #pragma omp atomic memory order clause.  */
1538 
1539 void
dump_omp_atomic_memory_order(pretty_printer * pp,enum omp_memory_order mo)1540 dump_omp_atomic_memory_order (pretty_printer *pp, enum omp_memory_order mo)
1541 {
1542   switch (mo & OMP_MEMORY_ORDER_MASK)
1543     {
1544     case OMP_MEMORY_ORDER_RELAXED:
1545       pp_string (pp, " relaxed");
1546       break;
1547     case OMP_MEMORY_ORDER_SEQ_CST:
1548       pp_string (pp, " seq_cst");
1549       break;
1550     case OMP_MEMORY_ORDER_ACQ_REL:
1551       pp_string (pp, " acq_rel");
1552       break;
1553     case OMP_MEMORY_ORDER_ACQUIRE:
1554       pp_string (pp, " acquire");
1555       break;
1556     case OMP_MEMORY_ORDER_RELEASE:
1557       pp_string (pp, " release");
1558       break;
1559     case OMP_MEMORY_ORDER_UNSPECIFIED:
1560       break;
1561     default:
1562       gcc_unreachable ();
1563     }
1564   switch (mo & OMP_FAIL_MEMORY_ORDER_MASK)
1565     {
1566     case OMP_FAIL_MEMORY_ORDER_RELAXED:
1567       pp_string (pp, " fail(relaxed)");
1568       break;
1569     case OMP_FAIL_MEMORY_ORDER_SEQ_CST:
1570       pp_string (pp, " fail(seq_cst)");
1571       break;
1572     case OMP_FAIL_MEMORY_ORDER_ACQUIRE:
1573       pp_string (pp, " fail(acquire)");
1574       break;
1575     case OMP_FAIL_MEMORY_ORDER_UNSPECIFIED:
1576       break;
1577     default:
1578       gcc_unreachable ();
1579     }
1580 }
1581 
1582 /* Helper to dump a MEM_REF node.  */
1583 
1584 static void
dump_mem_ref(pretty_printer * pp,tree node,int spc,dump_flags_t flags)1585 dump_mem_ref (pretty_printer *pp, tree node, int spc, dump_flags_t flags)
1586 {
1587   if (TREE_CODE (node) == MEM_REF && (flags & TDF_GIMPLE))
1588     {
1589       pp_string (pp, "__MEM <");
1590       dump_generic_node (pp, TREE_TYPE (node),
1591                                spc, flags | TDF_SLIM, false);
1592       if (TYPE_ALIGN (TREE_TYPE (node))
1593             != TYPE_ALIGN (TYPE_MAIN_VARIANT (TREE_TYPE (node))))
1594           {
1595             pp_string (pp, ", ");
1596             pp_decimal_int (pp, TYPE_ALIGN (TREE_TYPE (node)));
1597           }
1598       pp_greater (pp);
1599       pp_string (pp, " (");
1600       if (TREE_TYPE (TREE_OPERAND (node, 0))
1601             != TREE_TYPE (TREE_OPERAND (node, 1)))
1602           {
1603             pp_left_paren (pp);
1604             dump_generic_node (pp, TREE_TYPE (TREE_OPERAND (node, 1)),
1605                                    spc, flags | TDF_SLIM, false);
1606             pp_right_paren (pp);
1607           }
1608       dump_generic_node (pp, TREE_OPERAND (node, 0),
1609                                spc, flags | TDF_SLIM, false);
1610       if (! integer_zerop (TREE_OPERAND (node, 1)))
1611           {
1612             pp_string (pp, " + ");
1613             dump_generic_node (pp, TREE_OPERAND (node, 1),
1614                                    spc, flags | TDF_SLIM, false);
1615           }
1616       pp_right_paren (pp);
1617     }
1618   else if (TREE_CODE (node) == MEM_REF
1619              && integer_zerop (TREE_OPERAND (node, 1))
1620              /* Dump the types of INTEGER_CSTs explicitly, for we can't
1621                 infer them and MEM_ATTR caching will share MEM_REFs
1622                 with differently-typed op0s.  */
1623              && TREE_CODE (TREE_OPERAND (node, 0)) != INTEGER_CST
1624              /* Released SSA_NAMES have no TREE_TYPE.  */
1625              && TREE_TYPE (TREE_OPERAND (node, 0)) != NULL_TREE
1626              /* Same pointer types, but ignoring POINTER_TYPE vs.
1627                 REFERENCE_TYPE.  */
1628              && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 0)))
1629                  == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1))))
1630              && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 0)))
1631                  == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 1))))
1632              && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 0)))
1633                  == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 1))))
1634              /* Same value types ignoring qualifiers.  */
1635              && (TYPE_MAIN_VARIANT (TREE_TYPE (node))
1636                  == TYPE_MAIN_VARIANT
1637                  (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1)))))
1638              && (!(flags & TDF_ALIAS)
1639                  || MR_DEPENDENCE_CLIQUE (node) == 0))
1640     {
1641       if (TREE_CODE (TREE_OPERAND (node, 0)) != ADDR_EXPR)
1642           {
1643             /* Enclose pointers to arrays in parentheses.  */
1644             tree op0 = TREE_OPERAND (node, 0);
1645             tree op0type = TREE_TYPE (op0);
1646             if (POINTER_TYPE_P (op0type)
1647                 && TREE_CODE (TREE_TYPE (op0type)) == ARRAY_TYPE)
1648               pp_left_paren (pp);
1649             pp_star (pp);
1650             dump_generic_node (pp, op0, spc, flags, false);
1651             if (POINTER_TYPE_P (op0type)
1652                 && TREE_CODE (TREE_TYPE (op0type)) == ARRAY_TYPE)
1653               pp_right_paren (pp);
1654           }
1655       else
1656           dump_generic_node (pp,
1657                                  TREE_OPERAND (TREE_OPERAND (node, 0), 0),
1658                                  spc, flags, false);
1659     }
1660   else
1661     {
1662       pp_string (pp, "MEM");
1663 
1664       tree nodetype = TREE_TYPE (node);
1665       tree op0 = TREE_OPERAND (node, 0);
1666       tree op1 = TREE_OPERAND (node, 1);
1667       tree op1type = TYPE_MAIN_VARIANT (TREE_TYPE (op1));
1668 
1669       tree op0size = TYPE_SIZE (nodetype);
1670       tree op1size = TYPE_SIZE (TREE_TYPE (op1type));
1671 
1672       if (!op0size || !op1size
1673             || !operand_equal_p (op0size, op1size, 0))
1674           {
1675             pp_string (pp, " <");
1676             /* If the size of the type of the operand is not the same
1677                as the size of the MEM_REF expression include the type
1678                of the latter similar to the TDF_GIMPLE output to make
1679                it clear how many bytes of memory are being accessed.  */
1680             dump_generic_node (pp, nodetype, spc, flags | TDF_SLIM, false);
1681             pp_string (pp, "> ");
1682           }
1683 
1684       pp_string (pp, "[(");
1685       dump_generic_node (pp, op1type, spc, flags | TDF_SLIM, false);
1686       pp_right_paren (pp);
1687       dump_generic_node (pp, op0, spc, flags, false);
1688       if (!integer_zerop (op1))
1689           {
1690             pp_string (pp, " + ");
1691             dump_generic_node (pp, op1, spc, flags, false);
1692           }
1693       if (TREE_CODE (node) == TARGET_MEM_REF)
1694           {
1695             tree tmp = TMR_INDEX2 (node);
1696             if (tmp)
1697               {
1698                 pp_string (pp, " + ");
1699                 dump_generic_node (pp, tmp, spc, flags, false);
1700               }
1701             tmp = TMR_INDEX (node);
1702             if (tmp)
1703               {
1704                 pp_string (pp, " + ");
1705                 dump_generic_node (pp, tmp, spc, flags, false);
1706                 tmp = TMR_STEP (node);
1707                 pp_string (pp, " * ");
1708                 if (tmp)
1709                     dump_generic_node (pp, tmp, spc, flags, false);
1710                 else
1711                     pp_string (pp, "1");
1712               }
1713           }
1714       if ((flags & TDF_ALIAS)
1715             && MR_DEPENDENCE_CLIQUE (node) != 0)
1716           {
1717             pp_string (pp, " clique ");
1718             pp_unsigned_wide_integer (pp, MR_DEPENDENCE_CLIQUE (node));
1719             pp_string (pp, " base ");
1720             pp_unsigned_wide_integer (pp, MR_DEPENDENCE_BASE (node));
1721           }
1722       pp_right_bracket (pp);
1723     }
1724 }
1725 
1726 /* Helper function for dump_generic_node.  Dump INIT or COND expression for
1727    OpenMP loop non-rectangular iterators.  */
1728 
1729 void
dump_omp_loop_non_rect_expr(pretty_printer * pp,tree node,int spc,dump_flags_t flags)1730 dump_omp_loop_non_rect_expr (pretty_printer *pp, tree node, int spc,
1731                                    dump_flags_t flags)
1732 {
1733   gcc_assert (TREE_CODE (node) == TREE_VEC);
1734   dump_generic_node (pp, TREE_VEC_ELT (node, 0), spc, flags, false);
1735   pp_string (pp, " * ");
1736   if (op_prio (TREE_VEC_ELT (node, 1)) <= op_code_prio (MULT_EXPR))
1737     {
1738       pp_left_paren (pp);
1739       dump_generic_node (pp, TREE_VEC_ELT (node, 1), spc, flags, false);
1740       pp_right_paren (pp);
1741     }
1742   else
1743     dump_generic_node (pp, TREE_VEC_ELT (node, 1), spc, flags, false);
1744   pp_string (pp, " + ");
1745   if (op_prio (TREE_VEC_ELT (node, 1)) <= op_code_prio (PLUS_EXPR))
1746     {
1747       pp_left_paren (pp);
1748       dump_generic_node (pp, TREE_VEC_ELT (node, 2), spc, flags, false);
1749       pp_right_paren (pp);
1750     }
1751   else
1752     dump_generic_node (pp, TREE_VEC_ELT (node, 2), spc, flags, false);
1753 }
1754 
1755 /* Dump the node NODE on the pretty_printer PP, SPC spaces of
1756    indent.  FLAGS specifies details to show in the dump (see TDF_* in
1757    dumpfile.h).  If IS_STMT is true, the object printed is considered
1758    to be a statement and it is terminated by ';' if appropriate.  */
1759 
1760 int
dump_generic_node(pretty_printer * pp,tree node,int spc,dump_flags_t flags,bool is_stmt)1761 dump_generic_node (pretty_printer *pp, tree node, int spc, dump_flags_t flags,
1762                        bool is_stmt)
1763 {
1764   tree type;
1765   tree op0, op1;
1766   const char *str;
1767   bool is_expr;
1768   enum tree_code code;
1769 
1770   if (node == NULL_TREE)
1771     return spc;
1772 
1773   is_expr = EXPR_P (node);
1774 
1775   if (is_stmt && (flags & TDF_STMTADDR))
1776     {
1777       pp_string (pp, "<&");
1778       pp_scalar (pp, "%p", (void *)node);
1779       pp_string (pp, "> ");
1780     }
1781 
1782   if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
1783     dump_location (pp, EXPR_LOCATION (node));
1784 
1785   code = TREE_CODE (node);
1786   switch (code)
1787     {
1788     case ERROR_MARK:
1789       pp_string (pp, "<<< error >>>");
1790       break;
1791 
1792     case IDENTIFIER_NODE:
1793       pp_tree_identifier (pp, node);
1794       break;
1795 
1796     case TREE_LIST:
1797       while (node && node != error_mark_node)
1798           {
1799             if (TREE_PURPOSE (node))
1800               {
1801                 dump_generic_node (pp, TREE_PURPOSE (node), spc, flags, false);
1802                 pp_space (pp);
1803               }
1804             dump_generic_node (pp, TREE_VALUE (node), spc, flags, false);
1805             node = TREE_CHAIN (node);
1806             if (node && TREE_CODE (node) == TREE_LIST)
1807               {
1808                 pp_comma (pp);
1809                 pp_space (pp);
1810               }
1811           }
1812       break;
1813 
1814     case TREE_BINFO:
1815       dump_generic_node (pp, BINFO_TYPE (node), spc, flags, false);
1816       break;
1817 
1818     case TREE_VEC:
1819       {
1820           size_t i;
1821           if (TREE_VEC_LENGTH (node) > 0)
1822             {
1823               size_t len = TREE_VEC_LENGTH (node);
1824               for (i = 0; i < len - 1; i++)
1825                 {
1826                     dump_generic_node (pp, TREE_VEC_ELT (node, i), spc, flags,
1827                                            false);
1828                     pp_comma (pp);
1829                     pp_space (pp);
1830                 }
1831               dump_generic_node (pp, TREE_VEC_ELT (node, len - 1), spc,
1832                                      flags, false);
1833             }
1834       }
1835       break;
1836 
1837     case VOID_TYPE:
1838     case INTEGER_TYPE:
1839     case REAL_TYPE:
1840     case FIXED_POINT_TYPE:
1841     case COMPLEX_TYPE:
1842     case VECTOR_TYPE:
1843     case ENUMERAL_TYPE:
1844     case BOOLEAN_TYPE:
1845     case OPAQUE_TYPE:
1846       {
1847           unsigned int quals = TYPE_QUALS (node);
1848           enum tree_code_class tclass;
1849 
1850           if (quals & TYPE_QUAL_ATOMIC)
1851             pp_string (pp, "atomic ");
1852           if (quals & TYPE_QUAL_CONST)
1853             pp_string (pp, "const ");
1854           if (quals & TYPE_QUAL_VOLATILE)
1855             pp_string (pp, "volatile ");
1856           if (quals & TYPE_QUAL_RESTRICT)
1857             pp_string (pp, "restrict ");
1858 
1859           if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
1860             {
1861               pp_string (pp, "<address-space-");
1862               pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
1863               pp_string (pp, "> ");
1864             }
1865 
1866           tclass = TREE_CODE_CLASS (TREE_CODE (node));
1867 
1868           if (tclass == tcc_declaration)
1869             {
1870               if (DECL_NAME (node))
1871                 dump_decl_name (pp, node, flags);
1872               else
1873               pp_string (pp, "<unnamed type decl>");
1874             }
1875           else if (tclass == tcc_type)
1876             {
1877               if (TYPE_NAME (node))
1878                 {
1879                     if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
1880                       pp_tree_identifier (pp, TYPE_NAME (node));
1881                     else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
1882                                && DECL_NAME (TYPE_NAME (node)))
1883                       dump_decl_name (pp, TYPE_NAME (node), flags);
1884                     else
1885                       pp_string (pp, "<unnamed type>");
1886                 }
1887               else if (TREE_CODE (node) == VECTOR_TYPE)
1888                 {
1889                     pp_string (pp, "vector");
1890                     pp_left_paren (pp);
1891                     pp_wide_integer (pp, TYPE_VECTOR_SUBPARTS (node));
1892                     pp_string (pp, ") ");
1893                     dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
1894                 }
1895               else if (TREE_CODE (node) == INTEGER_TYPE)
1896                 {
1897                     if (TYPE_PRECISION (node) == CHAR_TYPE_SIZE)
1898                       pp_string (pp, (TYPE_UNSIGNED (node)
1899                                               ? "unsigned char"
1900                                               : "signed char"));
1901                     else if (TYPE_PRECISION (node) == SHORT_TYPE_SIZE)
1902                       pp_string (pp, (TYPE_UNSIGNED (node)
1903                                               ? "unsigned short"
1904                                               : "signed short"));
1905                     else if (TYPE_PRECISION (node) == INT_TYPE_SIZE)
1906                       pp_string (pp, (TYPE_UNSIGNED (node)
1907                                               ? "unsigned int"
1908                                               : "signed int"));
1909                     else if (TYPE_PRECISION (node) == LONG_TYPE_SIZE)
1910                       pp_string (pp, (TYPE_UNSIGNED (node)
1911                                               ? "unsigned long"
1912                                               : "signed long"));
1913                     else if (TYPE_PRECISION (node) == LONG_LONG_TYPE_SIZE)
1914                       pp_string (pp, (TYPE_UNSIGNED (node)
1915                                               ? "unsigned long long"
1916                                               : "signed long long"));
1917                     else if (TYPE_PRECISION (node) >= CHAR_TYPE_SIZE
1918                                && pow2p_hwi (TYPE_PRECISION (node)))
1919                       {
1920                         pp_string (pp, (TYPE_UNSIGNED (node) ? "uint" : "int"));
1921                         pp_decimal_int (pp, TYPE_PRECISION (node));
1922                         pp_string (pp, "_t");
1923                       }
1924                     else
1925                       {
1926                         pp_string (pp, (TYPE_UNSIGNED (node)
1927                                                   ? "<unnamed-unsigned:"
1928                                                   : "<unnamed-signed:"));
1929                         pp_decimal_int (pp, TYPE_PRECISION (node));
1930                         pp_greater (pp);
1931                       }
1932                 }
1933               else if (TREE_CODE (node) == COMPLEX_TYPE)
1934                 {
1935                     pp_string (pp, "__complex__ ");
1936                     dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
1937                 }
1938               else if (TREE_CODE (node) == REAL_TYPE)
1939                 {
1940                     pp_string (pp, "<float:");
1941                     pp_decimal_int (pp, TYPE_PRECISION (node));
1942                     pp_greater (pp);
1943                 }
1944               else if (TREE_CODE (node) == FIXED_POINT_TYPE)
1945                 {
1946                     pp_string (pp, "<fixed-point-");
1947                     pp_string (pp, TYPE_SATURATING (node) ? "sat:" : "nonsat:");
1948                     pp_decimal_int (pp, TYPE_PRECISION (node));
1949                     pp_greater (pp);
1950                 }
1951               else if (TREE_CODE (node) == BOOLEAN_TYPE)
1952                 {
1953                     pp_string (pp, (TYPE_UNSIGNED (node)
1954                                         ? "<unsigned-boolean:"
1955                                         : "<signed-boolean:"));
1956                     pp_decimal_int (pp, TYPE_PRECISION (node));
1957                     pp_greater (pp);
1958                 }
1959               else if (TREE_CODE (node) == VOID_TYPE)
1960                 pp_string (pp, "void");
1961               else
1962               pp_string (pp, "<unnamed type>");
1963             }
1964           break;
1965       }
1966 
1967     case POINTER_TYPE:
1968     case REFERENCE_TYPE:
1969       str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
1970 
1971       if (TREE_TYPE (node) == NULL)
1972         {
1973             pp_string (pp, str);
1974           pp_string (pp, "<null type>");
1975         }
1976       else if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
1977         {
1978             tree fnode = TREE_TYPE (node);
1979 
1980             dump_generic_node (pp, TREE_TYPE (fnode), spc, flags, false);
1981             pp_space (pp);
1982             pp_left_paren (pp);
1983             pp_string (pp, str);
1984             if (TYPE_IDENTIFIER (node))
1985               dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
1986             else if (flags & TDF_NOUID)
1987               pp_string (pp, "<Txxxx>");
1988             else
1989               {
1990                 pp_string (pp, "<T");
1991                 pp_scalar (pp, "%x", TYPE_UID (node));
1992                 pp_character (pp, '>');
1993               }
1994 
1995             pp_right_paren (pp);
1996             dump_function_declaration (pp, fnode, spc, flags);
1997           }
1998       else
1999         {
2000             unsigned int quals = TYPE_QUALS (node);
2001 
2002           dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2003             pp_space (pp);
2004             pp_string (pp, str);
2005 
2006             if (quals & TYPE_QUAL_CONST)
2007               pp_string (pp, " const");
2008             if (quals & TYPE_QUAL_VOLATILE)
2009               pp_string (pp, " volatile");
2010             if (quals & TYPE_QUAL_RESTRICT)
2011               pp_string (pp, " restrict");
2012 
2013             if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
2014               {
2015                 pp_string (pp, " <address-space-");
2016                 pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
2017                 pp_greater (pp);
2018               }
2019 
2020             if (TYPE_REF_CAN_ALIAS_ALL (node))
2021               pp_string (pp, " {ref-all}");
2022           }
2023       break;
2024 
2025     case OFFSET_TYPE:
2026       NIY;
2027       break;
2028 
2029     case MEM_REF:
2030     case TARGET_MEM_REF:
2031       dump_mem_ref (pp, node, spc, flags);
2032       break;
2033 
2034     case ARRAY_TYPE:
2035       {
2036           unsigned int quals = TYPE_QUALS (node);
2037           tree tmp;
2038 
2039           if (quals & TYPE_QUAL_ATOMIC)
2040             pp_string (pp, "atomic ");
2041           if (quals & TYPE_QUAL_CONST)
2042             pp_string (pp, "const ");
2043           if (quals & TYPE_QUAL_VOLATILE)
2044             pp_string (pp, "volatile ");
2045 
2046           /* Print the innermost component type.  */
2047           for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
2048                tmp = TREE_TYPE (tmp))
2049             ;
2050           dump_generic_node (pp, tmp, spc, flags, false);
2051 
2052           /* Print the dimensions.  */
2053           for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
2054             dump_array_domain (pp, TYPE_DOMAIN (tmp), spc, flags);
2055           break;
2056       }
2057 
2058     case RECORD_TYPE:
2059     case UNION_TYPE:
2060     case QUAL_UNION_TYPE:
2061       {
2062           unsigned int quals = TYPE_QUALS (node);
2063 
2064           if (quals & TYPE_QUAL_ATOMIC)
2065             pp_string (pp, "atomic ");
2066           if (quals & TYPE_QUAL_CONST)
2067             pp_string (pp, "const ");
2068           if (quals & TYPE_QUAL_VOLATILE)
2069             pp_string (pp, "volatile ");
2070 
2071           if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
2072             {
2073               pp_string (pp, "<address-space-");
2074               pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
2075               pp_string (pp, "> ");
2076             }
2077 
2078         /* Print the name of the structure.  */
2079         if (TREE_CODE (node) == RECORD_TYPE)
2080             pp_string (pp, "struct ");
2081         else if (TREE_CODE (node) == UNION_TYPE)
2082             pp_string (pp, "union ");
2083 
2084         if (TYPE_NAME (node))
2085             dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
2086           else if (!(flags & TDF_SLIM))
2087             /* FIXME: If we eliminate the 'else' above and attempt
2088                to show the fields for named types, we may get stuck
2089                following a cycle of pointers to structs.  The alleged
2090                self-reference check in print_struct_decl will not detect
2091                cycles involving more than one pointer or struct type.  */
2092             print_struct_decl (pp, node, spc, flags);
2093         break;
2094       }
2095 
2096     case LANG_TYPE:
2097       NIY;
2098       break;
2099 
2100     case INTEGER_CST:
2101       if (flags & TDF_GIMPLE
2102             && (POINTER_TYPE_P (TREE_TYPE (node))
2103                 || (TYPE_PRECISION (TREE_TYPE (node))
2104                       < TYPE_PRECISION (integer_type_node))
2105                 || exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1
2106                 || tree_int_cst_sgn (node) < 0))
2107           {
2108             pp_string (pp, "_Literal (");
2109             dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2110             pp_string (pp, ") ");
2111           }
2112       if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE
2113             && ! (flags & TDF_GIMPLE))
2114           {
2115             /* In the case of a pointer, one may want to divide by the
2116                size of the pointed-to type.  Unfortunately, this not
2117                straightforward.  The C front-end maps expressions
2118 
2119                (int *) 5
2120                int *p; (p + 5)
2121 
2122                in such a way that the two INTEGER_CST nodes for "5" have
2123                different values but identical types.  In the latter
2124                case, the 5 is multiplied by sizeof (int) in c-common.cc
2125                (pointer_int_sum) to convert it to a byte address, and
2126                yet the type of the node is left unchanged.  Argh.  What
2127                is consistent though is that the number value corresponds
2128                to bytes (UNITS) offset.
2129 
2130              NB: Neither of the following divisors can be trivially
2131              used to recover the original literal:
2132 
2133              TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
2134                TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node)))  */
2135             pp_wide_integer (pp, TREE_INT_CST_LOW (node));
2136             pp_string (pp, "B"); /* pseudo-unit */
2137           }
2138       else if (tree_fits_shwi_p (node))
2139           pp_wide_integer (pp, tree_to_shwi (node));
2140       else if (tree_fits_uhwi_p (node))
2141           pp_unsigned_wide_integer (pp, tree_to_uhwi (node));
2142       else
2143           {
2144             wide_int val = wi::to_wide (node);
2145 
2146             if (wi::neg_p (val, TYPE_SIGN (TREE_TYPE (node))))
2147               {
2148                 pp_minus (pp);
2149                 val = -val;
2150               }
2151             print_hex (val, pp_buffer (pp)->digit_buffer);
2152             pp_string (pp, pp_buffer (pp)->digit_buffer);
2153           }
2154       if ((flags & TDF_GIMPLE)
2155             && ! (POINTER_TYPE_P (TREE_TYPE (node))
2156                     || (TYPE_PRECISION (TREE_TYPE (node))
2157                         < TYPE_PRECISION (integer_type_node))
2158                     || exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1))
2159           {
2160             if (TYPE_UNSIGNED (TREE_TYPE (node)))
2161               pp_character (pp, 'u');
2162             if (TYPE_PRECISION (TREE_TYPE (node))
2163                 == TYPE_PRECISION (unsigned_type_node))
2164               ;
2165             else if (TYPE_PRECISION (TREE_TYPE (node))
2166                        == TYPE_PRECISION (long_unsigned_type_node))
2167               pp_character (pp, 'l');
2168             else if (TYPE_PRECISION (TREE_TYPE (node))
2169                        == TYPE_PRECISION (long_long_unsigned_type_node))
2170               pp_string (pp, "ll");
2171           }
2172       if (TREE_OVERFLOW (node))
2173           pp_string (pp, "(OVF)");
2174       break;
2175 
2176     case POLY_INT_CST:
2177       pp_string (pp, "POLY_INT_CST [");
2178       dump_generic_node (pp, POLY_INT_CST_COEFF (node, 0), spc, flags, false);
2179       for (unsigned int i = 1; i < NUM_POLY_INT_COEFFS; ++i)
2180           {
2181             pp_string (pp, ", ");
2182             dump_generic_node (pp, POLY_INT_CST_COEFF (node, i),
2183                                    spc, flags, false);
2184           }
2185       pp_string (pp, "]");
2186       break;
2187 
2188     case REAL_CST:
2189       /* Code copied from print_node.  */
2190       {
2191           REAL_VALUE_TYPE d;
2192           if (TREE_OVERFLOW (node))
2193             pp_string (pp, " overflow");
2194 
2195           d = TREE_REAL_CST (node);
2196           if (REAL_VALUE_ISINF (d))
2197             pp_string (pp, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
2198           else if (REAL_VALUE_ISNAN (d))
2199             pp_string (pp, " Nan");
2200           else
2201             {
2202               char string[100];
2203               real_to_decimal (string, &d, sizeof (string), 0, 1);
2204               pp_string (pp, string);
2205             }
2206           break;
2207       }
2208 
2209     case FIXED_CST:
2210       {
2211           char string[100];
2212           fixed_to_decimal (string, TREE_FIXED_CST_PTR (node), sizeof (string));
2213           pp_string (pp, string);
2214           break;
2215       }
2216 
2217     case COMPLEX_CST:
2218       pp_string (pp, "__complex__ (");
2219       dump_generic_node (pp, TREE_REALPART (node), spc, flags, false);
2220       pp_string (pp, ", ");
2221       dump_generic_node (pp, TREE_IMAGPART (node), spc, flags, false);
2222       pp_right_paren (pp);
2223       break;
2224 
2225     case STRING_CST:
2226       {
2227           pp_string (pp, "\"");
2228           if (unsigned nbytes = TREE_STRING_LENGTH (node))
2229             pretty_print_string (pp, TREE_STRING_POINTER (node), nbytes);
2230           pp_string (pp, "\"");
2231           break;
2232       }
2233 
2234     case VECTOR_CST:
2235       {
2236           unsigned i;
2237           if (flags & TDF_GIMPLE)
2238             {
2239               pp_string (pp, "_Literal (");
2240               dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2241               pp_string (pp, ") ");
2242             }
2243           pp_string (pp, "{ ");
2244           unsigned HOST_WIDE_INT nunits;
2245           if (!VECTOR_CST_NELTS (node).is_constant (&nunits))
2246             nunits = vector_cst_encoded_nelts (node);
2247           for (i = 0; i < nunits; ++i)
2248             {
2249               if (i != 0)
2250                 pp_string (pp, ", ");
2251               dump_generic_node (pp, VECTOR_CST_ELT (node, i),
2252                                      spc, flags, false);
2253             }
2254           if (!VECTOR_CST_NELTS (node).is_constant ())
2255             pp_string (pp, ", ...");
2256           pp_string (pp, " }");
2257       }
2258       break;
2259 
2260     case FUNCTION_TYPE:
2261     case METHOD_TYPE:
2262       dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2263       pp_space (pp);
2264       if (TREE_CODE (node) == METHOD_TYPE)
2265           {
2266             if (TYPE_METHOD_BASETYPE (node))
2267               dump_generic_node (pp, TYPE_NAME (TYPE_METHOD_BASETYPE (node)),
2268                                      spc, flags, false);
2269             else
2270               pp_string (pp, "<null method basetype>");
2271             pp_colon_colon (pp);
2272           }
2273       if (TYPE_IDENTIFIER (node))
2274           dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
2275       else if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
2276           dump_decl_name (pp, TYPE_NAME (node), flags);
2277       else if (flags & TDF_NOUID)
2278           pp_string (pp, "<Txxxx>");
2279       else
2280           {
2281             pp_string (pp, "<T");
2282             pp_scalar (pp, "%x", TYPE_UID (node));
2283             pp_character (pp, '>');
2284           }
2285       dump_function_declaration (pp, node, spc, flags);
2286       break;
2287 
2288     case FUNCTION_DECL:
2289     case CONST_DECL:
2290       dump_decl_name (pp, node, flags);
2291       break;
2292 
2293     case LABEL_DECL:
2294       if (DECL_NAME (node))
2295           dump_decl_name (pp, node, flags);
2296       else if (LABEL_DECL_UID (node) != -1)
2297           {
2298             if (flags & TDF_GIMPLE)
2299               {
2300                 pp_character (pp, 'L');
2301                 pp_decimal_int (pp, (int) LABEL_DECL_UID (node));
2302               }
2303             else
2304               {
2305                 pp_string (pp, "<L");
2306                 pp_decimal_int (pp, (int) LABEL_DECL_UID (node));
2307                 pp_character (pp, '>');
2308               }
2309           }
2310       else
2311           {
2312             if (flags & TDF_NOUID)
2313               pp_string (pp, "<D.xxxx>");
2314             else
2315               {
2316                 if (flags & TDF_GIMPLE)
2317                     {
2318                       pp_character (pp, 'D');
2319                       pp_scalar (pp, "%u", DECL_UID (node));
2320                     }
2321                 else
2322                     {
2323                       pp_string (pp, "<D.");
2324                       pp_scalar (pp, "%u", DECL_UID (node));
2325                       pp_character (pp, '>');
2326                     }
2327               }
2328           }
2329       break;
2330 
2331     case TYPE_DECL:
2332       if (DECL_IS_UNDECLARED_BUILTIN (node))
2333           {
2334             /* Don't print the declaration of built-in types.  */
2335             break;
2336           }
2337       if (DECL_NAME (node))
2338           dump_decl_name (pp, node, flags);
2339       else if (TYPE_NAME (TREE_TYPE (node)) != node)
2340           {
2341             pp_string (pp, (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
2342                                 ? "union" : "struct "));
2343             dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2344           }
2345       else
2346           pp_string (pp, "<anon>");
2347       break;
2348 
2349     case VAR_DECL:
2350     case PARM_DECL:
2351     case FIELD_DECL:
2352     case DEBUG_EXPR_DECL:
2353     case NAMESPACE_DECL:
2354     case NAMELIST_DECL:
2355       dump_decl_name (pp, node, flags);
2356       break;
2357 
2358     case RESULT_DECL:
2359       pp_string (pp, "<retval>");
2360       break;
2361 
2362     case COMPONENT_REF:
2363       op0 = TREE_OPERAND (node, 0);
2364       str = ".";
2365       if (op0
2366             && (TREE_CODE (op0) == INDIRECT_REF
2367                 || (TREE_CODE (op0) == MEM_REF
2368                       && TREE_CODE (TREE_OPERAND (op0, 0)) != ADDR_EXPR
2369                       && integer_zerop (TREE_OPERAND (op0, 1))
2370                       /* Dump the types of INTEGER_CSTs explicitly, for we
2371                          can't infer them and MEM_ATTR caching will share
2372                          MEM_REFs with differently-typed op0s.  */
2373                       && TREE_CODE (TREE_OPERAND (op0, 0)) != INTEGER_CST
2374                       /* Released SSA_NAMES have no TREE_TYPE.  */
2375                       && TREE_TYPE (TREE_OPERAND (op0, 0)) != NULL_TREE
2376                       /* Same pointer types, but ignoring POINTER_TYPE vs.
2377                          REFERENCE_TYPE.  */
2378                       && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 0)))
2379                           == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1))))
2380                       && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 0)))
2381                           == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 1))))
2382                       && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 0)))
2383                           == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 1))))
2384                       /* Same value types ignoring qualifiers.  */
2385                       && (TYPE_MAIN_VARIANT (TREE_TYPE (op0))
2386                           == TYPE_MAIN_VARIANT
2387                               (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1)))))
2388                       && MR_DEPENDENCE_CLIQUE (op0) == 0)))
2389           {
2390             op0 = TREE_OPERAND (op0, 0);
2391             str = "->";
2392           }
2393       if (op_prio (op0) < op_prio (node))
2394           pp_left_paren (pp);
2395       dump_generic_node (pp, op0, spc, flags, false);
2396       if (op_prio (op0) < op_prio (node))
2397           pp_right_paren (pp);
2398       pp_string (pp, str);
2399       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2400       op0 = component_ref_field_offset (node);
2401       if (op0 && TREE_CODE (op0) != INTEGER_CST)
2402           {
2403             pp_string (pp, "{off: ");
2404                 dump_generic_node (pp, op0, spc, flags, false);
2405                 pp_right_brace (pp);
2406           }
2407       break;
2408 
2409     case BIT_FIELD_REF:
2410       if (flags & TDF_GIMPLE)
2411           {
2412             pp_string (pp, "__BIT_FIELD_REF <");
2413             dump_generic_node (pp, TREE_TYPE (node),
2414                                    spc, flags | TDF_SLIM, false);
2415             if (TYPE_ALIGN (TREE_TYPE (node))
2416                 != TYPE_ALIGN (TYPE_MAIN_VARIANT (TREE_TYPE (node))))
2417               {
2418                 pp_string (pp, ", ");
2419                 pp_decimal_int (pp, TYPE_ALIGN (TREE_TYPE (node)));
2420               }
2421             pp_greater (pp);
2422             pp_string (pp, " (");
2423             dump_generic_node (pp, TREE_OPERAND (node, 0), spc,
2424                                    flags | TDF_SLIM, false);
2425             pp_string (pp, ", ");
2426             dump_generic_node (pp, TREE_OPERAND (node, 1), spc,
2427                                    flags | TDF_SLIM, false);
2428             pp_string (pp, ", ");
2429             dump_generic_node (pp, TREE_OPERAND (node, 2), spc,
2430                                    flags | TDF_SLIM, false);
2431             pp_right_paren (pp);
2432           }
2433       else
2434           {
2435             pp_string (pp, "BIT_FIELD_REF <");
2436             dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2437             pp_string (pp, ", ");
2438             dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2439             pp_string (pp, ", ");
2440             dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2441             pp_greater (pp);
2442           }
2443       break;
2444 
2445     case BIT_INSERT_EXPR:
2446       pp_string (pp, "BIT_INSERT_EXPR <");
2447       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2448       pp_string (pp, ", ");
2449       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2450       pp_string (pp, ", ");
2451       dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2452       pp_string (pp, " (");
2453       if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (node, 1))))
2454           pp_decimal_int (pp,
2455                               TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (node, 1))));
2456       else
2457           dump_generic_node (pp, TYPE_SIZE (TREE_TYPE (TREE_OPERAND (node, 1))),
2458                                  spc, flags, false);
2459       pp_string (pp, " bits)>");
2460       break;
2461 
2462     case ARRAY_REF:
2463     case ARRAY_RANGE_REF:
2464       op0 = TREE_OPERAND (node, 0);
2465       if (op_prio (op0) < op_prio (node))
2466           pp_left_paren (pp);
2467       dump_generic_node (pp, op0, spc, flags, false);
2468       if (op_prio (op0) < op_prio (node))
2469           pp_right_paren (pp);
2470       pp_left_bracket (pp);
2471       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2472       if (TREE_CODE (node) == ARRAY_RANGE_REF)
2473           pp_string (pp, " ...");
2474       pp_right_bracket (pp);
2475 
2476       op0 = array_ref_low_bound (node);
2477       op1 = array_ref_element_size (node);
2478 
2479       if (!integer_zerop (op0)
2480             || TREE_OPERAND (node, 2)
2481             || TREE_OPERAND (node, 3))
2482           {
2483             pp_string (pp, "{lb: ");
2484             dump_generic_node (pp, op0, spc, flags, false);
2485             pp_string (pp, " sz: ");
2486             dump_generic_node (pp, op1, spc, flags, false);
2487             pp_right_brace (pp);
2488           }
2489       break;
2490 
2491     case CONSTRUCTOR:
2492       {
2493           unsigned HOST_WIDE_INT ix;
2494           tree field, val;
2495           bool is_struct_init = false;
2496           bool is_array_init = false;
2497           widest_int curidx;
2498           if (flags & TDF_GIMPLE)
2499             {
2500               pp_string (pp, "_Literal (");
2501               dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2502               pp_string (pp, ") ");
2503             }
2504           pp_left_brace (pp);
2505           if (TREE_CLOBBER_P (node))
2506             {
2507               pp_string (pp, "CLOBBER");
2508               if (CLOBBER_KIND (node) == CLOBBER_EOL)
2509                 pp_string (pp, "(eol)");
2510             }
2511           else if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
2512                      || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
2513             is_struct_init = true;
2514         else if (TREE_CODE (TREE_TYPE (node)) == ARRAY_TYPE
2515                      && TYPE_DOMAIN (TREE_TYPE (node))
2516                      && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)))
2517                      && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node))))
2518                         == INTEGER_CST)
2519             {
2520               tree minv = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)));
2521               is_array_init = true;
2522               curidx = wi::to_widest (minv);
2523             }
2524           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
2525             {
2526               if (field)
2527                 {
2528                     if (is_struct_init)
2529                       {
2530                         pp_dot (pp);
2531                         dump_generic_node (pp, field, spc, flags, false);
2532                         pp_equal (pp);
2533                       }
2534                     else if (is_array_init
2535                                && (TREE_CODE (field) != INTEGER_CST
2536                                    || curidx != wi::to_widest (field)))
2537                       {
2538                         pp_left_bracket (pp);
2539                         if (TREE_CODE (field) == RANGE_EXPR)
2540                           {
2541                               dump_generic_node (pp, TREE_OPERAND (field, 0), spc,
2542                                                      flags, false);
2543                               pp_string (pp, " ... ");
2544                               dump_generic_node (pp, TREE_OPERAND (field, 1), spc,
2545                                                      flags, false);
2546                               if (TREE_CODE (TREE_OPERAND (field, 1)) == INTEGER_CST)
2547                                 curidx = wi::to_widest (TREE_OPERAND (field, 1));
2548                           }
2549                         else
2550                           dump_generic_node (pp, field, spc, flags, false);
2551                         if (TREE_CODE (field) == INTEGER_CST)
2552                           curidx = wi::to_widest (field);
2553                         pp_string (pp, "]=");
2554                       }
2555                 }
2556             if (is_array_init)
2557                 curidx += 1;
2558               if (val && TREE_CODE (val) == ADDR_EXPR)
2559                 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
2560                     val = TREE_OPERAND (val, 0);
2561               if (val && TREE_CODE (val) == FUNCTION_DECL)
2562                     dump_decl_name (pp, val, flags);
2563               else
2564                     dump_generic_node (pp, val, spc, flags, false);
2565               if (ix != CONSTRUCTOR_NELTS (node) - 1)
2566                 {
2567                     pp_comma (pp);
2568                     pp_space (pp);
2569                 }
2570             }
2571           pp_right_brace (pp);
2572       }
2573       break;
2574 
2575     case COMPOUND_EXPR:
2576       {
2577           tree *tp;
2578           if (flags & TDF_SLIM)
2579             {
2580               pp_string (pp, "<COMPOUND_EXPR>");
2581               break;
2582             }
2583 
2584           dump_generic_node (pp, TREE_OPERAND (node, 0),
2585                                  spc, flags, !(flags & TDF_SLIM));
2586           if (flags & TDF_SLIM)
2587             newline_and_indent (pp, spc);
2588           else
2589             {
2590               pp_comma (pp);
2591               pp_space (pp);
2592             }
2593 
2594           for (tp = &TREE_OPERAND (node, 1);
2595                TREE_CODE (*tp) == COMPOUND_EXPR;
2596                tp = &TREE_OPERAND (*tp, 1))
2597             {
2598               dump_generic_node (pp, TREE_OPERAND (*tp, 0),
2599                                      spc, flags, !(flags & TDF_SLIM));
2600               if (flags & TDF_SLIM)
2601                 newline_and_indent (pp, spc);
2602               else
2603                 {
2604                   pp_comma (pp);
2605                   pp_space (pp);
2606                 }
2607             }
2608 
2609           dump_generic_node (pp, *tp, spc, flags, !(flags & TDF_SLIM));
2610       }
2611       break;
2612 
2613     case STATEMENT_LIST:
2614       {
2615           tree_stmt_iterator si;
2616           bool first = true;
2617 
2618           if (flags & TDF_SLIM)
2619             {
2620               pp_string (pp, "<STATEMENT_LIST>");
2621               break;
2622             }
2623 
2624           for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
2625             {
2626               if (!first)
2627                 newline_and_indent (pp, spc);
2628               else
2629                 first = false;
2630               dump_generic_node (pp, tsi_stmt (si), spc, flags, true);
2631             }
2632       }
2633       break;
2634 
2635     case MODIFY_EXPR:
2636     case INIT_EXPR:
2637       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags,
2638                                false);
2639       pp_space (pp);
2640       pp_equal (pp);
2641       pp_space (pp);
2642       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags,
2643                                false);
2644       break;
2645 
2646     case TARGET_EXPR:
2647       pp_string (pp, "TARGET_EXPR <");
2648       dump_generic_node (pp, TARGET_EXPR_SLOT (node), spc, flags, false);
2649       pp_comma (pp);
2650       pp_space (pp);
2651       dump_generic_node (pp, TARGET_EXPR_INITIAL (node), spc, flags, false);
2652       pp_greater (pp);
2653       break;
2654 
2655     case DECL_EXPR:
2656       print_declaration (pp, DECL_EXPR_DECL (node), spc, flags);
2657       is_stmt = false;
2658       break;
2659 
2660     case COND_EXPR:
2661       if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
2662           {
2663             pp_string (pp, "if (");
2664             dump_generic_node (pp, COND_EXPR_COND (node), spc, flags, false);
2665             pp_right_paren (pp);
2666             /* The lowered cond_exprs should always be printed in full.  */
2667             if (COND_EXPR_THEN (node)
2668                 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
2669                       || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
2670                 && COND_EXPR_ELSE (node)
2671                 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
2672                       || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
2673               {
2674                 pp_space (pp);
2675                 dump_generic_node (pp, COND_EXPR_THEN (node),
2676                                          0, flags, true);
2677                 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
2678                     {
2679                       pp_string (pp, " else ");
2680                       dump_generic_node (pp, COND_EXPR_ELSE (node),
2681                                              0, flags, true);
2682                     }
2683               }
2684             else if (!(flags & TDF_SLIM))
2685               {
2686                 /* Output COND_EXPR_THEN.  */
2687                 if (COND_EXPR_THEN (node))
2688                     {
2689                       newline_and_indent (pp, spc+2);
2690                       pp_left_brace (pp);
2691                       newline_and_indent (pp, spc+4);
2692                       dump_generic_node (pp, COND_EXPR_THEN (node), spc+4,
2693                                              flags, true);
2694                       newline_and_indent (pp, spc+2);
2695                       pp_right_brace (pp);
2696                     }
2697 
2698                 /* Output COND_EXPR_ELSE.  */
2699                 if (COND_EXPR_ELSE (node)
2700                       && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
2701                     {
2702                       newline_and_indent (pp, spc);
2703                       pp_string (pp, "else");
2704                       newline_and_indent (pp, spc+2);
2705                       pp_left_brace (pp);
2706                       newline_and_indent (pp, spc+4);
2707                       dump_generic_node (pp, COND_EXPR_ELSE (node), spc+4,
2708                                            flags, true);
2709                       newline_and_indent (pp, spc+2);
2710                       pp_right_brace (pp);
2711                     }
2712               }
2713             is_expr = false;
2714           }
2715       else
2716           {
2717             dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2718             pp_space (pp);
2719             pp_question (pp);
2720             pp_space (pp);
2721             dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2722             pp_space (pp);
2723             pp_colon (pp);
2724             pp_space (pp);
2725             dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2726           }
2727       break;
2728 
2729     case BIND_EXPR:
2730       pp_left_brace (pp);
2731       if (!(flags & TDF_SLIM))
2732           {
2733             if (BIND_EXPR_VARS (node))
2734               {
2735                 pp_newline (pp);
2736 
2737                 for (op0 = BIND_EXPR_VARS (node); op0; op0 = DECL_CHAIN (op0))
2738                     {
2739                       print_declaration (pp, op0, spc+2, flags);
2740                       pp_newline (pp);
2741                     }
2742               }
2743 
2744             newline_and_indent (pp, spc+2);
2745             dump_generic_node (pp, BIND_EXPR_BODY (node), spc+2, flags, true);
2746             newline_and_indent (pp, spc);
2747             pp_right_brace (pp);
2748           }
2749       is_expr = false;
2750       break;
2751 
2752     case CALL_EXPR:
2753       if (CALL_EXPR_FN (node) != NULL_TREE)
2754           print_call_name (pp, CALL_EXPR_FN (node), flags);
2755       else
2756           {
2757             pp_dot (pp);
2758             pp_string (pp, internal_fn_name (CALL_EXPR_IFN (node)));
2759           }
2760 
2761       /* Print parameters.  */
2762       pp_space (pp);
2763       pp_left_paren (pp);
2764       {
2765           tree arg;
2766           call_expr_arg_iterator iter;
2767           FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
2768             {
2769               dump_generic_node (pp, arg, spc, flags, false);
2770               if (more_call_expr_args_p (&iter))
2771                 {
2772                     pp_comma (pp);
2773                     pp_space (pp);
2774                 }
2775             }
2776       }
2777       if (CALL_EXPR_VA_ARG_PACK (node))
2778           {
2779             if (call_expr_nargs (node) > 0)
2780               {
2781                 pp_comma (pp);
2782                 pp_space (pp);
2783               }
2784             pp_string (pp, "__builtin_va_arg_pack ()");
2785           }
2786       pp_right_paren (pp);
2787 
2788       op1 = CALL_EXPR_STATIC_CHAIN (node);
2789       if (op1)
2790           {
2791             pp_string (pp, " [static-chain: ");
2792             dump_generic_node (pp, op1, spc, flags, false);
2793             pp_right_bracket (pp);
2794           }
2795 
2796       if (CALL_EXPR_RETURN_SLOT_OPT (node))
2797           pp_string (pp, " [return slot optimization]");
2798       if (CALL_EXPR_TAILCALL (node))
2799           pp_string (pp, " [tail call]");
2800       break;
2801 
2802     case WITH_CLEANUP_EXPR:
2803       NIY;
2804       break;
2805 
2806     case CLEANUP_POINT_EXPR:
2807       pp_string (pp, "<<cleanup_point ");
2808       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2809       pp_string (pp, ">>");
2810       break;
2811 
2812     case PLACEHOLDER_EXPR:
2813       pp_string (pp, "<PLACEHOLDER_EXPR ");
2814       dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2815       pp_greater (pp);
2816       break;
2817 
2818       /* Binary arithmetic and logic expressions.  */
2819     case WIDEN_PLUS_EXPR:
2820     case WIDEN_MINUS_EXPR:
2821     case WIDEN_SUM_EXPR:
2822     case WIDEN_MULT_EXPR:
2823     case MULT_EXPR:
2824     case MULT_HIGHPART_EXPR:
2825     case PLUS_EXPR:
2826     case POINTER_PLUS_EXPR:
2827     case POINTER_DIFF_EXPR:
2828     case MINUS_EXPR:
2829     case TRUNC_DIV_EXPR:
2830     case CEIL_DIV_EXPR:
2831     case FLOOR_DIV_EXPR:
2832     case ROUND_DIV_EXPR:
2833     case TRUNC_MOD_EXPR:
2834     case CEIL_MOD_EXPR:
2835     case FLOOR_MOD_EXPR:
2836     case ROUND_MOD_EXPR:
2837     case RDIV_EXPR:
2838     case EXACT_DIV_EXPR:
2839     case LSHIFT_EXPR:
2840     case RSHIFT_EXPR:
2841     case LROTATE_EXPR:
2842     case RROTATE_EXPR:
2843     case WIDEN_LSHIFT_EXPR:
2844     case BIT_IOR_EXPR:
2845     case BIT_XOR_EXPR:
2846     case BIT_AND_EXPR:
2847     case TRUTH_ANDIF_EXPR:
2848     case TRUTH_ORIF_EXPR:
2849     case TRUTH_AND_EXPR:
2850     case TRUTH_OR_EXPR:
2851     case TRUTH_XOR_EXPR:
2852     case LT_EXPR:
2853     case LE_EXPR:
2854     case GT_EXPR:
2855     case GE_EXPR:
2856     case EQ_EXPR:
2857     case NE_EXPR:
2858     case UNLT_EXPR:
2859     case UNLE_EXPR:
2860     case UNGT_EXPR:
2861     case UNGE_EXPR:
2862     case UNEQ_EXPR:
2863     case LTGT_EXPR:
2864     case ORDERED_EXPR:
2865     case UNORDERED_EXPR:
2866       {
2867           const char *op = op_symbol (node);
2868           op0 = TREE_OPERAND (node, 0);
2869           op1 = TREE_OPERAND (node, 1);
2870 
2871           /* When the operands are expressions with less priority,
2872              keep semantics of the tree representation.  */
2873           if (op_prio (op0) <= op_prio (node))
2874             {
2875               pp_left_paren (pp);
2876               dump_generic_node (pp, op0, spc, flags, false);
2877               pp_right_paren (pp);
2878             }
2879           else
2880             dump_generic_node (pp, op0, spc, flags, false);
2881 
2882           pp_space (pp);
2883           pp_string (pp, op);
2884           pp_space (pp);
2885 
2886           /* When the operands are expressions with less priority,
2887              keep semantics of the tree representation.  */
2888           if (op_prio (op1) <= op_prio (node))
2889             {
2890               pp_left_paren (pp);
2891               dump_generic_node (pp, op1, spc, flags, false);
2892               pp_right_paren (pp);
2893             }
2894           else
2895             dump_generic_node (pp, op1, spc, flags, false);
2896       }
2897       break;
2898 
2899       /* Unary arithmetic and logic expressions.  */
2900     case ADDR_EXPR:
2901       if (flags & TDF_GIMPLE_VAL)
2902           {
2903             pp_string (pp, "_Literal (");
2904             dump_generic_node (pp, TREE_TYPE (node), spc,
2905                                    flags & ~TDF_GIMPLE_VAL, false);
2906             pp_character (pp, ')');
2907           }
2908       /* Fallthru.  */
2909     case NEGATE_EXPR:
2910     case BIT_NOT_EXPR:
2911     case TRUTH_NOT_EXPR:
2912     case PREDECREMENT_EXPR:
2913     case PREINCREMENT_EXPR:
2914     case INDIRECT_REF:
2915       if (!(flags & TDF_GIMPLE)
2916             && TREE_CODE (node) == ADDR_EXPR
2917             && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
2918                 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
2919           /* Do not output '&' for strings and function pointers when not
2920              dumping GIMPLE FE syntax.  */
2921           ;
2922       else
2923           pp_string (pp, op_symbol (node));
2924 
2925       if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
2926           {
2927             pp_left_paren (pp);
2928             dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2929             pp_right_paren (pp);
2930           }
2931       else
2932           dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2933       break;
2934 
2935     case POSTDECREMENT_EXPR:
2936     case POSTINCREMENT_EXPR:
2937       if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
2938           {
2939             pp_left_paren (pp);
2940             dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2941             pp_right_paren (pp);
2942           }
2943       else
2944           dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2945       pp_string (pp, op_symbol (node));
2946       break;
2947 
2948     case MIN_EXPR:
2949       pp_string (pp, "MIN_EXPR <");
2950       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2951       pp_string (pp, ", ");
2952       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2953       pp_greater (pp);
2954       break;
2955 
2956     case MAX_EXPR:
2957       pp_string (pp, "MAX_EXPR <");
2958       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2959       pp_string (pp, ", ");
2960       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2961       pp_greater (pp);
2962       break;
2963 
2964     case ABS_EXPR:
2965       pp_string (pp, "ABS_EXPR <");
2966       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2967       pp_greater (pp);
2968       break;
2969 
2970     case ABSU_EXPR:
2971       pp_string (pp, "ABSU_EXPR <");
2972       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2973       pp_greater (pp);
2974       break;
2975 
2976     case RANGE_EXPR:
2977       NIY;
2978       break;
2979 
2980     case ADDR_SPACE_CONVERT_EXPR:
2981     case FIXED_CONVERT_EXPR:
2982     case FIX_TRUNC_EXPR:
2983     case FLOAT_EXPR:
2984     CASE_CONVERT:
2985       type = TREE_TYPE (node);
2986       op0 = TREE_OPERAND (node, 0);
2987       if (type != TREE_TYPE (op0))
2988           {
2989             pp_left_paren (pp);
2990             dump_generic_node (pp, type, spc, flags, false);
2991             pp_string (pp, ") ");
2992           }
2993       if (op_prio (op0) < op_prio (node))
2994           pp_left_paren (pp);
2995       dump_generic_node (pp, op0, spc, flags, false);
2996       if (op_prio (op0) < op_prio (node))
2997           pp_right_paren (pp);
2998       break;
2999 
3000     case VIEW_CONVERT_EXPR:
3001       if (flags & TDF_GIMPLE)
3002           pp_string (pp, "__VIEW_CONVERT <");
3003       else
3004           pp_string (pp, "VIEW_CONVERT_EXPR<");
3005       dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
3006       pp_string (pp, ">(");
3007       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3008       pp_right_paren (pp);
3009       break;
3010 
3011     case PAREN_EXPR:
3012       pp_string (pp, "((");
3013       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3014       pp_string (pp, "))");
3015       break;
3016 
3017     case NON_LVALUE_EXPR:
3018       pp_string (pp, "NON_LVALUE_EXPR <");
3019       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3020       pp_greater (pp);
3021       break;
3022 
3023     case SAVE_EXPR:
3024       pp_string (pp, "SAVE_EXPR <");
3025       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3026       pp_greater (pp);
3027       break;
3028 
3029     case COMPLEX_EXPR:
3030       pp_string (pp, "COMPLEX_EXPR <");
3031       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3032       pp_string (pp, ", ");
3033       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3034       pp_greater (pp);
3035       break;
3036 
3037     case CONJ_EXPR:
3038       pp_string (pp, "CONJ_EXPR <");
3039       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3040       pp_greater (pp);
3041       break;
3042 
3043     case REALPART_EXPR:
3044       if (flags & TDF_GIMPLE)
3045           {
3046             pp_string (pp, "__real ");
3047             dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3048           }
3049       else
3050           {
3051             pp_string (pp, "REALPART_EXPR <");
3052             dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3053             pp_greater (pp);
3054           }
3055       break;
3056 
3057     case IMAGPART_EXPR:
3058       if (flags & TDF_GIMPLE)
3059           {
3060             pp_string (pp, "__imag ");
3061             dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3062           }
3063       else
3064           {
3065             pp_string (pp, "IMAGPART_EXPR <");
3066             dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3067             pp_greater (pp);
3068           }
3069       break;
3070 
3071     case VA_ARG_EXPR:
3072       pp_string (pp, "VA_ARG_EXPR <");
3073       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3074       pp_greater (pp);
3075       break;
3076 
3077     case TRY_FINALLY_EXPR:
3078     case TRY_CATCH_EXPR:
3079       pp_string (pp, "try");
3080       newline_and_indent (pp, spc+2);
3081       pp_left_brace (pp);
3082       newline_and_indent (pp, spc+4);
3083       dump_generic_node (pp, TREE_OPERAND (node, 0), spc+4, flags, true);
3084       newline_and_indent (pp, spc+2);
3085       pp_right_brace (pp);
3086       newline_and_indent (pp, spc);
3087       if (TREE_CODE (node) == TRY_CATCH_EXPR)
3088           {
3089             node = TREE_OPERAND (node, 1);
3090             pp_string (pp, "catch");
3091           }
3092       else
3093           {
3094             gcc_assert (TREE_CODE (node) == TRY_FINALLY_EXPR);
3095             node = TREE_OPERAND (node, 1);
3096             pp_string (pp, "finally");
3097             if (TREE_CODE (node) == EH_ELSE_EXPR)
3098               {
3099                 newline_and_indent (pp, spc+2);
3100                 pp_left_brace (pp);
3101                 newline_and_indent (pp, spc+4);
3102                 dump_generic_node (pp, TREE_OPERAND (node, 0), spc+4,
3103                                          flags, true);
3104                 newline_and_indent (pp, spc+2);
3105                 pp_right_brace (pp);
3106                 newline_and_indent (pp, spc);
3107                 node = TREE_OPERAND (node, 1);
3108                 pp_string (pp, "else");
3109               }
3110           }
3111       newline_and_indent (pp, spc+2);
3112       pp_left_brace (pp);
3113       newline_and_indent (pp, spc+4);
3114       dump_generic_node (pp, node, spc+4, flags, true);
3115       newline_and_indent (pp, spc+2);
3116       pp_right_brace (pp);
3117       is_expr = false;
3118       break;
3119 
3120     case CATCH_EXPR:
3121       pp_string (pp, "catch (");
3122       dump_generic_node (pp, CATCH_TYPES (node), spc+2, flags, false);
3123       pp_right_paren (pp);
3124       newline_and_indent (pp, spc+2);
3125       pp_left_brace (pp);
3126       newline_and_indent (pp, spc+4);
3127       dump_generic_node (pp, CATCH_BODY (node), spc+4, flags, true);
3128       newline_and_indent (pp, spc+2);
3129       pp_right_brace (pp);
3130       is_expr = false;
3131       break;
3132 
3133     case EH_FILTER_EXPR:
3134       pp_string (pp, "<<<eh_filter (");
3135       dump_generic_node (pp, EH_FILTER_TYPES (node), spc+2, flags, false);
3136       pp_string (pp, ")>>>");
3137       newline_and_indent (pp, spc+2);
3138       pp_left_brace (pp);
3139       newline_and_indent (pp, spc+4);
3140       dump_generic_node (pp, EH_FILTER_FAILURE (node), spc+4, flags, true);
3141       newline_and_indent (pp, spc+2);
3142       pp_right_brace (pp);
3143       is_expr = false;
3144       break;
3145 
3146     case LABEL_EXPR:
3147       op0 = TREE_OPERAND (node, 0);
3148       /* If this is for break or continue, don't bother printing it.  */
3149       if (DECL_NAME (op0))
3150           {
3151             const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
3152             if (strcmp (name, "break") == 0
3153                 || strcmp (name, "continue") == 0)
3154               break;
3155           }
3156       dump_generic_node (pp, op0, spc, flags, false);
3157       pp_colon (pp);
3158       if (DECL_NONLOCAL (op0))
3159           pp_string (pp, " [non-local]");
3160       break;
3161 
3162     case LOOP_EXPR:
3163       pp_string (pp, "while (1)");
3164       if (!(flags & TDF_SLIM))
3165           {
3166             newline_and_indent (pp, spc+2);
3167             pp_left_brace (pp);
3168             newline_and_indent (pp, spc+4);
3169             dump_generic_node (pp, LOOP_EXPR_BODY (node), spc+4, flags, true);
3170             newline_and_indent (pp, spc+2);
3171             pp_right_brace (pp);
3172           }
3173       is_expr = false;
3174       break;
3175 
3176     case PREDICT_EXPR:
3177       pp_string (pp, "// predicted ");
3178       if (PREDICT_EXPR_OUTCOME (node))
3179         pp_string (pp, "likely by ");
3180       else
3181         pp_string (pp, "unlikely by ");
3182       pp_string (pp, predictor_name (PREDICT_EXPR_PREDICTOR (node)));
3183       pp_string (pp, " predictor.");
3184       break;
3185 
3186     case ANNOTATE_EXPR:
3187       pp_string (pp, "ANNOTATE_EXPR <");
3188       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3189       switch ((enum annot_expr_kind) TREE_INT_CST_LOW (TREE_OPERAND (node, 1)))
3190           {
3191           case annot_expr_ivdep_kind:
3192             pp_string (pp, ", ivdep");
3193             break;
3194           case annot_expr_unroll_kind:
3195             {
3196               pp_string (pp, ", unroll ");
3197               pp_decimal_int (pp,
3198                                   (int) TREE_INT_CST_LOW (TREE_OPERAND (node, 2)));
3199               break;
3200             }
3201           case annot_expr_no_vector_kind:
3202             pp_string (pp, ", no-vector");
3203             break;
3204           case annot_expr_vector_kind:
3205             pp_string (pp, ", vector");
3206             break;
3207           case annot_expr_parallel_kind:
3208             pp_string (pp, ", parallel");
3209             break;
3210           default:
3211             gcc_unreachable ();
3212           }
3213       pp_greater (pp);
3214       break;
3215 
3216     case RETURN_EXPR:
3217       pp_string (pp, "return");
3218       op0 = TREE_OPERAND (node, 0);
3219       if (op0)
3220           {
3221             pp_space (pp);
3222             if (TREE_CODE (op0) == MODIFY_EXPR)
3223               dump_generic_node (pp, TREE_OPERAND (op0, 1),
3224                                      spc, flags, false);
3225             else
3226               dump_generic_node (pp, op0, spc, flags, false);
3227           }
3228       break;
3229 
3230     case EXIT_EXPR:
3231       pp_string (pp, "if (");
3232       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3233       pp_string (pp, ") break");
3234       break;
3235 
3236     case SWITCH_EXPR:
3237       pp_string (pp, "switch (");
3238       dump_generic_node (pp, SWITCH_COND (node), spc, flags, false);
3239       pp_right_paren (pp);
3240       if (!(flags & TDF_SLIM))
3241           {
3242             newline_and_indent (pp, spc+2);
3243             pp_left_brace (pp);
3244             if (SWITCH_BODY (node))
3245               {
3246                 newline_and_indent (pp, spc+4);
3247                 dump_generic_node (pp, SWITCH_BODY (node), spc+4, flags,
3248                                      true);
3249               }
3250             newline_and_indent (pp, spc+2);
3251             pp_right_brace (pp);
3252           }
3253       is_expr = false;
3254       break;
3255 
3256     case GOTO_EXPR:
3257       op0 = GOTO_DESTINATION (node);
3258       if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
3259           {
3260             const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
3261             if (strcmp (name, "break") == 0
3262                 || strcmp (name, "continue") == 0)
3263               {
3264                 pp_string (pp, name);
3265                 break;
3266               }
3267           }
3268       pp_string (pp, "goto ");
3269       dump_generic_node (pp, op0, spc, flags, false);
3270       break;
3271 
3272     case ASM_EXPR:
3273       pp_string (pp, "__asm__");
3274       if (ASM_VOLATILE_P (node))
3275           pp_string (pp, " __volatile__");
3276       pp_left_paren (pp);
3277       dump_generic_node (pp, ASM_STRING (node), spc, flags, false);
3278       pp_colon (pp);
3279       dump_generic_node (pp, ASM_OUTPUTS (node), spc, flags, false);
3280       pp_colon (pp);
3281       dump_generic_node (pp, ASM_INPUTS (node), spc, flags, false);
3282       if (ASM_CLOBBERS (node))
3283           {
3284             pp_colon (pp);
3285             dump_generic_node (pp, ASM_CLOBBERS (node), spc, flags, false);
3286           }
3287       pp_right_paren (pp);
3288       break;
3289 
3290     case CASE_LABEL_EXPR:
3291       if (CASE_LOW (node) && CASE_HIGH (node))
3292           {
3293             pp_string (pp, "case ");
3294             dump_generic_node (pp, CASE_LOW (node), spc, flags, false);
3295             pp_string (pp, " ... ");
3296             dump_generic_node (pp, CASE_HIGH (node), spc, flags, false);
3297           }
3298       else if (CASE_LOW (node))
3299           {
3300             pp_string (pp, "case ");
3301             dump_generic_node (pp, CASE_LOW (node), spc, flags, false);
3302           }
3303       else
3304           pp_string (pp, "default");
3305       pp_colon (pp);
3306       break;
3307 
3308     case OBJ_TYPE_REF:
3309       pp_string (pp, "OBJ_TYPE_REF(");
3310       dump_generic_node (pp, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
3311       pp_semicolon (pp);
3312       /* We omit the class type for -fcompare-debug because we may
3313            drop TYPE_BINFO early depending on debug info, and then
3314            virtual_method_call_p would return false, whereas when
3315            TYPE_BINFO is preserved it may still return true and then
3316            we'd print the class type.  Compare tree and rtl dumps for
3317            libstdc++-prettyprinters/shared_ptr.cc with and without -g,
3318            for example, at occurrences of OBJ_TYPE_REF.  */
3319       if (!(flags & (TDF_SLIM | TDF_COMPARE_DEBUG))
3320             && virtual_method_call_p (node, true))
3321           {
3322             pp_string (pp, "(");
3323             dump_generic_node (pp, obj_type_ref_class (node, true),
3324                                    spc, flags, false);
3325             pp_string (pp, ")");
3326           }
3327       dump_generic_node (pp, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
3328       pp_arrow (pp);
3329       dump_generic_node (pp, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
3330       pp_right_paren (pp);
3331       break;
3332 
3333     case SSA_NAME:
3334       if (SSA_NAME_IDENTIFIER (node))
3335           {
3336             if ((flags & TDF_NOUID)
3337                 && SSA_NAME_VAR (node)
3338                 && DECL_NAMELESS (SSA_NAME_VAR (node)))
3339               dump_fancy_name (pp, SSA_NAME_IDENTIFIER (node));
3340             else if (! (flags & TDF_GIMPLE)
3341                        || SSA_NAME_VAR (node))
3342               dump_generic_node (pp, SSA_NAME_IDENTIFIER (node),
3343                                      spc, flags, false);
3344           }
3345       pp_underscore (pp);
3346       pp_decimal_int (pp, SSA_NAME_VERSION (node));
3347       if (SSA_NAME_IS_DEFAULT_DEF (node))
3348           pp_string (pp, "(D)");
3349       if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
3350           pp_string (pp, "(ab)");
3351       break;
3352 
3353     case WITH_SIZE_EXPR:
3354       pp_string (pp, "WITH_SIZE_EXPR <");
3355       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3356       pp_string (pp, ", ");
3357       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3358       pp_greater (pp);
3359       break;
3360 
3361     case ASSERT_EXPR:
3362       pp_string (pp, "ASSERT_EXPR <");
3363       dump_generic_node (pp, ASSERT_EXPR_VAR (node), spc, flags, false);
3364       pp_string (pp, ", ");
3365       dump_generic_node (pp, ASSERT_EXPR_COND (node), spc, flags, false);
3366       pp_greater (pp);
3367       break;
3368 
3369     case SCEV_KNOWN:
3370       pp_string (pp, "scev_known");
3371       break;
3372 
3373     case SCEV_NOT_KNOWN:
3374       pp_string (pp, "scev_not_known");
3375       break;
3376 
3377     case POLYNOMIAL_CHREC:
3378       pp_left_brace (pp);
3379       dump_generic_node (pp, CHREC_LEFT (node), spc, flags, false);
3380       pp_string (pp, ", +, ");
3381       dump_generic_node (pp, CHREC_RIGHT (node), spc, flags, false);
3382       pp_string (pp, "}_");
3383       pp_scalar (pp, "%u", CHREC_VARIABLE (node));
3384       is_stmt = false;
3385       break;
3386 
3387     case REALIGN_LOAD_EXPR:
3388       pp_string (pp, "REALIGN_LOAD <");
3389       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3390       pp_string (pp, ", ");
3391       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3392       pp_string (pp, ", ");
3393       dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3394       pp_greater (pp);
3395       break;
3396 
3397     case VEC_COND_EXPR:
3398       pp_string (pp, " VEC_COND_EXPR < ");
3399       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3400       pp_string (pp, " , ");
3401       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3402       pp_string (pp, " , ");
3403       dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3404       pp_string (pp, " > ");
3405       break;
3406 
3407     case VEC_PERM_EXPR:
3408       pp_string (pp, " VEC_PERM_EXPR < ");
3409       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3410       pp_string (pp, " , ");
3411       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3412       pp_string (pp, " , ");
3413       dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3414       pp_string (pp, " > ");
3415       break;
3416 
3417     case DOT_PROD_EXPR:
3418       pp_string (pp, " DOT_PROD_EXPR < ");
3419       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3420       pp_string (pp, ", ");
3421       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3422       pp_string (pp, ", ");
3423       dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3424       pp_string (pp, " > ");
3425       break;
3426 
3427     case WIDEN_MULT_PLUS_EXPR:
3428       pp_string (pp, " WIDEN_MULT_PLUS_EXPR < ");
3429       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3430       pp_string (pp, ", ");
3431       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3432       pp_string (pp, ", ");
3433       dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3434       pp_string (pp, " > ");
3435       break;
3436 
3437     case WIDEN_MULT_MINUS_EXPR:
3438       pp_string (pp, " WIDEN_MULT_MINUS_EXPR < ");
3439       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3440       pp_string (pp, ", ");
3441       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3442       pp_string (pp, ", ");
3443       dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3444       pp_string (pp, " > ");
3445       break;
3446 
3447     case OACC_PARALLEL:
3448       pp_string (pp, "#pragma acc parallel");
3449       goto dump_omp_clauses_body;
3450 
3451     case OACC_KERNELS:
3452       pp_string (pp, "#pragma acc kernels");
3453       goto dump_omp_clauses_body;
3454 
3455     case OACC_SERIAL:
3456       pp_string (pp, "#pragma acc serial");
3457       goto dump_omp_clauses_body;
3458 
3459     case OACC_DATA:
3460       pp_string (pp, "#pragma acc data");
3461       dump_omp_clauses (pp, OACC_DATA_CLAUSES (node), spc, flags);
3462       goto dump_omp_body;
3463 
3464     case OACC_HOST_DATA:
3465       pp_string (pp, "#pragma acc host_data");
3466       dump_omp_clauses (pp, OACC_HOST_DATA_CLAUSES (node), spc, flags);
3467       goto dump_omp_body;
3468 
3469     case OACC_DECLARE:
3470       pp_string (pp, "#pragma acc declare");
3471       dump_omp_clauses (pp, OACC_DECLARE_CLAUSES (node), spc, flags);
3472       break;
3473 
3474     case OACC_UPDATE:
3475       pp_string (pp, "#pragma acc update");
3476       dump_omp_clauses (pp, OACC_UPDATE_CLAUSES (node), spc, flags);
3477       break;
3478 
3479     case OACC_ENTER_DATA:
3480       pp_string (pp, "#pragma acc enter data");
3481       dump_omp_clauses (pp, OACC_ENTER_DATA_CLAUSES (node), spc, flags);
3482       break;
3483 
3484     case OACC_EXIT_DATA:
3485       pp_string (pp, "#pragma acc exit data");
3486       dump_omp_clauses (pp, OACC_EXIT_DATA_CLAUSES (node), spc, flags);
3487       break;
3488 
3489     case OACC_CACHE:
3490       pp_string (pp, "#pragma acc cache");
3491       dump_omp_clauses (pp, OACC_CACHE_CLAUSES (node), spc, flags);
3492       break;
3493 
3494     case OMP_PARALLEL:
3495       pp_string (pp, "#pragma omp parallel");
3496       dump_omp_clauses (pp, OMP_PARALLEL_CLAUSES (node), spc, flags);
3497       goto dump_omp_body;
3498 
3499     dump_omp_clauses_body:
3500       dump_omp_clauses (pp, OMP_CLAUSES (node), spc, flags);
3501       goto dump_omp_body;
3502 
3503     dump_omp_body:
3504       if (!(flags & TDF_SLIM) && OMP_BODY (node))
3505           {
3506             newline_and_indent (pp, spc + 2);
3507             pp_left_brace (pp);
3508             newline_and_indent (pp, spc + 4);
3509             dump_generic_node (pp, OMP_BODY (node), spc + 4, flags, false);
3510             newline_and_indent (pp, spc + 2);
3511             pp_right_brace (pp);
3512           }
3513       is_expr = false;
3514       break;
3515 
3516     case OMP_TASK:
3517       pp_string (pp, OMP_TASK_BODY (node) ? "#pragma omp task"
3518                                                     : "#pragma omp taskwait");
3519       dump_omp_clauses (pp, OMP_TASK_CLAUSES (node), spc, flags);
3520       goto dump_omp_body;
3521 
3522     case OMP_FOR:
3523       pp_string (pp, "#pragma omp for");
3524       goto dump_omp_loop;
3525 
3526     case OMP_SIMD:
3527       pp_string (pp, "#pragma omp simd");
3528       goto dump_omp_loop;
3529 
3530     case OMP_DISTRIBUTE:
3531       pp_string (pp, "#pragma omp distribute");
3532       goto dump_omp_loop;
3533 
3534     case OMP_TASKLOOP:
3535       pp_string (pp, "#pragma omp taskloop");
3536       goto dump_omp_loop;
3537 
3538     case OMP_LOOP:
3539       pp_string (pp, "#pragma omp loop");
3540       goto dump_omp_loop;
3541 
3542     case OACC_LOOP:
3543       pp_string (pp, "#pragma acc loop");
3544       goto dump_omp_loop;
3545 
3546     case OMP_TEAMS:
3547       pp_string (pp, "#pragma omp teams");
3548       dump_omp_clauses (pp, OMP_TEAMS_CLAUSES (node), spc, flags);
3549       goto dump_omp_body;
3550 
3551     case OMP_TARGET_DATA:
3552       pp_string (pp, "#pragma omp target data");
3553       dump_omp_clauses (pp, OMP_TARGET_DATA_CLAUSES (node), spc, flags);
3554       goto dump_omp_body;
3555 
3556     case OMP_TARGET_ENTER_DATA:
3557       pp_string (pp, "#pragma omp target enter data");
3558       dump_omp_clauses (pp, OMP_TARGET_ENTER_DATA_CLAUSES (node), spc, flags);
3559       is_expr = false;
3560       break;
3561 
3562     case OMP_TARGET_EXIT_DATA:
3563       pp_string (pp, "#pragma omp target exit data");
3564       dump_omp_clauses (pp, OMP_TARGET_EXIT_DATA_CLAUSES (node), spc, flags);
3565       is_expr = false;
3566       break;
3567 
3568     case OMP_TARGET:
3569       pp_string (pp, "#pragma omp target");
3570       dump_omp_clauses (pp, OMP_TARGET_CLAUSES (node), spc, flags);
3571       goto dump_omp_body;
3572 
3573     case OMP_TARGET_UPDATE:
3574       pp_string (pp, "#pragma omp target update");
3575       dump_omp_clauses (pp, OMP_TARGET_UPDATE_CLAUSES (node), spc, flags);
3576       is_expr = false;
3577       break;
3578 
3579     dump_omp_loop:
3580       dump_omp_clauses (pp, OMP_FOR_CLAUSES (node), spc, flags);
3581       if (!(flags & TDF_SLIM))
3582           {
3583             int i;
3584 
3585             if (OMP_FOR_PRE_BODY (node))
3586               {
3587                 newline_and_indent (pp, spc + 2);
3588                 pp_left_brace (pp);
3589                 spc += 4;
3590                 newline_and_indent (pp, spc);
3591                 dump_generic_node (pp, OMP_FOR_PRE_BODY (node),
3592                                          spc, flags, false);
3593               }
3594             if (OMP_FOR_INIT (node))
3595               {
3596                 spc -= 2;
3597                 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (node)); i++)
3598                     {
3599                       spc += 2;
3600                       newline_and_indent (pp, spc);
3601                       pp_string (pp, "for (");
3602                       tree init = TREE_VEC_ELT (OMP_FOR_INIT (node), i);
3603                       if (TREE_CODE (init) != MODIFY_EXPR
3604                           || TREE_CODE (TREE_OPERAND (init, 1)) != TREE_VEC)
3605                         dump_generic_node (pp, init, spc, flags, false);
3606                       else
3607                         {
3608                           dump_generic_node (pp, TREE_OPERAND (init, 0),
3609                                                    spc, flags, false);
3610                           pp_string (pp, " = ");
3611                           dump_omp_loop_non_rect_expr (pp, TREE_OPERAND (init, 1),
3612                                                                spc, flags);
3613                         }
3614                       pp_string (pp, "; ");
3615                       tree cond = TREE_VEC_ELT (OMP_FOR_COND (node), i);
3616                       if (!COMPARISON_CLASS_P (cond)
3617                           || TREE_CODE (TREE_OPERAND (cond, 1)) != TREE_VEC)
3618                         dump_generic_node (pp, cond, spc, flags, false);
3619                       else
3620                         {
3621                           dump_generic_node (pp, TREE_OPERAND (cond, 0),
3622                                                    spc, flags, false);
3623                           const char *op = op_symbol (cond);
3624                           pp_space (pp);
3625                           pp_string (pp, op);
3626                           pp_space (pp);
3627                           dump_omp_loop_non_rect_expr (pp, TREE_OPERAND (cond, 1),
3628                                                                spc, flags);
3629                         }
3630                       pp_string (pp, "; ");
3631                       dump_generic_node (pp,
3632                                              TREE_VEC_ELT (OMP_FOR_INCR (node), i),
3633                                              spc, flags, false);
3634                       pp_right_paren (pp);
3635                     }
3636               }
3637             if (OMP_FOR_BODY (node))
3638               {
3639                 newline_and_indent (pp, spc + 2);
3640                 pp_left_brace (pp);
3641                 newline_and_indent (pp, spc + 4);
3642                 dump_generic_node (pp, OMP_FOR_BODY (node), spc + 4, flags,
3643                       false);
3644                 newline_and_indent (pp, spc + 2);
3645                 pp_right_brace (pp);
3646               }
3647             if (OMP_FOR_INIT (node))
3648               spc -= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node)) - 2;
3649             if (OMP_FOR_PRE_BODY (node))
3650               {
3651                 spc -= 4;
3652                 newline_and_indent (pp, spc + 2);
3653                 pp_right_brace (pp);
3654               }
3655           }
3656       is_expr = false;
3657       break;
3658 
3659     case OMP_SECTIONS:
3660       pp_string (pp, "#pragma omp sections");
3661       dump_omp_clauses (pp, OMP_SECTIONS_CLAUSES (node), spc, flags);
3662       goto dump_omp_body;
3663 
3664     case OMP_SECTION:
3665       pp_string (pp, "#pragma omp section");
3666       goto dump_omp_body;
3667 
3668     case OMP_SCAN:
3669       if (OMP_SCAN_CLAUSES (node))
3670           {
3671             pp_string (pp, "#pragma omp scan");
3672             dump_omp_clauses (pp, OMP_SCAN_CLAUSES (node), spc, flags);
3673           }
3674       goto dump_omp_body;
3675 
3676     case OMP_MASTER:
3677       pp_string (pp, "#pragma omp master");
3678       goto dump_omp_body;
3679 
3680     case OMP_MASKED:
3681       pp_string (pp, "#pragma omp masked");
3682       dump_omp_clauses (pp, OMP_MASKED_CLAUSES (node), spc, flags);
3683       goto dump_omp_body;
3684 
3685     case OMP_TASKGROUP:
3686       pp_string (pp, "#pragma omp taskgroup");
3687       dump_omp_clauses (pp, OMP_TASKGROUP_CLAUSES (node), spc, flags);
3688       goto dump_omp_body;
3689 
3690     case OMP_ORDERED:
3691       pp_string (pp, "#pragma omp ordered");
3692       dump_omp_clauses (pp, OMP_ORDERED_CLAUSES (node), spc, flags);
3693       goto dump_omp_body;
3694 
3695     case OMP_CRITICAL:
3696       pp_string (pp, "#pragma omp critical");
3697       if (OMP_CRITICAL_NAME (node))
3698           {
3699             pp_space (pp);
3700             pp_left_paren (pp);
3701           dump_generic_node (pp, OMP_CRITICAL_NAME (node), spc,
3702                                    flags, false);
3703             pp_right_paren (pp);
3704           }
3705       dump_omp_clauses (pp, OMP_CRITICAL_CLAUSES (node), spc, flags);
3706       goto dump_omp_body;
3707 
3708     case OMP_ATOMIC:
3709       pp_string (pp, "#pragma omp atomic");
3710       if (OMP_ATOMIC_WEAK (node))
3711           pp_string (pp, " weak");
3712       dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
3713       newline_and_indent (pp, spc + 2);
3714       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3715       pp_space (pp);
3716       pp_equal (pp);
3717       pp_space (pp);
3718       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3719       break;
3720 
3721     case OMP_ATOMIC_READ:
3722       pp_string (pp, "#pragma omp atomic read");
3723       dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
3724       newline_and_indent (pp, spc + 2);
3725       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3726       pp_space (pp);
3727       break;
3728 
3729     case OMP_ATOMIC_CAPTURE_OLD:
3730     case OMP_ATOMIC_CAPTURE_NEW:
3731       pp_string (pp, "#pragma omp atomic capture");
3732       if (OMP_ATOMIC_WEAK (node))
3733           pp_string (pp, " weak");
3734       dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
3735       newline_and_indent (pp, spc + 2);
3736       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3737       pp_space (pp);
3738       pp_equal (pp);
3739       pp_space (pp);
3740       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3741       break;
3742 
3743     case OMP_SINGLE:
3744       pp_string (pp, "#pragma omp single");
3745       dump_omp_clauses (pp, OMP_SINGLE_CLAUSES (node), spc, flags);
3746       goto dump_omp_body;
3747 
3748     case OMP_SCOPE:
3749       pp_string (pp, "#pragma omp scope");
3750       dump_omp_clauses (pp, OMP_SCOPE_CLAUSES (node), spc, flags);
3751       goto dump_omp_body;
3752 
3753     case OMP_CLAUSE:
3754       /* If we come here, we're dumping something that's not an OMP construct,
3755            for example, OMP clauses attached to a function's '__attribute__'.
3756            Dump the whole OMP clause chain.  */
3757       dump_omp_clauses (pp, node, spc, flags, false);
3758       is_expr = false;
3759       break;
3760 
3761     case TRANSACTION_EXPR:
3762       if (TRANSACTION_EXPR_OUTER (node))
3763           pp_string (pp, "__transaction_atomic [[outer]]");
3764       else if (TRANSACTION_EXPR_RELAXED (node))
3765           pp_string (pp, "__transaction_relaxed");
3766       else
3767           pp_string (pp, "__transaction_atomic");
3768       if (!(flags & TDF_SLIM) && TRANSACTION_EXPR_BODY (node))
3769           {
3770             newline_and_indent (pp, spc);
3771             pp_left_brace (pp);
3772             newline_and_indent (pp, spc + 2);
3773             dump_generic_node (pp, TRANSACTION_EXPR_BODY (node),
3774                                    spc + 2, flags, false);
3775             newline_and_indent (pp, spc);
3776             pp_right_brace (pp);
3777           }
3778       is_expr = false;
3779       break;
3780 
3781     case VEC_SERIES_EXPR:
3782     case VEC_WIDEN_MULT_HI_EXPR:
3783     case VEC_WIDEN_MULT_LO_EXPR:
3784     case VEC_WIDEN_PLUS_HI_EXPR:
3785     case VEC_WIDEN_PLUS_LO_EXPR:
3786     case VEC_WIDEN_MINUS_HI_EXPR:
3787     case VEC_WIDEN_MINUS_LO_EXPR:
3788     case VEC_WIDEN_MULT_EVEN_EXPR:
3789     case VEC_WIDEN_MULT_ODD_EXPR:
3790     case VEC_WIDEN_LSHIFT_HI_EXPR:
3791     case VEC_WIDEN_LSHIFT_LO_EXPR:
3792       pp_space (pp);
3793       for (str = get_tree_code_name (code); *str; str++)
3794           pp_character (pp, TOUPPER (*str));
3795       pp_string (pp, " < ");
3796       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3797       pp_string (pp, ", ");
3798       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3799       pp_string (pp, " > ");
3800       break;
3801 
3802     case VEC_DUPLICATE_EXPR:
3803       pp_space (pp);
3804       for (str = get_tree_code_name (code); *str; str++)
3805           pp_character (pp, TOUPPER (*str));
3806       pp_string (pp, " < ");
3807       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3808       pp_string (pp, " > ");
3809       break;
3810 
3811     case VEC_UNPACK_HI_EXPR:
3812       pp_string (pp, " VEC_UNPACK_HI_EXPR < ");
3813       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3814       pp_string (pp, " > ");
3815       break;
3816 
3817     case VEC_UNPACK_LO_EXPR:
3818       pp_string (pp, " VEC_UNPACK_LO_EXPR < ");
3819       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3820       pp_string (pp, " > ");
3821       break;
3822 
3823     case VEC_UNPACK_FLOAT_HI_EXPR:
3824       pp_string (pp, " VEC_UNPACK_FLOAT_HI_EXPR < ");
3825       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3826       pp_string (pp, " > ");
3827       break;
3828 
3829     case VEC_UNPACK_FLOAT_LO_EXPR:
3830       pp_string (pp, " VEC_UNPACK_FLOAT_LO_EXPR < ");
3831       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3832       pp_string (pp, " > ");
3833       break;
3834 
3835     case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
3836       pp_string (pp, " VEC_UNPACK_FIX_TRUNC_HI_EXPR < ");
3837       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3838       pp_string (pp, " > ");
3839       break;
3840 
3841     case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
3842       pp_string (pp, " VEC_UNPACK_FIX_TRUNC_LO_EXPR < ");
3843       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3844       pp_string (pp, " > ");
3845       break;
3846 
3847     case VEC_PACK_TRUNC_EXPR:
3848       pp_string (pp, " VEC_PACK_TRUNC_EXPR < ");
3849       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3850       pp_string (pp, ", ");
3851       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3852       pp_string (pp, " > ");
3853       break;
3854 
3855     case VEC_PACK_SAT_EXPR:
3856       pp_string (pp, " VEC_PACK_SAT_EXPR < ");
3857       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3858       pp_string (pp, ", ");
3859       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3860       pp_string (pp, " > ");
3861       break;
3862 
3863     case VEC_PACK_FIX_TRUNC_EXPR:
3864       pp_string (pp, " VEC_PACK_FIX_TRUNC_EXPR < ");
3865       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3866       pp_string (pp, ", ");
3867       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3868       pp_string (pp, " > ");
3869       break;
3870 
3871     case VEC_PACK_FLOAT_EXPR:
3872       pp_string (pp, " VEC_PACK_FLOAT_EXPR < ");
3873       dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3874       pp_string (pp, ", ");
3875       dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3876       pp_string (pp, " > ");
3877       break;
3878 
3879     case BLOCK:
3880       dump_block_node (pp, node, spc, flags);
3881       break;
3882 
3883     case DEBUG_BEGIN_STMT:
3884       pp_string (pp, "# DEBUG BEGIN STMT");
3885       break;
3886 
3887     default:
3888       NIY;
3889     }
3890 
3891   if (is_stmt && is_expr)
3892     pp_semicolon (pp);
3893 
3894   return spc;
3895 }
3896 
3897 /* Print the declaration of a variable.  */
3898 
3899 void
print_declaration(pretty_printer * pp,tree t,int spc,dump_flags_t flags)3900 print_declaration (pretty_printer *pp, tree t, int spc, dump_flags_t flags)
3901 {
3902   INDENT (spc);
3903 
3904   if (TREE_CODE(t) == NAMELIST_DECL)
3905     {
3906       pp_string(pp, "namelist ");
3907       dump_decl_name (pp, t, flags);
3908       pp_semicolon (pp);
3909       return;
3910     }
3911 
3912   if (TREE_CODE (t) == TYPE_DECL)
3913     pp_string (pp, "typedef ");
3914 
3915   if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
3916     pp_string (pp, "register ");
3917 
3918   if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
3919     pp_string (pp, "extern ");
3920   else if (TREE_STATIC (t))
3921     pp_string (pp, "static ");
3922 
3923   /* Print the type and name.  */
3924   if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
3925     {
3926       tree tmp;
3927 
3928       /* Print array's type.  */
3929       tmp = TREE_TYPE (t);
3930       while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
3931           tmp = TREE_TYPE (tmp);
3932       dump_generic_node (pp, TREE_TYPE (tmp), spc, flags, false);
3933 
3934       /* Print variable's name.  */
3935       pp_space (pp);
3936       dump_generic_node (pp, t, spc, flags, false);
3937 
3938       /* Print the dimensions.  */
3939       tmp = TREE_TYPE (t);
3940       while (TREE_CODE (tmp) == ARRAY_TYPE)
3941           {
3942             dump_array_domain (pp, TYPE_DOMAIN (tmp), spc, flags);
3943             tmp = TREE_TYPE (tmp);
3944           }
3945     }
3946   else if (TREE_CODE (t) == FUNCTION_DECL)
3947     {
3948       dump_generic_node (pp, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
3949       pp_space (pp);
3950       dump_decl_name (pp, t, flags);
3951       dump_function_declaration (pp, TREE_TYPE (t), spc, flags);
3952     }
3953   else
3954     {
3955       /* Print type declaration.  */
3956       dump_generic_node (pp, TREE_TYPE (t), spc, flags, false);
3957 
3958       /* Print variable's name.  */
3959       pp_space (pp);
3960       dump_generic_node (pp, t, spc, flags, false);
3961     }
3962 
3963   if (VAR_P (t) && DECL_HARD_REGISTER (t))
3964     {
3965       pp_string (pp, " __asm__ ");
3966       pp_left_paren (pp);
3967       dump_generic_node (pp, DECL_ASSEMBLER_NAME (t), spc, flags, false);
3968       pp_right_paren (pp);
3969     }
3970 
3971   /* The initial value of a function serves to determine whether the function
3972      is declared or defined.  So the following does not apply to function
3973      nodes.  */
3974   if (TREE_CODE (t) != FUNCTION_DECL)
3975     {
3976       /* Print the initial value.  */
3977       if (DECL_INITIAL (t))
3978           {
3979             pp_space (pp);
3980             pp_equal (pp);
3981             pp_space (pp);
3982             if (!(flags & TDF_SLIM))
3983               dump_generic_node (pp, DECL_INITIAL (t), spc, flags, false);
3984             else
3985               pp_string (pp, "<<< omitted >>>");
3986           }
3987     }
3988 
3989   if (VAR_P (t) && DECL_HAS_VALUE_EXPR_P (t))
3990     {
3991       pp_string (pp, " [value-expr: ");
3992       dump_generic_node (pp, DECL_VALUE_EXPR (t), spc, flags, false);
3993       pp_right_bracket (pp);
3994     }
3995 
3996   pp_semicolon (pp);
3997 }
3998 
3999 
4000 /* Prints a structure: name, fields, and methods.
4001    FIXME: Still incomplete.  */
4002 
4003 static void
print_struct_decl(pretty_printer * pp,const_tree node,int spc,dump_flags_t flags)4004 print_struct_decl (pretty_printer *pp, const_tree node, int spc,
4005                        dump_flags_t flags)
4006 {
4007   /* Print the name of the structure.  */
4008   if (TYPE_NAME (node))
4009     {
4010       INDENT (spc);
4011       if (TREE_CODE (node) == RECORD_TYPE)
4012           pp_string (pp, "struct ");
4013       else if ((TREE_CODE (node) == UNION_TYPE
4014                     || TREE_CODE (node) == QUAL_UNION_TYPE))
4015           pp_string (pp, "union ");
4016 
4017       dump_generic_node (pp, TYPE_NAME (node), spc, TDF_NONE, false);
4018     }
4019 
4020   /* Print the contents of the structure.  */
4021   pp_newline (pp);
4022   INDENT (spc);
4023   pp_left_brace (pp);
4024   pp_newline (pp);
4025 
4026   /* Print the fields of the structure.  */
4027   {
4028     tree tmp;
4029     tmp = TYPE_FIELDS (node);
4030     while (tmp)
4031       {
4032           /* Avoid to print recursively the structure.  */
4033           /* FIXME : Not implemented correctly...,
4034              what about the case when we have a cycle in the contain graph? ...
4035              Maybe this could be solved by looking at the scope in which the
4036              structure was declared.  */
4037           if (TREE_TYPE (tmp) != node
4038               && (TREE_CODE (TREE_TYPE (tmp)) != POINTER_TYPE
4039                     || TREE_TYPE (TREE_TYPE (tmp)) != node))
4040             {
4041               print_declaration (pp, tmp, spc+2, flags);
4042               pp_newline (pp);
4043             }
4044           tmp = DECL_CHAIN (tmp);
4045       }
4046   }
4047   INDENT (spc);
4048   pp_right_brace (pp);
4049 }
4050 
4051 /* Return the priority of the operator CODE.
4052 
4053    From lowest to highest precedence with either left-to-right (L-R)
4054    or right-to-left (R-L) associativity]:
4055 
4056      1    [L-R] ,
4057      2    [R-L] = += -= *= /= %= &= ^= |= <<= >>=
4058      3    [R-L] ?:
4059      4    [L-R] ||
4060      5    [L-R] &&
4061      6    [L-R] |
4062      7    [L-R] ^
4063      8    [L-R] &
4064      9    [L-R] == !=
4065     10    [L-R] < <= > >=
4066     11    [L-R] << >>
4067     12    [L-R] + -
4068     13    [L-R] * / %
4069     14    [R-L] ! ~ ++ -- + - * & (type) sizeof
4070     15    [L-R] fn() [] -> .
4071 
4072    unary +, - and * have higher precedence than the corresponding binary
4073    operators.  */
4074 
4075 int
op_code_prio(enum tree_code code)4076 op_code_prio (enum tree_code code)
4077 {
4078   switch (code)
4079     {
4080     case TREE_LIST:
4081     case COMPOUND_EXPR:
4082     case BIND_EXPR:
4083       return 1;
4084 
4085     case MODIFY_EXPR:
4086     case INIT_EXPR:
4087       return 2;
4088 
4089     case COND_EXPR:
4090       return 3;
4091 
4092     case TRUTH_OR_EXPR:
4093     case TRUTH_ORIF_EXPR:
4094       return 4;
4095 
4096     case TRUTH_AND_EXPR:
4097     case TRUTH_ANDIF_EXPR:
4098       return 5;
4099 
4100     case BIT_IOR_EXPR:
4101       return 6;
4102 
4103     case BIT_XOR_EXPR:
4104     case TRUTH_XOR_EXPR:
4105       return 7;
4106 
4107     case BIT_AND_EXPR:
4108       return 8;
4109 
4110     case EQ_EXPR:
4111     case NE_EXPR:
4112       return 9;
4113 
4114     case UNLT_EXPR:
4115     case UNLE_EXPR:
4116     case UNGT_EXPR:
4117     case UNGE_EXPR:
4118     case UNEQ_EXPR:
4119     case LTGT_EXPR:
4120     case ORDERED_EXPR:
4121     case UNORDERED_EXPR:
4122     case LT_EXPR:
4123     case LE_EXPR:
4124     case GT_EXPR:
4125     case GE_EXPR:
4126       return 10;
4127 
4128     case LSHIFT_EXPR:
4129     case RSHIFT_EXPR:
4130     case LROTATE_EXPR:
4131     case RROTATE_EXPR:
4132     case VEC_WIDEN_LSHIFT_HI_EXPR:
4133     case VEC_WIDEN_LSHIFT_LO_EXPR:
4134     case WIDEN_LSHIFT_EXPR:
4135       return 11;
4136 
4137     case WIDEN_SUM_EXPR:
4138     case PLUS_EXPR:
4139     case POINTER_PLUS_EXPR:
4140     case POINTER_DIFF_EXPR:
4141     case MINUS_EXPR:
4142       return 12;
4143 
4144     case VEC_WIDEN_MULT_HI_EXPR:
4145     case VEC_WIDEN_MULT_LO_EXPR:
4146     case WIDEN_MULT_EXPR:
4147     case DOT_PROD_EXPR:
4148     case WIDEN_MULT_PLUS_EXPR:
4149     case WIDEN_MULT_MINUS_EXPR:
4150     case MULT_EXPR:
4151     case MULT_HIGHPART_EXPR:
4152     case TRUNC_DIV_EXPR:
4153     case CEIL_DIV_EXPR:
4154     case FLOOR_DIV_EXPR:
4155     case ROUND_DIV_EXPR:
4156     case RDIV_EXPR:
4157     case EXACT_DIV_EXPR:
4158     case TRUNC_MOD_EXPR:
4159     case CEIL_MOD_EXPR:
4160     case FLOOR_MOD_EXPR:
4161     case ROUND_MOD_EXPR:
4162       return 13;
4163 
4164     case TRUTH_NOT_EXPR:
4165     case BIT_NOT_EXPR:
4166     case POSTINCREMENT_EXPR:
4167     case POSTDECREMENT_EXPR:
4168     case PREINCREMENT_EXPR:
4169     case PREDECREMENT_EXPR:
4170     case NEGATE_EXPR:
4171     case INDIRECT_REF:
4172     case ADDR_EXPR:
4173     case FLOAT_EXPR:
4174     CASE_CONVERT:
4175     case FIX_TRUNC_EXPR:
4176     case TARGET_EXPR:
4177       return 14;
4178 
4179     case CALL_EXPR:
4180     case ARRAY_REF:
4181     case ARRAY_RANGE_REF:
4182     case COMPONENT_REF:
4183       return 15;
4184 
4185       /* Special expressions.  */
4186     case MIN_EXPR:
4187     case MAX_EXPR:
4188     case ABS_EXPR:
4189     case REALPART_EXPR:
4190     case IMAGPART_EXPR:
4191     case VEC_UNPACK_HI_EXPR:
4192     case VEC_UNPACK_LO_EXPR:
4193     case VEC_UNPACK_FLOAT_HI_EXPR:
4194     case VEC_UNPACK_FLOAT_LO_EXPR:
4195     case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
4196     case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
4197     case VEC_PACK_TRUNC_EXPR:
4198     case VEC_PACK_SAT_EXPR:
4199       return 16;
4200 
4201     default:
4202       /* Return an arbitrarily high precedence to avoid surrounding single
4203            VAR_DECLs in ()s.  */
4204       return 9999;
4205     }
4206 }
4207 
4208 /* Return the priority of the operator OP.  */
4209 
4210 int
op_prio(const_tree op)4211 op_prio (const_tree op)
4212 {
4213   enum tree_code code;
4214 
4215   if (op == NULL)
4216     return 9999;
4217 
4218   code = TREE_CODE (op);
4219   if (code == SAVE_EXPR || code == NON_LVALUE_EXPR)
4220     return op_prio (TREE_OPERAND (op, 0));
4221 
4222   return op_code_prio (code);
4223 }
4224 
4225 /* Return the symbol associated with operator CODE.  */
4226 
4227 const char *
op_symbol_code(enum tree_code code)4228 op_symbol_code (enum tree_code code)
4229 {
4230   switch (code)
4231     {
4232     case MODIFY_EXPR:
4233       return "=";
4234 
4235     case TRUTH_OR_EXPR:
4236     case TRUTH_ORIF_EXPR:
4237       return "||";
4238 
4239     case TRUTH_AND_EXPR:
4240     case TRUTH_ANDIF_EXPR:
4241       return "&&";
4242 
4243     case BIT_IOR_EXPR:
4244       return "|";
4245 
4246     case TRUTH_XOR_EXPR:
4247     case BIT_XOR_EXPR:
4248       return "^";
4249 
4250     case ADDR_EXPR:
4251     case BIT_AND_EXPR:
4252       return "&";
4253 
4254     case ORDERED_EXPR:
4255       return "ord";
4256     case UNORDERED_EXPR:
4257       return "unord";
4258 
4259     case EQ_EXPR:
4260       return "==";
4261     case UNEQ_EXPR:
4262       return "u==";
4263 
4264     case NE_EXPR:
4265       return "!=";
4266 
4267     case LT_EXPR:
4268       return "<";
4269     case UNLT_EXPR:
4270       return "u<";
4271 
4272     case LE_EXPR:
4273       return "<=";
4274     case UNLE_EXPR:
4275       return "u<=";
4276 
4277     case GT_EXPR:
4278       return ">";
4279     case UNGT_EXPR:
4280       return "u>";
4281 
4282     case GE_EXPR:
4283       return ">=";
4284     case UNGE_EXPR:
4285       return "u>=";
4286 
4287     case LTGT_EXPR:
4288       return "<>";
4289 
4290     case LSHIFT_EXPR:
4291       return "<<";
4292 
4293     case RSHIFT_EXPR:
4294       return ">>";
4295 
4296     case LROTATE_EXPR:
4297       return "r<<";
4298 
4299     case RROTATE_EXPR:
4300       return "r>>";
4301 
4302     case WIDEN_LSHIFT_EXPR:
4303       return "w<<";
4304 
4305     case WIDEN_PLUS_EXPR:
4306       return "w+";
4307 
4308     case WIDEN_MINUS_EXPR:
4309       return "w-";
4310 
4311     case POINTER_PLUS_EXPR:
4312       return "+";
4313 
4314     case PLUS_EXPR:
4315       return "+";
4316 
4317     case WIDEN_SUM_EXPR:
4318       return "w+";
4319 
4320     case WIDEN_MULT_EXPR:
4321       return "w*";
4322 
4323     case MULT_HIGHPART_EXPR:
4324       return "h*";
4325 
4326     case NEGATE_EXPR:
4327     case MINUS_EXPR:
4328     case POINTER_DIFF_EXPR:
4329       return "-";
4330 
4331     case BIT_NOT_EXPR:
4332       return "~";
4333 
4334     case TRUTH_NOT_EXPR:
4335       return "!";
4336 
4337     case MULT_EXPR:
4338     case INDIRECT_REF:
4339       return "*";
4340 
4341     case TRUNC_DIV_EXPR:
4342     case RDIV_EXPR:
4343       return "/";
4344 
4345     case CEIL_DIV_EXPR:
4346       return "/[cl]";
4347 
4348     case FLOOR_DIV_EXPR:
4349       return "/[fl]";
4350 
4351     case ROUND_DIV_EXPR:
4352       return "/[rd]";
4353 
4354     case EXACT_DIV_EXPR:
4355       return "/[ex]";
4356 
4357     case TRUNC_MOD_EXPR:
4358       return "%";
4359 
4360     case CEIL_MOD_EXPR:
4361       return "%[cl]";
4362 
4363     case FLOOR_MOD_EXPR:
4364       return "%[fl]";
4365 
4366     case ROUND_MOD_EXPR:
4367       return "%[rd]";
4368 
4369     case PREDECREMENT_EXPR:
4370       return " --";
4371 
4372     case PREINCREMENT_EXPR:
4373       return " ++";
4374 
4375     case POSTDECREMENT_EXPR:
4376       return "-- ";
4377 
4378     case POSTINCREMENT_EXPR:
4379       return "++ ";
4380 
4381     case MAX_EXPR:
4382       return "max";
4383 
4384     case MIN_EXPR:
4385       return "min";
4386 
4387     default:
4388       return "<<< ??? >>>";
4389     }
4390 }
4391 
4392 /* Return the symbol associated with operator OP.  */
4393 
4394 static const char *
op_symbol(const_tree op)4395 op_symbol (const_tree op)
4396 {
4397   return op_symbol_code (TREE_CODE (op));
4398 }
4399 
4400 /* Prints the name of a call.  NODE is the CALL_EXPR_FN of a CALL_EXPR or
4401    the gimple_call_fn of a GIMPLE_CALL.  */
4402 
4403 void
print_call_name(pretty_printer * pp,tree node,dump_flags_t flags)4404 print_call_name (pretty_printer *pp, tree node, dump_flags_t flags)
4405 {
4406   tree op0 = node;
4407   int spc = 0;
4408 
4409   if (TREE_CODE (op0) == NON_LVALUE_EXPR)
4410     op0 = TREE_OPERAND (op0, 0);
4411 
4412  again:
4413   switch (TREE_CODE (op0))
4414     {
4415     case VAR_DECL:
4416     case PARM_DECL:
4417     case FUNCTION_DECL:
4418       dump_function_name (pp, op0, flags);
4419       break;
4420 
4421     case ADDR_EXPR:
4422     case INDIRECT_REF:
4423     CASE_CONVERT:
4424       op0 = TREE_OPERAND (op0, 0);
4425       goto again;
4426 
4427     case COND_EXPR:
4428       pp_left_paren (pp);
4429       dump_generic_node (pp, TREE_OPERAND (op0, 0), 0, flags, false);
4430       pp_string (pp, ") ? ");
4431       dump_generic_node (pp, TREE_OPERAND (op0, 1), 0, flags, false);
4432       pp_string (pp, " : ");
4433       dump_generic_node (pp, TREE_OPERAND (op0, 2), 0, flags, false);
4434       break;
4435 
4436     case ARRAY_REF:
4437       if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
4438           dump_function_name (pp, TREE_OPERAND (op0, 0), flags);
4439       else
4440           dump_generic_node (pp, op0, 0, flags, false);
4441       break;
4442 
4443     case MEM_REF:
4444       if (integer_zerop (TREE_OPERAND (op0, 1)))
4445           {
4446             op0 = TREE_OPERAND (op0, 0);
4447             goto again;
4448           }
4449       /* Fallthru.  */
4450     case COMPONENT_REF:
4451     case SSA_NAME:
4452     case OBJ_TYPE_REF:
4453       dump_generic_node (pp, op0, 0, flags, false);
4454       break;
4455 
4456     default:
4457       NIY;
4458     }
4459 }
4460 
4461 /* Print the first N characters in the array STR, replacing non-printable
4462    characters (including embedded nuls) with unambiguous escape sequences.  */
4463 
4464 void
pretty_print_string(pretty_printer * pp,const char * str,size_t n)4465 pretty_print_string (pretty_printer *pp, const char *str, size_t n)
4466 {
4467   if (str == NULL)
4468     return;
4469 
4470   for ( ; n; --n, ++str)
4471     {
4472       switch (str[0])
4473           {
4474           case '\b':
4475             pp_string (pp, "\\b");
4476             break;
4477 
4478           case '\f':
4479             pp_string (pp, "\\f");
4480             break;
4481 
4482           case '\n':
4483             pp_string (pp, "\\n");
4484             break;
4485 
4486           case '\r':
4487             pp_string (pp, "\\r");
4488             break;
4489 
4490           case '\t':
4491             pp_string (pp, "\\t");
4492             break;
4493 
4494           case '\v':
4495             pp_string (pp, "\\v");
4496             break;
4497 
4498           case '\\':
4499             pp_string (pp, "\\\\");
4500             break;
4501 
4502           case '\"':
4503             pp_string (pp, "\\\"");
4504             break;
4505 
4506           case '\'':
4507             pp_string (pp, "\\'");
4508             break;
4509 
4510           default:
4511             if (str[0] || n > 1)
4512               {
4513                 if (!ISPRINT (str[0]))
4514                     {
4515                       char buf[5];
4516                       sprintf (buf, "\\x%02x", (unsigned char)str[0]);
4517                       pp_string (pp, buf);
4518                     }
4519                 else
4520                     pp_character (pp, str[0]);
4521                 break;
4522               }
4523           }
4524     }
4525 }
4526 
4527 static void
maybe_init_pretty_print(FILE * file)4528 maybe_init_pretty_print (FILE *file)
4529 {
4530   if (!tree_pp)
4531     {
4532       tree_pp = new pretty_printer ();
4533       pp_needs_newline (tree_pp) = true;
4534       pp_translate_identifiers (tree_pp) = false;
4535     }
4536 
4537   tree_pp->buffer->stream = file;
4538 }
4539 
4540 static void
newline_and_indent(pretty_printer * pp,int spc)4541 newline_and_indent (pretty_printer *pp, int spc)
4542 {
4543   pp_newline (pp);
4544   INDENT (spc);
4545 }
4546 
4547 /* Print the identifier ID to PRETTY-PRINTER.  */
4548 
4549 void
pp_tree_identifier(pretty_printer * pp,tree id)4550 pp_tree_identifier (pretty_printer *pp, tree id)
4551 {
4552   if (pp_translate_identifiers (pp))
4553     {
4554       const char *text = identifier_to_locale (IDENTIFIER_POINTER (id));
4555       pp_append_text (pp, text, text + strlen (text));
4556     }
4557   else
4558     pp_append_text (pp, IDENTIFIER_POINTER (id),
4559                         IDENTIFIER_POINTER (id) + IDENTIFIER_LENGTH (id));
4560 }
4561 
4562 /* A helper function that is used to dump function information before the
4563    function dump.  */
4564 
4565 void
dump_function_header(FILE * dump_file,tree fdecl,dump_flags_t flags)4566 dump_function_header (FILE *dump_file, tree fdecl, dump_flags_t flags)
4567 {
4568   const char *dname, *aname;
4569   struct cgraph_node *node = cgraph_node::get (fdecl);
4570   struct function *fun = DECL_STRUCT_FUNCTION (fdecl);
4571 
4572   dname = lang_hooks.decl_printable_name (fdecl, 1);
4573 
4574   if (DECL_ASSEMBLER_NAME_SET_P (fdecl))
4575     aname = (IDENTIFIER_POINTER
4576              (DECL_ASSEMBLER_NAME (fdecl)));
4577   else
4578     aname = "<unset-asm-name>";
4579 
4580   fprintf (dump_file, "\n;; Function %s (%s, funcdef_no=%d",
4581              dname, aname, fun->funcdef_no);
4582   if (!(flags & TDF_NOUID))
4583     fprintf (dump_file, ", decl_uid=%d", DECL_UID (fdecl));
4584   if (node)
4585     {
4586       fprintf (dump_file, ", cgraph_uid=%d", node->get_uid ());
4587       fprintf (dump_file, ", symbol_order=%d)%s\n\n", node->order,
4588                node->frequency == NODE_FREQUENCY_HOT
4589                ? " (hot)"
4590                : node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
4591                ? " (unlikely executed)"
4592                : node->frequency == NODE_FREQUENCY_EXECUTED_ONCE
4593                ? " (executed once)"
4594                : "");
4595     }
4596   else
4597     fprintf (dump_file, ")\n\n");
4598 }
4599 
4600 /* Dump double_int D to pretty_printer PP.  UNS is true
4601    if D is unsigned and false otherwise.  */
4602 void
pp_double_int(pretty_printer * pp,double_int d,bool uns)4603 pp_double_int (pretty_printer *pp, double_int d, bool uns)
4604 {
4605   if (d.fits_shwi ())
4606     pp_wide_integer (pp, d.low);
4607   else if (d.fits_uhwi ())
4608     pp_unsigned_wide_integer (pp, d.low);
4609   else
4610     {
4611       unsigned HOST_WIDE_INT low = d.low;
4612       HOST_WIDE_INT high = d.high;
4613       if (!uns && d.is_negative ())
4614           {
4615             pp_minus (pp);
4616             high = ~high + !low;
4617             low = -low;
4618           }
4619       /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
4620            systems?  */
4621       sprintf (pp_buffer (pp)->digit_buffer,
4622                  HOST_WIDE_INT_PRINT_DOUBLE_HEX,
4623                  (unsigned HOST_WIDE_INT) high, low);
4624       pp_string (pp, pp_buffer (pp)->digit_buffer);
4625     }
4626 }
4627 
4628 #if __GNUC__ >= 10
4629 #  pragma GCC diagnostic pop
4630 #endif
4631