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