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