Fix issue for pointers to anonymous types with -fdump-ada-spec
[official-gcc.git] / gcc / tree-pretty-print.cc
blob99af977979d5891e6e8345276af794f421ecfaac
1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001-2022 Free Software Foundation, Inc.
3 Adapted from c-pretty-print.cc by Diego Novillo <dnovillo@redhat.com>
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, int, 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, spc, 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, int spc, 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, spc+2);
81 dump_generic_node (pp, TREE_OPERAND (node, i), spc+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.cc. */
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_HAS_DEVICE_ADDR:
497 name = "has_device_addr";
498 goto print_remap;
499 case OMP_CLAUSE_IS_DEVICE_PTR:
500 name = "is_device_ptr";
501 goto print_remap;
502 case OMP_CLAUSE_INCLUSIVE:
503 name = "inclusive";
504 goto print_remap;
505 case OMP_CLAUSE_EXCLUSIVE:
506 name = "exclusive";
507 goto print_remap;
508 case OMP_CLAUSE__LOOPTEMP_:
509 name = "_looptemp_";
510 goto print_remap;
511 case OMP_CLAUSE__REDUCTEMP_:
512 name = "_reductemp_";
513 goto print_remap;
514 case OMP_CLAUSE__CONDTEMP_:
515 name = "_condtemp_";
516 goto print_remap;
517 case OMP_CLAUSE__SCANTEMP_:
518 name = "_scantemp_";
519 goto print_remap;
520 case OMP_CLAUSE_TO_DECLARE:
521 name = "to";
522 goto print_remap;
523 case OMP_CLAUSE_LINK:
524 name = "link";
525 goto print_remap;
526 case OMP_CLAUSE_NONTEMPORAL:
527 name = "nontemporal";
528 goto print_remap;
529 print_remap:
530 pp_string (pp, name);
531 pp_left_paren (pp);
532 if (modifier)
533 pp_string (pp, modifier);
534 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
535 spc, flags, false);
536 pp_right_paren (pp);
537 break;
539 case OMP_CLAUSE_TASK_REDUCTION:
540 case OMP_CLAUSE_IN_REDUCTION:
541 pp_string (pp, OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_IN_REDUCTION
542 ? "in_" : "task_");
543 /* FALLTHRU */
544 case OMP_CLAUSE_REDUCTION:
545 pp_string (pp, "reduction(");
546 if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_REDUCTION)
548 if (OMP_CLAUSE_REDUCTION_TASK (clause))
549 pp_string (pp, "task,");
550 else if (OMP_CLAUSE_REDUCTION_INSCAN (clause))
551 pp_string (pp, "inscan,");
553 if (OMP_CLAUSE_REDUCTION_CODE (clause) != ERROR_MARK)
555 pp_string (pp,
556 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause)));
557 pp_colon (pp);
559 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
560 spc, flags, false);
561 pp_right_paren (pp);
562 break;
564 case OMP_CLAUSE_IF:
565 pp_string (pp, "if(");
566 switch (OMP_CLAUSE_IF_MODIFIER (clause))
568 case ERROR_MARK: break;
569 case VOID_CST: pp_string (pp, "cancel:"); break;
570 case OMP_PARALLEL: pp_string (pp, "parallel:"); break;
571 case OMP_SIMD: pp_string (pp, "simd:"); break;
572 case OMP_TASK: pp_string (pp, "task:"); break;
573 case OMP_TASKLOOP: pp_string (pp, "taskloop:"); break;
574 case OMP_TARGET_DATA: pp_string (pp, "target data:"); break;
575 case OMP_TARGET: pp_string (pp, "target:"); break;
576 case OMP_TARGET_UPDATE: pp_string (pp, "target update:"); break;
577 case OMP_TARGET_ENTER_DATA:
578 pp_string (pp, "target enter data:"); break;
579 case OMP_TARGET_EXIT_DATA: pp_string (pp, "target exit data:"); break;
580 default: gcc_unreachable ();
582 dump_generic_node (pp, OMP_CLAUSE_IF_EXPR (clause),
583 spc, flags, false);
584 pp_right_paren (pp);
585 break;
587 case OMP_CLAUSE_NUM_THREADS:
588 pp_string (pp, "num_threads(");
589 dump_generic_node (pp, OMP_CLAUSE_NUM_THREADS_EXPR (clause),
590 spc, flags, false);
591 pp_right_paren (pp);
592 break;
594 case OMP_CLAUSE_NOWAIT:
595 pp_string (pp, "nowait");
596 break;
597 case OMP_CLAUSE_ORDERED:
598 pp_string (pp, "ordered");
599 if (OMP_CLAUSE_ORDERED_EXPR (clause))
601 pp_left_paren (pp);
602 dump_generic_node (pp, OMP_CLAUSE_ORDERED_EXPR (clause),
603 spc, flags, false);
604 pp_right_paren (pp);
606 break;
608 case OMP_CLAUSE_DEFAULT:
609 pp_string (pp, "default(");
610 switch (OMP_CLAUSE_DEFAULT_KIND (clause))
612 case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
613 break;
614 case OMP_CLAUSE_DEFAULT_SHARED:
615 pp_string (pp, "shared");
616 break;
617 case OMP_CLAUSE_DEFAULT_NONE:
618 pp_string (pp, "none");
619 break;
620 case OMP_CLAUSE_DEFAULT_PRIVATE:
621 pp_string (pp, "private");
622 break;
623 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
624 pp_string (pp, "firstprivate");
625 break;
626 case OMP_CLAUSE_DEFAULT_PRESENT:
627 pp_string (pp, "present");
628 break;
629 default:
630 gcc_unreachable ();
632 pp_right_paren (pp);
633 break;
635 case OMP_CLAUSE_SCHEDULE:
636 pp_string (pp, "schedule(");
637 if (OMP_CLAUSE_SCHEDULE_KIND (clause)
638 & (OMP_CLAUSE_SCHEDULE_MONOTONIC
639 | OMP_CLAUSE_SCHEDULE_NONMONOTONIC))
641 if (OMP_CLAUSE_SCHEDULE_KIND (clause)
642 & OMP_CLAUSE_SCHEDULE_MONOTONIC)
643 pp_string (pp, "monotonic");
644 else
645 pp_string (pp, "nonmonotonic");
646 if (OMP_CLAUSE_SCHEDULE_SIMD (clause))
647 pp_comma (pp);
648 else
649 pp_colon (pp);
651 if (OMP_CLAUSE_SCHEDULE_SIMD (clause))
652 pp_string (pp, "simd:");
654 switch (OMP_CLAUSE_SCHEDULE_KIND (clause) & OMP_CLAUSE_SCHEDULE_MASK)
656 case OMP_CLAUSE_SCHEDULE_STATIC:
657 pp_string (pp, "static");
658 break;
659 case OMP_CLAUSE_SCHEDULE_DYNAMIC:
660 pp_string (pp, "dynamic");
661 break;
662 case OMP_CLAUSE_SCHEDULE_GUIDED:
663 pp_string (pp, "guided");
664 break;
665 case OMP_CLAUSE_SCHEDULE_RUNTIME:
666 pp_string (pp, "runtime");
667 break;
668 case OMP_CLAUSE_SCHEDULE_AUTO:
669 pp_string (pp, "auto");
670 break;
671 default:
672 gcc_unreachable ();
674 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
676 pp_comma (pp);
677 dump_generic_node (pp, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
678 spc, flags, false);
680 pp_right_paren (pp);
681 break;
683 case OMP_CLAUSE_UNTIED:
684 pp_string (pp, "untied");
685 break;
687 case OMP_CLAUSE_COLLAPSE:
688 pp_string (pp, "collapse(");
689 dump_generic_node (pp, OMP_CLAUSE_COLLAPSE_EXPR (clause),
690 spc, flags, false);
691 pp_right_paren (pp);
692 break;
694 case OMP_CLAUSE_FINAL:
695 pp_string (pp, "final(");
696 dump_generic_node (pp, OMP_CLAUSE_FINAL_EXPR (clause),
697 spc, flags, false);
698 pp_right_paren (pp);
699 break;
701 case OMP_CLAUSE_MERGEABLE:
702 pp_string (pp, "mergeable");
703 break;
705 case OMP_CLAUSE_LINEAR:
706 pp_string (pp, "linear(");
707 switch (OMP_CLAUSE_LINEAR_KIND (clause))
709 case OMP_CLAUSE_LINEAR_DEFAULT:
710 break;
711 case OMP_CLAUSE_LINEAR_REF:
712 pp_string (pp, "ref(");
713 break;
714 case OMP_CLAUSE_LINEAR_VAL:
715 pp_string (pp, "val(");
716 break;
717 case OMP_CLAUSE_LINEAR_UVAL:
718 pp_string (pp, "uval(");
719 break;
720 default:
721 gcc_unreachable ();
723 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
724 spc, flags, false);
725 if (OMP_CLAUSE_LINEAR_KIND (clause) != OMP_CLAUSE_LINEAR_DEFAULT)
726 pp_right_paren (pp);
727 pp_colon (pp);
728 dump_generic_node (pp, OMP_CLAUSE_LINEAR_STEP (clause),
729 spc, flags, false);
730 pp_right_paren (pp);
731 break;
733 case OMP_CLAUSE_ALIGNED:
734 pp_string (pp, "aligned(");
735 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
736 spc, flags, false);
737 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause))
739 pp_colon (pp);
740 dump_generic_node (pp, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause),
741 spc, flags, false);
743 pp_right_paren (pp);
744 break;
746 case OMP_CLAUSE_ALLOCATE:
747 pp_string (pp, "allocate(");
748 if (OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause))
750 pp_string (pp, "allocator(");
751 dump_generic_node (pp, OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause),
752 spc, flags, false);
753 pp_right_paren (pp);
755 if (OMP_CLAUSE_ALLOCATE_ALIGN (clause))
757 if (OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause))
758 pp_comma (pp);
759 pp_string (pp, "align(");
760 dump_generic_node (pp, OMP_CLAUSE_ALLOCATE_ALIGN (clause),
761 spc, flags, false);
762 pp_right_paren (pp);
764 if (OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause)
765 || OMP_CLAUSE_ALLOCATE_ALIGN (clause))
766 pp_colon (pp);
767 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
768 spc, flags, false);
769 pp_right_paren (pp);
770 break;
772 case OMP_CLAUSE_AFFINITY:
773 pp_string (pp, "affinity(");
775 tree t = OMP_CLAUSE_DECL (clause);
776 if (TREE_CODE (t) == TREE_LIST
777 && TREE_PURPOSE (t)
778 && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
780 dump_omp_iterators (pp, TREE_PURPOSE (t), spc, flags);
781 pp_colon (pp);
782 t = TREE_VALUE (t);
784 dump_generic_node (pp, t, spc, flags, false);
786 pp_right_paren (pp);
787 break;
788 case OMP_CLAUSE_DEPEND:
789 pp_string (pp, "depend(");
790 switch (OMP_CLAUSE_DEPEND_KIND (clause))
792 case OMP_CLAUSE_DEPEND_DEPOBJ:
793 name = "depobj";
794 break;
795 case OMP_CLAUSE_DEPEND_IN:
796 name = "in";
797 break;
798 case OMP_CLAUSE_DEPEND_OUT:
799 name = "out";
800 break;
801 case OMP_CLAUSE_DEPEND_INOUT:
802 name = "inout";
803 break;
804 case OMP_CLAUSE_DEPEND_MUTEXINOUTSET:
805 name = "mutexinoutset";
806 break;
807 case OMP_CLAUSE_DEPEND_SOURCE:
808 pp_string (pp, "source)");
809 return;
810 case OMP_CLAUSE_DEPEND_LAST:
811 name = "__internal__";
812 break;
813 case OMP_CLAUSE_DEPEND_SINK:
814 pp_string (pp, "sink:");
815 for (tree t = OMP_CLAUSE_DECL (clause); t; t = TREE_CHAIN (t))
816 if (TREE_CODE (t) == TREE_LIST)
818 dump_generic_node (pp, TREE_VALUE (t), spc, flags, false);
819 if (TREE_PURPOSE (t) != integer_zero_node)
821 if (OMP_CLAUSE_DEPEND_SINK_NEGATIVE (t))
822 pp_minus (pp);
823 else
824 pp_plus (pp);
825 dump_generic_node (pp, TREE_PURPOSE (t), spc, flags,
826 false);
828 if (TREE_CHAIN (t))
829 pp_comma (pp);
831 else
832 gcc_unreachable ();
833 pp_right_paren (pp);
834 return;
835 default:
836 gcc_unreachable ();
839 tree t = OMP_CLAUSE_DECL (clause);
840 if (TREE_CODE (t) == TREE_LIST
841 && TREE_PURPOSE (t)
842 && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
844 dump_omp_iterators (pp, TREE_PURPOSE (t), spc, flags);
845 pp_colon (pp);
846 t = TREE_VALUE (t);
848 if (name[0])
850 pp_string (pp, name);
851 pp_colon (pp);
853 dump_generic_node (pp, t, spc, flags, false);
854 pp_right_paren (pp);
856 break;
858 case OMP_CLAUSE_MAP:
859 pp_string (pp, "map(");
860 switch (OMP_CLAUSE_MAP_KIND (clause))
862 case GOMP_MAP_ALLOC:
863 case GOMP_MAP_POINTER:
864 case GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION:
865 pp_string (pp, "alloc");
866 break;
867 case GOMP_MAP_IF_PRESENT:
868 pp_string (pp, "no_alloc");
869 break;
870 case GOMP_MAP_TO:
871 case GOMP_MAP_TO_PSET:
872 pp_string (pp, "to");
873 break;
874 case GOMP_MAP_FROM:
875 pp_string (pp, "from");
876 break;
877 case GOMP_MAP_TOFROM:
878 pp_string (pp, "tofrom");
879 break;
880 case GOMP_MAP_FORCE_ALLOC:
881 pp_string (pp, "force_alloc");
882 break;
883 case GOMP_MAP_FORCE_TO:
884 pp_string (pp, "force_to");
885 break;
886 case GOMP_MAP_FORCE_FROM:
887 pp_string (pp, "force_from");
888 break;
889 case GOMP_MAP_FORCE_TOFROM:
890 pp_string (pp, "force_tofrom");
891 break;
892 case GOMP_MAP_FORCE_PRESENT:
893 pp_string (pp, "force_present");
894 break;
895 case GOMP_MAP_DELETE:
896 pp_string (pp, "delete");
897 break;
898 case GOMP_MAP_FORCE_DEVICEPTR:
899 pp_string (pp, "force_deviceptr");
900 break;
901 case GOMP_MAP_ALWAYS_TO:
902 pp_string (pp, "always,to");
903 break;
904 case GOMP_MAP_ALWAYS_FROM:
905 pp_string (pp, "always,from");
906 break;
907 case GOMP_MAP_ALWAYS_TOFROM:
908 pp_string (pp, "always,tofrom");
909 break;
910 case GOMP_MAP_RELEASE:
911 pp_string (pp, "release");
912 break;
913 case GOMP_MAP_FIRSTPRIVATE_POINTER:
914 pp_string (pp, "firstprivate");
915 break;
916 case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
917 pp_string (pp, "firstprivate ref");
918 break;
919 case GOMP_MAP_STRUCT:
920 pp_string (pp, "struct");
921 break;
922 case GOMP_MAP_ALWAYS_POINTER:
923 pp_string (pp, "always_pointer");
924 break;
925 case GOMP_MAP_DEVICE_RESIDENT:
926 pp_string (pp, "device_resident");
927 break;
928 case GOMP_MAP_LINK:
929 pp_string (pp, "link");
930 break;
931 case GOMP_MAP_ATTACH:
932 pp_string (pp, "attach");
933 break;
934 case GOMP_MAP_DETACH:
935 pp_string (pp, "detach");
936 break;
937 case GOMP_MAP_FORCE_DETACH:
938 pp_string (pp, "force_detach");
939 break;
940 case GOMP_MAP_ATTACH_DETACH:
941 pp_string (pp, "attach_detach");
942 break;
943 case GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION:
944 pp_string (pp, "attach_zero_length_array_section");
945 break;
946 default:
947 gcc_unreachable ();
949 pp_colon (pp);
950 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
951 spc, flags, false);
952 print_clause_size:
953 if (OMP_CLAUSE_SIZE (clause))
955 switch (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
956 ? OMP_CLAUSE_MAP_KIND (clause) : GOMP_MAP_TO)
958 case GOMP_MAP_POINTER:
959 case GOMP_MAP_FIRSTPRIVATE_POINTER:
960 case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
961 case GOMP_MAP_ALWAYS_POINTER:
962 pp_string (pp, " [pointer assign, bias: ");
963 break;
964 case GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION:
965 pp_string (pp, " [pointer assign, zero-length array section, bias: ");
966 break;
967 case GOMP_MAP_TO_PSET:
968 pp_string (pp, " [pointer set, len: ");
969 break;
970 case GOMP_MAP_ATTACH:
971 case GOMP_MAP_DETACH:
972 case GOMP_MAP_FORCE_DETACH:
973 case GOMP_MAP_ATTACH_DETACH:
974 case GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION:
975 pp_string (pp, " [bias: ");
976 break;
977 default:
978 pp_string (pp, " [len: ");
979 break;
981 dump_generic_node (pp, OMP_CLAUSE_SIZE (clause),
982 spc, flags, false);
983 pp_right_bracket (pp);
985 if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
986 && OMP_CLAUSE_MAP_RUNTIME_IMPLICIT_P (clause))
987 pp_string (pp, "[implicit]");
988 pp_right_paren (pp);
989 break;
991 case OMP_CLAUSE_FROM:
992 pp_string (pp, "from(");
993 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
994 spc, flags, false);
995 goto print_clause_size;
997 case OMP_CLAUSE_TO:
998 pp_string (pp, "to(");
999 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
1000 spc, flags, false);
1001 goto print_clause_size;
1003 case OMP_CLAUSE__CACHE_:
1004 pp_string (pp, "(");
1005 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
1006 spc, flags, false);
1007 goto print_clause_size;
1009 case OMP_CLAUSE_NUM_TEAMS:
1010 pp_string (pp, "num_teams(");
1011 if (OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (clause))
1013 dump_generic_node (pp, OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (clause),
1014 spc, flags, false);
1015 pp_colon (pp);
1017 dump_generic_node (pp, OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR (clause),
1018 spc, flags, false);
1019 pp_right_paren (pp);
1020 break;
1022 case OMP_CLAUSE_THREAD_LIMIT:
1023 pp_string (pp, "thread_limit(");
1024 dump_generic_node (pp, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause),
1025 spc, flags, false);
1026 pp_right_paren (pp);
1027 break;
1029 case OMP_CLAUSE_DEVICE:
1030 pp_string (pp, "device(");
1031 if (OMP_CLAUSE_DEVICE_ANCESTOR (clause))
1032 pp_string (pp, "ancestor:");
1033 dump_generic_node (pp, OMP_CLAUSE_DEVICE_ID (clause),
1034 spc, flags, false);
1035 pp_right_paren (pp);
1036 break;
1038 case OMP_CLAUSE_DIST_SCHEDULE:
1039 pp_string (pp, "dist_schedule(static");
1040 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause))
1042 pp_comma (pp);
1043 dump_generic_node (pp,
1044 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause),
1045 spc, flags, false);
1047 pp_right_paren (pp);
1048 break;
1050 case OMP_CLAUSE_PROC_BIND:
1051 pp_string (pp, "proc_bind(");
1052 switch (OMP_CLAUSE_PROC_BIND_KIND (clause))
1054 case OMP_CLAUSE_PROC_BIND_MASTER:
1055 /* Same enum value: case OMP_CLAUSE_PROC_BIND_PRIMARY: */
1056 /* TODO: Change to 'primary' for OpenMP 5.1. */
1057 pp_string (pp, "master");
1058 break;
1059 case OMP_CLAUSE_PROC_BIND_CLOSE:
1060 pp_string (pp, "close");
1061 break;
1062 case OMP_CLAUSE_PROC_BIND_SPREAD:
1063 pp_string (pp, "spread");
1064 break;
1065 default:
1066 gcc_unreachable ();
1068 pp_right_paren (pp);
1069 break;
1071 case OMP_CLAUSE_DEVICE_TYPE:
1072 pp_string (pp, "device_type(");
1073 switch (OMP_CLAUSE_DEVICE_TYPE_KIND (clause))
1075 case OMP_CLAUSE_DEVICE_TYPE_HOST:
1076 pp_string (pp, "host");
1077 break;
1078 case OMP_CLAUSE_DEVICE_TYPE_NOHOST:
1079 pp_string (pp, "nohost");
1080 break;
1081 case OMP_CLAUSE_DEVICE_TYPE_ANY:
1082 pp_string (pp, "any");
1083 break;
1084 default:
1085 gcc_unreachable ();
1087 pp_right_paren (pp);
1088 break;
1090 case OMP_CLAUSE_SAFELEN:
1091 pp_string (pp, "safelen(");
1092 dump_generic_node (pp, OMP_CLAUSE_SAFELEN_EXPR (clause),
1093 spc, flags, false);
1094 pp_right_paren (pp);
1095 break;
1097 case OMP_CLAUSE_SIMDLEN:
1098 pp_string (pp, "simdlen(");
1099 dump_generic_node (pp, OMP_CLAUSE_SIMDLEN_EXPR (clause),
1100 spc, flags, false);
1101 pp_right_paren (pp);
1102 break;
1104 case OMP_CLAUSE_PRIORITY:
1105 pp_string (pp, "priority(");
1106 dump_generic_node (pp, OMP_CLAUSE_PRIORITY_EXPR (clause),
1107 spc, flags, false);
1108 pp_right_paren (pp);
1109 break;
1111 case OMP_CLAUSE_GRAINSIZE:
1112 pp_string (pp, "grainsize(");
1113 if (OMP_CLAUSE_GRAINSIZE_STRICT (clause))
1114 pp_string (pp, "strict:");
1115 dump_generic_node (pp, OMP_CLAUSE_GRAINSIZE_EXPR (clause),
1116 spc, flags, false);
1117 pp_right_paren (pp);
1118 break;
1120 case OMP_CLAUSE_NUM_TASKS:
1121 pp_string (pp, "num_tasks(");
1122 if (OMP_CLAUSE_NUM_TASKS_STRICT (clause))
1123 pp_string (pp, "strict:");
1124 dump_generic_node (pp, OMP_CLAUSE_NUM_TASKS_EXPR (clause),
1125 spc, flags, false);
1126 pp_right_paren (pp);
1127 break;
1129 case OMP_CLAUSE_HINT:
1130 pp_string (pp, "hint(");
1131 dump_generic_node (pp, OMP_CLAUSE_HINT_EXPR (clause),
1132 spc, flags, false);
1133 pp_right_paren (pp);
1134 break;
1136 case OMP_CLAUSE_FILTER:
1137 pp_string (pp, "filter(");
1138 dump_generic_node (pp, OMP_CLAUSE_FILTER_EXPR (clause),
1139 spc, flags, false);
1140 pp_right_paren (pp);
1141 break;
1143 case OMP_CLAUSE_DEFAULTMAP:
1144 pp_string (pp, "defaultmap(");
1145 switch (OMP_CLAUSE_DEFAULTMAP_BEHAVIOR (clause))
1147 case OMP_CLAUSE_DEFAULTMAP_ALLOC:
1148 pp_string (pp, "alloc");
1149 break;
1150 case OMP_CLAUSE_DEFAULTMAP_TO:
1151 pp_string (pp, "to");
1152 break;
1153 case OMP_CLAUSE_DEFAULTMAP_FROM:
1154 pp_string (pp, "from");
1155 break;
1156 case OMP_CLAUSE_DEFAULTMAP_TOFROM:
1157 pp_string (pp, "tofrom");
1158 break;
1159 case OMP_CLAUSE_DEFAULTMAP_FIRSTPRIVATE:
1160 pp_string (pp, "firstprivate");
1161 break;
1162 case OMP_CLAUSE_DEFAULTMAP_NONE:
1163 pp_string (pp, "none");
1164 break;
1165 case OMP_CLAUSE_DEFAULTMAP_DEFAULT:
1166 pp_string (pp, "default");
1167 break;
1168 default:
1169 gcc_unreachable ();
1171 switch (OMP_CLAUSE_DEFAULTMAP_CATEGORY (clause))
1173 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED:
1174 break;
1175 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_SCALAR:
1176 pp_string (pp, ":scalar");
1177 break;
1178 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_AGGREGATE:
1179 pp_string (pp, ":aggregate");
1180 break;
1181 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALLOCATABLE:
1182 pp_string (pp, ":allocatable");
1183 break;
1184 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_POINTER:
1185 pp_string (pp, ":pointer");
1186 break;
1187 default:
1188 gcc_unreachable ();
1190 pp_right_paren (pp);
1191 break;
1193 case OMP_CLAUSE_ORDER:
1194 pp_string (pp, "order(");
1195 if (OMP_CLAUSE_ORDER_UNCONSTRAINED (clause))
1196 pp_string (pp, "unconstrained:");
1197 else if (OMP_CLAUSE_ORDER_REPRODUCIBLE (clause))
1198 pp_string (pp, "reproducible:");
1199 pp_string (pp, "concurrent)");
1200 break;
1202 case OMP_CLAUSE_BIND:
1203 pp_string (pp, "bind(");
1204 switch (OMP_CLAUSE_BIND_KIND (clause))
1206 case OMP_CLAUSE_BIND_TEAMS:
1207 pp_string (pp, "teams");
1208 break;
1209 case OMP_CLAUSE_BIND_PARALLEL:
1210 pp_string (pp, "parallel");
1211 break;
1212 case OMP_CLAUSE_BIND_THREAD:
1213 pp_string (pp, "thread");
1214 break;
1215 default:
1216 gcc_unreachable ();
1218 pp_right_paren (pp);
1219 break;
1221 case OMP_CLAUSE__SIMDUID_:
1222 pp_string (pp, "_simduid_(");
1223 dump_generic_node (pp, OMP_CLAUSE__SIMDUID__DECL (clause),
1224 spc, flags, false);
1225 pp_right_paren (pp);
1226 break;
1228 case OMP_CLAUSE__SIMT_:
1229 pp_string (pp, "_simt_");
1230 break;
1232 case OMP_CLAUSE_GANG:
1233 pp_string (pp, "gang");
1234 if (OMP_CLAUSE_GANG_EXPR (clause) != NULL_TREE)
1236 pp_string (pp, "(num: ");
1237 dump_generic_node (pp, OMP_CLAUSE_GANG_EXPR (clause),
1238 spc, flags, false);
1240 if (OMP_CLAUSE_GANG_STATIC_EXPR (clause) != NULL_TREE)
1242 if (OMP_CLAUSE_GANG_EXPR (clause) == NULL_TREE)
1243 pp_left_paren (pp);
1244 else
1245 pp_space (pp);
1246 pp_string (pp, "static:");
1247 if (OMP_CLAUSE_GANG_STATIC_EXPR (clause)
1248 == integer_minus_one_node)
1249 pp_character (pp, '*');
1250 else
1251 dump_generic_node (pp, OMP_CLAUSE_GANG_STATIC_EXPR (clause),
1252 spc, flags, false);
1254 if (OMP_CLAUSE_GANG_EXPR (clause) != NULL_TREE
1255 || OMP_CLAUSE_GANG_STATIC_EXPR (clause) != NULL_TREE)
1256 pp_right_paren (pp);
1257 break;
1259 case OMP_CLAUSE_ASYNC:
1260 pp_string (pp, "async");
1261 if (OMP_CLAUSE_ASYNC_EXPR (clause))
1263 pp_character(pp, '(');
1264 dump_generic_node (pp, OMP_CLAUSE_ASYNC_EXPR (clause),
1265 spc, flags, false);
1266 pp_character(pp, ')');
1268 break;
1270 case OMP_CLAUSE_AUTO:
1271 case OMP_CLAUSE_SEQ:
1272 pp_string (pp, omp_clause_code_name[OMP_CLAUSE_CODE (clause)]);
1273 break;
1275 case OMP_CLAUSE_WAIT:
1276 pp_string (pp, "wait(");
1277 dump_generic_node (pp, OMP_CLAUSE_WAIT_EXPR (clause),
1278 spc, flags, false);
1279 pp_character(pp, ')');
1280 break;
1282 case OMP_CLAUSE_WORKER:
1283 pp_string (pp, "worker");
1284 if (OMP_CLAUSE_WORKER_EXPR (clause) != NULL_TREE)
1286 pp_left_paren (pp);
1287 dump_generic_node (pp, OMP_CLAUSE_WORKER_EXPR (clause),
1288 spc, flags, false);
1289 pp_right_paren (pp);
1291 break;
1293 case OMP_CLAUSE_VECTOR:
1294 pp_string (pp, "vector");
1295 if (OMP_CLAUSE_VECTOR_EXPR (clause) != NULL_TREE)
1297 pp_left_paren (pp);
1298 dump_generic_node (pp, OMP_CLAUSE_VECTOR_EXPR (clause),
1299 spc, flags, false);
1300 pp_right_paren (pp);
1302 break;
1304 case OMP_CLAUSE_NUM_GANGS:
1305 pp_string (pp, "num_gangs(");
1306 dump_generic_node (pp, OMP_CLAUSE_NUM_GANGS_EXPR (clause),
1307 spc, flags, false);
1308 pp_character (pp, ')');
1309 break;
1311 case OMP_CLAUSE_NUM_WORKERS:
1312 pp_string (pp, "num_workers(");
1313 dump_generic_node (pp, OMP_CLAUSE_NUM_WORKERS_EXPR (clause),
1314 spc, flags, false);
1315 pp_character (pp, ')');
1316 break;
1318 case OMP_CLAUSE_VECTOR_LENGTH:
1319 pp_string (pp, "vector_length(");
1320 dump_generic_node (pp, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause),
1321 spc, flags, false);
1322 pp_character (pp, ')');
1323 break;
1325 case OMP_CLAUSE_INBRANCH:
1326 pp_string (pp, "inbranch");
1327 break;
1328 case OMP_CLAUSE_NOTINBRANCH:
1329 pp_string (pp, "notinbranch");
1330 break;
1331 case OMP_CLAUSE_FOR:
1332 pp_string (pp, "for");
1333 break;
1334 case OMP_CLAUSE_PARALLEL:
1335 pp_string (pp, "parallel");
1336 break;
1337 case OMP_CLAUSE_SECTIONS:
1338 pp_string (pp, "sections");
1339 break;
1340 case OMP_CLAUSE_TASKGROUP:
1341 pp_string (pp, "taskgroup");
1342 break;
1343 case OMP_CLAUSE_NOGROUP:
1344 pp_string (pp, "nogroup");
1345 break;
1346 case OMP_CLAUSE_THREADS:
1347 pp_string (pp, "threads");
1348 break;
1349 case OMP_CLAUSE_SIMD:
1350 pp_string (pp, "simd");
1351 break;
1352 case OMP_CLAUSE_INDEPENDENT:
1353 pp_string (pp, "independent");
1354 break;
1355 case OMP_CLAUSE_TILE:
1356 pp_string (pp, "tile(");
1357 dump_generic_node (pp, OMP_CLAUSE_TILE_LIST (clause),
1358 spc, flags, false);
1359 pp_right_paren (pp);
1360 break;
1362 case OMP_CLAUSE_IF_PRESENT:
1363 pp_string (pp, "if_present");
1364 break;
1365 case OMP_CLAUSE_FINALIZE:
1366 pp_string (pp, "finalize");
1367 break;
1368 case OMP_CLAUSE_NOHOST:
1369 pp_string (pp, "nohost");
1370 break;
1371 case OMP_CLAUSE_DETACH:
1372 pp_string (pp, "detach(");
1373 dump_generic_node (pp, OMP_CLAUSE_DECL (clause), spc, flags,
1374 false);
1375 pp_right_paren (pp);
1376 break;
1378 default:
1379 gcc_unreachable ();
1384 /* Dump chain of OMP clauses.
1386 PP, SPC and FLAGS are as in dump_generic_node. */
1388 void
1389 dump_omp_clauses (pretty_printer *pp, tree clause, int spc, dump_flags_t flags,
1390 bool leading_space)
1392 while (clause)
1394 if (leading_space)
1395 pp_space (pp);
1396 dump_omp_clause (pp, clause, spc, flags);
1397 leading_space = true;
1399 clause = OMP_CLAUSE_CHAIN (clause);
1404 /* Dump location LOC to PP. */
1406 void
1407 dump_location (pretty_printer *pp, location_t loc)
1409 expanded_location xloc = expand_location (loc);
1411 pp_left_bracket (pp);
1412 if (xloc.file)
1414 pp_string (pp, xloc.file);
1415 pp_string (pp, ":");
1417 pp_decimal_int (pp, xloc.line);
1418 pp_colon (pp);
1419 pp_decimal_int (pp, xloc.column);
1420 pp_string (pp, "] ");
1424 /* Dump lexical block BLOCK. PP, SPC and FLAGS are as in
1425 dump_generic_node. */
1427 static void
1428 dump_block_node (pretty_printer *pp, tree block, int spc, dump_flags_t flags)
1430 tree t;
1432 pp_string (pp, "BLOCK #");
1433 pp_decimal_int (pp, BLOCK_NUMBER (block));
1434 pp_character (pp, ' ');
1436 if (flags & TDF_ADDRESS)
1438 pp_character (pp, '[');
1439 pp_scalar (pp, "%p", (void *) block);
1440 pp_string (pp, "] ");
1443 if (TREE_ASM_WRITTEN (block))
1444 pp_string (pp, "[written] ");
1446 if (flags & TDF_SLIM)
1447 return;
1449 if (BLOCK_SOURCE_LOCATION (block))
1450 dump_location (pp, BLOCK_SOURCE_LOCATION (block));
1452 newline_and_indent (pp, spc + 2);
1454 if (BLOCK_SUPERCONTEXT (block))
1456 pp_string (pp, "SUPERCONTEXT: ");
1457 dump_generic_node (pp, BLOCK_SUPERCONTEXT (block), 0,
1458 flags | TDF_SLIM, false);
1459 newline_and_indent (pp, spc + 2);
1462 if (BLOCK_SUBBLOCKS (block))
1464 pp_string (pp, "SUBBLOCKS: ");
1465 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
1467 dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1468 pp_space (pp);
1470 newline_and_indent (pp, spc + 2);
1473 if (BLOCK_CHAIN (block))
1475 pp_string (pp, "SIBLINGS: ");
1476 for (t = BLOCK_CHAIN (block); t; t = BLOCK_CHAIN (t))
1478 dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1479 pp_space (pp);
1481 newline_and_indent (pp, spc + 2);
1484 if (BLOCK_VARS (block))
1486 pp_string (pp, "VARS: ");
1487 for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
1489 dump_generic_node (pp, t, 0, flags, false);
1490 pp_space (pp);
1492 newline_and_indent (pp, spc + 2);
1495 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block)) > 0)
1497 unsigned i;
1498 vec<tree, va_gc> *nlv = BLOCK_NONLOCALIZED_VARS (block);
1500 pp_string (pp, "NONLOCALIZED_VARS: ");
1501 FOR_EACH_VEC_ELT (*nlv, i, t)
1503 dump_generic_node (pp, t, 0, flags, false);
1504 pp_space (pp);
1506 newline_and_indent (pp, spc + 2);
1509 if (BLOCK_ABSTRACT_ORIGIN (block))
1511 pp_string (pp, "ABSTRACT_ORIGIN: ");
1512 dump_generic_node (pp, BLOCK_ABSTRACT_ORIGIN (block), 0,
1513 flags | TDF_SLIM, false);
1514 newline_and_indent (pp, spc + 2);
1517 if (BLOCK_FRAGMENT_ORIGIN (block))
1519 pp_string (pp, "FRAGMENT_ORIGIN: ");
1520 dump_generic_node (pp, BLOCK_FRAGMENT_ORIGIN (block), 0,
1521 flags | TDF_SLIM, false);
1522 newline_and_indent (pp, spc + 2);
1525 if (BLOCK_FRAGMENT_CHAIN (block))
1527 pp_string (pp, "FRAGMENT_CHAIN: ");
1528 for (t = BLOCK_FRAGMENT_CHAIN (block); t; t = BLOCK_FRAGMENT_CHAIN (t))
1530 dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1531 pp_space (pp);
1533 newline_and_indent (pp, spc + 2);
1537 /* Dump #pragma omp atomic memory order clause. */
1539 void
1540 dump_omp_atomic_memory_order (pretty_printer *pp, enum omp_memory_order mo)
1542 switch (mo & OMP_MEMORY_ORDER_MASK)
1544 case OMP_MEMORY_ORDER_RELAXED:
1545 pp_string (pp, " relaxed");
1546 break;
1547 case OMP_MEMORY_ORDER_SEQ_CST:
1548 pp_string (pp, " seq_cst");
1549 break;
1550 case OMP_MEMORY_ORDER_ACQ_REL:
1551 pp_string (pp, " acq_rel");
1552 break;
1553 case OMP_MEMORY_ORDER_ACQUIRE:
1554 pp_string (pp, " acquire");
1555 break;
1556 case OMP_MEMORY_ORDER_RELEASE:
1557 pp_string (pp, " release");
1558 break;
1559 case OMP_MEMORY_ORDER_UNSPECIFIED:
1560 break;
1561 default:
1562 gcc_unreachable ();
1564 switch (mo & OMP_FAIL_MEMORY_ORDER_MASK)
1566 case OMP_FAIL_MEMORY_ORDER_RELAXED:
1567 pp_string (pp, " fail(relaxed)");
1568 break;
1569 case OMP_FAIL_MEMORY_ORDER_SEQ_CST:
1570 pp_string (pp, " fail(seq_cst)");
1571 break;
1572 case OMP_FAIL_MEMORY_ORDER_ACQUIRE:
1573 pp_string (pp, " fail(acquire)");
1574 break;
1575 case OMP_FAIL_MEMORY_ORDER_UNSPECIFIED:
1576 break;
1577 default:
1578 gcc_unreachable ();
1582 /* Helper to dump a MEM_REF node. */
1584 static void
1585 dump_mem_ref (pretty_printer *pp, tree node, int spc, dump_flags_t flags)
1587 if (TREE_CODE (node) == MEM_REF && (flags & TDF_GIMPLE))
1589 pp_string (pp, "__MEM <");
1590 dump_generic_node (pp, TREE_TYPE (node),
1591 spc, flags | TDF_SLIM, false);
1592 if (TYPE_ALIGN (TREE_TYPE (node))
1593 != TYPE_ALIGN (TYPE_MAIN_VARIANT (TREE_TYPE (node))))
1595 pp_string (pp, ", ");
1596 pp_decimal_int (pp, TYPE_ALIGN (TREE_TYPE (node)));
1598 pp_greater (pp);
1599 pp_string (pp, " (");
1600 if (TREE_TYPE (TREE_OPERAND (node, 0))
1601 != TREE_TYPE (TREE_OPERAND (node, 1)))
1603 pp_left_paren (pp);
1604 dump_generic_node (pp, TREE_TYPE (TREE_OPERAND (node, 1)),
1605 spc, flags | TDF_SLIM, false);
1606 pp_right_paren (pp);
1608 dump_generic_node (pp, TREE_OPERAND (node, 0),
1609 spc, flags | TDF_SLIM, false);
1610 if (! integer_zerop (TREE_OPERAND (node, 1)))
1612 pp_string (pp, " + ");
1613 dump_generic_node (pp, TREE_OPERAND (node, 1),
1614 spc, flags | TDF_SLIM, false);
1616 pp_right_paren (pp);
1618 else if (TREE_CODE (node) == MEM_REF
1619 && integer_zerop (TREE_OPERAND (node, 1))
1620 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1621 infer them and MEM_ATTR caching will share MEM_REFs
1622 with differently-typed op0s. */
1623 && TREE_CODE (TREE_OPERAND (node, 0)) != INTEGER_CST
1624 /* Released SSA_NAMES have no TREE_TYPE. */
1625 && TREE_TYPE (TREE_OPERAND (node, 0)) != NULL_TREE
1626 /* Same pointer types, but ignoring POINTER_TYPE vs.
1627 REFERENCE_TYPE. */
1628 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 0)))
1629 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1))))
1630 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 0)))
1631 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 1))))
1632 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 0)))
1633 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 1))))
1634 /* Same value types ignoring qualifiers. */
1635 && (TYPE_MAIN_VARIANT (TREE_TYPE (node))
1636 == TYPE_MAIN_VARIANT
1637 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1)))))
1638 && (!(flags & TDF_ALIAS)
1639 || MR_DEPENDENCE_CLIQUE (node) == 0))
1641 if (TREE_CODE (TREE_OPERAND (node, 0)) != ADDR_EXPR)
1643 /* Enclose pointers to arrays in parentheses. */
1644 tree op0 = TREE_OPERAND (node, 0);
1645 tree op0type = TREE_TYPE (op0);
1646 if (POINTER_TYPE_P (op0type)
1647 && TREE_CODE (TREE_TYPE (op0type)) == ARRAY_TYPE)
1648 pp_left_paren (pp);
1649 pp_star (pp);
1650 dump_generic_node (pp, op0, spc, flags, false);
1651 if (POINTER_TYPE_P (op0type)
1652 && TREE_CODE (TREE_TYPE (op0type)) == ARRAY_TYPE)
1653 pp_right_paren (pp);
1655 else
1656 dump_generic_node (pp,
1657 TREE_OPERAND (TREE_OPERAND (node, 0), 0),
1658 spc, flags, false);
1660 else
1662 pp_string (pp, "MEM");
1664 tree nodetype = TREE_TYPE (node);
1665 tree op0 = TREE_OPERAND (node, 0);
1666 tree op1 = TREE_OPERAND (node, 1);
1667 tree op1type = TYPE_MAIN_VARIANT (TREE_TYPE (op1));
1669 tree op0size = TYPE_SIZE (nodetype);
1670 tree op1size = TYPE_SIZE (TREE_TYPE (op1type));
1672 if (!op0size || !op1size
1673 || !operand_equal_p (op0size, op1size, 0))
1675 pp_string (pp, " <");
1676 /* If the size of the type of the operand is not the same
1677 as the size of the MEM_REF expression include the type
1678 of the latter similar to the TDF_GIMPLE output to make
1679 it clear how many bytes of memory are being accessed. */
1680 dump_generic_node (pp, nodetype, spc, flags | TDF_SLIM, false);
1681 pp_string (pp, "> ");
1684 pp_string (pp, "[(");
1685 dump_generic_node (pp, op1type, spc, flags | TDF_SLIM, false);
1686 pp_right_paren (pp);
1687 dump_generic_node (pp, op0, spc, flags, false);
1688 if (!integer_zerop (op1))
1690 pp_string (pp, " + ");
1691 dump_generic_node (pp, op1, spc, flags, false);
1693 if (TREE_CODE (node) == TARGET_MEM_REF)
1695 tree tmp = TMR_INDEX2 (node);
1696 if (tmp)
1698 pp_string (pp, " + ");
1699 dump_generic_node (pp, tmp, spc, flags, false);
1701 tmp = TMR_INDEX (node);
1702 if (tmp)
1704 pp_string (pp, " + ");
1705 dump_generic_node (pp, tmp, spc, flags, false);
1706 tmp = TMR_STEP (node);
1707 pp_string (pp, " * ");
1708 if (tmp)
1709 dump_generic_node (pp, tmp, spc, flags, false);
1710 else
1711 pp_string (pp, "1");
1714 if ((flags & TDF_ALIAS)
1715 && MR_DEPENDENCE_CLIQUE (node) != 0)
1717 pp_string (pp, " clique ");
1718 pp_unsigned_wide_integer (pp, MR_DEPENDENCE_CLIQUE (node));
1719 pp_string (pp, " base ");
1720 pp_unsigned_wide_integer (pp, MR_DEPENDENCE_BASE (node));
1722 pp_right_bracket (pp);
1726 /* Helper function for dump_generic_node. Dump INIT or COND expression for
1727 OpenMP loop non-rectangular iterators. */
1729 void
1730 dump_omp_loop_non_rect_expr (pretty_printer *pp, tree node, int spc,
1731 dump_flags_t flags)
1733 gcc_assert (TREE_CODE (node) == TREE_VEC);
1734 dump_generic_node (pp, TREE_VEC_ELT (node, 0), spc, flags, false);
1735 pp_string (pp, " * ");
1736 if (op_prio (TREE_VEC_ELT (node, 1)) <= op_code_prio (MULT_EXPR))
1738 pp_left_paren (pp);
1739 dump_generic_node (pp, TREE_VEC_ELT (node, 1), spc, flags, false);
1740 pp_right_paren (pp);
1742 else
1743 dump_generic_node (pp, TREE_VEC_ELT (node, 1), spc, flags, false);
1744 pp_string (pp, " + ");
1745 if (op_prio (TREE_VEC_ELT (node, 1)) <= op_code_prio (PLUS_EXPR))
1747 pp_left_paren (pp);
1748 dump_generic_node (pp, TREE_VEC_ELT (node, 2), spc, flags, false);
1749 pp_right_paren (pp);
1751 else
1752 dump_generic_node (pp, TREE_VEC_ELT (node, 2), spc, flags, false);
1755 /* Dump the node NODE on the pretty_printer PP, SPC spaces of
1756 indent. FLAGS specifies details to show in the dump (see TDF_* in
1757 dumpfile.h). If IS_STMT is true, the object printed is considered
1758 to be a statement and it is terminated by ';' if appropriate. */
1761 dump_generic_node (pretty_printer *pp, tree node, int spc, dump_flags_t flags,
1762 bool is_stmt)
1764 tree type;
1765 tree op0, op1;
1766 const char *str;
1767 bool is_expr;
1768 enum tree_code code;
1770 if (node == NULL_TREE)
1771 return spc;
1773 is_expr = EXPR_P (node);
1775 if (is_stmt && (flags & TDF_STMTADDR))
1777 pp_string (pp, "<&");
1778 pp_scalar (pp, "%p", (void *)node);
1779 pp_string (pp, "> ");
1782 if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
1783 dump_location (pp, EXPR_LOCATION (node));
1785 code = TREE_CODE (node);
1786 switch (code)
1788 case ERROR_MARK:
1789 pp_string (pp, "<<< error >>>");
1790 break;
1792 case IDENTIFIER_NODE:
1793 pp_tree_identifier (pp, node);
1794 break;
1796 case TREE_LIST:
1797 while (node && node != error_mark_node)
1799 if (TREE_PURPOSE (node))
1801 dump_generic_node (pp, TREE_PURPOSE (node), spc, flags, false);
1802 pp_space (pp);
1804 dump_generic_node (pp, TREE_VALUE (node), spc, flags, false);
1805 node = TREE_CHAIN (node);
1806 if (node && TREE_CODE (node) == TREE_LIST)
1808 pp_comma (pp);
1809 pp_space (pp);
1812 break;
1814 case TREE_BINFO:
1815 dump_generic_node (pp, BINFO_TYPE (node), spc, flags, false);
1816 break;
1818 case TREE_VEC:
1820 size_t i;
1821 if (TREE_VEC_LENGTH (node) > 0)
1823 size_t len = TREE_VEC_LENGTH (node);
1824 for (i = 0; i < len - 1; i++)
1826 dump_generic_node (pp, TREE_VEC_ELT (node, i), spc, flags,
1827 false);
1828 pp_comma (pp);
1829 pp_space (pp);
1831 dump_generic_node (pp, TREE_VEC_ELT (node, len - 1), spc,
1832 flags, false);
1835 break;
1837 case VOID_TYPE:
1838 case INTEGER_TYPE:
1839 case REAL_TYPE:
1840 case FIXED_POINT_TYPE:
1841 case COMPLEX_TYPE:
1842 case VECTOR_TYPE:
1843 case ENUMERAL_TYPE:
1844 case BOOLEAN_TYPE:
1845 case OPAQUE_TYPE:
1847 unsigned int quals = TYPE_QUALS (node);
1848 enum tree_code_class tclass;
1850 if (quals & TYPE_QUAL_ATOMIC)
1851 pp_string (pp, "atomic ");
1852 if (quals & TYPE_QUAL_CONST)
1853 pp_string (pp, "const ");
1854 if (quals & TYPE_QUAL_VOLATILE)
1855 pp_string (pp, "volatile ");
1856 if (quals & TYPE_QUAL_RESTRICT)
1857 pp_string (pp, "restrict ");
1859 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
1861 pp_string (pp, "<address-space-");
1862 pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
1863 pp_string (pp, "> ");
1866 tclass = TREE_CODE_CLASS (TREE_CODE (node));
1868 if (tclass == tcc_declaration)
1870 if (DECL_NAME (node))
1871 dump_decl_name (pp, node, flags);
1872 else
1873 pp_string (pp, "<unnamed type decl>");
1875 else if (tclass == tcc_type)
1877 if (TYPE_NAME (node))
1879 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
1880 pp_tree_identifier (pp, TYPE_NAME (node));
1881 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
1882 && DECL_NAME (TYPE_NAME (node)))
1883 dump_decl_name (pp, TYPE_NAME (node), flags);
1884 else
1885 pp_string (pp, "<unnamed type>");
1887 else if (TREE_CODE (node) == VECTOR_TYPE)
1889 pp_string (pp, "vector");
1890 pp_left_paren (pp);
1891 pp_wide_integer (pp, TYPE_VECTOR_SUBPARTS (node));
1892 pp_string (pp, ") ");
1893 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
1895 else if (TREE_CODE (node) == INTEGER_TYPE)
1897 if (TYPE_PRECISION (node) == CHAR_TYPE_SIZE)
1898 pp_string (pp, (TYPE_UNSIGNED (node)
1899 ? "unsigned char"
1900 : "signed char"));
1901 else if (TYPE_PRECISION (node) == SHORT_TYPE_SIZE)
1902 pp_string (pp, (TYPE_UNSIGNED (node)
1903 ? "unsigned short"
1904 : "signed short"));
1905 else if (TYPE_PRECISION (node) == INT_TYPE_SIZE)
1906 pp_string (pp, (TYPE_UNSIGNED (node)
1907 ? "unsigned int"
1908 : "signed int"));
1909 else if (TYPE_PRECISION (node) == LONG_TYPE_SIZE)
1910 pp_string (pp, (TYPE_UNSIGNED (node)
1911 ? "unsigned long"
1912 : "signed long"));
1913 else if (TYPE_PRECISION (node) == LONG_LONG_TYPE_SIZE)
1914 pp_string (pp, (TYPE_UNSIGNED (node)
1915 ? "unsigned long long"
1916 : "signed long long"));
1917 else if (TYPE_PRECISION (node) >= CHAR_TYPE_SIZE
1918 && pow2p_hwi (TYPE_PRECISION (node)))
1920 pp_string (pp, (TYPE_UNSIGNED (node) ? "uint" : "int"));
1921 pp_decimal_int (pp, TYPE_PRECISION (node));
1922 pp_string (pp, "_t");
1924 else
1926 pp_string (pp, (TYPE_UNSIGNED (node)
1927 ? "<unnamed-unsigned:"
1928 : "<unnamed-signed:"));
1929 pp_decimal_int (pp, TYPE_PRECISION (node));
1930 pp_greater (pp);
1933 else if (TREE_CODE (node) == COMPLEX_TYPE)
1935 pp_string (pp, "__complex__ ");
1936 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
1938 else if (TREE_CODE (node) == REAL_TYPE)
1940 pp_string (pp, "<float:");
1941 pp_decimal_int (pp, TYPE_PRECISION (node));
1942 pp_greater (pp);
1944 else if (TREE_CODE (node) == FIXED_POINT_TYPE)
1946 pp_string (pp, "<fixed-point-");
1947 pp_string (pp, TYPE_SATURATING (node) ? "sat:" : "nonsat:");
1948 pp_decimal_int (pp, TYPE_PRECISION (node));
1949 pp_greater (pp);
1951 else if (TREE_CODE (node) == BOOLEAN_TYPE)
1953 pp_string (pp, (TYPE_UNSIGNED (node)
1954 ? "<unsigned-boolean:"
1955 : "<signed-boolean:"));
1956 pp_decimal_int (pp, TYPE_PRECISION (node));
1957 pp_greater (pp);
1959 else if (TREE_CODE (node) == VOID_TYPE)
1960 pp_string (pp, "void");
1961 else
1962 pp_string (pp, "<unnamed type>");
1964 break;
1967 case POINTER_TYPE:
1968 case REFERENCE_TYPE:
1969 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
1971 if (TREE_TYPE (node) == NULL)
1973 pp_string (pp, str);
1974 pp_string (pp, "<null type>");
1976 else if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
1978 tree fnode = TREE_TYPE (node);
1980 dump_generic_node (pp, TREE_TYPE (fnode), spc, flags, false);
1981 pp_space (pp);
1982 pp_left_paren (pp);
1983 pp_string (pp, str);
1984 if (TYPE_IDENTIFIER (node))
1985 dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
1986 else if (flags & TDF_NOUID)
1987 pp_string (pp, "<Txxxx>");
1988 else
1990 pp_string (pp, "<T");
1991 pp_scalar (pp, "%x", TYPE_UID (node));
1992 pp_character (pp, '>');
1995 pp_right_paren (pp);
1996 dump_function_declaration (pp, fnode, spc, flags);
1998 else
2000 unsigned int quals = TYPE_QUALS (node);
2002 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2003 pp_space (pp);
2004 pp_string (pp, str);
2006 if (quals & TYPE_QUAL_CONST)
2007 pp_string (pp, " const");
2008 if (quals & TYPE_QUAL_VOLATILE)
2009 pp_string (pp, " volatile");
2010 if (quals & TYPE_QUAL_RESTRICT)
2011 pp_string (pp, " restrict");
2013 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
2015 pp_string (pp, " <address-space-");
2016 pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
2017 pp_greater (pp);
2020 if (TYPE_REF_CAN_ALIAS_ALL (node))
2021 pp_string (pp, " {ref-all}");
2023 break;
2025 case OFFSET_TYPE:
2026 NIY;
2027 break;
2029 case MEM_REF:
2030 case TARGET_MEM_REF:
2031 dump_mem_ref (pp, node, spc, flags);
2032 break;
2034 case ARRAY_TYPE:
2036 unsigned int quals = TYPE_QUALS (node);
2037 tree tmp;
2039 if (quals & TYPE_QUAL_ATOMIC)
2040 pp_string (pp, "atomic ");
2041 if (quals & TYPE_QUAL_CONST)
2042 pp_string (pp, "const ");
2043 if (quals & TYPE_QUAL_VOLATILE)
2044 pp_string (pp, "volatile ");
2046 /* Print the innermost component type. */
2047 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
2048 tmp = TREE_TYPE (tmp))
2050 dump_generic_node (pp, tmp, spc, flags, false);
2052 /* Print the dimensions. */
2053 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
2054 dump_array_domain (pp, TYPE_DOMAIN (tmp), spc, flags);
2055 break;
2058 case RECORD_TYPE:
2059 case UNION_TYPE:
2060 case QUAL_UNION_TYPE:
2062 unsigned int quals = TYPE_QUALS (node);
2064 if (quals & TYPE_QUAL_ATOMIC)
2065 pp_string (pp, "atomic ");
2066 if (quals & TYPE_QUAL_CONST)
2067 pp_string (pp, "const ");
2068 if (quals & TYPE_QUAL_VOLATILE)
2069 pp_string (pp, "volatile ");
2071 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
2073 pp_string (pp, "<address-space-");
2074 pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
2075 pp_string (pp, "> ");
2078 /* Print the name of the structure. */
2079 if (TREE_CODE (node) == RECORD_TYPE)
2080 pp_string (pp, "struct ");
2081 else if (TREE_CODE (node) == UNION_TYPE)
2082 pp_string (pp, "union ");
2084 if (TYPE_NAME (node))
2085 dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
2086 else if (!(flags & TDF_SLIM))
2087 /* FIXME: If we eliminate the 'else' above and attempt
2088 to show the fields for named types, we may get stuck
2089 following a cycle of pointers to structs. The alleged
2090 self-reference check in print_struct_decl will not detect
2091 cycles involving more than one pointer or struct type. */
2092 print_struct_decl (pp, node, spc, flags);
2093 break;
2096 case LANG_TYPE:
2097 NIY;
2098 break;
2100 case INTEGER_CST:
2101 if (flags & TDF_GIMPLE
2102 && (POINTER_TYPE_P (TREE_TYPE (node))
2103 || (TYPE_PRECISION (TREE_TYPE (node))
2104 < TYPE_PRECISION (integer_type_node))
2105 || exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1
2106 || tree_int_cst_sgn (node) < 0))
2108 pp_string (pp, "_Literal (");
2109 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2110 pp_string (pp, ") ");
2112 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE
2113 && ! (flags & TDF_GIMPLE))
2115 /* In the case of a pointer, one may want to divide by the
2116 size of the pointed-to type. Unfortunately, this not
2117 straightforward. The C front-end maps expressions
2119 (int *) 5
2120 int *p; (p + 5)
2122 in such a way that the two INTEGER_CST nodes for "5" have
2123 different values but identical types. In the latter
2124 case, the 5 is multiplied by sizeof (int) in c-common.cc
2125 (pointer_int_sum) to convert it to a byte address, and
2126 yet the type of the node is left unchanged. Argh. What
2127 is consistent though is that the number value corresponds
2128 to bytes (UNITS) offset.
2130 NB: Neither of the following divisors can be trivially
2131 used to recover the original literal:
2133 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
2134 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
2135 pp_wide_integer (pp, TREE_INT_CST_LOW (node));
2136 pp_string (pp, "B"); /* pseudo-unit */
2138 else if (tree_fits_shwi_p (node))
2139 pp_wide_integer (pp, tree_to_shwi (node));
2140 else if (tree_fits_uhwi_p (node))
2141 pp_unsigned_wide_integer (pp, tree_to_uhwi (node));
2142 else
2144 wide_int val = wi::to_wide (node);
2146 if (wi::neg_p (val, TYPE_SIGN (TREE_TYPE (node))))
2148 pp_minus (pp);
2149 val = -val;
2151 print_hex (val, pp_buffer (pp)->digit_buffer);
2152 pp_string (pp, pp_buffer (pp)->digit_buffer);
2154 if ((flags & TDF_GIMPLE)
2155 && ! (POINTER_TYPE_P (TREE_TYPE (node))
2156 || (TYPE_PRECISION (TREE_TYPE (node))
2157 < TYPE_PRECISION (integer_type_node))
2158 || exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1))
2160 if (TYPE_UNSIGNED (TREE_TYPE (node)))
2161 pp_character (pp, 'u');
2162 if (TYPE_PRECISION (TREE_TYPE (node))
2163 == TYPE_PRECISION (unsigned_type_node))
2165 else if (TYPE_PRECISION (TREE_TYPE (node))
2166 == TYPE_PRECISION (long_unsigned_type_node))
2167 pp_character (pp, 'l');
2168 else if (TYPE_PRECISION (TREE_TYPE (node))
2169 == TYPE_PRECISION (long_long_unsigned_type_node))
2170 pp_string (pp, "ll");
2172 if (TREE_OVERFLOW (node))
2173 pp_string (pp, "(OVF)");
2174 break;
2176 case POLY_INT_CST:
2177 pp_string (pp, "POLY_INT_CST [");
2178 dump_generic_node (pp, POLY_INT_CST_COEFF (node, 0), spc, flags, false);
2179 for (unsigned int i = 1; i < NUM_POLY_INT_COEFFS; ++i)
2181 pp_string (pp, ", ");
2182 dump_generic_node (pp, POLY_INT_CST_COEFF (node, i),
2183 spc, flags, false);
2185 pp_string (pp, "]");
2186 break;
2188 case REAL_CST:
2189 /* Code copied from print_node. */
2191 REAL_VALUE_TYPE d;
2192 if (TREE_OVERFLOW (node))
2193 pp_string (pp, " overflow");
2195 d = TREE_REAL_CST (node);
2196 if (REAL_VALUE_ISINF (d))
2197 pp_string (pp, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
2198 else if (REAL_VALUE_ISNAN (d))
2199 pp_string (pp, " Nan");
2200 else
2202 char string[100];
2203 real_to_decimal (string, &d, sizeof (string), 0, 1);
2204 pp_string (pp, string);
2206 break;
2209 case FIXED_CST:
2211 char string[100];
2212 fixed_to_decimal (string, TREE_FIXED_CST_PTR (node), sizeof (string));
2213 pp_string (pp, string);
2214 break;
2217 case COMPLEX_CST:
2218 pp_string (pp, "__complex__ (");
2219 dump_generic_node (pp, TREE_REALPART (node), spc, flags, false);
2220 pp_string (pp, ", ");
2221 dump_generic_node (pp, TREE_IMAGPART (node), spc, flags, false);
2222 pp_right_paren (pp);
2223 break;
2225 case STRING_CST:
2227 pp_string (pp, "\"");
2228 if (unsigned nbytes = TREE_STRING_LENGTH (node))
2229 pretty_print_string (pp, TREE_STRING_POINTER (node), nbytes);
2230 pp_string (pp, "\"");
2231 break;
2234 case VECTOR_CST:
2236 unsigned i;
2237 if (flags & TDF_GIMPLE)
2239 pp_string (pp, "_Literal (");
2240 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2241 pp_string (pp, ") ");
2243 pp_string (pp, "{ ");
2244 unsigned HOST_WIDE_INT nunits;
2245 if (!VECTOR_CST_NELTS (node).is_constant (&nunits))
2246 nunits = vector_cst_encoded_nelts (node);
2247 for (i = 0; i < nunits; ++i)
2249 if (i != 0)
2250 pp_string (pp, ", ");
2251 dump_generic_node (pp, VECTOR_CST_ELT (node, i),
2252 spc, flags, false);
2254 if (!VECTOR_CST_NELTS (node).is_constant ())
2255 pp_string (pp, ", ...");
2256 pp_string (pp, " }");
2258 break;
2260 case FUNCTION_TYPE:
2261 case METHOD_TYPE:
2262 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2263 pp_space (pp);
2264 if (TREE_CODE (node) == METHOD_TYPE)
2266 if (TYPE_METHOD_BASETYPE (node))
2267 dump_generic_node (pp, TYPE_NAME (TYPE_METHOD_BASETYPE (node)),
2268 spc, flags, false);
2269 else
2270 pp_string (pp, "<null method basetype>");
2271 pp_colon_colon (pp);
2273 if (TYPE_IDENTIFIER (node))
2274 dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
2275 else if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
2276 dump_decl_name (pp, TYPE_NAME (node), flags);
2277 else if (flags & TDF_NOUID)
2278 pp_string (pp, "<Txxxx>");
2279 else
2281 pp_string (pp, "<T");
2282 pp_scalar (pp, "%x", TYPE_UID (node));
2283 pp_character (pp, '>');
2285 dump_function_declaration (pp, node, spc, flags);
2286 break;
2288 case FUNCTION_DECL:
2289 case CONST_DECL:
2290 dump_decl_name (pp, node, flags);
2291 break;
2293 case LABEL_DECL:
2294 if (DECL_NAME (node))
2295 dump_decl_name (pp, node, flags);
2296 else if (LABEL_DECL_UID (node) != -1)
2298 if (flags & TDF_GIMPLE)
2300 pp_character (pp, 'L');
2301 pp_decimal_int (pp, (int) LABEL_DECL_UID (node));
2303 else
2305 pp_string (pp, "<L");
2306 pp_decimal_int (pp, (int) LABEL_DECL_UID (node));
2307 pp_character (pp, '>');
2310 else
2312 if (flags & TDF_NOUID)
2313 pp_string (pp, "<D.xxxx>");
2314 else
2316 if (flags & TDF_GIMPLE)
2318 pp_character (pp, 'D');
2319 pp_scalar (pp, "%u", DECL_UID (node));
2321 else
2323 pp_string (pp, "<D.");
2324 pp_scalar (pp, "%u", DECL_UID (node));
2325 pp_character (pp, '>');
2329 break;
2331 case TYPE_DECL:
2332 if (DECL_IS_UNDECLARED_BUILTIN (node))
2334 /* Don't print the declaration of built-in types. */
2335 break;
2337 if (DECL_NAME (node))
2338 dump_decl_name (pp, node, flags);
2339 else if (TYPE_NAME (TREE_TYPE (node)) != node)
2341 pp_string (pp, (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
2342 ? "union" : "struct "));
2343 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2345 else
2346 pp_string (pp, "<anon>");
2347 break;
2349 case VAR_DECL:
2350 case PARM_DECL:
2351 case FIELD_DECL:
2352 case DEBUG_EXPR_DECL:
2353 case NAMESPACE_DECL:
2354 case NAMELIST_DECL:
2355 dump_decl_name (pp, node, flags);
2356 break;
2358 case RESULT_DECL:
2359 pp_string (pp, "<retval>");
2360 break;
2362 case COMPONENT_REF:
2363 op0 = TREE_OPERAND (node, 0);
2364 str = ".";
2365 if (op0
2366 && (TREE_CODE (op0) == INDIRECT_REF
2367 || (TREE_CODE (op0) == MEM_REF
2368 && TREE_CODE (TREE_OPERAND (op0, 0)) != ADDR_EXPR
2369 && integer_zerop (TREE_OPERAND (op0, 1))
2370 /* Dump the types of INTEGER_CSTs explicitly, for we
2371 can't infer them and MEM_ATTR caching will share
2372 MEM_REFs with differently-typed op0s. */
2373 && TREE_CODE (TREE_OPERAND (op0, 0)) != INTEGER_CST
2374 /* Released SSA_NAMES have no TREE_TYPE. */
2375 && TREE_TYPE (TREE_OPERAND (op0, 0)) != NULL_TREE
2376 /* Same pointer types, but ignoring POINTER_TYPE vs.
2377 REFERENCE_TYPE. */
2378 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 0)))
2379 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1))))
2380 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 0)))
2381 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 1))))
2382 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 0)))
2383 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 1))))
2384 /* Same value types ignoring qualifiers. */
2385 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0))
2386 == TYPE_MAIN_VARIANT
2387 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1)))))
2388 && MR_DEPENDENCE_CLIQUE (op0) == 0)))
2390 op0 = TREE_OPERAND (op0, 0);
2391 str = "->";
2393 if (op_prio (op0) < op_prio (node))
2394 pp_left_paren (pp);
2395 dump_generic_node (pp, op0, spc, flags, false);
2396 if (op_prio (op0) < op_prio (node))
2397 pp_right_paren (pp);
2398 pp_string (pp, str);
2399 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2400 op0 = component_ref_field_offset (node);
2401 if (op0 && TREE_CODE (op0) != INTEGER_CST)
2403 pp_string (pp, "{off: ");
2404 dump_generic_node (pp, op0, spc, flags, false);
2405 pp_right_brace (pp);
2407 break;
2409 case BIT_FIELD_REF:
2410 if (flags & TDF_GIMPLE)
2412 pp_string (pp, "__BIT_FIELD_REF <");
2413 dump_generic_node (pp, TREE_TYPE (node),
2414 spc, flags | TDF_SLIM, false);
2415 if (TYPE_ALIGN (TREE_TYPE (node))
2416 != TYPE_ALIGN (TYPE_MAIN_VARIANT (TREE_TYPE (node))))
2418 pp_string (pp, ", ");
2419 pp_decimal_int (pp, TYPE_ALIGN (TREE_TYPE (node)));
2421 pp_greater (pp);
2422 pp_string (pp, " (");
2423 dump_generic_node (pp, TREE_OPERAND (node, 0), spc,
2424 flags | TDF_SLIM, false);
2425 pp_string (pp, ", ");
2426 dump_generic_node (pp, TREE_OPERAND (node, 1), spc,
2427 flags | TDF_SLIM, false);
2428 pp_string (pp, ", ");
2429 dump_generic_node (pp, TREE_OPERAND (node, 2), spc,
2430 flags | TDF_SLIM, false);
2431 pp_right_paren (pp);
2433 else
2435 pp_string (pp, "BIT_FIELD_REF <");
2436 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2437 pp_string (pp, ", ");
2438 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2439 pp_string (pp, ", ");
2440 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2441 pp_greater (pp);
2443 break;
2445 case BIT_INSERT_EXPR:
2446 pp_string (pp, "BIT_INSERT_EXPR <");
2447 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2448 pp_string (pp, ", ");
2449 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2450 pp_string (pp, ", ");
2451 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2452 pp_string (pp, " (");
2453 if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (node, 1))))
2454 pp_decimal_int (pp,
2455 TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (node, 1))));
2456 else
2457 dump_generic_node (pp, TYPE_SIZE (TREE_TYPE (TREE_OPERAND (node, 1))),
2458 spc, flags, false);
2459 pp_string (pp, " bits)>");
2460 break;
2462 case ARRAY_REF:
2463 case ARRAY_RANGE_REF:
2464 op0 = TREE_OPERAND (node, 0);
2465 if (op_prio (op0) < op_prio (node))
2466 pp_left_paren (pp);
2467 dump_generic_node (pp, op0, spc, flags, false);
2468 if (op_prio (op0) < op_prio (node))
2469 pp_right_paren (pp);
2470 pp_left_bracket (pp);
2471 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2472 if (TREE_CODE (node) == ARRAY_RANGE_REF)
2473 pp_string (pp, " ...");
2474 pp_right_bracket (pp);
2476 op0 = array_ref_low_bound (node);
2477 op1 = array_ref_element_size (node);
2479 if (!integer_zerop (op0)
2480 || TREE_OPERAND (node, 2)
2481 || TREE_OPERAND (node, 3))
2483 pp_string (pp, "{lb: ");
2484 dump_generic_node (pp, op0, spc, flags, false);
2485 pp_string (pp, " sz: ");
2486 dump_generic_node (pp, op1, spc, flags, false);
2487 pp_right_brace (pp);
2489 break;
2491 case CONSTRUCTOR:
2493 unsigned HOST_WIDE_INT ix;
2494 tree field, val;
2495 bool is_struct_init = false;
2496 bool is_array_init = false;
2497 widest_int curidx;
2498 if (flags & TDF_GIMPLE)
2500 pp_string (pp, "_Literal (");
2501 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2502 pp_string (pp, ") ");
2504 pp_left_brace (pp);
2505 if (TREE_CLOBBER_P (node))
2507 pp_string (pp, "CLOBBER");
2508 if (CLOBBER_KIND (node) == CLOBBER_EOL)
2509 pp_string (pp, "(eol)");
2511 else if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
2512 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
2513 is_struct_init = true;
2514 else if (TREE_CODE (TREE_TYPE (node)) == ARRAY_TYPE
2515 && TYPE_DOMAIN (TREE_TYPE (node))
2516 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)))
2517 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node))))
2518 == INTEGER_CST)
2520 tree minv = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)));
2521 is_array_init = true;
2522 curidx = wi::to_widest (minv);
2524 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
2526 if (field)
2528 if (is_struct_init)
2530 pp_dot (pp);
2531 dump_generic_node (pp, field, spc, flags, false);
2532 pp_equal (pp);
2534 else if (is_array_init
2535 && (TREE_CODE (field) != INTEGER_CST
2536 || curidx != wi::to_widest (field)))
2538 pp_left_bracket (pp);
2539 if (TREE_CODE (field) == RANGE_EXPR)
2541 dump_generic_node (pp, TREE_OPERAND (field, 0), spc,
2542 flags, false);
2543 pp_string (pp, " ... ");
2544 dump_generic_node (pp, TREE_OPERAND (field, 1), spc,
2545 flags, false);
2546 if (TREE_CODE (TREE_OPERAND (field, 1)) == INTEGER_CST)
2547 curidx = wi::to_widest (TREE_OPERAND (field, 1));
2549 else
2550 dump_generic_node (pp, field, spc, flags, false);
2551 if (TREE_CODE (field) == INTEGER_CST)
2552 curidx = wi::to_widest (field);
2553 pp_string (pp, "]=");
2556 if (is_array_init)
2557 curidx += 1;
2558 if (val && TREE_CODE (val) == ADDR_EXPR)
2559 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
2560 val = TREE_OPERAND (val, 0);
2561 if (val && TREE_CODE (val) == FUNCTION_DECL)
2562 dump_decl_name (pp, val, flags);
2563 else
2564 dump_generic_node (pp, val, spc, flags, false);
2565 if (ix != CONSTRUCTOR_NELTS (node) - 1)
2567 pp_comma (pp);
2568 pp_space (pp);
2571 pp_right_brace (pp);
2573 break;
2575 case COMPOUND_EXPR:
2577 tree *tp;
2578 if (flags & TDF_SLIM)
2580 pp_string (pp, "<COMPOUND_EXPR>");
2581 break;
2584 dump_generic_node (pp, TREE_OPERAND (node, 0),
2585 spc, flags, !(flags & TDF_SLIM));
2586 if (flags & TDF_SLIM)
2587 newline_and_indent (pp, spc);
2588 else
2590 pp_comma (pp);
2591 pp_space (pp);
2594 for (tp = &TREE_OPERAND (node, 1);
2595 TREE_CODE (*tp) == COMPOUND_EXPR;
2596 tp = &TREE_OPERAND (*tp, 1))
2598 dump_generic_node (pp, TREE_OPERAND (*tp, 0),
2599 spc, flags, !(flags & TDF_SLIM));
2600 if (flags & TDF_SLIM)
2601 newline_and_indent (pp, spc);
2602 else
2604 pp_comma (pp);
2605 pp_space (pp);
2609 dump_generic_node (pp, *tp, spc, flags, !(flags & TDF_SLIM));
2611 break;
2613 case STATEMENT_LIST:
2615 tree_stmt_iterator si;
2616 bool first = true;
2618 if (flags & TDF_SLIM)
2620 pp_string (pp, "<STATEMENT_LIST>");
2621 break;
2624 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
2626 if (!first)
2627 newline_and_indent (pp, spc);
2628 else
2629 first = false;
2630 dump_generic_node (pp, tsi_stmt (si), spc, flags, true);
2633 break;
2635 case MODIFY_EXPR:
2636 case INIT_EXPR:
2637 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags,
2638 false);
2639 pp_space (pp);
2640 pp_equal (pp);
2641 pp_space (pp);
2642 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags,
2643 false);
2644 break;
2646 case TARGET_EXPR:
2647 pp_string (pp, "TARGET_EXPR <");
2648 dump_generic_node (pp, TARGET_EXPR_SLOT (node), spc, flags, false);
2649 pp_comma (pp);
2650 pp_space (pp);
2651 dump_generic_node (pp, TARGET_EXPR_INITIAL (node), spc, flags, false);
2652 pp_greater (pp);
2653 break;
2655 case DECL_EXPR:
2656 print_declaration (pp, DECL_EXPR_DECL (node), spc, flags);
2657 is_stmt = false;
2658 break;
2660 case COND_EXPR:
2661 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
2663 pp_string (pp, "if (");
2664 dump_generic_node (pp, COND_EXPR_COND (node), spc, flags, false);
2665 pp_right_paren (pp);
2666 /* The lowered cond_exprs should always be printed in full. */
2667 if (COND_EXPR_THEN (node)
2668 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
2669 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
2670 && COND_EXPR_ELSE (node)
2671 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
2672 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
2674 pp_space (pp);
2675 dump_generic_node (pp, COND_EXPR_THEN (node),
2676 0, flags, true);
2677 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
2679 pp_string (pp, " else ");
2680 dump_generic_node (pp, COND_EXPR_ELSE (node),
2681 0, flags, true);
2684 else if (!(flags & TDF_SLIM))
2686 /* Output COND_EXPR_THEN. */
2687 if (COND_EXPR_THEN (node))
2689 newline_and_indent (pp, spc+2);
2690 pp_left_brace (pp);
2691 newline_and_indent (pp, spc+4);
2692 dump_generic_node (pp, COND_EXPR_THEN (node), spc+4,
2693 flags, true);
2694 newline_and_indent (pp, spc+2);
2695 pp_right_brace (pp);
2698 /* Output COND_EXPR_ELSE. */
2699 if (COND_EXPR_ELSE (node)
2700 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
2702 newline_and_indent (pp, spc);
2703 pp_string (pp, "else");
2704 newline_and_indent (pp, spc+2);
2705 pp_left_brace (pp);
2706 newline_and_indent (pp, spc+4);
2707 dump_generic_node (pp, COND_EXPR_ELSE (node), spc+4,
2708 flags, true);
2709 newline_and_indent (pp, spc+2);
2710 pp_right_brace (pp);
2713 is_expr = false;
2715 else
2717 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2718 pp_space (pp);
2719 pp_question (pp);
2720 pp_space (pp);
2721 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2722 pp_space (pp);
2723 pp_colon (pp);
2724 pp_space (pp);
2725 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2727 break;
2729 case BIND_EXPR:
2730 pp_left_brace (pp);
2731 if (!(flags & TDF_SLIM))
2733 if (BIND_EXPR_VARS (node))
2735 pp_newline (pp);
2737 for (op0 = BIND_EXPR_VARS (node); op0; op0 = DECL_CHAIN (op0))
2739 print_declaration (pp, op0, spc+2, flags);
2740 pp_newline (pp);
2744 newline_and_indent (pp, spc+2);
2745 dump_generic_node (pp, BIND_EXPR_BODY (node), spc+2, flags, true);
2746 newline_and_indent (pp, spc);
2747 pp_right_brace (pp);
2749 is_expr = false;
2750 break;
2752 case CALL_EXPR:
2753 if (CALL_EXPR_FN (node) != NULL_TREE)
2754 print_call_name (pp, CALL_EXPR_FN (node), flags);
2755 else
2757 pp_dot (pp);
2758 pp_string (pp, internal_fn_name (CALL_EXPR_IFN (node)));
2761 /* Print parameters. */
2762 pp_space (pp);
2763 pp_left_paren (pp);
2765 tree arg;
2766 call_expr_arg_iterator iter;
2767 FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
2769 dump_generic_node (pp, arg, spc, flags, false);
2770 if (more_call_expr_args_p (&iter))
2772 pp_comma (pp);
2773 pp_space (pp);
2777 if (CALL_EXPR_VA_ARG_PACK (node))
2779 if (call_expr_nargs (node) > 0)
2781 pp_comma (pp);
2782 pp_space (pp);
2784 pp_string (pp, "__builtin_va_arg_pack ()");
2786 pp_right_paren (pp);
2788 op1 = CALL_EXPR_STATIC_CHAIN (node);
2789 if (op1)
2791 pp_string (pp, " [static-chain: ");
2792 dump_generic_node (pp, op1, spc, flags, false);
2793 pp_right_bracket (pp);
2796 if (CALL_EXPR_RETURN_SLOT_OPT (node))
2797 pp_string (pp, " [return slot optimization]");
2798 if (CALL_EXPR_TAILCALL (node))
2799 pp_string (pp, " [tail call]");
2800 break;
2802 case WITH_CLEANUP_EXPR:
2803 NIY;
2804 break;
2806 case CLEANUP_POINT_EXPR:
2807 pp_string (pp, "<<cleanup_point ");
2808 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2809 pp_string (pp, ">>");
2810 break;
2812 case PLACEHOLDER_EXPR:
2813 pp_string (pp, "<PLACEHOLDER_EXPR ");
2814 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2815 pp_greater (pp);
2816 break;
2818 /* Binary arithmetic and logic expressions. */
2819 case WIDEN_PLUS_EXPR:
2820 case WIDEN_MINUS_EXPR:
2821 case WIDEN_SUM_EXPR:
2822 case WIDEN_MULT_EXPR:
2823 case MULT_EXPR:
2824 case MULT_HIGHPART_EXPR:
2825 case PLUS_EXPR:
2826 case POINTER_PLUS_EXPR:
2827 case POINTER_DIFF_EXPR:
2828 case MINUS_EXPR:
2829 case TRUNC_DIV_EXPR:
2830 case CEIL_DIV_EXPR:
2831 case FLOOR_DIV_EXPR:
2832 case ROUND_DIV_EXPR:
2833 case TRUNC_MOD_EXPR:
2834 case CEIL_MOD_EXPR:
2835 case FLOOR_MOD_EXPR:
2836 case ROUND_MOD_EXPR:
2837 case RDIV_EXPR:
2838 case EXACT_DIV_EXPR:
2839 case LSHIFT_EXPR:
2840 case RSHIFT_EXPR:
2841 case LROTATE_EXPR:
2842 case RROTATE_EXPR:
2843 case WIDEN_LSHIFT_EXPR:
2844 case BIT_IOR_EXPR:
2845 case BIT_XOR_EXPR:
2846 case BIT_AND_EXPR:
2847 case TRUTH_ANDIF_EXPR:
2848 case TRUTH_ORIF_EXPR:
2849 case TRUTH_AND_EXPR:
2850 case TRUTH_OR_EXPR:
2851 case TRUTH_XOR_EXPR:
2852 case LT_EXPR:
2853 case LE_EXPR:
2854 case GT_EXPR:
2855 case GE_EXPR:
2856 case EQ_EXPR:
2857 case NE_EXPR:
2858 case UNLT_EXPR:
2859 case UNLE_EXPR:
2860 case UNGT_EXPR:
2861 case UNGE_EXPR:
2862 case UNEQ_EXPR:
2863 case LTGT_EXPR:
2864 case ORDERED_EXPR:
2865 case UNORDERED_EXPR:
2867 const char *op = op_symbol (node);
2868 op0 = TREE_OPERAND (node, 0);
2869 op1 = TREE_OPERAND (node, 1);
2871 /* When the operands are expressions with less priority,
2872 keep semantics of the tree representation. */
2873 if (op_prio (op0) <= op_prio (node))
2875 pp_left_paren (pp);
2876 dump_generic_node (pp, op0, spc, flags, false);
2877 pp_right_paren (pp);
2879 else
2880 dump_generic_node (pp, op0, spc, flags, false);
2882 pp_space (pp);
2883 pp_string (pp, op);
2884 pp_space (pp);
2886 /* When the operands are expressions with less priority,
2887 keep semantics of the tree representation. */
2888 if (op_prio (op1) <= op_prio (node))
2890 pp_left_paren (pp);
2891 dump_generic_node (pp, op1, spc, flags, false);
2892 pp_right_paren (pp);
2894 else
2895 dump_generic_node (pp, op1, spc, flags, false);
2897 break;
2899 /* Unary arithmetic and logic expressions. */
2900 case ADDR_EXPR:
2901 if (flags & TDF_GIMPLE_VAL)
2903 pp_string (pp, "_Literal (");
2904 dump_generic_node (pp, TREE_TYPE (node), spc,
2905 flags & ~TDF_GIMPLE_VAL, false);
2906 pp_character (pp, ')');
2908 /* Fallthru. */
2909 case NEGATE_EXPR:
2910 case BIT_NOT_EXPR:
2911 case TRUTH_NOT_EXPR:
2912 case PREDECREMENT_EXPR:
2913 case PREINCREMENT_EXPR:
2914 case INDIRECT_REF:
2915 if (!(flags & TDF_GIMPLE)
2916 && TREE_CODE (node) == ADDR_EXPR
2917 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
2918 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
2919 /* Do not output '&' for strings and function pointers when not
2920 dumping GIMPLE FE syntax. */
2922 else
2923 pp_string (pp, op_symbol (node));
2925 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
2927 pp_left_paren (pp);
2928 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2929 pp_right_paren (pp);
2931 else
2932 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2933 break;
2935 case POSTDECREMENT_EXPR:
2936 case POSTINCREMENT_EXPR:
2937 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
2939 pp_left_paren (pp);
2940 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2941 pp_right_paren (pp);
2943 else
2944 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2945 pp_string (pp, op_symbol (node));
2946 break;
2948 case MIN_EXPR:
2949 pp_string (pp, "MIN_EXPR <");
2950 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2951 pp_string (pp, ", ");
2952 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2953 pp_greater (pp);
2954 break;
2956 case MAX_EXPR:
2957 pp_string (pp, "MAX_EXPR <");
2958 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2959 pp_string (pp, ", ");
2960 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2961 pp_greater (pp);
2962 break;
2964 case ABS_EXPR:
2965 pp_string (pp, "ABS_EXPR <");
2966 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2967 pp_greater (pp);
2968 break;
2970 case ABSU_EXPR:
2971 pp_string (pp, "ABSU_EXPR <");
2972 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2973 pp_greater (pp);
2974 break;
2976 case RANGE_EXPR:
2977 NIY;
2978 break;
2980 case ADDR_SPACE_CONVERT_EXPR:
2981 case FIXED_CONVERT_EXPR:
2982 case FIX_TRUNC_EXPR:
2983 case FLOAT_EXPR:
2984 CASE_CONVERT:
2985 type = TREE_TYPE (node);
2986 op0 = TREE_OPERAND (node, 0);
2987 if (type != TREE_TYPE (op0))
2989 pp_left_paren (pp);
2990 dump_generic_node (pp, type, spc, flags, false);
2991 pp_string (pp, ") ");
2993 if (op_prio (op0) < op_prio (node))
2994 pp_left_paren (pp);
2995 dump_generic_node (pp, op0, spc, flags, false);
2996 if (op_prio (op0) < op_prio (node))
2997 pp_right_paren (pp);
2998 break;
3000 case VIEW_CONVERT_EXPR:
3001 if (flags & TDF_GIMPLE)
3002 pp_string (pp, "__VIEW_CONVERT <");
3003 else
3004 pp_string (pp, "VIEW_CONVERT_EXPR<");
3005 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
3006 pp_string (pp, ">(");
3007 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3008 pp_right_paren (pp);
3009 break;
3011 case PAREN_EXPR:
3012 pp_string (pp, "((");
3013 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3014 pp_string (pp, "))");
3015 break;
3017 case NON_LVALUE_EXPR:
3018 pp_string (pp, "NON_LVALUE_EXPR <");
3019 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3020 pp_greater (pp);
3021 break;
3023 case SAVE_EXPR:
3024 pp_string (pp, "SAVE_EXPR <");
3025 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3026 pp_greater (pp);
3027 break;
3029 case COMPLEX_EXPR:
3030 pp_string (pp, "COMPLEX_EXPR <");
3031 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3032 pp_string (pp, ", ");
3033 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3034 pp_greater (pp);
3035 break;
3037 case CONJ_EXPR:
3038 pp_string (pp, "CONJ_EXPR <");
3039 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3040 pp_greater (pp);
3041 break;
3043 case REALPART_EXPR:
3044 if (flags & TDF_GIMPLE)
3046 pp_string (pp, "__real ");
3047 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3049 else
3051 pp_string (pp, "REALPART_EXPR <");
3052 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3053 pp_greater (pp);
3055 break;
3057 case IMAGPART_EXPR:
3058 if (flags & TDF_GIMPLE)
3060 pp_string (pp, "__imag ");
3061 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3063 else
3065 pp_string (pp, "IMAGPART_EXPR <");
3066 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3067 pp_greater (pp);
3069 break;
3071 case VA_ARG_EXPR:
3072 pp_string (pp, "VA_ARG_EXPR <");
3073 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3074 pp_greater (pp);
3075 break;
3077 case TRY_FINALLY_EXPR:
3078 case TRY_CATCH_EXPR:
3079 pp_string (pp, "try");
3080 newline_and_indent (pp, spc+2);
3081 pp_left_brace (pp);
3082 newline_and_indent (pp, spc+4);
3083 dump_generic_node (pp, TREE_OPERAND (node, 0), spc+4, flags, true);
3084 newline_and_indent (pp, spc+2);
3085 pp_right_brace (pp);
3086 newline_and_indent (pp, spc);
3087 if (TREE_CODE (node) == TRY_CATCH_EXPR)
3089 node = TREE_OPERAND (node, 1);
3090 pp_string (pp, "catch");
3092 else
3094 gcc_assert (TREE_CODE (node) == TRY_FINALLY_EXPR);
3095 node = TREE_OPERAND (node, 1);
3096 pp_string (pp, "finally");
3097 if (TREE_CODE (node) == EH_ELSE_EXPR)
3099 newline_and_indent (pp, spc+2);
3100 pp_left_brace (pp);
3101 newline_and_indent (pp, spc+4);
3102 dump_generic_node (pp, TREE_OPERAND (node, 0), spc+4,
3103 flags, true);
3104 newline_and_indent (pp, spc+2);
3105 pp_right_brace (pp);
3106 newline_and_indent (pp, spc);
3107 node = TREE_OPERAND (node, 1);
3108 pp_string (pp, "else");
3111 newline_and_indent (pp, spc+2);
3112 pp_left_brace (pp);
3113 newline_and_indent (pp, spc+4);
3114 dump_generic_node (pp, node, spc+4, flags, true);
3115 newline_and_indent (pp, spc+2);
3116 pp_right_brace (pp);
3117 is_expr = false;
3118 break;
3120 case CATCH_EXPR:
3121 pp_string (pp, "catch (");
3122 dump_generic_node (pp, CATCH_TYPES (node), spc+2, flags, false);
3123 pp_right_paren (pp);
3124 newline_and_indent (pp, spc+2);
3125 pp_left_brace (pp);
3126 newline_and_indent (pp, spc+4);
3127 dump_generic_node (pp, CATCH_BODY (node), spc+4, flags, true);
3128 newline_and_indent (pp, spc+2);
3129 pp_right_brace (pp);
3130 is_expr = false;
3131 break;
3133 case EH_FILTER_EXPR:
3134 pp_string (pp, "<<<eh_filter (");
3135 dump_generic_node (pp, EH_FILTER_TYPES (node), spc+2, flags, false);
3136 pp_string (pp, ")>>>");
3137 newline_and_indent (pp, spc+2);
3138 pp_left_brace (pp);
3139 newline_and_indent (pp, spc+4);
3140 dump_generic_node (pp, EH_FILTER_FAILURE (node), spc+4, flags, true);
3141 newline_and_indent (pp, spc+2);
3142 pp_right_brace (pp);
3143 is_expr = false;
3144 break;
3146 case LABEL_EXPR:
3147 op0 = TREE_OPERAND (node, 0);
3148 /* If this is for break or continue, don't bother printing it. */
3149 if (DECL_NAME (op0))
3151 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
3152 if (strcmp (name, "break") == 0
3153 || strcmp (name, "continue") == 0)
3154 break;
3156 dump_generic_node (pp, op0, spc, flags, false);
3157 pp_colon (pp);
3158 if (DECL_NONLOCAL (op0))
3159 pp_string (pp, " [non-local]");
3160 break;
3162 case LOOP_EXPR:
3163 pp_string (pp, "while (1)");
3164 if (!(flags & TDF_SLIM))
3166 newline_and_indent (pp, spc+2);
3167 pp_left_brace (pp);
3168 newline_and_indent (pp, spc+4);
3169 dump_generic_node (pp, LOOP_EXPR_BODY (node), spc+4, flags, true);
3170 newline_and_indent (pp, spc+2);
3171 pp_right_brace (pp);
3173 is_expr = false;
3174 break;
3176 case PREDICT_EXPR:
3177 pp_string (pp, "// predicted ");
3178 if (PREDICT_EXPR_OUTCOME (node))
3179 pp_string (pp, "likely by ");
3180 else
3181 pp_string (pp, "unlikely by ");
3182 pp_string (pp, predictor_name (PREDICT_EXPR_PREDICTOR (node)));
3183 pp_string (pp, " predictor.");
3184 break;
3186 case ANNOTATE_EXPR:
3187 pp_string (pp, "ANNOTATE_EXPR <");
3188 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3189 switch ((enum annot_expr_kind) TREE_INT_CST_LOW (TREE_OPERAND (node, 1)))
3191 case annot_expr_ivdep_kind:
3192 pp_string (pp, ", ivdep");
3193 break;
3194 case annot_expr_unroll_kind:
3196 pp_string (pp, ", unroll ");
3197 pp_decimal_int (pp,
3198 (int) TREE_INT_CST_LOW (TREE_OPERAND (node, 2)));
3199 break;
3201 case annot_expr_no_vector_kind:
3202 pp_string (pp, ", no-vector");
3203 break;
3204 case annot_expr_vector_kind:
3205 pp_string (pp, ", vector");
3206 break;
3207 case annot_expr_parallel_kind:
3208 pp_string (pp, ", parallel");
3209 break;
3210 default:
3211 gcc_unreachable ();
3213 pp_greater (pp);
3214 break;
3216 case RETURN_EXPR:
3217 pp_string (pp, "return");
3218 op0 = TREE_OPERAND (node, 0);
3219 if (op0)
3221 pp_space (pp);
3222 if (TREE_CODE (op0) == MODIFY_EXPR)
3223 dump_generic_node (pp, TREE_OPERAND (op0, 1),
3224 spc, flags, false);
3225 else
3226 dump_generic_node (pp, op0, spc, flags, false);
3228 break;
3230 case EXIT_EXPR:
3231 pp_string (pp, "if (");
3232 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3233 pp_string (pp, ") break");
3234 break;
3236 case SWITCH_EXPR:
3237 pp_string (pp, "switch (");
3238 dump_generic_node (pp, SWITCH_COND (node), spc, flags, false);
3239 pp_right_paren (pp);
3240 if (!(flags & TDF_SLIM))
3242 newline_and_indent (pp, spc+2);
3243 pp_left_brace (pp);
3244 if (SWITCH_BODY (node))
3246 newline_and_indent (pp, spc+4);
3247 dump_generic_node (pp, SWITCH_BODY (node), spc+4, flags,
3248 true);
3250 newline_and_indent (pp, spc+2);
3251 pp_right_brace (pp);
3253 is_expr = false;
3254 break;
3256 case GOTO_EXPR:
3257 op0 = GOTO_DESTINATION (node);
3258 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
3260 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
3261 if (strcmp (name, "break") == 0
3262 || strcmp (name, "continue") == 0)
3264 pp_string (pp, name);
3265 break;
3268 pp_string (pp, "goto ");
3269 dump_generic_node (pp, op0, spc, flags, false);
3270 break;
3272 case ASM_EXPR:
3273 pp_string (pp, "__asm__");
3274 if (ASM_VOLATILE_P (node))
3275 pp_string (pp, " __volatile__");
3276 pp_left_paren (pp);
3277 dump_generic_node (pp, ASM_STRING (node), spc, flags, false);
3278 pp_colon (pp);
3279 dump_generic_node (pp, ASM_OUTPUTS (node), spc, flags, false);
3280 pp_colon (pp);
3281 dump_generic_node (pp, ASM_INPUTS (node), spc, flags, false);
3282 if (ASM_CLOBBERS (node))
3284 pp_colon (pp);
3285 dump_generic_node (pp, ASM_CLOBBERS (node), spc, flags, false);
3287 pp_right_paren (pp);
3288 break;
3290 case CASE_LABEL_EXPR:
3291 if (CASE_LOW (node) && CASE_HIGH (node))
3293 pp_string (pp, "case ");
3294 dump_generic_node (pp, CASE_LOW (node), spc, flags, false);
3295 pp_string (pp, " ... ");
3296 dump_generic_node (pp, CASE_HIGH (node), spc, flags, false);
3298 else if (CASE_LOW (node))
3300 pp_string (pp, "case ");
3301 dump_generic_node (pp, CASE_LOW (node), spc, flags, false);
3303 else
3304 pp_string (pp, "default");
3305 pp_colon (pp);
3306 break;
3308 case OBJ_TYPE_REF:
3309 pp_string (pp, "OBJ_TYPE_REF(");
3310 dump_generic_node (pp, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
3311 pp_semicolon (pp);
3312 /* We omit the class type for -fcompare-debug because we may
3313 drop TYPE_BINFO early depending on debug info, and then
3314 virtual_method_call_p would return false, whereas when
3315 TYPE_BINFO is preserved it may still return true and then
3316 we'd print the class type. Compare tree and rtl dumps for
3317 libstdc++-prettyprinters/shared_ptr.cc with and without -g,
3318 for example, at occurrences of OBJ_TYPE_REF. */
3319 if (!(flags & (TDF_SLIM | TDF_COMPARE_DEBUG))
3320 && virtual_method_call_p (node, true))
3322 pp_string (pp, "(");
3323 dump_generic_node (pp, obj_type_ref_class (node, true),
3324 spc, flags, false);
3325 pp_string (pp, ")");
3327 dump_generic_node (pp, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
3328 pp_arrow (pp);
3329 dump_generic_node (pp, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
3330 pp_right_paren (pp);
3331 break;
3333 case SSA_NAME:
3334 if (SSA_NAME_IDENTIFIER (node))
3336 if ((flags & TDF_NOUID)
3337 && SSA_NAME_VAR (node)
3338 && DECL_NAMELESS (SSA_NAME_VAR (node)))
3339 dump_fancy_name (pp, SSA_NAME_IDENTIFIER (node));
3340 else if (! (flags & TDF_GIMPLE)
3341 || SSA_NAME_VAR (node))
3342 dump_generic_node (pp, SSA_NAME_IDENTIFIER (node),
3343 spc, flags, false);
3345 pp_underscore (pp);
3346 pp_decimal_int (pp, SSA_NAME_VERSION (node));
3347 if (SSA_NAME_IS_DEFAULT_DEF (node))
3348 pp_string (pp, "(D)");
3349 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
3350 pp_string (pp, "(ab)");
3351 break;
3353 case WITH_SIZE_EXPR:
3354 pp_string (pp, "WITH_SIZE_EXPR <");
3355 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3356 pp_string (pp, ", ");
3357 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3358 pp_greater (pp);
3359 break;
3361 case ASSERT_EXPR:
3362 pp_string (pp, "ASSERT_EXPR <");
3363 dump_generic_node (pp, ASSERT_EXPR_VAR (node), spc, flags, false);
3364 pp_string (pp, ", ");
3365 dump_generic_node (pp, ASSERT_EXPR_COND (node), spc, flags, false);
3366 pp_greater (pp);
3367 break;
3369 case SCEV_KNOWN:
3370 pp_string (pp, "scev_known");
3371 break;
3373 case SCEV_NOT_KNOWN:
3374 pp_string (pp, "scev_not_known");
3375 break;
3377 case POLYNOMIAL_CHREC:
3378 pp_left_brace (pp);
3379 dump_generic_node (pp, CHREC_LEFT (node), spc, flags, false);
3380 pp_string (pp, ", +, ");
3381 dump_generic_node (pp, CHREC_RIGHT (node), spc, flags, false);
3382 pp_string (pp, "}_");
3383 pp_scalar (pp, "%u", CHREC_VARIABLE (node));
3384 is_stmt = false;
3385 break;
3387 case REALIGN_LOAD_EXPR:
3388 pp_string (pp, "REALIGN_LOAD <");
3389 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3390 pp_string (pp, ", ");
3391 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3392 pp_string (pp, ", ");
3393 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3394 pp_greater (pp);
3395 break;
3397 case VEC_COND_EXPR:
3398 pp_string (pp, " VEC_COND_EXPR < ");
3399 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3400 pp_string (pp, " , ");
3401 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3402 pp_string (pp, " , ");
3403 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3404 pp_string (pp, " > ");
3405 break;
3407 case VEC_PERM_EXPR:
3408 pp_string (pp, " VEC_PERM_EXPR < ");
3409 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3410 pp_string (pp, " , ");
3411 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3412 pp_string (pp, " , ");
3413 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3414 pp_string (pp, " > ");
3415 break;
3417 case DOT_PROD_EXPR:
3418 pp_string (pp, " DOT_PROD_EXPR < ");
3419 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3420 pp_string (pp, ", ");
3421 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3422 pp_string (pp, ", ");
3423 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3424 pp_string (pp, " > ");
3425 break;
3427 case WIDEN_MULT_PLUS_EXPR:
3428 pp_string (pp, " WIDEN_MULT_PLUS_EXPR < ");
3429 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3430 pp_string (pp, ", ");
3431 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3432 pp_string (pp, ", ");
3433 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3434 pp_string (pp, " > ");
3435 break;
3437 case WIDEN_MULT_MINUS_EXPR:
3438 pp_string (pp, " WIDEN_MULT_MINUS_EXPR < ");
3439 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3440 pp_string (pp, ", ");
3441 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3442 pp_string (pp, ", ");
3443 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3444 pp_string (pp, " > ");
3445 break;
3447 case OACC_PARALLEL:
3448 pp_string (pp, "#pragma acc parallel");
3449 goto dump_omp_clauses_body;
3451 case OACC_KERNELS:
3452 pp_string (pp, "#pragma acc kernels");
3453 goto dump_omp_clauses_body;
3455 case OACC_SERIAL:
3456 pp_string (pp, "#pragma acc serial");
3457 goto dump_omp_clauses_body;
3459 case OACC_DATA:
3460 pp_string (pp, "#pragma acc data");
3461 dump_omp_clauses (pp, OACC_DATA_CLAUSES (node), spc, flags);
3462 goto dump_omp_body;
3464 case OACC_HOST_DATA:
3465 pp_string (pp, "#pragma acc host_data");
3466 dump_omp_clauses (pp, OACC_HOST_DATA_CLAUSES (node), spc, flags);
3467 goto dump_omp_body;
3469 case OACC_DECLARE:
3470 pp_string (pp, "#pragma acc declare");
3471 dump_omp_clauses (pp, OACC_DECLARE_CLAUSES (node), spc, flags);
3472 break;
3474 case OACC_UPDATE:
3475 pp_string (pp, "#pragma acc update");
3476 dump_omp_clauses (pp, OACC_UPDATE_CLAUSES (node), spc, flags);
3477 break;
3479 case OACC_ENTER_DATA:
3480 pp_string (pp, "#pragma acc enter data");
3481 dump_omp_clauses (pp, OACC_ENTER_DATA_CLAUSES (node), spc, flags);
3482 break;
3484 case OACC_EXIT_DATA:
3485 pp_string (pp, "#pragma acc exit data");
3486 dump_omp_clauses (pp, OACC_EXIT_DATA_CLAUSES (node), spc, flags);
3487 break;
3489 case OACC_CACHE:
3490 pp_string (pp, "#pragma acc cache");
3491 dump_omp_clauses (pp, OACC_CACHE_CLAUSES (node), spc, flags);
3492 break;
3494 case OMP_PARALLEL:
3495 pp_string (pp, "#pragma omp parallel");
3496 dump_omp_clauses (pp, OMP_PARALLEL_CLAUSES (node), spc, flags);
3497 goto dump_omp_body;
3499 dump_omp_clauses_body:
3500 dump_omp_clauses (pp, OMP_CLAUSES (node), spc, flags);
3501 goto dump_omp_body;
3503 dump_omp_body:
3504 if (!(flags & TDF_SLIM) && OMP_BODY (node))
3506 newline_and_indent (pp, spc + 2);
3507 pp_left_brace (pp);
3508 newline_and_indent (pp, spc + 4);
3509 dump_generic_node (pp, OMP_BODY (node), spc + 4, flags, false);
3510 newline_and_indent (pp, spc + 2);
3511 pp_right_brace (pp);
3513 is_expr = false;
3514 break;
3516 case OMP_TASK:
3517 pp_string (pp, OMP_TASK_BODY (node) ? "#pragma omp task"
3518 : "#pragma omp taskwait");
3519 dump_omp_clauses (pp, OMP_TASK_CLAUSES (node), spc, flags);
3520 goto dump_omp_body;
3522 case OMP_FOR:
3523 pp_string (pp, "#pragma omp for");
3524 goto dump_omp_loop;
3526 case OMP_SIMD:
3527 pp_string (pp, "#pragma omp simd");
3528 goto dump_omp_loop;
3530 case OMP_DISTRIBUTE:
3531 pp_string (pp, "#pragma omp distribute");
3532 goto dump_omp_loop;
3534 case OMP_TASKLOOP:
3535 pp_string (pp, "#pragma omp taskloop");
3536 goto dump_omp_loop;
3538 case OMP_LOOP:
3539 pp_string (pp, "#pragma omp loop");
3540 goto dump_omp_loop;
3542 case OACC_LOOP:
3543 pp_string (pp, "#pragma acc loop");
3544 goto dump_omp_loop;
3546 case OMP_TEAMS:
3547 pp_string (pp, "#pragma omp teams");
3548 dump_omp_clauses (pp, OMP_TEAMS_CLAUSES (node), spc, flags);
3549 goto dump_omp_body;
3551 case OMP_TARGET_DATA:
3552 pp_string (pp, "#pragma omp target data");
3553 dump_omp_clauses (pp, OMP_TARGET_DATA_CLAUSES (node), spc, flags);
3554 goto dump_omp_body;
3556 case OMP_TARGET_ENTER_DATA:
3557 pp_string (pp, "#pragma omp target enter data");
3558 dump_omp_clauses (pp, OMP_TARGET_ENTER_DATA_CLAUSES (node), spc, flags);
3559 is_expr = false;
3560 break;
3562 case OMP_TARGET_EXIT_DATA:
3563 pp_string (pp, "#pragma omp target exit data");
3564 dump_omp_clauses (pp, OMP_TARGET_EXIT_DATA_CLAUSES (node), spc, flags);
3565 is_expr = false;
3566 break;
3568 case OMP_TARGET:
3569 pp_string (pp, "#pragma omp target");
3570 dump_omp_clauses (pp, OMP_TARGET_CLAUSES (node), spc, flags);
3571 goto dump_omp_body;
3573 case OMP_TARGET_UPDATE:
3574 pp_string (pp, "#pragma omp target update");
3575 dump_omp_clauses (pp, OMP_TARGET_UPDATE_CLAUSES (node), spc, flags);
3576 is_expr = false;
3577 break;
3579 dump_omp_loop:
3580 dump_omp_clauses (pp, OMP_FOR_CLAUSES (node), spc, flags);
3581 if (!(flags & TDF_SLIM))
3583 int i;
3585 if (OMP_FOR_PRE_BODY (node))
3587 newline_and_indent (pp, spc + 2);
3588 pp_left_brace (pp);
3589 spc += 4;
3590 newline_and_indent (pp, spc);
3591 dump_generic_node (pp, OMP_FOR_PRE_BODY (node),
3592 spc, flags, false);
3594 if (OMP_FOR_INIT (node))
3596 spc -= 2;
3597 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (node)); i++)
3599 spc += 2;
3600 newline_and_indent (pp, spc);
3601 pp_string (pp, "for (");
3602 tree init = TREE_VEC_ELT (OMP_FOR_INIT (node), i);
3603 if (TREE_CODE (init) != MODIFY_EXPR
3604 || TREE_CODE (TREE_OPERAND (init, 1)) != TREE_VEC)
3605 dump_generic_node (pp, init, spc, flags, false);
3606 else
3608 dump_generic_node (pp, TREE_OPERAND (init, 0),
3609 spc, flags, false);
3610 pp_string (pp, " = ");
3611 dump_omp_loop_non_rect_expr (pp, TREE_OPERAND (init, 1),
3612 spc, flags);
3614 pp_string (pp, "; ");
3615 tree cond = TREE_VEC_ELT (OMP_FOR_COND (node), i);
3616 if (!COMPARISON_CLASS_P (cond)
3617 || TREE_CODE (TREE_OPERAND (cond, 1)) != TREE_VEC)
3618 dump_generic_node (pp, cond, spc, flags, false);
3619 else
3621 dump_generic_node (pp, TREE_OPERAND (cond, 0),
3622 spc, flags, false);
3623 const char *op = op_symbol (cond);
3624 pp_space (pp);
3625 pp_string (pp, op);
3626 pp_space (pp);
3627 dump_omp_loop_non_rect_expr (pp, TREE_OPERAND (cond, 1),
3628 spc, flags);
3630 pp_string (pp, "; ");
3631 dump_generic_node (pp,
3632 TREE_VEC_ELT (OMP_FOR_INCR (node), i),
3633 spc, flags, false);
3634 pp_right_paren (pp);
3637 if (OMP_FOR_BODY (node))
3639 newline_and_indent (pp, spc + 2);
3640 pp_left_brace (pp);
3641 newline_and_indent (pp, spc + 4);
3642 dump_generic_node (pp, OMP_FOR_BODY (node), spc + 4, flags,
3643 false);
3644 newline_and_indent (pp, spc + 2);
3645 pp_right_brace (pp);
3647 if (OMP_FOR_INIT (node))
3648 spc -= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node)) - 2;
3649 if (OMP_FOR_PRE_BODY (node))
3651 spc -= 4;
3652 newline_and_indent (pp, spc + 2);
3653 pp_right_brace (pp);
3656 is_expr = false;
3657 break;
3659 case OMP_SECTIONS:
3660 pp_string (pp, "#pragma omp sections");
3661 dump_omp_clauses (pp, OMP_SECTIONS_CLAUSES (node), spc, flags);
3662 goto dump_omp_body;
3664 case OMP_SECTION:
3665 pp_string (pp, "#pragma omp section");
3666 goto dump_omp_body;
3668 case OMP_SCAN:
3669 if (OMP_SCAN_CLAUSES (node))
3671 pp_string (pp, "#pragma omp scan");
3672 dump_omp_clauses (pp, OMP_SCAN_CLAUSES (node), spc, flags);
3674 goto dump_omp_body;
3676 case OMP_MASTER:
3677 pp_string (pp, "#pragma omp master");
3678 goto dump_omp_body;
3680 case OMP_MASKED:
3681 pp_string (pp, "#pragma omp masked");
3682 dump_omp_clauses (pp, OMP_MASKED_CLAUSES (node), spc, flags);
3683 goto dump_omp_body;
3685 case OMP_TASKGROUP:
3686 pp_string (pp, "#pragma omp taskgroup");
3687 dump_omp_clauses (pp, OMP_TASKGROUP_CLAUSES (node), spc, flags);
3688 goto dump_omp_body;
3690 case OMP_ORDERED:
3691 pp_string (pp, "#pragma omp ordered");
3692 dump_omp_clauses (pp, OMP_ORDERED_CLAUSES (node), spc, flags);
3693 goto dump_omp_body;
3695 case OMP_CRITICAL:
3696 pp_string (pp, "#pragma omp critical");
3697 if (OMP_CRITICAL_NAME (node))
3699 pp_space (pp);
3700 pp_left_paren (pp);
3701 dump_generic_node (pp, OMP_CRITICAL_NAME (node), spc,
3702 flags, false);
3703 pp_right_paren (pp);
3705 dump_omp_clauses (pp, OMP_CRITICAL_CLAUSES (node), spc, flags);
3706 goto dump_omp_body;
3708 case OMP_ATOMIC:
3709 pp_string (pp, "#pragma omp atomic");
3710 if (OMP_ATOMIC_WEAK (node))
3711 pp_string (pp, " weak");
3712 dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
3713 newline_and_indent (pp, spc + 2);
3714 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3715 pp_space (pp);
3716 pp_equal (pp);
3717 pp_space (pp);
3718 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3719 break;
3721 case OMP_ATOMIC_READ:
3722 pp_string (pp, "#pragma omp atomic read");
3723 dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
3724 newline_and_indent (pp, spc + 2);
3725 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3726 pp_space (pp);
3727 break;
3729 case OMP_ATOMIC_CAPTURE_OLD:
3730 case OMP_ATOMIC_CAPTURE_NEW:
3731 pp_string (pp, "#pragma omp atomic capture");
3732 if (OMP_ATOMIC_WEAK (node))
3733 pp_string (pp, " weak");
3734 dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
3735 newline_and_indent (pp, spc + 2);
3736 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3737 pp_space (pp);
3738 pp_equal (pp);
3739 pp_space (pp);
3740 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3741 break;
3743 case OMP_SINGLE:
3744 pp_string (pp, "#pragma omp single");
3745 dump_omp_clauses (pp, OMP_SINGLE_CLAUSES (node), spc, flags);
3746 goto dump_omp_body;
3748 case OMP_SCOPE:
3749 pp_string (pp, "#pragma omp scope");
3750 dump_omp_clauses (pp, OMP_SCOPE_CLAUSES (node), spc, flags);
3751 goto dump_omp_body;
3753 case OMP_CLAUSE:
3754 /* If we come here, we're dumping something that's not an OMP construct,
3755 for example, OMP clauses attached to a function's '__attribute__'.
3756 Dump the whole OMP clause chain. */
3757 dump_omp_clauses (pp, node, spc, flags, false);
3758 is_expr = false;
3759 break;
3761 case TRANSACTION_EXPR:
3762 if (TRANSACTION_EXPR_OUTER (node))
3763 pp_string (pp, "__transaction_atomic [[outer]]");
3764 else if (TRANSACTION_EXPR_RELAXED (node))
3765 pp_string (pp, "__transaction_relaxed");
3766 else
3767 pp_string (pp, "__transaction_atomic");
3768 if (!(flags & TDF_SLIM) && TRANSACTION_EXPR_BODY (node))
3770 newline_and_indent (pp, spc);
3771 pp_left_brace (pp);
3772 newline_and_indent (pp, spc + 2);
3773 dump_generic_node (pp, TRANSACTION_EXPR_BODY (node),
3774 spc + 2, flags, false);
3775 newline_and_indent (pp, spc);
3776 pp_right_brace (pp);
3778 is_expr = false;
3779 break;
3781 case VEC_SERIES_EXPR:
3782 case VEC_WIDEN_MULT_HI_EXPR:
3783 case VEC_WIDEN_MULT_LO_EXPR:
3784 case VEC_WIDEN_PLUS_HI_EXPR:
3785 case VEC_WIDEN_PLUS_LO_EXPR:
3786 case VEC_WIDEN_MINUS_HI_EXPR:
3787 case VEC_WIDEN_MINUS_LO_EXPR:
3788 case VEC_WIDEN_MULT_EVEN_EXPR:
3789 case VEC_WIDEN_MULT_ODD_EXPR:
3790 case VEC_WIDEN_LSHIFT_HI_EXPR:
3791 case VEC_WIDEN_LSHIFT_LO_EXPR:
3792 pp_space (pp);
3793 for (str = get_tree_code_name (code); *str; str++)
3794 pp_character (pp, TOUPPER (*str));
3795 pp_string (pp, " < ");
3796 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3797 pp_string (pp, ", ");
3798 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3799 pp_string (pp, " > ");
3800 break;
3802 case VEC_DUPLICATE_EXPR:
3803 pp_space (pp);
3804 for (str = get_tree_code_name (code); *str; str++)
3805 pp_character (pp, TOUPPER (*str));
3806 pp_string (pp, " < ");
3807 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3808 pp_string (pp, " > ");
3809 break;
3811 case VEC_UNPACK_HI_EXPR:
3812 pp_string (pp, " VEC_UNPACK_HI_EXPR < ");
3813 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3814 pp_string (pp, " > ");
3815 break;
3817 case VEC_UNPACK_LO_EXPR:
3818 pp_string (pp, " VEC_UNPACK_LO_EXPR < ");
3819 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3820 pp_string (pp, " > ");
3821 break;
3823 case VEC_UNPACK_FLOAT_HI_EXPR:
3824 pp_string (pp, " VEC_UNPACK_FLOAT_HI_EXPR < ");
3825 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3826 pp_string (pp, " > ");
3827 break;
3829 case VEC_UNPACK_FLOAT_LO_EXPR:
3830 pp_string (pp, " VEC_UNPACK_FLOAT_LO_EXPR < ");
3831 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3832 pp_string (pp, " > ");
3833 break;
3835 case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
3836 pp_string (pp, " VEC_UNPACK_FIX_TRUNC_HI_EXPR < ");
3837 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3838 pp_string (pp, " > ");
3839 break;
3841 case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
3842 pp_string (pp, " VEC_UNPACK_FIX_TRUNC_LO_EXPR < ");
3843 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3844 pp_string (pp, " > ");
3845 break;
3847 case VEC_PACK_TRUNC_EXPR:
3848 pp_string (pp, " VEC_PACK_TRUNC_EXPR < ");
3849 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3850 pp_string (pp, ", ");
3851 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3852 pp_string (pp, " > ");
3853 break;
3855 case VEC_PACK_SAT_EXPR:
3856 pp_string (pp, " VEC_PACK_SAT_EXPR < ");
3857 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3858 pp_string (pp, ", ");
3859 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3860 pp_string (pp, " > ");
3861 break;
3863 case VEC_PACK_FIX_TRUNC_EXPR:
3864 pp_string (pp, " VEC_PACK_FIX_TRUNC_EXPR < ");
3865 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3866 pp_string (pp, ", ");
3867 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3868 pp_string (pp, " > ");
3869 break;
3871 case VEC_PACK_FLOAT_EXPR:
3872 pp_string (pp, " VEC_PACK_FLOAT_EXPR < ");
3873 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3874 pp_string (pp, ", ");
3875 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3876 pp_string (pp, " > ");
3877 break;
3879 case BLOCK:
3880 dump_block_node (pp, node, spc, flags);
3881 break;
3883 case DEBUG_BEGIN_STMT:
3884 pp_string (pp, "# DEBUG BEGIN STMT");
3885 break;
3887 default:
3888 NIY;
3891 if (is_stmt && is_expr)
3892 pp_semicolon (pp);
3894 return spc;
3897 /* Print the declaration of a variable. */
3899 void
3900 print_declaration (pretty_printer *pp, tree t, int spc, dump_flags_t flags)
3902 INDENT (spc);
3904 if (TREE_CODE(t) == NAMELIST_DECL)
3906 pp_string(pp, "namelist ");
3907 dump_decl_name (pp, t, flags);
3908 pp_semicolon (pp);
3909 return;
3912 if (TREE_CODE (t) == TYPE_DECL)
3913 pp_string (pp, "typedef ");
3915 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
3916 pp_string (pp, "register ");
3918 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
3919 pp_string (pp, "extern ");
3920 else if (TREE_STATIC (t))
3921 pp_string (pp, "static ");
3923 /* Print the type and name. */
3924 if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
3926 tree tmp;
3928 /* Print array's type. */
3929 tmp = TREE_TYPE (t);
3930 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
3931 tmp = TREE_TYPE (tmp);
3932 dump_generic_node (pp, TREE_TYPE (tmp), spc, flags, false);
3934 /* Print variable's name. */
3935 pp_space (pp);
3936 dump_generic_node (pp, t, spc, flags, false);
3938 /* Print the dimensions. */
3939 tmp = TREE_TYPE (t);
3940 while (TREE_CODE (tmp) == ARRAY_TYPE)
3942 dump_array_domain (pp, TYPE_DOMAIN (tmp), spc, flags);
3943 tmp = TREE_TYPE (tmp);
3946 else if (TREE_CODE (t) == FUNCTION_DECL)
3948 dump_generic_node (pp, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
3949 pp_space (pp);
3950 dump_decl_name (pp, t, flags);
3951 dump_function_declaration (pp, TREE_TYPE (t), spc, flags);
3953 else
3955 /* Print type declaration. */
3956 dump_generic_node (pp, TREE_TYPE (t), spc, flags, false);
3958 /* Print variable's name. */
3959 pp_space (pp);
3960 dump_generic_node (pp, t, spc, flags, false);
3963 if (VAR_P (t) && DECL_HARD_REGISTER (t))
3965 pp_string (pp, " __asm__ ");
3966 pp_left_paren (pp);
3967 dump_generic_node (pp, DECL_ASSEMBLER_NAME (t), spc, flags, false);
3968 pp_right_paren (pp);
3971 /* The initial value of a function serves to determine whether the function
3972 is declared or defined. So the following does not apply to function
3973 nodes. */
3974 if (TREE_CODE (t) != FUNCTION_DECL)
3976 /* Print the initial value. */
3977 if (DECL_INITIAL (t))
3979 pp_space (pp);
3980 pp_equal (pp);
3981 pp_space (pp);
3982 if (!(flags & TDF_SLIM))
3983 dump_generic_node (pp, DECL_INITIAL (t), spc, flags, false);
3984 else
3985 pp_string (pp, "<<< omitted >>>");
3989 if (VAR_P (t) && DECL_HAS_VALUE_EXPR_P (t))
3991 pp_string (pp, " [value-expr: ");
3992 dump_generic_node (pp, DECL_VALUE_EXPR (t), spc, flags, false);
3993 pp_right_bracket (pp);
3996 pp_semicolon (pp);
4000 /* Prints a structure: name, fields, and methods.
4001 FIXME: Still incomplete. */
4003 static void
4004 print_struct_decl (pretty_printer *pp, const_tree node, int spc,
4005 dump_flags_t flags)
4007 /* Print the name of the structure. */
4008 if (TYPE_NAME (node))
4010 INDENT (spc);
4011 if (TREE_CODE (node) == RECORD_TYPE)
4012 pp_string (pp, "struct ");
4013 else if ((TREE_CODE (node) == UNION_TYPE
4014 || TREE_CODE (node) == QUAL_UNION_TYPE))
4015 pp_string (pp, "union ");
4017 dump_generic_node (pp, TYPE_NAME (node), spc, TDF_NONE, false);
4020 /* Print the contents of the structure. */
4021 pp_newline (pp);
4022 INDENT (spc);
4023 pp_left_brace (pp);
4024 pp_newline (pp);
4026 /* Print the fields of the structure. */
4028 tree tmp;
4029 tmp = TYPE_FIELDS (node);
4030 while (tmp)
4032 /* Avoid to print recursively the structure. */
4033 /* FIXME : Not implemented correctly...,
4034 what about the case when we have a cycle in the contain graph? ...
4035 Maybe this could be solved by looking at the scope in which the
4036 structure was declared. */
4037 if (TREE_TYPE (tmp) != node
4038 && (TREE_CODE (TREE_TYPE (tmp)) != POINTER_TYPE
4039 || TREE_TYPE (TREE_TYPE (tmp)) != node))
4041 print_declaration (pp, tmp, spc+2, flags);
4042 pp_newline (pp);
4044 tmp = DECL_CHAIN (tmp);
4047 INDENT (spc);
4048 pp_right_brace (pp);
4051 /* Return the priority of the operator CODE.
4053 From lowest to highest precedence with either left-to-right (L-R)
4054 or right-to-left (R-L) associativity]:
4056 1 [L-R] ,
4057 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
4058 3 [R-L] ?:
4059 4 [L-R] ||
4060 5 [L-R] &&
4061 6 [L-R] |
4062 7 [L-R] ^
4063 8 [L-R] &
4064 9 [L-R] == !=
4065 10 [L-R] < <= > >=
4066 11 [L-R] << >>
4067 12 [L-R] + -
4068 13 [L-R] * / %
4069 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
4070 15 [L-R] fn() [] -> .
4072 unary +, - and * have higher precedence than the corresponding binary
4073 operators. */
4076 op_code_prio (enum tree_code code)
4078 switch (code)
4080 case TREE_LIST:
4081 case COMPOUND_EXPR:
4082 case BIND_EXPR:
4083 return 1;
4085 case MODIFY_EXPR:
4086 case INIT_EXPR:
4087 return 2;
4089 case COND_EXPR:
4090 return 3;
4092 case TRUTH_OR_EXPR:
4093 case TRUTH_ORIF_EXPR:
4094 return 4;
4096 case TRUTH_AND_EXPR:
4097 case TRUTH_ANDIF_EXPR:
4098 return 5;
4100 case BIT_IOR_EXPR:
4101 return 6;
4103 case BIT_XOR_EXPR:
4104 case TRUTH_XOR_EXPR:
4105 return 7;
4107 case BIT_AND_EXPR:
4108 return 8;
4110 case EQ_EXPR:
4111 case NE_EXPR:
4112 return 9;
4114 case UNLT_EXPR:
4115 case UNLE_EXPR:
4116 case UNGT_EXPR:
4117 case UNGE_EXPR:
4118 case UNEQ_EXPR:
4119 case LTGT_EXPR:
4120 case ORDERED_EXPR:
4121 case UNORDERED_EXPR:
4122 case LT_EXPR:
4123 case LE_EXPR:
4124 case GT_EXPR:
4125 case GE_EXPR:
4126 return 10;
4128 case LSHIFT_EXPR:
4129 case RSHIFT_EXPR:
4130 case LROTATE_EXPR:
4131 case RROTATE_EXPR:
4132 case VEC_WIDEN_LSHIFT_HI_EXPR:
4133 case VEC_WIDEN_LSHIFT_LO_EXPR:
4134 case WIDEN_LSHIFT_EXPR:
4135 return 11;
4137 case WIDEN_SUM_EXPR:
4138 case PLUS_EXPR:
4139 case POINTER_PLUS_EXPR:
4140 case POINTER_DIFF_EXPR:
4141 case MINUS_EXPR:
4142 return 12;
4144 case VEC_WIDEN_MULT_HI_EXPR:
4145 case VEC_WIDEN_MULT_LO_EXPR:
4146 case WIDEN_MULT_EXPR:
4147 case DOT_PROD_EXPR:
4148 case WIDEN_MULT_PLUS_EXPR:
4149 case WIDEN_MULT_MINUS_EXPR:
4150 case MULT_EXPR:
4151 case MULT_HIGHPART_EXPR:
4152 case TRUNC_DIV_EXPR:
4153 case CEIL_DIV_EXPR:
4154 case FLOOR_DIV_EXPR:
4155 case ROUND_DIV_EXPR:
4156 case RDIV_EXPR:
4157 case EXACT_DIV_EXPR:
4158 case TRUNC_MOD_EXPR:
4159 case CEIL_MOD_EXPR:
4160 case FLOOR_MOD_EXPR:
4161 case ROUND_MOD_EXPR:
4162 return 13;
4164 case TRUTH_NOT_EXPR:
4165 case BIT_NOT_EXPR:
4166 case POSTINCREMENT_EXPR:
4167 case POSTDECREMENT_EXPR:
4168 case PREINCREMENT_EXPR:
4169 case PREDECREMENT_EXPR:
4170 case NEGATE_EXPR:
4171 case INDIRECT_REF:
4172 case ADDR_EXPR:
4173 case FLOAT_EXPR:
4174 CASE_CONVERT:
4175 case FIX_TRUNC_EXPR:
4176 case TARGET_EXPR:
4177 return 14;
4179 case CALL_EXPR:
4180 case ARRAY_REF:
4181 case ARRAY_RANGE_REF:
4182 case COMPONENT_REF:
4183 return 15;
4185 /* Special expressions. */
4186 case MIN_EXPR:
4187 case MAX_EXPR:
4188 case ABS_EXPR:
4189 case REALPART_EXPR:
4190 case IMAGPART_EXPR:
4191 case VEC_UNPACK_HI_EXPR:
4192 case VEC_UNPACK_LO_EXPR:
4193 case VEC_UNPACK_FLOAT_HI_EXPR:
4194 case VEC_UNPACK_FLOAT_LO_EXPR:
4195 case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
4196 case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
4197 case VEC_PACK_TRUNC_EXPR:
4198 case VEC_PACK_SAT_EXPR:
4199 return 16;
4201 default:
4202 /* Return an arbitrarily high precedence to avoid surrounding single
4203 VAR_DECLs in ()s. */
4204 return 9999;
4208 /* Return the priority of the operator OP. */
4211 op_prio (const_tree op)
4213 enum tree_code code;
4215 if (op == NULL)
4216 return 9999;
4218 code = TREE_CODE (op);
4219 if (code == SAVE_EXPR || code == NON_LVALUE_EXPR)
4220 return op_prio (TREE_OPERAND (op, 0));
4222 return op_code_prio (code);
4225 /* Return the symbol associated with operator CODE. */
4227 const char *
4228 op_symbol_code (enum tree_code code)
4230 switch (code)
4232 case MODIFY_EXPR:
4233 return "=";
4235 case TRUTH_OR_EXPR:
4236 case TRUTH_ORIF_EXPR:
4237 return "||";
4239 case TRUTH_AND_EXPR:
4240 case TRUTH_ANDIF_EXPR:
4241 return "&&";
4243 case BIT_IOR_EXPR:
4244 return "|";
4246 case TRUTH_XOR_EXPR:
4247 case BIT_XOR_EXPR:
4248 return "^";
4250 case ADDR_EXPR:
4251 case BIT_AND_EXPR:
4252 return "&";
4254 case ORDERED_EXPR:
4255 return "ord";
4256 case UNORDERED_EXPR:
4257 return "unord";
4259 case EQ_EXPR:
4260 return "==";
4261 case UNEQ_EXPR:
4262 return "u==";
4264 case NE_EXPR:
4265 return "!=";
4267 case LT_EXPR:
4268 return "<";
4269 case UNLT_EXPR:
4270 return "u<";
4272 case LE_EXPR:
4273 return "<=";
4274 case UNLE_EXPR:
4275 return "u<=";
4277 case GT_EXPR:
4278 return ">";
4279 case UNGT_EXPR:
4280 return "u>";
4282 case GE_EXPR:
4283 return ">=";
4284 case UNGE_EXPR:
4285 return "u>=";
4287 case LTGT_EXPR:
4288 return "<>";
4290 case LSHIFT_EXPR:
4291 return "<<";
4293 case RSHIFT_EXPR:
4294 return ">>";
4296 case LROTATE_EXPR:
4297 return "r<<";
4299 case RROTATE_EXPR:
4300 return "r>>";
4302 case WIDEN_LSHIFT_EXPR:
4303 return "w<<";
4305 case WIDEN_PLUS_EXPR:
4306 return "w+";
4308 case WIDEN_MINUS_EXPR:
4309 return "w-";
4311 case POINTER_PLUS_EXPR:
4312 return "+";
4314 case PLUS_EXPR:
4315 return "+";
4317 case WIDEN_SUM_EXPR:
4318 return "w+";
4320 case WIDEN_MULT_EXPR:
4321 return "w*";
4323 case MULT_HIGHPART_EXPR:
4324 return "h*";
4326 case NEGATE_EXPR:
4327 case MINUS_EXPR:
4328 case POINTER_DIFF_EXPR:
4329 return "-";
4331 case BIT_NOT_EXPR:
4332 return "~";
4334 case TRUTH_NOT_EXPR:
4335 return "!";
4337 case MULT_EXPR:
4338 case INDIRECT_REF:
4339 return "*";
4341 case TRUNC_DIV_EXPR:
4342 case RDIV_EXPR:
4343 return "/";
4345 case CEIL_DIV_EXPR:
4346 return "/[cl]";
4348 case FLOOR_DIV_EXPR:
4349 return "/[fl]";
4351 case ROUND_DIV_EXPR:
4352 return "/[rd]";
4354 case EXACT_DIV_EXPR:
4355 return "/[ex]";
4357 case TRUNC_MOD_EXPR:
4358 return "%";
4360 case CEIL_MOD_EXPR:
4361 return "%[cl]";
4363 case FLOOR_MOD_EXPR:
4364 return "%[fl]";
4366 case ROUND_MOD_EXPR:
4367 return "%[rd]";
4369 case PREDECREMENT_EXPR:
4370 return " --";
4372 case PREINCREMENT_EXPR:
4373 return " ++";
4375 case POSTDECREMENT_EXPR:
4376 return "-- ";
4378 case POSTINCREMENT_EXPR:
4379 return "++ ";
4381 case MAX_EXPR:
4382 return "max";
4384 case MIN_EXPR:
4385 return "min";
4387 default:
4388 return "<<< ??? >>>";
4392 /* Return the symbol associated with operator OP. */
4394 static const char *
4395 op_symbol (const_tree op)
4397 return op_symbol_code (TREE_CODE (op));
4400 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
4401 the gimple_call_fn of a GIMPLE_CALL. */
4403 void
4404 print_call_name (pretty_printer *pp, tree node, dump_flags_t flags)
4406 tree op0 = node;
4407 int spc = 0;
4409 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
4410 op0 = TREE_OPERAND (op0, 0);
4412 again:
4413 switch (TREE_CODE (op0))
4415 case VAR_DECL:
4416 case PARM_DECL:
4417 case FUNCTION_DECL:
4418 dump_function_name (pp, op0, flags);
4419 break;
4421 case ADDR_EXPR:
4422 case INDIRECT_REF:
4423 CASE_CONVERT:
4424 op0 = TREE_OPERAND (op0, 0);
4425 goto again;
4427 case COND_EXPR:
4428 pp_left_paren (pp);
4429 dump_generic_node (pp, TREE_OPERAND (op0, 0), 0, flags, false);
4430 pp_string (pp, ") ? ");
4431 dump_generic_node (pp, TREE_OPERAND (op0, 1), 0, flags, false);
4432 pp_string (pp, " : ");
4433 dump_generic_node (pp, TREE_OPERAND (op0, 2), 0, flags, false);
4434 break;
4436 case ARRAY_REF:
4437 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
4438 dump_function_name (pp, TREE_OPERAND (op0, 0), flags);
4439 else
4440 dump_generic_node (pp, op0, 0, flags, false);
4441 break;
4443 case MEM_REF:
4444 if (integer_zerop (TREE_OPERAND (op0, 1)))
4446 op0 = TREE_OPERAND (op0, 0);
4447 goto again;
4449 /* Fallthru. */
4450 case COMPONENT_REF:
4451 case SSA_NAME:
4452 case OBJ_TYPE_REF:
4453 dump_generic_node (pp, op0, 0, flags, false);
4454 break;
4456 default:
4457 NIY;
4461 /* Print the first N characters in the array STR, replacing non-printable
4462 characters (including embedded nuls) with unambiguous escape sequences. */
4464 void
4465 pretty_print_string (pretty_printer *pp, const char *str, size_t n)
4467 if (str == NULL)
4468 return;
4470 for ( ; n; --n, ++str)
4472 switch (str[0])
4474 case '\b':
4475 pp_string (pp, "\\b");
4476 break;
4478 case '\f':
4479 pp_string (pp, "\\f");
4480 break;
4482 case '\n':
4483 pp_string (pp, "\\n");
4484 break;
4486 case '\r':
4487 pp_string (pp, "\\r");
4488 break;
4490 case '\t':
4491 pp_string (pp, "\\t");
4492 break;
4494 case '\v':
4495 pp_string (pp, "\\v");
4496 break;
4498 case '\\':
4499 pp_string (pp, "\\\\");
4500 break;
4502 case '\"':
4503 pp_string (pp, "\\\"");
4504 break;
4506 case '\'':
4507 pp_string (pp, "\\'");
4508 break;
4510 default:
4511 if (str[0] || n > 1)
4513 if (!ISPRINT (str[0]))
4515 char buf[5];
4516 sprintf (buf, "\\x%02x", (unsigned char)str[0]);
4517 pp_string (pp, buf);
4519 else
4520 pp_character (pp, str[0]);
4521 break;
4527 static void
4528 maybe_init_pretty_print (FILE *file)
4530 if (!tree_pp)
4532 tree_pp = new pretty_printer ();
4533 pp_needs_newline (tree_pp) = true;
4534 pp_translate_identifiers (tree_pp) = false;
4537 tree_pp->buffer->stream = file;
4540 static void
4541 newline_and_indent (pretty_printer *pp, int spc)
4543 pp_newline (pp);
4544 INDENT (spc);
4547 /* Print the identifier ID to PRETTY-PRINTER. */
4549 void
4550 pp_tree_identifier (pretty_printer *pp, tree id)
4552 if (pp_translate_identifiers (pp))
4554 const char *text = identifier_to_locale (IDENTIFIER_POINTER (id));
4555 pp_append_text (pp, text, text + strlen (text));
4557 else
4558 pp_append_text (pp, IDENTIFIER_POINTER (id),
4559 IDENTIFIER_POINTER (id) + IDENTIFIER_LENGTH (id));
4562 /* A helper function that is used to dump function information before the
4563 function dump. */
4565 void
4566 dump_function_header (FILE *dump_file, tree fdecl, dump_flags_t flags)
4568 const char *dname, *aname;
4569 struct cgraph_node *node = cgraph_node::get (fdecl);
4570 struct function *fun = DECL_STRUCT_FUNCTION (fdecl);
4572 dname = lang_hooks.decl_printable_name (fdecl, 1);
4574 if (DECL_ASSEMBLER_NAME_SET_P (fdecl))
4575 aname = (IDENTIFIER_POINTER
4576 (DECL_ASSEMBLER_NAME (fdecl)));
4577 else
4578 aname = "<unset-asm-name>";
4580 fprintf (dump_file, "\n;; Function %s (%s, funcdef_no=%d",
4581 dname, aname, fun->funcdef_no);
4582 if (!(flags & TDF_NOUID))
4583 fprintf (dump_file, ", decl_uid=%d", DECL_UID (fdecl));
4584 if (node)
4586 fprintf (dump_file, ", cgraph_uid=%d", node->get_uid ());
4587 fprintf (dump_file, ", symbol_order=%d)%s\n\n", node->order,
4588 node->frequency == NODE_FREQUENCY_HOT
4589 ? " (hot)"
4590 : node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
4591 ? " (unlikely executed)"
4592 : node->frequency == NODE_FREQUENCY_EXECUTED_ONCE
4593 ? " (executed once)"
4594 : "");
4596 else
4597 fprintf (dump_file, ")\n\n");
4600 /* Dump double_int D to pretty_printer PP. UNS is true
4601 if D is unsigned and false otherwise. */
4602 void
4603 pp_double_int (pretty_printer *pp, double_int d, bool uns)
4605 if (d.fits_shwi ())
4606 pp_wide_integer (pp, d.low);
4607 else if (d.fits_uhwi ())
4608 pp_unsigned_wide_integer (pp, d.low);
4609 else
4611 unsigned HOST_WIDE_INT low = d.low;
4612 HOST_WIDE_INT high = d.high;
4613 if (!uns && d.is_negative ())
4615 pp_minus (pp);
4616 high = ~high + !low;
4617 low = -low;
4619 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
4620 systems? */
4621 sprintf (pp_buffer (pp)->digit_buffer,
4622 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
4623 (unsigned HOST_WIDE_INT) high, low);
4624 pp_string (pp, pp_buffer (pp)->digit_buffer);
4628 #if __GNUC__ >= 10
4629 # pragma GCC diagnostic pop
4630 #endif