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