xref: /netbsd/external/gpl3/gcc/dist/gcc/print-tree.c (revision dd083157)
1c3d31fe1Smrg /* Prints out tree in human readable form - GCC
2*dd083157Smrg    Copyright (C) 1990-2020 Free Software Foundation, Inc.
3c3d31fe1Smrg 
4c3d31fe1Smrg This file is part of GCC.
5c3d31fe1Smrg 
6c3d31fe1Smrg GCC is free software; you can redistribute it and/or modify it under
7c3d31fe1Smrg the terms of the GNU General Public License as published by the Free
8c3d31fe1Smrg Software Foundation; either version 3, or (at your option) any later
9c3d31fe1Smrg version.
10c3d31fe1Smrg 
11c3d31fe1Smrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12c3d31fe1Smrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
13c3d31fe1Smrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14c3d31fe1Smrg for more details.
15c3d31fe1Smrg 
16c3d31fe1Smrg You should have received a copy of the GNU General Public License
17c3d31fe1Smrg along with GCC; see the file COPYING3.  If not see
18c3d31fe1Smrg <http://www.gnu.org/licenses/>.  */
19c3d31fe1Smrg 
20c3d31fe1Smrg 
21c3d31fe1Smrg #include "config.h"
22c3d31fe1Smrg #include "system.h"
23c3d31fe1Smrg #include "coretypes.h"
24c3d31fe1Smrg #include "tm.h"
25c3d31fe1Smrg #include "tree.h"
2663aace61Smrg #include "cgraph.h"
2763aace61Smrg #include "diagnostic.h"
285ef59e75Smrg #include "varasm.h"
295ef59e75Smrg #include "print-rtl.h"
305ef59e75Smrg #include "stor-layout.h"
31c3d31fe1Smrg #include "langhooks.h"
32c3d31fe1Smrg #include "tree-iterator.h"
33af526226Smrg #include "gimple-pretty-print.h" /* FIXME */
345ef59e75Smrg #include "tree-cfg.h"
353903d7f3Smrg #include "dumpfile.h"
366a5c9aabSmrg #include "print-tree.h"
37c3d31fe1Smrg 
38c3d31fe1Smrg /* Define the hash table of nodes already seen.
39c3d31fe1Smrg    Such nodes are not repeated; brief cross-references are used.  */
40c3d31fe1Smrg 
41c3d31fe1Smrg #define HASH_SIZE 37
42c3d31fe1Smrg 
436a5c9aabSmrg static hash_set<tree> *table = NULL;
44c3d31fe1Smrg 
45c3d31fe1Smrg /* Print PREFIX and ADDR to FILE.  */
46c3d31fe1Smrg void
dump_addr(FILE * file,const char * prefix,const void * addr)47c3d31fe1Smrg dump_addr (FILE *file, const char *prefix, const void *addr)
48c3d31fe1Smrg {
49c3d31fe1Smrg   if (flag_dump_noaddr || flag_dump_unnumbered)
50c3d31fe1Smrg     fprintf (file, "%s#", prefix);
51c3d31fe1Smrg   else
52c3d31fe1Smrg     fprintf (file, "%s" HOST_PTR_PRINTF, prefix, addr);
53c3d31fe1Smrg }
54c3d31fe1Smrg 
5581418a27Smrg /* Print to FILE a NODE representing a REAL_CST constant, including
5681418a27Smrg    Infinity and NaN.  Be verbose when BFRIEF is false.  */
5781418a27Smrg 
5881418a27Smrg static void
print_real_cst(FILE * file,const_tree node,bool brief)5981418a27Smrg print_real_cst (FILE *file, const_tree node, bool brief)
6081418a27Smrg {
6181418a27Smrg   if (TREE_OVERFLOW (node))
6281418a27Smrg     fprintf (file, " overflow");
6381418a27Smrg 
6481418a27Smrg   REAL_VALUE_TYPE d = TREE_REAL_CST (node);
6581418a27Smrg   if (REAL_VALUE_ISINF (d))
6681418a27Smrg     fprintf (file,  REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
6781418a27Smrg   else if (REAL_VALUE_ISNAN (d))
6881418a27Smrg     {
6981418a27Smrg       /* Print a NaN in the format [-][Q]NaN[(significand[exponent])]
7081418a27Smrg 	 where significand is a hexadecimal string that starts with
7181418a27Smrg 	 the 0x prefix followed by 0 if the number is not canonical
7281418a27Smrg 	 and a non-zero digit if it is, and exponent is decimal.  */
7381418a27Smrg       unsigned start = 0;
7481418a27Smrg       const char *psig = (const char *) d.sig;
7581418a27Smrg       for (unsigned i = 0; i != sizeof d.sig; ++i)
7681418a27Smrg 	if (psig[i])
7781418a27Smrg 	  {
7881418a27Smrg 	    start = i;
7981418a27Smrg 	    break;
8081418a27Smrg 	  }
8181418a27Smrg 
8281418a27Smrg       fprintf (file, " %s%sNaN", d.sign ? "-" : "",
8381418a27Smrg 	       d.signalling ? "S" : "Q");
8481418a27Smrg 
8581418a27Smrg       if (brief)
8681418a27Smrg 	return;
8781418a27Smrg 
8881418a27Smrg       if (start)
8981418a27Smrg 	fprintf (file, "(0x%s", d.canonical ? "" : "0");
9081418a27Smrg       else if (d.uexp)
9181418a27Smrg 	fprintf (file, "(%s", d.canonical ? "" : "0");
9281418a27Smrg       else if (!d.canonical)
9381418a27Smrg 	{
9481418a27Smrg 	  fprintf (file, "(0)");
9581418a27Smrg 	  return;
9681418a27Smrg 	}
9781418a27Smrg 
9881418a27Smrg       if (psig[start])
9981418a27Smrg 	{
10081418a27Smrg 	  for (unsigned i = start; i != sizeof d.sig; ++i)
10181418a27Smrg 	    if (i == start)
10281418a27Smrg 	      fprintf (file, "%x", psig[i]);
10381418a27Smrg 	    else
10481418a27Smrg 	      fprintf (file, "%02x", psig[i]);
10581418a27Smrg 	}
10681418a27Smrg 
10781418a27Smrg       if (d.uexp)
10881418a27Smrg 	fprintf (file, "%se%u)", psig[start] ? "," : "", d.uexp);
10981418a27Smrg       else if (psig[start])
11081418a27Smrg 	fputc (')', file);
11181418a27Smrg     }
11281418a27Smrg   else
11381418a27Smrg     {
11481418a27Smrg       char string[64];
11581418a27Smrg       real_to_decimal (string, &d, sizeof (string), 0, 1);
11681418a27Smrg       fprintf (file, " %s", string);
11781418a27Smrg     }
11881418a27Smrg }
11981418a27Smrg 
120c3d31fe1Smrg /* Print a node in brief fashion, with just the code, address and name.  */
121c3d31fe1Smrg 
122c3d31fe1Smrg void
print_node_brief(FILE * file,const char * prefix,const_tree node,int indent)123c3d31fe1Smrg print_node_brief (FILE *file, const char *prefix, const_tree node, int indent)
124c3d31fe1Smrg {
125c3d31fe1Smrg   enum tree_code_class tclass;
126c3d31fe1Smrg 
127c3d31fe1Smrg   if (node == 0)
128c3d31fe1Smrg     return;
129c3d31fe1Smrg 
130c3d31fe1Smrg   tclass = TREE_CODE_CLASS (TREE_CODE (node));
131c3d31fe1Smrg 
132c3d31fe1Smrg   /* Always print the slot this node is in, and its code, address and
133c3d31fe1Smrg      name if any.  */
134c3d31fe1Smrg   if (indent > 0)
135c3d31fe1Smrg     fprintf (file, " ");
1365ef59e75Smrg   fprintf (file, "%s <%s", prefix, get_tree_code_name (TREE_CODE (node)));
137c3d31fe1Smrg   dump_addr (file, " ", node);
138c3d31fe1Smrg 
139c3d31fe1Smrg   if (tclass == tcc_declaration)
140c3d31fe1Smrg     {
141c3d31fe1Smrg       if (DECL_NAME (node))
142c3d31fe1Smrg 	fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
143c3d31fe1Smrg       else if (TREE_CODE (node) == LABEL_DECL
144c3d31fe1Smrg 	       && LABEL_DECL_UID (node) != -1)
145c3d31fe1Smrg 	{
146c3d31fe1Smrg 	  if (dump_flags & TDF_NOUID)
147c3d31fe1Smrg 	    fprintf (file, " L.xxxx");
148c3d31fe1Smrg 	  else
149c3d31fe1Smrg 	    fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
150c3d31fe1Smrg 	}
151c3d31fe1Smrg       else
152c3d31fe1Smrg 	{
153c3d31fe1Smrg 	  if (dump_flags & TDF_NOUID)
154c3d31fe1Smrg 	    fprintf (file, " %c.xxxx",
155c3d31fe1Smrg 		     TREE_CODE (node) == CONST_DECL ? 'C' : 'D');
156c3d31fe1Smrg 	  else
157c3d31fe1Smrg 	    fprintf (file, " %c.%u",
158c3d31fe1Smrg 		     TREE_CODE (node) == CONST_DECL ? 'C' : 'D',
159c3d31fe1Smrg 		     DECL_UID (node));
160c3d31fe1Smrg 	}
161c3d31fe1Smrg     }
162c3d31fe1Smrg   else if (tclass == tcc_type)
163c3d31fe1Smrg     {
164c3d31fe1Smrg       if (TYPE_NAME (node))
165c3d31fe1Smrg 	{
166c3d31fe1Smrg 	  if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
167c3d31fe1Smrg 	    fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
168c3d31fe1Smrg 	  else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
169c3d31fe1Smrg 		   && DECL_NAME (TYPE_NAME (node)))
170c3d31fe1Smrg 	    fprintf (file, " %s",
171c3d31fe1Smrg 		     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
172c3d31fe1Smrg 	}
173c3d31fe1Smrg       if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
174c3d31fe1Smrg 	fprintf (file, " address-space-%d", TYPE_ADDR_SPACE (node));
175c3d31fe1Smrg     }
176c3d31fe1Smrg   if (TREE_CODE (node) == IDENTIFIER_NODE)
177c3d31fe1Smrg     fprintf (file, " %s", IDENTIFIER_POINTER (node));
178c3d31fe1Smrg 
179c3d31fe1Smrg   /* We might as well always print the value of an integer or real.  */
180c3d31fe1Smrg   if (TREE_CODE (node) == INTEGER_CST)
181c3d31fe1Smrg     {
182c3d31fe1Smrg       if (TREE_OVERFLOW (node))
183c3d31fe1Smrg 	fprintf (file, " overflow");
184c3d31fe1Smrg 
185c3d31fe1Smrg       fprintf (file, " ");
1863903d7f3Smrg       print_dec (wi::to_wide (node), file, TYPE_SIGN (TREE_TYPE (node)));
187c3d31fe1Smrg     }
188c3d31fe1Smrg   if (TREE_CODE (node) == REAL_CST)
18981418a27Smrg     print_real_cst (file, node, true);
190c3d31fe1Smrg   if (TREE_CODE (node) == FIXED_CST)
191c3d31fe1Smrg     {
192c3d31fe1Smrg       FIXED_VALUE_TYPE f;
193c3d31fe1Smrg       char string[60];
194c3d31fe1Smrg 
195c3d31fe1Smrg       if (TREE_OVERFLOW (node))
196c3d31fe1Smrg 	fprintf (file, " overflow");
197c3d31fe1Smrg 
198c3d31fe1Smrg       f = TREE_FIXED_CST (node);
199c3d31fe1Smrg       fixed_to_decimal (string, &f, sizeof (string));
200c3d31fe1Smrg       fprintf (file, " %s", string);
201c3d31fe1Smrg     }
202c3d31fe1Smrg 
203c3d31fe1Smrg   fprintf (file, ">");
204c3d31fe1Smrg }
205c3d31fe1Smrg 
206c3d31fe1Smrg void
indent_to(FILE * file,int column)207c3d31fe1Smrg indent_to (FILE *file, int column)
208c3d31fe1Smrg {
209c3d31fe1Smrg   int i;
210c3d31fe1Smrg 
211c3d31fe1Smrg   /* Since this is the long way, indent to desired column.  */
212c3d31fe1Smrg   if (column > 0)
213c3d31fe1Smrg     fprintf (file, "\n");
214c3d31fe1Smrg   for (i = 0; i < column; i++)
215c3d31fe1Smrg     fprintf (file, " ");
216c3d31fe1Smrg }
217c3d31fe1Smrg 
218c3d31fe1Smrg /* Print the node NODE in full on file FILE, preceded by PREFIX,
219c3d31fe1Smrg    starting in column INDENT.  */
220c3d31fe1Smrg 
221c3d31fe1Smrg void
print_node(FILE * file,const char * prefix,tree node,int indent,bool brief_for_visited)2226a5c9aabSmrg print_node (FILE *file, const char *prefix, tree node, int indent,
2236a5c9aabSmrg 	    bool brief_for_visited)
224c3d31fe1Smrg {
2255ef59e75Smrg   machine_mode mode;
226c3d31fe1Smrg   enum tree_code_class tclass;
227c3d31fe1Smrg   int len;
228c3d31fe1Smrg   int i;
229c3d31fe1Smrg   expanded_location xloc;
230c3d31fe1Smrg   enum tree_code code;
231c3d31fe1Smrg 
232c3d31fe1Smrg   if (node == 0)
233c3d31fe1Smrg     return;
234c3d31fe1Smrg 
235c3d31fe1Smrg   code = TREE_CODE (node);
236*dd083157Smrg 
237*dd083157Smrg   /* It is unsafe to look at any other fields of a node with ERROR_MARK or
238*dd083157Smrg      invalid code.  */
239*dd083157Smrg   if (code == ERROR_MARK || code >= MAX_TREE_CODES)
240*dd083157Smrg     {
241*dd083157Smrg       print_node_brief (file, prefix, node, indent);
242*dd083157Smrg       return;
243*dd083157Smrg     }
244*dd083157Smrg 
245c3d31fe1Smrg   tclass = TREE_CODE_CLASS (code);
246c3d31fe1Smrg 
247c3d31fe1Smrg   /* Don't get too deep in nesting.  If the user wants to see deeper,
248c3d31fe1Smrg      it is easy to use the address of a lowest-level node
249c3d31fe1Smrg      as an argument in another call to debug_tree.  */
250c3d31fe1Smrg 
251c3d31fe1Smrg   if (indent > 24)
252c3d31fe1Smrg     {
253c3d31fe1Smrg       print_node_brief (file, prefix, node, indent);
254c3d31fe1Smrg       return;
255c3d31fe1Smrg     }
256c3d31fe1Smrg 
257c3d31fe1Smrg   if (indent > 8 && (tclass == tcc_type || tclass == tcc_declaration))
258c3d31fe1Smrg     {
259c3d31fe1Smrg       print_node_brief (file, prefix, node, indent);
260c3d31fe1Smrg       return;
261c3d31fe1Smrg     }
262c3d31fe1Smrg 
263c3d31fe1Smrg   /* Allow this function to be called if the table is not there.  */
264c3d31fe1Smrg   if (table)
265c3d31fe1Smrg     {
266c3d31fe1Smrg       /* If node is in the table, just mention its address.  */
2676a5c9aabSmrg       if (table->contains (node) && brief_for_visited)
268c3d31fe1Smrg 	{
269c3d31fe1Smrg 	  print_node_brief (file, prefix, node, indent);
270c3d31fe1Smrg 	  return;
271c3d31fe1Smrg 	}
272c3d31fe1Smrg 
2736a5c9aabSmrg       table->add (node);
274c3d31fe1Smrg     }
275c3d31fe1Smrg 
276c3d31fe1Smrg   /* Indent to the specified column, since this is the long form.  */
277c3d31fe1Smrg   indent_to (file, indent);
278c3d31fe1Smrg 
279c3d31fe1Smrg   /* Print the slot this node is in, and its code, and address.  */
2805ef59e75Smrg   fprintf (file, "%s <%s", prefix, get_tree_code_name (code));
281c3d31fe1Smrg   dump_addr (file, " ", node);
282c3d31fe1Smrg 
283c3d31fe1Smrg   /* Print the name, if any.  */
284c3d31fe1Smrg   if (tclass == tcc_declaration)
285c3d31fe1Smrg     {
286c3d31fe1Smrg       if (DECL_NAME (node))
287c3d31fe1Smrg 	fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
288c3d31fe1Smrg       else if (code == LABEL_DECL
289c3d31fe1Smrg 	       && LABEL_DECL_UID (node) != -1)
290c3d31fe1Smrg 	{
291c3d31fe1Smrg 	  if (dump_flags & TDF_NOUID)
292c3d31fe1Smrg 	    fprintf (file, " L.xxxx");
293c3d31fe1Smrg 	  else
294c3d31fe1Smrg 	    fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
295c3d31fe1Smrg 	}
296c3d31fe1Smrg       else
297c3d31fe1Smrg 	{
298c3d31fe1Smrg 	  if (dump_flags & TDF_NOUID)
299c3d31fe1Smrg 	    fprintf (file, " %c.xxxx", code == CONST_DECL ? 'C' : 'D');
300c3d31fe1Smrg 	  else
301c3d31fe1Smrg 	    fprintf (file, " %c.%u", code == CONST_DECL ? 'C' : 'D',
302c3d31fe1Smrg 		     DECL_UID (node));
303c3d31fe1Smrg 	}
304c3d31fe1Smrg     }
305c3d31fe1Smrg   else if (tclass == tcc_type)
306c3d31fe1Smrg     {
307c3d31fe1Smrg       if (TYPE_NAME (node))
308c3d31fe1Smrg 	{
309c3d31fe1Smrg 	  if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
310c3d31fe1Smrg 	    fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
311c3d31fe1Smrg 	  else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
312c3d31fe1Smrg 		   && DECL_NAME (TYPE_NAME (node)))
313c3d31fe1Smrg 	    fprintf (file, " %s",
314c3d31fe1Smrg 		     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
315c3d31fe1Smrg 	}
316c3d31fe1Smrg     }
317c3d31fe1Smrg   if (code == IDENTIFIER_NODE)
318c3d31fe1Smrg     fprintf (file, " %s", IDENTIFIER_POINTER (node));
319c3d31fe1Smrg 
320c3d31fe1Smrg   if (code == INTEGER_CST)
321c3d31fe1Smrg     {
322c3d31fe1Smrg       if (indent <= 4)
323c3d31fe1Smrg 	print_node_brief (file, "type", TREE_TYPE (node), indent + 4);
324c3d31fe1Smrg     }
325af526226Smrg   else if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
326c3d31fe1Smrg     {
327c3d31fe1Smrg       print_node (file, "type", TREE_TYPE (node), indent + 4);
328c3d31fe1Smrg       if (TREE_TYPE (node))
329c3d31fe1Smrg 	indent_to (file, indent + 3);
330c3d31fe1Smrg     }
331c3d31fe1Smrg 
332c3d31fe1Smrg   if (!TYPE_P (node) && TREE_SIDE_EFFECTS (node))
333c3d31fe1Smrg     fputs (" side-effects", file);
334c3d31fe1Smrg 
335c3d31fe1Smrg   if (TYPE_P (node) ? TYPE_READONLY (node) : TREE_READONLY (node))
336c3d31fe1Smrg     fputs (" readonly", file);
3375ef59e75Smrg   if (TYPE_P (node) && TYPE_ATOMIC (node))
3385ef59e75Smrg     fputs (" atomic", file);
339c3d31fe1Smrg   if (!TYPE_P (node) && TREE_CONSTANT (node))
340c3d31fe1Smrg     fputs (" constant", file);
341c3d31fe1Smrg   else if (TYPE_P (node) && TYPE_SIZES_GIMPLIFIED (node))
342c3d31fe1Smrg     fputs (" sizes-gimplified", file);
343c3d31fe1Smrg 
344c3d31fe1Smrg   if (TYPE_P (node) && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
345c3d31fe1Smrg     fprintf (file, " address-space-%d", TYPE_ADDR_SPACE (node));
346c3d31fe1Smrg 
347c3d31fe1Smrg   if (TREE_ADDRESSABLE (node))
348c3d31fe1Smrg     fputs (" addressable", file);
349c3d31fe1Smrg   if (TREE_THIS_VOLATILE (node))
350c3d31fe1Smrg     fputs (" volatile", file);
351c3d31fe1Smrg   if (TREE_ASM_WRITTEN (node))
352c3d31fe1Smrg     fputs (" asm_written", file);
353c3d31fe1Smrg   if (TREE_USED (node))
354c3d31fe1Smrg     fputs (" used", file);
355c3d31fe1Smrg   if (TREE_NOTHROW (node))
3566a5c9aabSmrg     fputs (" nothrow", file);
357c3d31fe1Smrg   if (TREE_PUBLIC (node))
358c3d31fe1Smrg     fputs (" public", file);
359c3d31fe1Smrg   if (TREE_PRIVATE (node))
360c3d31fe1Smrg     fputs (" private", file);
361c3d31fe1Smrg   if (TREE_PROTECTED (node))
362c3d31fe1Smrg     fputs (" protected", file);
363c3d31fe1Smrg   if (TREE_STATIC (node))
3646a5c9aabSmrg     fputs (code == CALL_EXPR ? " must-tail-call" : " static", file);
365c3d31fe1Smrg   if (TREE_DEPRECATED (node))
366c3d31fe1Smrg     fputs (" deprecated", file);
367c3d31fe1Smrg   if (TREE_VISITED (node))
368c3d31fe1Smrg     fputs (" visited", file);
369af526226Smrg 
3705ef59e75Smrg   if (code != TREE_VEC && code != INTEGER_CST && code != SSA_NAME)
371af526226Smrg     {
372c3d31fe1Smrg       if (TREE_LANG_FLAG_0 (node))
373c3d31fe1Smrg 	fputs (" tree_0", file);
374c3d31fe1Smrg       if (TREE_LANG_FLAG_1 (node))
375c3d31fe1Smrg 	fputs (" tree_1", file);
376c3d31fe1Smrg       if (TREE_LANG_FLAG_2 (node))
377c3d31fe1Smrg 	fputs (" tree_2", file);
378c3d31fe1Smrg       if (TREE_LANG_FLAG_3 (node))
379c3d31fe1Smrg 	fputs (" tree_3", file);
380c3d31fe1Smrg       if (TREE_LANG_FLAG_4 (node))
381c3d31fe1Smrg 	fputs (" tree_4", file);
382c3d31fe1Smrg       if (TREE_LANG_FLAG_5 (node))
383c3d31fe1Smrg 	fputs (" tree_5", file);
384c3d31fe1Smrg       if (TREE_LANG_FLAG_6 (node))
385c3d31fe1Smrg 	fputs (" tree_6", file);
386af526226Smrg     }
387c3d31fe1Smrg 
388c3d31fe1Smrg   /* DECL_ nodes have additional attributes.  */
389c3d31fe1Smrg 
390c3d31fe1Smrg   switch (TREE_CODE_CLASS (code))
391c3d31fe1Smrg     {
392c3d31fe1Smrg     case tcc_declaration:
393c3d31fe1Smrg       if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
394c3d31fe1Smrg 	{
395c3d31fe1Smrg 	  if (DECL_UNSIGNED (node))
396c3d31fe1Smrg 	    fputs (" unsigned", file);
397c3d31fe1Smrg 	  if (DECL_IGNORED_P (node))
398c3d31fe1Smrg 	    fputs (" ignored", file);
3995ef59e75Smrg 	  if (DECL_ABSTRACT_P (node))
400c3d31fe1Smrg 	    fputs (" abstract", file);
401c3d31fe1Smrg 	  if (DECL_EXTERNAL (node))
402c3d31fe1Smrg 	    fputs (" external", file);
403c3d31fe1Smrg 	  if (DECL_NONLOCAL (node))
404c3d31fe1Smrg 	    fputs (" nonlocal", file);
405c3d31fe1Smrg 	}
406c3d31fe1Smrg       if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
407c3d31fe1Smrg 	{
408c3d31fe1Smrg 	  if (DECL_WEAK (node))
409c3d31fe1Smrg 	    fputs (" weak", file);
410c3d31fe1Smrg 	  if (DECL_IN_SYSTEM_HEADER (node))
411c3d31fe1Smrg 	    fputs (" in_system_header", file);
412c3d31fe1Smrg 	}
413c3d31fe1Smrg       if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL)
414c3d31fe1Smrg 	  && code != LABEL_DECL
415c3d31fe1Smrg 	  && code != FUNCTION_DECL
416c3d31fe1Smrg 	  && DECL_REGISTER (node))
417c3d31fe1Smrg 	fputs (" regdecl", file);
418c3d31fe1Smrg 
419c3d31fe1Smrg       if (code == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node))
420c3d31fe1Smrg 	fputs (" suppress-debug", file);
421c3d31fe1Smrg 
422c3d31fe1Smrg       if (code == FUNCTION_DECL
423c3d31fe1Smrg 	  && DECL_FUNCTION_SPECIFIC_TARGET (node))
424c3d31fe1Smrg 	fputs (" function-specific-target", file);
425c3d31fe1Smrg       if (code == FUNCTION_DECL
426c3d31fe1Smrg 	  && DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node))
427c3d31fe1Smrg 	fputs (" function-specific-opt", file);
428c3d31fe1Smrg       if (code == FUNCTION_DECL && DECL_DECLARED_INLINE_P (node))
429c3d31fe1Smrg 	fputs (" autoinline", file);
4303903d7f3Smrg       if (code == FUNCTION_DECL && DECL_UNINLINABLE (node))
4313903d7f3Smrg 	fputs (" uninlinable", file);
43281418a27Smrg       if (code == FUNCTION_DECL && fndecl_built_in_p (node))
433c3d31fe1Smrg 	fputs (" built-in", file);
434c3d31fe1Smrg       if (code == FUNCTION_DECL && DECL_STATIC_CHAIN (node))
435c3d31fe1Smrg 	fputs (" static-chain", file);
436af526226Smrg       if (TREE_CODE (node) == FUNCTION_DECL && decl_is_tm_clone (node))
437af526226Smrg 	fputs (" tm-clone", file);
438c3d31fe1Smrg 
439c3d31fe1Smrg       if (code == FIELD_DECL && DECL_PACKED (node))
440c3d31fe1Smrg 	fputs (" packed", file);
441c3d31fe1Smrg       if (code == FIELD_DECL && DECL_BIT_FIELD (node))
442c3d31fe1Smrg 	fputs (" bit-field", file);
443c3d31fe1Smrg       if (code == FIELD_DECL && DECL_NONADDRESSABLE_P (node))
444c3d31fe1Smrg 	fputs (" nonaddressable", file);
445c3d31fe1Smrg 
446c3d31fe1Smrg       if (code == LABEL_DECL && EH_LANDING_PAD_NR (node))
447c3d31fe1Smrg 	fprintf (file, " landing-pad:%d", EH_LANDING_PAD_NR (node));
448c3d31fe1Smrg 
449c3d31fe1Smrg       if (code == VAR_DECL && DECL_IN_TEXT_SECTION (node))
450c3d31fe1Smrg 	fputs (" in-text-section", file);
451af526226Smrg       if (code == VAR_DECL && DECL_IN_CONSTANT_POOL (node))
452af526226Smrg 	fputs (" in-constant-pool", file);
453c3d31fe1Smrg       if (code == VAR_DECL && DECL_COMMON (node))
454c3d31fe1Smrg 	fputs (" common", file);
4553903d7f3Smrg       if ((code == VAR_DECL || code == PARM_DECL) && DECL_READ_P (node))
4563903d7f3Smrg 	fputs (" read", file);
457c3d31fe1Smrg       if (code == VAR_DECL && DECL_THREAD_LOCAL_P (node))
458c3d31fe1Smrg 	{
4595ef59e75Smrg 	  fputs (" ", file);
4605ef59e75Smrg 	  fputs (tls_model_names[DECL_TLS_MODEL (node)], file);
461c3d31fe1Smrg 	}
462c3d31fe1Smrg 
463c3d31fe1Smrg       if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
464c3d31fe1Smrg 	{
465c3d31fe1Smrg 	  if (DECL_VIRTUAL_P (node))
466c3d31fe1Smrg 	    fputs (" virtual", file);
467c3d31fe1Smrg 	  if (DECL_PRESERVE_P (node))
468c3d31fe1Smrg 	    fputs (" preserve", file);
469c3d31fe1Smrg 	  if (DECL_LANG_FLAG_0 (node))
470c3d31fe1Smrg 	    fputs (" decl_0", file);
471c3d31fe1Smrg 	  if (DECL_LANG_FLAG_1 (node))
472c3d31fe1Smrg 	    fputs (" decl_1", file);
473c3d31fe1Smrg 	  if (DECL_LANG_FLAG_2 (node))
474c3d31fe1Smrg 	    fputs (" decl_2", file);
475c3d31fe1Smrg 	  if (DECL_LANG_FLAG_3 (node))
476c3d31fe1Smrg 	    fputs (" decl_3", file);
477c3d31fe1Smrg 	  if (DECL_LANG_FLAG_4 (node))
478c3d31fe1Smrg 	    fputs (" decl_4", file);
479c3d31fe1Smrg 	  if (DECL_LANG_FLAG_5 (node))
480c3d31fe1Smrg 	    fputs (" decl_5", file);
481c3d31fe1Smrg 	  if (DECL_LANG_FLAG_6 (node))
482c3d31fe1Smrg 	    fputs (" decl_6", file);
483c3d31fe1Smrg 	  if (DECL_LANG_FLAG_7 (node))
484c3d31fe1Smrg 	    fputs (" decl_7", file);
485c3d31fe1Smrg 
486c3d31fe1Smrg 	  mode = DECL_MODE (node);
487c3d31fe1Smrg 	  fprintf (file, " %s", GET_MODE_NAME (mode));
488c3d31fe1Smrg 	}
489c3d31fe1Smrg 
490c3d31fe1Smrg       if ((code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL)
491c3d31fe1Smrg 	  && DECL_BY_REFERENCE (node))
492c3d31fe1Smrg 	fputs (" passed-by-reference", file);
493c3d31fe1Smrg 
494c3d31fe1Smrg       if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)  && DECL_DEFER_OUTPUT (node))
495c3d31fe1Smrg 	fputs (" defer-output", file);
496c3d31fe1Smrg 
497c3d31fe1Smrg 
498c3d31fe1Smrg       xloc = expand_location (DECL_SOURCE_LOCATION (node));
4993903d7f3Smrg       fprintf (file, " %s:%d:%d", xloc.file, xloc.line,
500c3d31fe1Smrg 	       xloc.column);
501c3d31fe1Smrg 
502c3d31fe1Smrg       if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
503c3d31fe1Smrg 	{
504c3d31fe1Smrg 	  print_node (file, "size", DECL_SIZE (node), indent + 4);
5053903d7f3Smrg 	  print_node (file, "unit-size", DECL_SIZE_UNIT (node), indent + 4);
506c3d31fe1Smrg 
50781418a27Smrg 	  if (code != FUNCTION_DECL || fndecl_built_in_p (node))
508c3d31fe1Smrg 	    indent_to (file, indent + 3);
509c3d31fe1Smrg 
510c3d31fe1Smrg 	  if (DECL_USER_ALIGN (node))
511c3d31fe1Smrg 	    fprintf (file, " user");
512c3d31fe1Smrg 
5133903d7f3Smrg 	  fprintf (file, " align:%d warn_if_not_align:%d",
5143903d7f3Smrg 		   DECL_ALIGN (node), DECL_WARN_IF_NOT_ALIGN (node));
515c3d31fe1Smrg 	  if (code == FIELD_DECL)
516c3d31fe1Smrg 	    fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED,
517c3d31fe1Smrg 		     DECL_OFFSET_ALIGN (node));
518c3d31fe1Smrg 
51981418a27Smrg 	  if (code == FUNCTION_DECL && fndecl_built_in_p (node))
520c3d31fe1Smrg 	    {
521c3d31fe1Smrg 	      if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD)
522*dd083157Smrg 		fprintf (file, " built-in: BUILT_IN_MD:%d",
523*dd083157Smrg 			 DECL_MD_FUNCTION_CODE (node));
524*dd083157Smrg 	      else if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_FRONTEND)
525*dd083157Smrg 		fprintf (file, " built-in: BUILT_IN_FRONTEND:%d",
526*dd083157Smrg 			 DECL_FE_FUNCTION_CODE (node));
527c3d31fe1Smrg 	      else
5283903d7f3Smrg 		fprintf (file, " built-in: %s:%s",
529c3d31fe1Smrg 			 built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)],
530c3d31fe1Smrg 			 built_in_names[(int) DECL_FUNCTION_CODE (node)]);
531c3d31fe1Smrg 	    }
532c3d31fe1Smrg 	}
533c3d31fe1Smrg       if (code == FIELD_DECL)
534c3d31fe1Smrg 	{
535c3d31fe1Smrg 	  print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4);
5363903d7f3Smrg 	  print_node (file, "bit-offset", DECL_FIELD_BIT_OFFSET (node),
537c3d31fe1Smrg 		      indent + 4);
538c3d31fe1Smrg 	  if (DECL_BIT_FIELD_TYPE (node))
539c3d31fe1Smrg 	    print_node (file, "bit_field_type", DECL_BIT_FIELD_TYPE (node),
540c3d31fe1Smrg 			indent + 4);
541c3d31fe1Smrg 	}
542c3d31fe1Smrg 
543c3d31fe1Smrg       print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4);
544c3d31fe1Smrg 
545c3d31fe1Smrg       if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
546c3d31fe1Smrg 	{
5473903d7f3Smrg 	  print_node (file, "attributes",
548c3d31fe1Smrg 			    DECL_ATTRIBUTES (node), indent + 4);
549c3d31fe1Smrg 	  if (code != PARM_DECL)
550c3d31fe1Smrg 	    print_node_brief (file, "initial", DECL_INITIAL (node),
551c3d31fe1Smrg 			      indent + 4);
552c3d31fe1Smrg 	}
553c3d31fe1Smrg       if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
554c3d31fe1Smrg 	{
555c3d31fe1Smrg 	  print_node_brief (file, "abstract_origin",
556c3d31fe1Smrg 			    DECL_ABSTRACT_ORIGIN (node), indent + 4);
557c3d31fe1Smrg 	}
558c3d31fe1Smrg       if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
559c3d31fe1Smrg 	{
560c3d31fe1Smrg 	  print_node (file, "result", DECL_RESULT_FLD (node), indent + 4);
561c3d31fe1Smrg 	}
562c3d31fe1Smrg 
563c3d31fe1Smrg       lang_hooks.print_decl (file, node, indent);
564c3d31fe1Smrg 
565c3d31fe1Smrg       if (DECL_RTL_SET_P (node))
566c3d31fe1Smrg 	{
567c3d31fe1Smrg 	  indent_to (file, indent + 4);
568c3d31fe1Smrg 	  print_rtl (file, DECL_RTL (node));
569c3d31fe1Smrg 	}
570c3d31fe1Smrg 
571c3d31fe1Smrg       if (code == PARM_DECL)
572c3d31fe1Smrg 	{
573c3d31fe1Smrg 	  print_node (file, "arg-type", DECL_ARG_TYPE (node), indent + 4);
574c3d31fe1Smrg 
575c3d31fe1Smrg 	  if (DECL_INCOMING_RTL (node) != 0)
576c3d31fe1Smrg 	    {
577c3d31fe1Smrg 	      indent_to (file, indent + 4);
578c3d31fe1Smrg 	      fprintf (file, "incoming-rtl ");
579c3d31fe1Smrg 	      print_rtl (file, DECL_INCOMING_RTL (node));
580c3d31fe1Smrg 	    }
581c3d31fe1Smrg 	}
582c3d31fe1Smrg       else if (code == FUNCTION_DECL
583c3d31fe1Smrg 	       && DECL_STRUCT_FUNCTION (node) != 0)
584c3d31fe1Smrg 	{
5855ef59e75Smrg 	  print_node (file, "arguments", DECL_ARGUMENTS (node), indent + 4);
586c3d31fe1Smrg 	  indent_to (file, indent + 4);
587c3d31fe1Smrg 	  dump_addr (file, "struct-function ", DECL_STRUCT_FUNCTION (node));
588c3d31fe1Smrg 	}
589c3d31fe1Smrg 
590c3d31fe1Smrg       if ((code == VAR_DECL || code == PARM_DECL)
591c3d31fe1Smrg 	  && DECL_HAS_VALUE_EXPR_P (node))
592c3d31fe1Smrg 	print_node (file, "value-expr", DECL_VALUE_EXPR (node), indent + 4);
593c3d31fe1Smrg 
594c3d31fe1Smrg       /* Print the decl chain only if decl is at second level.  */
595c3d31fe1Smrg       if (indent == 4)
596c3d31fe1Smrg 	print_node (file, "chain", TREE_CHAIN (node), indent + 4);
597c3d31fe1Smrg       else
598c3d31fe1Smrg 	print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
599c3d31fe1Smrg       break;
600c3d31fe1Smrg 
601c3d31fe1Smrg     case tcc_type:
602c3d31fe1Smrg       if (TYPE_UNSIGNED (node))
603c3d31fe1Smrg 	fputs (" unsigned", file);
604c3d31fe1Smrg 
6055ef59e75Smrg       if (TYPE_NO_FORCE_BLK (node))
606c3d31fe1Smrg 	fputs (" no-force-blk", file);
607c3d31fe1Smrg 
608*dd083157Smrg       if (code == ARRAY_TYPE && TYPE_STRING_FLAG (node))
609c3d31fe1Smrg 	fputs (" string-flag", file);
6105ef59e75Smrg 
611c3d31fe1Smrg       if (TYPE_NEEDS_CONSTRUCTING (node))
612c3d31fe1Smrg 	fputs (" needs-constructing", file);
613c3d31fe1Smrg 
61463aace61Smrg       if ((code == RECORD_TYPE
61563aace61Smrg 	   || code == UNION_TYPE
61663aace61Smrg 	   || code == QUAL_UNION_TYPE
61763aace61Smrg 	   || code == ARRAY_TYPE)
61863aace61Smrg 	  && TYPE_REVERSE_STORAGE_ORDER (node))
61963aace61Smrg 	fputs (" reverse-storage-order", file);
62063aace61Smrg 
621*dd083157Smrg       if ((code == RECORD_TYPE
622*dd083157Smrg 	   || code == UNION_TYPE)
623*dd083157Smrg 	  && TYPE_CXX_ODR_P (node))
624*dd083157Smrg 	fputs (" cxx-odr-p", file);
625*dd083157Smrg 
626c3d31fe1Smrg       /* The transparent-union flag is used for different things in
627c3d31fe1Smrg 	 different nodes.  */
628c3d31fe1Smrg       if ((code == UNION_TYPE || code == RECORD_TYPE)
629c3d31fe1Smrg 	  && TYPE_TRANSPARENT_AGGR (node))
630c3d31fe1Smrg 	fputs (" transparent-aggr", file);
631c3d31fe1Smrg       else if (code == ARRAY_TYPE
632c3d31fe1Smrg 	       && TYPE_NONALIASED_COMPONENT (node))
633c3d31fe1Smrg 	fputs (" nonaliased-component", file);
634c3d31fe1Smrg 
635c3d31fe1Smrg       if (TYPE_PACKED (node))
636c3d31fe1Smrg 	fputs (" packed", file);
637c3d31fe1Smrg 
638c3d31fe1Smrg       if (TYPE_RESTRICT (node))
639c3d31fe1Smrg 	fputs (" restrict", file);
640c3d31fe1Smrg 
641c3d31fe1Smrg       if (TYPE_LANG_FLAG_0 (node))
642c3d31fe1Smrg 	fputs (" type_0", file);
643c3d31fe1Smrg       if (TYPE_LANG_FLAG_1 (node))
644c3d31fe1Smrg 	fputs (" type_1", file);
645c3d31fe1Smrg       if (TYPE_LANG_FLAG_2 (node))
646c3d31fe1Smrg 	fputs (" type_2", file);
647c3d31fe1Smrg       if (TYPE_LANG_FLAG_3 (node))
648c3d31fe1Smrg 	fputs (" type_3", file);
649c3d31fe1Smrg       if (TYPE_LANG_FLAG_4 (node))
650c3d31fe1Smrg 	fputs (" type_4", file);
651c3d31fe1Smrg       if (TYPE_LANG_FLAG_5 (node))
652c3d31fe1Smrg 	fputs (" type_5", file);
653c3d31fe1Smrg       if (TYPE_LANG_FLAG_6 (node))
654c3d31fe1Smrg 	fputs (" type_6", file);
6556a5c9aabSmrg       if (TYPE_LANG_FLAG_7 (node))
6566a5c9aabSmrg 	fputs (" type_7", file);
657c3d31fe1Smrg 
658c3d31fe1Smrg       mode = TYPE_MODE (node);
659c3d31fe1Smrg       fprintf (file, " %s", GET_MODE_NAME (mode));
660c3d31fe1Smrg 
661c3d31fe1Smrg       print_node (file, "size", TYPE_SIZE (node), indent + 4);
6623903d7f3Smrg       print_node (file, "unit-size", TYPE_SIZE_UNIT (node), indent + 4);
663c3d31fe1Smrg       indent_to (file, indent + 3);
664c3d31fe1Smrg 
665c3d31fe1Smrg       if (TYPE_USER_ALIGN (node))
666c3d31fe1Smrg 	fprintf (file, " user");
667c3d31fe1Smrg 
6683903d7f3Smrg       fprintf (file, " align:%d warn_if_not_align:%d symtab:%d alias-set "
6693903d7f3Smrg 	       HOST_WIDE_INT_PRINT_DEC,
6703903d7f3Smrg 	       TYPE_ALIGN (node), TYPE_WARN_IF_NOT_ALIGN (node),
6713903d7f3Smrg 	       TYPE_SYMTAB_ADDRESS (node),
672c3d31fe1Smrg 	       (HOST_WIDE_INT) TYPE_ALIAS_SET (node));
673c3d31fe1Smrg 
674c3d31fe1Smrg       if (TYPE_STRUCTURAL_EQUALITY_P (node))
6753903d7f3Smrg 	fprintf (file, " structural-equality");
676c3d31fe1Smrg       else
6773903d7f3Smrg 	dump_addr (file, " canonical-type ", TYPE_CANONICAL (node));
678c3d31fe1Smrg 
679c3d31fe1Smrg       print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4);
680c3d31fe1Smrg 
681c3d31fe1Smrg       if (INTEGRAL_TYPE_P (node) || code == REAL_TYPE
682c3d31fe1Smrg 	  || code == FIXED_POINT_TYPE)
683c3d31fe1Smrg 	{
6843903d7f3Smrg 	  fprintf (file, " precision:%d", TYPE_PRECISION (node));
685c3d31fe1Smrg 	  print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4);
686c3d31fe1Smrg 	  print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4);
687c3d31fe1Smrg 	}
688c3d31fe1Smrg 
689c3d31fe1Smrg       if (code == ENUMERAL_TYPE)
690c3d31fe1Smrg 	print_node (file, "values", TYPE_VALUES (node), indent + 4);
691c3d31fe1Smrg       else if (code == ARRAY_TYPE)
692c3d31fe1Smrg 	print_node (file, "domain", TYPE_DOMAIN (node), indent + 4);
693c3d31fe1Smrg       else if (code == VECTOR_TYPE)
6943903d7f3Smrg 	{
6953903d7f3Smrg 	  fprintf (file, " nunits:");
6963903d7f3Smrg 	  print_dec (TYPE_VECTOR_SUBPARTS (node), file);
6973903d7f3Smrg 	}
698c3d31fe1Smrg       else if (code == RECORD_TYPE
699c3d31fe1Smrg 	       || code == UNION_TYPE
700c3d31fe1Smrg 	       || code == QUAL_UNION_TYPE)
701c3d31fe1Smrg 	print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
702c3d31fe1Smrg       else if (code == FUNCTION_TYPE
703c3d31fe1Smrg 	       || code == METHOD_TYPE)
704c3d31fe1Smrg 	{
705c3d31fe1Smrg 	  if (TYPE_METHOD_BASETYPE (node))
706c3d31fe1Smrg 	    print_node_brief (file, "method basetype",
707c3d31fe1Smrg 			      TYPE_METHOD_BASETYPE (node), indent + 4);
708c3d31fe1Smrg 	  print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
709c3d31fe1Smrg 	}
710c3d31fe1Smrg       else if (code == OFFSET_TYPE)
711c3d31fe1Smrg 	print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node),
712c3d31fe1Smrg 			  indent + 4);
713c3d31fe1Smrg 
714c3d31fe1Smrg       if (TYPE_CONTEXT (node))
715c3d31fe1Smrg 	print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);
716c3d31fe1Smrg 
717c3d31fe1Smrg       lang_hooks.print_type (file, node, indent);
718c3d31fe1Smrg 
719c3d31fe1Smrg       if (TYPE_POINTER_TO (node) || TREE_CHAIN (node))
720c3d31fe1Smrg 	indent_to (file, indent + 3);
721c3d31fe1Smrg 
722c3d31fe1Smrg       print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node),
723c3d31fe1Smrg 			indent + 4);
724c3d31fe1Smrg       print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node),
725c3d31fe1Smrg 			indent + 4);
726c3d31fe1Smrg       print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
727c3d31fe1Smrg       break;
728c3d31fe1Smrg 
729c3d31fe1Smrg     case tcc_expression:
730c3d31fe1Smrg     case tcc_comparison:
731c3d31fe1Smrg     case tcc_unary:
732c3d31fe1Smrg     case tcc_binary:
733c3d31fe1Smrg     case tcc_reference:
734c3d31fe1Smrg     case tcc_statement:
735c3d31fe1Smrg     case tcc_vl_exp:
736c3d31fe1Smrg       if (code == BIND_EXPR)
737c3d31fe1Smrg 	{
738c3d31fe1Smrg 	  print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
739c3d31fe1Smrg 	  print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
740c3d31fe1Smrg 	  print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
741c3d31fe1Smrg 	  break;
742c3d31fe1Smrg 	}
743c3d31fe1Smrg       if (code == CALL_EXPR)
744c3d31fe1Smrg 	{
745c3d31fe1Smrg 	  call_expr_arg_iterator iter;
746c3d31fe1Smrg 	  tree arg;
747c3d31fe1Smrg 	  print_node (file, "fn", CALL_EXPR_FN (node), indent + 4);
748c3d31fe1Smrg 	  print_node (file, "static_chain", CALL_EXPR_STATIC_CHAIN (node),
749c3d31fe1Smrg 		      indent + 4);
750c3d31fe1Smrg 	  i = 0;
751c3d31fe1Smrg 	  FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
752c3d31fe1Smrg 	    {
7536a5c9aabSmrg 	      /* Buffer big enough to format a 32-bit UINT_MAX into, plus
7546a5c9aabSmrg 		 the text.  */
7556a5c9aabSmrg 	      char temp[15];
7563903d7f3Smrg 	      sprintf (temp, "arg:%u", i);
757c3d31fe1Smrg 	      print_node (file, temp, arg, indent + 4);
758c3d31fe1Smrg 	      i++;
759c3d31fe1Smrg 	    }
760c3d31fe1Smrg 	}
761c3d31fe1Smrg       else
762c3d31fe1Smrg 	{
763c3d31fe1Smrg 	  len = TREE_OPERAND_LENGTH (node);
764c3d31fe1Smrg 
765c3d31fe1Smrg 	  for (i = 0; i < len; i++)
766c3d31fe1Smrg 	    {
7676a5c9aabSmrg 	      /* Buffer big enough to format a 32-bit UINT_MAX into, plus
7686a5c9aabSmrg 		 the text.  */
7696a5c9aabSmrg 	      char temp[15];
770c3d31fe1Smrg 
7713903d7f3Smrg 	      sprintf (temp, "arg:%d", i);
772c3d31fe1Smrg 	      print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
773c3d31fe1Smrg 	    }
774c3d31fe1Smrg 	}
775af526226Smrg       if (CODE_CONTAINS_STRUCT (code, TS_COMMON))
776c3d31fe1Smrg 	print_node (file, "chain", TREE_CHAIN (node), indent + 4);
777c3d31fe1Smrg       break;
778c3d31fe1Smrg 
779c3d31fe1Smrg     case tcc_constant:
780c3d31fe1Smrg     case tcc_exceptional:
781c3d31fe1Smrg       switch (code)
782c3d31fe1Smrg 	{
783c3d31fe1Smrg 	case INTEGER_CST:
784c3d31fe1Smrg 	  if (TREE_OVERFLOW (node))
785c3d31fe1Smrg 	    fprintf (file, " overflow");
786c3d31fe1Smrg 
787c3d31fe1Smrg 	  fprintf (file, " ");
7883903d7f3Smrg 	  print_dec (wi::to_wide (node), file, TYPE_SIGN (TREE_TYPE (node)));
789c3d31fe1Smrg 	  break;
790c3d31fe1Smrg 
791c3d31fe1Smrg 	case REAL_CST:
79281418a27Smrg 	  print_real_cst (file, node, false);
793c3d31fe1Smrg 	  break;
794c3d31fe1Smrg 
795c3d31fe1Smrg 	case FIXED_CST:
796c3d31fe1Smrg 	  {
797c3d31fe1Smrg 	    FIXED_VALUE_TYPE f;
798c3d31fe1Smrg 	    char string[64];
799c3d31fe1Smrg 
800c3d31fe1Smrg 	    if (TREE_OVERFLOW (node))
801c3d31fe1Smrg 	      fprintf (file, " overflow");
802c3d31fe1Smrg 
803c3d31fe1Smrg 	    f = TREE_FIXED_CST (node);
804c3d31fe1Smrg 	    fixed_to_decimal (string, &f, sizeof (string));
805c3d31fe1Smrg 	    fprintf (file, " %s", string);
806c3d31fe1Smrg 	  }
807c3d31fe1Smrg 	  break;
808c3d31fe1Smrg 
809c3d31fe1Smrg 	case VECTOR_CST:
810c3d31fe1Smrg 	  {
8113903d7f3Smrg 	    /* Big enough for UINT_MAX plus the string below.  */
8126a5c9aabSmrg 	    char buf[32];
813c3d31fe1Smrg 
8143903d7f3Smrg 	    fprintf (file, " npatterns:%u nelts-per-pattern:%u",
8153903d7f3Smrg 		     VECTOR_CST_NPATTERNS (node),
8163903d7f3Smrg 		     VECTOR_CST_NELTS_PER_PATTERN (node));
8173903d7f3Smrg 	    unsigned int count = vector_cst_encoded_nelts (node);
8183903d7f3Smrg 	    for (unsigned int i = 0; i < count; ++i)
819c3d31fe1Smrg 	      {
8203903d7f3Smrg 		sprintf (buf, "elt:%u: ", i);
8213903d7f3Smrg 		print_node (file, buf, VECTOR_CST_ENCODED_ELT (node, i),
8223903d7f3Smrg 			    indent + 4);
823c3d31fe1Smrg 	      }
824c3d31fe1Smrg 	  }
825c3d31fe1Smrg 	  break;
826c3d31fe1Smrg 
827c3d31fe1Smrg 	case COMPLEX_CST:
828c3d31fe1Smrg 	  print_node (file, "real", TREE_REALPART (node), indent + 4);
829c3d31fe1Smrg 	  print_node (file, "imag", TREE_IMAGPART (node), indent + 4);
830c3d31fe1Smrg 	  break;
831c3d31fe1Smrg 
832c3d31fe1Smrg 	case STRING_CST:
833c3d31fe1Smrg 	  {
834c3d31fe1Smrg 	    const char *p = TREE_STRING_POINTER (node);
835c3d31fe1Smrg 	    int i = TREE_STRING_LENGTH (node);
836c3d31fe1Smrg 	    fputs (" \"", file);
837c3d31fe1Smrg 	    while (--i >= 0)
838c3d31fe1Smrg 	      {
839c3d31fe1Smrg 		char ch = *p++;
840c3d31fe1Smrg 		if (ch >= ' ' && ch < 127)
841c3d31fe1Smrg 		  putc (ch, file);
842c3d31fe1Smrg 		else
843c3d31fe1Smrg 		  fprintf (file, "\\%03o", ch & 0xFF);
844c3d31fe1Smrg 	      }
845c3d31fe1Smrg 	    fputc ('\"', file);
846c3d31fe1Smrg 	  }
847c3d31fe1Smrg 	  break;
848c3d31fe1Smrg 
8493903d7f3Smrg 	case POLY_INT_CST:
8503903d7f3Smrg 	  {
8513903d7f3Smrg 	    char buf[10];
8523903d7f3Smrg 	    for (unsigned int i = 0; i < NUM_POLY_INT_COEFFS; ++i)
8533903d7f3Smrg 	      {
8543903d7f3Smrg 		snprintf (buf, sizeof (buf), "elt%u: ", i);
8553903d7f3Smrg 		print_node (file, buf, POLY_INT_CST_COEFF (node, i),
8563903d7f3Smrg 			    indent + 4);
8573903d7f3Smrg 	      }
8583903d7f3Smrg 	  }
8593903d7f3Smrg 	  break;
8603903d7f3Smrg 
861c3d31fe1Smrg 	case IDENTIFIER_NODE:
862c3d31fe1Smrg 	  lang_hooks.print_identifier (file, node, indent);
863c3d31fe1Smrg 	  break;
864c3d31fe1Smrg 
865c3d31fe1Smrg 	case TREE_LIST:
866c3d31fe1Smrg 	  print_node (file, "purpose", TREE_PURPOSE (node), indent + 4);
867c3d31fe1Smrg 	  print_node (file, "value", TREE_VALUE (node), indent + 4);
868c3d31fe1Smrg 	  print_node (file, "chain", TREE_CHAIN (node), indent + 4);
869c3d31fe1Smrg 	  break;
870c3d31fe1Smrg 
871c3d31fe1Smrg 	case TREE_VEC:
872c3d31fe1Smrg 	  len = TREE_VEC_LENGTH (node);
8733903d7f3Smrg 	  fprintf (file, " length:%d", len);
874c3d31fe1Smrg 	  for (i = 0; i < len; i++)
875c3d31fe1Smrg 	    if (TREE_VEC_ELT (node, i))
876c3d31fe1Smrg 	      {
8776a5c9aabSmrg 	      /* Buffer big enough to format a 32-bit UINT_MAX into, plus
8786a5c9aabSmrg 		 the text.  */
8796a5c9aabSmrg 		char temp[15];
8803903d7f3Smrg 		sprintf (temp, "elt:%d", i);
881af526226Smrg 		print_node (file, temp, TREE_VEC_ELT (node, i), indent + 4);
882c3d31fe1Smrg 	      }
883c3d31fe1Smrg 	  break;
884c3d31fe1Smrg 
885c3d31fe1Smrg 	case CONSTRUCTOR:
886c3d31fe1Smrg 	  {
887c3d31fe1Smrg 	    unsigned HOST_WIDE_INT cnt;
888c3d31fe1Smrg 	    tree index, value;
8896a5c9aabSmrg 	    len = CONSTRUCTOR_NELTS (node);
8903903d7f3Smrg 	    fprintf (file, " length:%d", len);
891c3d31fe1Smrg 	    FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node),
892c3d31fe1Smrg 				      cnt, index, value)
893c3d31fe1Smrg 	      {
8946a5c9aabSmrg 		print_node (file, "idx", index, indent + 4, false);
8956a5c9aabSmrg 		print_node (file, "val", value, indent + 4, false);
896c3d31fe1Smrg 	      }
897c3d31fe1Smrg 	  }
898c3d31fe1Smrg 	  break;
899c3d31fe1Smrg 
900c3d31fe1Smrg     	case STATEMENT_LIST:
901c3d31fe1Smrg 	  dump_addr (file, " head ", node->stmt_list.head);
902c3d31fe1Smrg 	  dump_addr (file, " tail ", node->stmt_list.tail);
903c3d31fe1Smrg 	  fprintf (file, " stmts");
904c3d31fe1Smrg 	  {
905c3d31fe1Smrg 	    tree_stmt_iterator i;
906c3d31fe1Smrg 	    for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i))
907c3d31fe1Smrg 	      {
908c3d31fe1Smrg 		/* Not printing the addresses of the (not-a-tree)
909c3d31fe1Smrg 		   'struct tree_stmt_list_node's.  */
910c3d31fe1Smrg 		dump_addr (file, " ", tsi_stmt (i));
911c3d31fe1Smrg 	      }
912c3d31fe1Smrg 	    fprintf (file, "\n");
913c3d31fe1Smrg 	    for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i))
914c3d31fe1Smrg 	      {
915c3d31fe1Smrg 		/* Not printing the addresses of the (not-a-tree)
916c3d31fe1Smrg 		   'struct tree_stmt_list_node's.  */
917c3d31fe1Smrg 		print_node (file, "stmt", tsi_stmt (i), indent + 4);
918c3d31fe1Smrg 	      }
919c3d31fe1Smrg 	  }
920c3d31fe1Smrg 	  break;
921c3d31fe1Smrg 
922c3d31fe1Smrg 	case BLOCK:
923c3d31fe1Smrg 	  print_node (file, "vars", BLOCK_VARS (node), indent + 4);
924c3d31fe1Smrg 	  print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node),
925c3d31fe1Smrg 		      indent + 4);
926c3d31fe1Smrg 	  print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
927c3d31fe1Smrg 	  print_node (file, "chain", BLOCK_CHAIN (node), indent + 4);
928c3d31fe1Smrg 	  print_node (file, "abstract_origin",
929c3d31fe1Smrg 		      BLOCK_ABSTRACT_ORIGIN (node), indent + 4);
930c3d31fe1Smrg 	  break;
931c3d31fe1Smrg 
932c3d31fe1Smrg 	case SSA_NAME:
933c3d31fe1Smrg 	  print_node_brief (file, "var", SSA_NAME_VAR (node), indent + 4);
9346a5c9aabSmrg 	  indent_to (file, indent + 4);
935c3d31fe1Smrg 	  fprintf (file, "def_stmt ");
9366a5c9aabSmrg 	  {
9376a5c9aabSmrg 	    pretty_printer buffer;
9386a5c9aabSmrg 	    buffer.buffer->stream = file;
93981418a27Smrg 	    pp_gimple_stmt_1 (&buffer, SSA_NAME_DEF_STMT (node), indent + 4,
94081418a27Smrg 			      TDF_NONE);
9416a5c9aabSmrg 	    pp_flush (&buffer);
9426a5c9aabSmrg 	  }
943c3d31fe1Smrg 
944c3d31fe1Smrg 	  indent_to (file, indent + 4);
9453903d7f3Smrg 	  fprintf (file, "version:%u", SSA_NAME_VERSION (node));
946c3d31fe1Smrg 	  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
947c3d31fe1Smrg 	    fprintf (file, " in-abnormal-phi");
948c3d31fe1Smrg 	  if (SSA_NAME_IN_FREE_LIST (node))
949c3d31fe1Smrg 	    fprintf (file, " in-free-list");
950c3d31fe1Smrg 
951c3d31fe1Smrg 	  if (SSA_NAME_PTR_INFO (node))
952c3d31fe1Smrg 	    {
953c3d31fe1Smrg 	      indent_to (file, indent + 3);
954c3d31fe1Smrg 	      if (SSA_NAME_PTR_INFO (node))
955c3d31fe1Smrg 		dump_addr (file, " ptr-info ", SSA_NAME_PTR_INFO (node));
956c3d31fe1Smrg 	    }
957c3d31fe1Smrg 	  break;
958c3d31fe1Smrg 
959c3d31fe1Smrg 	case OMP_CLAUSE:
960c3d31fe1Smrg 	    {
961c3d31fe1Smrg 	      int i;
962c3d31fe1Smrg 	      fprintf (file, " %s",
963c3d31fe1Smrg 		       omp_clause_code_name[OMP_CLAUSE_CODE (node)]);
964c3d31fe1Smrg 	      for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (node)]; i++)
965c3d31fe1Smrg 		{
966c3d31fe1Smrg 		  indent_to (file, indent + 4);
9673903d7f3Smrg 		  fprintf (file, "op-%d:", i);
968c3d31fe1Smrg 		  print_node_brief (file, "", OMP_CLAUSE_OPERAND (node, i), 0);
969c3d31fe1Smrg 		}
970c3d31fe1Smrg 	    }
971c3d31fe1Smrg 	  break;
972c3d31fe1Smrg 
973c3d31fe1Smrg 	case OPTIMIZATION_NODE:
974c3d31fe1Smrg 	  cl_optimization_print (file, indent + 4, TREE_OPTIMIZATION (node));
975c3d31fe1Smrg 	  break;
976c3d31fe1Smrg 
977c3d31fe1Smrg 	case TARGET_OPTION_NODE:
978c3d31fe1Smrg 	  cl_target_option_print (file, indent + 4, TREE_TARGET_OPTION (node));
979c3d31fe1Smrg 	  break;
980c3d31fe1Smrg 	case IMPORTED_DECL:
9813903d7f3Smrg 	  fprintf (file, " imported-declaration");
9823903d7f3Smrg 	  print_node_brief (file, "associated-declaration",
983c3d31fe1Smrg 			    IMPORTED_DECL_ASSOCIATED_DECL (node),
984c3d31fe1Smrg 			    indent + 4);
985c3d31fe1Smrg 	  break;
986c3d31fe1Smrg 
98763aace61Smrg 	case TREE_BINFO:
9883903d7f3Smrg 	  fprintf (file, " bases:%d",
98963aace61Smrg 		   vec_safe_length (BINFO_BASE_BINFOS (node)));
99063aace61Smrg 	  print_node_brief (file, "offset", BINFO_OFFSET (node), indent + 4);
99163aace61Smrg 	  print_node_brief (file, "virtuals", BINFO_VIRTUALS (node),
99263aace61Smrg 			    indent + 4);
9933903d7f3Smrg 	  print_node_brief (file, "inheritance-chain",
99463aace61Smrg 			    BINFO_INHERITANCE_CHAIN (node),
99563aace61Smrg 			    indent + 4);
99663aace61Smrg 	  break;
99763aace61Smrg 
998c3d31fe1Smrg 	default:
999c3d31fe1Smrg 	  if (EXCEPTIONAL_CLASS_P (node))
1000c3d31fe1Smrg 	    lang_hooks.print_xnode (file, node, indent);
1001c3d31fe1Smrg 	  break;
1002c3d31fe1Smrg 	}
1003c3d31fe1Smrg 
1004c3d31fe1Smrg       break;
1005c3d31fe1Smrg     }
1006c3d31fe1Smrg 
1007c3d31fe1Smrg   if (EXPR_HAS_LOCATION (node))
1008c3d31fe1Smrg     {
1009c3d31fe1Smrg       expanded_location xloc = expand_location (EXPR_LOCATION (node));
1010c3d31fe1Smrg       indent_to (file, indent+4);
1011c3d31fe1Smrg       fprintf (file, "%s:%d:%d", xloc.file, xloc.line, xloc.column);
101263aace61Smrg 
101363aace61Smrg       /* Print the range, if any */
101463aace61Smrg       source_range r = EXPR_LOCATION_RANGE (node);
101563aace61Smrg       if (r.m_start)
101663aace61Smrg 	{
101763aace61Smrg 	  xloc = expand_location (r.m_start);
101863aace61Smrg 	  fprintf (file, " start: %s:%d:%d", xloc.file, xloc.line, xloc.column);
101963aace61Smrg 	}
102063aace61Smrg       else
102163aace61Smrg 	{
102263aace61Smrg 	  fprintf (file, " start: unknown");
102363aace61Smrg 	}
102463aace61Smrg       if (r.m_finish)
102563aace61Smrg 	{
102663aace61Smrg 	  xloc = expand_location (r.m_finish);
102763aace61Smrg 	  fprintf (file, " finish: %s:%d:%d", xloc.file, xloc.line, xloc.column);
102863aace61Smrg 	}
102963aace61Smrg       else
103063aace61Smrg 	{
103163aace61Smrg 	  fprintf (file, " finish: unknown");
103263aace61Smrg 	}
1033c3d31fe1Smrg     }
1034c3d31fe1Smrg 
1035c3d31fe1Smrg   fprintf (file, ">");
1036c3d31fe1Smrg }
1037af526226Smrg 
1038*dd083157Smrg /* Print the identifier for DECL according to FLAGS.  */
1039*dd083157Smrg 
1040*dd083157Smrg void
print_decl_identifier(FILE * file,tree decl,int flags)1041*dd083157Smrg print_decl_identifier (FILE *file, tree decl, int flags)
1042*dd083157Smrg {
1043*dd083157Smrg   bool needs_colon = false;
1044*dd083157Smrg   const char *name;
1045*dd083157Smrg   char c;
1046*dd083157Smrg 
1047*dd083157Smrg   if (flags & PRINT_DECL_ORIGIN)
1048*dd083157Smrg     {
1049*dd083157Smrg       if (DECL_IS_BUILTIN (decl))
1050*dd083157Smrg 	fputs ("<built-in>", file);
1051*dd083157Smrg       else
1052*dd083157Smrg 	{
1053*dd083157Smrg 	  expanded_location loc
1054*dd083157Smrg 	    = expand_location (DECL_SOURCE_LOCATION (decl));
1055*dd083157Smrg 	  fprintf (file, "%s:%d:%d", loc.file, loc.line, loc.column);
1056*dd083157Smrg 	}
1057*dd083157Smrg       needs_colon = true;
1058*dd083157Smrg     }
1059*dd083157Smrg 
1060*dd083157Smrg   if (flags & PRINT_DECL_UNIQUE_NAME)
1061*dd083157Smrg     {
1062*dd083157Smrg       name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
1063*dd083157Smrg       if (!TREE_PUBLIC (decl)
1064*dd083157Smrg 	  || (DECL_WEAK (decl) && !DECL_EXTERNAL (decl)))
1065*dd083157Smrg 	/* The symbol has internal or weak linkage so its assembler name
1066*dd083157Smrg 	   is not necessarily unique among the compilation units of the
1067*dd083157Smrg 	   program.  We therefore have to further mangle it.  But we can't
1068*dd083157Smrg 	   simply use DECL_SOURCE_FILE because it contains the name of the
1069*dd083157Smrg 	   file the symbol originates from so, e.g. for function templates
1070*dd083157Smrg 	   in C++ where the templates are defined in a header file, we can
1071*dd083157Smrg 	   have symbols with the same assembler name and DECL_SOURCE_FILE.
1072*dd083157Smrg 	   That's why we use the name of the top-level source file of the
1073*dd083157Smrg 	   compilation unit.  ??? Unnecessary for Ada.  */
1074*dd083157Smrg 	name = ACONCAT ((main_input_filename, ":", name, NULL));
1075*dd083157Smrg     }
1076*dd083157Smrg   else if (flags & PRINT_DECL_NAME)
1077*dd083157Smrg     {
1078*dd083157Smrg       /* We don't want to print the full qualified name because it can be long,
1079*dd083157Smrg 	 so we strip the scope prefix, but we may need to deal with the suffix
1080*dd083157Smrg 	 created by the compiler.  */
1081*dd083157Smrg       const char *suffix = strchr (IDENTIFIER_POINTER (DECL_NAME (decl)), '.');
1082*dd083157Smrg       name = lang_hooks.decl_printable_name (decl, 2);
1083*dd083157Smrg       if (suffix)
1084*dd083157Smrg 	{
1085*dd083157Smrg 	  const char *dot = strchr (name, '.');
1086*dd083157Smrg 	  while (dot && strcasecmp (dot, suffix) != 0)
1087*dd083157Smrg 	    {
1088*dd083157Smrg 	      name = dot + 1;
1089*dd083157Smrg 	      dot = strchr (name, '.');
1090*dd083157Smrg 	    }
1091*dd083157Smrg 	}
1092*dd083157Smrg       else
1093*dd083157Smrg 	{
1094*dd083157Smrg 	  const char *dot = strrchr (name, '.');
1095*dd083157Smrg 	  if (dot)
1096*dd083157Smrg 	    name = dot + 1;
1097*dd083157Smrg 	}
1098*dd083157Smrg     }
1099*dd083157Smrg   else
1100*dd083157Smrg     return;
1101*dd083157Smrg 
1102*dd083157Smrg   if (needs_colon)
1103*dd083157Smrg     fputc (':', file);
1104*dd083157Smrg 
1105*dd083157Smrg   while ((c = *name++) != '\0')
1106*dd083157Smrg     {
1107*dd083157Smrg       /* Strip double-quotes because of VCG.  */
1108*dd083157Smrg       if (c == '"')
1109*dd083157Smrg 	continue;
1110*dd083157Smrg       fputc (c, file);
1111*dd083157Smrg     }
1112*dd083157Smrg }
1113*dd083157Smrg 
1114af526226Smrg 
11155ef59e75Smrg /* Print the node NODE on standard error, for debugging.
11165ef59e75Smrg    Most nodes referred to by this one are printed recursively
11175ef59e75Smrg    down to a depth of six.  */
11185ef59e75Smrg 
11195ef59e75Smrg DEBUG_FUNCTION void
debug_tree(tree node)11205ef59e75Smrg debug_tree (tree node)
11215ef59e75Smrg {
11226a5c9aabSmrg   table = new hash_set<tree> (HASH_SIZE);
11235ef59e75Smrg   print_node (stderr, "", node, 0);
11246a5c9aabSmrg   delete table;
11256a5c9aabSmrg   table = NULL;
11265ef59e75Smrg   putc ('\n', stderr);
11275ef59e75Smrg }
11285ef59e75Smrg 
11295ef59e75Smrg DEBUG_FUNCTION void
debug_raw(const tree_node & ref)11305ef59e75Smrg debug_raw (const tree_node &ref)
11315ef59e75Smrg {
11325ef59e75Smrg   debug_tree (const_cast <tree> (&ref));
11335ef59e75Smrg }
11345ef59e75Smrg 
11355ef59e75Smrg DEBUG_FUNCTION void
debug_raw(const tree_node * ptr)11365ef59e75Smrg debug_raw (const tree_node *ptr)
11375ef59e75Smrg {
11385ef59e75Smrg   if (ptr)
11395ef59e75Smrg     debug_raw (*ptr);
11405ef59e75Smrg   else
11415ef59e75Smrg     fprintf (stderr, "<nil>\n");
11425ef59e75Smrg }
11435ef59e75Smrg 
11445ef59e75Smrg static void
dump_tree_via_hooks(const tree_node * ptr,dump_flags_t options)11453903d7f3Smrg dump_tree_via_hooks (const tree_node *ptr, dump_flags_t options)
11465ef59e75Smrg {
11475ef59e75Smrg   if (DECL_P (ptr))
11485ef59e75Smrg     lang_hooks.print_decl (stderr, const_cast <tree_node*> (ptr), 0);
11495ef59e75Smrg   else if (TYPE_P (ptr))
11505ef59e75Smrg     lang_hooks.print_type (stderr, const_cast <tree_node*> (ptr), 0);
11515ef59e75Smrg   else if (TREE_CODE (ptr) == IDENTIFIER_NODE)
11525ef59e75Smrg     lang_hooks.print_identifier (stderr, const_cast <tree_node*> (ptr), 0);
11535ef59e75Smrg   else
11545ef59e75Smrg     print_generic_expr (stderr, const_cast <tree_node*> (ptr), options);
11555ef59e75Smrg   fprintf (stderr, "\n");
11565ef59e75Smrg }
11575ef59e75Smrg 
11585ef59e75Smrg DEBUG_FUNCTION void
debug(const tree_node & ref)11595ef59e75Smrg debug (const tree_node &ref)
11605ef59e75Smrg {
116181418a27Smrg   dump_tree_via_hooks (&ref, TDF_NONE);
11625ef59e75Smrg }
11635ef59e75Smrg 
11645ef59e75Smrg DEBUG_FUNCTION void
debug(const tree_node * ptr)11655ef59e75Smrg debug (const tree_node *ptr)
11665ef59e75Smrg {
11675ef59e75Smrg   if (ptr)
11685ef59e75Smrg     debug (*ptr);
11695ef59e75Smrg   else
11705ef59e75Smrg     fprintf (stderr, "<nil>\n");
11715ef59e75Smrg }
11725ef59e75Smrg 
11735ef59e75Smrg DEBUG_FUNCTION void
debug_head(const tree_node & ref)11745ef59e75Smrg debug_head (const tree_node &ref)
11755ef59e75Smrg {
11765ef59e75Smrg   debug (ref);
11775ef59e75Smrg }
11785ef59e75Smrg 
11795ef59e75Smrg DEBUG_FUNCTION void
debug_head(const tree_node * ptr)11805ef59e75Smrg debug_head (const tree_node *ptr)
11815ef59e75Smrg {
11825ef59e75Smrg   if (ptr)
11835ef59e75Smrg     debug_head (*ptr);
11845ef59e75Smrg   else
11855ef59e75Smrg     fprintf (stderr, "<nil>\n");
11865ef59e75Smrg }
11875ef59e75Smrg 
11885ef59e75Smrg DEBUG_FUNCTION void
debug_body(const tree_node & ref)11895ef59e75Smrg debug_body (const tree_node &ref)
11905ef59e75Smrg {
11915ef59e75Smrg   if (TREE_CODE (&ref) == FUNCTION_DECL)
119281418a27Smrg     dump_function_to_file (const_cast <tree_node*> (&ref), stderr, TDF_NONE);
11935ef59e75Smrg   else
11945ef59e75Smrg     debug (ref);
11955ef59e75Smrg }
11965ef59e75Smrg 
11975ef59e75Smrg DEBUG_FUNCTION void
debug_body(const tree_node * ptr)11985ef59e75Smrg debug_body (const tree_node *ptr)
11995ef59e75Smrg {
12005ef59e75Smrg   if (ptr)
12015ef59e75Smrg     debug_body (*ptr);
12025ef59e75Smrg   else
12035ef59e75Smrg     fprintf (stderr, "<nil>\n");
12045ef59e75Smrg }
12055ef59e75Smrg 
12065ef59e75Smrg /* Print the vector of trees VEC on standard error, for debugging.
12075ef59e75Smrg    Most nodes referred to by this one are printed recursively
12085ef59e75Smrg    down to a depth of six.  */
12095ef59e75Smrg 
12105ef59e75Smrg DEBUG_FUNCTION void
debug_raw(vec<tree,va_gc> & ref)12115ef59e75Smrg debug_raw (vec<tree, va_gc> &ref)
1212af526226Smrg {
1213af526226Smrg   tree elt;
1214af526226Smrg   unsigned ix;
1215af526226Smrg 
12165ef59e75Smrg   /* Print the slot this node is in, and its code, and address.  */
12175ef59e75Smrg   fprintf (stderr, "<VEC");
12185ef59e75Smrg   dump_addr (stderr, " ", ref.address ());
12195ef59e75Smrg 
12205ef59e75Smrg   FOR_EACH_VEC_ELT (ref, ix, elt)
12215ef59e75Smrg     {
12223903d7f3Smrg       fprintf (stderr, "elt:%d ", ix);
12235ef59e75Smrg       debug_raw (elt);
12245ef59e75Smrg     }
12255ef59e75Smrg }
12265ef59e75Smrg 
12275ef59e75Smrg DEBUG_FUNCTION void
debug_raw(vec<tree,va_gc> * ptr)12285ef59e75Smrg debug_raw (vec<tree, va_gc> *ptr)
12295ef59e75Smrg {
12305ef59e75Smrg   if (ptr)
12315ef59e75Smrg     debug_raw (*ptr);
12325ef59e75Smrg   else
12335ef59e75Smrg     fprintf (stderr, "<nil>\n");
12345ef59e75Smrg }
12355ef59e75Smrg 
12363903d7f3Smrg static void
debug_slim(tree t)12373903d7f3Smrg debug_slim (tree t)
12385ef59e75Smrg {
12393903d7f3Smrg   print_node_brief (stderr, "", t, 0);
12405ef59e75Smrg }
12413903d7f3Smrg 
12423903d7f3Smrg DEFINE_DEBUG_VEC (tree)
12433903d7f3Smrg DEFINE_DEBUG_HASH_SET (tree)
1244