1132727Skan/* Prints out tree in human readable form - GCC
290285Sobrien   Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3169699Skan   2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
418334Speter
590285SobrienThis file is part of GCC.
618334Speter
790285SobrienGCC is free software; you can redistribute it and/or modify it under
890285Sobrienthe terms of the GNU General Public License as published by the Free
990285SobrienSoftware Foundation; either version 2, or (at your option) any later
1090285Sobrienversion.
1118334Speter
1290285SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY
1390285SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or
1490285SobrienFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1590285Sobrienfor more details.
1618334Speter
1718334SpeterYou should have received a copy of the GNU General Public License
1890285Sobrienalong with GCC; see the file COPYING.  If not, write to the Free
19169699SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
20169699Skan02110-1301, USA.  */
2118334Speter
2218334Speter
2318334Speter#include "config.h"
2450617Sobrien#include "system.h"
25132727Skan#include "coretypes.h"
26132727Skan#include "tm.h"
2718334Speter#include "tree.h"
28117404Skan#include "real.h"
2990285Sobrien#include "ggc.h"
3090285Sobrien#include "langhooks.h"
31169699Skan#include "tree-iterator.h"
3218334Speter
3318334Speter/* Define the hash table of nodes already seen.
3418334Speter   Such nodes are not repeated; brief cross-references are used.  */
3518334Speter
3618334Speter#define HASH_SIZE 37
3718334Speter
3818334Speterstruct bucket
3918334Speter{
4018334Speter  tree node;
4118334Speter  struct bucket *next;
4218334Speter};
4318334Speter
4418334Speterstatic struct bucket **table;
4518334Speter
4618334Speter/* Print the node NODE on standard error, for debugging.
4718334Speter   Most nodes referred to by this one are printed recursively
4818334Speter   down to a depth of six.  */
4918334Speter
5018334Spetervoid
51132727Skandebug_tree (tree node)
5218334Speter{
53169699Skan  table = XCNEWVEC (struct bucket *, HASH_SIZE);
5418334Speter  print_node (stderr, "", node, 0);
55132727Skan  free (table);
5618334Speter  table = 0;
57132727Skan  putc ('\n', stderr);
5818334Speter}
5918334Speter
60169699Skan/* Print PREFIX and ADDR to FILE.  */
61169699Skanvoid
62169699Skandump_addr (FILE *file, const char *prefix, void *addr)
63169699Skan{
64169699Skan  if (flag_dump_noaddr || flag_dump_unnumbered)
65169699Skan    fprintf (file, "%s#", prefix);
66169699Skan  else
67169699Skan    fprintf (file, "%s%p", prefix, addr);
68169699Skan}
69169699Skan
7018334Speter/* Print a node in brief fashion, with just the code, address and name.  */
7118334Speter
7218334Spetervoid
73132727Skanprint_node_brief (FILE *file, const char *prefix, tree node, int indent)
7418334Speter{
75169699Skan  enum tree_code_class class;
7618334Speter
7718334Speter  if (node == 0)
7818334Speter    return;
7918334Speter
8018334Speter  class = TREE_CODE_CLASS (TREE_CODE (node));
8118334Speter
8218334Speter  /* Always print the slot this node is in, and its code, address and
8318334Speter     name if any.  */
8418334Speter  if (indent > 0)
8518334Speter    fprintf (file, " ");
86169699Skan  fprintf (file, "%s <%s", prefix, tree_code_name[(int) TREE_CODE (node)]);
87169699Skan  dump_addr (file, " ", node);
8818334Speter
89169699Skan  if (class == tcc_declaration)
9018334Speter    {
9118334Speter      if (DECL_NAME (node))
9218334Speter	fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
93169699Skan      else if (TREE_CODE (node) == LABEL_DECL
94169699Skan	       && LABEL_DECL_UID (node) != -1)
95169699Skan	fprintf (file, " L." HOST_WIDE_INT_PRINT_DEC, LABEL_DECL_UID (node));
96169699Skan      else
97169699Skan	fprintf (file, " %c.%u", TREE_CODE (node) == CONST_DECL ? 'C' : 'D',
98169699Skan		 DECL_UID (node));
9918334Speter    }
100169699Skan  else if (class == tcc_type)
10118334Speter    {
10218334Speter      if (TYPE_NAME (node))
10318334Speter	{
10418334Speter	  if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
10518334Speter	    fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
10618334Speter	  else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
10718334Speter		   && DECL_NAME (TYPE_NAME (node)))
10818334Speter	    fprintf (file, " %s",
10918334Speter		     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
11018334Speter	}
11118334Speter    }
11218334Speter  if (TREE_CODE (node) == IDENTIFIER_NODE)
11318334Speter    fprintf (file, " %s", IDENTIFIER_POINTER (node));
11490285Sobrien
11590285Sobrien  /* We might as well always print the value of an integer or real.  */
11618334Speter  if (TREE_CODE (node) == INTEGER_CST)
11718334Speter    {
11818334Speter      if (TREE_CONSTANT_OVERFLOW (node))
11918334Speter	fprintf (file, " overflow");
12018334Speter
12150617Sobrien      fprintf (file, " ");
12218334Speter      if (TREE_INT_CST_HIGH (node) == 0)
12350617Sobrien	fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, TREE_INT_CST_LOW (node));
12418334Speter      else if (TREE_INT_CST_HIGH (node) == -1
12518334Speter	       && TREE_INT_CST_LOW (node) != 0)
126132727Skan	fprintf (file, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
127132727Skan		 -TREE_INT_CST_LOW (node));
12818334Speter      else
12950617Sobrien	fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
13018334Speter		 TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
13118334Speter    }
13218334Speter  if (TREE_CODE (node) == REAL_CST)
13318334Speter    {
13418334Speter      REAL_VALUE_TYPE d;
13518334Speter
13618334Speter      if (TREE_OVERFLOW (node))
13718334Speter	fprintf (file, " overflow");
13818334Speter
13918334Speter      d = TREE_REAL_CST (node);
14018334Speter      if (REAL_VALUE_ISINF (d))
141169699Skan	fprintf (file,  REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
14218334Speter      else if (REAL_VALUE_ISNAN (d))
14318334Speter	fprintf (file, " Nan");
14418334Speter      else
14518334Speter	{
146117404Skan	  char string[60];
147117404Skan	  real_to_decimal (string, &d, sizeof (string), 0, 1);
14818334Speter	  fprintf (file, " %s", string);
14918334Speter	}
15018334Speter    }
15118334Speter
15218334Speter  fprintf (file, ">");
15318334Speter}
15418334Speter
15518334Spetervoid
156132727Skanindent_to (FILE *file, int column)
15718334Speter{
15818334Speter  int i;
15918334Speter
16018334Speter  /* Since this is the long way, indent to desired column.  */
16118334Speter  if (column > 0)
16218334Speter    fprintf (file, "\n");
16318334Speter  for (i = 0; i < column; i++)
16418334Speter    fprintf (file, " ");
16518334Speter}
16618334Speter
16718334Speter/* Print the node NODE in full on file FILE, preceded by PREFIX,
16818334Speter   starting in column INDENT.  */
16918334Speter
17018334Spetervoid
171132727Skanprint_node (FILE *file, const char *prefix, tree node, int indent)
17218334Speter{
17318334Speter  int hash;
17418334Speter  struct bucket *b;
17518334Speter  enum machine_mode mode;
176169699Skan  enum tree_code_class class;
17718334Speter  int len;
17818334Speter  int i;
179169699Skan  expanded_location xloc;
180169699Skan  enum tree_code code;
18118334Speter
18218334Speter  if (node == 0)
18318334Speter    return;
184169699Skan
185169699Skan  code = TREE_CODE (node);
186169699Skan  class = TREE_CODE_CLASS (code);
18718334Speter
18818334Speter  /* Don't get too deep in nesting.  If the user wants to see deeper,
18918334Speter     it is easy to use the address of a lowest-level node
19018334Speter     as an argument in another call to debug_tree.  */
19118334Speter
19218334Speter  if (indent > 24)
19318334Speter    {
19418334Speter      print_node_brief (file, prefix, node, indent);
19518334Speter      return;
19618334Speter    }
19718334Speter
198169699Skan  if (indent > 8 && (class == tcc_type || class == tcc_declaration))
19918334Speter    {
20018334Speter      print_node_brief (file, prefix, node, indent);
20118334Speter      return;
20218334Speter    }
20318334Speter
204132727Skan  /* It is unsafe to look at any other fields of an ERROR_MARK node.  */
20518334Speter  if (TREE_CODE (node) == ERROR_MARK)
20618334Speter    {
20718334Speter      print_node_brief (file, prefix, node, indent);
20818334Speter      return;
20918334Speter    }
21018334Speter
21150617Sobrien  hash = ((unsigned long) node) % HASH_SIZE;
21218334Speter
21318334Speter  /* If node is in the table, just mention its address.  */
21418334Speter  for (b = table[hash]; b; b = b->next)
21518334Speter    if (b->node == node)
21618334Speter      {
21718334Speter	print_node_brief (file, prefix, node, indent);
21818334Speter	return;
21918334Speter      }
22018334Speter
22118334Speter  /* Add this node to the table.  */
222169699Skan  b = XNEW (struct bucket);
22318334Speter  b->node = node;
22418334Speter  b->next = table[hash];
22518334Speter  table[hash] = b;
22618334Speter
22718334Speter  /* Indent to the specified column, since this is the long form.  */
22818334Speter  indent_to (file, indent);
22918334Speter
23018334Speter  /* Print the slot this node is in, and its code, and address.  */
231169699Skan  fprintf (file, "%s <%s", prefix, tree_code_name[(int) TREE_CODE (node)]);
232169699Skan  dump_addr (file, " ", node);
23318334Speter
23418334Speter  /* Print the name, if any.  */
235169699Skan  if (class == tcc_declaration)
23618334Speter    {
23718334Speter      if (DECL_NAME (node))
23818334Speter	fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
239169699Skan      else if (TREE_CODE (node) == LABEL_DECL
240169699Skan	       && LABEL_DECL_UID (node) != -1)
241169699Skan	fprintf (file, " L." HOST_WIDE_INT_PRINT_DEC, LABEL_DECL_UID (node));
242169699Skan      else
243169699Skan	fprintf (file, " %c.%u", TREE_CODE (node) == CONST_DECL ? 'C' : 'D',
244169699Skan		 DECL_UID (node));
24518334Speter    }
246169699Skan  else if (class == tcc_type)
24718334Speter    {
24818334Speter      if (TYPE_NAME (node))
24918334Speter	{
25018334Speter	  if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
25118334Speter	    fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
25218334Speter	  else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
25318334Speter		   && DECL_NAME (TYPE_NAME (node)))
25418334Speter	    fprintf (file, " %s",
25518334Speter		     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
25618334Speter	}
25718334Speter    }
25818334Speter  if (TREE_CODE (node) == IDENTIFIER_NODE)
25918334Speter    fprintf (file, " %s", IDENTIFIER_POINTER (node));
26018334Speter
26118334Speter  if (TREE_CODE (node) == INTEGER_CST)
26218334Speter    {
26318334Speter      if (indent <= 4)
26418334Speter	print_node_brief (file, "type", TREE_TYPE (node), indent + 4);
26518334Speter    }
26618334Speter  else
26718334Speter    {
26818334Speter      print_node (file, "type", TREE_TYPE (node), indent + 4);
26918334Speter      if (TREE_TYPE (node))
27018334Speter	indent_to (file, indent + 3);
27118334Speter    }
27218334Speter
273169699Skan  if (!TYPE_P (node) && TREE_SIDE_EFFECTS (node))
27418334Speter    fputs (" side-effects", file);
275169699Skan
276169699Skan  if (TYPE_P (node) ? TYPE_READONLY (node) : TREE_READONLY (node))
27718334Speter    fputs (" readonly", file);
278169699Skan  if (!TYPE_P (node) && TREE_CONSTANT (node))
27918334Speter    fputs (" constant", file);
280169699Skan  else if (TYPE_P (node) && TYPE_SIZES_GIMPLIFIED (node))
281169699Skan    fputs (" sizes-gimplified", file);
282169699Skan
283169699Skan  if (TREE_INVARIANT (node))
284169699Skan    fputs (" invariant", file);
28518334Speter  if (TREE_ADDRESSABLE (node))
28618334Speter    fputs (" addressable", file);
28718334Speter  if (TREE_THIS_VOLATILE (node))
28818334Speter    fputs (" volatile", file);
28918334Speter  if (TREE_ASM_WRITTEN (node))
29018334Speter    fputs (" asm_written", file);
29118334Speter  if (TREE_USED (node))
29218334Speter    fputs (" used", file);
29390285Sobrien  if (TREE_NOTHROW (node))
294132727Skan    fputs (TYPE_P (node) ? " align-ok" : " nothrow", file);
29518334Speter  if (TREE_PUBLIC (node))
29618334Speter    fputs (" public", file);
29790285Sobrien  if (TREE_PRIVATE (node))
29890285Sobrien    fputs (" private", file);
29990285Sobrien  if (TREE_PROTECTED (node))
30090285Sobrien    fputs (" protected", file);
30118334Speter  if (TREE_STATIC (node))
30218334Speter    fputs (" static", file);
30390285Sobrien  if (TREE_DEPRECATED (node))
30490285Sobrien    fputs (" deprecated", file);
305169699Skan  if (TREE_VISITED (node))
306169699Skan    fputs (" visited", file);
30718334Speter  if (TREE_LANG_FLAG_0 (node))
30818334Speter    fputs (" tree_0", file);
30918334Speter  if (TREE_LANG_FLAG_1 (node))
31018334Speter    fputs (" tree_1", file);
31118334Speter  if (TREE_LANG_FLAG_2 (node))
31218334Speter    fputs (" tree_2", file);
31318334Speter  if (TREE_LANG_FLAG_3 (node))
31418334Speter    fputs (" tree_3", file);
31518334Speter  if (TREE_LANG_FLAG_4 (node))
31618334Speter    fputs (" tree_4", file);
31718334Speter  if (TREE_LANG_FLAG_5 (node))
31818334Speter    fputs (" tree_5", file);
31918334Speter  if (TREE_LANG_FLAG_6 (node))
32018334Speter    fputs (" tree_6", file);
32118334Speter
32218334Speter  /* DECL_ nodes have additional attributes.  */
32318334Speter
32418334Speter  switch (TREE_CODE_CLASS (TREE_CODE (node)))
32518334Speter    {
326169699Skan    case tcc_declaration:
327169699Skan      if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
328169699Skan	{
329169699Skan	  if (DECL_UNSIGNED (node))
330169699Skan	    fputs (" unsigned", file);
331169699Skan	  if (DECL_IGNORED_P (node))
332169699Skan	    fputs (" ignored", file);
333169699Skan	  if (DECL_ABSTRACT (node))
334169699Skan	    fputs (" abstract", file);
335169699Skan	  if (DECL_EXTERNAL (node))
336169699Skan	    fputs (" external", file);
337169699Skan	  if (DECL_NONLOCAL (node))
338169699Skan	    fputs (" nonlocal", file);
339169699Skan	}
340169699Skan      if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
341169699Skan	{
342169699Skan	  if (DECL_WEAK (node))
343169699Skan	    fputs (" weak", file);
344169699Skan	  if (DECL_IN_SYSTEM_HEADER (node))
345169699Skan	    fputs (" in_system_header", file);
346169699Skan	}
347169699Skan      if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL)
348169699Skan	  && TREE_CODE (node) != LABEL_DECL
34990285Sobrien	  && TREE_CODE (node) != FUNCTION_DECL
350169699Skan	  && DECL_REGISTER (node))
35118334Speter	fputs (" regdecl", file);
35218334Speter
35318334Speter      if (TREE_CODE (node) == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node))
35418334Speter	fputs (" suppress-debug", file);
35518334Speter
356132727Skan      if (TREE_CODE (node) == FUNCTION_DECL && DECL_INLINE (node))
357132727Skan	fputs (DECL_DECLARED_INLINE_P (node) ? " inline" : " autoinline", file);
35818334Speter      if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN (node))
35918334Speter	fputs (" built-in", file);
36090285Sobrien      if (TREE_CODE (node) == FUNCTION_DECL && DECL_NO_STATIC_CHAIN (node))
36190285Sobrien	fputs (" no-static-chain", file);
36218334Speter
36390285Sobrien      if (TREE_CODE (node) == FIELD_DECL && DECL_PACKED (node))
36490285Sobrien	fputs (" packed", file);
36518334Speter      if (TREE_CODE (node) == FIELD_DECL && DECL_BIT_FIELD (node))
36618334Speter	fputs (" bit-field", file);
36790285Sobrien      if (TREE_CODE (node) == FIELD_DECL && DECL_NONADDRESSABLE_P (node))
36890285Sobrien	fputs (" nonaddressable", file);
36990285Sobrien
37090285Sobrien      if (TREE_CODE (node) == LABEL_DECL && DECL_ERROR_ISSUED (node))
37190285Sobrien	fputs (" error-issued", file);
37290285Sobrien
37318334Speter      if (TREE_CODE (node) == VAR_DECL && DECL_IN_TEXT_SECTION (node))
37418334Speter	fputs (" in-text-section", file);
375169699Skan      if (TREE_CODE (node) == VAR_DECL && DECL_COMMON (node))
376169699Skan	fputs (" common", file);
377169699Skan      if (TREE_CODE (node) == VAR_DECL && DECL_THREAD_LOCAL_P (node))
378169699Skan	{
379169699Skan	  enum tls_model kind = DECL_TLS_MODEL (node);
380169699Skan	  switch (kind)
381169699Skan	    {
382169699Skan	      case TLS_MODEL_GLOBAL_DYNAMIC:
383169699Skan		fputs (" tls-global-dynamic", file);
384169699Skan		break;
385169699Skan	      case TLS_MODEL_LOCAL_DYNAMIC:
386169699Skan		fputs (" tls-local-dynamic", file);
387169699Skan		break;
388169699Skan	      case TLS_MODEL_INITIAL_EXEC:
389169699Skan		fputs (" tls-initial-exec", file);
390169699Skan		break;
391169699Skan	      case TLS_MODEL_LOCAL_EXEC:
392169699Skan		fputs (" tls-local-exec", file);
393169699Skan		break;
394169699Skan	      default:
395169699Skan		gcc_unreachable ();
396169699Skan	    }
397169699Skan	}
39818334Speter
399169699Skan      if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
400169699Skan	{
401169699Skan	  if (DECL_VIRTUAL_P (node))
402169699Skan	    fputs (" virtual", file);
403169699Skan	  if (DECL_PRESERVE_P (node))
404169699Skan	    fputs (" preserve", file);
405169699Skan	  if (DECL_LANG_FLAG_0 (node))
406169699Skan	    fputs (" decl_0", file);
407169699Skan	  if (DECL_LANG_FLAG_1 (node))
408169699Skan	    fputs (" decl_1", file);
409169699Skan	  if (DECL_LANG_FLAG_2 (node))
410169699Skan	    fputs (" decl_2", file);
411169699Skan	  if (DECL_LANG_FLAG_3 (node))
412169699Skan	    fputs (" decl_3", file);
413169699Skan	  if (DECL_LANG_FLAG_4 (node))
414169699Skan	    fputs (" decl_4", file);
415169699Skan	  if (DECL_LANG_FLAG_5 (node))
416169699Skan	    fputs (" decl_5", file);
417169699Skan	  if (DECL_LANG_FLAG_6 (node))
418169699Skan	    fputs (" decl_6", file);
419169699Skan	  if (DECL_LANG_FLAG_7 (node))
420169699Skan	    fputs (" decl_7", file);
421169699Skan
422169699Skan	  mode = DECL_MODE (node);
423169699Skan	  fprintf (file, " %s", GET_MODE_NAME (mode));
424169699Skan	}
42590285Sobrien
426169699Skan      if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)  && DECL_DEFER_OUTPUT (node))
42718334Speter	fputs (" defer-output", file);
42818334Speter
42918334Speter
430169699Skan      xloc = expand_location (DECL_SOURCE_LOCATION (node));
431169699Skan      fprintf (file, " file %s line %d", xloc.file, xloc.line);
43218334Speter
433169699Skan      if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
434169699Skan	{
435169699Skan	  print_node (file, "size", DECL_SIZE (node), indent + 4);
436169699Skan	  print_node (file, "unit size", DECL_SIZE_UNIT (node), indent + 4);
437169699Skan
438169699Skan	  if (TREE_CODE (node) != FUNCTION_DECL
439169699Skan	      || DECL_INLINE (node) || DECL_BUILT_IN (node))
440169699Skan	    indent_to (file, indent + 3);
441169699Skan
442169699Skan	  if (TREE_CODE (node) != FUNCTION_DECL)
443169699Skan	    {
444169699Skan	      if (DECL_USER_ALIGN (node))
445169699Skan		fprintf (file, " user");
446169699Skan
447169699Skan	      fprintf (file, " align %d", DECL_ALIGN (node));
448169699Skan	      if (TREE_CODE (node) == FIELD_DECL)
449169699Skan		fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED,
450169699Skan			 DECL_OFFSET_ALIGN (node));
451169699Skan	    }
452169699Skan	  else if (DECL_BUILT_IN (node))
453169699Skan	    {
454169699Skan	      if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD)
455169699Skan		fprintf (file, " built-in BUILT_IN_MD %d", DECL_FUNCTION_CODE (node));
456169699Skan	      else
457169699Skan		fprintf (file, " built-in %s:%s",
458169699Skan			 built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)],
459169699Skan			 built_in_names[(int) DECL_FUNCTION_CODE (node)]);
460169699Skan	    }
461169699Skan
462169699Skan	  if (DECL_POINTER_ALIAS_SET_KNOWN_P (node))
463169699Skan	    fprintf (file, " alias set " HOST_WIDE_INT_PRINT_DEC,
464169699Skan		     DECL_POINTER_ALIAS_SET (node));
46590285Sobrien	}
46618334Speter      if (TREE_CODE (node) == FIELD_DECL)
46790285Sobrien	{
46890285Sobrien	  print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4);
46990285Sobrien	  print_node (file, "bit offset", DECL_FIELD_BIT_OFFSET (node),
47090285Sobrien		      indent + 4);
471169699Skan	  if (DECL_BIT_FIELD_TYPE (node))
472169699Skan	    print_node (file, "bit_field_type", DECL_BIT_FIELD_TYPE (node),
473169699Skan			indent + 4);
47490285Sobrien	}
47590285Sobrien
47618334Speter      print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4);
47718334Speter
478169699Skan      if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
479169699Skan	{
480169699Skan	  print_node_brief (file, "attributes",
481169699Skan			    DECL_ATTRIBUTES (node), indent + 4);
482169699Skan	  print_node_brief (file, "initial", DECL_INITIAL (node), indent + 4);
483169699Skan	}
484169699Skan      if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
485169699Skan	{
486169699Skan	  print_node_brief (file, "abstract_origin",
487169699Skan			    DECL_ABSTRACT_ORIGIN (node), indent + 4);
488169699Skan	}
489169699Skan      if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
490169699Skan	{
491169699Skan	  print_node (file, "arguments", DECL_ARGUMENT_FLD (node), indent + 4);
492169699Skan	  print_node (file, "result", DECL_RESULT_FLD (node), indent + 4);
493169699Skan	}
49418334Speter
495169699Skan      lang_hooks.print_decl (file, node, indent);
49618334Speter
49790285Sobrien      if (DECL_RTL_SET_P (node))
49818334Speter	{
49918334Speter	  indent_to (file, indent + 4);
50018334Speter	  print_rtl (file, DECL_RTL (node));
50118334Speter	}
50218334Speter
50390285Sobrien      if (TREE_CODE (node) == PARM_DECL)
50418334Speter	{
50590285Sobrien	  print_node (file, "arg-type", DECL_ARG_TYPE (node), indent + 4);
50690285Sobrien
50790285Sobrien	  if (DECL_INCOMING_RTL (node) != 0)
50818334Speter	    {
50990285Sobrien	      indent_to (file, indent + 4);
51018334Speter	      fprintf (file, "incoming-rtl ");
51118334Speter	      print_rtl (file, DECL_INCOMING_RTL (node));
51218334Speter	    }
51318334Speter	}
51490285Sobrien      else if (TREE_CODE (node) == FUNCTION_DECL
515169699Skan	       && DECL_STRUCT_FUNCTION (node) != 0)
51690285Sobrien	{
51790285Sobrien	  indent_to (file, indent + 4);
518169699Skan	  dump_addr (file, "saved-insns ", DECL_STRUCT_FUNCTION (node));
51990285Sobrien	}
52018334Speter
521169699Skan      if ((TREE_CODE (node) == VAR_DECL || TREE_CODE (node) == PARM_DECL)
522169699Skan	  && DECL_HAS_VALUE_EXPR_P (node))
523169699Skan	print_node (file, "value-expr", DECL_VALUE_EXPR (node), indent + 4);
524169699Skan
525169699Skan      if (TREE_CODE (node) == STRUCT_FIELD_TAG)
526169699Skan	{
527169699Skan	  fprintf (file, " sft size " HOST_WIDE_INT_PRINT_DEC,
528169699Skan		   SFT_SIZE (node));
529169699Skan	  fprintf (file, " sft offset " HOST_WIDE_INT_PRINT_DEC,
530169699Skan		   SFT_OFFSET (node));
531169699Skan	  print_node_brief (file, "parent var", SFT_PARENT_VAR (node),
532169699Skan			    indent + 4);
533169699Skan	}
53418334Speter      /* Print the decl chain only if decl is at second level.  */
53518334Speter      if (indent == 4)
53618334Speter	print_node (file, "chain", TREE_CHAIN (node), indent + 4);
53718334Speter      else
53818334Speter	print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
53918334Speter      break;
54018334Speter
541169699Skan    case tcc_type:
542169699Skan      if (TYPE_UNSIGNED (node))
543169699Skan	fputs (" unsigned", file);
544169699Skan
54590285Sobrien      /* The no-force-blk flag is used for different things in
54690285Sobrien	 different types.  */
54790285Sobrien      if ((TREE_CODE (node) == RECORD_TYPE
54890285Sobrien	   || TREE_CODE (node) == UNION_TYPE
54990285Sobrien	   || TREE_CODE (node) == QUAL_UNION_TYPE)
55090285Sobrien	  && TYPE_NO_FORCE_BLK (node))
55118334Speter	fputs (" no-force-blk", file);
55290285Sobrien      else if (TREE_CODE (node) == INTEGER_TYPE
55390285Sobrien	       && TYPE_IS_SIZETYPE (node))
55490285Sobrien	fputs (" sizetype", file);
55590285Sobrien      else if (TREE_CODE (node) == FUNCTION_TYPE
55690285Sobrien	       && TYPE_RETURNS_STACK_DEPRESSED (node))
55790285Sobrien	fputs (" returns-stack-depressed", file);
55890285Sobrien
55918334Speter      if (TYPE_STRING_FLAG (node))
56018334Speter	fputs (" string-flag", file);
56118334Speter      if (TYPE_NEEDS_CONSTRUCTING (node))
56218334Speter	fputs (" needs-constructing", file);
56390285Sobrien
56490285Sobrien      /* The transparent-union flag is used for different things in
56590285Sobrien	 different nodes.  */
56690285Sobrien      if (TREE_CODE (node) == UNION_TYPE && TYPE_TRANSPARENT_UNION (node))
56718334Speter	fputs (" transparent-union", file);
56890285Sobrien      else if (TREE_CODE (node) == ARRAY_TYPE
56990285Sobrien	       && TYPE_NONALIASED_COMPONENT (node))
57090285Sobrien	fputs (" nonaliased-component", file);
57190285Sobrien
57218334Speter      if (TYPE_PACKED (node))
57318334Speter	fputs (" packed", file);
57418334Speter
575117404Skan      if (TYPE_RESTRICT (node))
576117404Skan	fputs (" restrict", file);
577117404Skan
57818334Speter      if (TYPE_LANG_FLAG_0 (node))
57918334Speter	fputs (" type_0", file);
58018334Speter      if (TYPE_LANG_FLAG_1 (node))
58118334Speter	fputs (" type_1", file);
58218334Speter      if (TYPE_LANG_FLAG_2 (node))
58318334Speter	fputs (" type_2", file);
58418334Speter      if (TYPE_LANG_FLAG_3 (node))
58518334Speter	fputs (" type_3", file);
58618334Speter      if (TYPE_LANG_FLAG_4 (node))
58718334Speter	fputs (" type_4", file);
58818334Speter      if (TYPE_LANG_FLAG_5 (node))
58918334Speter	fputs (" type_5", file);
59018334Speter      if (TYPE_LANG_FLAG_6 (node))
59118334Speter	fputs (" type_6", file);
59218334Speter
59318334Speter      mode = TYPE_MODE (node);
59490285Sobrien      fprintf (file, " %s", GET_MODE_NAME (mode));
59518334Speter
59618334Speter      print_node (file, "size", TYPE_SIZE (node), indent + 4);
59790285Sobrien      print_node (file, "unit size", TYPE_SIZE_UNIT (node), indent + 4);
59818334Speter      indent_to (file, indent + 3);
59918334Speter
60090285Sobrien      if (TYPE_USER_ALIGN (node))
60190285Sobrien	fprintf (file, " user");
60290285Sobrien
603132727Skan      fprintf (file, " align %d symtab %d alias set " HOST_WIDE_INT_PRINT_DEC,
604132727Skan	       TYPE_ALIGN (node), TYPE_SYMTAB_ADDRESS (node),
605132727Skan	       TYPE_ALIAS_SET (node));
60618334Speter
60718334Speter      print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4);
60818334Speter
60990285Sobrien      if (INTEGRAL_TYPE_P (node) || TREE_CODE (node) == REAL_TYPE)
61018334Speter	{
61118334Speter	  fprintf (file, " precision %d", TYPE_PRECISION (node));
61290285Sobrien	  print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4);
61390285Sobrien	  print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4);
61418334Speter	}
61590285Sobrien
61690285Sobrien      if (TREE_CODE (node) == ENUMERAL_TYPE)
61790285Sobrien	print_node (file, "values", TYPE_VALUES (node), indent + 4);
618169699Skan      else if (TREE_CODE (node) == ARRAY_TYPE)
61990285Sobrien	print_node (file, "domain", TYPE_DOMAIN (node), indent + 4);
620169699Skan      else if (TREE_CODE (node) == VECTOR_TYPE)
621169699Skan	fprintf (file, " nunits %d", (int) TYPE_VECTOR_SUBPARTS (node));
62218334Speter      else if (TREE_CODE (node) == RECORD_TYPE
62318334Speter	       || TREE_CODE (node) == UNION_TYPE
62418334Speter	       || TREE_CODE (node) == QUAL_UNION_TYPE)
62518334Speter	print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
62690285Sobrien      else if (TREE_CODE (node) == FUNCTION_TYPE
62790285Sobrien	       || TREE_CODE (node) == METHOD_TYPE)
62818334Speter	{
62918334Speter	  if (TYPE_METHOD_BASETYPE (node))
63090285Sobrien	    print_node_brief (file, "method basetype",
63190285Sobrien			      TYPE_METHOD_BASETYPE (node), indent + 4);
63218334Speter	  print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
63318334Speter	}
63490285Sobrien      else if (TREE_CODE (node) == OFFSET_TYPE)
63590285Sobrien	print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node),
63690285Sobrien			  indent + 4);
63790285Sobrien
63818334Speter      if (TYPE_CONTEXT (node))
63918334Speter	print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);
64018334Speter
641169699Skan      lang_hooks.print_type (file, node, indent);
64218334Speter
64318334Speter      if (TYPE_POINTER_TO (node) || TREE_CHAIN (node))
64418334Speter	indent_to (file, indent + 3);
64590285Sobrien
64690285Sobrien      print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node),
64790285Sobrien			indent + 4);
64890285Sobrien      print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node),
64990285Sobrien			indent + 4);
65018334Speter      print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
65118334Speter      break;
65218334Speter
653169699Skan    case tcc_expression:
654169699Skan    case tcc_comparison:
655169699Skan    case tcc_unary:
656169699Skan    case tcc_binary:
657169699Skan    case tcc_reference:
658169699Skan    case tcc_statement:
659169699Skan      if (TREE_CODE (node) == BIT_FIELD_REF && BIT_FIELD_REF_UNSIGNED (node))
660169699Skan	fputs (" unsigned", file);
66150617Sobrien      if (TREE_CODE (node) == BIND_EXPR)
66218334Speter	{
66318334Speter	  print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
66418334Speter	  print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
66518334Speter	  print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
66652521Sobrien	  break;
66718334Speter	}
66818334Speter
66990285Sobrien      len = TREE_CODE_LENGTH (TREE_CODE (node));
67090285Sobrien
67118334Speter      for (i = 0; i < len; i++)
67218334Speter	{
673169699Skan	  char temp[10];
67418334Speter
675169699Skan	  sprintf (temp, "arg %d", i);
676169699Skan	  print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
67718334Speter	}
67850617Sobrien
67990285Sobrien      print_node (file, "chain", TREE_CHAIN (node), indent + 4);
68018334Speter      break;
68118334Speter
682169699Skan    case tcc_constant:
683169699Skan    case tcc_exceptional:
68418334Speter      switch (TREE_CODE (node))
68518334Speter	{
68618334Speter	case INTEGER_CST:
68718334Speter	  if (TREE_CONSTANT_OVERFLOW (node))
68818334Speter	    fprintf (file, " overflow");
68918334Speter
69050617Sobrien	  fprintf (file, " ");
69118334Speter	  if (TREE_INT_CST_HIGH (node) == 0)
69250617Sobrien	    fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
69318334Speter		     TREE_INT_CST_LOW (node));
69418334Speter	  else if (TREE_INT_CST_HIGH (node) == -1
69518334Speter		   && TREE_INT_CST_LOW (node) != 0)
696132727Skan	    fprintf (file, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
697132727Skan		     -TREE_INT_CST_LOW (node));
69818334Speter	  else
69950617Sobrien	    fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
70018334Speter		     TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
70118334Speter	  break;
70218334Speter
70318334Speter	case REAL_CST:
70418334Speter	  {
70518334Speter	    REAL_VALUE_TYPE d;
70618334Speter
70718334Speter	    if (TREE_OVERFLOW (node))
70818334Speter	      fprintf (file, " overflow");
70918334Speter
71018334Speter	    d = TREE_REAL_CST (node);
71118334Speter	    if (REAL_VALUE_ISINF (d))
712169699Skan	      fprintf (file,  REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
71318334Speter	    else if (REAL_VALUE_ISNAN (d))
71418334Speter	      fprintf (file, " Nan");
71518334Speter	    else
71618334Speter	      {
717117404Skan		char string[64];
718117404Skan		real_to_decimal (string, &d, sizeof (string), 0, 1);
71918334Speter		fprintf (file, " %s", string);
72018334Speter	      }
72118334Speter	  }
72218334Speter	  break;
72318334Speter
72496287Sobrien	case VECTOR_CST:
72596287Sobrien	  {
72696287Sobrien	    tree vals = TREE_VECTOR_CST_ELTS (node);
72796287Sobrien	    char buf[10];
72896287Sobrien	    tree link;
72996287Sobrien	    int i;
73096287Sobrien
73196287Sobrien	    i = 0;
73296287Sobrien	    for (link = vals; link; link = TREE_CHAIN (link), ++i)
73396287Sobrien	      {
73496287Sobrien		sprintf (buf, "elt%d: ", i);
73596287Sobrien		print_node (file, buf, TREE_VALUE (link), indent + 4);
73696287Sobrien	      }
73796287Sobrien	  }
73896287Sobrien	  break;
73996287Sobrien
74018334Speter	case COMPLEX_CST:
74118334Speter	  print_node (file, "real", TREE_REALPART (node), indent + 4);
74218334Speter	  print_node (file, "imag", TREE_IMAGPART (node), indent + 4);
74318334Speter	  break;
74418334Speter
74518334Speter	case STRING_CST:
746117404Skan	  {
747117404Skan	    const char *p = TREE_STRING_POINTER (node);
748117404Skan	    int i = TREE_STRING_LENGTH (node);
749117404Skan	    fputs (" \"", file);
750117404Skan	    while (--i >= 0)
751117404Skan	      {
752117404Skan		char ch = *p++;
753117404Skan		if (ch >= ' ' && ch < 127)
754117404Skan		  putc (ch, file);
755117404Skan		else
756117404Skan		  fprintf(file, "\\%03o", ch & 0xFF);
757117404Skan	      }
758117404Skan	    fputc ('\"', file);
759117404Skan	  }
76018334Speter	  /* Print the chain at second level.  */
76118334Speter	  if (indent == 4)
76218334Speter	    print_node (file, "chain", TREE_CHAIN (node), indent + 4);
76318334Speter	  else
76418334Speter	    print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
76518334Speter	  break;
76618334Speter
76718334Speter	case IDENTIFIER_NODE:
768169699Skan	  lang_hooks.print_identifier (file, node, indent);
76918334Speter	  break;
77018334Speter
77118334Speter	case TREE_LIST:
77218334Speter	  print_node (file, "purpose", TREE_PURPOSE (node), indent + 4);
77318334Speter	  print_node (file, "value", TREE_VALUE (node), indent + 4);
77418334Speter	  print_node (file, "chain", TREE_CHAIN (node), indent + 4);
77518334Speter	  break;
77618334Speter
77718334Speter	case TREE_VEC:
77818334Speter	  len = TREE_VEC_LENGTH (node);
77918334Speter	  for (i = 0; i < len; i++)
78018334Speter	    if (TREE_VEC_ELT (node, i))
78118334Speter	      {
78218334Speter		char temp[10];
78318334Speter		sprintf (temp, "elt %d", i);
78418334Speter		indent_to (file, indent + 4);
78518334Speter		print_node_brief (file, temp, TREE_VEC_ELT (node, i), 0);
78618334Speter	      }
78718334Speter	  break;
78818334Speter
789169699Skan    	case STATEMENT_LIST:
790169699Skan	  dump_addr (file, " head ", node->stmt_list.head);
791169699Skan	  dump_addr (file, " tail ", node->stmt_list.tail);
792169699Skan	  fprintf (file, " stmts");
793169699Skan	  {
794169699Skan	    tree_stmt_iterator i;
795169699Skan	    for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i))
796169699Skan	      {
797169699Skan		/* Not printing the addresses of the (not-a-tree)
798169699Skan		   'struct tree_stmt_list_node's.  */
799169699Skan		dump_addr (file, " ", tsi_stmt (i));
800169699Skan	      }
801169699Skan	    fprintf (file, "\n");
802169699Skan	    for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i))
803169699Skan	      {
804169699Skan		/* Not printing the addresses of the (not-a-tree)
805169699Skan		   'struct tree_stmt_list_node's.  */
806169699Skan		print_node (file, "stmt", tsi_stmt (i), indent + 4);
807169699Skan	      }
808169699Skan	  }
809169699Skan	  print_node (file, "chain", TREE_CHAIN (node), indent + 4);
810169699Skan	  break;
811169699Skan
812169699Skan	case BLOCK:
813169699Skan	  print_node (file, "vars", BLOCK_VARS (node), indent + 4);
814169699Skan	  print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node),
815169699Skan		      indent + 4);
816169699Skan	  print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
817169699Skan	  print_node (file, "chain", BLOCK_CHAIN (node), indent + 4);
818169699Skan	  print_node (file, "abstract_origin",
819169699Skan		      BLOCK_ABSTRACT_ORIGIN (node), indent + 4);
820169699Skan	  break;
821169699Skan
822169699Skan	case SSA_NAME:
823169699Skan	  print_node_brief (file, "var", SSA_NAME_VAR (node), indent + 4);
824169699Skan	  print_node_brief (file, "def_stmt",
825169699Skan			    SSA_NAME_DEF_STMT (node), indent + 4);
826169699Skan
827169699Skan	  indent_to (file, indent + 4);
828169699Skan	  fprintf (file, "version %u", SSA_NAME_VERSION (node));
829169699Skan	  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
830169699Skan	    fprintf (file, " in-abnormal-phi");
831169699Skan	  if (SSA_NAME_IN_FREE_LIST (node))
832169699Skan	    fprintf (file, " in-free-list");
833169699Skan
834169699Skan	  if (SSA_NAME_PTR_INFO (node)
835169699Skan	      || SSA_NAME_VALUE (node))
836169699Skan	    {
837169699Skan	      indent_to (file, indent + 3);
838169699Skan	      if (SSA_NAME_PTR_INFO (node))
839169699Skan		dump_addr (file, " ptr-info ", SSA_NAME_PTR_INFO (node));
840169699Skan	      if (SSA_NAME_VALUE (node))
841169699Skan		dump_addr (file, " value ", SSA_NAME_VALUE (node));
842169699Skan	    }
843169699Skan	  break;
844169699Skan
845169699Skan	case OMP_CLAUSE:
846169699Skan	    {
847169699Skan	      int i;
848169699Skan	      fprintf (file, " %s",
849169699Skan		       omp_clause_code_name[OMP_CLAUSE_CODE (node)]);
850169699Skan	      for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (node)]; i++)
851169699Skan		{
852169699Skan		  indent_to (file, indent + 4);
853169699Skan		  fprintf (file, "op %d:", i);
854169699Skan		  print_node_brief (file, "", OMP_CLAUSE_OPERAND (node, i), 0);
855169699Skan		}
856169699Skan	    }
857169699Skan	  break;
858169699Skan
85950617Sobrien	default:
860169699Skan	  if (EXCEPTIONAL_CLASS_P (node))
861169699Skan	    lang_hooks.print_xnode (file, node, indent);
86250617Sobrien	  break;
86318334Speter	}
86418334Speter
86518334Speter      break;
86618334Speter    }
86718334Speter
868169699Skan  if (EXPR_HAS_LOCATION (node))
869169699Skan    {
870169699Skan      expanded_location xloc = expand_location (EXPR_LOCATION (node));
871169699Skan      indent_to (file, indent+4);
872169699Skan      fprintf (file, "%s:%d", xloc.file, xloc.line);
873169699Skan    }
874169699Skan
87518334Speter  fprintf (file, ">");
87618334Speter}
877