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