Re: Refactor copying decl section names
[official-gcc.git] / gcc / tree-pretty-print.c
blob318f048bcff4a48df44573aa098ee6a7f51db115
1 /* Pretty formatting of GENERIC trees in C syntax.
2 Copyright (C) 2001-2020 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 /* Disable warnings about quoting issues in the pp_xxx calls below
40 that (intentionally) don't follow GCC diagnostic conventions. */
41 #if __GNUC__ >= 10
42 # pragma GCC diagnostic push
43 # pragma GCC diagnostic ignored "-Wformat-diag"
44 #endif
46 /* Local functions, macros and variables. */
47 static const char *op_symbol (const_tree);
48 static void newline_and_indent (pretty_printer *, int);
49 static void maybe_init_pretty_print (FILE *);
50 static void print_struct_decl (pretty_printer *, const_tree, int, dump_flags_t);
51 static void do_niy (pretty_printer *, const_tree, dump_flags_t);
53 #define INDENT(SPACE) do { \
54 int i; for (i = 0; i<SPACE; i++) pp_space (pp); } while (0)
56 #define NIY do_niy (pp, node, flags)
58 static pretty_printer *tree_pp;
60 /* Try to print something for an unknown tree code. */
62 static void
63 do_niy (pretty_printer *pp, const_tree node, dump_flags_t flags)
65 int i, len;
67 pp_string (pp, "<<< Unknown tree: ");
68 pp_string (pp, get_tree_code_name (TREE_CODE (node)));
70 if (EXPR_P (node))
72 len = TREE_OPERAND_LENGTH (node);
73 for (i = 0; i < len; ++i)
75 newline_and_indent (pp, 2);
76 dump_generic_node (pp, TREE_OPERAND (node, i), 2, flags, false);
80 pp_string (pp, " >>>");
83 /* Debugging function to print out a generic expression. */
85 DEBUG_FUNCTION void
86 debug_generic_expr (tree t)
88 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS);
89 fprintf (stderr, "\n");
92 /* Debugging function to print out a generic statement. */
94 DEBUG_FUNCTION void
95 debug_generic_stmt (tree t)
97 print_generic_stmt (stderr, t, TDF_VOPS|TDF_MEMSYMS);
98 fprintf (stderr, "\n");
101 /* Debugging function to print out a chain of trees . */
103 DEBUG_FUNCTION void
104 debug_tree_chain (tree t)
106 hash_set<tree> seen;
108 while (t)
110 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
111 fprintf (stderr, " ");
112 t = TREE_CHAIN (t);
113 if (seen.add (t))
115 fprintf (stderr, "... [cycled back to ");
116 print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
117 fprintf (stderr, "]");
118 break;
121 fprintf (stderr, "\n");
124 /* Prints declaration DECL to the FILE with details specified by FLAGS. */
125 void
126 print_generic_decl (FILE *file, tree decl, dump_flags_t flags)
128 maybe_init_pretty_print (file);
129 print_declaration (tree_pp, decl, 2, flags);
130 pp_write_text_to_stream (tree_pp);
133 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
134 to show in the dump. See TDF_* in dumpfile.h. */
136 void
137 print_generic_stmt (FILE *file, tree t, dump_flags_t flags)
139 maybe_init_pretty_print (file);
140 dump_generic_node (tree_pp, t, 0, flags, true);
141 pp_newline_and_flush (tree_pp);
144 /* Print tree T, and its successors, on file FILE. FLAGS specifies details
145 to show in the dump. See TDF_* in dumpfile.h. The output is indented by
146 INDENT spaces. */
148 void
149 print_generic_stmt_indented (FILE *file, tree t, dump_flags_t flags, int indent)
151 int i;
153 maybe_init_pretty_print (file);
155 for (i = 0; i < indent; i++)
156 pp_space (tree_pp);
157 dump_generic_node (tree_pp, t, indent, flags, true);
158 pp_newline_and_flush (tree_pp);
161 /* Print a single expression T on file FILE. FLAGS specifies details to show
162 in the dump. See TDF_* in dumpfile.h. */
164 void
165 print_generic_expr (FILE *file, tree t, dump_flags_t flags)
167 maybe_init_pretty_print (file);
168 dump_generic_node (tree_pp, t, 0, flags, false);
169 pp_flush (tree_pp);
172 /* Print a single expression T to string, and return it. */
174 char *
175 print_generic_expr_to_str (tree t)
177 pretty_printer pp;
178 dump_generic_node (&pp, t, 0, TDF_VOPS|TDF_MEMSYMS, false);
179 return xstrdup (pp_formatted_text (&pp));
182 /* Dump NAME, an IDENTIFIER_POINTER, sanitized so that D<num> sequences
183 in it are replaced with Dxxxx, as long as they are at the start or
184 preceded by $ and at the end or followed by $. See make_fancy_name
185 in tree-sra.c. */
187 static void
188 dump_fancy_name (pretty_printer *pp, tree name)
190 int cnt = 0;
191 int length = IDENTIFIER_LENGTH (name);
192 const char *n = IDENTIFIER_POINTER (name);
195 n = strchr (n, 'D');
196 if (n == NULL)
197 break;
198 if (ISDIGIT (n[1])
199 && (n == IDENTIFIER_POINTER (name) || n[-1] == '$'))
201 int l = 2;
202 while (ISDIGIT (n[l]))
203 l++;
204 if (n[l] == '\0' || n[l] == '$')
206 cnt++;
207 length += 5 - l;
209 n += l;
211 else
212 n++;
214 while (1);
215 if (cnt == 0)
217 pp_tree_identifier (pp, name);
218 return;
221 char *str = XNEWVEC (char, length + 1);
222 char *p = str;
223 const char *q;
224 q = n = IDENTIFIER_POINTER (name);
227 q = strchr (q, 'D');
228 if (q == NULL)
229 break;
230 if (ISDIGIT (q[1])
231 && (q == IDENTIFIER_POINTER (name) || q[-1] == '$'))
233 int l = 2;
234 while (ISDIGIT (q[l]))
235 l++;
236 if (q[l] == '\0' || q[l] == '$')
238 memcpy (p, n, q - n);
239 memcpy (p + (q - n), "Dxxxx", 5);
240 p += (q - n) + 5;
241 n = q + l;
243 q += l;
245 else
246 q++;
248 while (1);
249 memcpy (p, n, IDENTIFIER_LENGTH (name) - (n - IDENTIFIER_POINTER (name)));
250 str[length] = '\0';
251 if (pp_translate_identifiers (pp))
253 const char *text = identifier_to_locale (str);
254 pp_append_text (pp, text, text + strlen (text));
256 else
257 pp_append_text (pp, str, str + length);
258 XDELETEVEC (str);
261 /* Dump the name of a _DECL node and its DECL_UID if TDF_UID is set
262 in FLAGS. */
264 static void
265 dump_decl_name (pretty_printer *pp, tree node, dump_flags_t flags)
267 tree name = DECL_NAME (node);
268 if (name)
270 if ((flags & TDF_ASMNAME)
271 && HAS_DECL_ASSEMBLER_NAME_P (node)
272 && DECL_ASSEMBLER_NAME_SET_P (node))
273 pp_tree_identifier (pp, DECL_ASSEMBLER_NAME_RAW (node));
274 /* For -fcompare-debug don't dump DECL_NAMELESS names at all,
275 -g might have created more fancy names and their indexes
276 could get out of sync. Usually those should be DECL_IGNORED_P
277 too, SRA can create even non-DECL_IGNORED_P DECL_NAMELESS fancy
278 names, let's hope those never get out of sync after doing the
279 dump_fancy_name sanitization. */
280 else if ((flags & TDF_COMPARE_DEBUG)
281 && DECL_NAMELESS (node)
282 && DECL_IGNORED_P (node))
283 name = NULL_TREE;
284 /* For DECL_NAMELESS names look for embedded uids in the
285 names and sanitize them for TDF_NOUID. */
286 else if ((flags & TDF_NOUID) && DECL_NAMELESS (node))
287 dump_fancy_name (pp, name);
288 else
289 pp_tree_identifier (pp, name);
291 char uid_sep = (flags & TDF_GIMPLE) ? '_' : '.';
292 if ((flags & TDF_UID) || name == NULL_TREE)
294 if (TREE_CODE (node) == LABEL_DECL && LABEL_DECL_UID (node) != -1)
295 pp_printf (pp, "L%c%d", uid_sep, (int) LABEL_DECL_UID (node));
296 else if (TREE_CODE (node) == DEBUG_EXPR_DECL)
298 if (flags & TDF_NOUID)
299 pp_string (pp, "D#xxxx");
300 else
301 pp_printf (pp, "D#%i", DEBUG_TEMP_UID (node));
303 else
305 char c = TREE_CODE (node) == CONST_DECL ? 'C' : 'D';
306 if (flags & TDF_NOUID)
307 pp_printf (pp, "%c.xxxx", c);
308 else
309 pp_printf (pp, "%c%c%u", c, uid_sep, DECL_UID (node));
312 if ((flags & TDF_ALIAS) && DECL_PT_UID (node) != DECL_UID (node))
314 if (flags & TDF_NOUID)
315 pp_printf (pp, "ptD.xxxx");
316 else
317 pp_printf (pp, "ptD.%u", DECL_PT_UID (node));
321 /* Like the above, but used for pretty printing function calls. */
323 static void
324 dump_function_name (pretty_printer *pp, tree node, dump_flags_t flags)
326 if (CONVERT_EXPR_P (node))
327 node = TREE_OPERAND (node, 0);
328 if (DECL_NAME (node) && (flags & TDF_ASMNAME) == 0)
329 pp_string (pp, lang_hooks.decl_printable_name (node, 1));
330 else
331 dump_decl_name (pp, node, flags);
334 /* Dump a function declaration. NODE is the FUNCTION_TYPE. PP, SPC and
335 FLAGS are as in dump_generic_node. */
337 static void
338 dump_function_declaration (pretty_printer *pp, tree node,
339 int spc, dump_flags_t flags)
341 bool wrote_arg = false;
342 tree arg;
344 pp_space (pp);
345 pp_left_paren (pp);
347 /* Print the argument types. */
348 arg = TYPE_ARG_TYPES (node);
349 while (arg && arg != void_list_node && arg != error_mark_node)
351 if (wrote_arg)
353 pp_comma (pp);
354 pp_space (pp);
356 wrote_arg = true;
357 dump_generic_node (pp, TREE_VALUE (arg), spc, flags, false);
358 arg = TREE_CHAIN (arg);
361 /* Drop the trailing void_type_node if we had any previous argument. */
362 if (arg == void_list_node && !wrote_arg)
363 pp_string (pp, "void");
364 /* Properly dump vararg function types. */
365 else if (!arg && wrote_arg)
366 pp_string (pp, ", ...");
367 /* Avoid printing any arg for unprototyped functions. */
369 pp_right_paren (pp);
372 /* Dump the domain associated with an array. */
374 static void
375 dump_array_domain (pretty_printer *pp, tree domain, int spc, dump_flags_t flags)
377 pp_left_bracket (pp);
378 if (domain)
380 tree min = TYPE_MIN_VALUE (domain);
381 tree max = TYPE_MAX_VALUE (domain);
383 if (min && max
384 && integer_zerop (min)
385 && tree_fits_shwi_p (max))
386 pp_wide_integer (pp, tree_to_shwi (max) + 1);
387 else
389 if (min)
390 dump_generic_node (pp, min, spc, flags, false);
391 pp_colon (pp);
392 if (max)
393 dump_generic_node (pp, max, spc, flags, false);
396 else
397 pp_string (pp, "<unknown>");
398 pp_right_bracket (pp);
402 /* Dump OpenMP iterators ITER. */
404 static void
405 dump_omp_iterators (pretty_printer *pp, tree iter, int spc, dump_flags_t flags)
407 pp_string (pp, "iterator(");
408 for (tree it = iter; it; it = TREE_CHAIN (it))
410 if (it != iter)
411 pp_string (pp, ", ");
412 dump_generic_node (pp, TREE_TYPE (TREE_VEC_ELT (it, 0)), spc, flags,
413 false);
414 pp_space (pp);
415 dump_generic_node (pp, TREE_VEC_ELT (it, 0), spc, flags, false);
416 pp_equal (pp);
417 dump_generic_node (pp, TREE_VEC_ELT (it, 1), spc, flags, false);
418 pp_colon (pp);
419 dump_generic_node (pp, TREE_VEC_ELT (it, 2), spc, flags, false);
420 pp_colon (pp);
421 dump_generic_node (pp, TREE_VEC_ELT (it, 3), spc, flags, false);
423 pp_right_paren (pp);
427 /* Dump OpenMP clause CLAUSE. PP, CLAUSE, SPC and FLAGS are as in
428 dump_generic_node. */
430 static void
431 dump_omp_clause (pretty_printer *pp, tree clause, int spc, dump_flags_t flags)
433 const char *name;
434 const char *modifier = NULL;
435 switch (OMP_CLAUSE_CODE (clause))
437 case OMP_CLAUSE_PRIVATE:
438 name = "private";
439 goto print_remap;
440 case OMP_CLAUSE_SHARED:
441 name = "shared";
442 goto print_remap;
443 case OMP_CLAUSE_FIRSTPRIVATE:
444 name = "firstprivate";
445 goto print_remap;
446 case OMP_CLAUSE_LASTPRIVATE:
447 name = "lastprivate";
448 if (OMP_CLAUSE_LASTPRIVATE_CONDITIONAL (clause))
449 modifier = "conditional:";
450 goto print_remap;
451 case OMP_CLAUSE_COPYIN:
452 name = "copyin";
453 goto print_remap;
454 case OMP_CLAUSE_COPYPRIVATE:
455 name = "copyprivate";
456 goto print_remap;
457 case OMP_CLAUSE_UNIFORM:
458 name = "uniform";
459 goto print_remap;
460 case OMP_CLAUSE_USE_DEVICE_PTR:
461 name = "use_device_ptr";
462 if (OMP_CLAUSE_USE_DEVICE_PTR_IF_PRESENT (clause))
463 modifier = "if_present:";
464 goto print_remap;
465 case OMP_CLAUSE_USE_DEVICE_ADDR:
466 name = "use_device_addr";
467 goto print_remap;
468 case OMP_CLAUSE_IS_DEVICE_PTR:
469 name = "is_device_ptr";
470 goto print_remap;
471 case OMP_CLAUSE_INCLUSIVE:
472 name = "inclusive";
473 goto print_remap;
474 case OMP_CLAUSE_EXCLUSIVE:
475 name = "exclusive";
476 goto print_remap;
477 case OMP_CLAUSE__LOOPTEMP_:
478 name = "_looptemp_";
479 goto print_remap;
480 case OMP_CLAUSE__REDUCTEMP_:
481 name = "_reductemp_";
482 goto print_remap;
483 case OMP_CLAUSE__CONDTEMP_:
484 name = "_condtemp_";
485 goto print_remap;
486 case OMP_CLAUSE__SCANTEMP_:
487 name = "_scantemp_";
488 goto print_remap;
489 case OMP_CLAUSE_TO_DECLARE:
490 name = "to";
491 goto print_remap;
492 case OMP_CLAUSE_LINK:
493 name = "link";
494 goto print_remap;
495 case OMP_CLAUSE_NONTEMPORAL:
496 name = "nontemporal";
497 goto print_remap;
498 print_remap:
499 pp_string (pp, name);
500 pp_left_paren (pp);
501 if (modifier)
502 pp_string (pp, modifier);
503 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
504 spc, flags, false);
505 pp_right_paren (pp);
506 break;
508 case OMP_CLAUSE_TASK_REDUCTION:
509 case OMP_CLAUSE_IN_REDUCTION:
510 pp_string (pp, OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_IN_REDUCTION
511 ? "in_" : "task_");
512 /* FALLTHRU */
513 case OMP_CLAUSE_REDUCTION:
514 pp_string (pp, "reduction(");
515 if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_REDUCTION)
517 if (OMP_CLAUSE_REDUCTION_TASK (clause))
518 pp_string (pp, "task,");
519 else if (OMP_CLAUSE_REDUCTION_INSCAN (clause))
520 pp_string (pp, "inscan,");
522 if (OMP_CLAUSE_REDUCTION_CODE (clause) != ERROR_MARK)
524 pp_string (pp,
525 op_symbol_code (OMP_CLAUSE_REDUCTION_CODE (clause)));
526 pp_colon (pp);
528 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
529 spc, flags, false);
530 pp_right_paren (pp);
531 break;
533 case OMP_CLAUSE_IF:
534 pp_string (pp, "if(");
535 switch (OMP_CLAUSE_IF_MODIFIER (clause))
537 case ERROR_MARK: break;
538 case VOID_CST: pp_string (pp, "cancel:"); break;
539 case OMP_PARALLEL: pp_string (pp, "parallel:"); break;
540 case OMP_SIMD: pp_string (pp, "simd:"); break;
541 case OMP_TASK: pp_string (pp, "task:"); break;
542 case OMP_TASKLOOP: pp_string (pp, "taskloop:"); break;
543 case OMP_TARGET_DATA: pp_string (pp, "target data:"); break;
544 case OMP_TARGET: pp_string (pp, "target:"); break;
545 case OMP_TARGET_UPDATE: pp_string (pp, "target update:"); break;
546 case OMP_TARGET_ENTER_DATA:
547 pp_string (pp, "target enter data:"); break;
548 case OMP_TARGET_EXIT_DATA: pp_string (pp, "target exit data:"); break;
549 default: gcc_unreachable ();
551 dump_generic_node (pp, OMP_CLAUSE_IF_EXPR (clause),
552 spc, flags, false);
553 pp_right_paren (pp);
554 break;
556 case OMP_CLAUSE_NUM_THREADS:
557 pp_string (pp, "num_threads(");
558 dump_generic_node (pp, OMP_CLAUSE_NUM_THREADS_EXPR (clause),
559 spc, flags, false);
560 pp_right_paren (pp);
561 break;
563 case OMP_CLAUSE_NOWAIT:
564 pp_string (pp, "nowait");
565 break;
566 case OMP_CLAUSE_ORDERED:
567 pp_string (pp, "ordered");
568 if (OMP_CLAUSE_ORDERED_EXPR (clause))
570 pp_left_paren (pp);
571 dump_generic_node (pp, OMP_CLAUSE_ORDERED_EXPR (clause),
572 spc, flags, false);
573 pp_right_paren (pp);
575 break;
577 case OMP_CLAUSE_DEFAULT:
578 pp_string (pp, "default(");
579 switch (OMP_CLAUSE_DEFAULT_KIND (clause))
581 case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
582 break;
583 case OMP_CLAUSE_DEFAULT_SHARED:
584 pp_string (pp, "shared");
585 break;
586 case OMP_CLAUSE_DEFAULT_NONE:
587 pp_string (pp, "none");
588 break;
589 case OMP_CLAUSE_DEFAULT_PRIVATE:
590 pp_string (pp, "private");
591 break;
592 case OMP_CLAUSE_DEFAULT_FIRSTPRIVATE:
593 pp_string (pp, "firstprivate");
594 break;
595 case OMP_CLAUSE_DEFAULT_PRESENT:
596 pp_string (pp, "present");
597 break;
598 default:
599 gcc_unreachable ();
601 pp_right_paren (pp);
602 break;
604 case OMP_CLAUSE_SCHEDULE:
605 pp_string (pp, "schedule(");
606 if (OMP_CLAUSE_SCHEDULE_KIND (clause)
607 & (OMP_CLAUSE_SCHEDULE_MONOTONIC
608 | OMP_CLAUSE_SCHEDULE_NONMONOTONIC))
610 if (OMP_CLAUSE_SCHEDULE_KIND (clause)
611 & OMP_CLAUSE_SCHEDULE_MONOTONIC)
612 pp_string (pp, "monotonic");
613 else
614 pp_string (pp, "nonmonotonic");
615 if (OMP_CLAUSE_SCHEDULE_SIMD (clause))
616 pp_comma (pp);
617 else
618 pp_colon (pp);
620 if (OMP_CLAUSE_SCHEDULE_SIMD (clause))
621 pp_string (pp, "simd:");
623 switch (OMP_CLAUSE_SCHEDULE_KIND (clause) & OMP_CLAUSE_SCHEDULE_MASK)
625 case OMP_CLAUSE_SCHEDULE_STATIC:
626 pp_string (pp, "static");
627 break;
628 case OMP_CLAUSE_SCHEDULE_DYNAMIC:
629 pp_string (pp, "dynamic");
630 break;
631 case OMP_CLAUSE_SCHEDULE_GUIDED:
632 pp_string (pp, "guided");
633 break;
634 case OMP_CLAUSE_SCHEDULE_RUNTIME:
635 pp_string (pp, "runtime");
636 break;
637 case OMP_CLAUSE_SCHEDULE_AUTO:
638 pp_string (pp, "auto");
639 break;
640 default:
641 gcc_unreachable ();
643 if (OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause))
645 pp_comma (pp);
646 dump_generic_node (pp, OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (clause),
647 spc, flags, false);
649 pp_right_paren (pp);
650 break;
652 case OMP_CLAUSE_UNTIED:
653 pp_string (pp, "untied");
654 break;
656 case OMP_CLAUSE_COLLAPSE:
657 pp_string (pp, "collapse(");
658 dump_generic_node (pp, OMP_CLAUSE_COLLAPSE_EXPR (clause),
659 spc, flags, false);
660 pp_right_paren (pp);
661 break;
663 case OMP_CLAUSE_FINAL:
664 pp_string (pp, "final(");
665 dump_generic_node (pp, OMP_CLAUSE_FINAL_EXPR (clause),
666 spc, flags, false);
667 pp_right_paren (pp);
668 break;
670 case OMP_CLAUSE_MERGEABLE:
671 pp_string (pp, "mergeable");
672 break;
674 case OMP_CLAUSE_LINEAR:
675 pp_string (pp, "linear(");
676 switch (OMP_CLAUSE_LINEAR_KIND (clause))
678 case OMP_CLAUSE_LINEAR_DEFAULT:
679 break;
680 case OMP_CLAUSE_LINEAR_REF:
681 pp_string (pp, "ref(");
682 break;
683 case OMP_CLAUSE_LINEAR_VAL:
684 pp_string (pp, "val(");
685 break;
686 case OMP_CLAUSE_LINEAR_UVAL:
687 pp_string (pp, "uval(");
688 break;
689 default:
690 gcc_unreachable ();
692 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
693 spc, flags, false);
694 if (OMP_CLAUSE_LINEAR_KIND (clause) != OMP_CLAUSE_LINEAR_DEFAULT)
695 pp_right_paren (pp);
696 pp_colon (pp);
697 dump_generic_node (pp, OMP_CLAUSE_LINEAR_STEP (clause),
698 spc, flags, false);
699 pp_right_paren (pp);
700 break;
702 case OMP_CLAUSE_ALIGNED:
703 pp_string (pp, "aligned(");
704 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
705 spc, flags, false);
706 if (OMP_CLAUSE_ALIGNED_ALIGNMENT (clause))
708 pp_colon (pp);
709 dump_generic_node (pp, OMP_CLAUSE_ALIGNED_ALIGNMENT (clause),
710 spc, flags, false);
712 pp_right_paren (pp);
713 break;
715 case OMP_CLAUSE_ALLOCATE:
716 pp_string (pp, "allocate(");
717 if (OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause))
719 dump_generic_node (pp, OMP_CLAUSE_ALLOCATE_ALLOCATOR (clause),
720 spc, flags, false);
721 pp_colon (pp);
723 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
724 spc, flags, false);
725 pp_right_paren (pp);
726 break;
728 case OMP_CLAUSE_DEPEND:
729 pp_string (pp, "depend(");
730 switch (OMP_CLAUSE_DEPEND_KIND (clause))
732 case OMP_CLAUSE_DEPEND_DEPOBJ:
733 name = "depobj";
734 break;
735 case OMP_CLAUSE_DEPEND_IN:
736 name = "in";
737 break;
738 case OMP_CLAUSE_DEPEND_OUT:
739 name = "out";
740 break;
741 case OMP_CLAUSE_DEPEND_INOUT:
742 name = "inout";
743 break;
744 case OMP_CLAUSE_DEPEND_MUTEXINOUTSET:
745 name = "mutexinoutset";
746 break;
747 case OMP_CLAUSE_DEPEND_SOURCE:
748 pp_string (pp, "source)");
749 return;
750 case OMP_CLAUSE_DEPEND_LAST:
751 name = "__internal__";
752 break;
753 case OMP_CLAUSE_DEPEND_SINK:
754 pp_string (pp, "sink:");
755 for (tree t = OMP_CLAUSE_DECL (clause); t; t = TREE_CHAIN (t))
756 if (TREE_CODE (t) == TREE_LIST)
758 dump_generic_node (pp, TREE_VALUE (t), spc, flags, false);
759 if (TREE_PURPOSE (t) != integer_zero_node)
761 if (OMP_CLAUSE_DEPEND_SINK_NEGATIVE (t))
762 pp_minus (pp);
763 else
764 pp_plus (pp);
765 dump_generic_node (pp, TREE_PURPOSE (t), spc, flags,
766 false);
768 if (TREE_CHAIN (t))
769 pp_comma (pp);
771 else
772 gcc_unreachable ();
773 pp_right_paren (pp);
774 return;
775 default:
776 gcc_unreachable ();
779 tree t = OMP_CLAUSE_DECL (clause);
780 if (TREE_CODE (t) == TREE_LIST
781 && TREE_PURPOSE (t)
782 && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
784 dump_omp_iterators (pp, TREE_PURPOSE (t), spc, flags);
785 pp_colon (pp);
786 t = TREE_VALUE (t);
788 pp_string (pp, name);
789 pp_colon (pp);
790 dump_generic_node (pp, t, spc, flags, false);
791 pp_right_paren (pp);
793 break;
795 case OMP_CLAUSE_MAP:
796 pp_string (pp, "map(");
797 switch (OMP_CLAUSE_MAP_KIND (clause))
799 case GOMP_MAP_ALLOC:
800 case GOMP_MAP_POINTER:
801 pp_string (pp, "alloc");
802 break;
803 case GOMP_MAP_IF_PRESENT:
804 pp_string (pp, "no_alloc");
805 break;
806 case GOMP_MAP_TO:
807 case GOMP_MAP_TO_PSET:
808 pp_string (pp, "to");
809 break;
810 case GOMP_MAP_FROM:
811 pp_string (pp, "from");
812 break;
813 case GOMP_MAP_TOFROM:
814 pp_string (pp, "tofrom");
815 break;
816 case GOMP_MAP_FORCE_ALLOC:
817 pp_string (pp, "force_alloc");
818 break;
819 case GOMP_MAP_FORCE_TO:
820 pp_string (pp, "force_to");
821 break;
822 case GOMP_MAP_FORCE_FROM:
823 pp_string (pp, "force_from");
824 break;
825 case GOMP_MAP_FORCE_TOFROM:
826 pp_string (pp, "force_tofrom");
827 break;
828 case GOMP_MAP_FORCE_PRESENT:
829 pp_string (pp, "force_present");
830 break;
831 case GOMP_MAP_DELETE:
832 pp_string (pp, "delete");
833 break;
834 case GOMP_MAP_FORCE_DEVICEPTR:
835 pp_string (pp, "force_deviceptr");
836 break;
837 case GOMP_MAP_ALWAYS_TO:
838 pp_string (pp, "always,to");
839 break;
840 case GOMP_MAP_ALWAYS_FROM:
841 pp_string (pp, "always,from");
842 break;
843 case GOMP_MAP_ALWAYS_TOFROM:
844 pp_string (pp, "always,tofrom");
845 break;
846 case GOMP_MAP_RELEASE:
847 pp_string (pp, "release");
848 break;
849 case GOMP_MAP_FIRSTPRIVATE_POINTER:
850 pp_string (pp, "firstprivate");
851 break;
852 case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
853 pp_string (pp, "firstprivate ref");
854 break;
855 case GOMP_MAP_STRUCT:
856 pp_string (pp, "struct");
857 break;
858 case GOMP_MAP_ALWAYS_POINTER:
859 pp_string (pp, "always_pointer");
860 break;
861 case GOMP_MAP_DEVICE_RESIDENT:
862 pp_string (pp, "device_resident");
863 break;
864 case GOMP_MAP_LINK:
865 pp_string (pp, "link");
866 break;
867 case GOMP_MAP_ATTACH:
868 pp_string (pp, "attach");
869 break;
870 case GOMP_MAP_DETACH:
871 pp_string (pp, "detach");
872 break;
873 case GOMP_MAP_FORCE_DETACH:
874 pp_string (pp, "force_detach");
875 break;
876 case GOMP_MAP_ATTACH_DETACH:
877 pp_string (pp, "attach_detach");
878 break;
879 default:
880 gcc_unreachable ();
882 pp_colon (pp);
883 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
884 spc, flags, false);
885 print_clause_size:
886 if (OMP_CLAUSE_SIZE (clause))
888 switch (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
889 ? OMP_CLAUSE_MAP_KIND (clause) : GOMP_MAP_TO)
891 case GOMP_MAP_POINTER:
892 case GOMP_MAP_FIRSTPRIVATE_POINTER:
893 case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
894 case GOMP_MAP_ALWAYS_POINTER:
895 pp_string (pp, " [pointer assign, bias: ");
896 break;
897 case GOMP_MAP_TO_PSET:
898 pp_string (pp, " [pointer set, len: ");
899 break;
900 case GOMP_MAP_ATTACH:
901 case GOMP_MAP_DETACH:
902 case GOMP_MAP_FORCE_DETACH:
903 case GOMP_MAP_ATTACH_DETACH:
904 pp_string (pp, " [bias: ");
905 break;
906 default:
907 pp_string (pp, " [len: ");
908 break;
910 dump_generic_node (pp, OMP_CLAUSE_SIZE (clause),
911 spc, flags, false);
912 pp_right_bracket (pp);
914 pp_right_paren (pp);
915 break;
917 case OMP_CLAUSE_FROM:
918 pp_string (pp, "from(");
919 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
920 spc, flags, false);
921 goto print_clause_size;
923 case OMP_CLAUSE_TO:
924 pp_string (pp, "to(");
925 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
926 spc, flags, false);
927 goto print_clause_size;
929 case OMP_CLAUSE__CACHE_:
930 pp_string (pp, "(");
931 dump_generic_node (pp, OMP_CLAUSE_DECL (clause),
932 spc, flags, false);
933 goto print_clause_size;
935 case OMP_CLAUSE_NUM_TEAMS:
936 pp_string (pp, "num_teams(");
937 dump_generic_node (pp, OMP_CLAUSE_NUM_TEAMS_EXPR (clause),
938 spc, flags, false);
939 pp_right_paren (pp);
940 break;
942 case OMP_CLAUSE_THREAD_LIMIT:
943 pp_string (pp, "thread_limit(");
944 dump_generic_node (pp, OMP_CLAUSE_THREAD_LIMIT_EXPR (clause),
945 spc, flags, false);
946 pp_right_paren (pp);
947 break;
949 case OMP_CLAUSE_DEVICE:
950 pp_string (pp, "device(");
951 dump_generic_node (pp, OMP_CLAUSE_DEVICE_ID (clause),
952 spc, flags, false);
953 pp_right_paren (pp);
954 break;
956 case OMP_CLAUSE_DIST_SCHEDULE:
957 pp_string (pp, "dist_schedule(static");
958 if (OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause))
960 pp_comma (pp);
961 dump_generic_node (pp,
962 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (clause),
963 spc, flags, false);
965 pp_right_paren (pp);
966 break;
968 case OMP_CLAUSE_PROC_BIND:
969 pp_string (pp, "proc_bind(");
970 switch (OMP_CLAUSE_PROC_BIND_KIND (clause))
972 case OMP_CLAUSE_PROC_BIND_MASTER:
973 pp_string (pp, "master");
974 break;
975 case OMP_CLAUSE_PROC_BIND_CLOSE:
976 pp_string (pp, "close");
977 break;
978 case OMP_CLAUSE_PROC_BIND_SPREAD:
979 pp_string (pp, "spread");
980 break;
981 default:
982 gcc_unreachable ();
984 pp_right_paren (pp);
985 break;
987 case OMP_CLAUSE_DEVICE_TYPE:
988 pp_string (pp, "device_type(");
989 switch (OMP_CLAUSE_DEVICE_TYPE_KIND (clause))
991 case OMP_CLAUSE_DEVICE_TYPE_HOST:
992 pp_string (pp, "host");
993 break;
994 case OMP_CLAUSE_DEVICE_TYPE_NOHOST:
995 pp_string (pp, "nohost");
996 break;
997 case OMP_CLAUSE_DEVICE_TYPE_ANY:
998 pp_string (pp, "any");
999 break;
1000 default:
1001 gcc_unreachable ();
1003 pp_right_paren (pp);
1004 break;
1006 case OMP_CLAUSE_SAFELEN:
1007 pp_string (pp, "safelen(");
1008 dump_generic_node (pp, OMP_CLAUSE_SAFELEN_EXPR (clause),
1009 spc, flags, false);
1010 pp_right_paren (pp);
1011 break;
1013 case OMP_CLAUSE_SIMDLEN:
1014 pp_string (pp, "simdlen(");
1015 dump_generic_node (pp, OMP_CLAUSE_SIMDLEN_EXPR (clause),
1016 spc, flags, false);
1017 pp_right_paren (pp);
1018 break;
1020 case OMP_CLAUSE_PRIORITY:
1021 pp_string (pp, "priority(");
1022 dump_generic_node (pp, OMP_CLAUSE_PRIORITY_EXPR (clause),
1023 spc, flags, false);
1024 pp_right_paren (pp);
1025 break;
1027 case OMP_CLAUSE_GRAINSIZE:
1028 pp_string (pp, "grainsize(");
1029 dump_generic_node (pp, OMP_CLAUSE_GRAINSIZE_EXPR (clause),
1030 spc, flags, false);
1031 pp_right_paren (pp);
1032 break;
1034 case OMP_CLAUSE_NUM_TASKS:
1035 pp_string (pp, "num_tasks(");
1036 dump_generic_node (pp, OMP_CLAUSE_NUM_TASKS_EXPR (clause),
1037 spc, flags, false);
1038 pp_right_paren (pp);
1039 break;
1041 case OMP_CLAUSE_HINT:
1042 pp_string (pp, "hint(");
1043 dump_generic_node (pp, OMP_CLAUSE_HINT_EXPR (clause),
1044 spc, flags, false);
1045 pp_right_paren (pp);
1046 break;
1048 case OMP_CLAUSE_DEFAULTMAP:
1049 pp_string (pp, "defaultmap(");
1050 switch (OMP_CLAUSE_DEFAULTMAP_BEHAVIOR (clause))
1052 case OMP_CLAUSE_DEFAULTMAP_ALLOC:
1053 pp_string (pp, "alloc");
1054 break;
1055 case OMP_CLAUSE_DEFAULTMAP_TO:
1056 pp_string (pp, "to");
1057 break;
1058 case OMP_CLAUSE_DEFAULTMAP_FROM:
1059 pp_string (pp, "from");
1060 break;
1061 case OMP_CLAUSE_DEFAULTMAP_TOFROM:
1062 pp_string (pp, "tofrom");
1063 break;
1064 case OMP_CLAUSE_DEFAULTMAP_FIRSTPRIVATE:
1065 pp_string (pp, "firstprivate");
1066 break;
1067 case OMP_CLAUSE_DEFAULTMAP_NONE:
1068 pp_string (pp, "none");
1069 break;
1070 case OMP_CLAUSE_DEFAULTMAP_DEFAULT:
1071 pp_string (pp, "default");
1072 break;
1073 default:
1074 gcc_unreachable ();
1076 switch (OMP_CLAUSE_DEFAULTMAP_CATEGORY (clause))
1078 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_UNSPECIFIED:
1079 break;
1080 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_SCALAR:
1081 pp_string (pp, ":scalar");
1082 break;
1083 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_AGGREGATE:
1084 pp_string (pp, ":aggregate");
1085 break;
1086 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_ALLOCATABLE:
1087 pp_string (pp, ":allocatable");
1088 break;
1089 case OMP_CLAUSE_DEFAULTMAP_CATEGORY_POINTER:
1090 pp_string (pp, ":pointer");
1091 break;
1092 default:
1093 gcc_unreachable ();
1095 pp_right_paren (pp);
1096 break;
1098 case OMP_CLAUSE_ORDER:
1099 pp_string (pp, "order(concurrent)");
1100 break;
1102 case OMP_CLAUSE_BIND:
1103 pp_string (pp, "bind(");
1104 switch (OMP_CLAUSE_BIND_KIND (clause))
1106 case OMP_CLAUSE_BIND_TEAMS:
1107 pp_string (pp, "teams");
1108 break;
1109 case OMP_CLAUSE_BIND_PARALLEL:
1110 pp_string (pp, "parallel");
1111 break;
1112 case OMP_CLAUSE_BIND_THREAD:
1113 pp_string (pp, "thread");
1114 break;
1115 default:
1116 gcc_unreachable ();
1118 pp_right_paren (pp);
1119 break;
1121 case OMP_CLAUSE__SIMDUID_:
1122 pp_string (pp, "_simduid_(");
1123 dump_generic_node (pp, OMP_CLAUSE__SIMDUID__DECL (clause),
1124 spc, flags, false);
1125 pp_right_paren (pp);
1126 break;
1128 case OMP_CLAUSE__SIMT_:
1129 pp_string (pp, "_simt_");
1130 break;
1132 case OMP_CLAUSE_GANG:
1133 pp_string (pp, "gang");
1134 if (OMP_CLAUSE_GANG_EXPR (clause) != NULL_TREE)
1136 pp_string (pp, "(num: ");
1137 dump_generic_node (pp, OMP_CLAUSE_GANG_EXPR (clause),
1138 spc, flags, false);
1140 if (OMP_CLAUSE_GANG_STATIC_EXPR (clause) != NULL_TREE)
1142 if (OMP_CLAUSE_GANG_EXPR (clause) == NULL_TREE)
1143 pp_left_paren (pp);
1144 else
1145 pp_space (pp);
1146 pp_string (pp, "static:");
1147 if (OMP_CLAUSE_GANG_STATIC_EXPR (clause)
1148 == integer_minus_one_node)
1149 pp_character (pp, '*');
1150 else
1151 dump_generic_node (pp, OMP_CLAUSE_GANG_STATIC_EXPR (clause),
1152 spc, flags, false);
1154 if (OMP_CLAUSE_GANG_EXPR (clause) != NULL_TREE
1155 || OMP_CLAUSE_GANG_STATIC_EXPR (clause) != NULL_TREE)
1156 pp_right_paren (pp);
1157 break;
1159 case OMP_CLAUSE_ASYNC:
1160 pp_string (pp, "async");
1161 if (OMP_CLAUSE_ASYNC_EXPR (clause))
1163 pp_character(pp, '(');
1164 dump_generic_node (pp, OMP_CLAUSE_ASYNC_EXPR (clause),
1165 spc, flags, false);
1166 pp_character(pp, ')');
1168 break;
1170 case OMP_CLAUSE_AUTO:
1171 case OMP_CLAUSE_SEQ:
1172 pp_string (pp, omp_clause_code_name[OMP_CLAUSE_CODE (clause)]);
1173 break;
1175 case OMP_CLAUSE_WAIT:
1176 pp_string (pp, "wait(");
1177 dump_generic_node (pp, OMP_CLAUSE_WAIT_EXPR (clause),
1178 spc, flags, false);
1179 pp_character(pp, ')');
1180 break;
1182 case OMP_CLAUSE_WORKER:
1183 pp_string (pp, "worker");
1184 if (OMP_CLAUSE_WORKER_EXPR (clause) != NULL_TREE)
1186 pp_left_paren (pp);
1187 dump_generic_node (pp, OMP_CLAUSE_WORKER_EXPR (clause),
1188 spc, flags, false);
1189 pp_right_paren (pp);
1191 break;
1193 case OMP_CLAUSE_VECTOR:
1194 pp_string (pp, "vector");
1195 if (OMP_CLAUSE_VECTOR_EXPR (clause) != NULL_TREE)
1197 pp_left_paren (pp);
1198 dump_generic_node (pp, OMP_CLAUSE_VECTOR_EXPR (clause),
1199 spc, flags, false);
1200 pp_right_paren (pp);
1202 break;
1204 case OMP_CLAUSE_NUM_GANGS:
1205 pp_string (pp, "num_gangs(");
1206 dump_generic_node (pp, OMP_CLAUSE_NUM_GANGS_EXPR (clause),
1207 spc, flags, false);
1208 pp_character (pp, ')');
1209 break;
1211 case OMP_CLAUSE_NUM_WORKERS:
1212 pp_string (pp, "num_workers(");
1213 dump_generic_node (pp, OMP_CLAUSE_NUM_WORKERS_EXPR (clause),
1214 spc, flags, false);
1215 pp_character (pp, ')');
1216 break;
1218 case OMP_CLAUSE_VECTOR_LENGTH:
1219 pp_string (pp, "vector_length(");
1220 dump_generic_node (pp, OMP_CLAUSE_VECTOR_LENGTH_EXPR (clause),
1221 spc, flags, false);
1222 pp_character (pp, ')');
1223 break;
1225 case OMP_CLAUSE_INBRANCH:
1226 pp_string (pp, "inbranch");
1227 break;
1228 case OMP_CLAUSE_NOTINBRANCH:
1229 pp_string (pp, "notinbranch");
1230 break;
1231 case OMP_CLAUSE_FOR:
1232 pp_string (pp, "for");
1233 break;
1234 case OMP_CLAUSE_PARALLEL:
1235 pp_string (pp, "parallel");
1236 break;
1237 case OMP_CLAUSE_SECTIONS:
1238 pp_string (pp, "sections");
1239 break;
1240 case OMP_CLAUSE_TASKGROUP:
1241 pp_string (pp, "taskgroup");
1242 break;
1243 case OMP_CLAUSE_NOGROUP:
1244 pp_string (pp, "nogroup");
1245 break;
1246 case OMP_CLAUSE_THREADS:
1247 pp_string (pp, "threads");
1248 break;
1249 case OMP_CLAUSE_SIMD:
1250 pp_string (pp, "simd");
1251 break;
1252 case OMP_CLAUSE_INDEPENDENT:
1253 pp_string (pp, "independent");
1254 break;
1255 case OMP_CLAUSE_TILE:
1256 pp_string (pp, "tile(");
1257 dump_generic_node (pp, OMP_CLAUSE_TILE_LIST (clause),
1258 spc, flags, false);
1259 pp_right_paren (pp);
1260 break;
1262 case OMP_CLAUSE_IF_PRESENT:
1263 pp_string (pp, "if_present");
1264 break;
1265 case OMP_CLAUSE_FINALIZE:
1266 pp_string (pp, "finalize");
1267 break;
1269 default:
1270 gcc_unreachable ();
1275 /* Dump the list of OpenMP clauses. PP, SPC and FLAGS are as in
1276 dump_generic_node. */
1278 void
1279 dump_omp_clauses (pretty_printer *pp, tree clause, int spc, dump_flags_t flags)
1281 if (clause == NULL)
1282 return;
1284 pp_space (pp);
1285 while (1)
1287 dump_omp_clause (pp, clause, spc, flags);
1288 clause = OMP_CLAUSE_CHAIN (clause);
1289 if (clause == NULL)
1290 return;
1291 pp_space (pp);
1296 /* Dump location LOC to PP. */
1298 void
1299 dump_location (pretty_printer *pp, location_t loc)
1301 expanded_location xloc = expand_location (loc);
1303 pp_left_bracket (pp);
1304 if (xloc.file)
1306 pp_string (pp, xloc.file);
1307 pp_string (pp, ":");
1309 pp_decimal_int (pp, xloc.line);
1310 pp_colon (pp);
1311 pp_decimal_int (pp, xloc.column);
1312 pp_string (pp, "] ");
1316 /* Dump lexical block BLOCK. PP, SPC and FLAGS are as in
1317 dump_generic_node. */
1319 static void
1320 dump_block_node (pretty_printer *pp, tree block, int spc, dump_flags_t flags)
1322 tree t;
1324 pp_printf (pp, "BLOCK #%d ", BLOCK_NUMBER (block));
1326 if (flags & TDF_ADDRESS)
1327 pp_printf (pp, "[%p] ", (void *) block);
1329 if (TREE_ASM_WRITTEN (block))
1330 pp_string (pp, "[written] ");
1332 if (flags & TDF_SLIM)
1333 return;
1335 if (BLOCK_SOURCE_LOCATION (block))
1336 dump_location (pp, BLOCK_SOURCE_LOCATION (block));
1338 newline_and_indent (pp, spc + 2);
1340 if (BLOCK_SUPERCONTEXT (block))
1342 pp_string (pp, "SUPERCONTEXT: ");
1343 dump_generic_node (pp, BLOCK_SUPERCONTEXT (block), 0,
1344 flags | TDF_SLIM, false);
1345 newline_and_indent (pp, spc + 2);
1348 if (BLOCK_SUBBLOCKS (block))
1350 pp_string (pp, "SUBBLOCKS: ");
1351 for (t = BLOCK_SUBBLOCKS (block); t; t = BLOCK_CHAIN (t))
1353 dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1354 pp_space (pp);
1356 newline_and_indent (pp, spc + 2);
1359 if (BLOCK_CHAIN (block))
1361 pp_string (pp, "SIBLINGS: ");
1362 for (t = BLOCK_CHAIN (block); t; t = BLOCK_CHAIN (t))
1364 dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1365 pp_space (pp);
1367 newline_and_indent (pp, spc + 2);
1370 if (BLOCK_VARS (block))
1372 pp_string (pp, "VARS: ");
1373 for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
1375 dump_generic_node (pp, t, 0, flags, false);
1376 pp_space (pp);
1378 newline_and_indent (pp, spc + 2);
1381 if (vec_safe_length (BLOCK_NONLOCALIZED_VARS (block)) > 0)
1383 unsigned i;
1384 vec<tree, va_gc> *nlv = BLOCK_NONLOCALIZED_VARS (block);
1386 pp_string (pp, "NONLOCALIZED_VARS: ");
1387 FOR_EACH_VEC_ELT (*nlv, i, t)
1389 dump_generic_node (pp, t, 0, flags, false);
1390 pp_space (pp);
1392 newline_and_indent (pp, spc + 2);
1395 if (BLOCK_ABSTRACT_ORIGIN (block))
1397 pp_string (pp, "ABSTRACT_ORIGIN: ");
1398 dump_generic_node (pp, BLOCK_ABSTRACT_ORIGIN (block), 0,
1399 flags | TDF_SLIM, false);
1400 newline_and_indent (pp, spc + 2);
1403 if (BLOCK_FRAGMENT_ORIGIN (block))
1405 pp_string (pp, "FRAGMENT_ORIGIN: ");
1406 dump_generic_node (pp, BLOCK_FRAGMENT_ORIGIN (block), 0,
1407 flags | TDF_SLIM, false);
1408 newline_and_indent (pp, spc + 2);
1411 if (BLOCK_FRAGMENT_CHAIN (block))
1413 pp_string (pp, "FRAGMENT_CHAIN: ");
1414 for (t = BLOCK_FRAGMENT_CHAIN (block); t; t = BLOCK_FRAGMENT_CHAIN (t))
1416 dump_generic_node (pp, t, 0, flags | TDF_SLIM, false);
1417 pp_space (pp);
1419 newline_and_indent (pp, spc + 2);
1423 /* Dump #pragma omp atomic memory order clause. */
1425 void
1426 dump_omp_atomic_memory_order (pretty_printer *pp, enum omp_memory_order mo)
1428 switch (mo)
1430 case OMP_MEMORY_ORDER_RELAXED:
1431 pp_string (pp, " relaxed");
1432 break;
1433 case OMP_MEMORY_ORDER_SEQ_CST:
1434 pp_string (pp, " seq_cst");
1435 break;
1436 case OMP_MEMORY_ORDER_ACQ_REL:
1437 pp_string (pp, " acq_rel");
1438 break;
1439 case OMP_MEMORY_ORDER_ACQUIRE:
1440 pp_string (pp, " acquire");
1441 break;
1442 case OMP_MEMORY_ORDER_RELEASE:
1443 pp_string (pp, " release");
1444 break;
1445 case OMP_MEMORY_ORDER_UNSPECIFIED:
1446 break;
1447 default:
1448 gcc_unreachable ();
1452 /* Helper to dump a MEM_REF node. */
1454 static void
1455 dump_mem_ref (pretty_printer *pp, tree node, int spc, dump_flags_t flags)
1457 if (TREE_CODE (node) == MEM_REF && (flags & TDF_GIMPLE))
1459 pp_string (pp, "__MEM <");
1460 dump_generic_node (pp, TREE_TYPE (node),
1461 spc, flags | TDF_SLIM, false);
1462 if (TYPE_ALIGN (TREE_TYPE (node))
1463 != TYPE_ALIGN (TYPE_MAIN_VARIANT (TREE_TYPE (node))))
1465 pp_string (pp, ", ");
1466 pp_decimal_int (pp, TYPE_ALIGN (TREE_TYPE (node)));
1468 pp_greater (pp);
1469 pp_string (pp, " (");
1470 if (TREE_TYPE (TREE_OPERAND (node, 0))
1471 != TREE_TYPE (TREE_OPERAND (node, 1)))
1473 pp_left_paren (pp);
1474 dump_generic_node (pp, TREE_TYPE (TREE_OPERAND (node, 1)),
1475 spc, flags | TDF_SLIM, false);
1476 pp_right_paren (pp);
1478 dump_generic_node (pp, TREE_OPERAND (node, 0),
1479 spc, flags | TDF_SLIM, false);
1480 if (! integer_zerop (TREE_OPERAND (node, 1)))
1482 pp_string (pp, " + ");
1483 dump_generic_node (pp, TREE_OPERAND (node, 1),
1484 spc, flags | TDF_SLIM, false);
1486 pp_right_paren (pp);
1488 else if (TREE_CODE (node) == MEM_REF
1489 && integer_zerop (TREE_OPERAND (node, 1))
1490 /* Dump the types of INTEGER_CSTs explicitly, for we can't
1491 infer them and MEM_ATTR caching will share MEM_REFs
1492 with differently-typed op0s. */
1493 && TREE_CODE (TREE_OPERAND (node, 0)) != INTEGER_CST
1494 /* Released SSA_NAMES have no TREE_TYPE. */
1495 && TREE_TYPE (TREE_OPERAND (node, 0)) != NULL_TREE
1496 /* Same pointer types, but ignoring POINTER_TYPE vs.
1497 REFERENCE_TYPE. */
1498 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 0)))
1499 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1))))
1500 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 0)))
1501 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (node, 1))))
1502 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 0)))
1503 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (node, 1))))
1504 /* Same value types ignoring qualifiers. */
1505 && (TYPE_MAIN_VARIANT (TREE_TYPE (node))
1506 == TYPE_MAIN_VARIANT
1507 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (node, 1)))))
1508 && (!(flags & TDF_ALIAS)
1509 || MR_DEPENDENCE_CLIQUE (node) == 0))
1511 if (TREE_CODE (TREE_OPERAND (node, 0)) != ADDR_EXPR)
1513 /* Enclose pointers to arrays in parentheses. */
1514 tree op0 = TREE_OPERAND (node, 0);
1515 tree op0type = TREE_TYPE (op0);
1516 if (POINTER_TYPE_P (op0type)
1517 && TREE_CODE (TREE_TYPE (op0type)) == ARRAY_TYPE)
1518 pp_left_paren (pp);
1519 pp_star (pp);
1520 dump_generic_node (pp, op0, spc, flags, false);
1521 if (POINTER_TYPE_P (op0type)
1522 && TREE_CODE (TREE_TYPE (op0type)) == ARRAY_TYPE)
1523 pp_right_paren (pp);
1525 else
1526 dump_generic_node (pp,
1527 TREE_OPERAND (TREE_OPERAND (node, 0), 0),
1528 spc, flags, false);
1530 else
1532 pp_string (pp, "MEM");
1534 tree nodetype = TREE_TYPE (node);
1535 tree op0 = TREE_OPERAND (node, 0);
1536 tree op1 = TREE_OPERAND (node, 1);
1537 tree op1type = TYPE_MAIN_VARIANT (TREE_TYPE (op1));
1539 tree op0size = TYPE_SIZE (nodetype);
1540 tree op1size = TYPE_SIZE (TREE_TYPE (op1type));
1542 if (!op0size || !op1size
1543 || !operand_equal_p (op0size, op1size, 0))
1545 pp_string (pp, " <");
1546 /* If the size of the type of the operand is not the same
1547 as the size of the MEM_REF expression include the type
1548 of the latter similar to the TDF_GIMPLE output to make
1549 it clear how many bytes of memory are being accessed. */
1550 dump_generic_node (pp, nodetype, spc, flags | TDF_SLIM, false);
1551 pp_string (pp, "> ");
1554 pp_string (pp, "[(");
1555 dump_generic_node (pp, op1type, spc, flags | TDF_SLIM, false);
1556 pp_right_paren (pp);
1557 dump_generic_node (pp, op0, spc, flags, false);
1558 if (!integer_zerop (op1))
1560 pp_string (pp, " + ");
1561 dump_generic_node (pp, op1, spc, flags, false);
1563 if (TREE_CODE (node) == TARGET_MEM_REF)
1565 tree tmp = TMR_INDEX2 (node);
1566 if (tmp)
1568 pp_string (pp, " + ");
1569 dump_generic_node (pp, tmp, spc, flags, false);
1571 tmp = TMR_INDEX (node);
1572 if (tmp)
1574 pp_string (pp, " + ");
1575 dump_generic_node (pp, tmp, spc, flags, false);
1576 tmp = TMR_STEP (node);
1577 pp_string (pp, " * ");
1578 if (tmp)
1579 dump_generic_node (pp, tmp, spc, flags, false);
1580 else
1581 pp_string (pp, "1");
1584 if ((flags & TDF_ALIAS)
1585 && MR_DEPENDENCE_CLIQUE (node) != 0)
1587 pp_string (pp, " clique ");
1588 pp_unsigned_wide_integer (pp, MR_DEPENDENCE_CLIQUE (node));
1589 pp_string (pp, " base ");
1590 pp_unsigned_wide_integer (pp, MR_DEPENDENCE_BASE (node));
1592 pp_right_bracket (pp);
1596 /* Helper function for dump_generic_node. Dump INIT or COND expression for
1597 OpenMP loop non-rectangular iterators. */
1599 void
1600 dump_omp_loop_non_rect_expr (pretty_printer *pp, tree node, int spc,
1601 dump_flags_t flags)
1603 gcc_assert (TREE_CODE (node) == TREE_VEC);
1604 dump_generic_node (pp, TREE_VEC_ELT (node, 0), spc, flags, false);
1605 pp_string (pp, " * ");
1606 if (op_prio (TREE_VEC_ELT (node, 1)) <= op_code_prio (MULT_EXPR))
1608 pp_left_paren (pp);
1609 dump_generic_node (pp, TREE_VEC_ELT (node, 1), spc, flags, false);
1610 pp_right_paren (pp);
1612 else
1613 dump_generic_node (pp, TREE_VEC_ELT (node, 1), spc, flags, false);
1614 pp_string (pp, " + ");
1615 if (op_prio (TREE_VEC_ELT (node, 1)) <= op_code_prio (PLUS_EXPR))
1617 pp_left_paren (pp);
1618 dump_generic_node (pp, TREE_VEC_ELT (node, 2), spc, flags, false);
1619 pp_right_paren (pp);
1621 else
1622 dump_generic_node (pp, TREE_VEC_ELT (node, 2), spc, flags, false);
1625 /* Dump the node NODE on the pretty_printer PP, SPC spaces of
1626 indent. FLAGS specifies details to show in the dump (see TDF_* in
1627 dumpfile.h). If IS_STMT is true, the object printed is considered
1628 to be a statement and it is terminated by ';' if appropriate. */
1631 dump_generic_node (pretty_printer *pp, tree node, int spc, dump_flags_t flags,
1632 bool is_stmt)
1634 tree type;
1635 tree op0, op1;
1636 const char *str;
1637 bool is_expr;
1638 enum tree_code code;
1640 if (node == NULL_TREE)
1641 return spc;
1643 is_expr = EXPR_P (node);
1645 if (is_stmt && (flags & TDF_STMTADDR))
1646 pp_printf (pp, "<&%p> ", (void *)node);
1648 if ((flags & TDF_LINENO) && EXPR_HAS_LOCATION (node))
1649 dump_location (pp, EXPR_LOCATION (node));
1651 code = TREE_CODE (node);
1652 switch (code)
1654 case ERROR_MARK:
1655 pp_string (pp, "<<< error >>>");
1656 break;
1658 case IDENTIFIER_NODE:
1659 pp_tree_identifier (pp, node);
1660 break;
1662 case TREE_LIST:
1663 while (node && node != error_mark_node)
1665 if (TREE_PURPOSE (node))
1667 dump_generic_node (pp, TREE_PURPOSE (node), spc, flags, false);
1668 pp_space (pp);
1670 dump_generic_node (pp, TREE_VALUE (node), spc, flags, false);
1671 node = TREE_CHAIN (node);
1672 if (node && TREE_CODE (node) == TREE_LIST)
1674 pp_comma (pp);
1675 pp_space (pp);
1678 break;
1680 case TREE_BINFO:
1681 dump_generic_node (pp, BINFO_TYPE (node), spc, flags, false);
1682 break;
1684 case TREE_VEC:
1686 size_t i;
1687 if (TREE_VEC_LENGTH (node) > 0)
1689 size_t len = TREE_VEC_LENGTH (node);
1690 for (i = 0; i < len - 1; i++)
1692 dump_generic_node (pp, TREE_VEC_ELT (node, i), spc, flags,
1693 false);
1694 pp_comma (pp);
1695 pp_space (pp);
1697 dump_generic_node (pp, TREE_VEC_ELT (node, len - 1), spc,
1698 flags, false);
1701 break;
1703 case VOID_TYPE:
1704 case INTEGER_TYPE:
1705 case REAL_TYPE:
1706 case FIXED_POINT_TYPE:
1707 case COMPLEX_TYPE:
1708 case VECTOR_TYPE:
1709 case ENUMERAL_TYPE:
1710 case BOOLEAN_TYPE:
1712 unsigned int quals = TYPE_QUALS (node);
1713 enum tree_code_class tclass;
1715 if (quals & TYPE_QUAL_ATOMIC)
1716 pp_string (pp, "atomic ");
1717 if (quals & TYPE_QUAL_CONST)
1718 pp_string (pp, "const ");
1719 if (quals & TYPE_QUAL_VOLATILE)
1720 pp_string (pp, "volatile ");
1721 if (quals & TYPE_QUAL_RESTRICT)
1722 pp_string (pp, "restrict ");
1724 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
1726 pp_string (pp, "<address-space-");
1727 pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
1728 pp_string (pp, "> ");
1731 tclass = TREE_CODE_CLASS (TREE_CODE (node));
1733 if (tclass == tcc_declaration)
1735 if (DECL_NAME (node))
1736 dump_decl_name (pp, node, flags);
1737 else
1738 pp_string (pp, "<unnamed type decl>");
1740 else if (tclass == tcc_type)
1742 if (TYPE_NAME (node))
1744 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
1745 pp_tree_identifier (pp, TYPE_NAME (node));
1746 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
1747 && DECL_NAME (TYPE_NAME (node)))
1748 dump_decl_name (pp, TYPE_NAME (node), flags);
1749 else
1750 pp_string (pp, "<unnamed type>");
1752 else if (TREE_CODE (node) == VECTOR_TYPE)
1754 pp_string (pp, "vector");
1755 pp_left_paren (pp);
1756 pp_wide_integer (pp, TYPE_VECTOR_SUBPARTS (node));
1757 pp_string (pp, ") ");
1758 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
1760 else if (TREE_CODE (node) == INTEGER_TYPE)
1762 if (TYPE_PRECISION (node) == CHAR_TYPE_SIZE)
1763 pp_string (pp, (TYPE_UNSIGNED (node)
1764 ? "unsigned char"
1765 : "signed char"));
1766 else if (TYPE_PRECISION (node) == SHORT_TYPE_SIZE)
1767 pp_string (pp, (TYPE_UNSIGNED (node)
1768 ? "unsigned short"
1769 : "signed short"));
1770 else if (TYPE_PRECISION (node) == INT_TYPE_SIZE)
1771 pp_string (pp, (TYPE_UNSIGNED (node)
1772 ? "unsigned int"
1773 : "signed int"));
1774 else if (TYPE_PRECISION (node) == LONG_TYPE_SIZE)
1775 pp_string (pp, (TYPE_UNSIGNED (node)
1776 ? "unsigned long"
1777 : "signed long"));
1778 else if (TYPE_PRECISION (node) == LONG_LONG_TYPE_SIZE)
1779 pp_string (pp, (TYPE_UNSIGNED (node)
1780 ? "unsigned long long"
1781 : "signed long long"));
1782 else if (TYPE_PRECISION (node) >= CHAR_TYPE_SIZE
1783 && pow2p_hwi (TYPE_PRECISION (node)))
1785 pp_string (pp, (TYPE_UNSIGNED (node) ? "uint" : "int"));
1786 pp_decimal_int (pp, TYPE_PRECISION (node));
1787 pp_string (pp, "_t");
1789 else
1791 pp_string (pp, (TYPE_UNSIGNED (node)
1792 ? "<unnamed-unsigned:"
1793 : "<unnamed-signed:"));
1794 pp_decimal_int (pp, TYPE_PRECISION (node));
1795 pp_greater (pp);
1798 else if (TREE_CODE (node) == COMPLEX_TYPE)
1800 pp_string (pp, "__complex__ ");
1801 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
1803 else if (TREE_CODE (node) == REAL_TYPE)
1805 pp_string (pp, "<float:");
1806 pp_decimal_int (pp, TYPE_PRECISION (node));
1807 pp_greater (pp);
1809 else if (TREE_CODE (node) == FIXED_POINT_TYPE)
1811 pp_string (pp, "<fixed-point-");
1812 pp_string (pp, TYPE_SATURATING (node) ? "sat:" : "nonsat:");
1813 pp_decimal_int (pp, TYPE_PRECISION (node));
1814 pp_greater (pp);
1816 else if (TREE_CODE (node) == BOOLEAN_TYPE)
1818 pp_string (pp, (TYPE_UNSIGNED (node)
1819 ? "<unsigned-boolean:"
1820 : "<signed-boolean:"));
1821 pp_decimal_int (pp, TYPE_PRECISION (node));
1822 pp_greater (pp);
1824 else if (TREE_CODE (node) == VOID_TYPE)
1825 pp_string (pp, "void");
1826 else
1827 pp_string (pp, "<unnamed type>");
1829 break;
1832 case POINTER_TYPE:
1833 case REFERENCE_TYPE:
1834 str = (TREE_CODE (node) == POINTER_TYPE ? "*" : "&");
1836 if (TREE_TYPE (node) == NULL)
1838 pp_string (pp, str);
1839 pp_string (pp, "<null type>");
1841 else if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
1843 tree fnode = TREE_TYPE (node);
1845 dump_generic_node (pp, TREE_TYPE (fnode), spc, flags, false);
1846 pp_space (pp);
1847 pp_left_paren (pp);
1848 pp_string (pp, str);
1849 if (TYPE_IDENTIFIER (node))
1850 dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
1851 else if (flags & TDF_NOUID)
1852 pp_printf (pp, "<Txxxx>");
1853 else
1854 pp_printf (pp, "<T%x>", TYPE_UID (node));
1856 pp_right_paren (pp);
1857 dump_function_declaration (pp, fnode, spc, flags);
1859 else
1861 unsigned int quals = TYPE_QUALS (node);
1863 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
1864 pp_space (pp);
1865 pp_string (pp, str);
1867 if (quals & TYPE_QUAL_CONST)
1868 pp_string (pp, " const");
1869 if (quals & TYPE_QUAL_VOLATILE)
1870 pp_string (pp, " volatile");
1871 if (quals & TYPE_QUAL_RESTRICT)
1872 pp_string (pp, " restrict");
1874 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
1876 pp_string (pp, " <address-space-");
1877 pp_decimal_int (pp, TYPE_ADDR_SPACE (node));
1878 pp_greater (pp);
1881 if (TYPE_REF_CAN_ALIAS_ALL (node))
1882 pp_string (pp, " {ref-all}");
1884 break;
1886 case OFFSET_TYPE:
1887 NIY;
1888 break;
1890 case MEM_REF:
1891 case TARGET_MEM_REF:
1892 dump_mem_ref (pp, node, spc, flags);
1893 break;
1895 case ARRAY_TYPE:
1897 unsigned int quals = TYPE_QUALS (node);
1898 tree tmp;
1900 if (quals & TYPE_QUAL_ATOMIC)
1901 pp_string (pp, "atomic ");
1902 if (quals & TYPE_QUAL_CONST)
1903 pp_string (pp, "const ");
1904 if (quals & TYPE_QUAL_VOLATILE)
1905 pp_string (pp, "volatile ");
1907 /* Print the innermost component type. */
1908 for (tmp = TREE_TYPE (node); TREE_CODE (tmp) == ARRAY_TYPE;
1909 tmp = TREE_TYPE (tmp))
1911 dump_generic_node (pp, tmp, spc, flags, false);
1913 /* Print the dimensions. */
1914 for (tmp = node; TREE_CODE (tmp) == ARRAY_TYPE; tmp = TREE_TYPE (tmp))
1915 dump_array_domain (pp, TYPE_DOMAIN (tmp), spc, flags);
1916 break;
1919 case RECORD_TYPE:
1920 case UNION_TYPE:
1921 case QUAL_UNION_TYPE:
1923 unsigned int quals = TYPE_QUALS (node);
1925 if (quals & TYPE_QUAL_ATOMIC)
1926 pp_string (pp, "atomic ");
1927 if (quals & TYPE_QUAL_CONST)
1928 pp_string (pp, "const ");
1929 if (quals & TYPE_QUAL_VOLATILE)
1930 pp_string (pp, "volatile ");
1932 /* Print the name of the structure. */
1933 if (TREE_CODE (node) == RECORD_TYPE)
1934 pp_string (pp, "struct ");
1935 else if (TREE_CODE (node) == UNION_TYPE)
1936 pp_string (pp, "union ");
1938 if (TYPE_NAME (node))
1939 dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
1940 else if (!(flags & TDF_SLIM))
1941 /* FIXME: If we eliminate the 'else' above and attempt
1942 to show the fields for named types, we may get stuck
1943 following a cycle of pointers to structs. The alleged
1944 self-reference check in print_struct_decl will not detect
1945 cycles involving more than one pointer or struct type. */
1946 print_struct_decl (pp, node, spc, flags);
1947 break;
1950 case LANG_TYPE:
1951 NIY;
1952 break;
1954 case INTEGER_CST:
1955 if (flags & TDF_GIMPLE
1956 && (POINTER_TYPE_P (TREE_TYPE (node))
1957 || (TYPE_PRECISION (TREE_TYPE (node))
1958 < TYPE_PRECISION (integer_type_node))
1959 || exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1
1960 || tree_int_cst_sgn (node) < 0))
1962 pp_string (pp, "_Literal (");
1963 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
1964 pp_string (pp, ") ");
1966 if (TREE_CODE (TREE_TYPE (node)) == POINTER_TYPE
1967 && ! (flags & TDF_GIMPLE))
1969 /* In the case of a pointer, one may want to divide by the
1970 size of the pointed-to type. Unfortunately, this not
1971 straightforward. The C front-end maps expressions
1973 (int *) 5
1974 int *p; (p + 5)
1976 in such a way that the two INTEGER_CST nodes for "5" have
1977 different values but identical types. In the latter
1978 case, the 5 is multiplied by sizeof (int) in c-common.c
1979 (pointer_int_sum) to convert it to a byte address, and
1980 yet the type of the node is left unchanged. Argh. What
1981 is consistent though is that the number value corresponds
1982 to bytes (UNITS) offset.
1984 NB: Neither of the following divisors can be trivially
1985 used to recover the original literal:
1987 TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (node)))
1988 TYPE_PRECISION (TREE_TYPE (TREE_TYPE (node))) */
1989 pp_wide_integer (pp, TREE_INT_CST_LOW (node));
1990 pp_string (pp, "B"); /* pseudo-unit */
1992 else if (tree_fits_shwi_p (node))
1993 pp_wide_integer (pp, tree_to_shwi (node));
1994 else if (tree_fits_uhwi_p (node))
1995 pp_unsigned_wide_integer (pp, tree_to_uhwi (node));
1996 else
1998 wide_int val = wi::to_wide (node);
2000 if (wi::neg_p (val, TYPE_SIGN (TREE_TYPE (node))))
2002 pp_minus (pp);
2003 val = -val;
2005 print_hex (val, pp_buffer (pp)->digit_buffer);
2006 pp_string (pp, pp_buffer (pp)->digit_buffer);
2008 if ((flags & TDF_GIMPLE)
2009 && ! (POINTER_TYPE_P (TREE_TYPE (node))
2010 || (TYPE_PRECISION (TREE_TYPE (node))
2011 < TYPE_PRECISION (integer_type_node))
2012 || exact_log2 (TYPE_PRECISION (TREE_TYPE (node))) == -1))
2014 if (TYPE_UNSIGNED (TREE_TYPE (node)))
2015 pp_character (pp, 'u');
2016 if (TYPE_PRECISION (TREE_TYPE (node))
2017 == TYPE_PRECISION (unsigned_type_node))
2019 else if (TYPE_PRECISION (TREE_TYPE (node))
2020 == TYPE_PRECISION (long_unsigned_type_node))
2021 pp_character (pp, 'l');
2022 else if (TYPE_PRECISION (TREE_TYPE (node))
2023 == TYPE_PRECISION (long_long_unsigned_type_node))
2024 pp_string (pp, "ll");
2026 if (TREE_OVERFLOW (node))
2027 pp_string (pp, "(OVF)");
2028 break;
2030 case POLY_INT_CST:
2031 pp_string (pp, "POLY_INT_CST [");
2032 dump_generic_node (pp, POLY_INT_CST_COEFF (node, 0), spc, flags, false);
2033 for (unsigned int i = 1; i < NUM_POLY_INT_COEFFS; ++i)
2035 pp_string (pp, ", ");
2036 dump_generic_node (pp, POLY_INT_CST_COEFF (node, i),
2037 spc, flags, false);
2039 pp_string (pp, "]");
2040 break;
2042 case REAL_CST:
2043 /* Code copied from print_node. */
2045 REAL_VALUE_TYPE d;
2046 if (TREE_OVERFLOW (node))
2047 pp_string (pp, " overflow");
2049 d = TREE_REAL_CST (node);
2050 if (REAL_VALUE_ISINF (d))
2051 pp_string (pp, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
2052 else if (REAL_VALUE_ISNAN (d))
2053 pp_string (pp, " Nan");
2054 else
2056 char string[100];
2057 real_to_decimal (string, &d, sizeof (string), 0, 1);
2058 pp_string (pp, string);
2060 break;
2063 case FIXED_CST:
2065 char string[100];
2066 fixed_to_decimal (string, TREE_FIXED_CST_PTR (node), sizeof (string));
2067 pp_string (pp, string);
2068 break;
2071 case COMPLEX_CST:
2072 pp_string (pp, "__complex__ (");
2073 dump_generic_node (pp, TREE_REALPART (node), spc, flags, false);
2074 pp_string (pp, ", ");
2075 dump_generic_node (pp, TREE_IMAGPART (node), spc, flags, false);
2076 pp_right_paren (pp);
2077 break;
2079 case STRING_CST:
2081 pp_string (pp, "\"");
2082 if (unsigned nbytes = TREE_STRING_LENGTH (node))
2083 pretty_print_string (pp, TREE_STRING_POINTER (node), nbytes);
2084 pp_string (pp, "\"");
2085 break;
2088 case VECTOR_CST:
2090 unsigned i;
2091 if (flags & TDF_GIMPLE)
2093 pp_string (pp, "_Literal (");
2094 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2095 pp_string (pp, ") ");
2097 pp_string (pp, "{ ");
2098 unsigned HOST_WIDE_INT nunits;
2099 if (!VECTOR_CST_NELTS (node).is_constant (&nunits))
2100 nunits = vector_cst_encoded_nelts (node);
2101 for (i = 0; i < nunits; ++i)
2103 if (i != 0)
2104 pp_string (pp, ", ");
2105 dump_generic_node (pp, VECTOR_CST_ELT (node, i),
2106 spc, flags, false);
2108 if (!VECTOR_CST_NELTS (node).is_constant ())
2109 pp_string (pp, ", ...");
2110 pp_string (pp, " }");
2112 break;
2114 case FUNCTION_TYPE:
2115 case METHOD_TYPE:
2116 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2117 pp_space (pp);
2118 if (TREE_CODE (node) == METHOD_TYPE)
2120 if (TYPE_METHOD_BASETYPE (node))
2121 dump_generic_node (pp, TYPE_NAME (TYPE_METHOD_BASETYPE (node)),
2122 spc, flags, false);
2123 else
2124 pp_string (pp, "<null method basetype>");
2125 pp_colon_colon (pp);
2127 if (TYPE_IDENTIFIER (node))
2128 dump_generic_node (pp, TYPE_NAME (node), spc, flags, false);
2129 else if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
2130 dump_decl_name (pp, TYPE_NAME (node), flags);
2131 else if (flags & TDF_NOUID)
2132 pp_printf (pp, "<Txxxx>");
2133 else
2134 pp_printf (pp, "<T%x>", TYPE_UID (node));
2135 dump_function_declaration (pp, node, spc, flags);
2136 break;
2138 case FUNCTION_DECL:
2139 case CONST_DECL:
2140 dump_decl_name (pp, node, flags);
2141 break;
2143 case LABEL_DECL:
2144 if (DECL_NAME (node))
2145 dump_decl_name (pp, node, flags);
2146 else if (LABEL_DECL_UID (node) != -1)
2148 if (flags & TDF_GIMPLE)
2149 pp_printf (pp, "L%d", (int) LABEL_DECL_UID (node));
2150 else
2151 pp_printf (pp, "<L%d>", (int) LABEL_DECL_UID (node));
2153 else
2155 if (flags & TDF_NOUID)
2156 pp_string (pp, "<D.xxxx>");
2157 else
2159 if (flags & TDF_GIMPLE)
2160 pp_printf (pp, "<D%u>", DECL_UID (node));
2161 else
2162 pp_printf (pp, "<D.%u>", DECL_UID (node));
2165 break;
2167 case TYPE_DECL:
2168 if (DECL_IS_UNDECLARED_BUILTIN (node))
2170 /* Don't print the declaration of built-in types. */
2171 break;
2173 if (DECL_NAME (node))
2174 dump_decl_name (pp, node, flags);
2175 else if (TYPE_NAME (TREE_TYPE (node)) != node)
2177 pp_string (pp, (TREE_CODE (TREE_TYPE (node)) == UNION_TYPE
2178 ? "union" : "struct "));
2179 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2181 else
2182 pp_string (pp, "<anon>");
2183 break;
2185 case VAR_DECL:
2186 case PARM_DECL:
2187 case FIELD_DECL:
2188 case DEBUG_EXPR_DECL:
2189 case NAMESPACE_DECL:
2190 case NAMELIST_DECL:
2191 dump_decl_name (pp, node, flags);
2192 break;
2194 case RESULT_DECL:
2195 pp_string (pp, "<retval>");
2196 break;
2198 case COMPONENT_REF:
2199 op0 = TREE_OPERAND (node, 0);
2200 str = ".";
2201 if (op0
2202 && (TREE_CODE (op0) == INDIRECT_REF
2203 || (TREE_CODE (op0) == MEM_REF
2204 && TREE_CODE (TREE_OPERAND (op0, 0)) != ADDR_EXPR
2205 && integer_zerop (TREE_OPERAND (op0, 1))
2206 /* Dump the types of INTEGER_CSTs explicitly, for we
2207 can't infer them and MEM_ATTR caching will share
2208 MEM_REFs with differently-typed op0s. */
2209 && TREE_CODE (TREE_OPERAND (op0, 0)) != INTEGER_CST
2210 /* Released SSA_NAMES have no TREE_TYPE. */
2211 && TREE_TYPE (TREE_OPERAND (op0, 0)) != NULL_TREE
2212 /* Same pointer types, but ignoring POINTER_TYPE vs.
2213 REFERENCE_TYPE. */
2214 && (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 0)))
2215 == TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1))))
2216 && (TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 0)))
2217 == TYPE_MODE (TREE_TYPE (TREE_OPERAND (op0, 1))))
2218 && (TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 0)))
2219 == TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (TREE_OPERAND (op0, 1))))
2220 /* Same value types ignoring qualifiers. */
2221 && (TYPE_MAIN_VARIANT (TREE_TYPE (op0))
2222 == TYPE_MAIN_VARIANT
2223 (TREE_TYPE (TREE_TYPE (TREE_OPERAND (op0, 1)))))
2224 && MR_DEPENDENCE_CLIQUE (op0) == 0)))
2226 op0 = TREE_OPERAND (op0, 0);
2227 str = "->";
2229 if (op_prio (op0) < op_prio (node))
2230 pp_left_paren (pp);
2231 dump_generic_node (pp, op0, spc, flags, false);
2232 if (op_prio (op0) < op_prio (node))
2233 pp_right_paren (pp);
2234 pp_string (pp, str);
2235 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2236 op0 = component_ref_field_offset (node);
2237 if (op0 && TREE_CODE (op0) != INTEGER_CST)
2239 pp_string (pp, "{off: ");
2240 dump_generic_node (pp, op0, spc, flags, false);
2241 pp_right_brace (pp);
2243 break;
2245 case BIT_FIELD_REF:
2246 if (flags & TDF_GIMPLE)
2248 pp_string (pp, "__BIT_FIELD_REF <");
2249 dump_generic_node (pp, TREE_TYPE (node),
2250 spc, flags | TDF_SLIM, false);
2251 if (TYPE_ALIGN (TREE_TYPE (node))
2252 != TYPE_ALIGN (TYPE_MAIN_VARIANT (TREE_TYPE (node))))
2254 pp_string (pp, ", ");
2255 pp_decimal_int (pp, TYPE_ALIGN (TREE_TYPE (node)));
2257 pp_greater (pp);
2258 pp_string (pp, " (");
2259 dump_generic_node (pp, TREE_OPERAND (node, 0), spc,
2260 flags | TDF_SLIM, false);
2261 pp_string (pp, ", ");
2262 dump_generic_node (pp, TREE_OPERAND (node, 1), spc,
2263 flags | TDF_SLIM, false);
2264 pp_string (pp, ", ");
2265 dump_generic_node (pp, TREE_OPERAND (node, 2), spc,
2266 flags | TDF_SLIM, false);
2267 pp_right_paren (pp);
2269 else
2271 pp_string (pp, "BIT_FIELD_REF <");
2272 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2273 pp_string (pp, ", ");
2274 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2275 pp_string (pp, ", ");
2276 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2277 pp_greater (pp);
2279 break;
2281 case BIT_INSERT_EXPR:
2282 pp_string (pp, "BIT_INSERT_EXPR <");
2283 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2284 pp_string (pp, ", ");
2285 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2286 pp_string (pp, ", ");
2287 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2288 pp_string (pp, " (");
2289 if (INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (node, 1))))
2290 pp_decimal_int (pp,
2291 TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (node, 1))));
2292 else
2293 dump_generic_node (pp, TYPE_SIZE (TREE_TYPE (TREE_OPERAND (node, 1))),
2294 spc, flags, false);
2295 pp_string (pp, " bits)>");
2296 break;
2298 case ARRAY_REF:
2299 case ARRAY_RANGE_REF:
2300 op0 = TREE_OPERAND (node, 0);
2301 if (op_prio (op0) < op_prio (node))
2302 pp_left_paren (pp);
2303 dump_generic_node (pp, op0, spc, flags, false);
2304 if (op_prio (op0) < op_prio (node))
2305 pp_right_paren (pp);
2306 pp_left_bracket (pp);
2307 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2308 if (TREE_CODE (node) == ARRAY_RANGE_REF)
2309 pp_string (pp, " ...");
2310 pp_right_bracket (pp);
2312 op0 = array_ref_low_bound (node);
2313 op1 = array_ref_element_size (node);
2315 if (!integer_zerop (op0)
2316 || TREE_OPERAND (node, 2)
2317 || TREE_OPERAND (node, 3))
2319 pp_string (pp, "{lb: ");
2320 dump_generic_node (pp, op0, spc, flags, false);
2321 pp_string (pp, " sz: ");
2322 dump_generic_node (pp, op1, spc, flags, false);
2323 pp_right_brace (pp);
2325 break;
2327 case CONSTRUCTOR:
2329 unsigned HOST_WIDE_INT ix;
2330 tree field, val;
2331 bool is_struct_init = false;
2332 bool is_array_init = false;
2333 widest_int curidx;
2334 if (flags & TDF_GIMPLE)
2336 pp_string (pp, "_Literal (");
2337 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2338 pp_string (pp, ") ");
2340 pp_left_brace (pp);
2341 if (TREE_CLOBBER_P (node))
2342 pp_string (pp, "CLOBBER");
2343 else if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
2344 || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
2345 is_struct_init = true;
2346 else if (TREE_CODE (TREE_TYPE (node)) == ARRAY_TYPE
2347 && TYPE_DOMAIN (TREE_TYPE (node))
2348 && TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)))
2349 && TREE_CODE (TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node))))
2350 == INTEGER_CST)
2352 tree minv = TYPE_MIN_VALUE (TYPE_DOMAIN (TREE_TYPE (node)));
2353 is_array_init = true;
2354 curidx = wi::to_widest (minv);
2356 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node), ix, field, val)
2358 if (field)
2360 if (is_struct_init)
2362 pp_dot (pp);
2363 dump_generic_node (pp, field, spc, flags, false);
2364 pp_equal (pp);
2366 else if (is_array_init
2367 && (TREE_CODE (field) != INTEGER_CST
2368 || curidx != wi::to_widest (field)))
2370 pp_left_bracket (pp);
2371 if (TREE_CODE (field) == RANGE_EXPR)
2373 dump_generic_node (pp, TREE_OPERAND (field, 0), spc,
2374 flags, false);
2375 pp_string (pp, " ... ");
2376 dump_generic_node (pp, TREE_OPERAND (field, 1), spc,
2377 flags, false);
2378 if (TREE_CODE (TREE_OPERAND (field, 1)) == INTEGER_CST)
2379 curidx = wi::to_widest (TREE_OPERAND (field, 1));
2381 else
2382 dump_generic_node (pp, field, spc, flags, false);
2383 if (TREE_CODE (field) == INTEGER_CST)
2384 curidx = wi::to_widest (field);
2385 pp_string (pp, "]=");
2388 if (is_array_init)
2389 curidx += 1;
2390 if (val && TREE_CODE (val) == ADDR_EXPR)
2391 if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
2392 val = TREE_OPERAND (val, 0);
2393 if (val && TREE_CODE (val) == FUNCTION_DECL)
2394 dump_decl_name (pp, val, flags);
2395 else
2396 dump_generic_node (pp, val, spc, flags, false);
2397 if (ix != CONSTRUCTOR_NELTS (node) - 1)
2399 pp_comma (pp);
2400 pp_space (pp);
2403 pp_right_brace (pp);
2405 break;
2407 case COMPOUND_EXPR:
2409 tree *tp;
2410 if (flags & TDF_SLIM)
2412 pp_string (pp, "<COMPOUND_EXPR>");
2413 break;
2416 dump_generic_node (pp, TREE_OPERAND (node, 0),
2417 spc, flags, !(flags & TDF_SLIM));
2418 if (flags & TDF_SLIM)
2419 newline_and_indent (pp, spc);
2420 else
2422 pp_comma (pp);
2423 pp_space (pp);
2426 for (tp = &TREE_OPERAND (node, 1);
2427 TREE_CODE (*tp) == COMPOUND_EXPR;
2428 tp = &TREE_OPERAND (*tp, 1))
2430 dump_generic_node (pp, TREE_OPERAND (*tp, 0),
2431 spc, flags, !(flags & TDF_SLIM));
2432 if (flags & TDF_SLIM)
2433 newline_and_indent (pp, spc);
2434 else
2436 pp_comma (pp);
2437 pp_space (pp);
2441 dump_generic_node (pp, *tp, spc, flags, !(flags & TDF_SLIM));
2443 break;
2445 case STATEMENT_LIST:
2447 tree_stmt_iterator si;
2448 bool first = true;
2450 if (flags & TDF_SLIM)
2452 pp_string (pp, "<STATEMENT_LIST>");
2453 break;
2456 for (si = tsi_start (node); !tsi_end_p (si); tsi_next (&si))
2458 if (!first)
2459 newline_and_indent (pp, spc);
2460 else
2461 first = false;
2462 dump_generic_node (pp, tsi_stmt (si), spc, flags, true);
2465 break;
2467 case MODIFY_EXPR:
2468 case INIT_EXPR:
2469 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags,
2470 false);
2471 pp_space (pp);
2472 pp_equal (pp);
2473 pp_space (pp);
2474 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags,
2475 false);
2476 break;
2478 case TARGET_EXPR:
2479 pp_string (pp, "TARGET_EXPR <");
2480 dump_generic_node (pp, TARGET_EXPR_SLOT (node), spc, flags, false);
2481 pp_comma (pp);
2482 pp_space (pp);
2483 dump_generic_node (pp, TARGET_EXPR_INITIAL (node), spc, flags, false);
2484 pp_greater (pp);
2485 break;
2487 case DECL_EXPR:
2488 print_declaration (pp, DECL_EXPR_DECL (node), spc, flags);
2489 is_stmt = false;
2490 break;
2492 case COND_EXPR:
2493 if (TREE_TYPE (node) == NULL || TREE_TYPE (node) == void_type_node)
2495 pp_string (pp, "if (");
2496 dump_generic_node (pp, COND_EXPR_COND (node), spc, flags, false);
2497 pp_right_paren (pp);
2498 /* The lowered cond_exprs should always be printed in full. */
2499 if (COND_EXPR_THEN (node)
2500 && (IS_EMPTY_STMT (COND_EXPR_THEN (node))
2501 || TREE_CODE (COND_EXPR_THEN (node)) == GOTO_EXPR)
2502 && COND_EXPR_ELSE (node)
2503 && (IS_EMPTY_STMT (COND_EXPR_ELSE (node))
2504 || TREE_CODE (COND_EXPR_ELSE (node)) == GOTO_EXPR))
2506 pp_space (pp);
2507 dump_generic_node (pp, COND_EXPR_THEN (node),
2508 0, flags, true);
2509 if (!IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
2511 pp_string (pp, " else ");
2512 dump_generic_node (pp, COND_EXPR_ELSE (node),
2513 0, flags, true);
2516 else if (!(flags & TDF_SLIM))
2518 /* Output COND_EXPR_THEN. */
2519 if (COND_EXPR_THEN (node))
2521 newline_and_indent (pp, spc+2);
2522 pp_left_brace (pp);
2523 newline_and_indent (pp, spc+4);
2524 dump_generic_node (pp, COND_EXPR_THEN (node), spc+4,
2525 flags, true);
2526 newline_and_indent (pp, spc+2);
2527 pp_right_brace (pp);
2530 /* Output COND_EXPR_ELSE. */
2531 if (COND_EXPR_ELSE (node)
2532 && !IS_EMPTY_STMT (COND_EXPR_ELSE (node)))
2534 newline_and_indent (pp, spc);
2535 pp_string (pp, "else");
2536 newline_and_indent (pp, spc+2);
2537 pp_left_brace (pp);
2538 newline_and_indent (pp, spc+4);
2539 dump_generic_node (pp, COND_EXPR_ELSE (node), spc+4,
2540 flags, true);
2541 newline_and_indent (pp, spc+2);
2542 pp_right_brace (pp);
2545 is_expr = false;
2547 else
2549 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2550 pp_space (pp);
2551 pp_question (pp);
2552 pp_space (pp);
2553 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2554 pp_space (pp);
2555 pp_colon (pp);
2556 pp_space (pp);
2557 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
2559 break;
2561 case BIND_EXPR:
2562 pp_left_brace (pp);
2563 if (!(flags & TDF_SLIM))
2565 if (BIND_EXPR_VARS (node))
2567 pp_newline (pp);
2569 for (op0 = BIND_EXPR_VARS (node); op0; op0 = DECL_CHAIN (op0))
2571 print_declaration (pp, op0, spc+2, flags);
2572 pp_newline (pp);
2576 newline_and_indent (pp, spc+2);
2577 dump_generic_node (pp, BIND_EXPR_BODY (node), spc+2, flags, true);
2578 newline_and_indent (pp, spc);
2579 pp_right_brace (pp);
2581 is_expr = false;
2582 break;
2584 case CALL_EXPR:
2585 if (CALL_EXPR_FN (node) != NULL_TREE)
2586 print_call_name (pp, CALL_EXPR_FN (node), flags);
2587 else
2589 pp_dot (pp);
2590 pp_string (pp, internal_fn_name (CALL_EXPR_IFN (node)));
2593 /* Print parameters. */
2594 pp_space (pp);
2595 pp_left_paren (pp);
2597 tree arg;
2598 call_expr_arg_iterator iter;
2599 FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
2601 dump_generic_node (pp, arg, spc, flags, false);
2602 if (more_call_expr_args_p (&iter))
2604 pp_comma (pp);
2605 pp_space (pp);
2609 if (CALL_EXPR_VA_ARG_PACK (node))
2611 if (call_expr_nargs (node) > 0)
2613 pp_comma (pp);
2614 pp_space (pp);
2616 pp_string (pp, "__builtin_va_arg_pack ()");
2618 pp_right_paren (pp);
2620 op1 = CALL_EXPR_STATIC_CHAIN (node);
2621 if (op1)
2623 pp_string (pp, " [static-chain: ");
2624 dump_generic_node (pp, op1, spc, flags, false);
2625 pp_right_bracket (pp);
2628 if (CALL_EXPR_RETURN_SLOT_OPT (node))
2629 pp_string (pp, " [return slot optimization]");
2630 if (CALL_EXPR_TAILCALL (node))
2631 pp_string (pp, " [tail call]");
2632 break;
2634 case WITH_CLEANUP_EXPR:
2635 NIY;
2636 break;
2638 case CLEANUP_POINT_EXPR:
2639 pp_string (pp, "<<cleanup_point ");
2640 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2641 pp_string (pp, ">>");
2642 break;
2644 case PLACEHOLDER_EXPR:
2645 pp_string (pp, "<PLACEHOLDER_EXPR ");
2646 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2647 pp_greater (pp);
2648 break;
2650 /* Binary arithmetic and logic expressions. */
2651 case WIDEN_SUM_EXPR:
2652 case WIDEN_MULT_EXPR:
2653 case MULT_EXPR:
2654 case MULT_HIGHPART_EXPR:
2655 case PLUS_EXPR:
2656 case POINTER_PLUS_EXPR:
2657 case POINTER_DIFF_EXPR:
2658 case MINUS_EXPR:
2659 case TRUNC_DIV_EXPR:
2660 case CEIL_DIV_EXPR:
2661 case FLOOR_DIV_EXPR:
2662 case ROUND_DIV_EXPR:
2663 case TRUNC_MOD_EXPR:
2664 case CEIL_MOD_EXPR:
2665 case FLOOR_MOD_EXPR:
2666 case ROUND_MOD_EXPR:
2667 case RDIV_EXPR:
2668 case EXACT_DIV_EXPR:
2669 case LSHIFT_EXPR:
2670 case RSHIFT_EXPR:
2671 case LROTATE_EXPR:
2672 case RROTATE_EXPR:
2673 case WIDEN_LSHIFT_EXPR:
2674 case BIT_IOR_EXPR:
2675 case BIT_XOR_EXPR:
2676 case BIT_AND_EXPR:
2677 case TRUTH_ANDIF_EXPR:
2678 case TRUTH_ORIF_EXPR:
2679 case TRUTH_AND_EXPR:
2680 case TRUTH_OR_EXPR:
2681 case TRUTH_XOR_EXPR:
2682 case LT_EXPR:
2683 case LE_EXPR:
2684 case GT_EXPR:
2685 case GE_EXPR:
2686 case EQ_EXPR:
2687 case NE_EXPR:
2688 case UNLT_EXPR:
2689 case UNLE_EXPR:
2690 case UNGT_EXPR:
2691 case UNGE_EXPR:
2692 case UNEQ_EXPR:
2693 case LTGT_EXPR:
2694 case ORDERED_EXPR:
2695 case UNORDERED_EXPR:
2697 const char *op = op_symbol (node);
2698 op0 = TREE_OPERAND (node, 0);
2699 op1 = TREE_OPERAND (node, 1);
2701 /* When the operands are expressions with less priority,
2702 keep semantics of the tree representation. */
2703 if (op_prio (op0) <= op_prio (node))
2705 pp_left_paren (pp);
2706 dump_generic_node (pp, op0, spc, flags, false);
2707 pp_right_paren (pp);
2709 else
2710 dump_generic_node (pp, op0, spc, flags, false);
2712 pp_space (pp);
2713 pp_string (pp, op);
2714 pp_space (pp);
2716 /* When the operands are expressions with less priority,
2717 keep semantics of the tree representation. */
2718 if (op_prio (op1) <= op_prio (node))
2720 pp_left_paren (pp);
2721 dump_generic_node (pp, op1, spc, flags, false);
2722 pp_right_paren (pp);
2724 else
2725 dump_generic_node (pp, op1, spc, flags, false);
2727 break;
2729 /* Unary arithmetic and logic expressions. */
2730 case NEGATE_EXPR:
2731 case BIT_NOT_EXPR:
2732 case TRUTH_NOT_EXPR:
2733 case ADDR_EXPR:
2734 case PREDECREMENT_EXPR:
2735 case PREINCREMENT_EXPR:
2736 case INDIRECT_REF:
2737 if (TREE_CODE (node) == ADDR_EXPR
2738 && (TREE_CODE (TREE_OPERAND (node, 0)) == STRING_CST
2739 || TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL))
2740 ; /* Do not output '&' for strings and function pointers. */
2741 else
2742 pp_string (pp, op_symbol (node));
2744 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
2746 pp_left_paren (pp);
2747 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2748 pp_right_paren (pp);
2750 else
2751 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2752 break;
2754 case POSTDECREMENT_EXPR:
2755 case POSTINCREMENT_EXPR:
2756 if (op_prio (TREE_OPERAND (node, 0)) < op_prio (node))
2758 pp_left_paren (pp);
2759 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2760 pp_right_paren (pp);
2762 else
2763 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2764 pp_string (pp, op_symbol (node));
2765 break;
2767 case MIN_EXPR:
2768 pp_string (pp, "MIN_EXPR <");
2769 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2770 pp_string (pp, ", ");
2771 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2772 pp_greater (pp);
2773 break;
2775 case MAX_EXPR:
2776 pp_string (pp, "MAX_EXPR <");
2777 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2778 pp_string (pp, ", ");
2779 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2780 pp_greater (pp);
2781 break;
2783 case ABS_EXPR:
2784 pp_string (pp, "ABS_EXPR <");
2785 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2786 pp_greater (pp);
2787 break;
2789 case ABSU_EXPR:
2790 pp_string (pp, "ABSU_EXPR <");
2791 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2792 pp_greater (pp);
2793 break;
2795 case RANGE_EXPR:
2796 NIY;
2797 break;
2799 case ADDR_SPACE_CONVERT_EXPR:
2800 case FIXED_CONVERT_EXPR:
2801 case FIX_TRUNC_EXPR:
2802 case FLOAT_EXPR:
2803 CASE_CONVERT:
2804 type = TREE_TYPE (node);
2805 op0 = TREE_OPERAND (node, 0);
2806 if (type != TREE_TYPE (op0))
2808 pp_left_paren (pp);
2809 dump_generic_node (pp, type, spc, flags, false);
2810 pp_string (pp, ") ");
2812 if (op_prio (op0) < op_prio (node))
2813 pp_left_paren (pp);
2814 dump_generic_node (pp, op0, spc, flags, false);
2815 if (op_prio (op0) < op_prio (node))
2816 pp_right_paren (pp);
2817 break;
2819 case VIEW_CONVERT_EXPR:
2820 if (flags & TDF_GIMPLE)
2821 pp_string (pp, "__VIEW_CONVERT <");
2822 else
2823 pp_string (pp, "VIEW_CONVERT_EXPR<");
2824 dump_generic_node (pp, TREE_TYPE (node), spc, flags, false);
2825 pp_string (pp, ">(");
2826 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2827 pp_right_paren (pp);
2828 break;
2830 case PAREN_EXPR:
2831 pp_string (pp, "((");
2832 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2833 pp_string (pp, "))");
2834 break;
2836 case NON_LVALUE_EXPR:
2837 pp_string (pp, "NON_LVALUE_EXPR <");
2838 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2839 pp_greater (pp);
2840 break;
2842 case SAVE_EXPR:
2843 pp_string (pp, "SAVE_EXPR <");
2844 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2845 pp_greater (pp);
2846 break;
2848 case COMPLEX_EXPR:
2849 pp_string (pp, "COMPLEX_EXPR <");
2850 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2851 pp_string (pp, ", ");
2852 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
2853 pp_greater (pp);
2854 break;
2856 case CONJ_EXPR:
2857 pp_string (pp, "CONJ_EXPR <");
2858 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2859 pp_greater (pp);
2860 break;
2862 case REALPART_EXPR:
2863 if (flags & TDF_GIMPLE)
2865 pp_string (pp, "__real ");
2866 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2868 else
2870 pp_string (pp, "REALPART_EXPR <");
2871 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2872 pp_greater (pp);
2874 break;
2876 case IMAGPART_EXPR:
2877 if (flags & TDF_GIMPLE)
2879 pp_string (pp, "__imag ");
2880 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2882 else
2884 pp_string (pp, "IMAGPART_EXPR <");
2885 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2886 pp_greater (pp);
2888 break;
2890 case VA_ARG_EXPR:
2891 pp_string (pp, "VA_ARG_EXPR <");
2892 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
2893 pp_greater (pp);
2894 break;
2896 case TRY_FINALLY_EXPR:
2897 case TRY_CATCH_EXPR:
2898 pp_string (pp, "try");
2899 newline_and_indent (pp, spc+2);
2900 pp_left_brace (pp);
2901 newline_and_indent (pp, spc+4);
2902 dump_generic_node (pp, TREE_OPERAND (node, 0), spc+4, flags, true);
2903 newline_and_indent (pp, spc+2);
2904 pp_right_brace (pp);
2905 newline_and_indent (pp, spc);
2906 if (TREE_CODE (node) == TRY_CATCH_EXPR)
2908 node = TREE_OPERAND (node, 1);
2909 pp_string (pp, "catch");
2911 else
2913 gcc_assert (TREE_CODE (node) == TRY_FINALLY_EXPR);
2914 node = TREE_OPERAND (node, 1);
2915 pp_string (pp, "finally");
2916 if (TREE_CODE (node) == EH_ELSE_EXPR)
2918 newline_and_indent (pp, spc+2);
2919 pp_left_brace (pp);
2920 newline_and_indent (pp, spc+4);
2921 dump_generic_node (pp, TREE_OPERAND (node, 0), spc+4,
2922 flags, true);
2923 newline_and_indent (pp, spc+2);
2924 pp_right_brace (pp);
2925 newline_and_indent (pp, spc);
2926 node = TREE_OPERAND (node, 1);
2927 pp_string (pp, "else");
2930 newline_and_indent (pp, spc+2);
2931 pp_left_brace (pp);
2932 newline_and_indent (pp, spc+4);
2933 dump_generic_node (pp, node, spc+4, flags, true);
2934 newline_and_indent (pp, spc+2);
2935 pp_right_brace (pp);
2936 is_expr = false;
2937 break;
2939 case CATCH_EXPR:
2940 pp_string (pp, "catch (");
2941 dump_generic_node (pp, CATCH_TYPES (node), spc+2, flags, false);
2942 pp_right_paren (pp);
2943 newline_and_indent (pp, spc+2);
2944 pp_left_brace (pp);
2945 newline_and_indent (pp, spc+4);
2946 dump_generic_node (pp, CATCH_BODY (node), spc+4, flags, true);
2947 newline_and_indent (pp, spc+2);
2948 pp_right_brace (pp);
2949 is_expr = false;
2950 break;
2952 case EH_FILTER_EXPR:
2953 pp_string (pp, "<<<eh_filter (");
2954 dump_generic_node (pp, EH_FILTER_TYPES (node), spc+2, flags, false);
2955 pp_string (pp, ")>>>");
2956 newline_and_indent (pp, spc+2);
2957 pp_left_brace (pp);
2958 newline_and_indent (pp, spc+4);
2959 dump_generic_node (pp, EH_FILTER_FAILURE (node), spc+4, flags, true);
2960 newline_and_indent (pp, spc+2);
2961 pp_right_brace (pp);
2962 is_expr = false;
2963 break;
2965 case LABEL_EXPR:
2966 op0 = TREE_OPERAND (node, 0);
2967 /* If this is for break or continue, don't bother printing it. */
2968 if (DECL_NAME (op0))
2970 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
2971 if (strcmp (name, "break") == 0
2972 || strcmp (name, "continue") == 0)
2973 break;
2975 dump_generic_node (pp, op0, spc, flags, false);
2976 pp_colon (pp);
2977 if (DECL_NONLOCAL (op0))
2978 pp_string (pp, " [non-local]");
2979 break;
2981 case LOOP_EXPR:
2982 pp_string (pp, "while (1)");
2983 if (!(flags & TDF_SLIM))
2985 newline_and_indent (pp, spc+2);
2986 pp_left_brace (pp);
2987 newline_and_indent (pp, spc+4);
2988 dump_generic_node (pp, LOOP_EXPR_BODY (node), spc+4, flags, true);
2989 newline_and_indent (pp, spc+2);
2990 pp_right_brace (pp);
2992 is_expr = false;
2993 break;
2995 case PREDICT_EXPR:
2996 pp_string (pp, "// predicted ");
2997 if (PREDICT_EXPR_OUTCOME (node))
2998 pp_string (pp, "likely by ");
2999 else
3000 pp_string (pp, "unlikely by ");
3001 pp_string (pp, predictor_name (PREDICT_EXPR_PREDICTOR (node)));
3002 pp_string (pp, " predictor.");
3003 break;
3005 case ANNOTATE_EXPR:
3006 pp_string (pp, "ANNOTATE_EXPR <");
3007 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3008 switch ((enum annot_expr_kind) TREE_INT_CST_LOW (TREE_OPERAND (node, 1)))
3010 case annot_expr_ivdep_kind:
3011 pp_string (pp, ", ivdep");
3012 break;
3013 case annot_expr_unroll_kind:
3014 pp_printf (pp, ", unroll %d",
3015 (int) TREE_INT_CST_LOW (TREE_OPERAND (node, 2)));
3016 break;
3017 case annot_expr_no_vector_kind:
3018 pp_string (pp, ", no-vector");
3019 break;
3020 case annot_expr_vector_kind:
3021 pp_string (pp, ", vector");
3022 break;
3023 case annot_expr_parallel_kind:
3024 pp_string (pp, ", parallel");
3025 break;
3026 default:
3027 gcc_unreachable ();
3029 pp_greater (pp);
3030 break;
3032 case RETURN_EXPR:
3033 pp_string (pp, "return");
3034 op0 = TREE_OPERAND (node, 0);
3035 if (op0)
3037 pp_space (pp);
3038 if (TREE_CODE (op0) == MODIFY_EXPR)
3039 dump_generic_node (pp, TREE_OPERAND (op0, 1),
3040 spc, flags, false);
3041 else
3042 dump_generic_node (pp, op0, spc, flags, false);
3044 break;
3046 case EXIT_EXPR:
3047 pp_string (pp, "if (");
3048 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3049 pp_string (pp, ") break");
3050 break;
3052 case SWITCH_EXPR:
3053 pp_string (pp, "switch (");
3054 dump_generic_node (pp, SWITCH_COND (node), spc, flags, false);
3055 pp_right_paren (pp);
3056 if (!(flags & TDF_SLIM))
3058 newline_and_indent (pp, spc+2);
3059 pp_left_brace (pp);
3060 if (SWITCH_BODY (node))
3062 newline_and_indent (pp, spc+4);
3063 dump_generic_node (pp, SWITCH_BODY (node), spc+4, flags,
3064 true);
3066 newline_and_indent (pp, spc+2);
3067 pp_right_brace (pp);
3069 is_expr = false;
3070 break;
3072 case GOTO_EXPR:
3073 op0 = GOTO_DESTINATION (node);
3074 if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
3076 const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
3077 if (strcmp (name, "break") == 0
3078 || strcmp (name, "continue") == 0)
3080 pp_string (pp, name);
3081 break;
3084 pp_string (pp, "goto ");
3085 dump_generic_node (pp, op0, spc, flags, false);
3086 break;
3088 case ASM_EXPR:
3089 pp_string (pp, "__asm__");
3090 if (ASM_VOLATILE_P (node))
3091 pp_string (pp, " __volatile__");
3092 pp_left_paren (pp);
3093 dump_generic_node (pp, ASM_STRING (node), spc, flags, false);
3094 pp_colon (pp);
3095 dump_generic_node (pp, ASM_OUTPUTS (node), spc, flags, false);
3096 pp_colon (pp);
3097 dump_generic_node (pp, ASM_INPUTS (node), spc, flags, false);
3098 if (ASM_CLOBBERS (node))
3100 pp_colon (pp);
3101 dump_generic_node (pp, ASM_CLOBBERS (node), spc, flags, false);
3103 pp_right_paren (pp);
3104 break;
3106 case CASE_LABEL_EXPR:
3107 if (CASE_LOW (node) && CASE_HIGH (node))
3109 pp_string (pp, "case ");
3110 dump_generic_node (pp, CASE_LOW (node), spc, flags, false);
3111 pp_string (pp, " ... ");
3112 dump_generic_node (pp, CASE_HIGH (node), spc, flags, false);
3114 else if (CASE_LOW (node))
3116 pp_string (pp, "case ");
3117 dump_generic_node (pp, CASE_LOW (node), spc, flags, false);
3119 else
3120 pp_string (pp, "default");
3121 pp_colon (pp);
3122 break;
3124 case OBJ_TYPE_REF:
3125 pp_string (pp, "OBJ_TYPE_REF(");
3126 dump_generic_node (pp, OBJ_TYPE_REF_EXPR (node), spc, flags, false);
3127 pp_semicolon (pp);
3128 /* We omit the class type for -fcompare-debug because we may
3129 drop TYPE_BINFO early depending on debug info, and then
3130 virtual_method_call_p would return false, whereas when
3131 TYPE_BINFO is preserved it may still return true and then
3132 we'd print the class type. Compare tree and rtl dumps for
3133 libstdc++-prettyprinters/shared_ptr.cc with and without -g,
3134 for example, at occurrences of OBJ_TYPE_REF. */
3135 if (!(flags & (TDF_SLIM | TDF_COMPARE_DEBUG))
3136 && virtual_method_call_p (node, true))
3138 pp_string (pp, "(");
3139 dump_generic_node (pp, obj_type_ref_class (node, true),
3140 spc, flags, false);
3141 pp_string (pp, ")");
3143 dump_generic_node (pp, OBJ_TYPE_REF_OBJECT (node), spc, flags, false);
3144 pp_arrow (pp);
3145 dump_generic_node (pp, OBJ_TYPE_REF_TOKEN (node), spc, flags, false);
3146 pp_right_paren (pp);
3147 break;
3149 case SSA_NAME:
3150 if (SSA_NAME_IDENTIFIER (node))
3152 if ((flags & TDF_NOUID)
3153 && SSA_NAME_VAR (node)
3154 && DECL_NAMELESS (SSA_NAME_VAR (node)))
3155 dump_fancy_name (pp, SSA_NAME_IDENTIFIER (node));
3156 else if (! (flags & TDF_GIMPLE)
3157 || SSA_NAME_VAR (node))
3158 dump_generic_node (pp, SSA_NAME_IDENTIFIER (node),
3159 spc, flags, false);
3161 pp_underscore (pp);
3162 pp_decimal_int (pp, SSA_NAME_VERSION (node));
3163 if (SSA_NAME_IS_DEFAULT_DEF (node))
3164 pp_string (pp, "(D)");
3165 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
3166 pp_string (pp, "(ab)");
3167 break;
3169 case WITH_SIZE_EXPR:
3170 pp_string (pp, "WITH_SIZE_EXPR <");
3171 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3172 pp_string (pp, ", ");
3173 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3174 pp_greater (pp);
3175 break;
3177 case ASSERT_EXPR:
3178 pp_string (pp, "ASSERT_EXPR <");
3179 dump_generic_node (pp, ASSERT_EXPR_VAR (node), spc, flags, false);
3180 pp_string (pp, ", ");
3181 dump_generic_node (pp, ASSERT_EXPR_COND (node), spc, flags, false);
3182 pp_greater (pp);
3183 break;
3185 case SCEV_KNOWN:
3186 pp_string (pp, "scev_known");
3187 break;
3189 case SCEV_NOT_KNOWN:
3190 pp_string (pp, "scev_not_known");
3191 break;
3193 case POLYNOMIAL_CHREC:
3194 pp_left_brace (pp);
3195 dump_generic_node (pp, CHREC_LEFT (node), spc, flags, false);
3196 pp_string (pp, ", +, ");
3197 dump_generic_node (pp, CHREC_RIGHT (node), spc, flags, false);
3198 pp_printf (pp, "}_%u", CHREC_VARIABLE (node));
3199 is_stmt = false;
3200 break;
3202 case REALIGN_LOAD_EXPR:
3203 pp_string (pp, "REALIGN_LOAD <");
3204 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3205 pp_string (pp, ", ");
3206 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3207 pp_string (pp, ", ");
3208 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3209 pp_greater (pp);
3210 break;
3212 case VEC_COND_EXPR:
3213 pp_string (pp, " VEC_COND_EXPR < ");
3214 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3215 pp_string (pp, " , ");
3216 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3217 pp_string (pp, " , ");
3218 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3219 pp_string (pp, " > ");
3220 break;
3222 case VEC_PERM_EXPR:
3223 pp_string (pp, " VEC_PERM_EXPR < ");
3224 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3225 pp_string (pp, " , ");
3226 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3227 pp_string (pp, " , ");
3228 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3229 pp_string (pp, " > ");
3230 break;
3232 case DOT_PROD_EXPR:
3233 pp_string (pp, " DOT_PROD_EXPR < ");
3234 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3235 pp_string (pp, ", ");
3236 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3237 pp_string (pp, ", ");
3238 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3239 pp_string (pp, " > ");
3240 break;
3242 case WIDEN_MULT_PLUS_EXPR:
3243 pp_string (pp, " WIDEN_MULT_PLUS_EXPR < ");
3244 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3245 pp_string (pp, ", ");
3246 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3247 pp_string (pp, ", ");
3248 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3249 pp_string (pp, " > ");
3250 break;
3252 case WIDEN_MULT_MINUS_EXPR:
3253 pp_string (pp, " WIDEN_MULT_MINUS_EXPR < ");
3254 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3255 pp_string (pp, ", ");
3256 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3257 pp_string (pp, ", ");
3258 dump_generic_node (pp, TREE_OPERAND (node, 2), spc, flags, false);
3259 pp_string (pp, " > ");
3260 break;
3262 case OACC_PARALLEL:
3263 pp_string (pp, "#pragma acc parallel");
3264 goto dump_omp_clauses_body;
3266 case OACC_KERNELS:
3267 pp_string (pp, "#pragma acc kernels");
3268 goto dump_omp_clauses_body;
3270 case OACC_SERIAL:
3271 pp_string (pp, "#pragma acc serial");
3272 goto dump_omp_clauses_body;
3274 case OACC_DATA:
3275 pp_string (pp, "#pragma acc data");
3276 dump_omp_clauses (pp, OACC_DATA_CLAUSES (node), spc, flags);
3277 goto dump_omp_body;
3279 case OACC_HOST_DATA:
3280 pp_string (pp, "#pragma acc host_data");
3281 dump_omp_clauses (pp, OACC_HOST_DATA_CLAUSES (node), spc, flags);
3282 goto dump_omp_body;
3284 case OACC_DECLARE:
3285 pp_string (pp, "#pragma acc declare");
3286 dump_omp_clauses (pp, OACC_DECLARE_CLAUSES (node), spc, flags);
3287 break;
3289 case OACC_UPDATE:
3290 pp_string (pp, "#pragma acc update");
3291 dump_omp_clauses (pp, OACC_UPDATE_CLAUSES (node), spc, flags);
3292 break;
3294 case OACC_ENTER_DATA:
3295 pp_string (pp, "#pragma acc enter data");
3296 dump_omp_clauses (pp, OACC_ENTER_DATA_CLAUSES (node), spc, flags);
3297 break;
3299 case OACC_EXIT_DATA:
3300 pp_string (pp, "#pragma acc exit data");
3301 dump_omp_clauses (pp, OACC_EXIT_DATA_CLAUSES (node), spc, flags);
3302 break;
3304 case OACC_CACHE:
3305 pp_string (pp, "#pragma acc cache");
3306 dump_omp_clauses (pp, OACC_CACHE_CLAUSES (node), spc, flags);
3307 break;
3309 case OMP_PARALLEL:
3310 pp_string (pp, "#pragma omp parallel");
3311 dump_omp_clauses (pp, OMP_PARALLEL_CLAUSES (node), spc, flags);
3312 goto dump_omp_body;
3314 dump_omp_clauses_body:
3315 dump_omp_clauses (pp, OMP_CLAUSES (node), spc, flags);
3316 goto dump_omp_body;
3318 dump_omp_body:
3319 if (!(flags & TDF_SLIM) && OMP_BODY (node))
3321 newline_and_indent (pp, spc + 2);
3322 pp_left_brace (pp);
3323 newline_and_indent (pp, spc + 4);
3324 dump_generic_node (pp, OMP_BODY (node), spc + 4, flags, false);
3325 newline_and_indent (pp, spc + 2);
3326 pp_right_brace (pp);
3328 is_expr = false;
3329 break;
3331 case OMP_TASK:
3332 pp_string (pp, OMP_TASK_BODY (node) ? "#pragma omp task"
3333 : "#pragma omp taskwait");
3334 dump_omp_clauses (pp, OMP_TASK_CLAUSES (node), spc, flags);
3335 goto dump_omp_body;
3337 case OMP_FOR:
3338 pp_string (pp, "#pragma omp for");
3339 goto dump_omp_loop;
3341 case OMP_SIMD:
3342 pp_string (pp, "#pragma omp simd");
3343 goto dump_omp_loop;
3345 case OMP_DISTRIBUTE:
3346 pp_string (pp, "#pragma omp distribute");
3347 goto dump_omp_loop;
3349 case OMP_TASKLOOP:
3350 pp_string (pp, "#pragma omp taskloop");
3351 goto dump_omp_loop;
3353 case OMP_LOOP:
3354 pp_string (pp, "#pragma omp loop");
3355 goto dump_omp_loop;
3357 case OACC_LOOP:
3358 pp_string (pp, "#pragma acc loop");
3359 goto dump_omp_loop;
3361 case OMP_TEAMS:
3362 pp_string (pp, "#pragma omp teams");
3363 dump_omp_clauses (pp, OMP_TEAMS_CLAUSES (node), spc, flags);
3364 goto dump_omp_body;
3366 case OMP_TARGET_DATA:
3367 pp_string (pp, "#pragma omp target data");
3368 dump_omp_clauses (pp, OMP_TARGET_DATA_CLAUSES (node), spc, flags);
3369 goto dump_omp_body;
3371 case OMP_TARGET_ENTER_DATA:
3372 pp_string (pp, "#pragma omp target enter data");
3373 dump_omp_clauses (pp, OMP_TARGET_ENTER_DATA_CLAUSES (node), spc, flags);
3374 is_expr = false;
3375 break;
3377 case OMP_TARGET_EXIT_DATA:
3378 pp_string (pp, "#pragma omp target exit data");
3379 dump_omp_clauses (pp, OMP_TARGET_EXIT_DATA_CLAUSES (node), spc, flags);
3380 is_expr = false;
3381 break;
3383 case OMP_TARGET:
3384 pp_string (pp, "#pragma omp target");
3385 dump_omp_clauses (pp, OMP_TARGET_CLAUSES (node), spc, flags);
3386 goto dump_omp_body;
3388 case OMP_TARGET_UPDATE:
3389 pp_string (pp, "#pragma omp target update");
3390 dump_omp_clauses (pp, OMP_TARGET_UPDATE_CLAUSES (node), spc, flags);
3391 is_expr = false;
3392 break;
3394 dump_omp_loop:
3395 dump_omp_clauses (pp, OMP_FOR_CLAUSES (node), spc, flags);
3396 if (!(flags & TDF_SLIM))
3398 int i;
3400 if (OMP_FOR_PRE_BODY (node))
3402 newline_and_indent (pp, spc + 2);
3403 pp_left_brace (pp);
3404 spc += 4;
3405 newline_and_indent (pp, spc);
3406 dump_generic_node (pp, OMP_FOR_PRE_BODY (node),
3407 spc, flags, false);
3409 if (OMP_FOR_INIT (node))
3411 spc -= 2;
3412 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (node)); i++)
3414 spc += 2;
3415 newline_and_indent (pp, spc);
3416 pp_string (pp, "for (");
3417 tree init = TREE_VEC_ELT (OMP_FOR_INIT (node), i);
3418 if (TREE_CODE (init) != MODIFY_EXPR
3419 || TREE_CODE (TREE_OPERAND (init, 1)) != TREE_VEC)
3420 dump_generic_node (pp, init, spc, flags, false);
3421 else
3423 dump_generic_node (pp, TREE_OPERAND (init, 0),
3424 spc, flags, false);
3425 pp_string (pp, " = ");
3426 dump_omp_loop_non_rect_expr (pp, TREE_OPERAND (init, 1),
3427 spc, flags);
3429 pp_string (pp, "; ");
3430 tree cond = TREE_VEC_ELT (OMP_FOR_COND (node), i);
3431 if (!COMPARISON_CLASS_P (cond)
3432 || TREE_CODE (TREE_OPERAND (cond, 1)) != TREE_VEC)
3433 dump_generic_node (pp, cond, spc, flags, false);
3434 else
3436 dump_generic_node (pp, TREE_OPERAND (cond, 0),
3437 spc, flags, false);
3438 const char *op = op_symbol (cond);
3439 pp_space (pp);
3440 pp_string (pp, op);
3441 pp_space (pp);
3442 dump_omp_loop_non_rect_expr (pp, TREE_OPERAND (cond, 1),
3443 spc, flags);
3445 pp_string (pp, "; ");
3446 dump_generic_node (pp,
3447 TREE_VEC_ELT (OMP_FOR_INCR (node), i),
3448 spc, flags, false);
3449 pp_right_paren (pp);
3452 if (OMP_FOR_BODY (node))
3454 newline_and_indent (pp, spc + 2);
3455 pp_left_brace (pp);
3456 newline_and_indent (pp, spc + 4);
3457 dump_generic_node (pp, OMP_FOR_BODY (node), spc + 4, flags,
3458 false);
3459 newline_and_indent (pp, spc + 2);
3460 pp_right_brace (pp);
3462 if (OMP_FOR_INIT (node))
3463 spc -= 2 * TREE_VEC_LENGTH (OMP_FOR_INIT (node)) - 2;
3464 if (OMP_FOR_PRE_BODY (node))
3466 spc -= 4;
3467 newline_and_indent (pp, spc + 2);
3468 pp_right_brace (pp);
3471 is_expr = false;
3472 break;
3474 case OMP_SECTIONS:
3475 pp_string (pp, "#pragma omp sections");
3476 dump_omp_clauses (pp, OMP_SECTIONS_CLAUSES (node), spc, flags);
3477 goto dump_omp_body;
3479 case OMP_SECTION:
3480 pp_string (pp, "#pragma omp section");
3481 goto dump_omp_body;
3483 case OMP_SCAN:
3484 if (OMP_SCAN_CLAUSES (node))
3486 pp_string (pp, "#pragma omp scan");
3487 dump_omp_clauses (pp, OMP_SCAN_CLAUSES (node), spc, flags);
3489 goto dump_omp_body;
3491 case OMP_MASTER:
3492 pp_string (pp, "#pragma omp master");
3493 goto dump_omp_body;
3495 case OMP_TASKGROUP:
3496 pp_string (pp, "#pragma omp taskgroup");
3497 dump_omp_clauses (pp, OMP_TASKGROUP_CLAUSES (node), spc, flags);
3498 goto dump_omp_body;
3500 case OMP_ORDERED:
3501 pp_string (pp, "#pragma omp ordered");
3502 dump_omp_clauses (pp, OMP_ORDERED_CLAUSES (node), spc, flags);
3503 goto dump_omp_body;
3505 case OMP_CRITICAL:
3506 pp_string (pp, "#pragma omp critical");
3507 if (OMP_CRITICAL_NAME (node))
3509 pp_space (pp);
3510 pp_left_paren (pp);
3511 dump_generic_node (pp, OMP_CRITICAL_NAME (node), spc,
3512 flags, false);
3513 pp_right_paren (pp);
3515 dump_omp_clauses (pp, OMP_CRITICAL_CLAUSES (node), spc, flags);
3516 goto dump_omp_body;
3518 case OMP_ATOMIC:
3519 pp_string (pp, "#pragma omp atomic");
3520 dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
3521 newline_and_indent (pp, spc + 2);
3522 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3523 pp_space (pp);
3524 pp_equal (pp);
3525 pp_space (pp);
3526 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3527 break;
3529 case OMP_ATOMIC_READ:
3530 pp_string (pp, "#pragma omp atomic read");
3531 dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
3532 newline_and_indent (pp, spc + 2);
3533 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3534 pp_space (pp);
3535 break;
3537 case OMP_ATOMIC_CAPTURE_OLD:
3538 case OMP_ATOMIC_CAPTURE_NEW:
3539 pp_string (pp, "#pragma omp atomic capture");
3540 dump_omp_atomic_memory_order (pp, OMP_ATOMIC_MEMORY_ORDER (node));
3541 newline_and_indent (pp, spc + 2);
3542 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3543 pp_space (pp);
3544 pp_equal (pp);
3545 pp_space (pp);
3546 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3547 break;
3549 case OMP_SINGLE:
3550 pp_string (pp, "#pragma omp single");
3551 dump_omp_clauses (pp, OMP_SINGLE_CLAUSES (node), spc, flags);
3552 goto dump_omp_body;
3554 case OMP_CLAUSE:
3555 dump_omp_clause (pp, node, spc, flags);
3556 is_expr = false;
3557 break;
3559 case TRANSACTION_EXPR:
3560 if (TRANSACTION_EXPR_OUTER (node))
3561 pp_string (pp, "__transaction_atomic [[outer]]");
3562 else if (TRANSACTION_EXPR_RELAXED (node))
3563 pp_string (pp, "__transaction_relaxed");
3564 else
3565 pp_string (pp, "__transaction_atomic");
3566 if (!(flags & TDF_SLIM) && TRANSACTION_EXPR_BODY (node))
3568 newline_and_indent (pp, spc);
3569 pp_left_brace (pp);
3570 newline_and_indent (pp, spc + 2);
3571 dump_generic_node (pp, TRANSACTION_EXPR_BODY (node),
3572 spc + 2, flags, false);
3573 newline_and_indent (pp, spc);
3574 pp_right_brace (pp);
3576 is_expr = false;
3577 break;
3579 case VEC_SERIES_EXPR:
3580 case VEC_WIDEN_MULT_HI_EXPR:
3581 case VEC_WIDEN_MULT_LO_EXPR:
3582 case VEC_WIDEN_MULT_EVEN_EXPR:
3583 case VEC_WIDEN_MULT_ODD_EXPR:
3584 case VEC_WIDEN_LSHIFT_HI_EXPR:
3585 case VEC_WIDEN_LSHIFT_LO_EXPR:
3586 pp_space (pp);
3587 for (str = get_tree_code_name (code); *str; str++)
3588 pp_character (pp, TOUPPER (*str));
3589 pp_string (pp, " < ");
3590 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3591 pp_string (pp, ", ");
3592 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3593 pp_string (pp, " > ");
3594 break;
3596 case VEC_DUPLICATE_EXPR:
3597 pp_space (pp);
3598 for (str = get_tree_code_name (code); *str; str++)
3599 pp_character (pp, TOUPPER (*str));
3600 pp_string (pp, " < ");
3601 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3602 pp_string (pp, " > ");
3603 break;
3605 case VEC_UNPACK_HI_EXPR:
3606 pp_string (pp, " VEC_UNPACK_HI_EXPR < ");
3607 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3608 pp_string (pp, " > ");
3609 break;
3611 case VEC_UNPACK_LO_EXPR:
3612 pp_string (pp, " VEC_UNPACK_LO_EXPR < ");
3613 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3614 pp_string (pp, " > ");
3615 break;
3617 case VEC_UNPACK_FLOAT_HI_EXPR:
3618 pp_string (pp, " VEC_UNPACK_FLOAT_HI_EXPR < ");
3619 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3620 pp_string (pp, " > ");
3621 break;
3623 case VEC_UNPACK_FLOAT_LO_EXPR:
3624 pp_string (pp, " VEC_UNPACK_FLOAT_LO_EXPR < ");
3625 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3626 pp_string (pp, " > ");
3627 break;
3629 case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
3630 pp_string (pp, " VEC_UNPACK_FIX_TRUNC_HI_EXPR < ");
3631 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3632 pp_string (pp, " > ");
3633 break;
3635 case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
3636 pp_string (pp, " VEC_UNPACK_FIX_TRUNC_LO_EXPR < ");
3637 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3638 pp_string (pp, " > ");
3639 break;
3641 case VEC_PACK_TRUNC_EXPR:
3642 pp_string (pp, " VEC_PACK_TRUNC_EXPR < ");
3643 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3644 pp_string (pp, ", ");
3645 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3646 pp_string (pp, " > ");
3647 break;
3649 case VEC_PACK_SAT_EXPR:
3650 pp_string (pp, " VEC_PACK_SAT_EXPR < ");
3651 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3652 pp_string (pp, ", ");
3653 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3654 pp_string (pp, " > ");
3655 break;
3657 case VEC_PACK_FIX_TRUNC_EXPR:
3658 pp_string (pp, " VEC_PACK_FIX_TRUNC_EXPR < ");
3659 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3660 pp_string (pp, ", ");
3661 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3662 pp_string (pp, " > ");
3663 break;
3665 case VEC_PACK_FLOAT_EXPR:
3666 pp_string (pp, " VEC_PACK_FLOAT_EXPR < ");
3667 dump_generic_node (pp, TREE_OPERAND (node, 0), spc, flags, false);
3668 pp_string (pp, ", ");
3669 dump_generic_node (pp, TREE_OPERAND (node, 1), spc, flags, false);
3670 pp_string (pp, " > ");
3671 break;
3673 case BLOCK:
3674 dump_block_node (pp, node, spc, flags);
3675 break;
3677 case DEBUG_BEGIN_STMT:
3678 pp_string (pp, "# DEBUG BEGIN STMT");
3679 break;
3681 default:
3682 NIY;
3685 if (is_stmt && is_expr)
3686 pp_semicolon (pp);
3688 return spc;
3691 /* Print the declaration of a variable. */
3693 void
3694 print_declaration (pretty_printer *pp, tree t, int spc, dump_flags_t flags)
3696 INDENT (spc);
3698 if (TREE_CODE(t) == NAMELIST_DECL)
3700 pp_string(pp, "namelist ");
3701 dump_decl_name (pp, t, flags);
3702 pp_semicolon (pp);
3703 return;
3706 if (TREE_CODE (t) == TYPE_DECL)
3707 pp_string (pp, "typedef ");
3709 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL) && DECL_REGISTER (t))
3710 pp_string (pp, "register ");
3712 if (TREE_PUBLIC (t) && DECL_EXTERNAL (t))
3713 pp_string (pp, "extern ");
3714 else if (TREE_STATIC (t))
3715 pp_string (pp, "static ");
3717 /* Print the type and name. */
3718 if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
3720 tree tmp;
3722 /* Print array's type. */
3723 tmp = TREE_TYPE (t);
3724 while (TREE_CODE (TREE_TYPE (tmp)) == ARRAY_TYPE)
3725 tmp = TREE_TYPE (tmp);
3726 dump_generic_node (pp, TREE_TYPE (tmp), spc, flags, false);
3728 /* Print variable's name. */
3729 pp_space (pp);
3730 dump_generic_node (pp, t, spc, flags, false);
3732 /* Print the dimensions. */
3733 tmp = TREE_TYPE (t);
3734 while (TREE_CODE (tmp) == ARRAY_TYPE)
3736 dump_array_domain (pp, TYPE_DOMAIN (tmp), spc, flags);
3737 tmp = TREE_TYPE (tmp);
3740 else if (TREE_CODE (t) == FUNCTION_DECL)
3742 dump_generic_node (pp, TREE_TYPE (TREE_TYPE (t)), spc, flags, false);
3743 pp_space (pp);
3744 dump_decl_name (pp, t, flags);
3745 dump_function_declaration (pp, TREE_TYPE (t), spc, flags);
3747 else
3749 /* Print type declaration. */
3750 dump_generic_node (pp, TREE_TYPE (t), spc, flags, false);
3752 /* Print variable's name. */
3753 pp_space (pp);
3754 dump_generic_node (pp, t, spc, flags, false);
3757 if (VAR_P (t) && DECL_HARD_REGISTER (t))
3759 pp_string (pp, " __asm__ ");
3760 pp_left_paren (pp);
3761 dump_generic_node (pp, DECL_ASSEMBLER_NAME (t), spc, flags, false);
3762 pp_right_paren (pp);
3765 /* The initial value of a function serves to determine whether the function
3766 is declared or defined. So the following does not apply to function
3767 nodes. */
3768 if (TREE_CODE (t) != FUNCTION_DECL)
3770 /* Print the initial value. */
3771 if (DECL_INITIAL (t))
3773 pp_space (pp);
3774 pp_equal (pp);
3775 pp_space (pp);
3776 if (!(flags & TDF_SLIM))
3777 dump_generic_node (pp, DECL_INITIAL (t), spc, flags, false);
3778 else
3779 pp_string (pp, "<<< omitted >>>");
3783 if (VAR_P (t) && DECL_HAS_VALUE_EXPR_P (t))
3785 pp_string (pp, " [value-expr: ");
3786 dump_generic_node (pp, DECL_VALUE_EXPR (t), spc, flags, false);
3787 pp_right_bracket (pp);
3790 pp_semicolon (pp);
3794 /* Prints a structure: name, fields, and methods.
3795 FIXME: Still incomplete. */
3797 static void
3798 print_struct_decl (pretty_printer *pp, const_tree node, int spc,
3799 dump_flags_t flags)
3801 /* Print the name of the structure. */
3802 if (TYPE_NAME (node))
3804 INDENT (spc);
3805 if (TREE_CODE (node) == RECORD_TYPE)
3806 pp_string (pp, "struct ");
3807 else if ((TREE_CODE (node) == UNION_TYPE
3808 || TREE_CODE (node) == QUAL_UNION_TYPE))
3809 pp_string (pp, "union ");
3811 dump_generic_node (pp, TYPE_NAME (node), spc, TDF_NONE, false);
3814 /* Print the contents of the structure. */
3815 pp_newline (pp);
3816 INDENT (spc);
3817 pp_left_brace (pp);
3818 pp_newline (pp);
3820 /* Print the fields of the structure. */
3822 tree tmp;
3823 tmp = TYPE_FIELDS (node);
3824 while (tmp)
3826 /* Avoid to print recursively the structure. */
3827 /* FIXME : Not implemented correctly...,
3828 what about the case when we have a cycle in the contain graph? ...
3829 Maybe this could be solved by looking at the scope in which the
3830 structure was declared. */
3831 if (TREE_TYPE (tmp) != node
3832 && (TREE_CODE (TREE_TYPE (tmp)) != POINTER_TYPE
3833 || TREE_TYPE (TREE_TYPE (tmp)) != node))
3835 print_declaration (pp, tmp, spc+2, flags);
3836 pp_newline (pp);
3838 tmp = DECL_CHAIN (tmp);
3841 INDENT (spc);
3842 pp_right_brace (pp);
3845 /* Return the priority of the operator CODE.
3847 From lowest to highest precedence with either left-to-right (L-R)
3848 or right-to-left (R-L) associativity]:
3850 1 [L-R] ,
3851 2 [R-L] = += -= *= /= %= &= ^= |= <<= >>=
3852 3 [R-L] ?:
3853 4 [L-R] ||
3854 5 [L-R] &&
3855 6 [L-R] |
3856 7 [L-R] ^
3857 8 [L-R] &
3858 9 [L-R] == !=
3859 10 [L-R] < <= > >=
3860 11 [L-R] << >>
3861 12 [L-R] + -
3862 13 [L-R] * / %
3863 14 [R-L] ! ~ ++ -- + - * & (type) sizeof
3864 15 [L-R] fn() [] -> .
3866 unary +, - and * have higher precedence than the corresponding binary
3867 operators. */
3870 op_code_prio (enum tree_code code)
3872 switch (code)
3874 case TREE_LIST:
3875 case COMPOUND_EXPR:
3876 case BIND_EXPR:
3877 return 1;
3879 case MODIFY_EXPR:
3880 case INIT_EXPR:
3881 return 2;
3883 case COND_EXPR:
3884 return 3;
3886 case TRUTH_OR_EXPR:
3887 case TRUTH_ORIF_EXPR:
3888 return 4;
3890 case TRUTH_AND_EXPR:
3891 case TRUTH_ANDIF_EXPR:
3892 return 5;
3894 case BIT_IOR_EXPR:
3895 return 6;
3897 case BIT_XOR_EXPR:
3898 case TRUTH_XOR_EXPR:
3899 return 7;
3901 case BIT_AND_EXPR:
3902 return 8;
3904 case EQ_EXPR:
3905 case NE_EXPR:
3906 return 9;
3908 case UNLT_EXPR:
3909 case UNLE_EXPR:
3910 case UNGT_EXPR:
3911 case UNGE_EXPR:
3912 case UNEQ_EXPR:
3913 case LTGT_EXPR:
3914 case ORDERED_EXPR:
3915 case UNORDERED_EXPR:
3916 case LT_EXPR:
3917 case LE_EXPR:
3918 case GT_EXPR:
3919 case GE_EXPR:
3920 return 10;
3922 case LSHIFT_EXPR:
3923 case RSHIFT_EXPR:
3924 case LROTATE_EXPR:
3925 case RROTATE_EXPR:
3926 case VEC_WIDEN_LSHIFT_HI_EXPR:
3927 case VEC_WIDEN_LSHIFT_LO_EXPR:
3928 case WIDEN_LSHIFT_EXPR:
3929 return 11;
3931 case WIDEN_SUM_EXPR:
3932 case PLUS_EXPR:
3933 case POINTER_PLUS_EXPR:
3934 case POINTER_DIFF_EXPR:
3935 case MINUS_EXPR:
3936 return 12;
3938 case VEC_WIDEN_MULT_HI_EXPR:
3939 case VEC_WIDEN_MULT_LO_EXPR:
3940 case WIDEN_MULT_EXPR:
3941 case DOT_PROD_EXPR:
3942 case WIDEN_MULT_PLUS_EXPR:
3943 case WIDEN_MULT_MINUS_EXPR:
3944 case MULT_EXPR:
3945 case MULT_HIGHPART_EXPR:
3946 case TRUNC_DIV_EXPR:
3947 case CEIL_DIV_EXPR:
3948 case FLOOR_DIV_EXPR:
3949 case ROUND_DIV_EXPR:
3950 case RDIV_EXPR:
3951 case EXACT_DIV_EXPR:
3952 case TRUNC_MOD_EXPR:
3953 case CEIL_MOD_EXPR:
3954 case FLOOR_MOD_EXPR:
3955 case ROUND_MOD_EXPR:
3956 return 13;
3958 case TRUTH_NOT_EXPR:
3959 case BIT_NOT_EXPR:
3960 case POSTINCREMENT_EXPR:
3961 case POSTDECREMENT_EXPR:
3962 case PREINCREMENT_EXPR:
3963 case PREDECREMENT_EXPR:
3964 case NEGATE_EXPR:
3965 case INDIRECT_REF:
3966 case ADDR_EXPR:
3967 case FLOAT_EXPR:
3968 CASE_CONVERT:
3969 case FIX_TRUNC_EXPR:
3970 case TARGET_EXPR:
3971 return 14;
3973 case CALL_EXPR:
3974 case ARRAY_REF:
3975 case ARRAY_RANGE_REF:
3976 case COMPONENT_REF:
3977 return 15;
3979 /* Special expressions. */
3980 case MIN_EXPR:
3981 case MAX_EXPR:
3982 case ABS_EXPR:
3983 case REALPART_EXPR:
3984 case IMAGPART_EXPR:
3985 case VEC_UNPACK_HI_EXPR:
3986 case VEC_UNPACK_LO_EXPR:
3987 case VEC_UNPACK_FLOAT_HI_EXPR:
3988 case VEC_UNPACK_FLOAT_LO_EXPR:
3989 case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
3990 case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
3991 case VEC_PACK_TRUNC_EXPR:
3992 case VEC_PACK_SAT_EXPR:
3993 return 16;
3995 default:
3996 /* Return an arbitrarily high precedence to avoid surrounding single
3997 VAR_DECLs in ()s. */
3998 return 9999;
4002 /* Return the priority of the operator OP. */
4005 op_prio (const_tree op)
4007 enum tree_code code;
4009 if (op == NULL)
4010 return 9999;
4012 code = TREE_CODE (op);
4013 if (code == SAVE_EXPR || code == NON_LVALUE_EXPR)
4014 return op_prio (TREE_OPERAND (op, 0));
4016 return op_code_prio (code);
4019 /* Return the symbol associated with operator CODE. */
4021 const char *
4022 op_symbol_code (enum tree_code code)
4024 switch (code)
4026 case MODIFY_EXPR:
4027 return "=";
4029 case TRUTH_OR_EXPR:
4030 case TRUTH_ORIF_EXPR:
4031 return "||";
4033 case TRUTH_AND_EXPR:
4034 case TRUTH_ANDIF_EXPR:
4035 return "&&";
4037 case BIT_IOR_EXPR:
4038 return "|";
4040 case TRUTH_XOR_EXPR:
4041 case BIT_XOR_EXPR:
4042 return "^";
4044 case ADDR_EXPR:
4045 case BIT_AND_EXPR:
4046 return "&";
4048 case ORDERED_EXPR:
4049 return "ord";
4050 case UNORDERED_EXPR:
4051 return "unord";
4053 case EQ_EXPR:
4054 return "==";
4055 case UNEQ_EXPR:
4056 return "u==";
4058 case NE_EXPR:
4059 return "!=";
4061 case LT_EXPR:
4062 return "<";
4063 case UNLT_EXPR:
4064 return "u<";
4066 case LE_EXPR:
4067 return "<=";
4068 case UNLE_EXPR:
4069 return "u<=";
4071 case GT_EXPR:
4072 return ">";
4073 case UNGT_EXPR:
4074 return "u>";
4076 case GE_EXPR:
4077 return ">=";
4078 case UNGE_EXPR:
4079 return "u>=";
4081 case LTGT_EXPR:
4082 return "<>";
4084 case LSHIFT_EXPR:
4085 return "<<";
4087 case RSHIFT_EXPR:
4088 return ">>";
4090 case LROTATE_EXPR:
4091 return "r<<";
4093 case RROTATE_EXPR:
4094 return "r>>";
4096 case WIDEN_LSHIFT_EXPR:
4097 return "w<<";
4099 case POINTER_PLUS_EXPR:
4100 return "+";
4102 case PLUS_EXPR:
4103 return "+";
4105 case WIDEN_SUM_EXPR:
4106 return "w+";
4108 case WIDEN_MULT_EXPR:
4109 return "w*";
4111 case MULT_HIGHPART_EXPR:
4112 return "h*";
4114 case NEGATE_EXPR:
4115 case MINUS_EXPR:
4116 case POINTER_DIFF_EXPR:
4117 return "-";
4119 case BIT_NOT_EXPR:
4120 return "~";
4122 case TRUTH_NOT_EXPR:
4123 return "!";
4125 case MULT_EXPR:
4126 case INDIRECT_REF:
4127 return "*";
4129 case TRUNC_DIV_EXPR:
4130 case RDIV_EXPR:
4131 return "/";
4133 case CEIL_DIV_EXPR:
4134 return "/[cl]";
4136 case FLOOR_DIV_EXPR:
4137 return "/[fl]";
4139 case ROUND_DIV_EXPR:
4140 return "/[rd]";
4142 case EXACT_DIV_EXPR:
4143 return "/[ex]";
4145 case TRUNC_MOD_EXPR:
4146 return "%";
4148 case CEIL_MOD_EXPR:
4149 return "%[cl]";
4151 case FLOOR_MOD_EXPR:
4152 return "%[fl]";
4154 case ROUND_MOD_EXPR:
4155 return "%[rd]";
4157 case PREDECREMENT_EXPR:
4158 return " --";
4160 case PREINCREMENT_EXPR:
4161 return " ++";
4163 case POSTDECREMENT_EXPR:
4164 return "-- ";
4166 case POSTINCREMENT_EXPR:
4167 return "++ ";
4169 case MAX_EXPR:
4170 return "max";
4172 case MIN_EXPR:
4173 return "min";
4175 default:
4176 return "<<< ??? >>>";
4180 /* Return the symbol associated with operator OP. */
4182 static const char *
4183 op_symbol (const_tree op)
4185 return op_symbol_code (TREE_CODE (op));
4188 /* Prints the name of a call. NODE is the CALL_EXPR_FN of a CALL_EXPR or
4189 the gimple_call_fn of a GIMPLE_CALL. */
4191 void
4192 print_call_name (pretty_printer *pp, tree node, dump_flags_t flags)
4194 tree op0 = node;
4196 if (TREE_CODE (op0) == NON_LVALUE_EXPR)
4197 op0 = TREE_OPERAND (op0, 0);
4199 again:
4200 switch (TREE_CODE (op0))
4202 case VAR_DECL:
4203 case PARM_DECL:
4204 case FUNCTION_DECL:
4205 dump_function_name (pp, op0, flags);
4206 break;
4208 case ADDR_EXPR:
4209 case INDIRECT_REF:
4210 CASE_CONVERT:
4211 op0 = TREE_OPERAND (op0, 0);
4212 goto again;
4214 case COND_EXPR:
4215 pp_left_paren (pp);
4216 dump_generic_node (pp, TREE_OPERAND (op0, 0), 0, flags, false);
4217 pp_string (pp, ") ? ");
4218 dump_generic_node (pp, TREE_OPERAND (op0, 1), 0, flags, false);
4219 pp_string (pp, " : ");
4220 dump_generic_node (pp, TREE_OPERAND (op0, 2), 0, flags, false);
4221 break;
4223 case ARRAY_REF:
4224 if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
4225 dump_function_name (pp, TREE_OPERAND (op0, 0), flags);
4226 else
4227 dump_generic_node (pp, op0, 0, flags, false);
4228 break;
4230 case MEM_REF:
4231 if (integer_zerop (TREE_OPERAND (op0, 1)))
4233 op0 = TREE_OPERAND (op0, 0);
4234 goto again;
4236 /* Fallthru. */
4237 case COMPONENT_REF:
4238 case SSA_NAME:
4239 case OBJ_TYPE_REF:
4240 dump_generic_node (pp, op0, 0, flags, false);
4241 break;
4243 default:
4244 NIY;
4248 /* Print the first N characters in the array STR, replacing non-printable
4249 characters (including embedded nuls) with unambiguous escape sequences. */
4251 void
4252 pretty_print_string (pretty_printer *pp, const char *str, size_t n)
4254 if (str == NULL)
4255 return;
4257 for ( ; n; --n, ++str)
4259 switch (str[0])
4261 case '\b':
4262 pp_string (pp, "\\b");
4263 break;
4265 case '\f':
4266 pp_string (pp, "\\f");
4267 break;
4269 case '\n':
4270 pp_string (pp, "\\n");
4271 break;
4273 case '\r':
4274 pp_string (pp, "\\r");
4275 break;
4277 case '\t':
4278 pp_string (pp, "\\t");
4279 break;
4281 case '\v':
4282 pp_string (pp, "\\v");
4283 break;
4285 case '\\':
4286 pp_string (pp, "\\\\");
4287 break;
4289 case '\"':
4290 pp_string (pp, "\\\"");
4291 break;
4293 case '\'':
4294 pp_string (pp, "\\'");
4295 break;
4297 default:
4298 if (str[0] || n > 1)
4300 if (!ISPRINT (str[0]))
4302 char buf[5];
4303 sprintf (buf, "\\x%02x", (unsigned char)str[0]);
4304 pp_string (pp, buf);
4306 else
4307 pp_character (pp, str[0]);
4308 break;
4314 static void
4315 maybe_init_pretty_print (FILE *file)
4317 if (!tree_pp)
4319 tree_pp = new pretty_printer ();
4320 pp_needs_newline (tree_pp) = true;
4321 pp_translate_identifiers (tree_pp) = false;
4324 tree_pp->buffer->stream = file;
4327 static void
4328 newline_and_indent (pretty_printer *pp, int spc)
4330 pp_newline (pp);
4331 INDENT (spc);
4334 /* Handle the %K format for TEXT. Separate from default_tree_printer
4335 so it can also be used in front ends.
4336 The location LOC and BLOCK are expected to be extracted by the caller
4337 from the %K argument arg via EXPR_LOCATION(arg) and TREE_BLOCK(arg). */
4339 void
4340 percent_K_format (text_info *text, location_t loc, tree block)
4342 text->set_location (0, loc, SHOW_RANGE_WITH_CARET);
4343 gcc_assert (pp_ti_abstract_origin (text) != NULL);
4344 *pp_ti_abstract_origin (text) = NULL;
4346 while (block
4347 && TREE_CODE (block) == BLOCK
4348 && BLOCK_ABSTRACT_ORIGIN (block))
4350 tree ao = BLOCK_ABSTRACT_ORIGIN (block);
4351 if (TREE_CODE (ao) == FUNCTION_DECL)
4353 *pp_ti_abstract_origin (text) = block;
4354 break;
4356 block = BLOCK_SUPERCONTEXT (block);
4360 /* Print the identifier ID to PRETTY-PRINTER. */
4362 void
4363 pp_tree_identifier (pretty_printer *pp, tree id)
4365 if (pp_translate_identifiers (pp))
4367 const char *text = identifier_to_locale (IDENTIFIER_POINTER (id));
4368 pp_append_text (pp, text, text + strlen (text));
4370 else
4371 pp_append_text (pp, IDENTIFIER_POINTER (id),
4372 IDENTIFIER_POINTER (id) + IDENTIFIER_LENGTH (id));
4375 /* A helper function that is used to dump function information before the
4376 function dump. */
4378 void
4379 dump_function_header (FILE *dump_file, tree fdecl, dump_flags_t flags)
4381 const char *dname, *aname;
4382 struct cgraph_node *node = cgraph_node::get (fdecl);
4383 struct function *fun = DECL_STRUCT_FUNCTION (fdecl);
4385 dname = lang_hooks.decl_printable_name (fdecl, 1);
4387 if (DECL_ASSEMBLER_NAME_SET_P (fdecl))
4388 aname = (IDENTIFIER_POINTER
4389 (DECL_ASSEMBLER_NAME (fdecl)));
4390 else
4391 aname = "<unset-asm-name>";
4393 fprintf (dump_file, "\n;; Function %s (%s, funcdef_no=%d",
4394 dname, aname, fun->funcdef_no);
4395 if (!(flags & TDF_NOUID))
4396 fprintf (dump_file, ", decl_uid=%d", DECL_UID (fdecl));
4397 if (node)
4399 fprintf (dump_file, ", cgraph_uid=%d", node->get_uid ());
4400 fprintf (dump_file, ", symbol_order=%d)%s\n\n", node->order,
4401 node->frequency == NODE_FREQUENCY_HOT
4402 ? " (hot)"
4403 : node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
4404 ? " (unlikely executed)"
4405 : node->frequency == NODE_FREQUENCY_EXECUTED_ONCE
4406 ? " (executed once)"
4407 : "");
4409 else
4410 fprintf (dump_file, ")\n\n");
4413 /* Dump double_int D to pretty_printer PP. UNS is true
4414 if D is unsigned and false otherwise. */
4415 void
4416 pp_double_int (pretty_printer *pp, double_int d, bool uns)
4418 if (d.fits_shwi ())
4419 pp_wide_integer (pp, d.low);
4420 else if (d.fits_uhwi ())
4421 pp_unsigned_wide_integer (pp, d.low);
4422 else
4424 unsigned HOST_WIDE_INT low = d.low;
4425 HOST_WIDE_INT high = d.high;
4426 if (!uns && d.is_negative ())
4428 pp_minus (pp);
4429 high = ~high + !low;
4430 low = -low;
4432 /* Would "%x%0*x" or "%x%*0x" get zero-padding on all
4433 systems? */
4434 sprintf (pp_buffer (pp)->digit_buffer,
4435 HOST_WIDE_INT_PRINT_DOUBLE_HEX,
4436 (unsigned HOST_WIDE_INT) high, low);
4437 pp_string (pp, pp_buffer (pp)->digit_buffer);
4441 #if __GNUC__ >= 10
4442 # pragma GCC diagnostic pop
4443 #endif