1 /* Tree-dumping functionality for intermediate representation.
2 Copyright (C) 1999-2013 Free Software Foundation, Inc.
3 Written by Mark Mitchell <mark@codesourcery.com>
5 This file is part of GCC.
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
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
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/>. */
23 #include "coretypes.h"
26 #include "splay-tree.h"
27 #include "filenames.h"
28 #include "tree-dump.h"
29 #include "langhooks.h"
30 #include "tree-iterator.h"
32 static unsigned int queue (dump_info_p, const_tree, int);
33 static void dump_index (dump_info_p, unsigned int);
34 static void dequeue_and_dump (dump_info_p);
35 static void dump_new_line (dump_info_p);
36 static void dump_maybe_newline (dump_info_p);
38 /* Add T to the end of the queue of nodes to dump. Returns the index
42 queue (dump_info_p di, const_tree t, int flags)
48 /* Assign the next available index to T. */
51 /* Obtain a new queue node. */
55 di->free_list = dq->next;
58 dq = XNEW (struct dump_queue);
60 /* Create a new entry in the splay-tree. */
61 dni = XNEW (struct dump_node_info);
63 dni->binfo_p = ((flags & DUMP_BINFO) != 0);
64 dq->node = splay_tree_insert (di->nodes, (splay_tree_key) t,
65 (splay_tree_value) dni);
67 /* Add it to the end of the queue. */
72 di->queue_end->next = dq;
75 /* Return the index. */
80 dump_index (dump_info_p di, unsigned int index)
82 fprintf (di->stream, "@%-6u ", index);
86 /* If T has not already been output, queue it for subsequent output.
87 FIELD is a string to print before printing the index. Then, the
88 index of T is printed. */
91 queue_and_dump_index (dump_info_p di, const char *field, const_tree t, int flags)
96 /* If there's no node, just return. This makes for fewer checks in
101 /* See if we've already queued or dumped this node. */
102 n = splay_tree_lookup (di->nodes, (splay_tree_key) t);
104 index = ((dump_node_info_p) n->value)->index;
106 /* If we haven't, add it to the queue. */
107 index = queue (di, t, flags);
109 /* Print the index of the node. */
110 dump_maybe_newline (di);
111 fprintf (di->stream, "%-4s: ", field);
113 dump_index (di, index);
116 /* Dump the type of T. */
119 queue_and_dump_type (dump_info_p di, const_tree t)
121 queue_and_dump_index (di, "type", TREE_TYPE (t), DUMP_NONE);
124 /* Dump column control */
125 #define SOL_COLUMN 25 /* Start of line column. */
126 #define EOL_COLUMN 55 /* End of line column. */
127 #define COLUMN_ALIGNMENT 15 /* Alignment. */
129 /* Insert a new line in the dump output, and indent to an appropriate
130 place to start printing more fields. */
133 dump_new_line (dump_info_p di)
135 fprintf (di->stream, "\n%*s", SOL_COLUMN, "");
136 di->column = SOL_COLUMN;
139 /* If necessary, insert a new line. */
142 dump_maybe_newline (dump_info_p di)
146 /* See if we need a new line. */
147 if (di->column > EOL_COLUMN)
149 /* See if we need any padding. */
150 else if ((extra = (di->column - SOL_COLUMN) % COLUMN_ALIGNMENT) != 0)
152 fprintf (di->stream, "%*s", COLUMN_ALIGNMENT - extra, "");
153 di->column += COLUMN_ALIGNMENT - extra;
157 /* Dump FUNCTION_DECL FN as tree dump PHASE. */
160 dump_function (int phase, tree fn)
165 stream = dump_begin (phase, &flags);
168 dump_function_to_file (fn, stream, flags);
169 dump_end (phase, stream);
173 /* Dump pointer PTR using FIELD to identify it. */
176 dump_pointer (dump_info_p di, const char *field, void *ptr)
178 dump_maybe_newline (di);
179 fprintf (di->stream, "%-4s: %-8" HOST_WIDE_INT_PRINT "x ", field,
180 (unsigned HOST_WIDE_INT) (uintptr_t) ptr);
184 /* Dump integer I using FIELD to identify it. */
187 dump_int (dump_info_p di, const char *field, int i)
189 dump_maybe_newline (di);
190 fprintf (di->stream, "%-4s: %-7d ", field, i);
194 /* Dump the floating point value R, using FIELD to identify it. */
197 dump_real (dump_info_p di, const char *field, const REAL_VALUE_TYPE *r)
200 real_to_decimal (buf, r, sizeof (buf), 0, true);
201 dump_maybe_newline (di);
202 fprintf (di->stream, "%-4s: %s ", field, buf);
203 di->column += strlen (buf) + 7;
206 /* Dump the fixed-point value F, using FIELD to identify it. */
209 dump_fixed (dump_info_p di, const char *field, const FIXED_VALUE_TYPE *f)
212 fixed_to_decimal (buf, f, sizeof (buf));
213 dump_maybe_newline (di);
214 fprintf (di->stream, "%-4s: %s ", field, buf);
215 di->column += strlen (buf) + 7;
219 /* Dump the string S. */
222 dump_string (dump_info_p di, const char *string)
224 dump_maybe_newline (di);
225 fprintf (di->stream, "%-13s ", string);
226 if (strlen (string) > 13)
227 di->column += strlen (string) + 1;
232 /* Dump the string field S. */
235 dump_string_field (dump_info_p di, const char *field, const char *string)
237 dump_maybe_newline (di);
238 fprintf (di->stream, "%-4s: %-7s ", field, string);
239 if (strlen (string) > 7)
240 di->column += 6 + strlen (string) + 1;
245 /* Dump the next node in the queue. */
248 dequeue_and_dump (dump_info_p di)
252 dump_node_info_p dni;
256 enum tree_code_class code_class;
257 const char* code_name;
259 /* Get the next node from the queue. */
263 dni = (dump_node_info_p) stn->value;
266 /* Remove the node from the queue, and put it on the free list. */
267 di->queue = dq->next;
270 dq->next = di->free_list;
273 /* Print the node index. */
274 dump_index (di, index);
275 /* And the type of node this is. */
279 code_name = tree_code_name[(int) TREE_CODE (t)];
280 fprintf (di->stream, "%-16s ", code_name);
283 /* Figure out what kind of node this is. */
284 code = TREE_CODE (t);
285 code_class = TREE_CODE_CLASS (code);
287 /* Although BINFOs are TREE_VECs, we dump them specially so as to be
293 vec<tree, va_gc> *accesses = BINFO_BASE_ACCESSES (t);
295 dump_child ("type", BINFO_TYPE (t));
297 if (BINFO_VIRTUAL_P (t))
298 dump_string_field (di, "spec", "virt");
300 dump_int (di, "bases", BINFO_N_BASE_BINFOS (t));
301 for (ix = 0; BINFO_BASE_ITERATE (t, ix, base); ix++)
303 tree access = (accesses ? (*accesses)[ix] : access_public_node);
304 const char *string = NULL;
306 if (access == access_public_node)
308 else if (access == access_protected_node)
310 else if (access == access_private_node)
315 dump_string_field (di, "accs", string);
316 queue_and_dump_index (di, "binf", base, DUMP_BINFO);
322 /* We can knock off a bunch of expression nodes in exactly the same
324 if (IS_EXPR_CODE_CLASS (code_class))
326 /* If we're dumping children, dump them now. */
327 queue_and_dump_type (di, t);
332 dump_child ("op 0", TREE_OPERAND (t, 0));
337 dump_child ("op 0", TREE_OPERAND (t, 0));
338 dump_child ("op 1", TREE_OPERAND (t, 1));
345 /* These nodes are handled explicitly below. */
354 expanded_location xloc;
355 /* All declarations have names. */
357 dump_child ("name", DECL_NAME (t));
358 if (DECL_ASSEMBLER_NAME_SET_P (t)
359 && DECL_ASSEMBLER_NAME (t) != DECL_NAME (t))
360 dump_child ("mngl", DECL_ASSEMBLER_NAME (t));
361 if (DECL_ABSTRACT_ORIGIN (t))
362 dump_child ("orig", DECL_ABSTRACT_ORIGIN (t));
364 queue_and_dump_type (di, t);
365 dump_child ("scpe", DECL_CONTEXT (t));
366 /* And a source position. */
367 xloc = expand_location (DECL_SOURCE_LOCATION (t));
370 const char *filename = lbasename (xloc.file);
372 dump_maybe_newline (di);
373 fprintf (di->stream, "srcp: %s:%-6d ", filename,
375 di->column += 6 + strlen (filename) + 8;
377 /* And any declaration can be compiler-generated. */
378 if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_COMMON)
379 && DECL_ARTIFICIAL (t))
380 dump_string_field (di, "note", "artificial");
381 if (DECL_CHAIN (t) && !dump_flag (di, TDF_SLIM, NULL))
382 dump_child ("chain", DECL_CHAIN (t));
384 else if (code_class == tcc_type)
386 /* All types have qualifiers. */
387 int quals = lang_hooks.tree_dump.type_quals (t);
389 if (quals != TYPE_UNQUALIFIED)
391 fprintf (di->stream, "qual: %c%c%c ",
392 (quals & TYPE_QUAL_CONST) ? 'c' : ' ',
393 (quals & TYPE_QUAL_VOLATILE) ? 'v' : ' ',
394 (quals & TYPE_QUAL_RESTRICT) ? 'r' : ' ');
398 /* All types have associated declarations. */
399 dump_child ("name", TYPE_NAME (t));
401 /* All types have a main variant. */
402 if (TYPE_MAIN_VARIANT (t) != t)
403 dump_child ("unql", TYPE_MAIN_VARIANT (t));
406 dump_child ("size", TYPE_SIZE (t));
408 /* All types have alignments. */
409 dump_int (di, "algn", TYPE_ALIGN (t));
411 else if (code_class == tcc_constant)
412 /* All constants can have types. */
413 queue_and_dump_type (di, t);
415 /* Give the language-specific code a chance to print something. If
416 it's completely taken care of things, don't bother printing
417 anything more ourselves. */
418 if (lang_hooks.tree_dump.dump_tree (di, t))
421 /* Now handle the various kinds of nodes. */
426 case IDENTIFIER_NODE:
427 dump_string_field (di, "strg", IDENTIFIER_POINTER (t));
428 dump_int (di, "lngt", IDENTIFIER_LENGTH (t));
432 dump_child ("purp", TREE_PURPOSE (t));
433 dump_child ("valu", TREE_VALUE (t));
434 dump_child ("chan", TREE_CHAIN (t));
439 tree_stmt_iterator it;
440 for (i = 0, it = tsi_start (t); !tsi_end_p (it); tsi_next (&it), i++)
443 sprintf (buffer, "%u", i);
444 dump_child (buffer, tsi_stmt (it));
450 dump_int (di, "lngt", TREE_VEC_LENGTH (t));
451 for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
454 sprintf (buffer, "%u", i);
455 dump_child (buffer, TREE_VEC_ELT (t, i));
461 dump_int (di, "prec", TYPE_PRECISION (t));
462 dump_string_field (di, "sign", TYPE_UNSIGNED (t) ? "unsigned": "signed");
463 dump_child ("min", TYPE_MIN_VALUE (t));
464 dump_child ("max", TYPE_MAX_VALUE (t));
466 if (code == ENUMERAL_TYPE)
467 dump_child ("csts", TYPE_VALUES (t));
471 dump_int (di, "prec", TYPE_PRECISION (t));
474 case FIXED_POINT_TYPE:
475 dump_int (di, "prec", TYPE_PRECISION (t));
476 dump_string_field (di, "sign", TYPE_UNSIGNED (t) ? "unsigned": "signed");
477 dump_string_field (di, "saturating",
478 TYPE_SATURATING (t) ? "saturating": "non-saturating");
482 dump_child ("ptd", TREE_TYPE (t));
486 dump_child ("refd", TREE_TYPE (t));
490 dump_child ("clas", TYPE_METHOD_BASETYPE (t));
494 dump_child ("retn", TREE_TYPE (t));
495 dump_child ("prms", TYPE_ARG_TYPES (t));
499 dump_child ("elts", TREE_TYPE (t));
500 dump_child ("domn", TYPE_DOMAIN (t));
505 if (TREE_CODE (t) == RECORD_TYPE)
506 dump_string_field (di, "tag", "struct");
508 dump_string_field (di, "tag", "union");
510 dump_child ("flds", TYPE_FIELDS (t));
511 dump_child ("fncs", TYPE_METHODS (t));
512 queue_and_dump_index (di, "binf", TYPE_BINFO (t),
517 dump_child ("cnst", DECL_INITIAL (t));
520 case DEBUG_EXPR_DECL:
521 dump_int (di, "-uid", DEBUG_TEMP_UID (t));
528 if (TREE_CODE (t) == PARM_DECL)
529 dump_child ("argt", DECL_ARG_TYPE (t));
531 dump_child ("init", DECL_INITIAL (t));
532 dump_child ("size", DECL_SIZE (t));
533 dump_int (di, "algn", DECL_ALIGN (t));
535 if (TREE_CODE (t) == FIELD_DECL)
537 if (DECL_FIELD_OFFSET (t))
538 dump_child ("bpos", bit_position (t));
540 else if (TREE_CODE (t) == VAR_DECL
541 || TREE_CODE (t) == PARM_DECL)
543 dump_int (di, "used", TREE_USED (t));
544 if (DECL_REGISTER (t))
545 dump_string_field (di, "spec", "register");
550 dump_child ("args", DECL_ARGUMENTS (t));
551 if (DECL_EXTERNAL (t))
552 dump_string_field (di, "body", "undefined");
554 dump_string_field (di, "link", "extern");
556 dump_string_field (di, "link", "static");
557 if (DECL_SAVED_TREE (t) && !dump_flag (di, TDF_SLIM, t))
558 dump_child ("body", DECL_SAVED_TREE (t));
562 if (TREE_INT_CST_HIGH (t))
563 dump_int (di, "high", TREE_INT_CST_HIGH (t));
564 dump_int (di, "low", TREE_INT_CST_LOW (t));
568 fprintf (di->stream, "strg: %-7s ", TREE_STRING_POINTER (t));
569 dump_int (di, "lngt", TREE_STRING_LENGTH (t));
573 dump_real (di, "valu", TREE_REAL_CST_PTR (t));
577 dump_fixed (di, "valu", TREE_FIXED_CST_PTR (t));
583 case CLEANUP_POINT_EXPR:
587 /* These nodes are unary, but do not have code class `1'. */
588 dump_child ("op 0", TREE_OPERAND (t, 0));
591 case TRUTH_ANDIF_EXPR:
592 case TRUTH_ORIF_EXPR:
596 case PREDECREMENT_EXPR:
597 case PREINCREMENT_EXPR:
598 case POSTDECREMENT_EXPR:
599 case POSTINCREMENT_EXPR:
600 /* These nodes are binary, but do not have code class `2'. */
601 dump_child ("op 0", TREE_OPERAND (t, 0));
602 dump_child ("op 1", TREE_OPERAND (t, 1));
607 dump_child ("op 0", TREE_OPERAND (t, 0));
608 dump_child ("op 1", TREE_OPERAND (t, 1));
609 dump_child ("op 2", TREE_OPERAND (t, 2));
613 case ARRAY_RANGE_REF:
614 dump_child ("op 0", TREE_OPERAND (t, 0));
615 dump_child ("op 1", TREE_OPERAND (t, 1));
616 dump_child ("op 2", TREE_OPERAND (t, 2));
617 dump_child ("op 3", TREE_OPERAND (t, 3));
621 dump_child ("op 0", TREE_OPERAND (t, 0));
622 dump_child ("op 1", TREE_OPERAND (t, 1));
623 dump_child ("op 2", TREE_OPERAND (t, 2));
626 case TRY_FINALLY_EXPR:
627 dump_child ("op 0", TREE_OPERAND (t, 0));
628 dump_child ("op 1", TREE_OPERAND (t, 1));
635 call_expr_arg_iterator iter;
636 dump_child ("fn", CALL_EXPR_FN (t));
637 FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
640 sprintf (buffer, "%u", i);
641 dump_child (buffer, arg);
649 unsigned HOST_WIDE_INT cnt;
651 dump_int (di, "lngt", vec_safe_length (CONSTRUCTOR_ELTS (t)));
652 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), cnt, index, value)
654 dump_child ("idx", index);
655 dump_child ("val", value);
661 dump_child ("vars", TREE_OPERAND (t, 0));
662 dump_child ("body", TREE_OPERAND (t, 1));
666 dump_child ("body", TREE_OPERAND (t, 0));
670 dump_child ("cond", TREE_OPERAND (t, 0));
674 dump_child ("expr", TREE_OPERAND (t, 0));
678 dump_child ("decl", TREE_OPERAND (t, 0));
679 dump_child ("init", TREE_OPERAND (t, 1));
680 dump_child ("clnp", TREE_OPERAND (t, 2));
681 /* There really are two possible places the initializer can be.
682 After RTL expansion, the second operand is moved to the
683 position of the fourth operand, and the second operand
685 dump_child ("init", TREE_OPERAND (t, 3));
688 case CASE_LABEL_EXPR:
689 dump_child ("name", CASE_LABEL (t));
692 dump_child ("low ", CASE_LOW (t));
694 dump_child ("high", CASE_HIGH (t));
698 dump_child ("name", TREE_OPERAND (t,0));
701 dump_child ("labl", TREE_OPERAND (t, 0));
704 dump_child ("cond", TREE_OPERAND (t, 0));
705 dump_child ("body", TREE_OPERAND (t, 1));
706 if (TREE_OPERAND (t, 2))
708 dump_child ("labl", TREE_OPERAND (t,2));
714 fprintf (di->stream, "%s\n", omp_clause_code_name[OMP_CLAUSE_CODE (t)]);
715 for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (t)]; i++)
716 dump_child ("op: ", OMP_CLAUSE_OPERAND (t, i));
720 /* There are no additional fields to print. */
725 if (dump_flag (di, TDF_ADDRESS, NULL))
726 dump_pointer (di, "addr", (void *)t);
728 /* Terminate the line. */
729 fprintf (di->stream, "\n");
732 /* Return nonzero if FLAG has been specified for the dump, and NODE
733 is not the root node of the dump. */
735 int dump_flag (dump_info_p di, int flag, const_tree node)
737 return (di->flags & flag) && (node != di->node);
740 /* Dump T, and all its children, on STREAM. */
743 dump_node (const_tree t, int flags, FILE *stream)
747 dump_queue_p next_dq;
749 /* Initialize the dump-information structure. */
758 di.nodes = splay_tree_new (splay_tree_compare_pointers, 0,
759 (splay_tree_delete_value_fn) &free);
761 /* Queue up the first node. */
762 queue (&di, t, DUMP_NONE);
764 /* Until the queue is empty, keep dumping nodes. */
766 dequeue_and_dump (&di);
769 for (dq = di.free_list; dq; dq = next_dq)
774 splay_tree_delete (di.nodes);