Daily bump.
[gcc.git] / gcc / print-tree.c
1 /* Prints out tree in human readable form - GCC
2 Copyright (C) 1990-2021 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "cgraph.h"
27 #include "diagnostic.h"
28 #include "varasm.h"
29 #include "print-rtl.h"
30 #include "stor-layout.h"
31 #include "langhooks.h"
32 #include "tree-iterator.h"
33 #include "gimple-pretty-print.h" /* FIXME */
34 #include "tree-cfg.h"
35 #include "dumpfile.h"
36 #include "print-tree.h"
37
38 /* Define the hash table of nodes already seen.
39 Such nodes are not repeated; brief cross-references are used. */
40
41 #define HASH_SIZE 37
42
43 static hash_set<tree> *table = NULL;
44
45 /* Print PREFIX and ADDR to FILE. */
46 void
47 dump_addr (FILE *file, const char *prefix, const void *addr)
48 {
49 if (flag_dump_noaddr || flag_dump_unnumbered)
50 fprintf (file, "%s#", prefix);
51 else
52 fprintf (file, "%s" HOST_PTR_PRINTF, prefix, addr);
53 }
54
55 /* Print to FILE a NODE representing a REAL_CST constant, including
56 Infinity and NaN. Be verbose when BFRIEF is false. */
57
58 static void
59 print_real_cst (FILE *file, const_tree node, bool brief)
60 {
61 if (TREE_OVERFLOW (node))
62 fprintf (file, " overflow");
63
64 REAL_VALUE_TYPE d = TREE_REAL_CST (node);
65 if (REAL_VALUE_ISINF (d))
66 fprintf (file, REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
67 else if (REAL_VALUE_ISNAN (d))
68 {
69 /* Print a NaN in the format [-][Q]NaN[(significand[exponent])]
70 where significand is a hexadecimal string that starts with
71 the 0x prefix followed by 0 if the number is not canonical
72 and a non-zero digit if it is, and exponent is decimal. */
73 unsigned start = 0;
74 const char *psig = (const char *) d.sig;
75 for (unsigned i = 0; i != sizeof d.sig; ++i)
76 if (psig[i])
77 {
78 start = i;
79 break;
80 }
81
82 fprintf (file, " %s%sNaN", d.sign ? "-" : "",
83 d.signalling ? "S" : "Q");
84
85 if (brief)
86 return;
87
88 if (start)
89 fprintf (file, "(0x%s", d.canonical ? "" : "0");
90 else if (d.uexp)
91 fprintf (file, "(%s", d.canonical ? "" : "0");
92 else if (!d.canonical)
93 {
94 fprintf (file, "(0)");
95 return;
96 }
97
98 if (psig[start])
99 {
100 for (unsigned i = start; i != sizeof d.sig; ++i)
101 if (i == start)
102 fprintf (file, "%x", psig[i]);
103 else
104 fprintf (file, "%02x", psig[i]);
105 }
106
107 if (d.uexp)
108 fprintf (file, "%se%u)", psig[start] ? "," : "", d.uexp);
109 else if (psig[start])
110 fputc (')', file);
111 }
112 else
113 {
114 char string[64];
115 real_to_decimal (string, &d, sizeof (string), 0, 1);
116 fprintf (file, " %s", string);
117 }
118 }
119
120 /* Print a node in brief fashion, with just the code, address and name. */
121
122 void
123 print_node_brief (FILE *file, const char *prefix, const_tree node, int indent)
124 {
125 enum tree_code_class tclass;
126
127 if (node == 0)
128 return;
129
130 tclass = TREE_CODE_CLASS (TREE_CODE (node));
131
132 /* Always print the slot this node is in, and its code, address and
133 name if any. */
134 if (indent > 0)
135 fprintf (file, " ");
136 fprintf (file, "%s <%s", prefix, get_tree_code_name (TREE_CODE (node)));
137 dump_addr (file, " ", node);
138
139 if (tclass == tcc_declaration)
140 {
141 if (DECL_NAME (node))
142 fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
143 else if (TREE_CODE (node) == LABEL_DECL
144 && LABEL_DECL_UID (node) != -1)
145 {
146 if (dump_flags & TDF_NOUID)
147 fprintf (file, " L.xxxx");
148 else
149 fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
150 }
151 else
152 {
153 if (dump_flags & TDF_NOUID)
154 fprintf (file, " %c.xxxx",
155 TREE_CODE (node) == CONST_DECL ? 'C' : 'D');
156 else
157 fprintf (file, " %c.%u",
158 TREE_CODE (node) == CONST_DECL ? 'C' : 'D',
159 DECL_UID (node));
160 }
161 }
162 else if (tclass == tcc_type)
163 {
164 if (TYPE_NAME (node))
165 {
166 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
167 fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
168 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
169 && DECL_NAME (TYPE_NAME (node)))
170 fprintf (file, " %s",
171 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
172 }
173 if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
174 fprintf (file, " address-space-%d", TYPE_ADDR_SPACE (node));
175 }
176 if (TREE_CODE (node) == IDENTIFIER_NODE)
177 fprintf (file, " %s", IDENTIFIER_POINTER (node));
178
179 /* We might as well always print the value of an integer or real. */
180 if (TREE_CODE (node) == INTEGER_CST)
181 {
182 if (TREE_OVERFLOW (node))
183 fprintf (file, " overflow");
184
185 fprintf (file, " ");
186 print_dec (wi::to_wide (node), file, TYPE_SIGN (TREE_TYPE (node)));
187 }
188 if (TREE_CODE (node) == REAL_CST)
189 print_real_cst (file, node, true);
190 if (TREE_CODE (node) == FIXED_CST)
191 {
192 FIXED_VALUE_TYPE f;
193 char string[60];
194
195 if (TREE_OVERFLOW (node))
196 fprintf (file, " overflow");
197
198 f = TREE_FIXED_CST (node);
199 fixed_to_decimal (string, &f, sizeof (string));
200 fprintf (file, " %s", string);
201 }
202
203 fprintf (file, ">");
204 }
205
206 void
207 indent_to (FILE *file, int column)
208 {
209 int i;
210
211 /* Since this is the long way, indent to desired column. */
212 if (column > 0)
213 fprintf (file, "\n");
214 for (i = 0; i < column; i++)
215 fprintf (file, " ");
216 }
217 \f
218 /* Print the node NODE in full on file FILE, preceded by PREFIX,
219 starting in column INDENT. */
220
221 void
222 print_node (FILE *file, const char *prefix, tree node, int indent,
223 bool brief_for_visited)
224 {
225 machine_mode mode;
226 enum tree_code_class tclass;
227 int len;
228 int i;
229 expanded_location xloc;
230 enum tree_code code;
231
232 if (node == 0)
233 return;
234
235 code = TREE_CODE (node);
236
237 /* It is unsafe to look at any other fields of a node with ERROR_MARK or
238 invalid code. */
239 if (code == ERROR_MARK || code >= MAX_TREE_CODES)
240 {
241 print_node_brief (file, prefix, node, indent);
242 return;
243 }
244
245 tclass = TREE_CODE_CLASS (code);
246
247 /* Don't get too deep in nesting. If the user wants to see deeper,
248 it is easy to use the address of a lowest-level node
249 as an argument in another call to debug_tree. */
250
251 if (indent > 24)
252 {
253 print_node_brief (file, prefix, node, indent);
254 return;
255 }
256
257 if (indent > 8 && (tclass == tcc_type || tclass == tcc_declaration))
258 {
259 print_node_brief (file, prefix, node, indent);
260 return;
261 }
262
263 /* Allow this function to be called if the table is not there. */
264 if (table)
265 {
266 /* If node is in the table, just mention its address. */
267 if (table->contains (node) && brief_for_visited)
268 {
269 print_node_brief (file, prefix, node, indent);
270 return;
271 }
272
273 table->add (node);
274 }
275
276 /* Indent to the specified column, since this is the long form. */
277 indent_to (file, indent);
278
279 /* Print the slot this node is in, and its code, and address. */
280 fprintf (file, "%s <%s", prefix, get_tree_code_name (code));
281 dump_addr (file, " ", node);
282
283 /* Print the name, if any. */
284 if (tclass == tcc_declaration)
285 {
286 if (DECL_NAME (node))
287 fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
288 else if (code == LABEL_DECL
289 && LABEL_DECL_UID (node) != -1)
290 {
291 if (dump_flags & TDF_NOUID)
292 fprintf (file, " L.xxxx");
293 else
294 fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
295 }
296 else
297 {
298 if (dump_flags & TDF_NOUID)
299 fprintf (file, " %c.xxxx", code == CONST_DECL ? 'C' : 'D');
300 else
301 fprintf (file, " %c.%u", code == CONST_DECL ? 'C' : 'D',
302 DECL_UID (node));
303 }
304 }
305 else if (tclass == tcc_type)
306 {
307 if (TYPE_NAME (node))
308 {
309 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
310 fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
311 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
312 && DECL_NAME (TYPE_NAME (node)))
313 fprintf (file, " %s",
314 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
315 }
316 }
317 if (code == IDENTIFIER_NODE)
318 fprintf (file, " %s", IDENTIFIER_POINTER (node));
319
320 if (code == INTEGER_CST)
321 {
322 if (indent <= 4)
323 print_node_brief (file, "type", TREE_TYPE (node), indent + 4);
324 }
325 else if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
326 {
327 print_node (file, "type", TREE_TYPE (node), indent + 4);
328 if (TREE_TYPE (node))
329 indent_to (file, indent + 3);
330 }
331
332 if (!TYPE_P (node) && TREE_SIDE_EFFECTS (node))
333 fputs (" side-effects", file);
334
335 if (TYPE_P (node) ? TYPE_READONLY (node) : TREE_READONLY (node))
336 fputs (" readonly", file);
337 if (TYPE_P (node) && TYPE_ATOMIC (node))
338 fputs (" atomic", file);
339 if (!TYPE_P (node) && TREE_CONSTANT (node))
340 fputs (" constant", file);
341 else if (TYPE_P (node) && TYPE_SIZES_GIMPLIFIED (node))
342 fputs (" sizes-gimplified", file);
343
344 if (TYPE_P (node) && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
345 fprintf (file, " address-space-%d", TYPE_ADDR_SPACE (node));
346
347 if (TREE_ADDRESSABLE (node))
348 fputs (" addressable", file);
349 if (TREE_THIS_VOLATILE (node))
350 fputs (" volatile", file);
351 if (TREE_ASM_WRITTEN (node))
352 fputs (" asm_written", file);
353 if (TREE_USED (node))
354 fputs (" used", file);
355 if (TREE_NOTHROW (node))
356 fputs (" nothrow", file);
357 if (TREE_PUBLIC (node))
358 fputs (" public", file);
359 if (TREE_PRIVATE (node))
360 fputs (" private", file);
361 if (TREE_PROTECTED (node))
362 fputs (" protected", file);
363 if (TREE_STATIC (node))
364 fputs (code == CALL_EXPR ? " must-tail-call" : " static", file);
365 if (TREE_DEPRECATED (node))
366 fputs (" deprecated", file);
367 if (TREE_VISITED (node))
368 fputs (" visited", file);
369
370 if (code != TREE_VEC && code != INTEGER_CST && code != SSA_NAME)
371 {
372 if (TREE_LANG_FLAG_0 (node))
373 fputs (" tree_0", file);
374 if (TREE_LANG_FLAG_1 (node))
375 fputs (" tree_1", file);
376 if (TREE_LANG_FLAG_2 (node))
377 fputs (" tree_2", file);
378 if (TREE_LANG_FLAG_3 (node))
379 fputs (" tree_3", file);
380 if (TREE_LANG_FLAG_4 (node))
381 fputs (" tree_4", file);
382 if (TREE_LANG_FLAG_5 (node))
383 fputs (" tree_5", file);
384 if (TREE_LANG_FLAG_6 (node))
385 fputs (" tree_6", file);
386 }
387
388 /* DECL_ nodes have additional attributes. */
389
390 switch (TREE_CODE_CLASS (code))
391 {
392 case tcc_declaration:
393 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
394 {
395 if (DECL_UNSIGNED (node))
396 fputs (" unsigned", file);
397 if (DECL_IGNORED_P (node))
398 fputs (" ignored", file);
399 if (DECL_ABSTRACT_P (node))
400 fputs (" abstract", file);
401 if (DECL_EXTERNAL (node))
402 fputs (" external", file);
403 if (DECL_NONLOCAL (node))
404 fputs (" nonlocal", file);
405 }
406 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
407 {
408 if (DECL_WEAK (node))
409 fputs (" weak", file);
410 if (DECL_IN_SYSTEM_HEADER (node))
411 fputs (" in_system_header", file);
412 }
413 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL)
414 && code != LABEL_DECL
415 && code != FUNCTION_DECL
416 && DECL_REGISTER (node))
417 fputs (" regdecl", file);
418
419 if (code == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node))
420 fputs (" suppress-debug", file);
421
422 if (code == FUNCTION_DECL
423 && DECL_FUNCTION_SPECIFIC_TARGET (node))
424 fputs (" function-specific-target", file);
425 if (code == FUNCTION_DECL
426 && DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node))
427 fputs (" function-specific-opt", file);
428 if (code == FUNCTION_DECL && DECL_DECLARED_INLINE_P (node))
429 fputs (" autoinline", file);
430 if (code == FUNCTION_DECL && DECL_UNINLINABLE (node))
431 fputs (" uninlinable", file);
432 if (code == FUNCTION_DECL && fndecl_built_in_p (node))
433 fputs (" built-in", file);
434 if (code == FUNCTION_DECL && DECL_STATIC_CHAIN (node))
435 fputs (" static-chain", file);
436 if (TREE_CODE (node) == FUNCTION_DECL && decl_is_tm_clone (node))
437 fputs (" tm-clone", file);
438
439 if (code == FIELD_DECL && DECL_PACKED (node))
440 fputs (" packed", file);
441 if (code == FIELD_DECL && DECL_BIT_FIELD (node))
442 fputs (" bit-field", file);
443 if (code == FIELD_DECL && DECL_NONADDRESSABLE_P (node))
444 fputs (" nonaddressable", file);
445
446 if (code == LABEL_DECL && EH_LANDING_PAD_NR (node))
447 fprintf (file, " landing-pad:%d", EH_LANDING_PAD_NR (node));
448
449 if (code == VAR_DECL && DECL_IN_TEXT_SECTION (node))
450 fputs (" in-text-section", file);
451 if (code == VAR_DECL && DECL_IN_CONSTANT_POOL (node))
452 fputs (" in-constant-pool", file);
453 if (code == VAR_DECL && DECL_COMMON (node))
454 fputs (" common", file);
455 if ((code == VAR_DECL || code == PARM_DECL) && DECL_READ_P (node))
456 fputs (" read", file);
457 if (code == VAR_DECL && DECL_THREAD_LOCAL_P (node))
458 {
459 fputs (" ", file);
460 fputs (tls_model_names[DECL_TLS_MODEL (node)], file);
461 }
462
463 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
464 {
465 if (DECL_VIRTUAL_P (node))
466 fputs (" virtual", file);
467 if (DECL_PRESERVE_P (node))
468 fputs (" preserve", file);
469 if (DECL_LANG_FLAG_0 (node))
470 fputs (" decl_0", file);
471 if (DECL_LANG_FLAG_1 (node))
472 fputs (" decl_1", file);
473 if (DECL_LANG_FLAG_2 (node))
474 fputs (" decl_2", file);
475 if (DECL_LANG_FLAG_3 (node))
476 fputs (" decl_3", file);
477 if (DECL_LANG_FLAG_4 (node))
478 fputs (" decl_4", file);
479 if (DECL_LANG_FLAG_5 (node))
480 fputs (" decl_5", file);
481 if (DECL_LANG_FLAG_6 (node))
482 fputs (" decl_6", file);
483 if (DECL_LANG_FLAG_7 (node))
484 fputs (" decl_7", file);
485
486 mode = DECL_MODE (node);
487 fprintf (file, " %s", GET_MODE_NAME (mode));
488 }
489
490 if ((code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL)
491 && DECL_BY_REFERENCE (node))
492 fputs (" passed-by-reference", file);
493
494 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS) && DECL_DEFER_OUTPUT (node))
495 fputs (" defer-output", file);
496
497
498 xloc = expand_location (DECL_SOURCE_LOCATION (node));
499 fprintf (file, " %s:%d:%d", xloc.file, xloc.line,
500 xloc.column);
501
502 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
503 {
504 print_node (file, "size", DECL_SIZE (node), indent + 4);
505 print_node (file, "unit-size", DECL_SIZE_UNIT (node), indent + 4);
506
507 if (code != FUNCTION_DECL || fndecl_built_in_p (node))
508 indent_to (file, indent + 3);
509
510 if (DECL_USER_ALIGN (node))
511 fprintf (file, " user");
512
513 fprintf (file, " align:%d warn_if_not_align:%d",
514 DECL_ALIGN (node), DECL_WARN_IF_NOT_ALIGN (node));
515 if (code == FIELD_DECL)
516 fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED,
517 DECL_OFFSET_ALIGN (node));
518
519 if (code == FUNCTION_DECL && fndecl_built_in_p (node))
520 {
521 if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD)
522 fprintf (file, " built-in: BUILT_IN_MD:%d",
523 DECL_MD_FUNCTION_CODE (node));
524 else if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_FRONTEND)
525 fprintf (file, " built-in: BUILT_IN_FRONTEND:%d",
526 DECL_FE_FUNCTION_CODE (node));
527 else
528 fprintf (file, " built-in: %s:%s",
529 built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)],
530 built_in_names[(int) DECL_FUNCTION_CODE (node)]);
531 }
532 }
533 if (code == FIELD_DECL)
534 {
535 print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4);
536 print_node (file, "bit-offset", DECL_FIELD_BIT_OFFSET (node),
537 indent + 4);
538 if (DECL_BIT_FIELD_TYPE (node))
539 print_node (file, "bit_field_type", DECL_BIT_FIELD_TYPE (node),
540 indent + 4);
541 }
542
543 print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4);
544
545 if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
546 {
547 print_node (file, "attributes",
548 DECL_ATTRIBUTES (node), indent + 4);
549 if (code != PARM_DECL)
550 print_node_brief (file, "initial", DECL_INITIAL (node),
551 indent + 4);
552 }
553 if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
554 {
555 print_node_brief (file, "abstract_origin",
556 DECL_ABSTRACT_ORIGIN (node), indent + 4);
557 }
558 if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
559 {
560 print_node (file, "result", DECL_RESULT_FLD (node), indent + 4);
561 }
562
563 lang_hooks.print_decl (file, node, indent);
564
565 if (DECL_RTL_SET_P (node))
566 {
567 indent_to (file, indent + 4);
568 print_rtl (file, DECL_RTL (node));
569 }
570
571 if (code == PARM_DECL)
572 {
573 print_node (file, "arg-type", DECL_ARG_TYPE (node), indent + 4);
574
575 if (DECL_INCOMING_RTL (node) != 0)
576 {
577 indent_to (file, indent + 4);
578 fprintf (file, "incoming-rtl ");
579 print_rtl (file, DECL_INCOMING_RTL (node));
580 }
581 }
582 else if (code == FUNCTION_DECL
583 && DECL_STRUCT_FUNCTION (node) != 0)
584 {
585 print_node (file, "arguments", DECL_ARGUMENTS (node), indent + 4);
586 indent_to (file, indent + 4);
587 dump_addr (file, "struct-function ", DECL_STRUCT_FUNCTION (node));
588 }
589
590 if ((code == VAR_DECL || code == PARM_DECL)
591 && DECL_HAS_VALUE_EXPR_P (node))
592 print_node (file, "value-expr", DECL_VALUE_EXPR (node), indent + 4);
593
594 /* Print the decl chain only if decl is at second level. */
595 if (indent == 4)
596 print_node (file, "chain", TREE_CHAIN (node), indent + 4);
597 else
598 print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
599 break;
600
601 case tcc_type:
602 if (TYPE_UNSIGNED (node))
603 fputs (" unsigned", file);
604
605 if (TYPE_NO_FORCE_BLK (node))
606 fputs (" no-force-blk", file);
607
608 if (code == ARRAY_TYPE && TYPE_STRING_FLAG (node))
609 fputs (" string-flag", file);
610
611 if (TYPE_NEEDS_CONSTRUCTING (node))
612 fputs (" needs-constructing", file);
613
614 if ((code == RECORD_TYPE
615 || code == UNION_TYPE
616 || code == QUAL_UNION_TYPE
617 || code == ARRAY_TYPE)
618 && TYPE_REVERSE_STORAGE_ORDER (node))
619 fputs (" reverse-storage-order", file);
620
621 if ((code == RECORD_TYPE
622 || code == UNION_TYPE)
623 && TYPE_CXX_ODR_P (node))
624 fputs (" cxx-odr-p", file);
625
626 /* The transparent-union flag is used for different things in
627 different nodes. */
628 if ((code == UNION_TYPE || code == RECORD_TYPE)
629 && TYPE_TRANSPARENT_AGGR (node))
630 fputs (" transparent-aggr", file);
631 else if (code == ARRAY_TYPE
632 && TYPE_NONALIASED_COMPONENT (node))
633 fputs (" nonaliased-component", file);
634
635 if (TYPE_PACKED (node))
636 fputs (" packed", file);
637
638 if (TYPE_RESTRICT (node))
639 fputs (" restrict", file);
640
641 if (TYPE_LANG_FLAG_0 (node))
642 fputs (" type_0", file);
643 if (TYPE_LANG_FLAG_1 (node))
644 fputs (" type_1", file);
645 if (TYPE_LANG_FLAG_2 (node))
646 fputs (" type_2", file);
647 if (TYPE_LANG_FLAG_3 (node))
648 fputs (" type_3", file);
649 if (TYPE_LANG_FLAG_4 (node))
650 fputs (" type_4", file);
651 if (TYPE_LANG_FLAG_5 (node))
652 fputs (" type_5", file);
653 if (TYPE_LANG_FLAG_6 (node))
654 fputs (" type_6", file);
655 if (TYPE_LANG_FLAG_7 (node))
656 fputs (" type_7", file);
657
658 mode = TYPE_MODE (node);
659 fprintf (file, " %s", GET_MODE_NAME (mode));
660
661 print_node (file, "size", TYPE_SIZE (node), indent + 4);
662 print_node (file, "unit-size", TYPE_SIZE_UNIT (node), indent + 4);
663 indent_to (file, indent + 3);
664
665 if (TYPE_USER_ALIGN (node))
666 fprintf (file, " user");
667
668 fprintf (file, " align:%d warn_if_not_align:%d symtab:%d alias-set "
669 HOST_WIDE_INT_PRINT_DEC,
670 TYPE_ALIGN (node), TYPE_WARN_IF_NOT_ALIGN (node),
671 TYPE_SYMTAB_ADDRESS (node),
672 (HOST_WIDE_INT) TYPE_ALIAS_SET (node));
673
674 if (TYPE_STRUCTURAL_EQUALITY_P (node))
675 fprintf (file, " structural-equality");
676 else
677 dump_addr (file, " canonical-type ", TYPE_CANONICAL (node));
678
679 print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4);
680
681 if (INTEGRAL_TYPE_P (node) || code == REAL_TYPE
682 || code == FIXED_POINT_TYPE)
683 {
684 fprintf (file, " precision:%d", TYPE_PRECISION (node));
685 print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4);
686 print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4);
687 }
688
689 if (code == ENUMERAL_TYPE)
690 print_node (file, "values", TYPE_VALUES (node), indent + 4);
691 else if (code == ARRAY_TYPE)
692 print_node (file, "domain", TYPE_DOMAIN (node), indent + 4);
693 else if (code == VECTOR_TYPE)
694 {
695 fprintf (file, " nunits:");
696 print_dec (TYPE_VECTOR_SUBPARTS (node), file);
697 }
698 else if (code == RECORD_TYPE
699 || code == UNION_TYPE
700 || code == QUAL_UNION_TYPE)
701 print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
702 else if (code == FUNCTION_TYPE
703 || code == METHOD_TYPE)
704 {
705 if (TYPE_METHOD_BASETYPE (node))
706 print_node_brief (file, "method basetype",
707 TYPE_METHOD_BASETYPE (node), indent + 4);
708 print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
709 }
710 else if (code == OFFSET_TYPE)
711 print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node),
712 indent + 4);
713
714 if (TYPE_CONTEXT (node))
715 print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);
716
717 lang_hooks.print_type (file, node, indent);
718
719 if (TYPE_POINTER_TO (node) || TREE_CHAIN (node))
720 indent_to (file, indent + 3);
721
722 print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node),
723 indent + 4);
724 print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node),
725 indent + 4);
726 print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
727 break;
728
729 case tcc_expression:
730 case tcc_comparison:
731 case tcc_unary:
732 case tcc_binary:
733 case tcc_reference:
734 case tcc_statement:
735 case tcc_vl_exp:
736 if (code == BIND_EXPR)
737 {
738 print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
739 print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
740 print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
741 break;
742 }
743 if (code == CALL_EXPR)
744 {
745 print_node (file, "fn", CALL_EXPR_FN (node), indent + 4);
746 print_node (file, "static_chain", CALL_EXPR_STATIC_CHAIN (node),
747 indent + 4);
748
749 call_expr_arg_iterator iter;
750 init_call_expr_arg_iterator (node, &iter);
751 while (more_call_expr_args_p (&iter))
752 {
753 /* Buffer big enough to format a 32-bit UINT_MAX into, plus
754 the text. */
755 char temp[15];
756 sprintf (temp, "arg:%u", iter.i);
757 tree arg = next_call_expr_arg (&iter);
758 if (arg)
759 print_node (file, temp, arg, indent + 4);
760 else
761 {
762 indent_to (file, indent + 4);
763 fprintf (file, "%s NULL", temp);
764 }
765 }
766 }
767 else
768 {
769 len = TREE_OPERAND_LENGTH (node);
770
771 for (i = 0; i < len; i++)
772 {
773 /* Buffer big enough to format a 32-bit UINT_MAX into, plus
774 the text. */
775 char temp[15];
776
777 sprintf (temp, "arg:%d", i);
778 print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
779 }
780 }
781 if (CODE_CONTAINS_STRUCT (code, TS_COMMON))
782 print_node (file, "chain", TREE_CHAIN (node), indent + 4);
783 break;
784
785 case tcc_constant:
786 case tcc_exceptional:
787 switch (code)
788 {
789 case INTEGER_CST:
790 if (TREE_OVERFLOW (node))
791 fprintf (file, " overflow");
792
793 fprintf (file, " ");
794 print_dec (wi::to_wide (node), file, TYPE_SIGN (TREE_TYPE (node)));
795 break;
796
797 case REAL_CST:
798 print_real_cst (file, node, false);
799 break;
800
801 case FIXED_CST:
802 {
803 FIXED_VALUE_TYPE f;
804 char string[64];
805
806 if (TREE_OVERFLOW (node))
807 fprintf (file, " overflow");
808
809 f = TREE_FIXED_CST (node);
810 fixed_to_decimal (string, &f, sizeof (string));
811 fprintf (file, " %s", string);
812 }
813 break;
814
815 case VECTOR_CST:
816 {
817 /* Big enough for UINT_MAX plus the string below. */
818 char buf[32];
819
820 fprintf (file, " npatterns:%u nelts-per-pattern:%u",
821 VECTOR_CST_NPATTERNS (node),
822 VECTOR_CST_NELTS_PER_PATTERN (node));
823 unsigned int count = vector_cst_encoded_nelts (node);
824 for (unsigned int i = 0; i < count; ++i)
825 {
826 sprintf (buf, "elt:%u: ", i);
827 print_node (file, buf, VECTOR_CST_ENCODED_ELT (node, i),
828 indent + 4);
829 }
830 }
831 break;
832
833 case COMPLEX_CST:
834 print_node (file, "real", TREE_REALPART (node), indent + 4);
835 print_node (file, "imag", TREE_IMAGPART (node), indent + 4);
836 break;
837
838 case STRING_CST:
839 {
840 const char *p = TREE_STRING_POINTER (node);
841 int i = TREE_STRING_LENGTH (node);
842 fputs (" \"", file);
843 while (--i >= 0)
844 {
845 char ch = *p++;
846 if (ch >= ' ' && ch < 127)
847 putc (ch, file);
848 else
849 fprintf (file, "\\%03o", ch & 0xFF);
850 }
851 fputc ('\"', file);
852 }
853 break;
854
855 case POLY_INT_CST:
856 {
857 char buf[10];
858 for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
859 {
860 snprintf (buf, sizeof (buf), "elt%u:", i);
861 print_node (file, buf, POLY_INT_CST_COEFF (node, i),
862 indent + 4);
863 }
864 }
865 break;
866
867 case IDENTIFIER_NODE:
868 lang_hooks.print_identifier (file, node, indent);
869 break;
870
871 case TREE_LIST:
872 print_node (file, "purpose", TREE_PURPOSE (node), indent + 4);
873 print_node (file, "value", TREE_VALUE (node), indent + 4);
874 print_node (file, "chain", TREE_CHAIN (node), indent + 4);
875 break;
876
877 case TREE_VEC:
878 len = TREE_VEC_LENGTH (node);
879 fprintf (file, " length:%d", len);
880 for (i = 0; i < len; i++)
881 if (TREE_VEC_ELT (node, i))
882 {
883 /* Buffer big enough to format a 32-bit UINT_MAX into, plus
884 the text. */
885 char temp[15];
886 sprintf (temp, "elt:%d", i);
887 print_node (file, temp, TREE_VEC_ELT (node, i), indent + 4);
888 }
889 break;
890
891 case CONSTRUCTOR:
892 {
893 unsigned HOST_WIDE_INT cnt;
894 tree index, value;
895 len = CONSTRUCTOR_NELTS (node);
896 fprintf (file, " length:%d", len);
897 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node),
898 cnt, index, value)
899 {
900 print_node (file, "idx", index, indent + 4, false);
901 print_node (file, "val", value, indent + 4, false);
902 }
903 }
904 break;
905
906 case STATEMENT_LIST:
907 dump_addr (file, " head ", node->stmt_list.head);
908 dump_addr (file, " tail ", node->stmt_list.tail);
909 fprintf (file, " stmts");
910 {
911 tree_stmt_iterator i;
912 for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i))
913 {
914 /* Not printing the addresses of the (not-a-tree)
915 'struct tree_stmt_list_node's. */
916 dump_addr (file, " ", tsi_stmt (i));
917 }
918 fprintf (file, "\n");
919 for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i))
920 {
921 /* Not printing the addresses of the (not-a-tree)
922 'struct tree_stmt_list_node's. */
923 print_node (file, "stmt", tsi_stmt (i), indent + 4);
924 }
925 }
926 break;
927
928 case BLOCK:
929 print_node (file, "vars", BLOCK_VARS (node), indent + 4);
930 print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node),
931 indent + 4);
932 print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
933 print_node (file, "chain", BLOCK_CHAIN (node), indent + 4);
934 print_node (file, "abstract_origin",
935 BLOCK_ABSTRACT_ORIGIN (node), indent + 4);
936 break;
937
938 case SSA_NAME:
939 print_node_brief (file, "var", SSA_NAME_VAR (node), indent + 4);
940 indent_to (file, indent + 4);
941 fprintf (file, "def_stmt ");
942 {
943 pretty_printer buffer;
944 buffer.buffer->stream = file;
945 pp_gimple_stmt_1 (&buffer, SSA_NAME_DEF_STMT (node), indent + 4,
946 TDF_NONE);
947 pp_flush (&buffer);
948 }
949
950 indent_to (file, indent + 4);
951 fprintf (file, "version:%u", SSA_NAME_VERSION (node));
952 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
953 fprintf (file, " in-abnormal-phi");
954 if (SSA_NAME_IN_FREE_LIST (node))
955 fprintf (file, " in-free-list");
956
957 if (SSA_NAME_PTR_INFO (node))
958 {
959 indent_to (file, indent + 3);
960 if (SSA_NAME_PTR_INFO (node))
961 dump_addr (file, " ptr-info ", SSA_NAME_PTR_INFO (node));
962 }
963 break;
964
965 case OMP_CLAUSE:
966 {
967 int i;
968 fprintf (file, " %s",
969 omp_clause_code_name[OMP_CLAUSE_CODE (node)]);
970 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (node)]; i++)
971 {
972 indent_to (file, indent + 4);
973 fprintf (file, "op-%d:", i);
974 print_node_brief (file, "", OMP_CLAUSE_OPERAND (node, i), 0);
975 }
976 }
977 break;
978
979 case OPTIMIZATION_NODE:
980 cl_optimization_print (file, indent + 4, TREE_OPTIMIZATION (node));
981 break;
982
983 case TARGET_OPTION_NODE:
984 cl_target_option_print (file, indent + 4, TREE_TARGET_OPTION (node));
985 break;
986 case IMPORTED_DECL:
987 fprintf (file, " imported-declaration");
988 print_node_brief (file, "associated-declaration",
989 IMPORTED_DECL_ASSOCIATED_DECL (node),
990 indent + 4);
991 break;
992
993 case TREE_BINFO:
994 fprintf (file, " bases:%d",
995 vec_safe_length (BINFO_BASE_BINFOS (node)));
996 print_node_brief (file, "offset", BINFO_OFFSET (node), indent + 4);
997 print_node_brief (file, "virtuals", BINFO_VIRTUALS (node),
998 indent + 4);
999 print_node_brief (file, "inheritance-chain",
1000 BINFO_INHERITANCE_CHAIN (node),
1001 indent + 4);
1002 break;
1003
1004 default:
1005 if (EXCEPTIONAL_CLASS_P (node))
1006 lang_hooks.print_xnode (file, node, indent);
1007 break;
1008 }
1009
1010 break;
1011 }
1012
1013 if (EXPR_HAS_LOCATION (node))
1014 {
1015 expanded_location xloc = expand_location (EXPR_LOCATION (node));
1016 indent_to (file, indent+4);
1017 fprintf (file, "%s:%d:%d", xloc.file, xloc.line, xloc.column);
1018
1019 /* Print the range, if any */
1020 source_range r = EXPR_LOCATION_RANGE (node);
1021 if (r.m_start)
1022 {
1023 xloc = expand_location (r.m_start);
1024 fprintf (file, " start: %s:%d:%d", xloc.file, xloc.line, xloc.column);
1025 }
1026 else
1027 {
1028 fprintf (file, " start: unknown");
1029 }
1030 if (r.m_finish)
1031 {
1032 xloc = expand_location (r.m_finish);
1033 fprintf (file, " finish: %s:%d:%d", xloc.file, xloc.line, xloc.column);
1034 }
1035 else
1036 {
1037 fprintf (file, " finish: unknown");
1038 }
1039 }
1040
1041 fprintf (file, ">");
1042 }
1043
1044 /* Print the identifier for DECL according to FLAGS. */
1045
1046 void
1047 print_decl_identifier (FILE *file, tree decl, int flags)
1048 {
1049 bool needs_colon = false;
1050 const char *name;
1051 char c;
1052
1053 if (flags & PRINT_DECL_ORIGIN)
1054 {
1055 if (DECL_IS_UNDECLARED_BUILTIN (decl))
1056 fputs ("<built-in>", file);
1057 else
1058 {
1059 expanded_location loc
1060 = expand_location (DECL_SOURCE_LOCATION (decl));
1061 fprintf (file, "%s:%d:%d", loc.file, loc.line, loc.column);
1062 }
1063 needs_colon = true;
1064 }
1065
1066 if (flags & PRINT_DECL_UNIQUE_NAME)
1067 {
1068 name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
1069 if (!TREE_PUBLIC (decl)
1070 || (DECL_WEAK (decl) && !DECL_EXTERNAL (decl)))
1071 /* The symbol has internal or weak linkage so its assembler name
1072 is not necessarily unique among the compilation units of the
1073 program. We therefore have to further mangle it. But we can't
1074 simply use DECL_SOURCE_FILE because it contains the name of the
1075 file the symbol originates from so, e.g. for function templates
1076 in C++ where the templates are defined in a header file, we can
1077 have symbols with the same assembler name and DECL_SOURCE_FILE.
1078 That's why we use the name of the top-level source file of the
1079 compilation unit. ??? Unnecessary for Ada. */
1080 name = ACONCAT ((main_input_filename, ":", name, NULL));
1081 }
1082 else if (flags & PRINT_DECL_NAME)
1083 {
1084 /* We don't want to print the full qualified name because it can be long,
1085 so we strip the scope prefix, but we may need to deal with the suffix
1086 created by the compiler. */
1087 const char *suffix = strchr (IDENTIFIER_POINTER (DECL_NAME (decl)), '.');
1088 name = lang_hooks.decl_printable_name (decl, 2);
1089 if (suffix)
1090 {
1091 const char *dot = strchr (name, '.');
1092 while (dot && strcasecmp (dot, suffix) != 0)
1093 {
1094 name = dot + 1;
1095 dot = strchr (name, '.');
1096 }
1097 }
1098 else
1099 {
1100 const char *dot = strrchr (name, '.');
1101 if (dot)
1102 name = dot + 1;
1103 }
1104 }
1105 else
1106 return;
1107
1108 if (needs_colon)
1109 fputc (':', file);
1110
1111 while ((c = *name++) != '\0')
1112 {
1113 /* Strip double-quotes because of VCG. */
1114 if (c == '"')
1115 continue;
1116 fputc (c, file);
1117 }
1118 }
1119
1120
1121 /* Print the node NODE on standard error, for debugging.
1122 Most nodes referred to by this one are printed recursively
1123 down to a depth of six. */
1124
1125 DEBUG_FUNCTION void
1126 debug_tree (tree node)
1127 {
1128 table = new hash_set<tree> (HASH_SIZE);
1129 print_node (stderr, "", node, 0);
1130 delete table;
1131 table = NULL;
1132 putc ('\n', stderr);
1133 }
1134
1135 DEBUG_FUNCTION void
1136 debug_raw (const tree_node &ref)
1137 {
1138 debug_tree (const_cast <tree> (&ref));
1139 }
1140
1141 DEBUG_FUNCTION void
1142 debug_raw (const tree_node *ptr)
1143 {
1144 if (ptr)
1145 debug_raw (*ptr);
1146 else
1147 fprintf (stderr, "<nil>\n");
1148 }
1149
1150 static void
1151 dump_tree_via_hooks (const tree_node *ptr, dump_flags_t options)
1152 {
1153 if (DECL_P (ptr))
1154 lang_hooks.print_decl (stderr, const_cast <tree_node*> (ptr), 0);
1155 else if (TYPE_P (ptr))
1156 lang_hooks.print_type (stderr, const_cast <tree_node*> (ptr), 0);
1157 else if (TREE_CODE (ptr) == IDENTIFIER_NODE)
1158 lang_hooks.print_identifier (stderr, const_cast <tree_node*> (ptr), 0);
1159 else
1160 print_generic_expr (stderr, const_cast <tree_node*> (ptr), options);
1161 fprintf (stderr, "\n");
1162 }
1163
1164 DEBUG_FUNCTION void
1165 debug (const tree_node &ref)
1166 {
1167 dump_tree_via_hooks (&ref, TDF_NONE);
1168 }
1169
1170 DEBUG_FUNCTION void
1171 debug (const tree_node *ptr)
1172 {
1173 if (ptr)
1174 debug (*ptr);
1175 else
1176 fprintf (stderr, "<nil>\n");
1177 }
1178
1179 DEBUG_FUNCTION void
1180 debug_head (const tree_node &ref)
1181 {
1182 debug (ref);
1183 }
1184
1185 DEBUG_FUNCTION void
1186 debug_head (const tree_node *ptr)
1187 {
1188 if (ptr)
1189 debug_head (*ptr);
1190 else
1191 fprintf (stderr, "<nil>\n");
1192 }
1193
1194 DEBUG_FUNCTION void
1195 debug_body (const tree_node &ref)
1196 {
1197 if (TREE_CODE (&ref) == FUNCTION_DECL)
1198 dump_function_to_file (const_cast <tree_node*> (&ref), stderr, TDF_NONE);
1199 else
1200 debug (ref);
1201 }
1202
1203 DEBUG_FUNCTION void
1204 debug_body (const tree_node *ptr)
1205 {
1206 if (ptr)
1207 debug_body (*ptr);
1208 else
1209 fprintf (stderr, "<nil>\n");
1210 }
1211
1212 /* Print the vector of trees VEC on standard error, for debugging.
1213 Most nodes referred to by this one are printed recursively
1214 down to a depth of six. */
1215
1216 DEBUG_FUNCTION void
1217 debug_raw (vec<tree, va_gc> &ref)
1218 {
1219 tree elt;
1220 unsigned ix;
1221
1222 /* Print the slot this node is in, and its code, and address. */
1223 fprintf (stderr, "<VEC");
1224 dump_addr (stderr, " ", ref.address ());
1225
1226 FOR_EACH_VEC_ELT (ref, ix, elt)
1227 {
1228 fprintf (stderr, "elt:%d ", ix);
1229 debug_raw (elt);
1230 }
1231 }
1232
1233 DEBUG_FUNCTION void
1234 debug_raw (vec<tree, va_gc> *ptr)
1235 {
1236 if (ptr)
1237 debug_raw (*ptr);
1238 else
1239 fprintf (stderr, "<nil>\n");
1240 }
1241
1242 static void
1243 debug_slim (tree t)
1244 {
1245 print_node_brief (stderr, "", t, 0);
1246 }
1247
1248 DEFINE_DEBUG_VEC (tree)
1249 DEFINE_DEBUG_HASH_SET (tree)