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