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