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