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