[PATCH] RISC-V: Move UNSPEC_SSP_SET and UNSPEC_SSP_TEST to correct enum
[gcc.git] / gcc / tree-pretty-print.cc
bloba2a4f5bfa2f19eb579c250584523316085d53d19
1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001-2025 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"
38 #include "omp-general.h"
40 /* Routines in this file get invoked via the default tree printer
41 used by diagnostics and thus they are called from pp_printf which
42 isn't reentrant. Avoid using pp_printf in this file. */
43 #pragma GCC poison pp_printf
45 /* Disable warnings about quoting issues in the pp_xxx calls below
46 that (intentionally) don't follow GCC diagnostic conventions. */
47 #if __GNUC__ >= 10
48 # pragma GCC diagnostic push
49 # pragma GCC diagnostic ignored "-Wformat-diag"
50 #endif
52 /* Local functions, macros and variables. */
53 static const char *op_symbol (const_tree, dump_flags_t = TDF_NONE);
54 static void newline_and_indent (pretty_printer *, int);
55 static void maybe_init_pretty_print (FILE *);
56 static void print_struct_decl (pretty_printer *, const_tree, int, dump_flags_t);
57 static void do_niy (pretty_printer *, const_tree, int, dump_flags_t);
59 #define INDENT(SPACE) do { \
60 int i; for (i = 0; i<SPACE; i++) pp_space (pp); } while (0)
62 #define NIY do_niy (pp, node, spc, flags)
64 static pretty_printer *tree_pp;
66 /* Try to print something for an unknown tree code. */
68 static void
69 do_niy (pretty_printer *pp, const_tree node, int spc, dump_flags_t flags)
71 int i, len;
73 pp_string (pp, "<<< Unknown tree: ");
74 pp_string (pp, get_tree_code_name (TREE_CODE (node)));
76 if (EXPR_P (node))
78 len = TREE_OPERAND_LENGTH (node);
79 for (i = 0; i < len; ++i)
81 newline_and_indent (pp, spc+2);
82 dump_generic_node (pp, TREE_OPERAND (node, i), spc+2, flags, false);
86 pp_string (pp, " >>>");
89 /* Debugging function to print out a generic expression. */
91 DEBUG_FUNCTION void
92 debug_generic_expr (tree t)
94 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS);
95 fprintf (stderr, "\n");
98 /* Debugging function to print out a generic statement. */
100 DEBUG_FUNCTION void
101 debug_generic_stmt (tree t)
103 print_generic_stmt (stderr, t, TDF_VOPS|TDF_MEMSYMS);
104 fprintf (stderr, "\n");
107 /* Debugging function to print out a chain of trees . */
109 DEBUG_FUNCTION void
110 debug_tree_chain (tree t)
112 hash_set<tree> seen;
114 while (t)
116 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
117 fprintf (stderr, " ");
118 t = TREE_CHAIN (t);
119 if (seen.add (t))
121 fprintf (stderr, "... [cycled back to ");
122 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
123 fprintf (stderr, "]");
124 break;
127 fprintf (stderr, "\n");
130 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
131 void
132 print_generic_decl (FILE *file, tree decl, dump_flags_t flags)
134 maybe_init_pretty_print (file);
135 print_declaration (tree_pp, decl, 2, flags);
136 pp_write_text_to_stream (tree_pp);
139 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
140 to show in the dump. See TDF_* in dumpfile.h. */
142 void
143 print_generic_stmt (FILE *file, tree t, dump_flags_t flags)
145 maybe_init_pretty_print (file);
146 dump_generic_node (tree_pp, t, 0, flags, true);
147 pp_newline_and_flush (tree_pp);
150 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
151 to show in the dump. See TDF_* in dumpfile.h. The output is indented by
152 INDENT spaces. */
154 void
155 print_generic_stmt_indented (FILE *file, tree t, dump_flags_t flags, int indent)
157 int i;
159 maybe_init_pretty_print (file);
161 for (i = 0; i < indent; i++)
162 pp_space (tree_pp);
163 dump_generic_node (tree_pp, t, indent, flags, true);
164 pp_newline_and_flush (tree_pp);
167 /* Print a single expression T on file FILE. FLAGS specifies details to show
168 in the dump. See TDF_* in dumpfile.h. */
170 void
171 print_generic_expr (FILE *file, tree t, dump_flags_t flags)
173 maybe_init_pretty_print (file);
174 dump_generic_node (tree_pp, t, 0, flags, false);
175 pp_flush (tree_pp);
178 /* Print a single expression T to string, and return it. The caller
179 must free the returned memory. */
181 char *
182 print_generic_expr_to_str (tree t)
184 pretty_printer pp;
185 dump_generic_node (&pp, t, 0, TDF_VOPS|TDF_MEMSYMS, false);
186 return xstrdup (pp_formatted_text (&pp));
189 /* Dump NAME, an IDENTIFIER_POINTER, sanitized so that D<num> sequences
190 in it are replaced with Dxxxx, as long as they are at the start or
191 preceded by $ and at the end or followed by $. See make_fancy_name
192 in tree-sra.cc. */
194 static void
195 dump_fancy_name (pretty_printer *pp, tree name)
197 int cnt = 0;
198 int length = IDENTIFIER_LENGTH (name);
199 const char *n = IDENTIFIER_POINTER (name);
202 n = strchr (n, 'D');
203 if (n == NULL)
204 break;
205 if (ISDIGIT (n[1])
206 && (n == IDENTIFIER_POINTER (name) || n[-1] == '$'))
208 int l = 2;
209 while (ISDIGIT (n[l]))
210 l++;
211 if (n[l] == '\0' || n[l] == '$')
213 cnt++;
214 length += 5 - l;
216 n += l;
218 else
219 n++;
221 while (1);
222 if (cnt == 0)
224 pp_tree_identifier (pp, name);
225 return;
228 char *str = XNEWVEC (char, length + 1);
229 char *p = str;
230 const char *q;
231 q = n = IDENTIFIER_POINTER (name);
234 q = strchr (q, 'D');
235 if (q == NULL)
236 break;
237 if (ISDIGIT (q[1])
238 && (q == IDENTIFIER_POINTER (name) || q[-1] == '$'))
240 int l = 2;
241 while (ISDIGIT (q[l]))
242 l++;
243 if (q[l] == '\0' || q[l] == '$')
245 memcpy (p, n, q - n);
246 memcpy (p + (q - n), "Dxxxx", 5);
247 p += (q - n) + 5;
248 n = q + l;
250 q += l;
252 else
253 q++;
255 while (1);
256 memcpy (p, n, IDENTIFIER_LENGTH (name) - (n - IDENTIFIER_POINTER (name)));
257 str[length] = '\0';
258 if (pp_translate_identifiers (pp))
260 const char *text = identifier_to_locale (str);
261 pp_append_text (pp, text, text + strlen (text));
263 else
264 pp_append_text (pp, str, str + length);
265 XDELETEVEC (str);
268 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
269 in FLAGS. */
271 static void
272 dump_decl_name (pretty_printer *pp, tree node, dump_flags_t flags)
274 tree name = DECL_NAME (node);
275 if (name)
277 if ((flags & TDF_ASMNAME)
278 && HAS_DECL_ASSEMBLER_NAME_P (node)
279 && DECL_ASSEMBLER_NAME_SET_P (node))
280 pp_tree_identifier (pp, DECL_ASSEMBLER_NAME_RAW (node));
281 /* For -fcompare-debug don't dump DECL_NAMELESS names at all,
282 -g might have created more fancy names and their indexes
283 could get out of sync. Usually those should be DECL_IGNORED_P
284 too, SRA can create even non-DECL_IGNORED_P DECL_NAMELESS fancy
285 names, let's hope those never get out of sync after doing the
286 dump_fancy_name sanitization. */
287 else if ((flags & TDF_COMPARE_DEBUG)
288 && DECL_NAMELESS (node)
289 && DECL_IGNORED_P (node))
290 name = NULL_TREE;
291 /* For DECL_NAMELESS names look for embedded uids in the
292 names and sanitize them for TDF_NOUID. */
293 else if ((flags & TDF_NOUID) && DECL_NAMELESS (node))
294 dump_fancy_name (pp, name);
295 else
296 pp_tree_identifier (pp, name);
298 char uid_sep = (flags & TDF_GIMPLE) ? '_' : '.';
299 if ((flags & TDF_UID) || name == NULL_TREE)
301 if (TREE_CODE (node) == LABEL_DECL && LABEL_DECL_UID (node) != -1)
303 pp_character (pp, 'L');
304 pp_character (pp, uid_sep);
305 pp_decimal_int (pp, (int) LABEL_DECL_UID (node));
307 else if (TREE_CODE (node) == DEBUG_EXPR_DECL)
309 if (flags & TDF_NOUID)
310 pp_string (pp, "D#xxxx");
311 else
313 pp_string (pp, "D#");
314 pp_decimal_int (pp, (int) DEBUG_TEMP_UID (node));
317 else
319 char c = TREE_CODE (node) == CONST_DECL ? 'C' : 'D';
320 pp_character (pp, c);
321 pp_character (pp, uid_sep);
322 if (flags & TDF_NOUID)
323 pp_string (pp, "xxxx");
324 else
325 pp_scalar (pp, "%u", DECL_UID (node));
328 if ((flags & TDF_ALIAS) && DECL_PT_UID (node) != DECL_UID (node))
330 if (flags & TDF_NOUID)
331 pp_string (pp, "ptD.xxxx");
332 else
334 pp_string (pp, "ptD.");
335 pp_scalar (pp, "%u", DECL_PT_UID (node));
340 /* Like the above, but used for pretty printing function calls. */
342 static void
343 dump_function_name (pretty_printer *pp, tree node, dump_flags_t flags)
345 if (CONVERT_EXPR_P (node))
346 node = TREE_OPERAND (node, 0);
347 if (DECL_NAME (node) && (flags & TDF_ASMNAME) == 0)
349 pp_string (pp, lang_hooks.decl_printable_name (node, 1));
350 if (flags & TDF_UID)
352 char uid_sep = (flags & TDF_GIMPLE) ? '_' : '.';
353 pp_character (pp, 'D');
354 pp_character (pp, uid_sep);
355 pp_scalar (pp, "%u", DECL_UID (node));
358 else
359 dump_decl_name (pp, node, flags);
362 /* Dump a function declaration. NODE is the FUNCTION_TYPE. PP, SPC and
363 FLAGS are as in dump_generic_node. */
365 static void
366 dump_function_declaration (pretty_printer *pp, tree node,
367 int spc, dump_flags_t flags)
369 bool wrote_arg = false;
370 tree arg;
372 pp_space (pp);
373 pp_left_paren (pp);
375 /* Print the argument types. */
376 arg = TYPE_ARG_TYPES (node);
377 while (arg && arg != void_list_node && arg != error_mark_node)
379 if (wrote_arg)
381 pp_comma (pp);
382 pp_space (pp);
384 wrote_arg = true;
385 dump_generic_node (pp, TREE_VALUE (arg), spc, flags, false);
386 arg = TREE_CHAIN (arg);
389 /* Drop the trailing void_type_node if we had any previous argument. */
390 if (arg == void_list_node && !wrote_arg)
391 pp_string (pp, "void");
392 /* Properly dump vararg function types. */
393 else if (!arg && wrote_arg)
394 pp_string (pp, ", ...");
395 /* Avoid printing any arg for unprototyped functions. */
397 pp_right_paren (pp);
400 /* Dump the domain associated with an array. */
402 static void
403 dump_array_domain (pretty_printer *pp, tree domain, int spc, dump_flags_t flags)
405 pp_left_bracket (pp);
406 if (domain)
408 tree min = TYPE_MIN_VALUE (domain);
409 tree max = TYPE_MAX_VALUE (domain);
411 if (min && max
412 && integer_zerop (min)
413 && tree_fits_shwi_p (max))
414 pp_wide_integer (pp, tree_to_shwi (max) + 1);
415 else
417 if (min)
418 dump_generic_node (pp, min, spc, flags, false);
419 pp_colon (pp);
420 if (max)
421 dump_generic_node (pp, max, spc, flags, false);
424 else
425 pp_string (pp, "<unknown>");
426 pp_right_bracket (pp);
430 /* Dump OpenMP iterators ITER. */
432 static void
433 dump_omp_iterators (pretty_printer *pp, tree iter, int spc, dump_flags_t flags)
435 pp_string (pp, "iterator(");
436 for (tree it = iter; it; it = TREE_CHAIN (it))
438 if (it != iter)
439 pp_string (pp, ", ");
440 dump_generic_node (pp, TREE_TYPE (TREE_VEC_ELT (it, 0)), spc, flags,
441 false);
442 pp_space (pp);
443 dump_generic_node (pp, TREE_VEC_ELT (it, 0), spc, flags, false);
444 pp_equal (pp);
445 dump_generic_node (pp, TREE_VEC_ELT (it, 1), spc, flags, false);
446 pp_colon (pp);
447 dump_generic_node (pp, TREE_VEC_ELT (it, 2), spc, flags, false);
448 pp_colon (pp);
449 dump_generic_node (pp, TREE_VEC_ELT (it, 3), spc, flags, false);
451 pp_right_paren (pp);
454 /* Dump OpenMP's prefer_type of the init clause. */
456 static void
457 dump_omp_init_prefer_type (pretty_printer *pp, tree t)
459 if (t == NULL_TREE)
460 return;
461 pp_string (pp, "prefer_type(");
462 const char *str = TREE_STRING_POINTER (t);
463 while (str[0] == (char) GOMP_INTEROP_IFR_SEPARATOR)
465 bool has_fr = false;
466 pp_character (pp, '{');
467 str++;
468 while (str[0] != (char) GOMP_INTEROP_IFR_SEPARATOR)
470 if (has_fr)
471 pp_character (pp, ',');
472 has_fr = true;
473 pp_string (pp, "fr(\"");
474 pp_string (pp, omp_get_name_from_fr_id (str[0]));
475 pp_string (pp, "\")");
476 str++;
478 str++;
479 if (has_fr && str[0] != '\0')
480 pp_character (pp, ',');
481 while (str[0] != '\0')
483 pp_string (pp, "attr(\"");
484 pp_string (pp, str);
485 pp_string (pp, "\")");
486 str += strlen (str) + 1;
487 if (str[0] != '\0')
488 pp_character (pp, ',');
490 str++;
491 pp_character (pp, '}');
492 if (str[0] != '\0')
493 pp_string (pp, ", ");
495 pp_right_paren (pp);
498 /* Dump OMP clause CLAUSE, without following OMP_CLAUSE_CHAIN.
500 PP, CLAUSE, SPC and FLAGS are as in dump_generic_node. */
502 static void
503 dump_omp_clause (pretty_printer *pp, tree clause, int spc, dump_flags_t flags)
505 const char *name;
506 const char *modifier = NULL;
507 switch (OMP_CLAUSE_CODE (clause))
509 case OMP_CLAUSE_PRIVATE:
510 name = "private";
511 goto print_remap;
512 case OMP_CLAUSE_SHARED:
513 name = "shared";
514 goto print_remap;
515 case OMP_CLAUSE_FIRSTPRIVATE:
516 name = "firstprivate";
517 goto print_remap;
518 case OMP_CLAUSE_LASTPRIVATE:
519 name = "lastprivate";
520 if (OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (clause))
521 modifier = "conditional:";
522 goto print_remap;
523 case OMP_CLAUSE_COPYIN:
524 name = "copyin";
525 goto print_remap;
526 case OMP_CLAUSE_COPYPRIVATE:
527 name = "copyprivate";
528 goto print_remap;
529 case OMP_CLAUSE_UNIFORM:
530 name = "uniform";
531 goto print_remap;
532 case OMP_CLAUSE_USE_DEVICE_PTR:
533 name = "use_device_ptr";
534 if (OMP_CLAUSE_USE_DEVICE_PTR_IF_PRESENT (clause))
535 modifier = "if_present:";
536 goto print_remap;
537 case OMP_CLAUSE_USE_DEVICE_ADDR:
538 name = "use_device_addr";
539 goto print_remap;
540 case OMP_CLAUSE_HAS_DEVICE_ADDR:
541 name = "has_device_addr";
542 goto print_remap;
543 case OMP_CLAUSE_IS_DEVICE_PTR:
544 name = "is_device_ptr";
545 goto print_remap;
546 case OMP_CLAUSE_INCLUSIVE:
547 name = "inclusive";
548 goto print_remap;
549 case OMP_CLAUSE_EXCLUSIVE:
550 name = "exclusive";
551 goto print_remap;
552 case OMP_CLAUSE_NOVARIANTS:
553 pp_string (pp, "novariants");
554 pp_left_paren (pp);
555 gcc_assert (OMP_CLAUSE_NOVARIANTS_EXPR (clause));
556 dump_generic_node (pp, OMP_CLAUSE_NOVARIANTS_EXPR (clause), spc, flags,
557 false);
558 pp_right_paren (pp);
559 break;
560 case OMP_CLAUSE_NOCONTEXT:
561 pp_string (pp, "nocontext");
562 pp_left_paren (pp);
563 gcc_assert (OMP_CLAUSE_NOCONTEXT_EXPR (clause));
564 dump_generic_node (pp, OMP_CLAUSE_NOCONTEXT_EXPR (clause), spc, flags,
565 false);
566 pp_right_paren (pp);
567 break;
568 case OMP_CLAUSE__LOOPTEMP_:
569 name = "_looptemp_";
570 goto print_remap;
571 case OMP_CLAUSE__REDUCTEMP_:
572 name = "_reductemp_";
573 goto print_remap;
574 case OMP_CLAUSE__CONDTEMP_:
575 name = "_condtemp_";
576 goto print_remap;
577 case OMP_CLAUSE__SCANTEMP_:
578 name = "_scantemp_";
579 goto print_remap;
580 case OMP_CLAUSE_ENTER:
581 if (OMP_CLAUSE_ENTER_TO (clause))
582 name = "to";
583 else
584 name = "enter";
585 goto print_remap;
586 case OMP_CLAUSE_LINK:
587 name = "link";
588 goto print_remap;
589 case OMP_CLAUSE_NONTEMPORAL:
590 name = "nontemporal";
591 goto print_remap;
592 print_remap:
593 pp_string (pp, name);
594 pp_left_paren (pp);
595 if (modifier)
596 pp_string (pp, modifier);
597 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
598 spc, flags, false);
599 pp_right_paren (pp);
600 break;
602 case OMP_CLAUSE_TASK_REDUCTION:
603 case OMP_CLAUSE_IN_REDUCTION:
604 pp_string (pp, OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_IN_REDUCTION
605 ? "in_" : "task_");
606 /* FALLTHRU */
607 case OMP_CLAUSE_REDUCTION:
608 pp_string (pp, "reduction(");
609 if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_REDUCTION)
611 if (OMP_CLAUSE_REDUCTION_TASK (clause))
612 pp_string (pp, "task,");
613 else if (OMP_CLAUSE_REDUCTION_INSCAN (clause))
614 pp_string (pp, "inscan,");
616 if (OMP_CLAUSE_REDUCTION_CODE (clause) != ERROR_MARK)
618 pp_string (pp,
619 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause)));
620 pp_colon (pp);
622 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
623 spc, flags, false);
624 pp_right_paren (pp);
625 break;
627 case OMP_CLAUSE_IF:
628 pp_string (pp, "if(");
629 switch (OMP_CLAUSE_IF_MODIFIER (clause))
631 case ERROR_MARK: break;
632 case VOID_CST: pp_string (pp, "cancel:"); break;
633 case OMP_PARALLEL: pp_string (pp, "parallel:"); break;
634 case OMP_SIMD: pp_string (pp, "simd:"); break;
635 case OMP_TASK: pp_string (pp, "task:"); break;
636 case OMP_TASKLOOP: pp_string (pp, "taskloop:"); break;
637 case OMP_TARGET_DATA: pp_string (pp, "target data:"); break;
638 case OMP_TARGET: pp_string (pp, "target:"); break;
639 case OMP_TARGET_UPDATE: pp_string (pp, "target update:"); break;
640 case OMP_TARGET_ENTER_DATA:
641 pp_string (pp, "target enter data:"); break;
642 case OMP_TARGET_EXIT_DATA: pp_string (pp, "target exit data:"); break;
643 default: gcc_unreachable ();
645 dump_generic_node (pp, OMP_CLAUSE_IF_EXPR (clause),
646 spc, flags, false);
647 pp_right_paren (pp);
648 break;
650 case OMP_CLAUSE_DESTROY:
651 pp_string (pp, "destroy(");
652 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
653 spc, flags, false);
654 pp_right_paren (pp);
655 break;
657 case OMP_CLAUSE_INIT:
658 pp_string (pp, "init(");
659 dump_omp_init_prefer_type (pp, OMP_CLAUSE_INIT_PREFER_TYPE (clause));
660 if (OMP_CLAUSE_INIT_TARGET (clause))
662 if (OMP_CLAUSE_INIT_PREFER_TYPE (clause))
663 pp_string (pp, ", ");
664 pp_string (pp, "target");
666 if (OMP_CLAUSE_INIT_TARGETSYNC (clause))
668 if (OMP_CLAUSE_INIT_PREFER_TYPE (clause) || OMP_CLAUSE_INIT_TARGET (clause))
669 pp_string (pp, ", ");
670 pp_string (pp, "targetsync");
672 if (OMP_CLAUSE_INIT_PREFER_TYPE (clause)
673 || OMP_CLAUSE_INIT_TARGET (clause)
674 || OMP_CLAUSE_INIT_TARGETSYNC (clause))
675 pp_string (pp, ": ");
676 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
677 spc, flags, false);
678 pp_right_paren (pp);
679 break;
681 case OMP_CLAUSE_USE:
682 pp_string (pp, "use(");
683 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
684 spc, flags, false);
685 pp_right_paren (pp);
686 break;
688 case OMP_CLAUSE_SELF:
689 pp_string (pp, "self(");
690 dump_generic_node (pp, OMP_CLAUSE_SELF_EXPR (clause),
691 spc, flags, false);
692 pp_right_paren (pp);
693 break;
695 case OMP_CLAUSE_NUM_THREADS:
696 pp_string (pp, "num_threads(");
697 dump_generic_node (pp, OMP_CLAUSE_NUM_THREADS_EXPR (clause),
698 spc, flags, false);
699 pp_right_paren (pp);
700 break;
702 case OMP_CLAUSE_NOWAIT:
703 pp_string (pp, "nowait");
704 break;
705 case OMP_CLAUSE_ORDERED:
706 pp_string (pp, "ordered");
707 if (OMP_CLAUSE_ORDERED_EXPR (clause))
709 pp_left_paren (pp);
710 dump_generic_node (pp, OMP_CLAUSE_ORDERED_EXPR (clause),
711 spc, flags, false);
712 pp_right_paren (pp);
714 break;
716 case OMP_CLAUSE_DEFAULT:
717 pp_string (pp, "default(");
718 switch (OMP_CLAUSE_DEFAULT_KIND (clause))
720 case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
721 break;
722 case OMP_CLAUSE_DEFAULT_SHARED:
723 pp_string (pp, "shared");
724 break;
725 case OMP_CLAUSE_DEFAULT_NONE:
726 pp_string (pp, "none");
727 break;
728 case OMP_CLAUSE_DEFAULT_PRIVATE:
729 pp_string (pp, "private");
730 break;
731 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
732 pp_string (pp, "firstprivate");
733 break;
734 case OMP_CLAUSE_DEFAULT_PRESENT:
735 pp_string (pp, "present");
736 break;
737 default:
738 gcc_unreachable ();
740 pp_right_paren (pp);
741 break;
743 case OMP_CLAUSE_SCHEDULE:
744 pp_string (pp, "schedule(");
745 if (OMP_CLAUSE_SCHEDULE_KIND (clause)
746 & (OMP_CLAUSE_SCHEDULE_MONOTONIC
747 | OMP_CLAUSE_SCHEDULE_NONMONOTONIC))
749 if (OMP_CLAUSE_SCHEDULE_KIND (clause)
750 & OMP_CLAUSE_SCHEDULE_MONOTONIC)
751 pp_string (pp, "monotonic");
752 else
753 pp_string (pp, "nonmonotonic");
754 if (OMP_CLAUSE_SCHEDULE_SIMD (clause))
755 pp_comma (pp);
756 else
757 pp_colon (pp);
759 if (OMP_CLAUSE_SCHEDULE_SIMD (clause))
760 pp_string (pp, "simd:");
762 switch (OMP_CLAUSE_SCHEDULE_KIND (clause) & OMP_CLAUSE_SCHEDULE_MASK)
764 case OMP_CLAUSE_SCHEDULE_STATIC:
765 pp_string (pp, "static");
766 break;
767 case OMP_CLAUSE_SCHEDULE_DYNAMIC:
768 pp_string (pp, "dynamic");
769 break;
770 case OMP_CLAUSE_SCHEDULE_GUIDED:
771 pp_string (pp, "guided");
772 break;
773 case OMP_CLAUSE_SCHEDULE_RUNTIME:
774 pp_string (pp, "runtime");
775 break;
776 case OMP_CLAUSE_SCHEDULE_AUTO:
777 pp_string (pp, "auto");
778 break;
779 default:
780 gcc_unreachable ();
782 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
784 pp_comma (pp);
785 dump_generic_node (pp, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
786 spc, flags, false);
788 pp_right_paren (pp);
789 break;
791 case OMP_CLAUSE_UNTIED:
792 pp_string (pp, "untied");
793 break;
795 case OMP_CLAUSE_COLLAPSE:
796 pp_string (pp, "collapse(");
797 dump_generic_node (pp, OMP_CLAUSE_COLLAPSE_EXPR (clause),
798 spc, flags, false);
799 pp_right_paren (pp);
800 break;
802 case OMP_CLAUSE_FINAL:
803 pp_string (pp, "final(");
804 dump_generic_node (pp, OMP_CLAUSE_FINAL_EXPR (clause),
805 spc, flags, false);
806 pp_right_paren (pp);
807 break;
809 case OMP_CLAUSE_MERGEABLE:
810 pp_string (pp, "mergeable");
811 break;
813 case OMP_CLAUSE_LINEAR:
814 pp_string (pp, "linear(");
815 if (OMP_CLAUSE_LINEAR_OLD_LINEAR_MODIFIER (clause))
816 switch (OMP_CLAUSE_LINEAR_KIND (clause))
818 case OMP_CLAUSE_LINEAR_DEFAULT:
819 break;
820 case OMP_CLAUSE_LINEAR_REF:
821 pp_string (pp, "ref(");
822 break;
823 case OMP_CLAUSE_LINEAR_VAL:
824 pp_string (pp, "val(");
825 break;
826 case OMP_CLAUSE_LINEAR_UVAL:
827 pp_string (pp, "uval(");
828 break;
829 default:
830 gcc_unreachable ();
832 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
833 spc, flags, false);
834 if (OMP_CLAUSE_LINEAR_OLD_LINEAR_MODIFIER (clause)
835 && OMP_CLAUSE_LINEAR_KIND (clause) != OMP_CLAUSE_LINEAR_DEFAULT)
836 pp_right_paren (pp);
837 pp_colon (pp);
838 if (!OMP_CLAUSE_LINEAR_OLD_LINEAR_MODIFIER (clause)
839 && OMP_CLAUSE_LINEAR_KIND (clause) != OMP_CLAUSE_LINEAR_DEFAULT)
840 switch (OMP_CLAUSE_LINEAR_KIND (clause))
842 case OMP_CLAUSE_LINEAR_REF:
843 pp_string (pp, "ref,step(");
844 break;
845 case OMP_CLAUSE_LINEAR_VAL:
846 pp_string (pp, "val,step(");
847 break;
848 case OMP_CLAUSE_LINEAR_UVAL:
849 pp_string (pp, "uval,step(");
850 break;
851 default:
852 gcc_unreachable ();
854 dump_generic_node (pp, OMP_CLAUSE_LINEAR_STEP (clause),
855 spc, flags, false);
856 if (!OMP_CLAUSE_LINEAR_OLD_LINEAR_MODIFIER (clause)
857 && OMP_CLAUSE_LINEAR_KIND (clause) != OMP_CLAUSE_LINEAR_DEFAULT)
858 pp_right_paren (pp);
859 pp_right_paren (pp);
860 break;
862 case OMP_CLAUSE_ALIGNED:
863 pp_string (pp, "aligned(");
864 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
865 spc, flags, false);
866 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause))
868 pp_colon (pp);
869 dump_generic_node (pp, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause),
870 spc, flags, false);
872 pp_right_paren (pp);
873 break;
875 case OMP_CLAUSE_ALLOCATE:
876 pp_string (pp, "allocate(");
877 if (OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause))
879 pp_string (pp, "allocator(");
880 dump_generic_node (pp, OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause),
881 spc, flags, false);
882 pp_right_paren (pp);
884 if (OMP_CLAUSE_ALLOCATE_ALIGN (clause))
886 if (OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause))
887 pp_comma (pp);
888 pp_string (pp, "align(");
889 dump_generic_node (pp, OMP_CLAUSE_ALLOCATE_ALIGN (clause),
890 spc, flags, false);
891 pp_right_paren (pp);
893 if (OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause)
894 || OMP_CLAUSE_ALLOCATE_ALIGN (clause))
895 pp_colon (pp);
896 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
897 spc, flags, false);
898 pp_right_paren (pp);
899 break;
901 case OMP_CLAUSE_AFFINITY:
902 pp_string (pp, "affinity(");
904 tree t = OMP_CLAUSE_DECL (clause);
905 if (TREE_CODE (t) == TREE_LIST
906 && TREE_PURPOSE (t)
907 && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
909 dump_omp_iterators (pp, TREE_PURPOSE (t), spc, flags);
910 pp_colon (pp);
911 t = TREE_VALUE (t);
913 dump_generic_node (pp, t, spc, flags, false);
915 pp_right_paren (pp);
916 break;
917 case OMP_CLAUSE_DEPEND:
918 pp_string (pp, "depend(");
919 switch (OMP_CLAUSE_DEPEND_KIND (clause))
921 case OMP_CLAUSE_DEPEND_DEPOBJ:
922 name = "depobj";
923 break;
924 case OMP_CLAUSE_DEPEND_IN:
925 name = "in";
926 break;
927 case OMP_CLAUSE_DEPEND_OUT:
928 name = "out";
929 break;
930 case OMP_CLAUSE_DEPEND_INOUT:
931 name = "inout";
932 break;
933 case OMP_CLAUSE_DEPEND_MUTEXINOUTSET:
934 name = "mutexinoutset";
935 break;
936 case OMP_CLAUSE_DEPEND_INOUTSET:
937 name = "inoutset";
938 break;
939 case OMP_CLAUSE_DEPEND_LAST:
940 name = "__internal__";
941 break;
942 default:
943 gcc_unreachable ();
946 tree t = OMP_CLAUSE_DECL (clause);
947 if (TREE_CODE (t) == TREE_LIST
948 && TREE_PURPOSE (t)
949 && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
951 dump_omp_iterators (pp, TREE_PURPOSE (t), spc, flags);
952 pp_colon (pp);
953 t = TREE_VALUE (t);
955 if (name[0])
957 pp_string (pp, name);
958 pp_colon (pp);
960 if (t == null_pointer_node)
961 pp_string (pp, "omp_all_memory");
962 else
963 dump_generic_node (pp, t, spc, flags, false);
964 pp_right_paren (pp);
966 break;
968 case OMP_CLAUSE_DOACROSS:
969 pp_string (pp, OMP_CLAUSE_DOACROSS_DEPEND (clause)
970 ? "depend(" : "doacross(");
971 switch (OMP_CLAUSE_DOACROSS_KIND (clause))
973 case OMP_CLAUSE_DOACROSS_SOURCE:
974 if (OMP_CLAUSE_DOACROSS_DEPEND (clause))
975 pp_string (pp, "source)");
976 else
977 pp_string (pp, "source:)");
978 break;
979 case OMP_CLAUSE_DOACROSS_SINK:
980 pp_string (pp, "sink:");
981 if (OMP_CLAUSE_DECL (clause) == NULL_TREE)
983 pp_string (pp, "omp_cur_iteration-1)");
984 break;
986 for (tree t = OMP_CLAUSE_DECL (clause); t; t = TREE_CHAIN (t))
987 if (TREE_CODE (t) == TREE_LIST)
989 dump_generic_node (pp, TREE_VALUE (t), spc, flags, false);
990 if (TREE_PURPOSE (t) != integer_zero_node)
992 if (OMP_CLAUSE_DOACROSS_SINK_NEGATIVE (t))
993 pp_minus (pp);
994 else
995 pp_plus (pp);
996 dump_generic_node (pp, TREE_PURPOSE (t), spc, flags,
997 false);
999 if (TREE_CHAIN (t))
1000 pp_comma (pp);
1002 else
1003 gcc_unreachable ();
1004 pp_right_paren (pp);
1005 break;
1006 default:
1007 gcc_unreachable ();
1009 break;
1011 case OMP_CLAUSE_MAP:
1012 pp_string (pp, "map(");
1013 if (OMP_CLAUSE_MAP_READONLY (clause))
1014 pp_string (pp, "readonly,");
1015 switch (OMP_CLAUSE_MAP_KIND (clause))
1017 case GOMP_MAP_ALLOC:
1018 case GOMP_MAP_POINTER:
1019 case GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION:
1020 pp_string (pp, "alloc");
1021 break;
1022 case GOMP_MAP_IF_PRESENT:
1023 pp_string (pp, "no_alloc");
1024 break;
1025 case GOMP_MAP_TO:
1026 case GOMP_MAP_TO_PSET:
1027 pp_string (pp, "to");
1028 break;
1029 case GOMP_MAP_FROM:
1030 pp_string (pp, "from");
1031 break;
1032 case GOMP_MAP_TOFROM:
1033 pp_string (pp, "tofrom");
1034 break;
1035 case GOMP_MAP_FORCE_ALLOC:
1036 pp_string (pp, "force_alloc");
1037 break;
1038 case GOMP_MAP_FORCE_TO:
1039 pp_string (pp, "force_to");
1040 break;
1041 case GOMP_MAP_FORCE_FROM:
1042 pp_string (pp, "force_from");
1043 break;
1044 case GOMP_MAP_FORCE_TOFROM:
1045 pp_string (pp, "force_tofrom");
1046 break;
1047 case GOMP_MAP_FORCE_PRESENT:
1048 pp_string (pp, "force_present");
1049 break;
1050 case GOMP_MAP_DELETE:
1051 pp_string (pp, "delete");
1052 break;
1053 case GOMP_MAP_FORCE_DEVICEPTR:
1054 pp_string (pp, "force_deviceptr");
1055 break;
1056 case GOMP_MAP_ALWAYS_TO:
1057 pp_string (pp, "always,to");
1058 break;
1059 case GOMP_MAP_ALWAYS_FROM:
1060 pp_string (pp, "always,from");
1061 break;
1062 case GOMP_MAP_ALWAYS_TOFROM:
1063 pp_string (pp, "always,tofrom");
1064 break;
1065 case GOMP_MAP_RELEASE:
1066 pp_string (pp, "release");
1067 break;
1068 case GOMP_MAP_FIRSTPRIVATE_POINTER:
1069 pp_string (pp, "firstprivate");
1070 break;
1071 case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
1072 pp_string (pp, "firstprivate ref");
1073 break;
1074 case GOMP_MAP_STRUCT:
1075 pp_string (pp, "struct");
1076 break;
1077 case GOMP_MAP_STRUCT_UNORD:
1078 pp_string (pp, "struct_unord");
1079 break;
1080 case GOMP_MAP_ALWAYS_POINTER:
1081 pp_string (pp, "always_pointer");
1082 break;
1083 case GOMP_MAP_DEVICE_RESIDENT:
1084 pp_string (pp, "device_resident");
1085 break;
1086 case GOMP_MAP_LINK:
1087 pp_string (pp, "link");
1088 break;
1089 case GOMP_MAP_ATTACH:
1090 pp_string (pp, "attach");
1091 break;
1092 case GOMP_MAP_DETACH:
1093 pp_string (pp, "detach");
1094 break;
1095 case GOMP_MAP_FORCE_DETACH:
1096 pp_string (pp, "force_detach");
1097 break;
1098 case GOMP_MAP_ATTACH_DETACH:
1099 pp_string (pp, "attach_detach");
1100 break;
1101 case GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION:
1102 pp_string (pp, "attach_zero_length_array_section");
1103 break;
1104 case GOMP_MAP_PRESENT_ALLOC:
1105 pp_string (pp, "present,alloc");
1106 break;
1107 case GOMP_MAP_PRESENT_TO:
1108 pp_string (pp, "present,to");
1109 break;
1110 case GOMP_MAP_PRESENT_FROM:
1111 pp_string (pp, "present,from");
1112 break;
1113 case GOMP_MAP_PRESENT_TOFROM:
1114 pp_string (pp, "present,tofrom");
1115 break;
1116 case GOMP_MAP_ALWAYS_PRESENT_TO:
1117 pp_string (pp, "always,present,to");
1118 break;
1119 case GOMP_MAP_ALWAYS_PRESENT_FROM:
1120 pp_string (pp, "always,present,from");
1121 break;
1122 case GOMP_MAP_ALWAYS_PRESENT_TOFROM:
1123 pp_string (pp, "always,present,tofrom");
1124 break;
1125 default:
1126 gcc_unreachable ();
1128 pp_colon (pp);
1129 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
1130 spc, flags, false);
1131 print_clause_size:
1132 if (OMP_CLAUSE_SIZE (clause))
1134 switch (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
1135 ? OMP_CLAUSE_MAP_KIND (clause) : GOMP_MAP_TO)
1137 case GOMP_MAP_POINTER:
1138 case GOMP_MAP_FIRSTPRIVATE_POINTER:
1139 case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
1140 case GOMP_MAP_ALWAYS_POINTER:
1141 pp_string (pp, " [pointer assign, bias: ");
1142 break;
1143 case GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION:
1144 pp_string (pp, " [pointer assign, zero-length array section, bias: ");
1145 break;
1146 case GOMP_MAP_TO_PSET:
1147 pp_string (pp, " [pointer set, len: ");
1148 break;
1149 case GOMP_MAP_ATTACH:
1150 case GOMP_MAP_DETACH:
1151 case GOMP_MAP_FORCE_DETACH:
1152 case GOMP_MAP_ATTACH_DETACH:
1153 case GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION:
1154 pp_string (pp, " [bias: ");
1155 break;
1156 case GOMP_MAP_RELEASE:
1157 case GOMP_MAP_DELETE:
1158 if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
1159 && OMP_CLAUSE_RELEASE_DESCRIPTOR (clause))
1161 pp_string (pp, " [pointer set, len: ");
1162 break;
1164 /* Fallthrough. */
1165 default:
1166 pp_string (pp, " [len: ");
1167 break;
1169 dump_generic_node (pp, OMP_CLAUSE_SIZE (clause),
1170 spc, flags, false);
1171 pp_right_bracket (pp);
1173 if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
1174 && OMP_CLAUSE_MAP_RUNTIME_IMPLICIT_P (clause))
1175 pp_string (pp, " [runtime_implicit]");
1176 pp_right_paren (pp);
1177 break;
1179 case OMP_CLAUSE_FROM:
1180 pp_string (pp, "from(");
1181 if (OMP_CLAUSE_MOTION_PRESENT (clause))
1182 pp_string (pp, "present:");
1183 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
1184 spc, flags, false);
1185 goto print_clause_size;
1187 case OMP_CLAUSE_TO:
1188 pp_string (pp, "to(");
1189 if (OMP_CLAUSE_MOTION_PRESENT (clause))
1190 pp_string (pp, "present:");
1191 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
1192 spc, flags, false);
1193 goto print_clause_size;
1195 case OMP_CLAUSE__CACHE_:
1196 pp_string (pp, "(");
1197 if (OMP_CLAUSE__CACHE__READONLY (clause))
1198 pp_string (pp, "readonly:");
1199 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
1200 spc, flags, false);
1201 goto print_clause_size;
1203 case OMP_CLAUSE_NUM_TEAMS:
1204 pp_string (pp, "num_teams(");
1205 if (OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (clause))
1207 dump_generic_node (pp, OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (clause),
1208 spc, flags, false);
1209 pp_colon (pp);
1211 dump_generic_node (pp, OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR (clause),
1212 spc, flags, false);
1213 pp_right_paren (pp);
1214 break;
1216 case OMP_CLAUSE_THREAD_LIMIT:
1217 pp_string (pp, "thread_limit(");
1218 dump_generic_node (pp, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause),
1219 spc, flags, false);
1220 pp_right_paren (pp);
1221 break;
1223 case OMP_CLAUSE_DEVICE:
1224 pp_string (pp, "device(");
1225 if (OMP_CLAUSE_DEVICE_ANCESTOR (clause))
1226 pp_string (pp, "ancestor:");
1227 dump_generic_node (pp, OMP_CLAUSE_DEVICE_ID (clause),
1228 spc, flags, false);
1229 pp_right_paren (pp);
1230 break;
1232 case OMP_CLAUSE_DIST_SCHEDULE:
1233 pp_string (pp, "dist_schedule(static");
1234 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause))
1236 pp_comma (pp);
1237 dump_generic_node (pp,
1238 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause),
1239 spc, flags, false);
1241 pp_right_paren (pp);
1242 break;
1244 case OMP_CLAUSE_PROC_BIND:
1245 pp_string (pp, "proc_bind(");
1246 switch (OMP_CLAUSE_PROC_BIND_KIND (clause))
1248 case OMP_CLAUSE_PROC_BIND_MASTER:
1249 /* Same enum value: case OMP_CLAUSE_PROC_BIND_PRIMARY: */
1250 /* TODO: Change to 'primary' for OpenMP 5.1. */
1251 pp_string (pp, "master");
1252 break;
1253 case OMP_CLAUSE_PROC_BIND_CLOSE:
1254 pp_string (pp, "close");
1255 break;
1256 case OMP_CLAUSE_PROC_BIND_SPREAD:
1257 pp_string (pp, "spread");
1258 break;
1259 default:
1260 gcc_unreachable ();
1262 pp_right_paren (pp);
1263 break;
1265 case OMP_CLAUSE_DEVICE_TYPE:
1266 pp_string (pp, "device_type(");
1267 switch (OMP_CLAUSE_DEVICE_TYPE_KIND (clause))
1269 case OMP_CLAUSE_DEVICE_TYPE_HOST:
1270 pp_string (pp, "host");
1271 break;
1272 case OMP_CLAUSE_DEVICE_TYPE_NOHOST:
1273 pp_string (pp, "nohost");
1274 break;
1275 case OMP_CLAUSE_DEVICE_TYPE_ANY:
1276 pp_string (pp, "any");
1277 break;
1278 default:
1279 gcc_unreachable ();
1281 pp_right_paren (pp);
1282 break;
1284 case OMP_CLAUSE_SAFELEN:
1285 pp_string (pp, "safelen(");
1286 dump_generic_node (pp, OMP_CLAUSE_SAFELEN_EXPR (clause),
1287 spc, flags, false);
1288 pp_right_paren (pp);
1289 break;
1291 case OMP_CLAUSE_SIMDLEN:
1292 pp_string (pp, "simdlen(");
1293 dump_generic_node (pp, OMP_CLAUSE_SIMDLEN_EXPR (clause),
1294 spc, flags, false);
1295 pp_right_paren (pp);
1296 break;
1298 case OMP_CLAUSE_PRIORITY:
1299 pp_string (pp, "priority(");
1300 dump_generic_node (pp, OMP_CLAUSE_PRIORITY_EXPR (clause),
1301 spc, flags, false);
1302 pp_right_paren (pp);
1303 break;
1305 case OMP_CLAUSE_GRAINSIZE:
1306 pp_string (pp, "grainsize(");
1307 if (OMP_CLAUSE_GRAINSIZE_STRICT (clause))
1308 pp_string (pp, "strict:");
1309 dump_generic_node (pp, OMP_CLAUSE_GRAINSIZE_EXPR (clause),
1310 spc, flags, false);
1311 pp_right_paren (pp);
1312 break;
1314 case OMP_CLAUSE_NUM_TASKS:
1315 pp_string (pp, "num_tasks(");
1316 if (OMP_CLAUSE_NUM_TASKS_STRICT (clause))
1317 pp_string (pp, "strict:");
1318 dump_generic_node (pp, OMP_CLAUSE_NUM_TASKS_EXPR (clause),
1319 spc, flags, false);
1320 pp_right_paren (pp);
1321 break;
1323 case OMP_CLAUSE_HINT:
1324 pp_string (pp, "hint(");
1325 dump_generic_node (pp, OMP_CLAUSE_HINT_EXPR (clause),
1326 spc, flags, false);
1327 pp_right_paren (pp);
1328 break;
1330 case OMP_CLAUSE_FILTER:
1331 pp_string (pp, "filter(");
1332 dump_generic_node (pp, OMP_CLAUSE_FILTER_EXPR (clause),
1333 spc, flags, false);
1334 pp_right_paren (pp);
1335 break;
1337 case OMP_CLAUSE_DEFAULTMAP:
1338 pp_string (pp, "defaultmap(");
1339 switch (OMP_CLAUSE_DEFAULTMAP_BEHAVIOR (clause))
1341 case OMP_CLAUSE_DEFAULTMAP_ALLOC:
1342 pp_string (pp, "alloc");
1343 break;
1344 case OMP_CLAUSE_DEFAULTMAP_TO:
1345 pp_string (pp, "to");
1346 break;
1347 case OMP_CLAUSE_DEFAULTMAP_FROM:
1348 pp_string (pp, "from");
1349 break;
1350 case OMP_CLAUSE_DEFAULTMAP_TOFROM:
1351 pp_string (pp, "tofrom");
1352 break;
1353 case OMP_CLAUSE_DEFAULTMAP_FIRSTPRIVATE:
1354 pp_string (pp, "firstprivate");
1355 break;
1356 case OMP_CLAUSE_DEFAULTMAP_NONE:
1357 pp_string (pp, "none");
1358 break;
1359 case OMP_CLAUSE_DEFAULTMAP_PRESENT:
1360 pp_string (pp, "present");
1361 break;
1362 case OMP_CLAUSE_DEFAULTMAP_DEFAULT:
1363 pp_string (pp, "default");
1364 break;
1365 default:
1366 gcc_unreachable ();
1368 switch (OMP_CLAUSE_DEFAULTMAP_CATEGORY (clause))
1370 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED:
1371 break;
1372 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALL:
1373 pp_string (pp, ":all");
1374 break;
1375 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_SCALAR:
1376 pp_string (pp, ":scalar");
1377 break;
1378 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_AGGREGATE:
1379 pp_string (pp, ":aggregate");
1380 break;
1381 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALLOCATABLE:
1382 pp_string (pp, ":allocatable");
1383 break;
1384 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_POINTER:
1385 pp_string (pp, ":pointer");
1386 break;
1387 default:
1388 gcc_unreachable ();
1390 pp_right_paren (pp);
1391 break;
1393 case OMP_CLAUSE_ORDER:
1394 pp_string (pp, "order(");
1395 if (OMP_CLAUSE_ORDER_UNCONSTRAINED (clause))
1396 pp_string (pp, "unconstrained:");
1397 else if (OMP_CLAUSE_ORDER_REPRODUCIBLE (clause))
1398 pp_string (pp, "reproducible:");
1399 pp_string (pp, "concurrent)");
1400 break;
1402 case OMP_CLAUSE_BIND:
1403 pp_string (pp, "bind(");
1404 switch (OMP_CLAUSE_BIND_KIND (clause))
1406 case OMP_CLAUSE_BIND_TEAMS:
1407 pp_string (pp, "teams");
1408 break;
1409 case OMP_CLAUSE_BIND_PARALLEL:
1410 pp_string (pp, "parallel");
1411 break;
1412 case OMP_CLAUSE_BIND_THREAD:
1413 pp_string (pp, "thread");
1414 break;
1415 default:
1416 gcc_unreachable ();
1418 pp_right_paren (pp);
1419 break;
1421 case OMP_CLAUSE__SIMDUID_:
1422 pp_string (pp, "_simduid_(");
1423 dump_generic_node (pp, OMP_CLAUSE__SIMDUID__DECL (clause),
1424 spc, flags, false);
1425 pp_right_paren (pp);
1426 break;
1428 case OMP_CLAUSE__SIMT_:
1429 pp_string (pp, "_simt_");
1430 break;
1432 case OMP_CLAUSE_GANG:
1433 pp_string (pp, "gang");
1434 if (OMP_CLAUSE_GANG_EXPR (clause) != NULL_TREE)
1436 pp_string (pp, "(num: ");
1437 dump_generic_node (pp, OMP_CLAUSE_GANG_EXPR (clause),
1438 spc, flags, false);
1440 if (OMP_CLAUSE_GANG_STATIC_EXPR (clause) != NULL_TREE)
1442 if (OMP_CLAUSE_GANG_EXPR (clause) == NULL_TREE)
1443 pp_left_paren (pp);
1444 else
1445 pp_space (pp);
1446 pp_string (pp, "static:");
1447 if (OMP_CLAUSE_GANG_STATIC_EXPR (clause)
1448 == integer_minus_one_node)
1449 pp_character (pp, '*');
1450 else
1451 dump_generic_node (pp, OMP_CLAUSE_GANG_STATIC_EXPR (clause),
1452 spc, flags, false);
1454 if (OMP_CLAUSE_GANG_EXPR (clause) != NULL_TREE
1455 || OMP_CLAUSE_GANG_STATIC_EXPR (clause) != NULL_TREE)
1456 pp_right_paren (pp);
1457 break;
1459 case OMP_CLAUSE_ASYNC:
1460 pp_string (pp, "async");
1461 if (OMP_CLAUSE_ASYNC_EXPR (clause))
1463 pp_character(pp, '(');
1464 dump_generic_node (pp, OMP_CLAUSE_ASYNC_EXPR (clause),
1465 spc, flags, false);
1466 pp_character(pp, ')');
1468 break;
1470 case OMP_CLAUSE_AUTO:
1471 case OMP_CLAUSE_SEQ:
1472 pp_string (pp, omp_clause_code_name[OMP_CLAUSE_CODE (clause)]);
1473 break;
1475 case OMP_CLAUSE_WAIT:
1476 pp_string (pp, "wait(");
1477 dump_generic_node (pp, OMP_CLAUSE_WAIT_EXPR (clause),
1478 spc, flags, false);
1479 pp_character(pp, ')');
1480 break;
1482 case OMP_CLAUSE_WORKER:
1483 pp_string (pp, "worker");
1484 if (OMP_CLAUSE_WORKER_EXPR (clause) != NULL_TREE)
1486 pp_left_paren (pp);
1487 dump_generic_node (pp, OMP_CLAUSE_WORKER_EXPR (clause),
1488 spc, flags, false);
1489 pp_right_paren (pp);
1491 break;
1493 case OMP_CLAUSE_VECTOR:
1494 pp_string (pp, "vector");
1495 if (OMP_CLAUSE_VECTOR_EXPR (clause) != NULL_TREE)
1497 pp_left_paren (pp);
1498 dump_generic_node (pp, OMP_CLAUSE_VECTOR_EXPR (clause),
1499 spc, flags, false);
1500 pp_right_paren (pp);
1502 break;
1504 case OMP_CLAUSE_NUM_GANGS:
1505 pp_string (pp, "num_gangs(");
1506 dump_generic_node (pp, OMP_CLAUSE_NUM_GANGS_EXPR (clause),
1507 spc, flags, false);
1508 pp_character (pp, ')');
1509 break;
1511 case OMP_CLAUSE_NUM_WORKERS:
1512 pp_string (pp, "num_workers(");
1513 dump_generic_node (pp, OMP_CLAUSE_NUM_WORKERS_EXPR (clause),
1514 spc, flags, false);
1515 pp_character (pp, ')');
1516 break;
1518 case OMP_CLAUSE_VECTOR_LENGTH:
1519 pp_string (pp, "vector_length(");
1520 dump_generic_node (pp, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause),
1521 spc, flags, false);
1522 pp_character (pp, ')');
1523 break;
1525 case OMP_CLAUSE_INBRANCH:
1526 pp_string (pp, "inbranch");
1527 break;
1528 case OMP_CLAUSE_NOTINBRANCH:
1529 pp_string (pp, "notinbranch");
1530 break;
1531 case OMP_CLAUSE_FOR:
1532 pp_string (pp, "for");
1533 break;
1534 case OMP_CLAUSE_PARALLEL:
1535 pp_string (pp, "parallel");
1536 break;
1537 case OMP_CLAUSE_SECTIONS:
1538 pp_string (pp, "sections");
1539 break;
1540 case OMP_CLAUSE_TASKGROUP:
1541 pp_string (pp, "taskgroup");
1542 break;
1543 case OMP_CLAUSE_NOGROUP:
1544 pp_string (pp, "nogroup");
1545 break;
1546 case OMP_CLAUSE_THREADS:
1547 pp_string (pp, "threads");
1548 break;
1549 case OMP_CLAUSE_SIMD:
1550 pp_string (pp, "simd");
1551 break;
1552 case OMP_CLAUSE_INDEPENDENT:
1553 pp_string (pp, "independent");
1554 break;
1555 case OMP_CLAUSE_TILE:
1556 pp_string (pp, "tile(");
1557 dump_generic_node (pp, OMP_CLAUSE_TILE_LIST (clause),
1558 spc, flags, false);
1559 pp_right_paren (pp);
1560 break;
1561 case OMP_CLAUSE_PARTIAL:
1562 pp_string (pp, "partial");
1563 if (OMP_CLAUSE_PARTIAL_EXPR (clause))
1565 pp_left_paren (pp);
1566 dump_generic_node (pp, OMP_CLAUSE_PARTIAL_EXPR (clause),
1567 spc, flags, false);
1568 pp_right_paren (pp);
1570 break;
1571 case OMP_CLAUSE_FULL:
1572 pp_string (pp, "full");
1573 break;
1574 case OMP_CLAUSE_SIZES:
1575 pp_string (pp, "sizes(");
1576 dump_generic_node (pp, OMP_CLAUSE_SIZES_LIST (clause),
1577 spc, flags, false);
1578 pp_right_paren (pp);
1579 break;
1580 case OMP_CLAUSE_INTEROP:
1581 pp_string (pp, "interop(");
1582 dump_generic_node (pp, OMP_CLAUSE_DECL (clause), spc, flags, false);
1583 pp_right_paren (pp);
1584 break;
1585 case OMP_CLAUSE_IF_PRESENT:
1586 pp_string (pp, "if_present");
1587 break;
1588 case OMP_CLAUSE_FINALIZE:
1589 pp_string (pp, "finalize");
1590 break;
1591 case OMP_CLAUSE_NOHOST:
1592 pp_string (pp, "nohost");
1593 break;
1594 case OMP_CLAUSE_DETACH:
1595 pp_string (pp, "detach(");
1596 dump_generic_node (pp, OMP_CLAUSE_DECL (clause), spc, flags,
1597 false);
1598 pp_right_paren (pp);
1599 break;
1600 default:
1601 gcc_unreachable ();
1606 /* Dump chain of OMP clauses.
1608 PP, SPC and FLAGS are as in dump_generic_node. */
1610 void
1611 dump_omp_clauses (pretty_printer *pp, tree clause, int spc, dump_flags_t flags,
1612 bool leading_space)
1614 while (clause)
1616 if (leading_space)
1617 pp_space (pp);
1618 dump_omp_clause (pp, clause, spc, flags);
1619 leading_space = true;
1621 clause = OMP_CLAUSE_CHAIN (clause);
1625 /* Dump an OpenMP context selector CTX to PP. */
1626 static void
1627 dump_omp_context_selector (pretty_printer *pp, tree ctx, int spc,
1628 dump_flags_t flags)
1630 for (tree set = ctx; set && set != error_mark_node; set = TREE_CHAIN (set))
1632 pp_string (pp, OMP_TSS_NAME (set));
1633 pp_string (pp, " = {");
1634 for (tree sel = OMP_TSS_TRAIT_SELECTORS (set);
1635 sel && sel != error_mark_node; sel = TREE_CHAIN (sel))
1637 if (OMP_TS_CODE (sel) == OMP_TRAIT_INVALID)
1638 pp_string (pp, "<unknown selector>");
1639 else
1640 pp_string (pp, OMP_TS_NAME (sel));
1641 tree score = OMP_TS_SCORE (sel);
1642 tree props = OMP_TS_PROPERTIES (sel);
1643 if (props)
1645 pp_string (pp, " (");
1646 if (score)
1648 pp_string (pp, "score(");
1649 dump_generic_node (pp, score, spc + 4, flags, false);
1650 pp_string (pp, "): ");
1652 for (tree prop = props; prop; prop = TREE_CHAIN (prop))
1654 if (OMP_TP_NAME (prop) == OMP_TP_NAMELIST_NODE)
1656 const char *str = omp_context_name_list_prop (prop);
1657 pp_string (pp, "\"");
1658 pretty_print_string (pp, str, strlen (str) + 1);
1659 pp_string (pp, "\"");
1661 else if (OMP_TP_NAME (prop))
1662 dump_generic_node (pp, OMP_TP_NAME (prop), spc + 4,
1663 flags, false);
1664 else if (OMP_TP_VALUE (prop))
1665 dump_generic_node (pp, OMP_TP_VALUE (prop), spc + 4,
1666 flags, false);
1667 if (TREE_CHAIN (prop))
1669 pp_comma (pp);
1670 pp_space (pp);
1673 pp_string (pp, ")");
1675 if (TREE_CHAIN (sel))
1677 pp_comma (pp);
1678 pp_space (pp);
1681 pp_string (pp, "}");
1682 if (TREE_CHAIN (set))
1684 pp_comma (pp);
1685 newline_and_indent (pp, spc);
1690 /* Wrapper for above, used for "declare variant". Compare to
1691 print_generic_expr. */
1692 void
1693 print_omp_context_selector (FILE *file, tree t, dump_flags_t flags)
1695 maybe_init_pretty_print (file);
1696 dump_omp_context_selector (tree_pp, t, 0, flags);
1697 pp_flush (tree_pp);
1700 /* Dump location LOC to PP. */
1702 void
1703 dump_location (pretty_printer *pp, location_t loc)
1705 expanded_location xloc = expand_location (loc);
1706 int discriminator = get_discriminator_from_loc (loc);
1708 pp_left_bracket (pp);
1709 if (xloc.file)
1711 pp_string (pp, xloc.file);
1712 pp_string (pp, ":");
1714 pp_decimal_int (pp, xloc.line);
1715 pp_colon (pp);
1716 pp_decimal_int (pp, xloc.column);
1717 if (discriminator)
1719 pp_string (pp, " discrim ");
1720 pp_decimal_int (pp, discriminator);
1722 pp_string (pp, "] ");
1726 /* Dump lexical block BLOCK. PP, SPC and FLAGS are as in
1727 dump_generic_node. */
1729 static void
1730 dump_block_node (pretty_printer *pp, tree block, int spc, dump_flags_t flags)
1732 tree t;
1734 pp_string (pp, "BLOCK #");
1735 pp_decimal_int (pp, BLOCK_NUMBER (block));
1736 pp_character (pp, ' ');
1738 if (flags & TDF_ADDRESS)
1740 pp_character (pp, '[');
1741 pp_scalar (pp, "%p", (void *) block);
1742 pp_string (pp, "] ");
1745 if (TREE_ASM_WRITTEN (block))
1746 pp_string (pp, "[written] ");
1748 if (flags & TDF_SLIM)
1749 return;
1751 if (BLOCK_SOURCE_LOCATION (block))
1752 dump_location (pp, BLOCK_SOURCE_LOCATION (block));
1754 newline_and_indent (pp, spc + 2);
1756 if (BLOCK_SUPERCONTEXT (block))
1758 pp_string (pp, "SUPERCONTEXT: ");
1759 dump_generic_node (pp, BLOCK_SUPERCONTEXT (block), 0,
1760 flags | TDF_SLIM, false);
1761 newline_and_indent (pp, spc + 2);
1764 if (BLOCK_SUBBLOCKS (block))
1766 pp_string (pp, "SUBBLOCKS: ");
1767 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
1769 dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1770 pp_space (pp);
1772 newline_and_indent (pp, spc + 2);
1775 if (BLOCK_CHAIN (block))
1777 pp_string (pp, "SIBLINGS: ");
1778 for (t = BLOCK_CHAIN (block); t; t = BLOCK_CHAIN (t))
1780 dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1781 pp_space (pp);
1783 newline_and_indent (pp, spc + 2);
1786 if (BLOCK_VARS (block))
1788 pp_string (pp, "VARS: ");
1789 for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
1791 dump_generic_node (pp, t, 0, flags, false);
1792 pp_space (pp);
1794 newline_and_indent (pp, spc + 2);
1797 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block)) > 0)
1799 unsigned i;
1800 vec<tree, va_gc> *nlv = BLOCK_NONLOCALIZED_VARS (block);
1802 pp_string (pp, "NONLOCALIZED_VARS: ");
1803 FOR_EACH_VEC_ELT (*nlv, i, t)
1805 dump_generic_node (pp, t, 0, flags, false);
1806 pp_space (pp);
1808 newline_and_indent (pp, spc + 2);
1811 if (BLOCK_ABSTRACT_ORIGIN (block))
1813 pp_string (pp, "ABSTRACT_ORIGIN: ");
1814 dump_generic_node (pp, BLOCK_ABSTRACT_ORIGIN (block), 0,
1815 flags | TDF_SLIM, false);
1816 newline_and_indent (pp, spc + 2);
1819 if (BLOCK_FRAGMENT_ORIGIN (block))
1821 pp_string (pp, "FRAGMENT_ORIGIN: ");
1822 dump_generic_node (pp, BLOCK_FRAGMENT_ORIGIN (block), 0,
1823 flags | TDF_SLIM, false);
1824 newline_and_indent (pp, spc + 2);
1827 if (BLOCK_FRAGMENT_CHAIN (block))
1829 pp_string (pp, "FRAGMENT_CHAIN: ");
1830 for (t = BLOCK_FRAGMENT_CHAIN (block); t; t = BLOCK_FRAGMENT_CHAIN (t))
1832 dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1833 pp_space (pp);
1835 newline_and_indent (pp, spc + 2);
1839 /* Dump #pragma omp atomic memory order clause. */
1841 void
1842 dump_omp_atomic_memory_order (pretty_printer *pp, enum omp_memory_order mo)
1844 switch (mo & OMP_MEMORY_ORDER_MASK)
1846 case OMP_MEMORY_ORDER_RELAXED:
1847 pp_string (pp, " relaxed");
1848 break;
1849 case OMP_MEMORY_ORDER_SEQ_CST:
1850 pp_string (pp, " seq_cst");
1851 break;
1852 case OMP_MEMORY_ORDER_ACQ_REL:
1853 pp_string (pp, " acq_rel");
1854 break;
1855 case OMP_MEMORY_ORDER_ACQUIRE:
1856 pp_string (pp, " acquire");
1857 break;
1858 case OMP_MEMORY_ORDER_RELEASE:
1859 pp_string (pp, " release");
1860 break;
1861 case OMP_MEMORY_ORDER_UNSPECIFIED:
1862 break;
1863 default:
1864 gcc_unreachable ();
1866 switch (mo & OMP_FAIL_MEMORY_ORDER_MASK)
1868 case OMP_FAIL_MEMORY_ORDER_RELAXED:
1869 pp_string (pp, " fail(relaxed)");
1870 break;
1871 case OMP_FAIL_MEMORY_ORDER_SEQ_CST:
1872 pp_string (pp, " fail(seq_cst)");
1873 break;
1874 case OMP_FAIL_MEMORY_ORDER_ACQUIRE:
1875 pp_string (pp, " fail(acquire)");
1876 break;
1877 case OMP_FAIL_MEMORY_ORDER_UNSPECIFIED:
1878 break;
1879 default:
1880 gcc_unreachable ();
1884 /* Helper to dump a MEM_REF node. */
1886 static void
1887 dump_mem_ref (pretty_printer *pp, tree node, int spc, dump_flags_t flags)
1889 if ((TREE_CODE (node) == MEM_REF
1890 || TREE_CODE (node) == TARGET_MEM_REF)
1891 && (flags & TDF_GIMPLE))
1893 pp_string (pp, "__MEM <");
1894 dump_generic_node (pp, TREE_TYPE (node),
1895 spc, flags | TDF_SLIM, false);
1896 if (TYPE_ALIGN (TREE_TYPE (node))
1897 != TYPE_ALIGN (TYPE_MAIN_VARIANT (TREE_TYPE (node))))
1899 pp_string (pp, ", ");
1900 pp_decimal_int (pp, TYPE_ALIGN (TREE_TYPE (node)));
1902 pp_greater (pp);
1903 pp_string (pp, " (");
1904 if (TREE_TYPE (TREE_OPERAND (node, 0))
1905 != TREE_TYPE (TREE_OPERAND (node, 1)))
1907 pp_left_paren (pp);
1908 dump_generic_node (pp, TREE_TYPE (TREE_OPERAND (node, 1)),
1909 spc, flags | TDF_SLIM, false);
1910 pp_right_paren (pp);
1912 dump_generic_node (pp, TREE_OPERAND (node, 0),
1913 spc, flags | TDF_SLIM, false);
1914 if (! integer_zerop (TREE_OPERAND (node, 1)))
1916 pp_string (pp, " + ");
1917 dump_generic_node (pp, TREE_OPERAND (node, 1),
1918 spc, flags | TDF_SLIM, false);
1920 if (TREE_CODE (node) == TARGET_MEM_REF)
1922 if (TREE_OPERAND (node, 2))
1924 /* INDEX * STEP */
1925 pp_string (pp, " + ");
1926 dump_generic_node (pp, TREE_OPERAND (node, 2),
1927 spc, flags | TDF_SLIM, false);
1928 pp_string (pp, " * ");
1929 dump_generic_node (pp, TREE_OPERAND (node, 3),
1930 spc, flags | TDF_SLIM, false);
1932 if (TREE_OPERAND (node, 4))
1934 /* INDEX2 */
1935 pp_string (pp, " + ");
1936 dump_generic_node (pp, TREE_OPERAND (node, 4),
1937 spc, flags | TDF_SLIM, false);
1940 pp_right_paren (pp);
1942 else if (TREE_CODE (node) == MEM_REF
1943 && integer_zerop (TREE_OPERAND (node, 1))
1944 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1945 infer them and MEM_ATTR caching will share MEM_REFs
1946 with differently-typed op0s. */
1947 && TREE_CODE (TREE_OPERAND (node, 0)) != INTEGER_CST
1948 /* Released SSA_NAMES have no TREE_TYPE. */
1949 && TREE_TYPE (TREE_OPERAND (node, 0)) != NULL_TREE
1950 /* Same pointer types, but ignoring POINTER_TYPE vs.
1951 REFERENCE_TYPE. */
1952 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 0)))
1953 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1))))
1954 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 0)))
1955 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 1))))
1956 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 0)))
1957 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 1))))
1958 /* Same value types ignoring qualifiers. */
1959 && (TYPE_MAIN_VARIANT (TREE_TYPE (node))
1960 == TYPE_MAIN_VARIANT
1961 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1)))))
1962 && (!(flags & TDF_ALIAS)
1963 || MR_DEPENDENCE_CLIQUE (node) == 0))
1965 if (TREE_CODE (TREE_OPERAND (node, 0)) != ADDR_EXPR)
1967 /* Enclose pointers to arrays in parentheses. */
1968 tree op0 = TREE_OPERAND (node, 0);
1969 tree op0type = TREE_TYPE (op0);
1970 if (POINTER_TYPE_P (op0type)
1971 && TREE_CODE (TREE_TYPE (op0type)) == ARRAY_TYPE)
1972 pp_left_paren (pp);
1973 pp_star (pp);
1974 dump_generic_node (pp, op0, spc, flags, false);
1975 if (POINTER_TYPE_P (op0type)
1976 && TREE_CODE (TREE_TYPE (op0type)) == ARRAY_TYPE)
1977 pp_right_paren (pp);
1979 else
1980 dump_generic_node (pp,
1981 TREE_OPERAND (TREE_OPERAND (node, 0), 0),
1982 spc, flags, false);
1984 else
1986 pp_string (pp, "MEM");
1988 tree nodetype = TREE_TYPE (node);
1989 tree op0 = TREE_OPERAND (node, 0);
1990 tree op1 = TREE_OPERAND (node, 1);
1991 tree op1type = TYPE_MAIN_VARIANT (TREE_TYPE (op1));
1993 tree op0size = TYPE_SIZE (nodetype);
1994 tree op1size = TYPE_SIZE (TREE_TYPE (op1type));
1996 if (!op0size || !op1size
1997 || !operand_equal_p (op0size, op1size, 0))
1999 pp_string (pp, " <");
2000 /* If the size of the type of the operand is not the same
2001 as the size of the MEM_REF expression include the type
2002 of the latter similar to the TDF_GIMPLE output to make
2003 it clear how many bytes of memory are being accessed. */
2004 dump_generic_node (pp, nodetype, spc, flags | TDF_SLIM, false);
2005 pp_string (pp, "> ");
2008 pp_string (pp, "[(");
2009 dump_generic_node (pp, op1type, spc, flags | TDF_SLIM, false);
2010 pp_right_paren (pp);
2011 dump_generic_node (pp, op0, spc, flags, false);
2012 if (!integer_zerop (op1))
2014 pp_string (pp, " + ");
2015 dump_generic_node (pp, op1, spc, flags, false);
2017 if (TREE_CODE (node) == TARGET_MEM_REF)
2019 tree tmp = TMR_INDEX2 (node);
2020 if (tmp)
2022 pp_string (pp, " + ");
2023 dump_generic_node (pp, tmp, spc, flags, false);
2025 tmp = TMR_INDEX (node);
2026 if (tmp)
2028 pp_string (pp, " + ");
2029 dump_generic_node (pp, tmp, spc, flags, false);
2030 tmp = TMR_STEP (node);
2031 pp_string (pp, " * ");
2032 if (tmp)
2033 dump_generic_node (pp, tmp, spc, flags, false);
2034 else
2035 pp_string (pp, "1");
2038 if ((flags & TDF_ALIAS)
2039 && MR_DEPENDENCE_CLIQUE (node) != 0)
2041 pp_string (pp, " clique ");
2042 pp_unsigned_wide_integer (pp, MR_DEPENDENCE_CLIQUE (node));
2043 pp_string (pp, " base ");
2044 pp_unsigned_wide_integer (pp, MR_DEPENDENCE_BASE (node));
2046 pp_right_bracket (pp);
2050 /* Helper function for dump_generic_node. Dump INIT or COND expression for
2051 OpenMP loop non-rectangular iterators. */
2053 void
2054 dump_omp_loop_non_rect_expr (pretty_printer *pp, tree node, int spc,
2055 dump_flags_t flags)
2057 gcc_assert (TREE_CODE (node) == TREE_VEC);
2058 dump_generic_node (pp, TREE_VEC_ELT (node, 0), spc, flags, false);
2059 pp_string (pp, " * ");
2060 if (op_prio (TREE_VEC_ELT (node, 1)) <= op_code_prio (MULT_EXPR))
2062 pp_left_paren (pp);
2063 dump_generic_node (pp, TREE_VEC_ELT (node, 1), spc, flags, false);
2064 pp_right_paren (pp);
2066 else
2067 dump_generic_node (pp, TREE_VEC_ELT (node, 1), spc, flags, false);
2068 pp_string (pp, " + ");
2069 if (op_prio (TREE_VEC_ELT (node, 1)) <= op_code_prio (PLUS_EXPR))
2071 pp_left_paren (pp);
2072 dump_generic_node (pp, TREE_VEC_ELT (node, 2), spc, flags, false);
2073 pp_right_paren (pp);
2075 else
2076 dump_generic_node (pp, TREE_VEC_ELT (node, 2), spc, flags, false);
2079 /* Dump the node NODE on the pretty_printer PP, SPC spaces of
2080 indent. FLAGS specifies details to show in the dump (see TDF_* in
2081 dumpfile.h). If IS_STMT is true, the object printed is considered
2082 to be a statement and it is terminated by ';' if appropriate. */
2085 dump_generic_node (pretty_printer *pp, tree node, int spc, dump_flags_t flags,
2086 bool is_stmt)
2088 tree type;
2089 tree op0, op1;
2090 const char *str;
2091 bool is_expr;
2092 enum tree_code code;
2094 if (node == NULL_TREE)
2095 return spc;
2097 is_expr = EXPR_P (node);
2099 if (is_stmt && (flags & TDF_STMTADDR))
2101 pp_string (pp, "<&");
2102 pp_scalar (pp, "%p", (void *)node);
2103 pp_string (pp, "> ");
2106 if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
2107 dump_location (pp, EXPR_LOCATION (node));
2109 code = TREE_CODE (node);
2110 switch (code)
2112 case ERROR_MARK:
2113 pp_string (pp, "<<< error >>>");
2114 break;
2116 case IDENTIFIER_NODE:
2117 pp_tree_identifier (pp, node);
2118 break;
2120 case TREE_LIST:
2121 while (node && node != error_mark_node)
2123 if (TREE_PURPOSE (node))
2125 dump_generic_node (pp, TREE_PURPOSE (node), spc, flags, false);
2126 pp_space (pp);
2128 dump_generic_node (pp, TREE_VALUE (node), spc, flags, false);
2129 node = TREE_CHAIN (node);
2130 if (node && TREE_CODE (node) == TREE_LIST)
2132 pp_comma (pp);
2133 pp_space (pp);
2136 break;
2138 case TREE_BINFO:
2139 dump_generic_node (pp, BINFO_TYPE (node), spc, flags, false);
2140 break;
2142 case TREE_VEC:
2144 size_t i;
2145 pp_left_brace (pp);
2146 if (TREE_VEC_LENGTH (node) > 0)
2148 size_t len = TREE_VEC_LENGTH (node);
2149 for (i = 0; i < len - 1; i++)
2151 dump_generic_node (pp, TREE_VEC_ELT (node, i), spc, flags,
2152 false);
2153 pp_comma (pp);
2154 pp_space (pp);
2156 dump_generic_node (pp, TREE_VEC_ELT (node, len - 1), spc,
2157 flags, false);
2159 pp_right_brace (pp);
2161 break;
2163 case VOID_TYPE:
2164 case INTEGER_TYPE:
2165 case REAL_TYPE:
2166 case FIXED_POINT_TYPE:
2167 case COMPLEX_TYPE:
2168 case VECTOR_TYPE:
2169 case ENUMERAL_TYPE:
2170 case BOOLEAN_TYPE:
2171 case BITINT_TYPE:
2172 case OPAQUE_TYPE:
2174 unsigned int quals = TYPE_QUALS (node);
2175 enum tree_code_class tclass;
2177 if (quals & TYPE_QUAL_ATOMIC)
2178 pp_string (pp, "atomic ");
2179 if (quals & TYPE_QUAL_CONST)
2180 pp_string (pp, "const ");
2181 if (quals & TYPE_QUAL_VOLATILE)
2182 pp_string (pp, "volatile ");
2183 if (quals & TYPE_QUAL_RESTRICT)
2184 pp_string (pp, "restrict ");
2186 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
2188 pp_string (pp, "<address-space-");
2189 pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
2190 pp_string (pp, "> ");
2193 tclass = TREE_CODE_CLASS (TREE_CODE (node));
2195 if (tclass == tcc_declaration)
2197 if (DECL_NAME (node))
2198 dump_decl_name (pp, node, flags);
2199 else
2200 pp_string (pp, "<unnamed type decl>");
2202 else if (tclass == tcc_type)
2204 if ((flags & TDF_GIMPLE) && node == sizetype)
2205 pp_string (pp, "__SIZETYPE__");
2206 else if (TYPE_NAME (node))
2208 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
2209 pp_tree_identifier (pp, TYPE_NAME (node));
2210 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
2211 && DECL_NAME (TYPE_NAME (node)))
2212 dump_decl_name (pp, TYPE_NAME (node), flags);
2213 else
2214 pp_string (pp, "<unnamed type>");
2216 else if (TREE_CODE (node) == VECTOR_TYPE)
2218 if (flags & TDF_GIMPLE)
2220 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2221 pp_string (pp, " [[gnu::vector_size(");
2222 pp_wide_integer
2223 (pp, tree_to_poly_uint64 (TYPE_SIZE_UNIT (node)));
2224 pp_string (pp, ")]]");
2226 else
2228 pp_string (pp, "vector");
2229 pp_left_paren (pp);
2230 pp_wide_integer (pp, TYPE_VECTOR_SUBPARTS (node));
2231 pp_string (pp, ") ");
2232 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2235 else if (TREE_CODE (node) == INTEGER_TYPE)
2237 if (TYPE_PRECISION (node) == CHAR_TYPE_SIZE)
2238 pp_string (pp, (TYPE_UNSIGNED (node)
2239 ? "unsigned char"
2240 : "signed char"));
2241 else if (TYPE_PRECISION (node) == SHORT_TYPE_SIZE)
2242 pp_string (pp, (TYPE_UNSIGNED (node)
2243 ? "unsigned short"
2244 : "signed short"));
2245 else if (TYPE_PRECISION (node) == INT_TYPE_SIZE)
2246 pp_string (pp, (TYPE_UNSIGNED (node)
2247 ? "unsigned int"
2248 : "signed int"));
2249 else if (TYPE_PRECISION (node) == LONG_TYPE_SIZE)
2250 pp_string (pp, (TYPE_UNSIGNED (node)
2251 ? "unsigned long"
2252 : "signed long"));
2253 else if (TYPE_PRECISION (node) == LONG_LONG_TYPE_SIZE)
2254 pp_string (pp, (TYPE_UNSIGNED (node)
2255 ? "unsigned long long"
2256 : "signed long long"));
2257 else if (TYPE_PRECISION (node) >= CHAR_TYPE_SIZE
2258 && pow2p_hwi (TYPE_PRECISION (node)))
2260 pp_string (pp, (TYPE_UNSIGNED (node) ? "uint" : "int"));
2261 pp_decimal_int (pp, TYPE_PRECISION (node));
2262 pp_string (pp, "_t");
2264 else
2266 pp_string (pp, (TYPE_UNSIGNED (node)
2267 ? "<unnamed-unsigned:"
2268 : "<unnamed-signed:"));
2269 pp_decimal_int (pp, TYPE_PRECISION (node));
2270 pp_greater (pp);
2273 else if (TREE_CODE (node) == COMPLEX_TYPE)
2275 pp_string (pp, "__complex__ ");
2276 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2278 else if (TREE_CODE (node) == REAL_TYPE)
2280 pp_string (pp, "<float:");
2281 pp_decimal_int (pp, TYPE_PRECISION (node));
2282 pp_greater (pp);
2284 else if (TREE_CODE (node) == FIXED_POINT_TYPE)
2286 pp_string (pp, "<fixed-point-");
2287 pp_string (pp, TYPE_SATURATING (node) ? "sat:" : "nonsat:");
2288 pp_decimal_int (pp, TYPE_PRECISION (node));
2289 pp_greater (pp);
2291 else if (TREE_CODE (node) == BOOLEAN_TYPE)
2293 pp_string (pp, (TYPE_UNSIGNED (node)
2294 ? "<unsigned-boolean:"
2295 : "<signed-boolean:"));
2296 pp_decimal_int (pp, TYPE_PRECISION (node));
2297 pp_greater (pp);
2299 else if (TREE_CODE (node) == BITINT_TYPE)
2301 if (TYPE_UNSIGNED (node))
2302 pp_string (pp, "unsigned ");
2303 pp_string (pp, "_BitInt(");
2304 pp_decimal_int (pp, TYPE_PRECISION (node));
2305 pp_right_paren (pp);
2307 else if (TREE_CODE (node) == VOID_TYPE)
2308 pp_string (pp, "void");
2309 else
2310 pp_string (pp, "<unnamed type>");
2312 break;
2315 case POINTER_TYPE:
2316 case REFERENCE_TYPE:
2317 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
2319 if (TREE_TYPE (node) == NULL)
2321 pp_string (pp, str);
2322 pp_string (pp, "<null type>");
2324 else if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
2326 tree fnode = TREE_TYPE (node);
2328 dump_generic_node (pp, TREE_TYPE (fnode), spc, flags, false);
2329 pp_space (pp);
2330 pp_left_paren (pp);
2331 pp_string (pp, str);
2332 if (TYPE_IDENTIFIER (node))
2333 dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
2334 else if (flags & TDF_NOUID)
2335 pp_string (pp, "<Txxxx>");
2336 else
2338 pp_string (pp, "<T");
2339 pp_scalar (pp, "%x", TYPE_UID (node));
2340 pp_character (pp, '>');
2343 pp_right_paren (pp);
2344 dump_function_declaration (pp, fnode, spc, flags);
2346 else
2348 unsigned int quals = TYPE_QUALS (node);
2350 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2351 pp_space (pp);
2352 pp_string (pp, str);
2354 if (quals & TYPE_QUAL_CONST)
2355 pp_string (pp, " const");
2356 if (quals & TYPE_QUAL_VOLATILE)
2357 pp_string (pp, " volatile");
2358 if (quals & TYPE_QUAL_RESTRICT)
2359 pp_string (pp, " restrict");
2361 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
2363 pp_string (pp, " <address-space-");
2364 pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
2365 pp_greater (pp);
2368 if (TYPE_REF_CAN_ALIAS_ALL (node))
2369 pp_string (pp, " {ref-all}");
2371 break;
2373 case OFFSET_TYPE:
2374 NIY;
2375 break;
2377 case MEM_REF:
2378 case TARGET_MEM_REF:
2379 dump_mem_ref (pp, node, spc, flags);
2380 break;
2382 case ARRAY_TYPE:
2384 unsigned int quals = TYPE_QUALS (node);
2385 tree tmp;
2387 if (quals & TYPE_QUAL_ATOMIC)
2388 pp_string (pp, "atomic ");
2389 if (quals & TYPE_QUAL_CONST)
2390 pp_string (pp, "const ");
2391 if (quals & TYPE_QUAL_VOLATILE)
2392 pp_string (pp, "volatile ");
2394 /* Print the innermost component type. */
2395 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
2396 tmp = TREE_TYPE (tmp))
2399 /* Avoid to print recursively the array. */
2400 /* FIXME : Not implemented correctly, see print_struct_decl. */
2401 if (TREE_CODE (tmp) != POINTER_TYPE || TREE_TYPE (tmp) != node)
2402 dump_generic_node (pp, tmp, spc, flags, false);
2404 /* Print the dimensions. */
2405 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
2406 dump_array_domain (pp, TYPE_DOMAIN (tmp), spc, flags);
2407 break;
2410 case RECORD_TYPE:
2411 case UNION_TYPE:
2412 case QUAL_UNION_TYPE:
2414 unsigned int quals = TYPE_QUALS (node);
2416 if (quals & TYPE_QUAL_ATOMIC)
2417 pp_string (pp, "atomic ");
2418 if (quals & TYPE_QUAL_CONST)
2419 pp_string (pp, "const ");
2420 if (quals & TYPE_QUAL_VOLATILE)
2421 pp_string (pp, "volatile ");
2423 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
2425 pp_string (pp, "<address-space-");
2426 pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
2427 pp_string (pp, "> ");
2430 /* Print the name of the structure. */
2431 if (TREE_CODE (node) == RECORD_TYPE)
2432 pp_string (pp, "struct ");
2433 else if (TREE_CODE (node) == UNION_TYPE)
2434 pp_string (pp, "union ");
2436 if (TYPE_NAME (node))
2437 dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
2438 else if (!(flags & TDF_SLIM))
2439 /* FIXME: If we eliminate the 'else' above and attempt
2440 to show the fields for named types, we may get stuck
2441 following a cycle of pointers to structs. The alleged
2442 self-reference check in print_struct_decl will not detect
2443 cycles involving more than one pointer or struct type. */
2444 print_struct_decl (pp, node, spc, flags);
2445 break;
2448 case LANG_TYPE:
2449 NIY;
2450 break;
2452 case INTEGER_CST:
2453 if (flags & TDF_GIMPLE
2454 && (POINTER_TYPE_P (TREE_TYPE (node))
2455 || (TYPE_PRECISION (TREE_TYPE (node))
2456 < TYPE_PRECISION (integer_type_node))
2457 || exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1
2458 || tree_int_cst_sgn (node) < 0))
2460 pp_string (pp, "_Literal (");
2461 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2462 pp_string (pp, ") ");
2464 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE
2465 && ! (flags & TDF_GIMPLE))
2467 /* In the case of a pointer, one may want to divide by the
2468 size of the pointed-to type. Unfortunately, this not
2469 straightforward. The C front-end maps expressions
2471 (int *) 5
2472 int *p; (p + 5)
2474 in such a way that the two INTEGER_CST nodes for "5" have
2475 different values but identical types. In the latter
2476 case, the 5 is multiplied by sizeof (int) in c-common.cc
2477 (pointer_int_sum) to convert it to a byte address, and
2478 yet the type of the node is left unchanged. Argh. What
2479 is consistent though is that the number value corresponds
2480 to bytes (UNITS) offset.
2482 NB: Neither of the following divisors can be trivially
2483 used to recover the original literal:
2485 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
2486 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
2487 pp_wide_integer (pp, TREE_INT_CST_LOW (node));
2488 pp_string (pp, "B"); /* pseudo-unit */
2490 else if (tree_fits_shwi_p (node))
2491 pp_wide_integer (pp, tree_to_shwi (node));
2492 else if (tree_fits_uhwi_p (node))
2493 pp_unsigned_wide_integer (pp, tree_to_uhwi (node));
2494 else
2496 wide_int val = wi::to_wide (node);
2498 if (wi::neg_p (val, TYPE_SIGN (TREE_TYPE (node))))
2500 pp_minus (pp);
2501 val = -val;
2503 unsigned int len;
2504 print_hex_buf_size (val, &len);
2505 if (UNLIKELY (len > sizeof (pp_buffer (pp)->m_digit_buffer)))
2507 char *buf = XALLOCAVEC (char, len);
2508 print_hex (val, buf);
2509 pp_string (pp, buf);
2511 else
2513 print_hex (val, pp_buffer (pp)->m_digit_buffer);
2514 pp_string (pp, pp_buffer (pp)->m_digit_buffer);
2517 if ((flags & TDF_GIMPLE)
2518 && ! (POINTER_TYPE_P (TREE_TYPE (node))
2519 || (TYPE_PRECISION (TREE_TYPE (node))
2520 < TYPE_PRECISION (integer_type_node))
2521 || exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1))
2523 if (TYPE_UNSIGNED (TREE_TYPE (node)))
2524 pp_character (pp, 'u');
2525 if (TYPE_PRECISION (TREE_TYPE (node))
2526 == TYPE_PRECISION (unsigned_type_node))
2528 else if (TYPE_PRECISION (TREE_TYPE (node))
2529 == TYPE_PRECISION (long_unsigned_type_node))
2530 pp_character (pp, 'l');
2531 else if (TYPE_PRECISION (TREE_TYPE (node))
2532 == TYPE_PRECISION (long_long_unsigned_type_node))
2533 pp_string (pp, "ll");
2535 if (TREE_OVERFLOW (node))
2536 pp_string (pp, "(OVF)");
2537 break;
2539 case POLY_INT_CST:
2540 pp_string (pp, "POLY_INT_CST [");
2541 dump_generic_node (pp, POLY_INT_CST_COEFF (node, 0), spc, flags, false);
2542 for (unsigned int i = 1; i < NUM_POLY_INT_COEFFS; ++i)
2544 pp_string (pp, ", ");
2545 dump_generic_node (pp, POLY_INT_CST_COEFF (node, i),
2546 spc, flags, false);
2548 pp_string (pp, "]");
2549 break;
2551 case REAL_CST:
2552 /* Code copied from print_node. */
2554 REAL_VALUE_TYPE d;
2555 if (TREE_OVERFLOW (node))
2556 pp_string (pp, " overflow");
2558 d = TREE_REAL_CST (node);
2559 if (REAL_VALUE_ISINF (d))
2560 pp_string (pp, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
2561 else if (REAL_VALUE_ISNAN (d))
2562 pp_string (pp, " Nan");
2563 else
2565 char string[100];
2566 real_to_decimal (string, &d, sizeof (string), 0, 1);
2567 pp_string (pp, string);
2569 break;
2572 case FIXED_CST:
2574 char string[100];
2575 fixed_to_decimal (string, TREE_FIXED_CST_PTR (node), sizeof (string));
2576 pp_string (pp, string);
2577 break;
2580 case COMPLEX_CST:
2581 pp_string (pp, "__complex__ (");
2582 dump_generic_node (pp, TREE_REALPART (node), spc, flags, false);
2583 pp_string (pp, ", ");
2584 dump_generic_node (pp, TREE_IMAGPART (node), spc, flags, false);
2585 pp_right_paren (pp);
2586 break;
2588 case STRING_CST:
2590 pp_string (pp, "\"");
2591 if (unsigned nbytes = TREE_STRING_LENGTH (node))
2592 pretty_print_string (pp, TREE_STRING_POINTER (node), nbytes);
2593 pp_string (pp, "\"");
2594 break;
2597 case VECTOR_CST:
2599 unsigned i;
2600 if (flags & TDF_GIMPLE)
2602 pp_string (pp, "_Literal (");
2603 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2604 pp_string (pp, ") ");
2606 pp_string (pp, "{ ");
2607 unsigned HOST_WIDE_INT nunits;
2608 if (!VECTOR_CST_NELTS (node).is_constant (&nunits))
2609 nunits = vector_cst_encoded_nelts (node);
2610 for (i = 0; i < nunits; ++i)
2612 if (i != 0)
2613 pp_string (pp, ", ");
2614 dump_generic_node (pp, VECTOR_CST_ELT (node, i),
2615 spc, flags, false);
2617 if (!VECTOR_CST_NELTS (node).is_constant ())
2618 pp_string (pp, ", ...");
2619 pp_string (pp, " }");
2621 break;
2623 case RAW_DATA_CST:
2624 for (unsigned i = 0; i < (unsigned) RAW_DATA_LENGTH (node); ++i)
2626 if (TYPE_UNSIGNED (TREE_TYPE (node))
2627 || TYPE_PRECISION (TREE_TYPE (node)) > CHAR_BIT)
2628 pp_decimal_int (pp, RAW_DATA_UCHAR_ELT (node, i));
2629 else
2630 pp_decimal_int (pp, RAW_DATA_SCHAR_ELT (node, i));
2631 if (i == RAW_DATA_LENGTH (node) - 1U)
2632 break;
2633 else if (i == 9 && RAW_DATA_LENGTH (node) > 20)
2635 pp_string (pp, ", ..., ");
2636 i = RAW_DATA_LENGTH (node) - 11;
2638 else
2639 pp_string (pp, ", ");
2641 break;
2643 case FUNCTION_TYPE:
2644 case METHOD_TYPE:
2645 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2646 pp_space (pp);
2647 if (TREE_CODE (node) == METHOD_TYPE)
2649 if (TYPE_METHOD_BASETYPE (node))
2650 dump_generic_node (pp, TYPE_NAME (TYPE_METHOD_BASETYPE (node)),
2651 spc, flags, false);
2652 else
2653 pp_string (pp, "<null method basetype>");
2654 pp_colon_colon (pp);
2656 if (TYPE_IDENTIFIER (node))
2657 dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
2658 else if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
2659 dump_decl_name (pp, TYPE_NAME (node), flags);
2660 else if (flags & TDF_NOUID)
2661 pp_string (pp, "<Txxxx>");
2662 else
2664 pp_string (pp, "<T");
2665 pp_scalar (pp, "%x", TYPE_UID (node));
2666 pp_character (pp, '>');
2668 dump_function_declaration (pp, node, spc, flags);
2669 break;
2671 case FUNCTION_DECL:
2672 case CONST_DECL:
2673 dump_decl_name (pp, node, flags);
2674 break;
2676 case LABEL_DECL:
2677 if (DECL_NAME (node))
2678 dump_decl_name (pp, node, flags);
2679 else if (LABEL_DECL_UID (node) != -1)
2681 if (flags & TDF_GIMPLE)
2683 pp_character (pp, 'L');
2684 pp_decimal_int (pp, (int) LABEL_DECL_UID (node));
2686 else
2688 pp_string (pp, "<L");
2689 pp_decimal_int (pp, (int) LABEL_DECL_UID (node));
2690 pp_character (pp, '>');
2693 else
2695 if (flags & TDF_NOUID)
2696 pp_string (pp, "<D.xxxx>");
2697 else
2699 if (flags & TDF_GIMPLE)
2701 pp_character (pp, 'D');
2702 pp_scalar (pp, "%u", DECL_UID (node));
2704 else
2706 pp_string (pp, "<D.");
2707 pp_scalar (pp, "%u", DECL_UID (node));
2708 pp_character (pp, '>');
2712 break;
2714 case TYPE_DECL:
2715 if (DECL_IS_UNDECLARED_BUILTIN (node))
2717 /* Don't print the declaration of built-in types. */
2718 break;
2720 if (DECL_NAME (node))
2721 dump_decl_name (pp, node, flags);
2722 else if (TYPE_NAME (TREE_TYPE (node)) != node)
2724 pp_string (pp, (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
2725 ? "union" : "struct "));
2726 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2728 else
2729 pp_string (pp, "<anon>");
2730 break;
2732 case VAR_DECL:
2733 case PARM_DECL:
2734 case FIELD_DECL:
2735 case DEBUG_EXPR_DECL:
2736 case NAMESPACE_DECL:
2737 case NAMELIST_DECL:
2738 dump_decl_name (pp, node, flags);
2739 break;
2741 case RESULT_DECL:
2742 pp_string (pp, "<retval>");
2743 break;
2745 case COMPONENT_REF:
2746 op0 = TREE_OPERAND (node, 0);
2747 str = ".";
2748 if (op0
2749 && (TREE_CODE (op0) == INDIRECT_REF
2750 || (TREE_CODE (op0) == MEM_REF
2751 && TREE_CODE (TREE_OPERAND (op0, 0)) != ADDR_EXPR
2752 && integer_zerop (TREE_OPERAND (op0, 1))
2753 /* Dump the types of INTEGER_CSTs explicitly, for we
2754 can't infer them and MEM_ATTR caching will share
2755 MEM_REFs with differently-typed op0s. */
2756 && TREE_CODE (TREE_OPERAND (op0, 0)) != INTEGER_CST
2757 /* Released SSA_NAMES have no TREE_TYPE. */
2758 && TREE_TYPE (TREE_OPERAND (op0, 0)) != NULL_TREE
2759 /* Same pointer types, but ignoring POINTER_TYPE vs.
2760 REFERENCE_TYPE. */
2761 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 0)))
2762 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1))))
2763 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 0)))
2764 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 1))))
2765 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 0)))
2766 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 1))))
2767 /* Same value types ignoring qualifiers. */
2768 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0))
2769 == TYPE_MAIN_VARIANT
2770 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1)))))
2771 && MR_DEPENDENCE_CLIQUE (op0) == 0)))
2773 op0 = TREE_OPERAND (op0, 0);
2774 str = "->";
2776 if (op_prio (op0) < op_prio (node))
2777 pp_left_paren (pp);
2778 dump_generic_node (pp, op0, spc, flags, false);
2779 if (op_prio (op0) < op_prio (node))
2780 pp_right_paren (pp);
2781 pp_string (pp, str);
2782 op1 = TREE_OPERAND (node, 1);
2783 dump_generic_node (pp, op1, spc, flags, false);
2784 if (DECL_P (op1)) /* Not always a decl in the C++ FE. */
2785 if (tree off = component_ref_field_offset (node))
2786 if (TREE_CODE (off) != INTEGER_CST)
2788 pp_string (pp, "{off: ");
2789 dump_generic_node (pp, off, spc, flags, false);
2790 pp_right_brace (pp);
2792 break;
2794 case BIT_FIELD_REF:
2795 if (flags & TDF_GIMPLE)
2797 pp_string (pp, "__BIT_FIELD_REF <");
2798 dump_generic_node (pp, TREE_TYPE (node),
2799 spc, flags | TDF_SLIM, false);
2800 if (TYPE_ALIGN (TREE_TYPE (node))
2801 != TYPE_ALIGN (TYPE_MAIN_VARIANT (TREE_TYPE (node))))
2803 pp_string (pp, ", ");
2804 pp_decimal_int (pp, TYPE_ALIGN (TREE_TYPE (node)));
2806 pp_greater (pp);
2807 pp_string (pp, " (");
2808 dump_generic_node (pp, TREE_OPERAND (node, 0), spc,
2809 flags | TDF_SLIM, false);
2810 pp_string (pp, ", ");
2811 dump_generic_node (pp, TREE_OPERAND (node, 1), spc,
2812 flags | TDF_SLIM, false);
2813 pp_string (pp, ", ");
2814 dump_generic_node (pp, TREE_OPERAND (node, 2), spc,
2815 flags | TDF_SLIM, false);
2816 pp_right_paren (pp);
2818 else
2820 pp_string (pp, "BIT_FIELD_REF <");
2821 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2822 pp_string (pp, ", ");
2823 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2824 pp_string (pp, ", ");
2825 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2826 pp_greater (pp);
2828 break;
2830 case BIT_INSERT_EXPR:
2831 pp_string (pp, "BIT_INSERT_EXPR <");
2832 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2833 pp_string (pp, ", ");
2834 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2835 pp_string (pp, ", ");
2836 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2837 pp_string (pp, " (");
2838 if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (node, 1))))
2839 pp_decimal_int (pp,
2840 TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (node, 1))));
2841 else
2842 dump_generic_node (pp, TYPE_SIZE (TREE_TYPE (TREE_OPERAND (node, 1))),
2843 spc, flags, false);
2844 pp_string (pp, " bits)>");
2845 break;
2847 case ARRAY_REF:
2848 case ARRAY_RANGE_REF:
2849 op0 = TREE_OPERAND (node, 0);
2850 if (op_prio (op0) < op_prio (node))
2851 pp_left_paren (pp);
2852 dump_generic_node (pp, op0, spc, flags, false);
2853 if (op_prio (op0) < op_prio (node))
2854 pp_right_paren (pp);
2855 pp_left_bracket (pp);
2856 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2857 if (TREE_CODE (node) == ARRAY_RANGE_REF)
2858 pp_string (pp, " ...");
2859 pp_right_bracket (pp);
2861 op0 = array_ref_low_bound (node);
2862 op1 = array_ref_element_size (node);
2864 if (!integer_zerop (op0)
2865 || TREE_OPERAND (node, 2)
2866 || TREE_OPERAND (node, 3))
2868 pp_string (pp, "{lb: ");
2869 dump_generic_node (pp, op0, spc, flags, false);
2870 pp_string (pp, " sz: ");
2871 dump_generic_node (pp, op1, spc, flags, false);
2872 pp_right_brace (pp);
2874 break;
2876 case OMP_ARRAY_SECTION:
2877 op0 = TREE_OPERAND (node, 0);
2878 if (op_prio (op0) < op_prio (node))
2879 pp_left_paren (pp);
2880 dump_generic_node (pp, op0, spc, flags, false);
2881 if (op_prio (op0) < op_prio (node))
2882 pp_right_paren (pp);
2883 pp_left_bracket (pp);
2884 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2885 pp_colon (pp);
2886 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2887 pp_right_bracket (pp);
2888 break;
2890 case CONSTRUCTOR:
2892 unsigned HOST_WIDE_INT ix;
2893 tree field, val;
2894 bool is_struct_init = false;
2895 bool is_array_init = false;
2896 widest_int curidx;
2897 if (flags & TDF_GIMPLE)
2899 pp_string (pp, "_Literal (");
2900 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2901 pp_string (pp, ") ");
2903 pp_left_brace (pp);
2904 if (TREE_CLOBBER_P (node))
2906 pp_string (pp, "CLOBBER");
2907 switch (CLOBBER_KIND (node))
2909 case CLOBBER_STORAGE_BEGIN:
2910 pp_string (pp, "(bos)");
2911 break;
2912 case CLOBBER_STORAGE_END:
2913 pp_string (pp, "(eos)");
2914 break;
2915 case CLOBBER_OBJECT_BEGIN:
2916 pp_string (pp, "(bob)");
2917 break;
2918 case CLOBBER_OBJECT_END:
2919 pp_string (pp, "(eob)");
2920 break;
2921 default:
2922 break;
2925 else if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
2926 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
2927 is_struct_init = true;
2928 else if (TREE_CODE (TREE_TYPE (node)) == ARRAY_TYPE
2929 && TYPE_DOMAIN (TREE_TYPE (node))
2930 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)))
2931 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node))))
2932 == INTEGER_CST)
2934 tree minv = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)));
2935 is_array_init = true;
2936 curidx = wi::to_widest (minv);
2938 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
2940 if (field)
2942 if (is_struct_init)
2944 pp_dot (pp);
2945 dump_generic_node (pp, field, spc, flags, false);
2946 pp_equal (pp);
2948 else if (is_array_init
2949 && (TREE_CODE (field) != INTEGER_CST
2950 || curidx != wi::to_widest (field)))
2952 pp_left_bracket (pp);
2953 if (TREE_CODE (field) == RANGE_EXPR)
2955 dump_generic_node (pp, TREE_OPERAND (field, 0), spc,
2956 flags, false);
2957 pp_string (pp, " ... ");
2958 dump_generic_node (pp, TREE_OPERAND (field, 1), spc,
2959 flags, false);
2960 if (TREE_CODE (TREE_OPERAND (field, 1)) == INTEGER_CST)
2961 curidx = wi::to_widest (TREE_OPERAND (field, 1));
2963 else
2964 dump_generic_node (pp, field, spc, flags, false);
2965 if (TREE_CODE (field) == INTEGER_CST)
2966 curidx = wi::to_widest (field);
2967 pp_string (pp, "]=");
2970 if (is_array_init)
2971 curidx += 1;
2972 if (val && TREE_CODE (val) == ADDR_EXPR)
2973 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
2974 val = TREE_OPERAND (val, 0);
2975 if (val && TREE_CODE (val) == FUNCTION_DECL)
2976 dump_decl_name (pp, val, flags);
2977 else
2978 dump_generic_node (pp, val, spc, flags, false);
2979 if (ix != CONSTRUCTOR_NELTS (node) - 1)
2981 pp_comma (pp);
2982 pp_space (pp);
2985 pp_right_brace (pp);
2987 break;
2989 case COMPOUND_EXPR:
2991 tree *tp;
2992 if (flags & TDF_SLIM)
2994 pp_string (pp, "<COMPOUND_EXPR>");
2995 break;
2998 dump_generic_node (pp, TREE_OPERAND (node, 0),
2999 spc, flags, false);
3000 pp_comma (pp);
3001 pp_space (pp);
3003 for (tp = &TREE_OPERAND (node, 1);
3004 TREE_CODE (*tp) == COMPOUND_EXPR;
3005 tp = &TREE_OPERAND (*tp, 1))
3007 dump_generic_node (pp, TREE_OPERAND (*tp, 0),
3008 spc, flags, false);
3009 pp_comma (pp);
3010 pp_space (pp);
3013 dump_generic_node (pp, *tp, spc, flags, false);
3015 break;
3017 case STATEMENT_LIST:
3019 tree_stmt_iterator si;
3020 bool first = true;
3022 if (flags & TDF_SLIM)
3024 pp_string (pp, "<STATEMENT_LIST>");
3025 break;
3028 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
3030 if (!first)
3031 newline_and_indent (pp, spc);
3032 else
3033 first = false;
3034 dump_generic_node (pp, tsi_stmt (si), spc, flags, true);
3037 break;
3039 case MODIFY_EXPR:
3040 case INIT_EXPR:
3041 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags,
3042 false);
3043 pp_space (pp);
3044 pp_equal (pp);
3045 pp_space (pp);
3046 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags,
3047 false);
3048 break;
3050 case TARGET_EXPR:
3051 pp_string (pp, "TARGET_EXPR <");
3052 dump_generic_node (pp, TARGET_EXPR_SLOT (node), spc, flags, false);
3053 pp_comma (pp);
3054 pp_space (pp);
3055 dump_generic_node (pp, TARGET_EXPR_INITIAL (node), spc, flags, false);
3056 pp_greater (pp);
3057 break;
3059 case DECL_EXPR:
3060 print_declaration (pp, DECL_EXPR_DECL (node), spc, flags);
3061 is_stmt = false;
3062 break;
3064 case COND_EXPR:
3065 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
3067 pp_string (pp, "if (");
3068 dump_generic_node (pp, COND_EXPR_COND (node), spc, flags, false);
3069 pp_right_paren (pp);
3070 /* The lowered cond_exprs should always be printed in full. */
3071 if (COND_EXPR_THEN (node)
3072 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
3073 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
3074 && COND_EXPR_ELSE (node)
3075 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
3076 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
3078 pp_space (pp);
3079 dump_generic_node (pp, COND_EXPR_THEN (node),
3080 0, flags, true);
3081 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
3083 pp_string (pp, " else ");
3084 dump_generic_node (pp, COND_EXPR_ELSE (node),
3085 0, flags, true);
3088 else if (!(flags & TDF_SLIM))
3090 /* Output COND_EXPR_THEN. */
3091 if (COND_EXPR_THEN (node))
3093 newline_and_indent (pp, spc+2);
3094 pp_left_brace (pp);
3095 newline_and_indent (pp, spc+4);
3096 dump_generic_node (pp, COND_EXPR_THEN (node), spc+4,
3097 flags, true);
3098 newline_and_indent (pp, spc+2);
3099 pp_right_brace (pp);
3102 /* Output COND_EXPR_ELSE. */
3103 if (COND_EXPR_ELSE (node)
3104 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
3106 newline_and_indent (pp, spc);
3107 pp_string (pp, "else");
3108 newline_and_indent (pp, spc+2);
3109 pp_left_brace (pp);
3110 newline_and_indent (pp, spc+4);
3111 dump_generic_node (pp, COND_EXPR_ELSE (node), spc+4,
3112 flags, true);
3113 newline_and_indent (pp, spc+2);
3114 pp_right_brace (pp);
3117 is_expr = false;
3119 else
3121 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3122 pp_space (pp);
3123 pp_question (pp);
3124 pp_space (pp);
3125 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3126 pp_space (pp);
3127 pp_colon (pp);
3128 pp_space (pp);
3129 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3131 break;
3133 case BIND_EXPR:
3134 pp_left_brace (pp);
3135 if (!(flags & TDF_SLIM))
3137 if (BIND_EXPR_VARS (node))
3139 pp_newline (pp);
3141 for (op0 = BIND_EXPR_VARS (node); op0; op0 = DECL_CHAIN (op0))
3143 print_declaration (pp, op0, spc+2, flags);
3144 pp_newline (pp);
3148 newline_and_indent (pp, spc+2);
3149 dump_generic_node (pp, BIND_EXPR_BODY (node), spc+2, flags, true);
3150 newline_and_indent (pp, spc);
3151 pp_right_brace (pp);
3153 is_expr = false;
3154 break;
3156 case CALL_EXPR:
3157 if (CALL_EXPR_FN (node) != NULL_TREE)
3158 print_call_name (pp, CALL_EXPR_FN (node), flags);
3159 else
3161 pp_dot (pp);
3162 pp_string (pp, internal_fn_name (CALL_EXPR_IFN (node)));
3165 /* Print parameters. */
3166 pp_space (pp);
3167 pp_left_paren (pp);
3169 tree arg;
3170 call_expr_arg_iterator iter;
3171 FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
3173 dump_generic_node (pp, arg, spc, flags, false);
3174 if (more_call_expr_args_p (&iter))
3176 pp_comma (pp);
3177 pp_space (pp);
3181 if (CALL_EXPR_VA_ARG_PACK (node))
3183 if (call_expr_nargs (node) > 0)
3185 pp_comma (pp);
3186 pp_space (pp);
3188 pp_string (pp, "__builtin_va_arg_pack ()");
3190 pp_right_paren (pp);
3192 op1 = CALL_EXPR_STATIC_CHAIN (node);
3193 if (op1)
3195 pp_string (pp, " [static-chain: ");
3196 dump_generic_node (pp, op1, spc, flags, false);
3197 pp_right_bracket (pp);
3200 if (CALL_EXPR_RETURN_SLOT_OPT (node))
3201 pp_string (pp, " [return slot optimization]");
3202 if (CALL_EXPR_TAILCALL (node))
3203 pp_string (pp, " [tail call]");
3204 break;
3206 case WITH_CLEANUP_EXPR:
3207 NIY;
3208 break;
3210 case CLEANUP_POINT_EXPR:
3211 pp_string (pp, "<<cleanup_point ");
3212 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3213 pp_string (pp, ">>");
3214 break;
3216 case PLACEHOLDER_EXPR:
3217 pp_string (pp, "<PLACEHOLDER_EXPR ");
3218 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
3219 pp_greater (pp);
3220 break;
3222 /* Binary arithmetic and logic expressions. */
3223 case WIDEN_SUM_EXPR:
3224 case WIDEN_MULT_EXPR:
3225 case MULT_EXPR:
3226 case MULT_HIGHPART_EXPR:
3227 case PLUS_EXPR:
3228 case POINTER_PLUS_EXPR:
3229 case POINTER_DIFF_EXPR:
3230 case MINUS_EXPR:
3231 case TRUNC_DIV_EXPR:
3232 case CEIL_DIV_EXPR:
3233 case FLOOR_DIV_EXPR:
3234 case ROUND_DIV_EXPR:
3235 case TRUNC_MOD_EXPR:
3236 case CEIL_MOD_EXPR:
3237 case FLOOR_MOD_EXPR:
3238 case ROUND_MOD_EXPR:
3239 case RDIV_EXPR:
3240 case EXACT_DIV_EXPR:
3241 case LSHIFT_EXPR:
3242 case RSHIFT_EXPR:
3243 case LROTATE_EXPR:
3244 case RROTATE_EXPR:
3245 case WIDEN_LSHIFT_EXPR:
3246 case BIT_IOR_EXPR:
3247 case BIT_XOR_EXPR:
3248 case BIT_AND_EXPR:
3249 case TRUTH_ANDIF_EXPR:
3250 case TRUTH_ORIF_EXPR:
3251 case TRUTH_AND_EXPR:
3252 case TRUTH_OR_EXPR:
3253 case TRUTH_XOR_EXPR:
3254 case LT_EXPR:
3255 case LE_EXPR:
3256 case GT_EXPR:
3257 case GE_EXPR:
3258 case EQ_EXPR:
3259 case NE_EXPR:
3260 case UNLT_EXPR:
3261 case UNLE_EXPR:
3262 case UNGT_EXPR:
3263 case UNGE_EXPR:
3264 case UNEQ_EXPR:
3265 case LTGT_EXPR:
3266 case ORDERED_EXPR:
3267 case UNORDERED_EXPR:
3269 const char *op = op_symbol (node);
3270 op0 = TREE_OPERAND (node, 0);
3271 op1 = TREE_OPERAND (node, 1);
3273 /* When the operands are expressions with less priority,
3274 keep semantics of the tree representation. */
3275 if (op_prio (op0) <= op_prio (node))
3277 pp_left_paren (pp);
3278 dump_generic_node (pp, op0, spc, flags, false);
3279 pp_right_paren (pp);
3281 else
3282 dump_generic_node (pp, op0, spc, flags, false);
3284 pp_space (pp);
3285 pp_string (pp, op);
3286 pp_space (pp);
3288 /* When the operands are expressions with less priority,
3289 keep semantics of the tree representation. */
3290 if (op_prio (op1) <= op_prio (node))
3292 pp_left_paren (pp);
3293 dump_generic_node (pp, op1, spc, flags, false);
3294 pp_right_paren (pp);
3296 else
3297 dump_generic_node (pp, op1, spc, flags, false);
3299 break;
3301 /* Unary arithmetic and logic expressions. */
3302 case ADDR_EXPR:
3303 if (flags & TDF_GIMPLE_VAL)
3305 pp_string (pp, "_Literal (");
3306 dump_generic_node (pp, TREE_TYPE (node), spc,
3307 flags & ~TDF_GIMPLE_VAL, false);
3308 pp_character (pp, ')');
3310 /* Fallthru. */
3311 case NEGATE_EXPR:
3312 case BIT_NOT_EXPR:
3313 case TRUTH_NOT_EXPR:
3314 case PREDECREMENT_EXPR:
3315 case PREINCREMENT_EXPR:
3316 case INDIRECT_REF:
3317 if (!(flags & TDF_GIMPLE)
3318 && TREE_CODE (node) == ADDR_EXPR
3319 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
3320 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
3321 /* Do not output '&' for strings and function pointers when not
3322 dumping GIMPLE FE syntax. */
3324 else
3325 pp_string (pp, op_symbol (node));
3327 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
3329 pp_left_paren (pp);
3330 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3331 pp_right_paren (pp);
3333 else
3334 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3335 break;
3337 case POSTDECREMENT_EXPR:
3338 case POSTINCREMENT_EXPR:
3339 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
3341 pp_left_paren (pp);
3342 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3343 pp_right_paren (pp);
3345 else
3346 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3347 pp_string (pp, op_symbol (node));
3348 break;
3350 case MIN_EXPR:
3351 pp_string (pp, "MIN_EXPR <");
3352 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3353 pp_string (pp, ", ");
3354 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3355 pp_greater (pp);
3356 break;
3358 case MAX_EXPR:
3359 pp_string (pp, "MAX_EXPR <");
3360 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3361 pp_string (pp, ", ");
3362 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3363 pp_greater (pp);
3364 break;
3366 case ABS_EXPR:
3367 pp_string (pp, "ABS_EXPR <");
3368 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3369 pp_greater (pp);
3370 break;
3372 case ABSU_EXPR:
3373 pp_string (pp, "ABSU_EXPR <");
3374 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3375 pp_greater (pp);
3376 break;
3378 case RANGE_EXPR:
3379 NIY;
3380 break;
3382 case ADDR_SPACE_CONVERT_EXPR:
3383 case FIXED_CONVERT_EXPR:
3384 case FIX_TRUNC_EXPR:
3385 case FLOAT_EXPR:
3386 CASE_CONVERT:
3387 type = TREE_TYPE (node);
3388 op0 = TREE_OPERAND (node, 0);
3389 if (type != TREE_TYPE (op0))
3391 pp_left_paren (pp);
3392 dump_generic_node (pp, type, spc, flags, false);
3393 pp_string (pp, ") ");
3395 if (op_prio (op0) < op_prio (node))
3396 pp_left_paren (pp);
3397 dump_generic_node (pp, op0, spc, flags, false);
3398 if (op_prio (op0) < op_prio (node))
3399 pp_right_paren (pp);
3400 break;
3402 case VIEW_CONVERT_EXPR:
3403 if (flags & TDF_GIMPLE)
3404 pp_string (pp, "__VIEW_CONVERT <");
3405 else
3406 pp_string (pp, "VIEW_CONVERT_EXPR<");
3407 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
3408 pp_string (pp, ">(");
3409 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3410 pp_right_paren (pp);
3411 break;
3413 case PAREN_EXPR:
3414 pp_string (pp, "((");
3415 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3416 pp_string (pp, "))");
3417 break;
3419 case NON_LVALUE_EXPR:
3420 pp_string (pp, "NON_LVALUE_EXPR <");
3421 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3422 pp_greater (pp);
3423 break;
3425 case SAVE_EXPR:
3426 pp_string (pp, "SAVE_EXPR <");
3427 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3428 pp_greater (pp);
3429 break;
3431 case COMPLEX_EXPR:
3432 pp_string (pp, "COMPLEX_EXPR <");
3433 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3434 pp_string (pp, ", ");
3435 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3436 pp_greater (pp);
3437 break;
3439 case CONJ_EXPR:
3440 pp_string (pp, "CONJ_EXPR <");
3441 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3442 pp_greater (pp);
3443 break;
3445 case REALPART_EXPR:
3446 if (flags & TDF_GIMPLE)
3448 pp_string (pp, "__real ");
3449 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3451 else
3453 pp_string (pp, "REALPART_EXPR <");
3454 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3455 pp_greater (pp);
3457 break;
3459 case IMAGPART_EXPR:
3460 if (flags & TDF_GIMPLE)
3462 pp_string (pp, "__imag ");
3463 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3465 else
3467 pp_string (pp, "IMAGPART_EXPR <");
3468 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3469 pp_greater (pp);
3471 break;
3473 case VA_ARG_EXPR:
3474 pp_string (pp, "VA_ARG_EXPR <");
3475 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3476 pp_greater (pp);
3477 break;
3479 case TRY_FINALLY_EXPR:
3480 case TRY_CATCH_EXPR:
3481 pp_string (pp, "try");
3482 newline_and_indent (pp, spc+2);
3483 pp_left_brace (pp);
3484 newline_and_indent (pp, spc+4);
3485 dump_generic_node (pp, TREE_OPERAND (node, 0), spc+4, flags, true);
3486 newline_and_indent (pp, spc+2);
3487 pp_right_brace (pp);
3488 newline_and_indent (pp, spc);
3489 if (TREE_CODE (node) == TRY_CATCH_EXPR)
3491 node = TREE_OPERAND (node, 1);
3492 pp_string (pp, "catch");
3494 else
3496 gcc_assert (TREE_CODE (node) == TRY_FINALLY_EXPR);
3497 node = TREE_OPERAND (node, 1);
3498 pp_string (pp, "finally");
3499 if (TREE_CODE (node) == EH_ELSE_EXPR)
3501 newline_and_indent (pp, spc+2);
3502 pp_left_brace (pp);
3503 newline_and_indent (pp, spc+4);
3504 dump_generic_node (pp, TREE_OPERAND (node, 0), spc+4,
3505 flags, true);
3506 newline_and_indent (pp, spc+2);
3507 pp_right_brace (pp);
3508 newline_and_indent (pp, spc);
3509 node = TREE_OPERAND (node, 1);
3510 pp_string (pp, "else");
3513 newline_and_indent (pp, spc+2);
3514 pp_left_brace (pp);
3515 newline_and_indent (pp, spc+4);
3516 dump_generic_node (pp, node, spc+4, flags, true);
3517 newline_and_indent (pp, spc+2);
3518 pp_right_brace (pp);
3519 is_expr = false;
3520 break;
3522 case CATCH_EXPR:
3523 pp_string (pp, "catch (");
3524 dump_generic_node (pp, CATCH_TYPES (node), spc+2, flags, false);
3525 pp_right_paren (pp);
3526 newline_and_indent (pp, spc+2);
3527 pp_left_brace (pp);
3528 newline_and_indent (pp, spc+4);
3529 dump_generic_node (pp, CATCH_BODY (node), spc+4, flags, true);
3530 newline_and_indent (pp, spc+2);
3531 pp_right_brace (pp);
3532 is_expr = false;
3533 break;
3535 case EH_FILTER_EXPR:
3536 pp_string (pp, "<<<eh_filter (");
3537 dump_generic_node (pp, EH_FILTER_TYPES (node), spc+2, flags, false);
3538 pp_string (pp, ")>>>");
3539 newline_and_indent (pp, spc+2);
3540 pp_left_brace (pp);
3541 newline_and_indent (pp, spc+4);
3542 dump_generic_node (pp, EH_FILTER_FAILURE (node), spc+4, flags, true);
3543 newline_and_indent (pp, spc+2);
3544 pp_right_brace (pp);
3545 is_expr = false;
3546 break;
3548 case LABEL_EXPR:
3549 op0 = TREE_OPERAND (node, 0);
3550 /* If this is for break or continue, don't bother printing it. */
3551 if (DECL_NAME (op0))
3553 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
3554 if (strcmp (name, "break") == 0
3555 || strcmp (name, "continue") == 0)
3556 break;
3558 dump_generic_node (pp, op0, spc, flags, false);
3559 pp_colon (pp);
3560 if (DECL_NONLOCAL (op0))
3561 pp_string (pp, " [non-local]");
3562 break;
3564 case LOOP_EXPR:
3565 pp_string (pp, "while (1)");
3566 if (!(flags & TDF_SLIM))
3568 newline_and_indent (pp, spc+2);
3569 pp_left_brace (pp);
3570 newline_and_indent (pp, spc+4);
3571 dump_generic_node (pp, LOOP_EXPR_BODY (node), spc+4, flags, true);
3572 newline_and_indent (pp, spc+2);
3573 pp_right_brace (pp);
3575 is_expr = false;
3576 break;
3578 case PREDICT_EXPR:
3579 pp_string (pp, "// predicted ");
3580 if (PREDICT_EXPR_OUTCOME (node))
3581 pp_string (pp, "likely by ");
3582 else
3583 pp_string (pp, "unlikely by ");
3584 pp_string (pp, predictor_name (PREDICT_EXPR_PREDICTOR (node)));
3585 pp_string (pp, " predictor.");
3586 break;
3588 case ANNOTATE_EXPR:
3589 pp_string (pp, "ANNOTATE_EXPR <");
3590 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3591 switch ((enum annot_expr_kind) TREE_INT_CST_LOW (TREE_OPERAND (node, 1)))
3593 case annot_expr_ivdep_kind:
3594 pp_string (pp, ", ivdep");
3595 break;
3596 case annot_expr_unroll_kind:
3598 pp_string (pp, ", unroll ");
3599 pp_decimal_int (pp,
3600 (int) TREE_INT_CST_LOW (TREE_OPERAND (node, 2)));
3601 break;
3603 case annot_expr_no_vector_kind:
3604 pp_string (pp, ", no-vector");
3605 break;
3606 case annot_expr_vector_kind:
3607 pp_string (pp, ", vector");
3608 break;
3609 case annot_expr_parallel_kind:
3610 pp_string (pp, ", parallel");
3611 break;
3612 case annot_expr_maybe_infinite_kind:
3613 pp_string (pp, ", maybe-infinite");
3614 break;
3615 default:
3616 gcc_unreachable ();
3618 pp_greater (pp);
3619 break;
3621 case RETURN_EXPR:
3622 pp_string (pp, "return");
3623 op0 = TREE_OPERAND (node, 0);
3624 if (op0)
3626 pp_space (pp);
3627 if (TREE_CODE (op0) == MODIFY_EXPR)
3628 dump_generic_node (pp, TREE_OPERAND (op0, 1),
3629 spc, flags, false);
3630 else
3631 dump_generic_node (pp, op0, spc, flags, false);
3633 break;
3635 case EXIT_EXPR:
3636 pp_string (pp, "if (");
3637 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3638 pp_string (pp, ") break");
3639 break;
3641 case SWITCH_EXPR:
3642 pp_string (pp, "switch (");
3643 dump_generic_node (pp, SWITCH_COND (node), spc, flags, false);
3644 pp_right_paren (pp);
3645 if (!(flags & TDF_SLIM))
3647 newline_and_indent (pp, spc+2);
3648 pp_left_brace (pp);
3649 if (SWITCH_BODY (node))
3651 newline_and_indent (pp, spc+4);
3652 dump_generic_node (pp, SWITCH_BODY (node), spc+4, flags,
3653 true);
3655 newline_and_indent (pp, spc+2);
3656 pp_right_brace (pp);
3658 is_expr = false;
3659 break;
3661 case GOTO_EXPR:
3662 op0 = GOTO_DESTINATION (node);
3663 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
3665 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
3666 if (strcmp (name, "break") == 0
3667 || strcmp (name, "continue") == 0)
3669 pp_string (pp, name);
3670 break;
3673 pp_string (pp, "goto ");
3674 dump_generic_node (pp, op0, spc, flags, false);
3675 break;
3677 case ASM_EXPR:
3678 pp_string (pp, "__asm__");
3679 if (ASM_VOLATILE_P (node))
3680 pp_string (pp, " __volatile__");
3681 pp_left_paren (pp);
3682 dump_generic_node (pp, ASM_STRING (node), spc, flags, false);
3683 pp_colon (pp);
3684 dump_generic_node (pp, ASM_OUTPUTS (node), spc, flags, false);
3685 pp_colon (pp);
3686 dump_generic_node (pp, ASM_INPUTS (node), spc, flags, false);
3687 if (ASM_CLOBBERS (node))
3689 pp_colon (pp);
3690 dump_generic_node (pp, ASM_CLOBBERS (node), spc, flags, false);
3692 pp_right_paren (pp);
3693 break;
3695 case CASE_LABEL_EXPR:
3696 if (CASE_LOW (node) && CASE_HIGH (node))
3698 pp_string (pp, "case ");
3699 dump_generic_node (pp, CASE_LOW (node), spc, flags, false);
3700 pp_string (pp, " ... ");
3701 dump_generic_node (pp, CASE_HIGH (node), spc, flags, false);
3703 else if (CASE_LOW (node))
3705 pp_string (pp, "case ");
3706 dump_generic_node (pp, CASE_LOW (node), spc, flags, false);
3708 else
3709 pp_string (pp, "default");
3710 pp_colon (pp);
3711 break;
3713 case OBJ_TYPE_REF:
3714 pp_string (pp, "OBJ_TYPE_REF(");
3715 dump_generic_node (pp, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
3716 pp_semicolon (pp);
3717 /* We omit the class type for -fcompare-debug because we may
3718 drop TYPE_BINFO early depending on debug info, and then
3719 virtual_method_call_p would return false, whereas when
3720 TYPE_BINFO is preserved it may still return true and then
3721 we'd print the class type. Compare tree and rtl dumps for
3722 libstdc++-prettyprinters/shared_ptr.cc with and without -g,
3723 for example, at occurrences of OBJ_TYPE_REF. */
3724 if (!(flags & (TDF_SLIM | TDF_COMPARE_DEBUG))
3725 && virtual_method_call_p (node, true))
3727 pp_string (pp, "(");
3728 dump_generic_node (pp, obj_type_ref_class (node, true),
3729 spc, flags, false);
3730 pp_string (pp, ")");
3732 dump_generic_node (pp, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
3733 pp_arrow (pp);
3734 dump_generic_node (pp, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
3735 pp_right_paren (pp);
3736 break;
3738 case SSA_NAME:
3739 if (SSA_NAME_IDENTIFIER (node))
3741 if ((flags & TDF_NOUID)
3742 && SSA_NAME_VAR (node)
3743 && DECL_NAMELESS (SSA_NAME_VAR (node)))
3744 dump_fancy_name (pp, SSA_NAME_IDENTIFIER (node));
3745 else if (! (flags & TDF_GIMPLE)
3746 || SSA_NAME_VAR (node))
3747 dump_generic_node (pp, SSA_NAME_IDENTIFIER (node),
3748 spc, flags, false);
3750 pp_underscore (pp);
3751 pp_decimal_int (pp, SSA_NAME_VERSION (node));
3752 if (SSA_NAME_IS_DEFAULT_DEF (node))
3753 pp_string (pp, "(D)");
3754 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
3755 pp_string (pp, "(ab)");
3756 break;
3758 case WITH_SIZE_EXPR:
3759 pp_string (pp, "WITH_SIZE_EXPR <");
3760 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3761 pp_string (pp, ", ");
3762 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3763 pp_greater (pp);
3764 break;
3766 case SCEV_KNOWN:
3767 pp_string (pp, "scev_known");
3768 break;
3770 case SCEV_NOT_KNOWN:
3771 pp_string (pp, "scev_not_known");
3772 break;
3774 case POLYNOMIAL_CHREC:
3775 pp_left_brace (pp);
3776 dump_generic_node (pp, CHREC_LEFT (node), spc, flags, false);
3777 pp_string (pp, ", +, ");
3778 dump_generic_node (pp, CHREC_RIGHT (node), spc, flags, false);
3779 pp_string (pp, !CHREC_NOWRAP (node) ? "}_" : "}<nw>_");
3780 pp_scalar (pp, "%u", CHREC_VARIABLE (node));
3781 is_stmt = false;
3782 break;
3784 case REALIGN_LOAD_EXPR:
3785 pp_string (pp, "REALIGN_LOAD <");
3786 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3787 pp_string (pp, ", ");
3788 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3789 pp_string (pp, ", ");
3790 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3791 pp_greater (pp);
3792 break;
3794 case VEC_COND_EXPR:
3795 pp_string (pp, " VEC_COND_EXPR < ");
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 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3801 pp_string (pp, " > ");
3802 break;
3804 case VEC_PERM_EXPR:
3805 pp_string (pp, " VEC_PERM_EXPR < ");
3806 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3807 pp_string (pp, " , ");
3808 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3809 pp_string (pp, " , ");
3810 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3811 pp_string (pp, " > ");
3812 break;
3814 case DOT_PROD_EXPR:
3815 pp_string (pp, " DOT_PROD_EXPR < ");
3816 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3817 pp_string (pp, ", ");
3818 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3819 pp_string (pp, ", ");
3820 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3821 pp_string (pp, " > ");
3822 break;
3824 case WIDEN_MULT_PLUS_EXPR:
3825 pp_string (pp, " WIDEN_MULT_PLUS_EXPR < ");
3826 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3827 pp_string (pp, ", ");
3828 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3829 pp_string (pp, ", ");
3830 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3831 pp_string (pp, " > ");
3832 break;
3834 case WIDEN_MULT_MINUS_EXPR:
3835 pp_string (pp, " WIDEN_MULT_MINUS_EXPR < ");
3836 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3837 pp_string (pp, ", ");
3838 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3839 pp_string (pp, ", ");
3840 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3841 pp_string (pp, " > ");
3842 break;
3844 case OACC_PARALLEL:
3845 pp_string (pp, "#pragma acc parallel");
3846 goto dump_omp_clauses_body;
3848 case OACC_KERNELS:
3849 pp_string (pp, "#pragma acc kernels");
3850 goto dump_omp_clauses_body;
3852 case OACC_SERIAL:
3853 pp_string (pp, "#pragma acc serial");
3854 goto dump_omp_clauses_body;
3856 case OACC_DATA:
3857 pp_string (pp, "#pragma acc data");
3858 dump_omp_clauses (pp, OACC_DATA_CLAUSES (node), spc, flags);
3859 goto dump_omp_body;
3861 case OACC_HOST_DATA:
3862 pp_string (pp, "#pragma acc host_data");
3863 dump_omp_clauses (pp, OACC_HOST_DATA_CLAUSES (node), spc, flags);
3864 goto dump_omp_body;
3866 case OACC_DECLARE:
3867 pp_string (pp, "#pragma acc declare");
3868 dump_omp_clauses (pp, OACC_DECLARE_CLAUSES (node), spc, flags);
3869 break;
3871 case OACC_UPDATE:
3872 pp_string (pp, "#pragma acc update");
3873 dump_omp_clauses (pp, OACC_UPDATE_CLAUSES (node), spc, flags);
3874 break;
3876 case OACC_ENTER_DATA:
3877 pp_string (pp, "#pragma acc enter data");
3878 dump_omp_clauses (pp, OACC_ENTER_DATA_CLAUSES (node), spc, flags);
3879 break;
3881 case OACC_EXIT_DATA:
3882 pp_string (pp, "#pragma acc exit data");
3883 dump_omp_clauses (pp, OACC_EXIT_DATA_CLAUSES (node), spc, flags);
3884 break;
3886 case OACC_CACHE:
3887 pp_string (pp, "#pragma acc cache");
3888 dump_omp_clauses (pp, OACC_CACHE_CLAUSES (node), spc, flags);
3889 break;
3891 case OMP_PARALLEL:
3892 pp_string (pp, "#pragma omp parallel");
3893 dump_omp_clauses (pp, OMP_PARALLEL_CLAUSES (node), spc, flags);
3894 goto dump_omp_body;
3896 dump_omp_clauses_body:
3897 dump_omp_clauses (pp, OMP_CLAUSES (node), spc, flags);
3898 goto dump_omp_body;
3900 dump_omp_body:
3901 if (!(flags & TDF_SLIM) && OMP_BODY (node))
3903 newline_and_indent (pp, spc + 2);
3904 pp_left_brace (pp);
3905 newline_and_indent (pp, spc + 4);
3906 dump_generic_node (pp, OMP_BODY (node), spc + 4, flags, false);
3907 newline_and_indent (pp, spc + 2);
3908 pp_right_brace (pp);
3910 is_expr = false;
3911 break;
3913 case OMP_TASK:
3914 pp_string (pp, OMP_TASK_BODY (node) ? "#pragma omp task"
3915 : "#pragma omp taskwait");
3916 dump_omp_clauses (pp, OMP_TASK_CLAUSES (node), spc, flags);
3917 goto dump_omp_body;
3919 case OMP_FOR:
3920 pp_string (pp, "#pragma omp for");
3921 goto dump_omp_loop;
3923 case OMP_SIMD:
3924 pp_string (pp, "#pragma omp simd");
3925 goto dump_omp_loop;
3927 case OMP_DISTRIBUTE:
3928 pp_string (pp, "#pragma omp distribute");
3929 goto dump_omp_loop;
3931 case OMP_TASKLOOP:
3932 pp_string (pp, "#pragma omp taskloop");
3933 goto dump_omp_loop;
3935 case OMP_LOOP:
3936 pp_string (pp, "#pragma omp loop");
3937 goto dump_omp_loop;
3939 case OMP_TILE:
3940 pp_string (pp, "#pragma omp tile");
3941 goto dump_omp_loop;
3943 case OMP_UNROLL:
3944 pp_string (pp, "#pragma omp unroll");
3945 goto dump_omp_loop;
3947 case OACC_LOOP:
3948 pp_string (pp, "#pragma acc loop");
3949 goto dump_omp_loop;
3951 case OMP_TEAMS:
3952 pp_string (pp, "#pragma omp teams");
3953 dump_omp_clauses (pp, OMP_TEAMS_CLAUSES (node), spc, flags);
3954 goto dump_omp_body;
3956 case OMP_TARGET_DATA:
3957 pp_string (pp, "#pragma omp target data");
3958 dump_omp_clauses (pp, OMP_TARGET_DATA_CLAUSES (node), spc, flags);
3959 goto dump_omp_body;
3961 case OMP_TARGET_ENTER_DATA:
3962 pp_string (pp, "#pragma omp target enter data");
3963 dump_omp_clauses (pp, OMP_TARGET_ENTER_DATA_CLAUSES (node), spc, flags);
3964 is_expr = false;
3965 break;
3967 case OMP_TARGET_EXIT_DATA:
3968 pp_string (pp, "#pragma omp target exit data");
3969 dump_omp_clauses (pp, OMP_TARGET_EXIT_DATA_CLAUSES (node), spc, flags);
3970 is_expr = false;
3971 break;
3973 case OMP_TARGET:
3974 pp_string (pp, "#pragma omp target");
3975 dump_omp_clauses (pp, OMP_TARGET_CLAUSES (node), spc, flags);
3976 goto dump_omp_body;
3978 case OMP_TARGET_UPDATE:
3979 pp_string (pp, "#pragma omp target update");
3980 dump_omp_clauses (pp, OMP_TARGET_UPDATE_CLAUSES (node), spc, flags);
3981 is_expr = false;
3982 break;
3984 dump_omp_loop:
3985 dump_omp_clauses (pp, OMP_FOR_CLAUSES (node), spc, flags);
3986 if (!(flags & TDF_SLIM))
3988 int i;
3990 if (OMP_FOR_PRE_BODY (node))
3992 newline_and_indent (pp, spc + 2);
3993 pp_left_brace (pp);
3994 spc += 4;
3995 newline_and_indent (pp, spc);
3996 dump_generic_node (pp, OMP_FOR_PRE_BODY (node),
3997 spc, flags, false);
3999 if (OMP_FOR_INIT (node))
4001 spc -= 2;
4002 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (node)); i++)
4004 if (TREE_VEC_ELT (OMP_FOR_INIT (node), i) == NULL_TREE)
4005 continue;
4006 spc += 2;
4007 newline_and_indent (pp, spc);
4008 pp_string (pp, "for (");
4009 tree init = TREE_VEC_ELT (OMP_FOR_INIT (node), i);
4010 if (TREE_CODE (init) != MODIFY_EXPR
4011 || TREE_CODE (TREE_OPERAND (init, 1)) != TREE_VEC)
4012 dump_generic_node (pp, init, spc, flags, false);
4013 else
4015 dump_generic_node (pp, TREE_OPERAND (init, 0),
4016 spc, flags, false);
4017 pp_string (pp, " = ");
4018 dump_omp_loop_non_rect_expr (pp, TREE_OPERAND (init, 1),
4019 spc, flags);
4021 pp_string (pp, "; ");
4022 tree cond = TREE_VEC_ELT (OMP_FOR_COND (node), i);
4023 if (!COMPARISON_CLASS_P (cond)
4024 || TREE_CODE (TREE_OPERAND (cond, 1)) != TREE_VEC)
4025 dump_generic_node (pp, cond, spc, flags, false);
4026 else
4028 dump_generic_node (pp, TREE_OPERAND (cond, 0),
4029 spc, flags, false);
4030 const char *op = op_symbol (cond);
4031 pp_space (pp);
4032 pp_string (pp, op);
4033 pp_space (pp);
4034 dump_omp_loop_non_rect_expr (pp, TREE_OPERAND (cond, 1),
4035 spc, flags);
4037 pp_string (pp, "; ");
4038 dump_generic_node (pp,
4039 TREE_VEC_ELT (OMP_FOR_INCR (node), i),
4040 spc, flags, false);
4041 pp_right_paren (pp);
4044 if (OMP_FOR_BODY (node))
4046 newline_and_indent (pp, spc + 2);
4047 pp_left_brace (pp);
4048 newline_and_indent (pp, spc + 4);
4049 dump_generic_node (pp, OMP_FOR_BODY (node), spc + 4, flags,
4050 false);
4051 newline_and_indent (pp, spc + 2);
4052 pp_right_brace (pp);
4054 if (OMP_FOR_INIT (node))
4055 spc -= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node)) - 2;
4056 if (OMP_FOR_PRE_BODY (node))
4058 spc -= 4;
4059 newline_and_indent (pp, spc + 2);
4060 pp_right_brace (pp);
4063 is_expr = false;
4064 break;
4066 case OMP_SECTIONS:
4067 pp_string (pp, "#pragma omp sections");
4068 dump_omp_clauses (pp, OMP_SECTIONS_CLAUSES (node), spc, flags);
4069 goto dump_omp_body;
4071 case OMP_DISPATCH:
4072 pp_string (pp, "#pragma omp dispatch");
4073 dump_omp_clauses (pp, OMP_DISPATCH_CLAUSES (node), spc, flags);
4074 goto dump_omp_body;
4076 case OMP_INTEROP:
4077 pp_string (pp, "#pragma omp interop");
4078 dump_omp_clauses (pp, OMP_INTEROP_CLAUSES (node), spc, flags);
4079 is_expr = false;
4080 break;
4082 case OMP_SECTION:
4083 pp_string (pp, "#pragma omp section");
4084 goto dump_omp_body;
4086 case OMP_STRUCTURED_BLOCK:
4087 pp_string (pp, "#pragma omp __structured_block");
4088 goto dump_omp_body;
4090 case OMP_SCAN:
4091 if (OMP_SCAN_CLAUSES (node))
4093 pp_string (pp, "#pragma omp scan");
4094 dump_omp_clauses (pp, OMP_SCAN_CLAUSES (node), spc, flags);
4096 goto dump_omp_body;
4098 case OMP_MASTER:
4099 pp_string (pp, "#pragma omp master");
4100 goto dump_omp_body;
4102 case OMP_MASKED:
4103 pp_string (pp, "#pragma omp masked");
4104 dump_omp_clauses (pp, OMP_MASKED_CLAUSES (node), spc, flags);
4105 goto dump_omp_body;
4107 case OMP_TASKGROUP:
4108 pp_string (pp, "#pragma omp taskgroup");
4109 dump_omp_clauses (pp, OMP_TASKGROUP_CLAUSES (node), spc, flags);
4110 goto dump_omp_body;
4112 case OMP_ORDERED:
4113 pp_string (pp, "#pragma omp ordered");
4114 dump_omp_clauses (pp, OMP_ORDERED_CLAUSES (node), spc, flags);
4115 goto dump_omp_body;
4117 case OMP_CRITICAL:
4118 pp_string (pp, "#pragma omp critical");
4119 if (OMP_CRITICAL_NAME (node))
4121 pp_space (pp);
4122 pp_left_paren (pp);
4123 dump_generic_node (pp, OMP_CRITICAL_NAME (node), spc,
4124 flags, false);
4125 pp_right_paren (pp);
4127 dump_omp_clauses (pp, OMP_CRITICAL_CLAUSES (node), spc, flags);
4128 goto dump_omp_body;
4130 case OMP_ATOMIC:
4131 pp_string (pp, "#pragma omp atomic");
4132 if (OMP_ATOMIC_WEAK (node))
4133 pp_string (pp, " weak");
4134 dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
4135 newline_and_indent (pp, spc + 2);
4136 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4137 pp_space (pp);
4138 pp_equal (pp);
4139 pp_space (pp);
4140 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
4141 break;
4143 case OMP_ATOMIC_READ:
4144 pp_string (pp, "#pragma omp atomic read");
4145 dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
4146 newline_and_indent (pp, spc + 2);
4147 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4148 pp_space (pp);
4149 break;
4151 case OMP_ATOMIC_CAPTURE_OLD:
4152 case OMP_ATOMIC_CAPTURE_NEW:
4153 pp_string (pp, "#pragma omp atomic capture");
4154 if (OMP_ATOMIC_WEAK (node))
4155 pp_string (pp, " weak");
4156 dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
4157 newline_and_indent (pp, spc + 2);
4158 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4159 pp_space (pp);
4160 pp_equal (pp);
4161 pp_space (pp);
4162 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
4163 break;
4165 case OMP_SINGLE:
4166 pp_string (pp, "#pragma omp single");
4167 dump_omp_clauses (pp, OMP_SINGLE_CLAUSES (node), spc, flags);
4168 goto dump_omp_body;
4170 case OMP_SCOPE:
4171 pp_string (pp, "#pragma omp scope");
4172 dump_omp_clauses (pp, OMP_SCOPE_CLAUSES (node), spc, flags);
4173 goto dump_omp_body;
4175 case OMP_CLAUSE:
4176 /* If we come here, we're dumping something that's not an OMP construct,
4177 for example, OMP clauses attached to a function's '__attribute__'.
4178 Dump the whole OMP clause chain. */
4179 dump_omp_clauses (pp, node, spc, flags, false);
4180 is_expr = false;
4181 break;
4183 case OMP_METADIRECTIVE:
4185 pp_string (pp, "#pragma omp metadirective");
4186 newline_and_indent (pp, spc + 2);
4187 pp_left_brace (pp);
4189 tree variant = OMP_METADIRECTIVE_VARIANTS (node);
4190 while (variant != NULL_TREE)
4192 tree selector = OMP_METADIRECTIVE_VARIANT_SELECTOR (variant);
4193 tree directive = OMP_METADIRECTIVE_VARIANT_DIRECTIVE (variant);
4194 tree body = OMP_METADIRECTIVE_VARIANT_BODY (variant);
4196 newline_and_indent (pp, spc + 4);
4197 if (selector == NULL_TREE)
4198 pp_string (pp, "otherwise:");
4199 else
4201 pp_string (pp, "when (");
4202 dump_omp_context_selector (pp, selector, spc + 4, flags);
4203 pp_string (pp, "):");
4205 newline_and_indent (pp, spc + 6);
4207 dump_generic_node (pp, directive, spc + 6, flags, false);
4208 newline_and_indent (pp, spc + 6);
4209 dump_generic_node (pp, body, spc + 6, flags, false);
4210 variant = TREE_CHAIN (variant);
4212 newline_and_indent (pp, spc + 2);
4213 pp_right_brace (pp);
4215 break;
4217 case OMP_NEXT_VARIANT:
4219 pp_string (pp, "OMP_NEXT_VARIANT <");
4220 dump_generic_node (pp, OMP_NEXT_VARIANT_INDEX (node), spc,
4221 flags, false);
4222 pp_string (pp, ", ");
4223 tree state = OMP_NEXT_VARIANT_STATE (node);
4224 gcc_assert (state && TREE_CODE (state) == TREE_LIST);
4225 if (TREE_PURPOSE (state))
4227 newline_and_indent (pp, spc + 2);
4228 pp_string (pp, "resolution map = ");
4229 dump_generic_node (pp, TREE_PURPOSE (state), spc, flags, false);
4231 newline_and_indent (pp, spc + 2);
4232 pp_string (pp, "construct context = ");
4233 if (TREE_VALUE (state))
4234 dump_generic_node (pp, TREE_VALUE (state), spc, flags, false);
4235 else
4236 pp_string (pp, "NULL");
4238 tree selectors = TREE_CHAIN (state);
4239 for (int i = 0; i < TREE_VEC_LENGTH (selectors); i++)
4241 newline_and_indent (pp, spc + 2);
4242 pp_decimal_int (pp, i + 1);
4243 pp_string (pp, ": ");
4244 dump_omp_context_selector (pp, TREE_VEC_ELT (selectors, i),
4245 spc + 4, flags);
4247 pp_string (pp, ">");
4249 break;
4251 case OMP_TARGET_DEVICE_MATCHES:
4252 pp_string (pp, "OMP_TARGET_DEVICE_MATCHES <");
4253 dump_generic_node (pp, OMP_TARGET_DEVICE_MATCHES_SELECTOR (node), spc,
4254 flags, false);
4255 for (tree p = OMP_TARGET_DEVICE_MATCHES_PROPERTIES (node);
4256 p; p = TREE_CHAIN (p))
4258 pp_string (pp, ", ");
4259 dump_generic_node (pp, OMP_TP_VALUE (p), spc, flags, false);
4261 pp_string (pp, ")>");
4262 break;
4264 case TRANSACTION_EXPR:
4265 if (TRANSACTION_EXPR_OUTER (node))
4266 pp_string (pp, "__transaction_atomic [[outer]]");
4267 else if (TRANSACTION_EXPR_RELAXED (node))
4268 pp_string (pp, "__transaction_relaxed");
4269 else
4270 pp_string (pp, "__transaction_atomic");
4271 if (!(flags & TDF_SLIM) && TRANSACTION_EXPR_BODY (node))
4273 newline_and_indent (pp, spc);
4274 pp_left_brace (pp);
4275 newline_and_indent (pp, spc + 2);
4276 dump_generic_node (pp, TRANSACTION_EXPR_BODY (node),
4277 spc + 2, flags, false);
4278 newline_and_indent (pp, spc);
4279 pp_right_brace (pp);
4281 is_expr = false;
4282 break;
4284 case VEC_SERIES_EXPR:
4285 case VEC_WIDEN_MULT_HI_EXPR:
4286 case VEC_WIDEN_MULT_LO_EXPR:
4287 case VEC_WIDEN_MULT_EVEN_EXPR:
4288 case VEC_WIDEN_MULT_ODD_EXPR:
4289 case VEC_WIDEN_LSHIFT_HI_EXPR:
4290 case VEC_WIDEN_LSHIFT_LO_EXPR:
4291 pp_space (pp);
4292 for (str = get_tree_code_name (code); *str; str++)
4293 pp_character (pp, TOUPPER (*str));
4294 pp_string (pp, " < ");
4295 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4296 pp_string (pp, ", ");
4297 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
4298 pp_string (pp, " > ");
4299 break;
4301 case VEC_DUPLICATE_EXPR:
4302 pp_space (pp);
4303 for (str = get_tree_code_name (code); *str; str++)
4304 pp_character (pp, TOUPPER (*str));
4305 pp_string (pp, " < ");
4306 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4307 pp_string (pp, " > ");
4308 break;
4310 case VEC_UNPACK_HI_EXPR:
4311 pp_string (pp, " VEC_UNPACK_HI_EXPR < ");
4312 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4313 pp_string (pp, " > ");
4314 break;
4316 case VEC_UNPACK_LO_EXPR:
4317 pp_string (pp, " VEC_UNPACK_LO_EXPR < ");
4318 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4319 pp_string (pp, " > ");
4320 break;
4322 case VEC_UNPACK_FLOAT_HI_EXPR:
4323 pp_string (pp, " VEC_UNPACK_FLOAT_HI_EXPR < ");
4324 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4325 pp_string (pp, " > ");
4326 break;
4328 case VEC_UNPACK_FLOAT_LO_EXPR:
4329 pp_string (pp, " VEC_UNPACK_FLOAT_LO_EXPR < ");
4330 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4331 pp_string (pp, " > ");
4332 break;
4334 case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
4335 pp_string (pp, " VEC_UNPACK_FIX_TRUNC_HI_EXPR < ");
4336 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4337 pp_string (pp, " > ");
4338 break;
4340 case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
4341 pp_string (pp, " VEC_UNPACK_FIX_TRUNC_LO_EXPR < ");
4342 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4343 pp_string (pp, " > ");
4344 break;
4346 case VEC_PACK_TRUNC_EXPR:
4347 pp_string (pp, " VEC_PACK_TRUNC_EXPR < ");
4348 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4349 pp_string (pp, ", ");
4350 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
4351 pp_string (pp, " > ");
4352 break;
4354 case VEC_PACK_SAT_EXPR:
4355 pp_string (pp, " VEC_PACK_SAT_EXPR < ");
4356 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4357 pp_string (pp, ", ");
4358 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
4359 pp_string (pp, " > ");
4360 break;
4362 case VEC_PACK_FIX_TRUNC_EXPR:
4363 pp_string (pp, " VEC_PACK_FIX_TRUNC_EXPR < ");
4364 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4365 pp_string (pp, ", ");
4366 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
4367 pp_string (pp, " > ");
4368 break;
4370 case VEC_PACK_FLOAT_EXPR:
4371 pp_string (pp, " VEC_PACK_FLOAT_EXPR < ");
4372 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
4373 pp_string (pp, ", ");
4374 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
4375 pp_string (pp, " > ");
4376 break;
4378 case BLOCK:
4379 dump_block_node (pp, node, spc, flags);
4380 break;
4382 case DEBUG_BEGIN_STMT:
4383 pp_string (pp, "# DEBUG BEGIN STMT");
4384 break;
4386 default:
4387 NIY;
4390 if (is_stmt && is_expr)
4391 pp_semicolon (pp);
4393 return spc;
4396 /* Print the declaration of a variable. */
4398 void
4399 print_declaration (pretty_printer *pp, tree t, int spc, dump_flags_t flags)
4401 INDENT (spc);
4403 if (TREE_CODE(t) == NAMELIST_DECL)
4405 pp_string(pp, "namelist ");
4406 dump_decl_name (pp, t, flags);
4407 pp_semicolon (pp);
4408 return;
4411 if (TREE_CODE (t) == TYPE_DECL)
4412 pp_string (pp, "typedef ");
4414 if (HAS_RTL_P (t) && DECL_REGISTER (t))
4415 pp_string (pp, "register ");
4417 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
4418 pp_string (pp, "extern ");
4419 else if (TREE_STATIC (t))
4420 pp_string (pp, "static ");
4422 /* Print the type and name. */
4423 if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
4425 tree tmp;
4427 /* Print array's type. */
4428 tmp = TREE_TYPE (t);
4429 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
4430 tmp = TREE_TYPE (tmp);
4431 dump_generic_node (pp, TREE_TYPE (tmp), spc, flags, false);
4433 /* Print variable's name. */
4434 pp_space (pp);
4435 dump_generic_node (pp, t, spc, flags, false);
4437 /* Print the dimensions. */
4438 tmp = TREE_TYPE (t);
4439 while (TREE_CODE (tmp) == ARRAY_TYPE)
4441 dump_array_domain (pp, TYPE_DOMAIN (tmp), spc, flags);
4442 tmp = TREE_TYPE (tmp);
4445 else if (TREE_CODE (t) == FUNCTION_DECL)
4447 dump_generic_node (pp, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
4448 pp_space (pp);
4449 dump_decl_name (pp, t, flags);
4450 dump_function_declaration (pp, TREE_TYPE (t), spc, flags);
4452 else
4454 /* Print type declaration. */
4455 dump_generic_node (pp, TREE_TYPE (t), spc, flags, false);
4457 /* Print variable's name. */
4458 pp_space (pp);
4459 dump_generic_node (pp, t, spc, flags, false);
4462 if (VAR_P (t) && DECL_HARD_REGISTER (t))
4464 pp_string (pp, " __asm__ ");
4465 pp_left_paren (pp);
4466 dump_generic_node (pp, DECL_ASSEMBLER_NAME (t), spc, flags, false);
4467 pp_right_paren (pp);
4470 /* The initial value of a function serves to determine whether the function
4471 is declared or defined. So the following does not apply to function
4472 nodes. */
4473 if (TREE_CODE (t) != FUNCTION_DECL)
4475 /* Print the initial value. */
4476 if (DECL_INITIAL (t))
4478 pp_space (pp);
4479 pp_equal (pp);
4480 pp_space (pp);
4481 if (!(flags & TDF_SLIM))
4482 dump_generic_node (pp, DECL_INITIAL (t), spc, flags, false);
4483 else
4484 pp_string (pp, "<<< omitted >>>");
4488 if (VAR_P (t) && DECL_HAS_VALUE_EXPR_P (t))
4490 pp_string (pp, " [value-expr: ");
4491 dump_generic_node (pp, DECL_VALUE_EXPR (t), spc, flags, false);
4492 pp_right_bracket (pp);
4495 pp_semicolon (pp);
4499 /* Prints a structure: name, fields, and methods.
4500 FIXME: Still incomplete. */
4502 static void
4503 print_struct_decl (pretty_printer *pp, const_tree node, int spc,
4504 dump_flags_t flags)
4506 /* Print the name of the structure. */
4507 if (TYPE_NAME (node))
4509 INDENT (spc);
4510 if (TREE_CODE (node) == RECORD_TYPE)
4511 pp_string (pp, "struct ");
4512 else if ((TREE_CODE (node) == UNION_TYPE
4513 || TREE_CODE (node) == QUAL_UNION_TYPE))
4514 pp_string (pp, "union ");
4516 dump_generic_node (pp, TYPE_NAME (node), spc, TDF_NONE, false);
4519 /* Print the contents of the structure. */
4520 pp_newline (pp);
4521 INDENT (spc);
4522 pp_left_brace (pp);
4523 pp_newline (pp);
4525 /* Print the fields of the structure. */
4527 tree tmp;
4528 tmp = TYPE_FIELDS (node);
4529 while (tmp)
4531 /* Avoid to print recursively the structure. */
4532 /* FIXME : Not implemented correctly...,
4533 what about the case when we have a cycle in the contain graph? ...
4534 Maybe this could be solved by looking at the scope in which the
4535 structure was declared. */
4536 if (TREE_TYPE (tmp) != node
4537 && (TREE_CODE (TREE_TYPE (tmp)) != POINTER_TYPE
4538 || TREE_TYPE (TREE_TYPE (tmp)) != node))
4540 print_declaration (pp, tmp, spc+2, flags);
4541 pp_newline (pp);
4543 tmp = DECL_CHAIN (tmp);
4546 INDENT (spc);
4547 pp_right_brace (pp);
4550 /* Return the priority of the operator CODE.
4552 From lowest to highest precedence with either left-to-right (L-R)
4553 or right-to-left (R-L) associativity]:
4555 1 [L-R] ,
4556 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
4557 3 [R-L] ?:
4558 4 [L-R] ||
4559 5 [L-R] &&
4560 6 [L-R] |
4561 7 [L-R] ^
4562 8 [L-R] &
4563 9 [L-R] == !=
4564 10 [L-R] < <= > >=
4565 11 [L-R] << >>
4566 12 [L-R] + -
4567 13 [L-R] * / %
4568 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
4569 15 [L-R] fn() [] -> .
4571 unary +, - and * have higher precedence than the corresponding binary
4572 operators. */
4575 op_code_prio (enum tree_code code)
4577 switch (code)
4579 case TREE_LIST:
4580 case COMPOUND_EXPR:
4581 case BIND_EXPR:
4582 return 1;
4584 case MODIFY_EXPR:
4585 case INIT_EXPR:
4586 return 2;
4588 case COND_EXPR:
4589 return 3;
4591 case TRUTH_OR_EXPR:
4592 case TRUTH_ORIF_EXPR:
4593 return 4;
4595 case TRUTH_AND_EXPR:
4596 case TRUTH_ANDIF_EXPR:
4597 return 5;
4599 case BIT_IOR_EXPR:
4600 return 6;
4602 case BIT_XOR_EXPR:
4603 case TRUTH_XOR_EXPR:
4604 return 7;
4606 case BIT_AND_EXPR:
4607 return 8;
4609 case EQ_EXPR:
4610 case NE_EXPR:
4611 return 9;
4613 case UNLT_EXPR:
4614 case UNLE_EXPR:
4615 case UNGT_EXPR:
4616 case UNGE_EXPR:
4617 case UNEQ_EXPR:
4618 case LTGT_EXPR:
4619 case ORDERED_EXPR:
4620 case UNORDERED_EXPR:
4621 case LT_EXPR:
4622 case LE_EXPR:
4623 case GT_EXPR:
4624 case GE_EXPR:
4625 return 10;
4627 case LSHIFT_EXPR:
4628 case RSHIFT_EXPR:
4629 case LROTATE_EXPR:
4630 case RROTATE_EXPR:
4631 case VEC_WIDEN_LSHIFT_HI_EXPR:
4632 case VEC_WIDEN_LSHIFT_LO_EXPR:
4633 case WIDEN_LSHIFT_EXPR:
4634 return 11;
4636 case WIDEN_SUM_EXPR:
4637 case PLUS_EXPR:
4638 case POINTER_PLUS_EXPR:
4639 case POINTER_DIFF_EXPR:
4640 case MINUS_EXPR:
4641 return 12;
4643 case VEC_WIDEN_MULT_HI_EXPR:
4644 case VEC_WIDEN_MULT_LO_EXPR:
4645 case WIDEN_MULT_EXPR:
4646 case DOT_PROD_EXPR:
4647 case WIDEN_MULT_PLUS_EXPR:
4648 case WIDEN_MULT_MINUS_EXPR:
4649 case MULT_EXPR:
4650 case MULT_HIGHPART_EXPR:
4651 case TRUNC_DIV_EXPR:
4652 case CEIL_DIV_EXPR:
4653 case FLOOR_DIV_EXPR:
4654 case ROUND_DIV_EXPR:
4655 case RDIV_EXPR:
4656 case EXACT_DIV_EXPR:
4657 case TRUNC_MOD_EXPR:
4658 case CEIL_MOD_EXPR:
4659 case FLOOR_MOD_EXPR:
4660 case ROUND_MOD_EXPR:
4661 return 13;
4663 case TRUTH_NOT_EXPR:
4664 case BIT_NOT_EXPR:
4665 case POSTINCREMENT_EXPR:
4666 case POSTDECREMENT_EXPR:
4667 case PREINCREMENT_EXPR:
4668 case PREDECREMENT_EXPR:
4669 case NEGATE_EXPR:
4670 case INDIRECT_REF:
4671 case ADDR_EXPR:
4672 case FLOAT_EXPR:
4673 CASE_CONVERT:
4674 case FIX_TRUNC_EXPR:
4675 case TARGET_EXPR:
4676 return 14;
4678 case CALL_EXPR:
4679 case ARRAY_REF:
4680 case ARRAY_RANGE_REF:
4681 case COMPONENT_REF:
4682 return 15;
4684 /* Special expressions. */
4685 case MIN_EXPR:
4686 case MAX_EXPR:
4687 case ABS_EXPR:
4688 case REALPART_EXPR:
4689 case IMAGPART_EXPR:
4690 case VEC_UNPACK_HI_EXPR:
4691 case VEC_UNPACK_LO_EXPR:
4692 case VEC_UNPACK_FLOAT_HI_EXPR:
4693 case VEC_UNPACK_FLOAT_LO_EXPR:
4694 case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
4695 case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
4696 case VEC_PACK_TRUNC_EXPR:
4697 case VEC_PACK_SAT_EXPR:
4698 return 16;
4700 default:
4701 /* Return an arbitrarily high precedence to avoid surrounding single
4702 VAR_DECLs in ()s. */
4703 return 9999;
4707 /* Return the priority of the operator OP. */
4710 op_prio (const_tree op)
4712 enum tree_code code;
4714 if (op == NULL)
4715 return 9999;
4717 code = TREE_CODE (op);
4718 if (code == SAVE_EXPR || code == NON_LVALUE_EXPR)
4719 return op_prio (TREE_OPERAND (op, 0));
4721 return op_code_prio (code);
4724 /* Return the symbol associated with operator CODE. */
4726 const char *
4727 op_symbol_code (enum tree_code code, dump_flags_t flags)
4729 switch (code)
4731 case MODIFY_EXPR:
4732 return "=";
4734 case TRUTH_OR_EXPR:
4735 case TRUTH_ORIF_EXPR:
4736 return "||";
4738 case TRUTH_AND_EXPR:
4739 case TRUTH_ANDIF_EXPR:
4740 return "&&";
4742 case BIT_IOR_EXPR:
4743 return "|";
4745 case TRUTH_XOR_EXPR:
4746 case BIT_XOR_EXPR:
4747 return "^";
4749 case ADDR_EXPR:
4750 case BIT_AND_EXPR:
4751 return "&";
4753 case ORDERED_EXPR:
4754 return (flags & TDF_GIMPLE) ? "__ORDERED" : "ord";
4755 case UNORDERED_EXPR:
4756 return (flags & TDF_GIMPLE) ? "__UNORDERED" : "unord";
4758 case EQ_EXPR:
4759 return "==";
4760 case UNEQ_EXPR:
4761 return (flags & TDF_GIMPLE) ? "__UNEQ" : "u==";
4763 case NE_EXPR:
4764 return "!=";
4766 case LT_EXPR:
4767 return "<";
4768 case UNLT_EXPR:
4769 return (flags & TDF_GIMPLE) ? "__UNLT" : "u<";
4771 case LE_EXPR:
4772 return "<=";
4773 case UNLE_EXPR:
4774 return (flags & TDF_GIMPLE) ? "__UNLE" : "u<=";
4776 case GT_EXPR:
4777 return ">";
4778 case UNGT_EXPR:
4779 return (flags & TDF_GIMPLE) ? "__UNGT" : "u>";
4781 case GE_EXPR:
4782 return ">=";
4783 case UNGE_EXPR:
4784 return (flags & TDF_GIMPLE) ? "__UNGE" : "u>=";
4786 case LTGT_EXPR:
4787 return (flags & TDF_GIMPLE) ? "__LTGT" : "<>";
4789 case LSHIFT_EXPR:
4790 return "<<";
4792 case RSHIFT_EXPR:
4793 return ">>";
4795 case LROTATE_EXPR:
4796 return "r<<";
4798 case RROTATE_EXPR:
4799 return "r>>";
4801 case WIDEN_LSHIFT_EXPR:
4802 return "w<<";
4804 case POINTER_PLUS_EXPR:
4805 return "+";
4807 case PLUS_EXPR:
4808 return "+";
4810 case WIDEN_SUM_EXPR:
4811 return "w+";
4813 case WIDEN_MULT_EXPR:
4814 return "w*";
4816 case MULT_HIGHPART_EXPR:
4817 return (flags & TDF_GIMPLE) ? "__MULT_HIGHPART" : "h*";
4819 case NEGATE_EXPR:
4820 case MINUS_EXPR:
4821 case POINTER_DIFF_EXPR:
4822 return "-";
4824 case BIT_NOT_EXPR:
4825 return "~";
4827 case TRUTH_NOT_EXPR:
4828 return "!";
4830 case MULT_EXPR:
4831 case INDIRECT_REF:
4832 return "*";
4834 case TRUNC_DIV_EXPR:
4835 case RDIV_EXPR:
4836 return "/";
4838 case CEIL_DIV_EXPR:
4839 return "/[cl]";
4841 case FLOOR_DIV_EXPR:
4842 return "/[fl]";
4844 case ROUND_DIV_EXPR:
4845 return "/[rd]";
4847 case EXACT_DIV_EXPR:
4848 return "/[ex]";
4850 case TRUNC_MOD_EXPR:
4851 return "%";
4853 case CEIL_MOD_EXPR:
4854 return "%[cl]";
4856 case FLOOR_MOD_EXPR:
4857 return "%[fl]";
4859 case ROUND_MOD_EXPR:
4860 return "%[rd]";
4862 case PREDECREMENT_EXPR:
4863 return " --";
4865 case PREINCREMENT_EXPR:
4866 return " ++";
4868 case POSTDECREMENT_EXPR:
4869 return "-- ";
4871 case POSTINCREMENT_EXPR:
4872 return "++ ";
4874 case MAX_EXPR:
4875 return "max";
4877 case MIN_EXPR:
4878 return "min";
4880 default:
4881 return "<<< ??? >>>";
4885 /* Return the symbol associated with operator OP. */
4887 static const char *
4888 op_symbol (const_tree op, dump_flags_t flags)
4890 return op_symbol_code (TREE_CODE (op), flags);
4893 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
4894 the gimple_call_fn of a GIMPLE_CALL. */
4896 void
4897 print_call_name (pretty_printer *pp, tree node, dump_flags_t flags)
4899 tree op0 = node;
4900 int spc = 0;
4902 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
4903 op0 = TREE_OPERAND (op0, 0);
4905 again:
4906 switch (TREE_CODE (op0))
4908 case VAR_DECL:
4909 case PARM_DECL:
4910 case FUNCTION_DECL:
4911 dump_function_name (pp, op0, flags);
4912 break;
4914 case ADDR_EXPR:
4915 case INDIRECT_REF:
4916 CASE_CONVERT:
4917 op0 = TREE_OPERAND (op0, 0);
4918 goto again;
4920 case COND_EXPR:
4921 pp_left_paren (pp);
4922 dump_generic_node (pp, TREE_OPERAND (op0, 0), 0, flags, false);
4923 pp_string (pp, ") ? ");
4924 dump_generic_node (pp, TREE_OPERAND (op0, 1), 0, flags, false);
4925 pp_string (pp, " : ");
4926 dump_generic_node (pp, TREE_OPERAND (op0, 2), 0, flags, false);
4927 break;
4929 case ARRAY_REF:
4930 if (VAR_P (TREE_OPERAND (op0, 0)))
4931 dump_function_name (pp, TREE_OPERAND (op0, 0), flags);
4932 else
4933 dump_generic_node (pp, op0, 0, flags, false);
4934 break;
4936 case MEM_REF:
4937 if (integer_zerop (TREE_OPERAND (op0, 1)))
4939 op0 = TREE_OPERAND (op0, 0);
4940 goto again;
4942 /* Fallthru. */
4943 case COMPONENT_REF:
4944 case SSA_NAME:
4945 case OBJ_TYPE_REF:
4946 dump_generic_node (pp, op0, 0, flags, false);
4947 break;
4949 default:
4950 NIY;
4954 /* Print the first N characters in the array STR, replacing non-printable
4955 characters (including embedded nuls) with unambiguous escape sequences. */
4957 void
4958 pretty_print_string (pretty_printer *pp, const char *str, size_t n)
4960 if (str == NULL)
4961 return;
4963 for ( ; n; --n, ++str)
4965 switch (str[0])
4967 case '\b':
4968 pp_string (pp, "\\b");
4969 break;
4971 case '\f':
4972 pp_string (pp, "\\f");
4973 break;
4975 case '\n':
4976 pp_string (pp, "\\n");
4977 break;
4979 case '\r':
4980 pp_string (pp, "\\r");
4981 break;
4983 case '\t':
4984 pp_string (pp, "\\t");
4985 break;
4987 case '\v':
4988 pp_string (pp, "\\v");
4989 break;
4991 case '\\':
4992 pp_string (pp, "\\\\");
4993 break;
4995 case '\"':
4996 pp_string (pp, "\\\"");
4997 break;
4999 case '\'':
5000 pp_string (pp, "\\'");
5001 break;
5003 default:
5004 if (str[0] || n > 1)
5006 if (!ISPRINT (str[0]))
5008 char buf[5];
5009 sprintf (buf, "\\x%02x", (unsigned char)str[0]);
5010 pp_string (pp, buf);
5012 else
5013 pp_character (pp, str[0]);
5014 break;
5020 static void
5021 maybe_init_pretty_print (FILE *file)
5023 if (!tree_pp)
5025 tree_pp = new pretty_printer ();
5026 pp_needs_newline (tree_pp) = true;
5027 pp_translate_identifiers (tree_pp) = false;
5030 tree_pp->set_output_stream (file);
5033 static void
5034 newline_and_indent (pretty_printer *pp, int spc)
5036 pp_newline (pp);
5037 INDENT (spc);
5040 /* Print the identifier ID to PRETTY-PRINTER. */
5042 void
5043 pp_tree_identifier (pretty_printer *pp, tree id)
5045 if (pp_translate_identifiers (pp))
5047 const char *text = identifier_to_locale (IDENTIFIER_POINTER (id));
5048 pp_append_text (pp, text, text + strlen (text));
5050 else
5051 pp_append_text (pp, IDENTIFIER_POINTER (id),
5052 IDENTIFIER_POINTER (id) + IDENTIFIER_LENGTH (id));
5055 /* A helper function that is used to dump function information before the
5056 function dump. */
5058 void
5059 dump_function_header (FILE *dump_file, tree fdecl, dump_flags_t flags)
5061 const char *dname, *aname;
5062 struct cgraph_node *node = cgraph_node::get (fdecl);
5063 struct function *fun = DECL_STRUCT_FUNCTION (fdecl);
5065 dname = lang_hooks.decl_printable_name (fdecl, 1);
5067 if (DECL_ASSEMBLER_NAME_SET_P (fdecl))
5068 aname = (IDENTIFIER_POINTER
5069 (DECL_ASSEMBLER_NAME (fdecl)));
5070 else
5071 aname = "<unset-asm-name>";
5073 fprintf (dump_file, "\n;; Function %s (%s, funcdef_no=%d",
5074 dname, aname, fun->funcdef_no);
5075 if (!(flags & TDF_NOUID))
5076 fprintf (dump_file, ", decl_uid=%d", DECL_UID (fdecl));
5077 if (node)
5079 fprintf (dump_file, ", cgraph_uid=%d", node->get_uid ());
5080 fprintf (dump_file, ", symbol_order=%d)%s\n\n", node->order,
5081 node->frequency == NODE_FREQUENCY_HOT
5082 ? " (hot)"
5083 : node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
5084 ? " (unlikely executed)"
5085 : node->frequency == NODE_FREQUENCY_EXECUTED_ONCE
5086 ? " (executed once)"
5087 : "");
5089 else
5090 fprintf (dump_file, ")\n\n");
5093 /* Dump double_int D to pretty_printer PP. UNS is true
5094 if D is unsigned and false otherwise. */
5095 void
5096 pp_double_int (pretty_printer *pp, double_int d, bool uns)
5098 if (d.fits_shwi ())
5099 pp_wide_integer (pp, d.low);
5100 else if (d.fits_uhwi ())
5101 pp_unsigned_wide_integer (pp, d.low);
5102 else
5104 unsigned HOST_WIDE_INT low = d.low;
5105 HOST_WIDE_INT high = d.high;
5106 if (!uns && d.is_negative ())
5108 pp_minus (pp);
5109 high = ~high + !low;
5110 low = -low;
5112 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
5113 systems? */
5114 sprintf (pp_buffer (pp)->m_digit_buffer,
5115 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
5116 (unsigned HOST_WIDE_INT) high, low);
5117 pp_string (pp, pp_buffer (pp)->m_digit_buffer);
5121 #if __GNUC__ >= 10
5122 # pragma GCC diagnostic pop
5123 #endif