Don't warn when alignment of global common data exceeds maximum alignment.
[official-gcc.git] / gcc / tree-pretty-print.c
blob0570fdcf890dcc9cbd5c1c2ceefeee95f8392521
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 dump_generic_node (pp, OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause),
739 spc, flags, false);
740 pp_colon (pp);
742 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
743 spc, flags, false);
744 pp_right_paren (pp);
745 break;
747 case OMP_CLAUSE_AFFINITY:
748 pp_string (pp, "affinity(");
750 tree t = OMP_CLAUSE_DECL (clause);
751 if (TREE_CODE (t) == TREE_LIST
752 && TREE_PURPOSE (t)
753 && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
755 dump_omp_iterators (pp, TREE_PURPOSE (t), spc, flags);
756 pp_colon (pp);
757 t = TREE_VALUE (t);
759 dump_generic_node (pp, t, spc, flags, false);
761 pp_right_paren (pp);
762 break;
763 case OMP_CLAUSE_DEPEND:
764 pp_string (pp, "depend(");
765 switch (OMP_CLAUSE_DEPEND_KIND (clause))
767 case OMP_CLAUSE_DEPEND_DEPOBJ:
768 name = "depobj";
769 break;
770 case OMP_CLAUSE_DEPEND_IN:
771 name = "in";
772 break;
773 case OMP_CLAUSE_DEPEND_OUT:
774 name = "out";
775 break;
776 case OMP_CLAUSE_DEPEND_INOUT:
777 name = "inout";
778 break;
779 case OMP_CLAUSE_DEPEND_MUTEXINOUTSET:
780 name = "mutexinoutset";
781 break;
782 case OMP_CLAUSE_DEPEND_SOURCE:
783 pp_string (pp, "source)");
784 return;
785 case OMP_CLAUSE_DEPEND_LAST:
786 name = "__internal__";
787 break;
788 case OMP_CLAUSE_DEPEND_SINK:
789 pp_string (pp, "sink:");
790 for (tree t = OMP_CLAUSE_DECL (clause); t; t = TREE_CHAIN (t))
791 if (TREE_CODE (t) == TREE_LIST)
793 dump_generic_node (pp, TREE_VALUE (t), spc, flags, false);
794 if (TREE_PURPOSE (t) != integer_zero_node)
796 if (OMP_CLAUSE_DEPEND_SINK_NEGATIVE (t))
797 pp_minus (pp);
798 else
799 pp_plus (pp);
800 dump_generic_node (pp, TREE_PURPOSE (t), spc, flags,
801 false);
803 if (TREE_CHAIN (t))
804 pp_comma (pp);
806 else
807 gcc_unreachable ();
808 pp_right_paren (pp);
809 return;
810 default:
811 gcc_unreachable ();
814 tree t = OMP_CLAUSE_DECL (clause);
815 if (TREE_CODE (t) == TREE_LIST
816 && TREE_PURPOSE (t)
817 && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
819 dump_omp_iterators (pp, TREE_PURPOSE (t), spc, flags);
820 pp_colon (pp);
821 t = TREE_VALUE (t);
823 if (name[0])
825 pp_string (pp, name);
826 pp_colon (pp);
828 dump_generic_node (pp, t, spc, flags, false);
829 pp_right_paren (pp);
831 break;
833 case OMP_CLAUSE_MAP:
834 pp_string (pp, "map(");
835 switch (OMP_CLAUSE_MAP_KIND (clause))
837 case GOMP_MAP_ALLOC:
838 case GOMP_MAP_POINTER:
839 pp_string (pp, "alloc");
840 break;
841 case GOMP_MAP_IF_PRESENT:
842 pp_string (pp, "no_alloc");
843 break;
844 case GOMP_MAP_TO:
845 case GOMP_MAP_TO_PSET:
846 pp_string (pp, "to");
847 break;
848 case GOMP_MAP_FROM:
849 pp_string (pp, "from");
850 break;
851 case GOMP_MAP_TOFROM:
852 pp_string (pp, "tofrom");
853 break;
854 case GOMP_MAP_FORCE_ALLOC:
855 pp_string (pp, "force_alloc");
856 break;
857 case GOMP_MAP_FORCE_TO:
858 pp_string (pp, "force_to");
859 break;
860 case GOMP_MAP_FORCE_FROM:
861 pp_string (pp, "force_from");
862 break;
863 case GOMP_MAP_FORCE_TOFROM:
864 pp_string (pp, "force_tofrom");
865 break;
866 case GOMP_MAP_FORCE_PRESENT:
867 pp_string (pp, "force_present");
868 break;
869 case GOMP_MAP_DELETE:
870 pp_string (pp, "delete");
871 break;
872 case GOMP_MAP_FORCE_DEVICEPTR:
873 pp_string (pp, "force_deviceptr");
874 break;
875 case GOMP_MAP_ALWAYS_TO:
876 pp_string (pp, "always,to");
877 break;
878 case GOMP_MAP_ALWAYS_FROM:
879 pp_string (pp, "always,from");
880 break;
881 case GOMP_MAP_ALWAYS_TOFROM:
882 pp_string (pp, "always,tofrom");
883 break;
884 case GOMP_MAP_RELEASE:
885 pp_string (pp, "release");
886 break;
887 case GOMP_MAP_FIRSTPRIVATE_POINTER:
888 pp_string (pp, "firstprivate");
889 break;
890 case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
891 pp_string (pp, "firstprivate ref");
892 break;
893 case GOMP_MAP_STRUCT:
894 pp_string (pp, "struct");
895 break;
896 case GOMP_MAP_ALWAYS_POINTER:
897 pp_string (pp, "always_pointer");
898 break;
899 case GOMP_MAP_DEVICE_RESIDENT:
900 pp_string (pp, "device_resident");
901 break;
902 case GOMP_MAP_LINK:
903 pp_string (pp, "link");
904 break;
905 case GOMP_MAP_ATTACH:
906 pp_string (pp, "attach");
907 break;
908 case GOMP_MAP_DETACH:
909 pp_string (pp, "detach");
910 break;
911 case GOMP_MAP_FORCE_DETACH:
912 pp_string (pp, "force_detach");
913 break;
914 case GOMP_MAP_ATTACH_DETACH:
915 pp_string (pp, "attach_detach");
916 break;
917 default:
918 gcc_unreachable ();
920 pp_colon (pp);
921 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
922 spc, flags, false);
923 print_clause_size:
924 if (OMP_CLAUSE_SIZE (clause))
926 switch (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
927 ? OMP_CLAUSE_MAP_KIND (clause) : GOMP_MAP_TO)
929 case GOMP_MAP_POINTER:
930 case GOMP_MAP_FIRSTPRIVATE_POINTER:
931 case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
932 case GOMP_MAP_ALWAYS_POINTER:
933 pp_string (pp, " [pointer assign, bias: ");
934 break;
935 case GOMP_MAP_TO_PSET:
936 pp_string (pp, " [pointer set, len: ");
937 break;
938 case GOMP_MAP_ATTACH:
939 case GOMP_MAP_DETACH:
940 case GOMP_MAP_FORCE_DETACH:
941 case GOMP_MAP_ATTACH_DETACH:
942 pp_string (pp, " [bias: ");
943 break;
944 default:
945 pp_string (pp, " [len: ");
946 break;
948 dump_generic_node (pp, OMP_CLAUSE_SIZE (clause),
949 spc, flags, false);
950 pp_right_bracket (pp);
952 pp_right_paren (pp);
953 break;
955 case OMP_CLAUSE_FROM:
956 pp_string (pp, "from(");
957 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
958 spc, flags, false);
959 goto print_clause_size;
961 case OMP_CLAUSE_TO:
962 pp_string (pp, "to(");
963 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
964 spc, flags, false);
965 goto print_clause_size;
967 case OMP_CLAUSE__CACHE_:
968 pp_string (pp, "(");
969 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
970 spc, flags, false);
971 goto print_clause_size;
973 case OMP_CLAUSE_NUM_TEAMS:
974 pp_string (pp, "num_teams(");
975 dump_generic_node (pp, OMP_CLAUSE_NUM_TEAMS_EXPR (clause),
976 spc, flags, false);
977 pp_right_paren (pp);
978 break;
980 case OMP_CLAUSE_THREAD_LIMIT:
981 pp_string (pp, "thread_limit(");
982 dump_generic_node (pp, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause),
983 spc, flags, false);
984 pp_right_paren (pp);
985 break;
987 case OMP_CLAUSE_DEVICE:
988 pp_string (pp, "device(");
989 dump_generic_node (pp, OMP_CLAUSE_DEVICE_ID (clause),
990 spc, flags, false);
991 pp_right_paren (pp);
992 break;
994 case OMP_CLAUSE_DIST_SCHEDULE:
995 pp_string (pp, "dist_schedule(static");
996 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause))
998 pp_comma (pp);
999 dump_generic_node (pp,
1000 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause),
1001 spc, flags, false);
1003 pp_right_paren (pp);
1004 break;
1006 case OMP_CLAUSE_PROC_BIND:
1007 pp_string (pp, "proc_bind(");
1008 switch (OMP_CLAUSE_PROC_BIND_KIND (clause))
1010 case OMP_CLAUSE_PROC_BIND_MASTER:
1011 /* Same enum value: case OMP_CLAUSE_PROC_BIND_PRIMARY: */
1012 /* TODO: Change to 'primary' for OpenMP 5.1. */
1013 pp_string (pp, "master");
1014 break;
1015 case OMP_CLAUSE_PROC_BIND_CLOSE:
1016 pp_string (pp, "close");
1017 break;
1018 case OMP_CLAUSE_PROC_BIND_SPREAD:
1019 pp_string (pp, "spread");
1020 break;
1021 default:
1022 gcc_unreachable ();
1024 pp_right_paren (pp);
1025 break;
1027 case OMP_CLAUSE_DEVICE_TYPE:
1028 pp_string (pp, "device_type(");
1029 switch (OMP_CLAUSE_DEVICE_TYPE_KIND (clause))
1031 case OMP_CLAUSE_DEVICE_TYPE_HOST:
1032 pp_string (pp, "host");
1033 break;
1034 case OMP_CLAUSE_DEVICE_TYPE_NOHOST:
1035 pp_string (pp, "nohost");
1036 break;
1037 case OMP_CLAUSE_DEVICE_TYPE_ANY:
1038 pp_string (pp, "any");
1039 break;
1040 default:
1041 gcc_unreachable ();
1043 pp_right_paren (pp);
1044 break;
1046 case OMP_CLAUSE_SAFELEN:
1047 pp_string (pp, "safelen(");
1048 dump_generic_node (pp, OMP_CLAUSE_SAFELEN_EXPR (clause),
1049 spc, flags, false);
1050 pp_right_paren (pp);
1051 break;
1053 case OMP_CLAUSE_SIMDLEN:
1054 pp_string (pp, "simdlen(");
1055 dump_generic_node (pp, OMP_CLAUSE_SIMDLEN_EXPR (clause),
1056 spc, flags, false);
1057 pp_right_paren (pp);
1058 break;
1060 case OMP_CLAUSE_PRIORITY:
1061 pp_string (pp, "priority(");
1062 dump_generic_node (pp, OMP_CLAUSE_PRIORITY_EXPR (clause),
1063 spc, flags, false);
1064 pp_right_paren (pp);
1065 break;
1067 case OMP_CLAUSE_GRAINSIZE:
1068 pp_string (pp, "grainsize(");
1069 dump_generic_node (pp, OMP_CLAUSE_GRAINSIZE_EXPR (clause),
1070 spc, flags, false);
1071 pp_right_paren (pp);
1072 break;
1074 case OMP_CLAUSE_NUM_TASKS:
1075 pp_string (pp, "num_tasks(");
1076 dump_generic_node (pp, OMP_CLAUSE_NUM_TASKS_EXPR (clause),
1077 spc, flags, false);
1078 pp_right_paren (pp);
1079 break;
1081 case OMP_CLAUSE_HINT:
1082 pp_string (pp, "hint(");
1083 dump_generic_node (pp, OMP_CLAUSE_HINT_EXPR (clause),
1084 spc, flags, false);
1085 pp_right_paren (pp);
1086 break;
1088 case OMP_CLAUSE_FILTER:
1089 pp_string (pp, "filter(");
1090 dump_generic_node (pp, OMP_CLAUSE_FILTER_EXPR (clause),
1091 spc, flags, false);
1092 pp_right_paren (pp);
1093 break;
1095 case OMP_CLAUSE_DEFAULTMAP:
1096 pp_string (pp, "defaultmap(");
1097 switch (OMP_CLAUSE_DEFAULTMAP_BEHAVIOR (clause))
1099 case OMP_CLAUSE_DEFAULTMAP_ALLOC:
1100 pp_string (pp, "alloc");
1101 break;
1102 case OMP_CLAUSE_DEFAULTMAP_TO:
1103 pp_string (pp, "to");
1104 break;
1105 case OMP_CLAUSE_DEFAULTMAP_FROM:
1106 pp_string (pp, "from");
1107 break;
1108 case OMP_CLAUSE_DEFAULTMAP_TOFROM:
1109 pp_string (pp, "tofrom");
1110 break;
1111 case OMP_CLAUSE_DEFAULTMAP_FIRSTPRIVATE:
1112 pp_string (pp, "firstprivate");
1113 break;
1114 case OMP_CLAUSE_DEFAULTMAP_NONE:
1115 pp_string (pp, "none");
1116 break;
1117 case OMP_CLAUSE_DEFAULTMAP_DEFAULT:
1118 pp_string (pp, "default");
1119 break;
1120 default:
1121 gcc_unreachable ();
1123 switch (OMP_CLAUSE_DEFAULTMAP_CATEGORY (clause))
1125 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED:
1126 break;
1127 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_SCALAR:
1128 pp_string (pp, ":scalar");
1129 break;
1130 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_AGGREGATE:
1131 pp_string (pp, ":aggregate");
1132 break;
1133 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALLOCATABLE:
1134 pp_string (pp, ":allocatable");
1135 break;
1136 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_POINTER:
1137 pp_string (pp, ":pointer");
1138 break;
1139 default:
1140 gcc_unreachable ();
1142 pp_right_paren (pp);
1143 break;
1145 case OMP_CLAUSE_ORDER:
1146 pp_string (pp, "order(concurrent)");
1147 break;
1149 case OMP_CLAUSE_BIND:
1150 pp_string (pp, "bind(");
1151 switch (OMP_CLAUSE_BIND_KIND (clause))
1153 case OMP_CLAUSE_BIND_TEAMS:
1154 pp_string (pp, "teams");
1155 break;
1156 case OMP_CLAUSE_BIND_PARALLEL:
1157 pp_string (pp, "parallel");
1158 break;
1159 case OMP_CLAUSE_BIND_THREAD:
1160 pp_string (pp, "thread");
1161 break;
1162 default:
1163 gcc_unreachable ();
1165 pp_right_paren (pp);
1166 break;
1168 case OMP_CLAUSE__SIMDUID_:
1169 pp_string (pp, "_simduid_(");
1170 dump_generic_node (pp, OMP_CLAUSE__SIMDUID__DECL (clause),
1171 spc, flags, false);
1172 pp_right_paren (pp);
1173 break;
1175 case OMP_CLAUSE__SIMT_:
1176 pp_string (pp, "_simt_");
1177 break;
1179 case OMP_CLAUSE_GANG:
1180 pp_string (pp, "gang");
1181 if (OMP_CLAUSE_GANG_EXPR (clause) != NULL_TREE)
1183 pp_string (pp, "(num: ");
1184 dump_generic_node (pp, OMP_CLAUSE_GANG_EXPR (clause),
1185 spc, flags, false);
1187 if (OMP_CLAUSE_GANG_STATIC_EXPR (clause) != NULL_TREE)
1189 if (OMP_CLAUSE_GANG_EXPR (clause) == NULL_TREE)
1190 pp_left_paren (pp);
1191 else
1192 pp_space (pp);
1193 pp_string (pp, "static:");
1194 if (OMP_CLAUSE_GANG_STATIC_EXPR (clause)
1195 == integer_minus_one_node)
1196 pp_character (pp, '*');
1197 else
1198 dump_generic_node (pp, OMP_CLAUSE_GANG_STATIC_EXPR (clause),
1199 spc, flags, false);
1201 if (OMP_CLAUSE_GANG_EXPR (clause) != NULL_TREE
1202 || OMP_CLAUSE_GANG_STATIC_EXPR (clause) != NULL_TREE)
1203 pp_right_paren (pp);
1204 break;
1206 case OMP_CLAUSE_ASYNC:
1207 pp_string (pp, "async");
1208 if (OMP_CLAUSE_ASYNC_EXPR (clause))
1210 pp_character(pp, '(');
1211 dump_generic_node (pp, OMP_CLAUSE_ASYNC_EXPR (clause),
1212 spc, flags, false);
1213 pp_character(pp, ')');
1215 break;
1217 case OMP_CLAUSE_AUTO:
1218 case OMP_CLAUSE_SEQ:
1219 pp_string (pp, omp_clause_code_name[OMP_CLAUSE_CODE (clause)]);
1220 break;
1222 case OMP_CLAUSE_WAIT:
1223 pp_string (pp, "wait(");
1224 dump_generic_node (pp, OMP_CLAUSE_WAIT_EXPR (clause),
1225 spc, flags, false);
1226 pp_character(pp, ')');
1227 break;
1229 case OMP_CLAUSE_WORKER:
1230 pp_string (pp, "worker");
1231 if (OMP_CLAUSE_WORKER_EXPR (clause) != NULL_TREE)
1233 pp_left_paren (pp);
1234 dump_generic_node (pp, OMP_CLAUSE_WORKER_EXPR (clause),
1235 spc, flags, false);
1236 pp_right_paren (pp);
1238 break;
1240 case OMP_CLAUSE_VECTOR:
1241 pp_string (pp, "vector");
1242 if (OMP_CLAUSE_VECTOR_EXPR (clause) != NULL_TREE)
1244 pp_left_paren (pp);
1245 dump_generic_node (pp, OMP_CLAUSE_VECTOR_EXPR (clause),
1246 spc, flags, false);
1247 pp_right_paren (pp);
1249 break;
1251 case OMP_CLAUSE_NUM_GANGS:
1252 pp_string (pp, "num_gangs(");
1253 dump_generic_node (pp, OMP_CLAUSE_NUM_GANGS_EXPR (clause),
1254 spc, flags, false);
1255 pp_character (pp, ')');
1256 break;
1258 case OMP_CLAUSE_NUM_WORKERS:
1259 pp_string (pp, "num_workers(");
1260 dump_generic_node (pp, OMP_CLAUSE_NUM_WORKERS_EXPR (clause),
1261 spc, flags, false);
1262 pp_character (pp, ')');
1263 break;
1265 case OMP_CLAUSE_VECTOR_LENGTH:
1266 pp_string (pp, "vector_length(");
1267 dump_generic_node (pp, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause),
1268 spc, flags, false);
1269 pp_character (pp, ')');
1270 break;
1272 case OMP_CLAUSE_INBRANCH:
1273 pp_string (pp, "inbranch");
1274 break;
1275 case OMP_CLAUSE_NOTINBRANCH:
1276 pp_string (pp, "notinbranch");
1277 break;
1278 case OMP_CLAUSE_FOR:
1279 pp_string (pp, "for");
1280 break;
1281 case OMP_CLAUSE_PARALLEL:
1282 pp_string (pp, "parallel");
1283 break;
1284 case OMP_CLAUSE_SECTIONS:
1285 pp_string (pp, "sections");
1286 break;
1287 case OMP_CLAUSE_TASKGROUP:
1288 pp_string (pp, "taskgroup");
1289 break;
1290 case OMP_CLAUSE_NOGROUP:
1291 pp_string (pp, "nogroup");
1292 break;
1293 case OMP_CLAUSE_THREADS:
1294 pp_string (pp, "threads");
1295 break;
1296 case OMP_CLAUSE_SIMD:
1297 pp_string (pp, "simd");
1298 break;
1299 case OMP_CLAUSE_INDEPENDENT:
1300 pp_string (pp, "independent");
1301 break;
1302 case OMP_CLAUSE_TILE:
1303 pp_string (pp, "tile(");
1304 dump_generic_node (pp, OMP_CLAUSE_TILE_LIST (clause),
1305 spc, flags, false);
1306 pp_right_paren (pp);
1307 break;
1309 case OMP_CLAUSE_IF_PRESENT:
1310 pp_string (pp, "if_present");
1311 break;
1312 case OMP_CLAUSE_FINALIZE:
1313 pp_string (pp, "finalize");
1314 break;
1315 case OMP_CLAUSE_NOHOST:
1316 pp_string (pp, "nohost");
1317 break;
1318 case OMP_CLAUSE_DETACH:
1319 pp_string (pp, "detach(");
1320 dump_generic_node (pp, OMP_CLAUSE_DECL (clause), spc, flags,
1321 false);
1322 pp_right_paren (pp);
1323 break;
1325 default:
1326 gcc_unreachable ();
1331 /* Dump chain of OMP clauses.
1333 PP, SPC and FLAGS are as in dump_generic_node. */
1335 void
1336 dump_omp_clauses (pretty_printer *pp, tree clause, int spc, dump_flags_t flags,
1337 bool leading_space)
1339 while (clause)
1341 if (leading_space)
1342 pp_space (pp);
1343 dump_omp_clause (pp, clause, spc, flags);
1344 leading_space = true;
1346 clause = OMP_CLAUSE_CHAIN (clause);
1351 /* Dump location LOC to PP. */
1353 void
1354 dump_location (pretty_printer *pp, location_t loc)
1356 expanded_location xloc = expand_location (loc);
1358 pp_left_bracket (pp);
1359 if (xloc.file)
1361 pp_string (pp, xloc.file);
1362 pp_string (pp, ":");
1364 pp_decimal_int (pp, xloc.line);
1365 pp_colon (pp);
1366 pp_decimal_int (pp, xloc.column);
1367 pp_string (pp, "] ");
1371 /* Dump lexical block BLOCK. PP, SPC and FLAGS are as in
1372 dump_generic_node. */
1374 static void
1375 dump_block_node (pretty_printer *pp, tree block, int spc, dump_flags_t flags)
1377 tree t;
1379 pp_string (pp, "BLOCK #");
1380 pp_decimal_int (pp, BLOCK_NUMBER (block));
1381 pp_character (pp, ' ');
1383 if (flags & TDF_ADDRESS)
1385 pp_character (pp, '[');
1386 pp_scalar (pp, "%p", (void *) block);
1387 pp_string (pp, "] ");
1390 if (TREE_ASM_WRITTEN (block))
1391 pp_string (pp, "[written] ");
1393 if (flags & TDF_SLIM)
1394 return;
1396 if (BLOCK_SOURCE_LOCATION (block))
1397 dump_location (pp, BLOCK_SOURCE_LOCATION (block));
1399 newline_and_indent (pp, spc + 2);
1401 if (BLOCK_SUPERCONTEXT (block))
1403 pp_string (pp, "SUPERCONTEXT: ");
1404 dump_generic_node (pp, BLOCK_SUPERCONTEXT (block), 0,
1405 flags | TDF_SLIM, false);
1406 newline_and_indent (pp, spc + 2);
1409 if (BLOCK_SUBBLOCKS (block))
1411 pp_string (pp, "SUBBLOCKS: ");
1412 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
1414 dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1415 pp_space (pp);
1417 newline_and_indent (pp, spc + 2);
1420 if (BLOCK_CHAIN (block))
1422 pp_string (pp, "SIBLINGS: ");
1423 for (t = BLOCK_CHAIN (block); t; t = BLOCK_CHAIN (t))
1425 dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1426 pp_space (pp);
1428 newline_and_indent (pp, spc + 2);
1431 if (BLOCK_VARS (block))
1433 pp_string (pp, "VARS: ");
1434 for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
1436 dump_generic_node (pp, t, 0, flags, false);
1437 pp_space (pp);
1439 newline_and_indent (pp, spc + 2);
1442 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block)) > 0)
1444 unsigned i;
1445 vec<tree, va_gc> *nlv = BLOCK_NONLOCALIZED_VARS (block);
1447 pp_string (pp, "NONLOCALIZED_VARS: ");
1448 FOR_EACH_VEC_ELT (*nlv, i, t)
1450 dump_generic_node (pp, t, 0, flags, false);
1451 pp_space (pp);
1453 newline_and_indent (pp, spc + 2);
1456 if (BLOCK_ABSTRACT_ORIGIN (block))
1458 pp_string (pp, "ABSTRACT_ORIGIN: ");
1459 dump_generic_node (pp, BLOCK_ABSTRACT_ORIGIN (block), 0,
1460 flags | TDF_SLIM, false);
1461 newline_and_indent (pp, spc + 2);
1464 if (BLOCK_FRAGMENT_ORIGIN (block))
1466 pp_string (pp, "FRAGMENT_ORIGIN: ");
1467 dump_generic_node (pp, BLOCK_FRAGMENT_ORIGIN (block), 0,
1468 flags | TDF_SLIM, false);
1469 newline_and_indent (pp, spc + 2);
1472 if (BLOCK_FRAGMENT_CHAIN (block))
1474 pp_string (pp, "FRAGMENT_CHAIN: ");
1475 for (t = BLOCK_FRAGMENT_CHAIN (block); t; t = BLOCK_FRAGMENT_CHAIN (t))
1477 dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1478 pp_space (pp);
1480 newline_and_indent (pp, spc + 2);
1484 /* Dump #pragma omp atomic memory order clause. */
1486 void
1487 dump_omp_atomic_memory_order (pretty_printer *pp, enum omp_memory_order mo)
1489 switch (mo)
1491 case OMP_MEMORY_ORDER_RELAXED:
1492 pp_string (pp, " relaxed");
1493 break;
1494 case OMP_MEMORY_ORDER_SEQ_CST:
1495 pp_string (pp, " seq_cst");
1496 break;
1497 case OMP_MEMORY_ORDER_ACQ_REL:
1498 pp_string (pp, " acq_rel");
1499 break;
1500 case OMP_MEMORY_ORDER_ACQUIRE:
1501 pp_string (pp, " acquire");
1502 break;
1503 case OMP_MEMORY_ORDER_RELEASE:
1504 pp_string (pp, " release");
1505 break;
1506 case OMP_MEMORY_ORDER_UNSPECIFIED:
1507 break;
1508 default:
1509 gcc_unreachable ();
1513 /* Helper to dump a MEM_REF node. */
1515 static void
1516 dump_mem_ref (pretty_printer *pp, tree node, int spc, dump_flags_t flags)
1518 if (TREE_CODE (node) == MEM_REF && (flags & TDF_GIMPLE))
1520 pp_string (pp, "__MEM <");
1521 dump_generic_node (pp, TREE_TYPE (node),
1522 spc, flags | TDF_SLIM, false);
1523 if (TYPE_ALIGN (TREE_TYPE (node))
1524 != TYPE_ALIGN (TYPE_MAIN_VARIANT (TREE_TYPE (node))))
1526 pp_string (pp, ", ");
1527 pp_decimal_int (pp, TYPE_ALIGN (TREE_TYPE (node)));
1529 pp_greater (pp);
1530 pp_string (pp, " (");
1531 if (TREE_TYPE (TREE_OPERAND (node, 0))
1532 != TREE_TYPE (TREE_OPERAND (node, 1)))
1534 pp_left_paren (pp);
1535 dump_generic_node (pp, TREE_TYPE (TREE_OPERAND (node, 1)),
1536 spc, flags | TDF_SLIM, false);
1537 pp_right_paren (pp);
1539 dump_generic_node (pp, TREE_OPERAND (node, 0),
1540 spc, flags | TDF_SLIM, false);
1541 if (! integer_zerop (TREE_OPERAND (node, 1)))
1543 pp_string (pp, " + ");
1544 dump_generic_node (pp, TREE_OPERAND (node, 1),
1545 spc, flags | TDF_SLIM, false);
1547 pp_right_paren (pp);
1549 else if (TREE_CODE (node) == MEM_REF
1550 && integer_zerop (TREE_OPERAND (node, 1))
1551 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1552 infer them and MEM_ATTR caching will share MEM_REFs
1553 with differently-typed op0s. */
1554 && TREE_CODE (TREE_OPERAND (node, 0)) != INTEGER_CST
1555 /* Released SSA_NAMES have no TREE_TYPE. */
1556 && TREE_TYPE (TREE_OPERAND (node, 0)) != NULL_TREE
1557 /* Same pointer types, but ignoring POINTER_TYPE vs.
1558 REFERENCE_TYPE. */
1559 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 0)))
1560 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1))))
1561 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 0)))
1562 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 1))))
1563 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 0)))
1564 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 1))))
1565 /* Same value types ignoring qualifiers. */
1566 && (TYPE_MAIN_VARIANT (TREE_TYPE (node))
1567 == TYPE_MAIN_VARIANT
1568 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1)))))
1569 && (!(flags & TDF_ALIAS)
1570 || MR_DEPENDENCE_CLIQUE (node) == 0))
1572 if (TREE_CODE (TREE_OPERAND (node, 0)) != ADDR_EXPR)
1574 /* Enclose pointers to arrays in parentheses. */
1575 tree op0 = TREE_OPERAND (node, 0);
1576 tree op0type = TREE_TYPE (op0);
1577 if (POINTER_TYPE_P (op0type)
1578 && TREE_CODE (TREE_TYPE (op0type)) == ARRAY_TYPE)
1579 pp_left_paren (pp);
1580 pp_star (pp);
1581 dump_generic_node (pp, op0, spc, flags, false);
1582 if (POINTER_TYPE_P (op0type)
1583 && TREE_CODE (TREE_TYPE (op0type)) == ARRAY_TYPE)
1584 pp_right_paren (pp);
1586 else
1587 dump_generic_node (pp,
1588 TREE_OPERAND (TREE_OPERAND (node, 0), 0),
1589 spc, flags, false);
1591 else
1593 pp_string (pp, "MEM");
1595 tree nodetype = TREE_TYPE (node);
1596 tree op0 = TREE_OPERAND (node, 0);
1597 tree op1 = TREE_OPERAND (node, 1);
1598 tree op1type = TYPE_MAIN_VARIANT (TREE_TYPE (op1));
1600 tree op0size = TYPE_SIZE (nodetype);
1601 tree op1size = TYPE_SIZE (TREE_TYPE (op1type));
1603 if (!op0size || !op1size
1604 || !operand_equal_p (op0size, op1size, 0))
1606 pp_string (pp, " <");
1607 /* If the size of the type of the operand is not the same
1608 as the size of the MEM_REF expression include the type
1609 of the latter similar to the TDF_GIMPLE output to make
1610 it clear how many bytes of memory are being accessed. */
1611 dump_generic_node (pp, nodetype, spc, flags | TDF_SLIM, false);
1612 pp_string (pp, "> ");
1615 pp_string (pp, "[(");
1616 dump_generic_node (pp, op1type, spc, flags | TDF_SLIM, false);
1617 pp_right_paren (pp);
1618 dump_generic_node (pp, op0, spc, flags, false);
1619 if (!integer_zerop (op1))
1621 pp_string (pp, " + ");
1622 dump_generic_node (pp, op1, spc, flags, false);
1624 if (TREE_CODE (node) == TARGET_MEM_REF)
1626 tree tmp = TMR_INDEX2 (node);
1627 if (tmp)
1629 pp_string (pp, " + ");
1630 dump_generic_node (pp, tmp, spc, flags, false);
1632 tmp = TMR_INDEX (node);
1633 if (tmp)
1635 pp_string (pp, " + ");
1636 dump_generic_node (pp, tmp, spc, flags, false);
1637 tmp = TMR_STEP (node);
1638 pp_string (pp, " * ");
1639 if (tmp)
1640 dump_generic_node (pp, tmp, spc, flags, false);
1641 else
1642 pp_string (pp, "1");
1645 if ((flags & TDF_ALIAS)
1646 && MR_DEPENDENCE_CLIQUE (node) != 0)
1648 pp_string (pp, " clique ");
1649 pp_unsigned_wide_integer (pp, MR_DEPENDENCE_CLIQUE (node));
1650 pp_string (pp, " base ");
1651 pp_unsigned_wide_integer (pp, MR_DEPENDENCE_BASE (node));
1653 pp_right_bracket (pp);
1657 /* Helper function for dump_generic_node. Dump INIT or COND expression for
1658 OpenMP loop non-rectangular iterators. */
1660 void
1661 dump_omp_loop_non_rect_expr (pretty_printer *pp, tree node, int spc,
1662 dump_flags_t flags)
1664 gcc_assert (TREE_CODE (node) == TREE_VEC);
1665 dump_generic_node (pp, TREE_VEC_ELT (node, 0), spc, flags, false);
1666 pp_string (pp, " * ");
1667 if (op_prio (TREE_VEC_ELT (node, 1)) <= op_code_prio (MULT_EXPR))
1669 pp_left_paren (pp);
1670 dump_generic_node (pp, TREE_VEC_ELT (node, 1), spc, flags, false);
1671 pp_right_paren (pp);
1673 else
1674 dump_generic_node (pp, TREE_VEC_ELT (node, 1), spc, flags, false);
1675 pp_string (pp, " + ");
1676 if (op_prio (TREE_VEC_ELT (node, 1)) <= op_code_prio (PLUS_EXPR))
1678 pp_left_paren (pp);
1679 dump_generic_node (pp, TREE_VEC_ELT (node, 2), spc, flags, false);
1680 pp_right_paren (pp);
1682 else
1683 dump_generic_node (pp, TREE_VEC_ELT (node, 2), spc, flags, false);
1686 /* Dump the node NODE on the pretty_printer PP, SPC spaces of
1687 indent. FLAGS specifies details to show in the dump (see TDF_* in
1688 dumpfile.h). If IS_STMT is true, the object printed is considered
1689 to be a statement and it is terminated by ';' if appropriate. */
1692 dump_generic_node (pretty_printer *pp, tree node, int spc, dump_flags_t flags,
1693 bool is_stmt)
1695 tree type;
1696 tree op0, op1;
1697 const char *str;
1698 bool is_expr;
1699 enum tree_code code;
1701 if (node == NULL_TREE)
1702 return spc;
1704 is_expr = EXPR_P (node);
1706 if (is_stmt && (flags & TDF_STMTADDR))
1708 pp_string (pp, "<&");
1709 pp_scalar (pp, "%p", (void *)node);
1710 pp_string (pp, "> ");
1713 if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
1714 dump_location (pp, EXPR_LOCATION (node));
1716 code = TREE_CODE (node);
1717 switch (code)
1719 case ERROR_MARK:
1720 pp_string (pp, "<<< error >>>");
1721 break;
1723 case IDENTIFIER_NODE:
1724 pp_tree_identifier (pp, node);
1725 break;
1727 case TREE_LIST:
1728 while (node && node != error_mark_node)
1730 if (TREE_PURPOSE (node))
1732 dump_generic_node (pp, TREE_PURPOSE (node), spc, flags, false);
1733 pp_space (pp);
1735 dump_generic_node (pp, TREE_VALUE (node), spc, flags, false);
1736 node = TREE_CHAIN (node);
1737 if (node && TREE_CODE (node) == TREE_LIST)
1739 pp_comma (pp);
1740 pp_space (pp);
1743 break;
1745 case TREE_BINFO:
1746 dump_generic_node (pp, BINFO_TYPE (node), spc, flags, false);
1747 break;
1749 case TREE_VEC:
1751 size_t i;
1752 if (TREE_VEC_LENGTH (node) > 0)
1754 size_t len = TREE_VEC_LENGTH (node);
1755 for (i = 0; i < len - 1; i++)
1757 dump_generic_node (pp, TREE_VEC_ELT (node, i), spc, flags,
1758 false);
1759 pp_comma (pp);
1760 pp_space (pp);
1762 dump_generic_node (pp, TREE_VEC_ELT (node, len - 1), spc,
1763 flags, false);
1766 break;
1768 case VOID_TYPE:
1769 case INTEGER_TYPE:
1770 case REAL_TYPE:
1771 case FIXED_POINT_TYPE:
1772 case COMPLEX_TYPE:
1773 case VECTOR_TYPE:
1774 case ENUMERAL_TYPE:
1775 case BOOLEAN_TYPE:
1776 case OPAQUE_TYPE:
1778 unsigned int quals = TYPE_QUALS (node);
1779 enum tree_code_class tclass;
1781 if (quals & TYPE_QUAL_ATOMIC)
1782 pp_string (pp, "atomic ");
1783 if (quals & TYPE_QUAL_CONST)
1784 pp_string (pp, "const ");
1785 if (quals & TYPE_QUAL_VOLATILE)
1786 pp_string (pp, "volatile ");
1787 if (quals & TYPE_QUAL_RESTRICT)
1788 pp_string (pp, "restrict ");
1790 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
1792 pp_string (pp, "<address-space-");
1793 pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
1794 pp_string (pp, "> ");
1797 tclass = TREE_CODE_CLASS (TREE_CODE (node));
1799 if (tclass == tcc_declaration)
1801 if (DECL_NAME (node))
1802 dump_decl_name (pp, node, flags);
1803 else
1804 pp_string (pp, "<unnamed type decl>");
1806 else if (tclass == tcc_type)
1808 if (TYPE_NAME (node))
1810 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
1811 pp_tree_identifier (pp, TYPE_NAME (node));
1812 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
1813 && DECL_NAME (TYPE_NAME (node)))
1814 dump_decl_name (pp, TYPE_NAME (node), flags);
1815 else
1816 pp_string (pp, "<unnamed type>");
1818 else if (TREE_CODE (node) == VECTOR_TYPE)
1820 pp_string (pp, "vector");
1821 pp_left_paren (pp);
1822 pp_wide_integer (pp, TYPE_VECTOR_SUBPARTS (node));
1823 pp_string (pp, ") ");
1824 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
1826 else if (TREE_CODE (node) == INTEGER_TYPE)
1828 if (TYPE_PRECISION (node) == CHAR_TYPE_SIZE)
1829 pp_string (pp, (TYPE_UNSIGNED (node)
1830 ? "unsigned char"
1831 : "signed char"));
1832 else if (TYPE_PRECISION (node) == SHORT_TYPE_SIZE)
1833 pp_string (pp, (TYPE_UNSIGNED (node)
1834 ? "unsigned short"
1835 : "signed short"));
1836 else if (TYPE_PRECISION (node) == INT_TYPE_SIZE)
1837 pp_string (pp, (TYPE_UNSIGNED (node)
1838 ? "unsigned int"
1839 : "signed int"));
1840 else if (TYPE_PRECISION (node) == LONG_TYPE_SIZE)
1841 pp_string (pp, (TYPE_UNSIGNED (node)
1842 ? "unsigned long"
1843 : "signed long"));
1844 else if (TYPE_PRECISION (node) == LONG_LONG_TYPE_SIZE)
1845 pp_string (pp, (TYPE_UNSIGNED (node)
1846 ? "unsigned long long"
1847 : "signed long long"));
1848 else if (TYPE_PRECISION (node) >= CHAR_TYPE_SIZE
1849 && pow2p_hwi (TYPE_PRECISION (node)))
1851 pp_string (pp, (TYPE_UNSIGNED (node) ? "uint" : "int"));
1852 pp_decimal_int (pp, TYPE_PRECISION (node));
1853 pp_string (pp, "_t");
1855 else
1857 pp_string (pp, (TYPE_UNSIGNED (node)
1858 ? "<unnamed-unsigned:"
1859 : "<unnamed-signed:"));
1860 pp_decimal_int (pp, TYPE_PRECISION (node));
1861 pp_greater (pp);
1864 else if (TREE_CODE (node) == COMPLEX_TYPE)
1866 pp_string (pp, "__complex__ ");
1867 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
1869 else if (TREE_CODE (node) == REAL_TYPE)
1871 pp_string (pp, "<float:");
1872 pp_decimal_int (pp, TYPE_PRECISION (node));
1873 pp_greater (pp);
1875 else if (TREE_CODE (node) == FIXED_POINT_TYPE)
1877 pp_string (pp, "<fixed-point-");
1878 pp_string (pp, TYPE_SATURATING (node) ? "sat:" : "nonsat:");
1879 pp_decimal_int (pp, TYPE_PRECISION (node));
1880 pp_greater (pp);
1882 else if (TREE_CODE (node) == BOOLEAN_TYPE)
1884 pp_string (pp, (TYPE_UNSIGNED (node)
1885 ? "<unsigned-boolean:"
1886 : "<signed-boolean:"));
1887 pp_decimal_int (pp, TYPE_PRECISION (node));
1888 pp_greater (pp);
1890 else if (TREE_CODE (node) == VOID_TYPE)
1891 pp_string (pp, "void");
1892 else
1893 pp_string (pp, "<unnamed type>");
1895 break;
1898 case POINTER_TYPE:
1899 case REFERENCE_TYPE:
1900 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
1902 if (TREE_TYPE (node) == NULL)
1904 pp_string (pp, str);
1905 pp_string (pp, "<null type>");
1907 else if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
1909 tree fnode = TREE_TYPE (node);
1911 dump_generic_node (pp, TREE_TYPE (fnode), spc, flags, false);
1912 pp_space (pp);
1913 pp_left_paren (pp);
1914 pp_string (pp, str);
1915 if (TYPE_IDENTIFIER (node))
1916 dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
1917 else if (flags & TDF_NOUID)
1918 pp_string (pp, "<Txxxx>");
1919 else
1921 pp_string (pp, "<T");
1922 pp_scalar (pp, "%x", TYPE_UID (node));
1923 pp_character (pp, '>');
1926 pp_right_paren (pp);
1927 dump_function_declaration (pp, fnode, spc, flags);
1929 else
1931 unsigned int quals = TYPE_QUALS (node);
1933 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
1934 pp_space (pp);
1935 pp_string (pp, str);
1937 if (quals & TYPE_QUAL_CONST)
1938 pp_string (pp, " const");
1939 if (quals & TYPE_QUAL_VOLATILE)
1940 pp_string (pp, " volatile");
1941 if (quals & TYPE_QUAL_RESTRICT)
1942 pp_string (pp, " restrict");
1944 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
1946 pp_string (pp, " <address-space-");
1947 pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
1948 pp_greater (pp);
1951 if (TYPE_REF_CAN_ALIAS_ALL (node))
1952 pp_string (pp, " {ref-all}");
1954 break;
1956 case OFFSET_TYPE:
1957 NIY;
1958 break;
1960 case MEM_REF:
1961 case TARGET_MEM_REF:
1962 dump_mem_ref (pp, node, spc, flags);
1963 break;
1965 case ARRAY_TYPE:
1967 unsigned int quals = TYPE_QUALS (node);
1968 tree tmp;
1970 if (quals & TYPE_QUAL_ATOMIC)
1971 pp_string (pp, "atomic ");
1972 if (quals & TYPE_QUAL_CONST)
1973 pp_string (pp, "const ");
1974 if (quals & TYPE_QUAL_VOLATILE)
1975 pp_string (pp, "volatile ");
1977 /* Print the innermost component type. */
1978 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
1979 tmp = TREE_TYPE (tmp))
1981 dump_generic_node (pp, tmp, spc, flags, false);
1983 /* Print the dimensions. */
1984 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
1985 dump_array_domain (pp, TYPE_DOMAIN (tmp), spc, flags);
1986 break;
1989 case RECORD_TYPE:
1990 case UNION_TYPE:
1991 case QUAL_UNION_TYPE:
1993 unsigned int quals = TYPE_QUALS (node);
1995 if (quals & TYPE_QUAL_ATOMIC)
1996 pp_string (pp, "atomic ");
1997 if (quals & TYPE_QUAL_CONST)
1998 pp_string (pp, "const ");
1999 if (quals & TYPE_QUAL_VOLATILE)
2000 pp_string (pp, "volatile ");
2002 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
2004 pp_string (pp, "<address-space-");
2005 pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
2006 pp_string (pp, "> ");
2009 /* Print the name of the structure. */
2010 if (TREE_CODE (node) == RECORD_TYPE)
2011 pp_string (pp, "struct ");
2012 else if (TREE_CODE (node) == UNION_TYPE)
2013 pp_string (pp, "union ");
2015 if (TYPE_NAME (node))
2016 dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
2017 else if (!(flags & TDF_SLIM))
2018 /* FIXME: If we eliminate the 'else' above and attempt
2019 to show the fields for named types, we may get stuck
2020 following a cycle of pointers to structs. The alleged
2021 self-reference check in print_struct_decl will not detect
2022 cycles involving more than one pointer or struct type. */
2023 print_struct_decl (pp, node, spc, flags);
2024 break;
2027 case LANG_TYPE:
2028 NIY;
2029 break;
2031 case INTEGER_CST:
2032 if (flags & TDF_GIMPLE
2033 && (POINTER_TYPE_P (TREE_TYPE (node))
2034 || (TYPE_PRECISION (TREE_TYPE (node))
2035 < TYPE_PRECISION (integer_type_node))
2036 || exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1
2037 || tree_int_cst_sgn (node) < 0))
2039 pp_string (pp, "_Literal (");
2040 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2041 pp_string (pp, ") ");
2043 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE
2044 && ! (flags & TDF_GIMPLE))
2046 /* In the case of a pointer, one may want to divide by the
2047 size of the pointed-to type. Unfortunately, this not
2048 straightforward. The C front-end maps expressions
2050 (int *) 5
2051 int *p; (p + 5)
2053 in such a way that the two INTEGER_CST nodes for "5" have
2054 different values but identical types. In the latter
2055 case, the 5 is multiplied by sizeof (int) in c-common.c
2056 (pointer_int_sum) to convert it to a byte address, and
2057 yet the type of the node is left unchanged. Argh. What
2058 is consistent though is that the number value corresponds
2059 to bytes (UNITS) offset.
2061 NB: Neither of the following divisors can be trivially
2062 used to recover the original literal:
2064 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
2065 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
2066 pp_wide_integer (pp, TREE_INT_CST_LOW (node));
2067 pp_string (pp, "B"); /* pseudo-unit */
2069 else if (tree_fits_shwi_p (node))
2070 pp_wide_integer (pp, tree_to_shwi (node));
2071 else if (tree_fits_uhwi_p (node))
2072 pp_unsigned_wide_integer (pp, tree_to_uhwi (node));
2073 else
2075 wide_int val = wi::to_wide (node);
2077 if (wi::neg_p (val, TYPE_SIGN (TREE_TYPE (node))))
2079 pp_minus (pp);
2080 val = -val;
2082 print_hex (val, pp_buffer (pp)->digit_buffer);
2083 pp_string (pp, pp_buffer (pp)->digit_buffer);
2085 if ((flags & TDF_GIMPLE)
2086 && ! (POINTER_TYPE_P (TREE_TYPE (node))
2087 || (TYPE_PRECISION (TREE_TYPE (node))
2088 < TYPE_PRECISION (integer_type_node))
2089 || exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1))
2091 if (TYPE_UNSIGNED (TREE_TYPE (node)))
2092 pp_character (pp, 'u');
2093 if (TYPE_PRECISION (TREE_TYPE (node))
2094 == TYPE_PRECISION (unsigned_type_node))
2096 else if (TYPE_PRECISION (TREE_TYPE (node))
2097 == TYPE_PRECISION (long_unsigned_type_node))
2098 pp_character (pp, 'l');
2099 else if (TYPE_PRECISION (TREE_TYPE (node))
2100 == TYPE_PRECISION (long_long_unsigned_type_node))
2101 pp_string (pp, "ll");
2103 if (TREE_OVERFLOW (node))
2104 pp_string (pp, "(OVF)");
2105 break;
2107 case POLY_INT_CST:
2108 pp_string (pp, "POLY_INT_CST [");
2109 dump_generic_node (pp, POLY_INT_CST_COEFF (node, 0), spc, flags, false);
2110 for (unsigned int i = 1; i < NUM_POLY_INT_COEFFS; ++i)
2112 pp_string (pp, ", ");
2113 dump_generic_node (pp, POLY_INT_CST_COEFF (node, i),
2114 spc, flags, false);
2116 pp_string (pp, "]");
2117 break;
2119 case REAL_CST:
2120 /* Code copied from print_node. */
2122 REAL_VALUE_TYPE d;
2123 if (TREE_OVERFLOW (node))
2124 pp_string (pp, " overflow");
2126 d = TREE_REAL_CST (node);
2127 if (REAL_VALUE_ISINF (d))
2128 pp_string (pp, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
2129 else if (REAL_VALUE_ISNAN (d))
2130 pp_string (pp, " Nan");
2131 else
2133 char string[100];
2134 real_to_decimal (string, &d, sizeof (string), 0, 1);
2135 pp_string (pp, string);
2137 break;
2140 case FIXED_CST:
2142 char string[100];
2143 fixed_to_decimal (string, TREE_FIXED_CST_PTR (node), sizeof (string));
2144 pp_string (pp, string);
2145 break;
2148 case COMPLEX_CST:
2149 pp_string (pp, "__complex__ (");
2150 dump_generic_node (pp, TREE_REALPART (node), spc, flags, false);
2151 pp_string (pp, ", ");
2152 dump_generic_node (pp, TREE_IMAGPART (node), spc, flags, false);
2153 pp_right_paren (pp);
2154 break;
2156 case STRING_CST:
2158 pp_string (pp, "\"");
2159 if (unsigned nbytes = TREE_STRING_LENGTH (node))
2160 pretty_print_string (pp, TREE_STRING_POINTER (node), nbytes);
2161 pp_string (pp, "\"");
2162 break;
2165 case VECTOR_CST:
2167 unsigned i;
2168 if (flags & TDF_GIMPLE)
2170 pp_string (pp, "_Literal (");
2171 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2172 pp_string (pp, ") ");
2174 pp_string (pp, "{ ");
2175 unsigned HOST_WIDE_INT nunits;
2176 if (!VECTOR_CST_NELTS (node).is_constant (&nunits))
2177 nunits = vector_cst_encoded_nelts (node);
2178 for (i = 0; i < nunits; ++i)
2180 if (i != 0)
2181 pp_string (pp, ", ");
2182 dump_generic_node (pp, VECTOR_CST_ELT (node, i),
2183 spc, flags, false);
2185 if (!VECTOR_CST_NELTS (node).is_constant ())
2186 pp_string (pp, ", ...");
2187 pp_string (pp, " }");
2189 break;
2191 case FUNCTION_TYPE:
2192 case METHOD_TYPE:
2193 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2194 pp_space (pp);
2195 if (TREE_CODE (node) == METHOD_TYPE)
2197 if (TYPE_METHOD_BASETYPE (node))
2198 dump_generic_node (pp, TYPE_NAME (TYPE_METHOD_BASETYPE (node)),
2199 spc, flags, false);
2200 else
2201 pp_string (pp, "<null method basetype>");
2202 pp_colon_colon (pp);
2204 if (TYPE_IDENTIFIER (node))
2205 dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
2206 else if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
2207 dump_decl_name (pp, TYPE_NAME (node), flags);
2208 else if (flags & TDF_NOUID)
2209 pp_string (pp, "<Txxxx>");
2210 else
2212 pp_string (pp, "<T");
2213 pp_scalar (pp, "%x", TYPE_UID (node));
2214 pp_character (pp, '>');
2216 dump_function_declaration (pp, node, spc, flags);
2217 break;
2219 case FUNCTION_DECL:
2220 case CONST_DECL:
2221 dump_decl_name (pp, node, flags);
2222 break;
2224 case LABEL_DECL:
2225 if (DECL_NAME (node))
2226 dump_decl_name (pp, node, flags);
2227 else if (LABEL_DECL_UID (node) != -1)
2229 if (flags & TDF_GIMPLE)
2231 pp_character (pp, 'L');
2232 pp_decimal_int (pp, (int) LABEL_DECL_UID (node));
2234 else
2236 pp_string (pp, "<L");
2237 pp_decimal_int (pp, (int) LABEL_DECL_UID (node));
2238 pp_character (pp, '>');
2241 else
2243 if (flags & TDF_NOUID)
2244 pp_string (pp, "<D.xxxx>");
2245 else
2247 if (flags & TDF_GIMPLE)
2249 pp_character (pp, 'D');
2250 pp_scalar (pp, "%u", DECL_UID (node));
2252 else
2254 pp_string (pp, "<D.");
2255 pp_scalar (pp, "%u", DECL_UID (node));
2256 pp_character (pp, '>');
2260 break;
2262 case TYPE_DECL:
2263 if (DECL_IS_UNDECLARED_BUILTIN (node))
2265 /* Don't print the declaration of built-in types. */
2266 break;
2268 if (DECL_NAME (node))
2269 dump_decl_name (pp, node, flags);
2270 else if (TYPE_NAME (TREE_TYPE (node)) != node)
2272 pp_string (pp, (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
2273 ? "union" : "struct "));
2274 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2276 else
2277 pp_string (pp, "<anon>");
2278 break;
2280 case VAR_DECL:
2281 case PARM_DECL:
2282 case FIELD_DECL:
2283 case DEBUG_EXPR_DECL:
2284 case NAMESPACE_DECL:
2285 case NAMELIST_DECL:
2286 dump_decl_name (pp, node, flags);
2287 break;
2289 case RESULT_DECL:
2290 pp_string (pp, "<retval>");
2291 break;
2293 case COMPONENT_REF:
2294 op0 = TREE_OPERAND (node, 0);
2295 str = ".";
2296 if (op0
2297 && (TREE_CODE (op0) == INDIRECT_REF
2298 || (TREE_CODE (op0) == MEM_REF
2299 && TREE_CODE (TREE_OPERAND (op0, 0)) != ADDR_EXPR
2300 && integer_zerop (TREE_OPERAND (op0, 1))
2301 /* Dump the types of INTEGER_CSTs explicitly, for we
2302 can't infer them and MEM_ATTR caching will share
2303 MEM_REFs with differently-typed op0s. */
2304 && TREE_CODE (TREE_OPERAND (op0, 0)) != INTEGER_CST
2305 /* Released SSA_NAMES have no TREE_TYPE. */
2306 && TREE_TYPE (TREE_OPERAND (op0, 0)) != NULL_TREE
2307 /* Same pointer types, but ignoring POINTER_TYPE vs.
2308 REFERENCE_TYPE. */
2309 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 0)))
2310 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1))))
2311 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 0)))
2312 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 1))))
2313 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 0)))
2314 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 1))))
2315 /* Same value types ignoring qualifiers. */
2316 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0))
2317 == TYPE_MAIN_VARIANT
2318 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1)))))
2319 && MR_DEPENDENCE_CLIQUE (op0) == 0)))
2321 op0 = TREE_OPERAND (op0, 0);
2322 str = "->";
2324 if (op_prio (op0) < op_prio (node))
2325 pp_left_paren (pp);
2326 dump_generic_node (pp, op0, spc, flags, false);
2327 if (op_prio (op0) < op_prio (node))
2328 pp_right_paren (pp);
2329 pp_string (pp, str);
2330 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2331 op0 = component_ref_field_offset (node);
2332 if (op0 && TREE_CODE (op0) != INTEGER_CST)
2334 pp_string (pp, "{off: ");
2335 dump_generic_node (pp, op0, spc, flags, false);
2336 pp_right_brace (pp);
2338 break;
2340 case BIT_FIELD_REF:
2341 if (flags & TDF_GIMPLE)
2343 pp_string (pp, "__BIT_FIELD_REF <");
2344 dump_generic_node (pp, TREE_TYPE (node),
2345 spc, flags | TDF_SLIM, false);
2346 if (TYPE_ALIGN (TREE_TYPE (node))
2347 != TYPE_ALIGN (TYPE_MAIN_VARIANT (TREE_TYPE (node))))
2349 pp_string (pp, ", ");
2350 pp_decimal_int (pp, TYPE_ALIGN (TREE_TYPE (node)));
2352 pp_greater (pp);
2353 pp_string (pp, " (");
2354 dump_generic_node (pp, TREE_OPERAND (node, 0), spc,
2355 flags | TDF_SLIM, false);
2356 pp_string (pp, ", ");
2357 dump_generic_node (pp, TREE_OPERAND (node, 1), spc,
2358 flags | TDF_SLIM, false);
2359 pp_string (pp, ", ");
2360 dump_generic_node (pp, TREE_OPERAND (node, 2), spc,
2361 flags | TDF_SLIM, false);
2362 pp_right_paren (pp);
2364 else
2366 pp_string (pp, "BIT_FIELD_REF <");
2367 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2368 pp_string (pp, ", ");
2369 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2370 pp_string (pp, ", ");
2371 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2372 pp_greater (pp);
2374 break;
2376 case BIT_INSERT_EXPR:
2377 pp_string (pp, "BIT_INSERT_EXPR <");
2378 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2379 pp_string (pp, ", ");
2380 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2381 pp_string (pp, ", ");
2382 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2383 pp_string (pp, " (");
2384 if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (node, 1))))
2385 pp_decimal_int (pp,
2386 TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (node, 1))));
2387 else
2388 dump_generic_node (pp, TYPE_SIZE (TREE_TYPE (TREE_OPERAND (node, 1))),
2389 spc, flags, false);
2390 pp_string (pp, " bits)>");
2391 break;
2393 case ARRAY_REF:
2394 case ARRAY_RANGE_REF:
2395 op0 = TREE_OPERAND (node, 0);
2396 if (op_prio (op0) < op_prio (node))
2397 pp_left_paren (pp);
2398 dump_generic_node (pp, op0, spc, flags, false);
2399 if (op_prio (op0) < op_prio (node))
2400 pp_right_paren (pp);
2401 pp_left_bracket (pp);
2402 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2403 if (TREE_CODE (node) == ARRAY_RANGE_REF)
2404 pp_string (pp, " ...");
2405 pp_right_bracket (pp);
2407 op0 = array_ref_low_bound (node);
2408 op1 = array_ref_element_size (node);
2410 if (!integer_zerop (op0)
2411 || TREE_OPERAND (node, 2)
2412 || TREE_OPERAND (node, 3))
2414 pp_string (pp, "{lb: ");
2415 dump_generic_node (pp, op0, spc, flags, false);
2416 pp_string (pp, " sz: ");
2417 dump_generic_node (pp, op1, spc, flags, false);
2418 pp_right_brace (pp);
2420 break;
2422 case CONSTRUCTOR:
2424 unsigned HOST_WIDE_INT ix;
2425 tree field, val;
2426 bool is_struct_init = false;
2427 bool is_array_init = false;
2428 widest_int curidx;
2429 if (flags & TDF_GIMPLE)
2431 pp_string (pp, "_Literal (");
2432 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2433 pp_string (pp, ") ");
2435 pp_left_brace (pp);
2436 if (TREE_CLOBBER_P (node))
2437 pp_string (pp, "CLOBBER");
2438 else if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
2439 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
2440 is_struct_init = true;
2441 else if (TREE_CODE (TREE_TYPE (node)) == ARRAY_TYPE
2442 && TYPE_DOMAIN (TREE_TYPE (node))
2443 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)))
2444 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node))))
2445 == INTEGER_CST)
2447 tree minv = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)));
2448 is_array_init = true;
2449 curidx = wi::to_widest (minv);
2451 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
2453 if (field)
2455 if (is_struct_init)
2457 pp_dot (pp);
2458 dump_generic_node (pp, field, spc, flags, false);
2459 pp_equal (pp);
2461 else if (is_array_init
2462 && (TREE_CODE (field) != INTEGER_CST
2463 || curidx != wi::to_widest (field)))
2465 pp_left_bracket (pp);
2466 if (TREE_CODE (field) == RANGE_EXPR)
2468 dump_generic_node (pp, TREE_OPERAND (field, 0), spc,
2469 flags, false);
2470 pp_string (pp, " ... ");
2471 dump_generic_node (pp, TREE_OPERAND (field, 1), spc,
2472 flags, false);
2473 if (TREE_CODE (TREE_OPERAND (field, 1)) == INTEGER_CST)
2474 curidx = wi::to_widest (TREE_OPERAND (field, 1));
2476 else
2477 dump_generic_node (pp, field, spc, flags, false);
2478 if (TREE_CODE (field) == INTEGER_CST)
2479 curidx = wi::to_widest (field);
2480 pp_string (pp, "]=");
2483 if (is_array_init)
2484 curidx += 1;
2485 if (val && TREE_CODE (val) == ADDR_EXPR)
2486 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
2487 val = TREE_OPERAND (val, 0);
2488 if (val && TREE_CODE (val) == FUNCTION_DECL)
2489 dump_decl_name (pp, val, flags);
2490 else
2491 dump_generic_node (pp, val, spc, flags, false);
2492 if (ix != CONSTRUCTOR_NELTS (node) - 1)
2494 pp_comma (pp);
2495 pp_space (pp);
2498 pp_right_brace (pp);
2500 break;
2502 case COMPOUND_EXPR:
2504 tree *tp;
2505 if (flags & TDF_SLIM)
2507 pp_string (pp, "<COMPOUND_EXPR>");
2508 break;
2511 dump_generic_node (pp, TREE_OPERAND (node, 0),
2512 spc, flags, !(flags & TDF_SLIM));
2513 if (flags & TDF_SLIM)
2514 newline_and_indent (pp, spc);
2515 else
2517 pp_comma (pp);
2518 pp_space (pp);
2521 for (tp = &TREE_OPERAND (node, 1);
2522 TREE_CODE (*tp) == COMPOUND_EXPR;
2523 tp = &TREE_OPERAND (*tp, 1))
2525 dump_generic_node (pp, TREE_OPERAND (*tp, 0),
2526 spc, flags, !(flags & TDF_SLIM));
2527 if (flags & TDF_SLIM)
2528 newline_and_indent (pp, spc);
2529 else
2531 pp_comma (pp);
2532 pp_space (pp);
2536 dump_generic_node (pp, *tp, spc, flags, !(flags & TDF_SLIM));
2538 break;
2540 case STATEMENT_LIST:
2542 tree_stmt_iterator si;
2543 bool first = true;
2545 if (flags & TDF_SLIM)
2547 pp_string (pp, "<STATEMENT_LIST>");
2548 break;
2551 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
2553 if (!first)
2554 newline_and_indent (pp, spc);
2555 else
2556 first = false;
2557 dump_generic_node (pp, tsi_stmt (si), spc, flags, true);
2560 break;
2562 case MODIFY_EXPR:
2563 case INIT_EXPR:
2564 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags,
2565 false);
2566 pp_space (pp);
2567 pp_equal (pp);
2568 pp_space (pp);
2569 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags,
2570 false);
2571 break;
2573 case TARGET_EXPR:
2574 pp_string (pp, "TARGET_EXPR <");
2575 dump_generic_node (pp, TARGET_EXPR_SLOT (node), spc, flags, false);
2576 pp_comma (pp);
2577 pp_space (pp);
2578 dump_generic_node (pp, TARGET_EXPR_INITIAL (node), spc, flags, false);
2579 pp_greater (pp);
2580 break;
2582 case DECL_EXPR:
2583 print_declaration (pp, DECL_EXPR_DECL (node), spc, flags);
2584 is_stmt = false;
2585 break;
2587 case COND_EXPR:
2588 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
2590 pp_string (pp, "if (");
2591 dump_generic_node (pp, COND_EXPR_COND (node), spc, flags, false);
2592 pp_right_paren (pp);
2593 /* The lowered cond_exprs should always be printed in full. */
2594 if (COND_EXPR_THEN (node)
2595 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
2596 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
2597 && COND_EXPR_ELSE (node)
2598 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
2599 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
2601 pp_space (pp);
2602 dump_generic_node (pp, COND_EXPR_THEN (node),
2603 0, flags, true);
2604 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
2606 pp_string (pp, " else ");
2607 dump_generic_node (pp, COND_EXPR_ELSE (node),
2608 0, flags, true);
2611 else if (!(flags & TDF_SLIM))
2613 /* Output COND_EXPR_THEN. */
2614 if (COND_EXPR_THEN (node))
2616 newline_and_indent (pp, spc+2);
2617 pp_left_brace (pp);
2618 newline_and_indent (pp, spc+4);
2619 dump_generic_node (pp, COND_EXPR_THEN (node), spc+4,
2620 flags, true);
2621 newline_and_indent (pp, spc+2);
2622 pp_right_brace (pp);
2625 /* Output COND_EXPR_ELSE. */
2626 if (COND_EXPR_ELSE (node)
2627 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
2629 newline_and_indent (pp, spc);
2630 pp_string (pp, "else");
2631 newline_and_indent (pp, spc+2);
2632 pp_left_brace (pp);
2633 newline_and_indent (pp, spc+4);
2634 dump_generic_node (pp, COND_EXPR_ELSE (node), spc+4,
2635 flags, true);
2636 newline_and_indent (pp, spc+2);
2637 pp_right_brace (pp);
2640 is_expr = false;
2642 else
2644 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2645 pp_space (pp);
2646 pp_question (pp);
2647 pp_space (pp);
2648 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2649 pp_space (pp);
2650 pp_colon (pp);
2651 pp_space (pp);
2652 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2654 break;
2656 case BIND_EXPR:
2657 pp_left_brace (pp);
2658 if (!(flags & TDF_SLIM))
2660 if (BIND_EXPR_VARS (node))
2662 pp_newline (pp);
2664 for (op0 = BIND_EXPR_VARS (node); op0; op0 = DECL_CHAIN (op0))
2666 print_declaration (pp, op0, spc+2, flags);
2667 pp_newline (pp);
2671 newline_and_indent (pp, spc+2);
2672 dump_generic_node (pp, BIND_EXPR_BODY (node), spc+2, flags, true);
2673 newline_and_indent (pp, spc);
2674 pp_right_brace (pp);
2676 is_expr = false;
2677 break;
2679 case CALL_EXPR:
2680 if (CALL_EXPR_FN (node) != NULL_TREE)
2681 print_call_name (pp, CALL_EXPR_FN (node), flags);
2682 else
2684 pp_dot (pp);
2685 pp_string (pp, internal_fn_name (CALL_EXPR_IFN (node)));
2688 /* Print parameters. */
2689 pp_space (pp);
2690 pp_left_paren (pp);
2692 tree arg;
2693 call_expr_arg_iterator iter;
2694 FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
2696 dump_generic_node (pp, arg, spc, flags, false);
2697 if (more_call_expr_args_p (&iter))
2699 pp_comma (pp);
2700 pp_space (pp);
2704 if (CALL_EXPR_VA_ARG_PACK (node))
2706 if (call_expr_nargs (node) > 0)
2708 pp_comma (pp);
2709 pp_space (pp);
2711 pp_string (pp, "__builtin_va_arg_pack ()");
2713 pp_right_paren (pp);
2715 op1 = CALL_EXPR_STATIC_CHAIN (node);
2716 if (op1)
2718 pp_string (pp, " [static-chain: ");
2719 dump_generic_node (pp, op1, spc, flags, false);
2720 pp_right_bracket (pp);
2723 if (CALL_EXPR_RETURN_SLOT_OPT (node))
2724 pp_string (pp, " [return slot optimization]");
2725 if (CALL_EXPR_TAILCALL (node))
2726 pp_string (pp, " [tail call]");
2727 break;
2729 case WITH_CLEANUP_EXPR:
2730 NIY;
2731 break;
2733 case CLEANUP_POINT_EXPR:
2734 pp_string (pp, "<<cleanup_point ");
2735 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2736 pp_string (pp, ">>");
2737 break;
2739 case PLACEHOLDER_EXPR:
2740 pp_string (pp, "<PLACEHOLDER_EXPR ");
2741 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2742 pp_greater (pp);
2743 break;
2745 /* Binary arithmetic and logic expressions. */
2746 case WIDEN_PLUS_EXPR:
2747 case WIDEN_MINUS_EXPR:
2748 case WIDEN_SUM_EXPR:
2749 case WIDEN_MULT_EXPR:
2750 case MULT_EXPR:
2751 case MULT_HIGHPART_EXPR:
2752 case PLUS_EXPR:
2753 case POINTER_PLUS_EXPR:
2754 case POINTER_DIFF_EXPR:
2755 case MINUS_EXPR:
2756 case TRUNC_DIV_EXPR:
2757 case CEIL_DIV_EXPR:
2758 case FLOOR_DIV_EXPR:
2759 case ROUND_DIV_EXPR:
2760 case TRUNC_MOD_EXPR:
2761 case CEIL_MOD_EXPR:
2762 case FLOOR_MOD_EXPR:
2763 case ROUND_MOD_EXPR:
2764 case RDIV_EXPR:
2765 case EXACT_DIV_EXPR:
2766 case LSHIFT_EXPR:
2767 case RSHIFT_EXPR:
2768 case LROTATE_EXPR:
2769 case RROTATE_EXPR:
2770 case WIDEN_LSHIFT_EXPR:
2771 case BIT_IOR_EXPR:
2772 case BIT_XOR_EXPR:
2773 case BIT_AND_EXPR:
2774 case TRUTH_ANDIF_EXPR:
2775 case TRUTH_ORIF_EXPR:
2776 case TRUTH_AND_EXPR:
2777 case TRUTH_OR_EXPR:
2778 case TRUTH_XOR_EXPR:
2779 case LT_EXPR:
2780 case LE_EXPR:
2781 case GT_EXPR:
2782 case GE_EXPR:
2783 case EQ_EXPR:
2784 case NE_EXPR:
2785 case UNLT_EXPR:
2786 case UNLE_EXPR:
2787 case UNGT_EXPR:
2788 case UNGE_EXPR:
2789 case UNEQ_EXPR:
2790 case LTGT_EXPR:
2791 case ORDERED_EXPR:
2792 case UNORDERED_EXPR:
2794 const char *op = op_symbol (node);
2795 op0 = TREE_OPERAND (node, 0);
2796 op1 = TREE_OPERAND (node, 1);
2798 /* When the operands are expressions with less priority,
2799 keep semantics of the tree representation. */
2800 if (op_prio (op0) <= op_prio (node))
2802 pp_left_paren (pp);
2803 dump_generic_node (pp, op0, spc, flags, false);
2804 pp_right_paren (pp);
2806 else
2807 dump_generic_node (pp, op0, spc, flags, false);
2809 pp_space (pp);
2810 pp_string (pp, op);
2811 pp_space (pp);
2813 /* When the operands are expressions with less priority,
2814 keep semantics of the tree representation. */
2815 if (op_prio (op1) <= op_prio (node))
2817 pp_left_paren (pp);
2818 dump_generic_node (pp, op1, spc, flags, false);
2819 pp_right_paren (pp);
2821 else
2822 dump_generic_node (pp, op1, spc, flags, false);
2824 break;
2826 /* Unary arithmetic and logic expressions. */
2827 case NEGATE_EXPR:
2828 case BIT_NOT_EXPR:
2829 case TRUTH_NOT_EXPR:
2830 case ADDR_EXPR:
2831 case PREDECREMENT_EXPR:
2832 case PREINCREMENT_EXPR:
2833 case INDIRECT_REF:
2834 if (TREE_CODE (node) == ADDR_EXPR
2835 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
2836 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
2837 ; /* Do not output '&' for strings and function pointers. */
2838 else
2839 pp_string (pp, op_symbol (node));
2841 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
2843 pp_left_paren (pp);
2844 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2845 pp_right_paren (pp);
2847 else
2848 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2849 break;
2851 case POSTDECREMENT_EXPR:
2852 case POSTINCREMENT_EXPR:
2853 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
2855 pp_left_paren (pp);
2856 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2857 pp_right_paren (pp);
2859 else
2860 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2861 pp_string (pp, op_symbol (node));
2862 break;
2864 case MIN_EXPR:
2865 pp_string (pp, "MIN_EXPR <");
2866 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2867 pp_string (pp, ", ");
2868 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2869 pp_greater (pp);
2870 break;
2872 case MAX_EXPR:
2873 pp_string (pp, "MAX_EXPR <");
2874 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2875 pp_string (pp, ", ");
2876 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2877 pp_greater (pp);
2878 break;
2880 case ABS_EXPR:
2881 pp_string (pp, "ABS_EXPR <");
2882 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2883 pp_greater (pp);
2884 break;
2886 case ABSU_EXPR:
2887 pp_string (pp, "ABSU_EXPR <");
2888 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2889 pp_greater (pp);
2890 break;
2892 case RANGE_EXPR:
2893 NIY;
2894 break;
2896 case ADDR_SPACE_CONVERT_EXPR:
2897 case FIXED_CONVERT_EXPR:
2898 case FIX_TRUNC_EXPR:
2899 case FLOAT_EXPR:
2900 CASE_CONVERT:
2901 type = TREE_TYPE (node);
2902 op0 = TREE_OPERAND (node, 0);
2903 if (type != TREE_TYPE (op0))
2905 pp_left_paren (pp);
2906 dump_generic_node (pp, type, spc, flags, false);
2907 pp_string (pp, ") ");
2909 if (op_prio (op0) < op_prio (node))
2910 pp_left_paren (pp);
2911 dump_generic_node (pp, op0, spc, flags, false);
2912 if (op_prio (op0) < op_prio (node))
2913 pp_right_paren (pp);
2914 break;
2916 case VIEW_CONVERT_EXPR:
2917 if (flags & TDF_GIMPLE)
2918 pp_string (pp, "__VIEW_CONVERT <");
2919 else
2920 pp_string (pp, "VIEW_CONVERT_EXPR<");
2921 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2922 pp_string (pp, ">(");
2923 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2924 pp_right_paren (pp);
2925 break;
2927 case PAREN_EXPR:
2928 pp_string (pp, "((");
2929 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2930 pp_string (pp, "))");
2931 break;
2933 case NON_LVALUE_EXPR:
2934 pp_string (pp, "NON_LVALUE_EXPR <");
2935 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2936 pp_greater (pp);
2937 break;
2939 case SAVE_EXPR:
2940 pp_string (pp, "SAVE_EXPR <");
2941 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2942 pp_greater (pp);
2943 break;
2945 case COMPLEX_EXPR:
2946 pp_string (pp, "COMPLEX_EXPR <");
2947 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2948 pp_string (pp, ", ");
2949 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2950 pp_greater (pp);
2951 break;
2953 case CONJ_EXPR:
2954 pp_string (pp, "CONJ_EXPR <");
2955 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2956 pp_greater (pp);
2957 break;
2959 case REALPART_EXPR:
2960 if (flags & TDF_GIMPLE)
2962 pp_string (pp, "__real ");
2963 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2965 else
2967 pp_string (pp, "REALPART_EXPR <");
2968 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2969 pp_greater (pp);
2971 break;
2973 case IMAGPART_EXPR:
2974 if (flags & TDF_GIMPLE)
2976 pp_string (pp, "__imag ");
2977 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2979 else
2981 pp_string (pp, "IMAGPART_EXPR <");
2982 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2983 pp_greater (pp);
2985 break;
2987 case VA_ARG_EXPR:
2988 pp_string (pp, "VA_ARG_EXPR <");
2989 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2990 pp_greater (pp);
2991 break;
2993 case TRY_FINALLY_EXPR:
2994 case TRY_CATCH_EXPR:
2995 pp_string (pp, "try");
2996 newline_and_indent (pp, spc+2);
2997 pp_left_brace (pp);
2998 newline_and_indent (pp, spc+4);
2999 dump_generic_node (pp, TREE_OPERAND (node, 0), spc+4, flags, true);
3000 newline_and_indent (pp, spc+2);
3001 pp_right_brace (pp);
3002 newline_and_indent (pp, spc);
3003 if (TREE_CODE (node) == TRY_CATCH_EXPR)
3005 node = TREE_OPERAND (node, 1);
3006 pp_string (pp, "catch");
3008 else
3010 gcc_assert (TREE_CODE (node) == TRY_FINALLY_EXPR);
3011 node = TREE_OPERAND (node, 1);
3012 pp_string (pp, "finally");
3013 if (TREE_CODE (node) == EH_ELSE_EXPR)
3015 newline_and_indent (pp, spc+2);
3016 pp_left_brace (pp);
3017 newline_and_indent (pp, spc+4);
3018 dump_generic_node (pp, TREE_OPERAND (node, 0), spc+4,
3019 flags, true);
3020 newline_and_indent (pp, spc+2);
3021 pp_right_brace (pp);
3022 newline_and_indent (pp, spc);
3023 node = TREE_OPERAND (node, 1);
3024 pp_string (pp, "else");
3027 newline_and_indent (pp, spc+2);
3028 pp_left_brace (pp);
3029 newline_and_indent (pp, spc+4);
3030 dump_generic_node (pp, node, spc+4, flags, true);
3031 newline_and_indent (pp, spc+2);
3032 pp_right_brace (pp);
3033 is_expr = false;
3034 break;
3036 case CATCH_EXPR:
3037 pp_string (pp, "catch (");
3038 dump_generic_node (pp, CATCH_TYPES (node), spc+2, flags, false);
3039 pp_right_paren (pp);
3040 newline_and_indent (pp, spc+2);
3041 pp_left_brace (pp);
3042 newline_and_indent (pp, spc+4);
3043 dump_generic_node (pp, CATCH_BODY (node), spc+4, flags, true);
3044 newline_and_indent (pp, spc+2);
3045 pp_right_brace (pp);
3046 is_expr = false;
3047 break;
3049 case EH_FILTER_EXPR:
3050 pp_string (pp, "<<<eh_filter (");
3051 dump_generic_node (pp, EH_FILTER_TYPES (node), spc+2, flags, false);
3052 pp_string (pp, ")>>>");
3053 newline_and_indent (pp, spc+2);
3054 pp_left_brace (pp);
3055 newline_and_indent (pp, spc+4);
3056 dump_generic_node (pp, EH_FILTER_FAILURE (node), spc+4, flags, true);
3057 newline_and_indent (pp, spc+2);
3058 pp_right_brace (pp);
3059 is_expr = false;
3060 break;
3062 case LABEL_EXPR:
3063 op0 = TREE_OPERAND (node, 0);
3064 /* If this is for break or continue, don't bother printing it. */
3065 if (DECL_NAME (op0))
3067 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
3068 if (strcmp (name, "break") == 0
3069 || strcmp (name, "continue") == 0)
3070 break;
3072 dump_generic_node (pp, op0, spc, flags, false);
3073 pp_colon (pp);
3074 if (DECL_NONLOCAL (op0))
3075 pp_string (pp, " [non-local]");
3076 break;
3078 case LOOP_EXPR:
3079 pp_string (pp, "while (1)");
3080 if (!(flags & TDF_SLIM))
3082 newline_and_indent (pp, spc+2);
3083 pp_left_brace (pp);
3084 newline_and_indent (pp, spc+4);
3085 dump_generic_node (pp, LOOP_EXPR_BODY (node), spc+4, flags, true);
3086 newline_and_indent (pp, spc+2);
3087 pp_right_brace (pp);
3089 is_expr = false;
3090 break;
3092 case PREDICT_EXPR:
3093 pp_string (pp, "// predicted ");
3094 if (PREDICT_EXPR_OUTCOME (node))
3095 pp_string (pp, "likely by ");
3096 else
3097 pp_string (pp, "unlikely by ");
3098 pp_string (pp, predictor_name (PREDICT_EXPR_PREDICTOR (node)));
3099 pp_string (pp, " predictor.");
3100 break;
3102 case ANNOTATE_EXPR:
3103 pp_string (pp, "ANNOTATE_EXPR <");
3104 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3105 switch ((enum annot_expr_kind) TREE_INT_CST_LOW (TREE_OPERAND (node, 1)))
3107 case annot_expr_ivdep_kind:
3108 pp_string (pp, ", ivdep");
3109 break;
3110 case annot_expr_unroll_kind:
3112 pp_string (pp, ", unroll ");
3113 pp_decimal_int (pp,
3114 (int) TREE_INT_CST_LOW (TREE_OPERAND (node, 2)));
3115 break;
3117 case annot_expr_no_vector_kind:
3118 pp_string (pp, ", no-vector");
3119 break;
3120 case annot_expr_vector_kind:
3121 pp_string (pp, ", vector");
3122 break;
3123 case annot_expr_parallel_kind:
3124 pp_string (pp, ", parallel");
3125 break;
3126 default:
3127 gcc_unreachable ();
3129 pp_greater (pp);
3130 break;
3132 case RETURN_EXPR:
3133 pp_string (pp, "return");
3134 op0 = TREE_OPERAND (node, 0);
3135 if (op0)
3137 pp_space (pp);
3138 if (TREE_CODE (op0) == MODIFY_EXPR)
3139 dump_generic_node (pp, TREE_OPERAND (op0, 1),
3140 spc, flags, false);
3141 else
3142 dump_generic_node (pp, op0, spc, flags, false);
3144 break;
3146 case EXIT_EXPR:
3147 pp_string (pp, "if (");
3148 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3149 pp_string (pp, ") break");
3150 break;
3152 case SWITCH_EXPR:
3153 pp_string (pp, "switch (");
3154 dump_generic_node (pp, SWITCH_COND (node), spc, flags, false);
3155 pp_right_paren (pp);
3156 if (!(flags & TDF_SLIM))
3158 newline_and_indent (pp, spc+2);
3159 pp_left_brace (pp);
3160 if (SWITCH_BODY (node))
3162 newline_and_indent (pp, spc+4);
3163 dump_generic_node (pp, SWITCH_BODY (node), spc+4, flags,
3164 true);
3166 newline_and_indent (pp, spc+2);
3167 pp_right_brace (pp);
3169 is_expr = false;
3170 break;
3172 case GOTO_EXPR:
3173 op0 = GOTO_DESTINATION (node);
3174 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
3176 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
3177 if (strcmp (name, "break") == 0
3178 || strcmp (name, "continue") == 0)
3180 pp_string (pp, name);
3181 break;
3184 pp_string (pp, "goto ");
3185 dump_generic_node (pp, op0, spc, flags, false);
3186 break;
3188 case ASM_EXPR:
3189 pp_string (pp, "__asm__");
3190 if (ASM_VOLATILE_P (node))
3191 pp_string (pp, " __volatile__");
3192 pp_left_paren (pp);
3193 dump_generic_node (pp, ASM_STRING (node), spc, flags, false);
3194 pp_colon (pp);
3195 dump_generic_node (pp, ASM_OUTPUTS (node), spc, flags, false);
3196 pp_colon (pp);
3197 dump_generic_node (pp, ASM_INPUTS (node), spc, flags, false);
3198 if (ASM_CLOBBERS (node))
3200 pp_colon (pp);
3201 dump_generic_node (pp, ASM_CLOBBERS (node), spc, flags, false);
3203 pp_right_paren (pp);
3204 break;
3206 case CASE_LABEL_EXPR:
3207 if (CASE_LOW (node) && CASE_HIGH (node))
3209 pp_string (pp, "case ");
3210 dump_generic_node (pp, CASE_LOW (node), spc, flags, false);
3211 pp_string (pp, " ... ");
3212 dump_generic_node (pp, CASE_HIGH (node), spc, flags, false);
3214 else if (CASE_LOW (node))
3216 pp_string (pp, "case ");
3217 dump_generic_node (pp, CASE_LOW (node), spc, flags, false);
3219 else
3220 pp_string (pp, "default");
3221 pp_colon (pp);
3222 break;
3224 case OBJ_TYPE_REF:
3225 pp_string (pp, "OBJ_TYPE_REF(");
3226 dump_generic_node (pp, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
3227 pp_semicolon (pp);
3228 /* We omit the class type for -fcompare-debug because we may
3229 drop TYPE_BINFO early depending on debug info, and then
3230 virtual_method_call_p would return false, whereas when
3231 TYPE_BINFO is preserved it may still return true and then
3232 we'd print the class type. Compare tree and rtl dumps for
3233 libstdc++-prettyprinters/shared_ptr.cc with and without -g,
3234 for example, at occurrences of OBJ_TYPE_REF. */
3235 if (!(flags & (TDF_SLIM | TDF_COMPARE_DEBUG))
3236 && virtual_method_call_p (node, true))
3238 pp_string (pp, "(");
3239 dump_generic_node (pp, obj_type_ref_class (node, true),
3240 spc, flags, false);
3241 pp_string (pp, ")");
3243 dump_generic_node (pp, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
3244 pp_arrow (pp);
3245 dump_generic_node (pp, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
3246 pp_right_paren (pp);
3247 break;
3249 case SSA_NAME:
3250 if (SSA_NAME_IDENTIFIER (node))
3252 if ((flags & TDF_NOUID)
3253 && SSA_NAME_VAR (node)
3254 && DECL_NAMELESS (SSA_NAME_VAR (node)))
3255 dump_fancy_name (pp, SSA_NAME_IDENTIFIER (node));
3256 else if (! (flags & TDF_GIMPLE)
3257 || SSA_NAME_VAR (node))
3258 dump_generic_node (pp, SSA_NAME_IDENTIFIER (node),
3259 spc, flags, false);
3261 pp_underscore (pp);
3262 pp_decimal_int (pp, SSA_NAME_VERSION (node));
3263 if (SSA_NAME_IS_DEFAULT_DEF (node))
3264 pp_string (pp, "(D)");
3265 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
3266 pp_string (pp, "(ab)");
3267 break;
3269 case WITH_SIZE_EXPR:
3270 pp_string (pp, "WITH_SIZE_EXPR <");
3271 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3272 pp_string (pp, ", ");
3273 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3274 pp_greater (pp);
3275 break;
3277 case ASSERT_EXPR:
3278 pp_string (pp, "ASSERT_EXPR <");
3279 dump_generic_node (pp, ASSERT_EXPR_VAR (node), spc, flags, false);
3280 pp_string (pp, ", ");
3281 dump_generic_node (pp, ASSERT_EXPR_COND (node), spc, flags, false);
3282 pp_greater (pp);
3283 break;
3285 case SCEV_KNOWN:
3286 pp_string (pp, "scev_known");
3287 break;
3289 case SCEV_NOT_KNOWN:
3290 pp_string (pp, "scev_not_known");
3291 break;
3293 case POLYNOMIAL_CHREC:
3294 pp_left_brace (pp);
3295 dump_generic_node (pp, CHREC_LEFT (node), spc, flags, false);
3296 pp_string (pp, ", +, ");
3297 dump_generic_node (pp, CHREC_RIGHT (node), spc, flags, false);
3298 pp_string (pp, "}_");
3299 pp_scalar (pp, "%u", CHREC_VARIABLE (node));
3300 is_stmt = false;
3301 break;
3303 case REALIGN_LOAD_EXPR:
3304 pp_string (pp, "REALIGN_LOAD <");
3305 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3306 pp_string (pp, ", ");
3307 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3308 pp_string (pp, ", ");
3309 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3310 pp_greater (pp);
3311 break;
3313 case VEC_COND_EXPR:
3314 pp_string (pp, " VEC_COND_EXPR < ");
3315 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3316 pp_string (pp, " , ");
3317 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3318 pp_string (pp, " , ");
3319 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3320 pp_string (pp, " > ");
3321 break;
3323 case VEC_PERM_EXPR:
3324 pp_string (pp, " VEC_PERM_EXPR < ");
3325 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3326 pp_string (pp, " , ");
3327 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3328 pp_string (pp, " , ");
3329 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3330 pp_string (pp, " > ");
3331 break;
3333 case DOT_PROD_EXPR:
3334 pp_string (pp, " DOT_PROD_EXPR < ");
3335 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3336 pp_string (pp, ", ");
3337 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3338 pp_string (pp, ", ");
3339 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3340 pp_string (pp, " > ");
3341 break;
3343 case WIDEN_MULT_PLUS_EXPR:
3344 pp_string (pp, " WIDEN_MULT_PLUS_EXPR < ");
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_string (pp, " > ");
3351 break;
3353 case WIDEN_MULT_MINUS_EXPR:
3354 pp_string (pp, " WIDEN_MULT_MINUS_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 OACC_PARALLEL:
3364 pp_string (pp, "#pragma acc parallel");
3365 goto dump_omp_clauses_body;
3367 case OACC_KERNELS:
3368 pp_string (pp, "#pragma acc kernels");
3369 goto dump_omp_clauses_body;
3371 case OACC_SERIAL:
3372 pp_string (pp, "#pragma acc serial");
3373 goto dump_omp_clauses_body;
3375 case OACC_DATA:
3376 pp_string (pp, "#pragma acc data");
3377 dump_omp_clauses (pp, OACC_DATA_CLAUSES (node), spc, flags);
3378 goto dump_omp_body;
3380 case OACC_HOST_DATA:
3381 pp_string (pp, "#pragma acc host_data");
3382 dump_omp_clauses (pp, OACC_HOST_DATA_CLAUSES (node), spc, flags);
3383 goto dump_omp_body;
3385 case OACC_DECLARE:
3386 pp_string (pp, "#pragma acc declare");
3387 dump_omp_clauses (pp, OACC_DECLARE_CLAUSES (node), spc, flags);
3388 break;
3390 case OACC_UPDATE:
3391 pp_string (pp, "#pragma acc update");
3392 dump_omp_clauses (pp, OACC_UPDATE_CLAUSES (node), spc, flags);
3393 break;
3395 case OACC_ENTER_DATA:
3396 pp_string (pp, "#pragma acc enter data");
3397 dump_omp_clauses (pp, OACC_ENTER_DATA_CLAUSES (node), spc, flags);
3398 break;
3400 case OACC_EXIT_DATA:
3401 pp_string (pp, "#pragma acc exit data");
3402 dump_omp_clauses (pp, OACC_EXIT_DATA_CLAUSES (node), spc, flags);
3403 break;
3405 case OACC_CACHE:
3406 pp_string (pp, "#pragma acc cache");
3407 dump_omp_clauses (pp, OACC_CACHE_CLAUSES (node), spc, flags);
3408 break;
3410 case OMP_PARALLEL:
3411 pp_string (pp, "#pragma omp parallel");
3412 dump_omp_clauses (pp, OMP_PARALLEL_CLAUSES (node), spc, flags);
3413 goto dump_omp_body;
3415 dump_omp_clauses_body:
3416 dump_omp_clauses (pp, OMP_CLAUSES (node), spc, flags);
3417 goto dump_omp_body;
3419 dump_omp_body:
3420 if (!(flags & TDF_SLIM) && OMP_BODY (node))
3422 newline_and_indent (pp, spc + 2);
3423 pp_left_brace (pp);
3424 newline_and_indent (pp, spc + 4);
3425 dump_generic_node (pp, OMP_BODY (node), spc + 4, flags, false);
3426 newline_and_indent (pp, spc + 2);
3427 pp_right_brace (pp);
3429 is_expr = false;
3430 break;
3432 case OMP_TASK:
3433 pp_string (pp, OMP_TASK_BODY (node) ? "#pragma omp task"
3434 : "#pragma omp taskwait");
3435 dump_omp_clauses (pp, OMP_TASK_CLAUSES (node), spc, flags);
3436 goto dump_omp_body;
3438 case OMP_FOR:
3439 pp_string (pp, "#pragma omp for");
3440 goto dump_omp_loop;
3442 case OMP_SIMD:
3443 pp_string (pp, "#pragma omp simd");
3444 goto dump_omp_loop;
3446 case OMP_DISTRIBUTE:
3447 pp_string (pp, "#pragma omp distribute");
3448 goto dump_omp_loop;
3450 case OMP_TASKLOOP:
3451 pp_string (pp, "#pragma omp taskloop");
3452 goto dump_omp_loop;
3454 case OMP_LOOP:
3455 pp_string (pp, "#pragma omp loop");
3456 goto dump_omp_loop;
3458 case OACC_LOOP:
3459 pp_string (pp, "#pragma acc loop");
3460 goto dump_omp_loop;
3462 case OMP_TEAMS:
3463 pp_string (pp, "#pragma omp teams");
3464 dump_omp_clauses (pp, OMP_TEAMS_CLAUSES (node), spc, flags);
3465 goto dump_omp_body;
3467 case OMP_TARGET_DATA:
3468 pp_string (pp, "#pragma omp target data");
3469 dump_omp_clauses (pp, OMP_TARGET_DATA_CLAUSES (node), spc, flags);
3470 goto dump_omp_body;
3472 case OMP_TARGET_ENTER_DATA:
3473 pp_string (pp, "#pragma omp target enter data");
3474 dump_omp_clauses (pp, OMP_TARGET_ENTER_DATA_CLAUSES (node), spc, flags);
3475 is_expr = false;
3476 break;
3478 case OMP_TARGET_EXIT_DATA:
3479 pp_string (pp, "#pragma omp target exit data");
3480 dump_omp_clauses (pp, OMP_TARGET_EXIT_DATA_CLAUSES (node), spc, flags);
3481 is_expr = false;
3482 break;
3484 case OMP_TARGET:
3485 pp_string (pp, "#pragma omp target");
3486 dump_omp_clauses (pp, OMP_TARGET_CLAUSES (node), spc, flags);
3487 goto dump_omp_body;
3489 case OMP_TARGET_UPDATE:
3490 pp_string (pp, "#pragma omp target update");
3491 dump_omp_clauses (pp, OMP_TARGET_UPDATE_CLAUSES (node), spc, flags);
3492 is_expr = false;
3493 break;
3495 dump_omp_loop:
3496 dump_omp_clauses (pp, OMP_FOR_CLAUSES (node), spc, flags);
3497 if (!(flags & TDF_SLIM))
3499 int i;
3501 if (OMP_FOR_PRE_BODY (node))
3503 newline_and_indent (pp, spc + 2);
3504 pp_left_brace (pp);
3505 spc += 4;
3506 newline_and_indent (pp, spc);
3507 dump_generic_node (pp, OMP_FOR_PRE_BODY (node),
3508 spc, flags, false);
3510 if (OMP_FOR_INIT (node))
3512 spc -= 2;
3513 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (node)); i++)
3515 spc += 2;
3516 newline_and_indent (pp, spc);
3517 pp_string (pp, "for (");
3518 tree init = TREE_VEC_ELT (OMP_FOR_INIT (node), i);
3519 if (TREE_CODE (init) != MODIFY_EXPR
3520 || TREE_CODE (TREE_OPERAND (init, 1)) != TREE_VEC)
3521 dump_generic_node (pp, init, spc, flags, false);
3522 else
3524 dump_generic_node (pp, TREE_OPERAND (init, 0),
3525 spc, flags, false);
3526 pp_string (pp, " = ");
3527 dump_omp_loop_non_rect_expr (pp, TREE_OPERAND (init, 1),
3528 spc, flags);
3530 pp_string (pp, "; ");
3531 tree cond = TREE_VEC_ELT (OMP_FOR_COND (node), i);
3532 if (!COMPARISON_CLASS_P (cond)
3533 || TREE_CODE (TREE_OPERAND (cond, 1)) != TREE_VEC)
3534 dump_generic_node (pp, cond, spc, flags, false);
3535 else
3537 dump_generic_node (pp, TREE_OPERAND (cond, 0),
3538 spc, flags, false);
3539 const char *op = op_symbol (cond);
3540 pp_space (pp);
3541 pp_string (pp, op);
3542 pp_space (pp);
3543 dump_omp_loop_non_rect_expr (pp, TREE_OPERAND (cond, 1),
3544 spc, flags);
3546 pp_string (pp, "; ");
3547 dump_generic_node (pp,
3548 TREE_VEC_ELT (OMP_FOR_INCR (node), i),
3549 spc, flags, false);
3550 pp_right_paren (pp);
3553 if (OMP_FOR_BODY (node))
3555 newline_and_indent (pp, spc + 2);
3556 pp_left_brace (pp);
3557 newline_and_indent (pp, spc + 4);
3558 dump_generic_node (pp, OMP_FOR_BODY (node), spc + 4, flags,
3559 false);
3560 newline_and_indent (pp, spc + 2);
3561 pp_right_brace (pp);
3563 if (OMP_FOR_INIT (node))
3564 spc -= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node)) - 2;
3565 if (OMP_FOR_PRE_BODY (node))
3567 spc -= 4;
3568 newline_and_indent (pp, spc + 2);
3569 pp_right_brace (pp);
3572 is_expr = false;
3573 break;
3575 case OMP_SECTIONS:
3576 pp_string (pp, "#pragma omp sections");
3577 dump_omp_clauses (pp, OMP_SECTIONS_CLAUSES (node), spc, flags);
3578 goto dump_omp_body;
3580 case OMP_SECTION:
3581 pp_string (pp, "#pragma omp section");
3582 goto dump_omp_body;
3584 case OMP_SCAN:
3585 if (OMP_SCAN_CLAUSES (node))
3587 pp_string (pp, "#pragma omp scan");
3588 dump_omp_clauses (pp, OMP_SCAN_CLAUSES (node), spc, flags);
3590 goto dump_omp_body;
3592 case OMP_MASTER:
3593 pp_string (pp, "#pragma omp master");
3594 goto dump_omp_body;
3596 case OMP_MASKED:
3597 pp_string (pp, "#pragma omp masked");
3598 dump_omp_clauses (pp, OMP_MASKED_CLAUSES (node), spc, flags);
3599 goto dump_omp_body;
3601 case OMP_TASKGROUP:
3602 pp_string (pp, "#pragma omp taskgroup");
3603 dump_omp_clauses (pp, OMP_TASKGROUP_CLAUSES (node), spc, flags);
3604 goto dump_omp_body;
3606 case OMP_ORDERED:
3607 pp_string (pp, "#pragma omp ordered");
3608 dump_omp_clauses (pp, OMP_ORDERED_CLAUSES (node), spc, flags);
3609 goto dump_omp_body;
3611 case OMP_CRITICAL:
3612 pp_string (pp, "#pragma omp critical");
3613 if (OMP_CRITICAL_NAME (node))
3615 pp_space (pp);
3616 pp_left_paren (pp);
3617 dump_generic_node (pp, OMP_CRITICAL_NAME (node), spc,
3618 flags, false);
3619 pp_right_paren (pp);
3621 dump_omp_clauses (pp, OMP_CRITICAL_CLAUSES (node), spc, flags);
3622 goto dump_omp_body;
3624 case OMP_ATOMIC:
3625 pp_string (pp, "#pragma omp atomic");
3626 dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
3627 newline_and_indent (pp, spc + 2);
3628 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3629 pp_space (pp);
3630 pp_equal (pp);
3631 pp_space (pp);
3632 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3633 break;
3635 case OMP_ATOMIC_READ:
3636 pp_string (pp, "#pragma omp atomic read");
3637 dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
3638 newline_and_indent (pp, spc + 2);
3639 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3640 pp_space (pp);
3641 break;
3643 case OMP_ATOMIC_CAPTURE_OLD:
3644 case OMP_ATOMIC_CAPTURE_NEW:
3645 pp_string (pp, "#pragma omp atomic capture");
3646 dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
3647 newline_and_indent (pp, spc + 2);
3648 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3649 pp_space (pp);
3650 pp_equal (pp);
3651 pp_space (pp);
3652 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3653 break;
3655 case OMP_SINGLE:
3656 pp_string (pp, "#pragma omp single");
3657 dump_omp_clauses (pp, OMP_SINGLE_CLAUSES (node), spc, flags);
3658 goto dump_omp_body;
3660 case OMP_SCOPE:
3661 pp_string (pp, "#pragma omp scope");
3662 dump_omp_clauses (pp, OMP_SCOPE_CLAUSES (node), spc, flags);
3663 goto dump_omp_body;
3665 case OMP_CLAUSE:
3666 /* If we come here, we're dumping something that's not an OMP construct,
3667 for example, OMP clauses attached to a function's '__attribute__'.
3668 Dump the whole OMP clause chain. */
3669 dump_omp_clauses (pp, node, spc, flags, false);
3670 is_expr = false;
3671 break;
3673 case TRANSACTION_EXPR:
3674 if (TRANSACTION_EXPR_OUTER (node))
3675 pp_string (pp, "__transaction_atomic [[outer]]");
3676 else if (TRANSACTION_EXPR_RELAXED (node))
3677 pp_string (pp, "__transaction_relaxed");
3678 else
3679 pp_string (pp, "__transaction_atomic");
3680 if (!(flags & TDF_SLIM) && TRANSACTION_EXPR_BODY (node))
3682 newline_and_indent (pp, spc);
3683 pp_left_brace (pp);
3684 newline_and_indent (pp, spc + 2);
3685 dump_generic_node (pp, TRANSACTION_EXPR_BODY (node),
3686 spc + 2, flags, false);
3687 newline_and_indent (pp, spc);
3688 pp_right_brace (pp);
3690 is_expr = false;
3691 break;
3693 case VEC_SERIES_EXPR:
3694 case VEC_WIDEN_MULT_HI_EXPR:
3695 case VEC_WIDEN_MULT_LO_EXPR:
3696 case VEC_WIDEN_PLUS_HI_EXPR:
3697 case VEC_WIDEN_PLUS_LO_EXPR:
3698 case VEC_WIDEN_MINUS_HI_EXPR:
3699 case VEC_WIDEN_MINUS_LO_EXPR:
3700 case VEC_WIDEN_MULT_EVEN_EXPR:
3701 case VEC_WIDEN_MULT_ODD_EXPR:
3702 case VEC_WIDEN_LSHIFT_HI_EXPR:
3703 case VEC_WIDEN_LSHIFT_LO_EXPR:
3704 pp_space (pp);
3705 for (str = get_tree_code_name (code); *str; str++)
3706 pp_character (pp, TOUPPER (*str));
3707 pp_string (pp, " < ");
3708 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3709 pp_string (pp, ", ");
3710 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3711 pp_string (pp, " > ");
3712 break;
3714 case VEC_DUPLICATE_EXPR:
3715 pp_space (pp);
3716 for (str = get_tree_code_name (code); *str; str++)
3717 pp_character (pp, TOUPPER (*str));
3718 pp_string (pp, " < ");
3719 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3720 pp_string (pp, " > ");
3721 break;
3723 case VEC_UNPACK_HI_EXPR:
3724 pp_string (pp, " VEC_UNPACK_HI_EXPR < ");
3725 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3726 pp_string (pp, " > ");
3727 break;
3729 case VEC_UNPACK_LO_EXPR:
3730 pp_string (pp, " VEC_UNPACK_LO_EXPR < ");
3731 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3732 pp_string (pp, " > ");
3733 break;
3735 case VEC_UNPACK_FLOAT_HI_EXPR:
3736 pp_string (pp, " VEC_UNPACK_FLOAT_HI_EXPR < ");
3737 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3738 pp_string (pp, " > ");
3739 break;
3741 case VEC_UNPACK_FLOAT_LO_EXPR:
3742 pp_string (pp, " VEC_UNPACK_FLOAT_LO_EXPR < ");
3743 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3744 pp_string (pp, " > ");
3745 break;
3747 case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
3748 pp_string (pp, " VEC_UNPACK_FIX_TRUNC_HI_EXPR < ");
3749 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3750 pp_string (pp, " > ");
3751 break;
3753 case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
3754 pp_string (pp, " VEC_UNPACK_FIX_TRUNC_LO_EXPR < ");
3755 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3756 pp_string (pp, " > ");
3757 break;
3759 case VEC_PACK_TRUNC_EXPR:
3760 pp_string (pp, " VEC_PACK_TRUNC_EXPR < ");
3761 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3762 pp_string (pp, ", ");
3763 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3764 pp_string (pp, " > ");
3765 break;
3767 case VEC_PACK_SAT_EXPR:
3768 pp_string (pp, " VEC_PACK_SAT_EXPR < ");
3769 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3770 pp_string (pp, ", ");
3771 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3772 pp_string (pp, " > ");
3773 break;
3775 case VEC_PACK_FIX_TRUNC_EXPR:
3776 pp_string (pp, " VEC_PACK_FIX_TRUNC_EXPR < ");
3777 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3778 pp_string (pp, ", ");
3779 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3780 pp_string (pp, " > ");
3781 break;
3783 case VEC_PACK_FLOAT_EXPR:
3784 pp_string (pp, " VEC_PACK_FLOAT_EXPR < ");
3785 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3786 pp_string (pp, ", ");
3787 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3788 pp_string (pp, " > ");
3789 break;
3791 case BLOCK:
3792 dump_block_node (pp, node, spc, flags);
3793 break;
3795 case DEBUG_BEGIN_STMT:
3796 pp_string (pp, "# DEBUG BEGIN STMT");
3797 break;
3799 default:
3800 NIY;
3803 if (is_stmt && is_expr)
3804 pp_semicolon (pp);
3806 return spc;
3809 /* Print the declaration of a variable. */
3811 void
3812 print_declaration (pretty_printer *pp, tree t, int spc, dump_flags_t flags)
3814 INDENT (spc);
3816 if (TREE_CODE(t) == NAMELIST_DECL)
3818 pp_string(pp, "namelist ");
3819 dump_decl_name (pp, t, flags);
3820 pp_semicolon (pp);
3821 return;
3824 if (TREE_CODE (t) == TYPE_DECL)
3825 pp_string (pp, "typedef ");
3827 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
3828 pp_string (pp, "register ");
3830 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
3831 pp_string (pp, "extern ");
3832 else if (TREE_STATIC (t))
3833 pp_string (pp, "static ");
3835 /* Print the type and name. */
3836 if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
3838 tree tmp;
3840 /* Print array's type. */
3841 tmp = TREE_TYPE (t);
3842 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
3843 tmp = TREE_TYPE (tmp);
3844 dump_generic_node (pp, TREE_TYPE (tmp), spc, flags, false);
3846 /* Print variable's name. */
3847 pp_space (pp);
3848 dump_generic_node (pp, t, spc, flags, false);
3850 /* Print the dimensions. */
3851 tmp = TREE_TYPE (t);
3852 while (TREE_CODE (tmp) == ARRAY_TYPE)
3854 dump_array_domain (pp, TYPE_DOMAIN (tmp), spc, flags);
3855 tmp = TREE_TYPE (tmp);
3858 else if (TREE_CODE (t) == FUNCTION_DECL)
3860 dump_generic_node (pp, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
3861 pp_space (pp);
3862 dump_decl_name (pp, t, flags);
3863 dump_function_declaration (pp, TREE_TYPE (t), spc, flags);
3865 else
3867 /* Print type declaration. */
3868 dump_generic_node (pp, TREE_TYPE (t), spc, flags, false);
3870 /* Print variable's name. */
3871 pp_space (pp);
3872 dump_generic_node (pp, t, spc, flags, false);
3875 if (VAR_P (t) && DECL_HARD_REGISTER (t))
3877 pp_string (pp, " __asm__ ");
3878 pp_left_paren (pp);
3879 dump_generic_node (pp, DECL_ASSEMBLER_NAME (t), spc, flags, false);
3880 pp_right_paren (pp);
3883 /* The initial value of a function serves to determine whether the function
3884 is declared or defined. So the following does not apply to function
3885 nodes. */
3886 if (TREE_CODE (t) != FUNCTION_DECL)
3888 /* Print the initial value. */
3889 if (DECL_INITIAL (t))
3891 pp_space (pp);
3892 pp_equal (pp);
3893 pp_space (pp);
3894 if (!(flags & TDF_SLIM))
3895 dump_generic_node (pp, DECL_INITIAL (t), spc, flags, false);
3896 else
3897 pp_string (pp, "<<< omitted >>>");
3901 if (VAR_P (t) && DECL_HAS_VALUE_EXPR_P (t))
3903 pp_string (pp, " [value-expr: ");
3904 dump_generic_node (pp, DECL_VALUE_EXPR (t), spc, flags, false);
3905 pp_right_bracket (pp);
3908 pp_semicolon (pp);
3912 /* Prints a structure: name, fields, and methods.
3913 FIXME: Still incomplete. */
3915 static void
3916 print_struct_decl (pretty_printer *pp, const_tree node, int spc,
3917 dump_flags_t flags)
3919 /* Print the name of the structure. */
3920 if (TYPE_NAME (node))
3922 INDENT (spc);
3923 if (TREE_CODE (node) == RECORD_TYPE)
3924 pp_string (pp, "struct ");
3925 else if ((TREE_CODE (node) == UNION_TYPE
3926 || TREE_CODE (node) == QUAL_UNION_TYPE))
3927 pp_string (pp, "union ");
3929 dump_generic_node (pp, TYPE_NAME (node), spc, TDF_NONE, false);
3932 /* Print the contents of the structure. */
3933 pp_newline (pp);
3934 INDENT (spc);
3935 pp_left_brace (pp);
3936 pp_newline (pp);
3938 /* Print the fields of the structure. */
3940 tree tmp;
3941 tmp = TYPE_FIELDS (node);
3942 while (tmp)
3944 /* Avoid to print recursively the structure. */
3945 /* FIXME : Not implemented correctly...,
3946 what about the case when we have a cycle in the contain graph? ...
3947 Maybe this could be solved by looking at the scope in which the
3948 structure was declared. */
3949 if (TREE_TYPE (tmp) != node
3950 && (TREE_CODE (TREE_TYPE (tmp)) != POINTER_TYPE
3951 || TREE_TYPE (TREE_TYPE (tmp)) != node))
3953 print_declaration (pp, tmp, spc+2, flags);
3954 pp_newline (pp);
3956 tmp = DECL_CHAIN (tmp);
3959 INDENT (spc);
3960 pp_right_brace (pp);
3963 /* Return the priority of the operator CODE.
3965 From lowest to highest precedence with either left-to-right (L-R)
3966 or right-to-left (R-L) associativity]:
3968 1 [L-R] ,
3969 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
3970 3 [R-L] ?:
3971 4 [L-R] ||
3972 5 [L-R] &&
3973 6 [L-R] |
3974 7 [L-R] ^
3975 8 [L-R] &
3976 9 [L-R] == !=
3977 10 [L-R] < <= > >=
3978 11 [L-R] << >>
3979 12 [L-R] + -
3980 13 [L-R] * / %
3981 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
3982 15 [L-R] fn() [] -> .
3984 unary +, - and * have higher precedence than the corresponding binary
3985 operators. */
3988 op_code_prio (enum tree_code code)
3990 switch (code)
3992 case TREE_LIST:
3993 case COMPOUND_EXPR:
3994 case BIND_EXPR:
3995 return 1;
3997 case MODIFY_EXPR:
3998 case INIT_EXPR:
3999 return 2;
4001 case COND_EXPR:
4002 return 3;
4004 case TRUTH_OR_EXPR:
4005 case TRUTH_ORIF_EXPR:
4006 return 4;
4008 case TRUTH_AND_EXPR:
4009 case TRUTH_ANDIF_EXPR:
4010 return 5;
4012 case BIT_IOR_EXPR:
4013 return 6;
4015 case BIT_XOR_EXPR:
4016 case TRUTH_XOR_EXPR:
4017 return 7;
4019 case BIT_AND_EXPR:
4020 return 8;
4022 case EQ_EXPR:
4023 case NE_EXPR:
4024 return 9;
4026 case UNLT_EXPR:
4027 case UNLE_EXPR:
4028 case UNGT_EXPR:
4029 case UNGE_EXPR:
4030 case UNEQ_EXPR:
4031 case LTGT_EXPR:
4032 case ORDERED_EXPR:
4033 case UNORDERED_EXPR:
4034 case LT_EXPR:
4035 case LE_EXPR:
4036 case GT_EXPR:
4037 case GE_EXPR:
4038 return 10;
4040 case LSHIFT_EXPR:
4041 case RSHIFT_EXPR:
4042 case LROTATE_EXPR:
4043 case RROTATE_EXPR:
4044 case VEC_WIDEN_LSHIFT_HI_EXPR:
4045 case VEC_WIDEN_LSHIFT_LO_EXPR:
4046 case WIDEN_LSHIFT_EXPR:
4047 return 11;
4049 case WIDEN_SUM_EXPR:
4050 case PLUS_EXPR:
4051 case POINTER_PLUS_EXPR:
4052 case POINTER_DIFF_EXPR:
4053 case MINUS_EXPR:
4054 return 12;
4056 case VEC_WIDEN_MULT_HI_EXPR:
4057 case VEC_WIDEN_MULT_LO_EXPR:
4058 case WIDEN_MULT_EXPR:
4059 case DOT_PROD_EXPR:
4060 case WIDEN_MULT_PLUS_EXPR:
4061 case WIDEN_MULT_MINUS_EXPR:
4062 case MULT_EXPR:
4063 case MULT_HIGHPART_EXPR:
4064 case TRUNC_DIV_EXPR:
4065 case CEIL_DIV_EXPR:
4066 case FLOOR_DIV_EXPR:
4067 case ROUND_DIV_EXPR:
4068 case RDIV_EXPR:
4069 case EXACT_DIV_EXPR:
4070 case TRUNC_MOD_EXPR:
4071 case CEIL_MOD_EXPR:
4072 case FLOOR_MOD_EXPR:
4073 case ROUND_MOD_EXPR:
4074 return 13;
4076 case TRUTH_NOT_EXPR:
4077 case BIT_NOT_EXPR:
4078 case POSTINCREMENT_EXPR:
4079 case POSTDECREMENT_EXPR:
4080 case PREINCREMENT_EXPR:
4081 case PREDECREMENT_EXPR:
4082 case NEGATE_EXPR:
4083 case INDIRECT_REF:
4084 case ADDR_EXPR:
4085 case FLOAT_EXPR:
4086 CASE_CONVERT:
4087 case FIX_TRUNC_EXPR:
4088 case TARGET_EXPR:
4089 return 14;
4091 case CALL_EXPR:
4092 case ARRAY_REF:
4093 case ARRAY_RANGE_REF:
4094 case COMPONENT_REF:
4095 return 15;
4097 /* Special expressions. */
4098 case MIN_EXPR:
4099 case MAX_EXPR:
4100 case ABS_EXPR:
4101 case REALPART_EXPR:
4102 case IMAGPART_EXPR:
4103 case VEC_UNPACK_HI_EXPR:
4104 case VEC_UNPACK_LO_EXPR:
4105 case VEC_UNPACK_FLOAT_HI_EXPR:
4106 case VEC_UNPACK_FLOAT_LO_EXPR:
4107 case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
4108 case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
4109 case VEC_PACK_TRUNC_EXPR:
4110 case VEC_PACK_SAT_EXPR:
4111 return 16;
4113 default:
4114 /* Return an arbitrarily high precedence to avoid surrounding single
4115 VAR_DECLs in ()s. */
4116 return 9999;
4120 /* Return the priority of the operator OP. */
4123 op_prio (const_tree op)
4125 enum tree_code code;
4127 if (op == NULL)
4128 return 9999;
4130 code = TREE_CODE (op);
4131 if (code == SAVE_EXPR || code == NON_LVALUE_EXPR)
4132 return op_prio (TREE_OPERAND (op, 0));
4134 return op_code_prio (code);
4137 /* Return the symbol associated with operator CODE. */
4139 const char *
4140 op_symbol_code (enum tree_code code)
4142 switch (code)
4144 case MODIFY_EXPR:
4145 return "=";
4147 case TRUTH_OR_EXPR:
4148 case TRUTH_ORIF_EXPR:
4149 return "||";
4151 case TRUTH_AND_EXPR:
4152 case TRUTH_ANDIF_EXPR:
4153 return "&&";
4155 case BIT_IOR_EXPR:
4156 return "|";
4158 case TRUTH_XOR_EXPR:
4159 case BIT_XOR_EXPR:
4160 return "^";
4162 case ADDR_EXPR:
4163 case BIT_AND_EXPR:
4164 return "&";
4166 case ORDERED_EXPR:
4167 return "ord";
4168 case UNORDERED_EXPR:
4169 return "unord";
4171 case EQ_EXPR:
4172 return "==";
4173 case UNEQ_EXPR:
4174 return "u==";
4176 case NE_EXPR:
4177 return "!=";
4179 case LT_EXPR:
4180 return "<";
4181 case UNLT_EXPR:
4182 return "u<";
4184 case LE_EXPR:
4185 return "<=";
4186 case UNLE_EXPR:
4187 return "u<=";
4189 case GT_EXPR:
4190 return ">";
4191 case UNGT_EXPR:
4192 return "u>";
4194 case GE_EXPR:
4195 return ">=";
4196 case UNGE_EXPR:
4197 return "u>=";
4199 case LTGT_EXPR:
4200 return "<>";
4202 case LSHIFT_EXPR:
4203 return "<<";
4205 case RSHIFT_EXPR:
4206 return ">>";
4208 case LROTATE_EXPR:
4209 return "r<<";
4211 case RROTATE_EXPR:
4212 return "r>>";
4214 case WIDEN_LSHIFT_EXPR:
4215 return "w<<";
4217 case WIDEN_PLUS_EXPR:
4218 return "w+";
4220 case WIDEN_MINUS_EXPR:
4221 return "w-";
4223 case POINTER_PLUS_EXPR:
4224 return "+";
4226 case PLUS_EXPR:
4227 return "+";
4229 case WIDEN_SUM_EXPR:
4230 return "w+";
4232 case WIDEN_MULT_EXPR:
4233 return "w*";
4235 case MULT_HIGHPART_EXPR:
4236 return "h*";
4238 case NEGATE_EXPR:
4239 case MINUS_EXPR:
4240 case POINTER_DIFF_EXPR:
4241 return "-";
4243 case BIT_NOT_EXPR:
4244 return "~";
4246 case TRUTH_NOT_EXPR:
4247 return "!";
4249 case MULT_EXPR:
4250 case INDIRECT_REF:
4251 return "*";
4253 case TRUNC_DIV_EXPR:
4254 case RDIV_EXPR:
4255 return "/";
4257 case CEIL_DIV_EXPR:
4258 return "/[cl]";
4260 case FLOOR_DIV_EXPR:
4261 return "/[fl]";
4263 case ROUND_DIV_EXPR:
4264 return "/[rd]";
4266 case EXACT_DIV_EXPR:
4267 return "/[ex]";
4269 case TRUNC_MOD_EXPR:
4270 return "%";
4272 case CEIL_MOD_EXPR:
4273 return "%[cl]";
4275 case FLOOR_MOD_EXPR:
4276 return "%[fl]";
4278 case ROUND_MOD_EXPR:
4279 return "%[rd]";
4281 case PREDECREMENT_EXPR:
4282 return " --";
4284 case PREINCREMENT_EXPR:
4285 return " ++";
4287 case POSTDECREMENT_EXPR:
4288 return "-- ";
4290 case POSTINCREMENT_EXPR:
4291 return "++ ";
4293 case MAX_EXPR:
4294 return "max";
4296 case MIN_EXPR:
4297 return "min";
4299 default:
4300 return "<<< ??? >>>";
4304 /* Return the symbol associated with operator OP. */
4306 static const char *
4307 op_symbol (const_tree op)
4309 return op_symbol_code (TREE_CODE (op));
4312 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
4313 the gimple_call_fn of a GIMPLE_CALL. */
4315 void
4316 print_call_name (pretty_printer *pp, tree node, dump_flags_t flags)
4318 tree op0 = node;
4320 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
4321 op0 = TREE_OPERAND (op0, 0);
4323 again:
4324 switch (TREE_CODE (op0))
4326 case VAR_DECL:
4327 case PARM_DECL:
4328 case FUNCTION_DECL:
4329 dump_function_name (pp, op0, flags);
4330 break;
4332 case ADDR_EXPR:
4333 case INDIRECT_REF:
4334 CASE_CONVERT:
4335 op0 = TREE_OPERAND (op0, 0);
4336 goto again;
4338 case COND_EXPR:
4339 pp_left_paren (pp);
4340 dump_generic_node (pp, TREE_OPERAND (op0, 0), 0, flags, false);
4341 pp_string (pp, ") ? ");
4342 dump_generic_node (pp, TREE_OPERAND (op0, 1), 0, flags, false);
4343 pp_string (pp, " : ");
4344 dump_generic_node (pp, TREE_OPERAND (op0, 2), 0, flags, false);
4345 break;
4347 case ARRAY_REF:
4348 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
4349 dump_function_name (pp, TREE_OPERAND (op0, 0), flags);
4350 else
4351 dump_generic_node (pp, op0, 0, flags, false);
4352 break;
4354 case MEM_REF:
4355 if (integer_zerop (TREE_OPERAND (op0, 1)))
4357 op0 = TREE_OPERAND (op0, 0);
4358 goto again;
4360 /* Fallthru. */
4361 case COMPONENT_REF:
4362 case SSA_NAME:
4363 case OBJ_TYPE_REF:
4364 dump_generic_node (pp, op0, 0, flags, false);
4365 break;
4367 default:
4368 NIY;
4372 /* Print the first N characters in the array STR, replacing non-printable
4373 characters (including embedded nuls) with unambiguous escape sequences. */
4375 void
4376 pretty_print_string (pretty_printer *pp, const char *str, size_t n)
4378 if (str == NULL)
4379 return;
4381 for ( ; n; --n, ++str)
4383 switch (str[0])
4385 case '\b':
4386 pp_string (pp, "\\b");
4387 break;
4389 case '\f':
4390 pp_string (pp, "\\f");
4391 break;
4393 case '\n':
4394 pp_string (pp, "\\n");
4395 break;
4397 case '\r':
4398 pp_string (pp, "\\r");
4399 break;
4401 case '\t':
4402 pp_string (pp, "\\t");
4403 break;
4405 case '\v':
4406 pp_string (pp, "\\v");
4407 break;
4409 case '\\':
4410 pp_string (pp, "\\\\");
4411 break;
4413 case '\"':
4414 pp_string (pp, "\\\"");
4415 break;
4417 case '\'':
4418 pp_string (pp, "\\'");
4419 break;
4421 default:
4422 if (str[0] || n > 1)
4424 if (!ISPRINT (str[0]))
4426 char buf[5];
4427 sprintf (buf, "\\x%02x", (unsigned char)str[0]);
4428 pp_string (pp, buf);
4430 else
4431 pp_character (pp, str[0]);
4432 break;
4438 static void
4439 maybe_init_pretty_print (FILE *file)
4441 if (!tree_pp)
4443 tree_pp = new pretty_printer ();
4444 pp_needs_newline (tree_pp) = true;
4445 pp_translate_identifiers (tree_pp) = false;
4448 tree_pp->buffer->stream = file;
4451 static void
4452 newline_and_indent (pretty_printer *pp, int spc)
4454 pp_newline (pp);
4455 INDENT (spc);
4458 /* Print the identifier ID to PRETTY-PRINTER. */
4460 void
4461 pp_tree_identifier (pretty_printer *pp, tree id)
4463 if (pp_translate_identifiers (pp))
4465 const char *text = identifier_to_locale (IDENTIFIER_POINTER (id));
4466 pp_append_text (pp, text, text + strlen (text));
4468 else
4469 pp_append_text (pp, IDENTIFIER_POINTER (id),
4470 IDENTIFIER_POINTER (id) + IDENTIFIER_LENGTH (id));
4473 /* A helper function that is used to dump function information before the
4474 function dump. */
4476 void
4477 dump_function_header (FILE *dump_file, tree fdecl, dump_flags_t flags)
4479 const char *dname, *aname;
4480 struct cgraph_node *node = cgraph_node::get (fdecl);
4481 struct function *fun = DECL_STRUCT_FUNCTION (fdecl);
4483 dname = lang_hooks.decl_printable_name (fdecl, 1);
4485 if (DECL_ASSEMBLER_NAME_SET_P (fdecl))
4486 aname = (IDENTIFIER_POINTER
4487 (DECL_ASSEMBLER_NAME (fdecl)));
4488 else
4489 aname = "<unset-asm-name>";
4491 fprintf (dump_file, "\n;; Function %s (%s, funcdef_no=%d",
4492 dname, aname, fun->funcdef_no);
4493 if (!(flags & TDF_NOUID))
4494 fprintf (dump_file, ", decl_uid=%d", DECL_UID (fdecl));
4495 if (node)
4497 fprintf (dump_file, ", cgraph_uid=%d", node->get_uid ());
4498 fprintf (dump_file, ", symbol_order=%d)%s\n\n", node->order,
4499 node->frequency == NODE_FREQUENCY_HOT
4500 ? " (hot)"
4501 : node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
4502 ? " (unlikely executed)"
4503 : node->frequency == NODE_FREQUENCY_EXECUTED_ONCE
4504 ? " (executed once)"
4505 : "");
4507 else
4508 fprintf (dump_file, ")\n\n");
4511 /* Dump double_int D to pretty_printer PP. UNS is true
4512 if D is unsigned and false otherwise. */
4513 void
4514 pp_double_int (pretty_printer *pp, double_int d, bool uns)
4516 if (d.fits_shwi ())
4517 pp_wide_integer (pp, d.low);
4518 else if (d.fits_uhwi ())
4519 pp_unsigned_wide_integer (pp, d.low);
4520 else
4522 unsigned HOST_WIDE_INT low = d.low;
4523 HOST_WIDE_INT high = d.high;
4524 if (!uns && d.is_negative ())
4526 pp_minus (pp);
4527 high = ~high + !low;
4528 low = -low;
4530 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
4531 systems? */
4532 sprintf (pp_buffer (pp)->digit_buffer,
4533 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
4534 (unsigned HOST_WIDE_INT) high, low);
4535 pp_string (pp, pp_buffer (pp)->digit_buffer);
4539 #if __GNUC__ >= 10
4540 # pragma GCC diagnostic pop
4541 #endif