xref: /dflybsd-src/contrib/gcc-4.7/gcc/print-tree.c (revision 81fc95a5293ee307c688a350a3feb4734aaddbb4)
1e4b17023SJohn Marino /* Prints out tree in human readable form - GCC
2e4b17023SJohn Marino    Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3e4b17023SJohn Marino    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4e4b17023SJohn Marino    Free Software Foundation, Inc.
5e4b17023SJohn Marino 
6e4b17023SJohn Marino This file is part of GCC.
7e4b17023SJohn Marino 
8e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
9e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
10e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
11e4b17023SJohn Marino version.
12e4b17023SJohn Marino 
13e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
15e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16e4b17023SJohn Marino for more details.
17e4b17023SJohn Marino 
18e4b17023SJohn Marino You should have received a copy of the GNU General Public License
19e4b17023SJohn Marino along with GCC; see the file COPYING3.  If not see
20e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
21e4b17023SJohn Marino 
22e4b17023SJohn Marino 
23e4b17023SJohn Marino #include "config.h"
24e4b17023SJohn Marino #include "system.h"
25e4b17023SJohn Marino #include "coretypes.h"
26e4b17023SJohn Marino #include "tm.h"
27e4b17023SJohn Marino #include "tree.h"
28e4b17023SJohn Marino #include "ggc.h"
29e4b17023SJohn Marino #include "langhooks.h"
30e4b17023SJohn Marino #include "tree-iterator.h"
31e4b17023SJohn Marino #include "diagnostic.h"
32e4b17023SJohn Marino #include "gimple-pretty-print.h"
33e4b17023SJohn Marino #include "tree-flow.h"
34e4b17023SJohn Marino #include "tree-pass.h"
35e4b17023SJohn Marino 
36e4b17023SJohn Marino /* Define the hash table of nodes already seen.
37e4b17023SJohn Marino    Such nodes are not repeated; brief cross-references are used.  */
38e4b17023SJohn Marino 
39e4b17023SJohn Marino #define HASH_SIZE 37
40e4b17023SJohn Marino 
41e4b17023SJohn Marino struct bucket
42e4b17023SJohn Marino {
43e4b17023SJohn Marino   tree node;
44e4b17023SJohn Marino   struct bucket *next;
45e4b17023SJohn Marino };
46e4b17023SJohn Marino 
47e4b17023SJohn Marino static struct bucket **table;
48e4b17023SJohn Marino 
49e4b17023SJohn Marino /* Print the node NODE on standard error, for debugging.
50e4b17023SJohn Marino    Most nodes referred to by this one are printed recursively
51e4b17023SJohn Marino    down to a depth of six.  */
52e4b17023SJohn Marino 
53e4b17023SJohn Marino DEBUG_FUNCTION void
debug_tree(tree node)54e4b17023SJohn Marino debug_tree (tree node)
55e4b17023SJohn Marino {
56e4b17023SJohn Marino   table = XCNEWVEC (struct bucket *, HASH_SIZE);
57e4b17023SJohn Marino   print_node (stderr, "", node, 0);
58e4b17023SJohn Marino   free (table);
59e4b17023SJohn Marino   table = 0;
60e4b17023SJohn Marino   putc ('\n', stderr);
61e4b17023SJohn Marino }
62e4b17023SJohn Marino 
63e4b17023SJohn Marino /* Print the vector of trees VEC on standard error, for debugging.
64e4b17023SJohn Marino    Most nodes referred to by this one are printed recursively
65e4b17023SJohn Marino    down to a depth of six.  */
66e4b17023SJohn Marino 
67e4b17023SJohn Marino DEBUG_FUNCTION void
debug_vec_tree(VEC (tree,gc)* vec)68e4b17023SJohn Marino debug_vec_tree (VEC(tree,gc) *vec)
69e4b17023SJohn Marino {
70e4b17023SJohn Marino   table = XCNEWVEC (struct bucket *, HASH_SIZE);
71e4b17023SJohn Marino   print_vec_tree (stderr, "", vec, 0);
72e4b17023SJohn Marino   free (table);
73e4b17023SJohn Marino   table = 0;
74e4b17023SJohn Marino   putc ('\n', stderr);
75e4b17023SJohn Marino }
76e4b17023SJohn Marino 
77e4b17023SJohn Marino /* Print PREFIX and ADDR to FILE.  */
78e4b17023SJohn Marino void
dump_addr(FILE * file,const char * prefix,const void * addr)79e4b17023SJohn Marino dump_addr (FILE *file, const char *prefix, const void *addr)
80e4b17023SJohn Marino {
81e4b17023SJohn Marino   if (flag_dump_noaddr || flag_dump_unnumbered)
82e4b17023SJohn Marino     fprintf (file, "%s#", prefix);
83e4b17023SJohn Marino   else
84e4b17023SJohn Marino     fprintf (file, "%s" HOST_PTR_PRINTF, prefix, addr);
85e4b17023SJohn Marino }
86e4b17023SJohn Marino 
87e4b17023SJohn Marino /* Print a node in brief fashion, with just the code, address and name.  */
88e4b17023SJohn Marino 
89e4b17023SJohn Marino void
print_node_brief(FILE * file,const char * prefix,const_tree node,int indent)90e4b17023SJohn Marino print_node_brief (FILE *file, const char *prefix, const_tree node, int indent)
91e4b17023SJohn Marino {
92e4b17023SJohn Marino   enum tree_code_class tclass;
93e4b17023SJohn Marino 
94e4b17023SJohn Marino   if (node == 0)
95e4b17023SJohn Marino     return;
96e4b17023SJohn Marino 
97e4b17023SJohn Marino   tclass = TREE_CODE_CLASS (TREE_CODE (node));
98e4b17023SJohn Marino 
99e4b17023SJohn Marino   /* Always print the slot this node is in, and its code, address and
100e4b17023SJohn Marino      name if any.  */
101e4b17023SJohn Marino   if (indent > 0)
102e4b17023SJohn Marino     fprintf (file, " ");
103e4b17023SJohn Marino   fprintf (file, "%s <%s", prefix, tree_code_name[(int) TREE_CODE (node)]);
104e4b17023SJohn Marino   dump_addr (file, " ", node);
105e4b17023SJohn Marino 
106e4b17023SJohn Marino   if (tclass == tcc_declaration)
107e4b17023SJohn Marino     {
108e4b17023SJohn Marino       if (DECL_NAME (node))
109e4b17023SJohn Marino 	fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
110e4b17023SJohn Marino       else if (TREE_CODE (node) == LABEL_DECL
111e4b17023SJohn Marino 	       && LABEL_DECL_UID (node) != -1)
112e4b17023SJohn Marino 	{
113e4b17023SJohn Marino 	  if (dump_flags & TDF_NOUID)
114e4b17023SJohn Marino 	    fprintf (file, " L.xxxx");
115e4b17023SJohn Marino 	  else
116e4b17023SJohn Marino 	    fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
117e4b17023SJohn Marino 	}
118e4b17023SJohn Marino       else
119e4b17023SJohn Marino 	{
120e4b17023SJohn Marino 	  if (dump_flags & TDF_NOUID)
121e4b17023SJohn Marino 	    fprintf (file, " %c.xxxx",
122e4b17023SJohn Marino 		     TREE_CODE (node) == CONST_DECL ? 'C' : 'D');
123e4b17023SJohn Marino 	  else
124e4b17023SJohn Marino 	    fprintf (file, " %c.%u",
125e4b17023SJohn Marino 		     TREE_CODE (node) == CONST_DECL ? 'C' : 'D',
126e4b17023SJohn Marino 		     DECL_UID (node));
127e4b17023SJohn Marino 	}
128e4b17023SJohn Marino     }
129e4b17023SJohn Marino   else if (tclass == tcc_type)
130e4b17023SJohn Marino     {
131e4b17023SJohn Marino       if (TYPE_NAME (node))
132e4b17023SJohn Marino 	{
133e4b17023SJohn Marino 	  if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
134e4b17023SJohn Marino 	    fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
135e4b17023SJohn Marino 	  else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
136e4b17023SJohn Marino 		   && DECL_NAME (TYPE_NAME (node)))
137e4b17023SJohn Marino 	    fprintf (file, " %s",
138e4b17023SJohn Marino 		     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
139e4b17023SJohn Marino 	}
140e4b17023SJohn Marino       if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
141e4b17023SJohn Marino 	fprintf (file, " address-space-%d", TYPE_ADDR_SPACE (node));
142e4b17023SJohn Marino     }
143e4b17023SJohn Marino   if (TREE_CODE (node) == IDENTIFIER_NODE)
144e4b17023SJohn Marino     fprintf (file, " %s", IDENTIFIER_POINTER (node));
145e4b17023SJohn Marino 
146e4b17023SJohn Marino   /* We might as well always print the value of an integer or real.  */
147e4b17023SJohn Marino   if (TREE_CODE (node) == INTEGER_CST)
148e4b17023SJohn Marino     {
149e4b17023SJohn Marino       if (TREE_OVERFLOW (node))
150e4b17023SJohn Marino 	fprintf (file, " overflow");
151e4b17023SJohn Marino 
152e4b17023SJohn Marino       fprintf (file, " ");
153e4b17023SJohn Marino       if (TREE_INT_CST_HIGH (node) == 0)
154e4b17023SJohn Marino 	fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, TREE_INT_CST_LOW (node));
155e4b17023SJohn Marino       else if (TREE_INT_CST_HIGH (node) == -1
156e4b17023SJohn Marino 	       && TREE_INT_CST_LOW (node) != 0)
157e4b17023SJohn Marino 	fprintf (file, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
158e4b17023SJohn Marino 		 -TREE_INT_CST_LOW (node));
159e4b17023SJohn Marino       else
160e4b17023SJohn Marino 	fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
161e4b17023SJohn Marino 		 (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (node),
162e4b17023SJohn Marino 		 (unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (node));
163e4b17023SJohn Marino     }
164e4b17023SJohn Marino   if (TREE_CODE (node) == REAL_CST)
165e4b17023SJohn Marino     {
166e4b17023SJohn Marino       REAL_VALUE_TYPE d;
167e4b17023SJohn Marino 
168e4b17023SJohn Marino       if (TREE_OVERFLOW (node))
169e4b17023SJohn Marino 	fprintf (file, " overflow");
170e4b17023SJohn Marino 
171e4b17023SJohn Marino       d = TREE_REAL_CST (node);
172e4b17023SJohn Marino       if (REAL_VALUE_ISINF (d))
173e4b17023SJohn Marino 	fprintf (file,  REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
174e4b17023SJohn Marino       else if (REAL_VALUE_ISNAN (d))
175e4b17023SJohn Marino 	fprintf (file, " Nan");
176e4b17023SJohn Marino       else
177e4b17023SJohn Marino 	{
178e4b17023SJohn Marino 	  char string[60];
179e4b17023SJohn Marino 	  real_to_decimal (string, &d, sizeof (string), 0, 1);
180e4b17023SJohn Marino 	  fprintf (file, " %s", string);
181e4b17023SJohn Marino 	}
182e4b17023SJohn Marino     }
183e4b17023SJohn Marino   if (TREE_CODE (node) == FIXED_CST)
184e4b17023SJohn Marino     {
185e4b17023SJohn Marino       FIXED_VALUE_TYPE f;
186e4b17023SJohn Marino       char string[60];
187e4b17023SJohn Marino 
188e4b17023SJohn Marino       if (TREE_OVERFLOW (node))
189e4b17023SJohn Marino 	fprintf (file, " overflow");
190e4b17023SJohn Marino 
191e4b17023SJohn Marino       f = TREE_FIXED_CST (node);
192e4b17023SJohn Marino       fixed_to_decimal (string, &f, sizeof (string));
193e4b17023SJohn Marino       fprintf (file, " %s", string);
194e4b17023SJohn Marino     }
195e4b17023SJohn Marino 
196e4b17023SJohn Marino   fprintf (file, ">");
197e4b17023SJohn Marino }
198e4b17023SJohn Marino 
199e4b17023SJohn Marino void
indent_to(FILE * file,int column)200e4b17023SJohn Marino indent_to (FILE *file, int column)
201e4b17023SJohn Marino {
202e4b17023SJohn Marino   int i;
203e4b17023SJohn Marino 
204e4b17023SJohn Marino   /* Since this is the long way, indent to desired column.  */
205e4b17023SJohn Marino   if (column > 0)
206e4b17023SJohn Marino     fprintf (file, "\n");
207e4b17023SJohn Marino   for (i = 0; i < column; i++)
208e4b17023SJohn Marino     fprintf (file, " ");
209e4b17023SJohn Marino }
210e4b17023SJohn Marino 
211e4b17023SJohn Marino /* Print the node NODE in full on file FILE, preceded by PREFIX,
212e4b17023SJohn Marino    starting in column INDENT.  */
213e4b17023SJohn Marino 
214e4b17023SJohn Marino void
print_node(FILE * file,const char * prefix,tree node,int indent)215e4b17023SJohn Marino print_node (FILE *file, const char *prefix, tree node, int indent)
216e4b17023SJohn Marino {
217e4b17023SJohn Marino   int hash;
218e4b17023SJohn Marino   struct bucket *b;
219e4b17023SJohn Marino   enum machine_mode mode;
220e4b17023SJohn Marino   enum tree_code_class tclass;
221e4b17023SJohn Marino   int len;
222e4b17023SJohn Marino   int i;
223e4b17023SJohn Marino   expanded_location xloc;
224e4b17023SJohn Marino   enum tree_code code;
225e4b17023SJohn Marino 
226e4b17023SJohn Marino   if (node == 0)
227e4b17023SJohn Marino     return;
228e4b17023SJohn Marino 
229e4b17023SJohn Marino   code = TREE_CODE (node);
230e4b17023SJohn Marino   tclass = TREE_CODE_CLASS (code);
231e4b17023SJohn Marino 
232e4b17023SJohn Marino   /* Don't get too deep in nesting.  If the user wants to see deeper,
233e4b17023SJohn Marino      it is easy to use the address of a lowest-level node
234e4b17023SJohn Marino      as an argument in another call to debug_tree.  */
235e4b17023SJohn Marino 
236e4b17023SJohn Marino   if (indent > 24)
237e4b17023SJohn Marino     {
238e4b17023SJohn Marino       print_node_brief (file, prefix, node, indent);
239e4b17023SJohn Marino       return;
240e4b17023SJohn Marino     }
241e4b17023SJohn Marino 
242e4b17023SJohn Marino   if (indent > 8 && (tclass == tcc_type || tclass == tcc_declaration))
243e4b17023SJohn Marino     {
244e4b17023SJohn Marino       print_node_brief (file, prefix, node, indent);
245e4b17023SJohn Marino       return;
246e4b17023SJohn Marino     }
247e4b17023SJohn Marino 
248e4b17023SJohn Marino   /* It is unsafe to look at any other fields of an ERROR_MARK node.  */
249e4b17023SJohn Marino   if (code == ERROR_MARK)
250e4b17023SJohn Marino     {
251e4b17023SJohn Marino       print_node_brief (file, prefix, node, indent);
252e4b17023SJohn Marino       return;
253e4b17023SJohn Marino     }
254e4b17023SJohn Marino 
255e4b17023SJohn Marino   /* Allow this function to be called if the table is not there.  */
256e4b17023SJohn Marino   if (table)
257e4b17023SJohn Marino     {
258*5ce9237cSJohn Marino       hash = ((uintptr_t) node) % HASH_SIZE;
259e4b17023SJohn Marino 
260e4b17023SJohn Marino       /* If node is in the table, just mention its address.  */
261e4b17023SJohn Marino       for (b = table[hash]; b; b = b->next)
262e4b17023SJohn Marino 	if (b->node == node)
263e4b17023SJohn Marino 	  {
264e4b17023SJohn Marino 	    print_node_brief (file, prefix, node, indent);
265e4b17023SJohn Marino 	    return;
266e4b17023SJohn Marino 	  }
267e4b17023SJohn Marino 
268e4b17023SJohn Marino       /* Add this node to the table.  */
269e4b17023SJohn Marino       b = XNEW (struct bucket);
270e4b17023SJohn Marino       b->node = node;
271e4b17023SJohn Marino       b->next = table[hash];
272e4b17023SJohn Marino       table[hash] = b;
273e4b17023SJohn Marino     }
274e4b17023SJohn Marino 
275e4b17023SJohn Marino   /* Indent to the specified column, since this is the long form.  */
276e4b17023SJohn Marino   indent_to (file, indent);
277e4b17023SJohn Marino 
278e4b17023SJohn Marino   /* Print the slot this node is in, and its code, and address.  */
279e4b17023SJohn Marino   fprintf (file, "%s <%s", prefix, tree_code_name[(int) code]);
280e4b17023SJohn Marino   dump_addr (file, " ", node);
281e4b17023SJohn Marino 
282e4b17023SJohn Marino   /* Print the name, if any.  */
283e4b17023SJohn Marino   if (tclass == tcc_declaration)
284e4b17023SJohn Marino     {
285e4b17023SJohn Marino       if (DECL_NAME (node))
286e4b17023SJohn Marino 	fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
287e4b17023SJohn Marino       else if (code == LABEL_DECL
288e4b17023SJohn Marino 	       && LABEL_DECL_UID (node) != -1)
289e4b17023SJohn Marino 	{
290e4b17023SJohn Marino 	  if (dump_flags & TDF_NOUID)
291e4b17023SJohn Marino 	    fprintf (file, " L.xxxx");
292e4b17023SJohn Marino 	  else
293e4b17023SJohn Marino 	    fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
294e4b17023SJohn Marino 	}
295e4b17023SJohn Marino       else
296e4b17023SJohn Marino 	{
297e4b17023SJohn Marino 	  if (dump_flags & TDF_NOUID)
298e4b17023SJohn Marino 	    fprintf (file, " %c.xxxx", code == CONST_DECL ? 'C' : 'D');
299e4b17023SJohn Marino 	  else
300e4b17023SJohn Marino 	    fprintf (file, " %c.%u", code == CONST_DECL ? 'C' : 'D',
301e4b17023SJohn Marino 		     DECL_UID (node));
302e4b17023SJohn Marino 	}
303e4b17023SJohn Marino     }
304e4b17023SJohn Marino   else if (tclass == tcc_type)
305e4b17023SJohn Marino     {
306e4b17023SJohn Marino       if (TYPE_NAME (node))
307e4b17023SJohn Marino 	{
308e4b17023SJohn Marino 	  if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
309e4b17023SJohn Marino 	    fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
310e4b17023SJohn Marino 	  else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
311e4b17023SJohn Marino 		   && DECL_NAME (TYPE_NAME (node)))
312e4b17023SJohn Marino 	    fprintf (file, " %s",
313e4b17023SJohn Marino 		     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
314e4b17023SJohn Marino 	}
315e4b17023SJohn Marino     }
316e4b17023SJohn Marino   if (code == IDENTIFIER_NODE)
317e4b17023SJohn Marino     fprintf (file, " %s", IDENTIFIER_POINTER (node));
318e4b17023SJohn Marino 
319e4b17023SJohn Marino   if (code == INTEGER_CST)
320e4b17023SJohn Marino     {
321e4b17023SJohn Marino       if (indent <= 4)
322e4b17023SJohn Marino 	print_node_brief (file, "type", TREE_TYPE (node), indent + 4);
323e4b17023SJohn Marino     }
324e4b17023SJohn Marino   else if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
325e4b17023SJohn Marino     {
326e4b17023SJohn Marino       print_node (file, "type", TREE_TYPE (node), indent + 4);
327e4b17023SJohn Marino       if (TREE_TYPE (node))
328e4b17023SJohn Marino 	indent_to (file, indent + 3);
329e4b17023SJohn Marino     }
330e4b17023SJohn Marino 
331e4b17023SJohn Marino   if (!TYPE_P (node) && TREE_SIDE_EFFECTS (node))
332e4b17023SJohn Marino     fputs (" side-effects", file);
333e4b17023SJohn Marino 
334e4b17023SJohn Marino   if (TYPE_P (node) ? TYPE_READONLY (node) : TREE_READONLY (node))
335e4b17023SJohn Marino     fputs (" readonly", file);
336e4b17023SJohn Marino   if (!TYPE_P (node) && TREE_CONSTANT (node))
337e4b17023SJohn Marino     fputs (" constant", file);
338e4b17023SJohn Marino   else if (TYPE_P (node) && TYPE_SIZES_GIMPLIFIED (node))
339e4b17023SJohn Marino     fputs (" sizes-gimplified", file);
340e4b17023SJohn Marino 
341e4b17023SJohn Marino   if (TYPE_P (node) && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
342e4b17023SJohn Marino     fprintf (file, " address-space-%d", TYPE_ADDR_SPACE (node));
343e4b17023SJohn Marino 
344e4b17023SJohn Marino   if (TREE_ADDRESSABLE (node))
345e4b17023SJohn Marino     fputs (" addressable", file);
346e4b17023SJohn Marino   if (TREE_THIS_VOLATILE (node))
347e4b17023SJohn Marino     fputs (" volatile", file);
348e4b17023SJohn Marino   if (TREE_ASM_WRITTEN (node))
349e4b17023SJohn Marino     fputs (" asm_written", file);
350e4b17023SJohn Marino   if (TREE_USED (node))
351e4b17023SJohn Marino     fputs (" used", file);
352e4b17023SJohn Marino   if (TREE_NOTHROW (node))
353e4b17023SJohn Marino     fputs (TYPE_P (node) ? " align-ok" : " nothrow", file);
354e4b17023SJohn Marino   if (TREE_PUBLIC (node))
355e4b17023SJohn Marino     fputs (" public", file);
356e4b17023SJohn Marino   if (TREE_PRIVATE (node))
357e4b17023SJohn Marino     fputs (" private", file);
358e4b17023SJohn Marino   if (TREE_PROTECTED (node))
359e4b17023SJohn Marino     fputs (" protected", file);
360e4b17023SJohn Marino   if (TREE_STATIC (node))
361e4b17023SJohn Marino     fputs (" static", file);
362e4b17023SJohn Marino   if (TREE_DEPRECATED (node))
363e4b17023SJohn Marino     fputs (" deprecated", file);
364e4b17023SJohn Marino   if (TREE_VISITED (node))
365e4b17023SJohn Marino     fputs (" visited", file);
366e4b17023SJohn Marino   if (TREE_LANG_FLAG_0 (node))
367e4b17023SJohn Marino     fputs (" tree_0", file);
368e4b17023SJohn Marino   if (TREE_LANG_FLAG_1 (node))
369e4b17023SJohn Marino     fputs (" tree_1", file);
370e4b17023SJohn Marino   if (TREE_LANG_FLAG_2 (node))
371e4b17023SJohn Marino     fputs (" tree_2", file);
372e4b17023SJohn Marino   if (TREE_LANG_FLAG_3 (node))
373e4b17023SJohn Marino     fputs (" tree_3", file);
374e4b17023SJohn Marino   if (TREE_LANG_FLAG_4 (node))
375e4b17023SJohn Marino     fputs (" tree_4", file);
376e4b17023SJohn Marino   if (TREE_LANG_FLAG_5 (node))
377e4b17023SJohn Marino     fputs (" tree_5", file);
378e4b17023SJohn Marino   if (TREE_LANG_FLAG_6 (node))
379e4b17023SJohn Marino     fputs (" tree_6", file);
380e4b17023SJohn Marino 
381e4b17023SJohn Marino   /* DECL_ nodes have additional attributes.  */
382e4b17023SJohn Marino 
383e4b17023SJohn Marino   switch (TREE_CODE_CLASS (code))
384e4b17023SJohn Marino     {
385e4b17023SJohn Marino     case tcc_declaration:
386e4b17023SJohn Marino       if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
387e4b17023SJohn Marino 	{
388e4b17023SJohn Marino 	  if (DECL_UNSIGNED (node))
389e4b17023SJohn Marino 	    fputs (" unsigned", file);
390e4b17023SJohn Marino 	  if (DECL_IGNORED_P (node))
391e4b17023SJohn Marino 	    fputs (" ignored", file);
392e4b17023SJohn Marino 	  if (DECL_ABSTRACT (node))
393e4b17023SJohn Marino 	    fputs (" abstract", file);
394e4b17023SJohn Marino 	  if (DECL_EXTERNAL (node))
395e4b17023SJohn Marino 	    fputs (" external", file);
396e4b17023SJohn Marino 	  if (DECL_NONLOCAL (node))
397e4b17023SJohn Marino 	    fputs (" nonlocal", file);
398e4b17023SJohn Marino 	}
399e4b17023SJohn Marino       if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
400e4b17023SJohn Marino 	{
401e4b17023SJohn Marino 	  if (DECL_WEAK (node))
402e4b17023SJohn Marino 	    fputs (" weak", file);
403e4b17023SJohn Marino 	  if (DECL_IN_SYSTEM_HEADER (node))
404e4b17023SJohn Marino 	    fputs (" in_system_header", file);
405e4b17023SJohn Marino 	}
406e4b17023SJohn Marino       if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL)
407e4b17023SJohn Marino 	  && code != LABEL_DECL
408e4b17023SJohn Marino 	  && code != FUNCTION_DECL
409e4b17023SJohn Marino 	  && DECL_REGISTER (node))
410e4b17023SJohn Marino 	fputs (" regdecl", file);
411e4b17023SJohn Marino 
412e4b17023SJohn Marino       if (code == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node))
413e4b17023SJohn Marino 	fputs (" suppress-debug", file);
414e4b17023SJohn Marino 
415e4b17023SJohn Marino       if (code == FUNCTION_DECL
416e4b17023SJohn Marino 	  && DECL_FUNCTION_SPECIFIC_TARGET (node))
417e4b17023SJohn Marino 	fputs (" function-specific-target", file);
418e4b17023SJohn Marino       if (code == FUNCTION_DECL
419e4b17023SJohn Marino 	  && DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node))
420e4b17023SJohn Marino 	fputs (" function-specific-opt", file);
421e4b17023SJohn Marino       if (code == FUNCTION_DECL && DECL_DECLARED_INLINE_P (node))
422e4b17023SJohn Marino 	fputs (" autoinline", file);
423e4b17023SJohn Marino       if (code == FUNCTION_DECL && DECL_BUILT_IN (node))
424e4b17023SJohn Marino 	fputs (" built-in", file);
425e4b17023SJohn Marino       if (code == FUNCTION_DECL && DECL_STATIC_CHAIN (node))
426e4b17023SJohn Marino 	fputs (" static-chain", file);
427e4b17023SJohn Marino       if (TREE_CODE (node) == FUNCTION_DECL && decl_is_tm_clone (node))
428e4b17023SJohn Marino 	fputs (" tm-clone", file);
429e4b17023SJohn Marino 
430e4b17023SJohn Marino       if (code == FIELD_DECL && DECL_PACKED (node))
431e4b17023SJohn Marino 	fputs (" packed", file);
432e4b17023SJohn Marino       if (code == FIELD_DECL && DECL_BIT_FIELD (node))
433e4b17023SJohn Marino 	fputs (" bit-field", file);
434e4b17023SJohn Marino       if (code == FIELD_DECL && DECL_NONADDRESSABLE_P (node))
435e4b17023SJohn Marino 	fputs (" nonaddressable", file);
436e4b17023SJohn Marino 
437e4b17023SJohn Marino       if (code == LABEL_DECL && DECL_ERROR_ISSUED (node))
438e4b17023SJohn Marino 	fputs (" error-issued", file);
439e4b17023SJohn Marino       if (code == LABEL_DECL && EH_LANDING_PAD_NR (node))
440e4b17023SJohn Marino 	fprintf (file, " landing-pad:%d", EH_LANDING_PAD_NR (node));
441e4b17023SJohn Marino 
442e4b17023SJohn Marino       if (code == VAR_DECL && DECL_IN_TEXT_SECTION (node))
443e4b17023SJohn Marino 	fputs (" in-text-section", file);
444e4b17023SJohn Marino       if (code == VAR_DECL && DECL_IN_CONSTANT_POOL (node))
445e4b17023SJohn Marino 	fputs (" in-constant-pool", file);
446e4b17023SJohn Marino       if (code == VAR_DECL && DECL_COMMON (node))
447e4b17023SJohn Marino 	fputs (" common", file);
448e4b17023SJohn Marino       if (code == VAR_DECL && DECL_THREAD_LOCAL_P (node))
449e4b17023SJohn Marino 	{
450e4b17023SJohn Marino 	  enum tls_model kind = DECL_TLS_MODEL (node);
451e4b17023SJohn Marino 	  switch (kind)
452e4b17023SJohn Marino 	    {
453e4b17023SJohn Marino 	      case TLS_MODEL_GLOBAL_DYNAMIC:
454e4b17023SJohn Marino 		fputs (" tls-global-dynamic", file);
455e4b17023SJohn Marino 		break;
456e4b17023SJohn Marino 	      case TLS_MODEL_LOCAL_DYNAMIC:
457e4b17023SJohn Marino 		fputs (" tls-local-dynamic", file);
458e4b17023SJohn Marino 		break;
459e4b17023SJohn Marino 	      case TLS_MODEL_INITIAL_EXEC:
460e4b17023SJohn Marino 		fputs (" tls-initial-exec", file);
461e4b17023SJohn Marino 		break;
462e4b17023SJohn Marino 	      case TLS_MODEL_LOCAL_EXEC:
463e4b17023SJohn Marino 		fputs (" tls-local-exec", file);
464e4b17023SJohn Marino 		break;
465e4b17023SJohn Marino 	      default:
466e4b17023SJohn Marino 		gcc_unreachable ();
467e4b17023SJohn Marino 	    }
468e4b17023SJohn Marino 	}
469e4b17023SJohn Marino 
470e4b17023SJohn Marino       if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
471e4b17023SJohn Marino 	{
472e4b17023SJohn Marino 	  if (DECL_VIRTUAL_P (node))
473e4b17023SJohn Marino 	    fputs (" virtual", file);
474e4b17023SJohn Marino 	  if (DECL_PRESERVE_P (node))
475e4b17023SJohn Marino 	    fputs (" preserve", file);
476e4b17023SJohn Marino 	  if (DECL_LANG_FLAG_0 (node))
477e4b17023SJohn Marino 	    fputs (" decl_0", file);
478e4b17023SJohn Marino 	  if (DECL_LANG_FLAG_1 (node))
479e4b17023SJohn Marino 	    fputs (" decl_1", file);
480e4b17023SJohn Marino 	  if (DECL_LANG_FLAG_2 (node))
481e4b17023SJohn Marino 	    fputs (" decl_2", file);
482e4b17023SJohn Marino 	  if (DECL_LANG_FLAG_3 (node))
483e4b17023SJohn Marino 	    fputs (" decl_3", file);
484e4b17023SJohn Marino 	  if (DECL_LANG_FLAG_4 (node))
485e4b17023SJohn Marino 	    fputs (" decl_4", file);
486e4b17023SJohn Marino 	  if (DECL_LANG_FLAG_5 (node))
487e4b17023SJohn Marino 	    fputs (" decl_5", file);
488e4b17023SJohn Marino 	  if (DECL_LANG_FLAG_6 (node))
489e4b17023SJohn Marino 	    fputs (" decl_6", file);
490e4b17023SJohn Marino 	  if (DECL_LANG_FLAG_7 (node))
491e4b17023SJohn Marino 	    fputs (" decl_7", file);
492e4b17023SJohn Marino 
493e4b17023SJohn Marino 	  mode = DECL_MODE (node);
494e4b17023SJohn Marino 	  fprintf (file, " %s", GET_MODE_NAME (mode));
495e4b17023SJohn Marino 	}
496e4b17023SJohn Marino 
497e4b17023SJohn Marino       if ((code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL)
498e4b17023SJohn Marino 	  && DECL_BY_REFERENCE (node))
499e4b17023SJohn Marino 	fputs (" passed-by-reference", file);
500e4b17023SJohn Marino 
501e4b17023SJohn Marino       if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)  && DECL_DEFER_OUTPUT (node))
502e4b17023SJohn Marino 	fputs (" defer-output", file);
503e4b17023SJohn Marino 
504e4b17023SJohn Marino 
505e4b17023SJohn Marino       xloc = expand_location (DECL_SOURCE_LOCATION (node));
506e4b17023SJohn Marino       fprintf (file, " file %s line %d col %d", xloc.file, xloc.line,
507e4b17023SJohn Marino 	       xloc.column);
508e4b17023SJohn Marino 
509e4b17023SJohn Marino       if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
510e4b17023SJohn Marino 	{
511e4b17023SJohn Marino 	  print_node (file, "size", DECL_SIZE (node), indent + 4);
512e4b17023SJohn Marino 	  print_node (file, "unit size", DECL_SIZE_UNIT (node), indent + 4);
513e4b17023SJohn Marino 
514e4b17023SJohn Marino 	  if (code != FUNCTION_DECL || DECL_BUILT_IN (node))
515e4b17023SJohn Marino 	    indent_to (file, indent + 3);
516e4b17023SJohn Marino 
517e4b17023SJohn Marino 	  if (DECL_USER_ALIGN (node))
518e4b17023SJohn Marino 	    fprintf (file, " user");
519e4b17023SJohn Marino 
520e4b17023SJohn Marino 	  fprintf (file, " align %d", DECL_ALIGN (node));
521e4b17023SJohn Marino 	  if (code == FIELD_DECL)
522e4b17023SJohn Marino 	    fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED,
523e4b17023SJohn Marino 		     DECL_OFFSET_ALIGN (node));
524e4b17023SJohn Marino 
525e4b17023SJohn Marino 	  if (code == FUNCTION_DECL && DECL_BUILT_IN (node))
526e4b17023SJohn Marino 	    {
527e4b17023SJohn Marino 	      if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD)
528e4b17023SJohn Marino 		fprintf (file, " built-in BUILT_IN_MD %d", DECL_FUNCTION_CODE (node));
529e4b17023SJohn Marino 	      else
530e4b17023SJohn Marino 		fprintf (file, " built-in %s:%s",
531e4b17023SJohn Marino 			 built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)],
532e4b17023SJohn Marino 			 built_in_names[(int) DECL_FUNCTION_CODE (node)]);
533e4b17023SJohn Marino 	    }
534e4b17023SJohn Marino 	}
535e4b17023SJohn Marino       if (code == FIELD_DECL)
536e4b17023SJohn Marino 	{
537e4b17023SJohn Marino 	  print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4);
538e4b17023SJohn Marino 	  print_node (file, "bit offset", DECL_FIELD_BIT_OFFSET (node),
539e4b17023SJohn Marino 		      indent + 4);
540e4b17023SJohn Marino 	  if (DECL_BIT_FIELD_TYPE (node))
541e4b17023SJohn Marino 	    print_node (file, "bit_field_type", DECL_BIT_FIELD_TYPE (node),
542e4b17023SJohn Marino 			indent + 4);
543e4b17023SJohn Marino 	}
544e4b17023SJohn Marino 
545e4b17023SJohn Marino       print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4);
546e4b17023SJohn Marino 
547e4b17023SJohn Marino       if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
548e4b17023SJohn Marino 	{
549e4b17023SJohn Marino 	  print_node_brief (file, "attributes",
550e4b17023SJohn Marino 			    DECL_ATTRIBUTES (node), indent + 4);
551e4b17023SJohn Marino 	  if (code != PARM_DECL)
552e4b17023SJohn Marino 	    print_node_brief (file, "initial", DECL_INITIAL (node),
553e4b17023SJohn Marino 			      indent + 4);
554e4b17023SJohn Marino 	}
555e4b17023SJohn Marino       if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
556e4b17023SJohn Marino 	{
557e4b17023SJohn Marino 	  print_node_brief (file, "abstract_origin",
558e4b17023SJohn Marino 			    DECL_ABSTRACT_ORIGIN (node), indent + 4);
559e4b17023SJohn Marino 	}
560e4b17023SJohn Marino       if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
561e4b17023SJohn Marino 	{
562e4b17023SJohn Marino 	  print_node (file, "arguments", DECL_ARGUMENT_FLD (node), indent + 4);
563e4b17023SJohn Marino 	  print_node (file, "result", DECL_RESULT_FLD (node), indent + 4);
564e4b17023SJohn Marino 	}
565e4b17023SJohn Marino 
566e4b17023SJohn Marino       lang_hooks.print_decl (file, node, indent);
567e4b17023SJohn Marino 
568e4b17023SJohn Marino       if (DECL_RTL_SET_P (node))
569e4b17023SJohn Marino 	{
570e4b17023SJohn Marino 	  indent_to (file, indent + 4);
571e4b17023SJohn Marino 	  print_rtl (file, DECL_RTL (node));
572e4b17023SJohn Marino 	}
573e4b17023SJohn Marino 
574e4b17023SJohn Marino       if (code == PARM_DECL)
575e4b17023SJohn Marino 	{
576e4b17023SJohn Marino 	  print_node (file, "arg-type", DECL_ARG_TYPE (node), indent + 4);
577e4b17023SJohn Marino 
578e4b17023SJohn Marino 	  if (DECL_INCOMING_RTL (node) != 0)
579e4b17023SJohn Marino 	    {
580e4b17023SJohn Marino 	      indent_to (file, indent + 4);
581e4b17023SJohn Marino 	      fprintf (file, "incoming-rtl ");
582e4b17023SJohn Marino 	      print_rtl (file, DECL_INCOMING_RTL (node));
583e4b17023SJohn Marino 	    }
584e4b17023SJohn Marino 	}
585e4b17023SJohn Marino       else if (code == FUNCTION_DECL
586e4b17023SJohn Marino 	       && DECL_STRUCT_FUNCTION (node) != 0)
587e4b17023SJohn Marino 	{
588e4b17023SJohn Marino 	  indent_to (file, indent + 4);
589e4b17023SJohn Marino 	  dump_addr (file, "struct-function ", DECL_STRUCT_FUNCTION (node));
590e4b17023SJohn Marino 	}
591e4b17023SJohn Marino 
592e4b17023SJohn Marino       if ((code == VAR_DECL || code == PARM_DECL)
593e4b17023SJohn Marino 	  && DECL_HAS_VALUE_EXPR_P (node))
594e4b17023SJohn Marino 	print_node (file, "value-expr", DECL_VALUE_EXPR (node), indent + 4);
595e4b17023SJohn Marino 
596e4b17023SJohn Marino       /* Print the decl chain only if decl is at second level.  */
597e4b17023SJohn Marino       if (indent == 4)
598e4b17023SJohn Marino 	print_node (file, "chain", TREE_CHAIN (node), indent + 4);
599e4b17023SJohn Marino       else
600e4b17023SJohn Marino 	print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
601e4b17023SJohn Marino       break;
602e4b17023SJohn Marino 
603e4b17023SJohn Marino     case tcc_type:
604e4b17023SJohn Marino       if (TYPE_UNSIGNED (node))
605e4b17023SJohn Marino 	fputs (" unsigned", file);
606e4b17023SJohn Marino 
607e4b17023SJohn Marino       /* The no-force-blk flag is used for different things in
608e4b17023SJohn Marino 	 different types.  */
609e4b17023SJohn Marino       if ((code == RECORD_TYPE
610e4b17023SJohn Marino 	   || code == UNION_TYPE
611e4b17023SJohn Marino 	   || code == QUAL_UNION_TYPE)
612e4b17023SJohn Marino 	  && TYPE_NO_FORCE_BLK (node))
613e4b17023SJohn Marino 	fputs (" no-force-blk", file);
614e4b17023SJohn Marino       else if (code == INTEGER_TYPE
615e4b17023SJohn Marino 	       && TYPE_IS_SIZETYPE (node))
616e4b17023SJohn Marino 	fputs (" sizetype", file);
617e4b17023SJohn Marino 
618e4b17023SJohn Marino       if (TYPE_STRING_FLAG (node))
619e4b17023SJohn Marino 	fputs (" string-flag", file);
620e4b17023SJohn Marino       if (TYPE_NEEDS_CONSTRUCTING (node))
621e4b17023SJohn Marino 	fputs (" needs-constructing", file);
622e4b17023SJohn Marino 
623e4b17023SJohn Marino       /* The transparent-union flag is used for different things in
624e4b17023SJohn Marino 	 different nodes.  */
625e4b17023SJohn Marino       if ((code == UNION_TYPE || code == RECORD_TYPE)
626e4b17023SJohn Marino 	  && TYPE_TRANSPARENT_AGGR (node))
627e4b17023SJohn Marino 	fputs (" transparent-aggr", file);
628e4b17023SJohn Marino       else if (code == ARRAY_TYPE
629e4b17023SJohn Marino 	       && TYPE_NONALIASED_COMPONENT (node))
630e4b17023SJohn Marino 	fputs (" nonaliased-component", file);
631e4b17023SJohn Marino 
632e4b17023SJohn Marino       if (TYPE_PACKED (node))
633e4b17023SJohn Marino 	fputs (" packed", file);
634e4b17023SJohn Marino 
635e4b17023SJohn Marino       if (TYPE_RESTRICT (node))
636e4b17023SJohn Marino 	fputs (" restrict", file);
637e4b17023SJohn Marino 
638e4b17023SJohn Marino       if (TYPE_LANG_FLAG_0 (node))
639e4b17023SJohn Marino 	fputs (" type_0", file);
640e4b17023SJohn Marino       if (TYPE_LANG_FLAG_1 (node))
641e4b17023SJohn Marino 	fputs (" type_1", file);
642e4b17023SJohn Marino       if (TYPE_LANG_FLAG_2 (node))
643e4b17023SJohn Marino 	fputs (" type_2", file);
644e4b17023SJohn Marino       if (TYPE_LANG_FLAG_3 (node))
645e4b17023SJohn Marino 	fputs (" type_3", file);
646e4b17023SJohn Marino       if (TYPE_LANG_FLAG_4 (node))
647e4b17023SJohn Marino 	fputs (" type_4", file);
648e4b17023SJohn Marino       if (TYPE_LANG_FLAG_5 (node))
649e4b17023SJohn Marino 	fputs (" type_5", file);
650e4b17023SJohn Marino       if (TYPE_LANG_FLAG_6 (node))
651e4b17023SJohn Marino 	fputs (" type_6", file);
652e4b17023SJohn Marino 
653e4b17023SJohn Marino       mode = TYPE_MODE (node);
654e4b17023SJohn Marino       fprintf (file, " %s", GET_MODE_NAME (mode));
655e4b17023SJohn Marino 
656e4b17023SJohn Marino       print_node (file, "size", TYPE_SIZE (node), indent + 4);
657e4b17023SJohn Marino       print_node (file, "unit size", TYPE_SIZE_UNIT (node), indent + 4);
658e4b17023SJohn Marino       indent_to (file, indent + 3);
659e4b17023SJohn Marino 
660e4b17023SJohn Marino       if (TYPE_USER_ALIGN (node))
661e4b17023SJohn Marino 	fprintf (file, " user");
662e4b17023SJohn Marino 
663e4b17023SJohn Marino       fprintf (file, " align %d symtab %d alias set " HOST_WIDE_INT_PRINT_DEC,
664e4b17023SJohn Marino 	       TYPE_ALIGN (node), TYPE_SYMTAB_ADDRESS (node),
665e4b17023SJohn Marino 	       (HOST_WIDE_INT) TYPE_ALIAS_SET (node));
666e4b17023SJohn Marino 
667e4b17023SJohn Marino       if (TYPE_STRUCTURAL_EQUALITY_P (node))
668e4b17023SJohn Marino 	fprintf (file, " structural equality");
669e4b17023SJohn Marino       else
670e4b17023SJohn Marino 	dump_addr (file, " canonical type ", TYPE_CANONICAL (node));
671e4b17023SJohn Marino 
672e4b17023SJohn Marino       print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4);
673e4b17023SJohn Marino 
674e4b17023SJohn Marino       if (INTEGRAL_TYPE_P (node) || code == REAL_TYPE
675e4b17023SJohn Marino 	  || code == FIXED_POINT_TYPE)
676e4b17023SJohn Marino 	{
677e4b17023SJohn Marino 	  fprintf (file, " precision %d", TYPE_PRECISION (node));
678e4b17023SJohn Marino 	  print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4);
679e4b17023SJohn Marino 	  print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4);
680e4b17023SJohn Marino 	}
681e4b17023SJohn Marino 
682e4b17023SJohn Marino       if (code == ENUMERAL_TYPE)
683e4b17023SJohn Marino 	print_node (file, "values", TYPE_VALUES (node), indent + 4);
684e4b17023SJohn Marino       else if (code == ARRAY_TYPE)
685e4b17023SJohn Marino 	print_node (file, "domain", TYPE_DOMAIN (node), indent + 4);
686e4b17023SJohn Marino       else if (code == VECTOR_TYPE)
687e4b17023SJohn Marino 	fprintf (file, " nunits %d", (int) TYPE_VECTOR_SUBPARTS (node));
688e4b17023SJohn Marino       else if (code == RECORD_TYPE
689e4b17023SJohn Marino 	       || code == UNION_TYPE
690e4b17023SJohn Marino 	       || code == QUAL_UNION_TYPE)
691e4b17023SJohn Marino 	print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
692e4b17023SJohn Marino       else if (code == FUNCTION_TYPE
693e4b17023SJohn Marino 	       || code == METHOD_TYPE)
694e4b17023SJohn Marino 	{
695e4b17023SJohn Marino 	  if (TYPE_METHOD_BASETYPE (node))
696e4b17023SJohn Marino 	    print_node_brief (file, "method basetype",
697e4b17023SJohn Marino 			      TYPE_METHOD_BASETYPE (node), indent + 4);
698e4b17023SJohn Marino 	  print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
699e4b17023SJohn Marino 	}
700e4b17023SJohn Marino       else if (code == OFFSET_TYPE)
701e4b17023SJohn Marino 	print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node),
702e4b17023SJohn Marino 			  indent + 4);
703e4b17023SJohn Marino 
704e4b17023SJohn Marino       if (TYPE_CONTEXT (node))
705e4b17023SJohn Marino 	print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);
706e4b17023SJohn Marino 
707e4b17023SJohn Marino       lang_hooks.print_type (file, node, indent);
708e4b17023SJohn Marino 
709e4b17023SJohn Marino       if (TYPE_POINTER_TO (node) || TREE_CHAIN (node))
710e4b17023SJohn Marino 	indent_to (file, indent + 3);
711e4b17023SJohn Marino 
712e4b17023SJohn Marino       print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node),
713e4b17023SJohn Marino 			indent + 4);
714e4b17023SJohn Marino       print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node),
715e4b17023SJohn Marino 			indent + 4);
716e4b17023SJohn Marino       print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
717e4b17023SJohn Marino       break;
718e4b17023SJohn Marino 
719e4b17023SJohn Marino     case tcc_expression:
720e4b17023SJohn Marino     case tcc_comparison:
721e4b17023SJohn Marino     case tcc_unary:
722e4b17023SJohn Marino     case tcc_binary:
723e4b17023SJohn Marino     case tcc_reference:
724e4b17023SJohn Marino     case tcc_statement:
725e4b17023SJohn Marino     case tcc_vl_exp:
726e4b17023SJohn Marino       if (code == BIND_EXPR)
727e4b17023SJohn Marino 	{
728e4b17023SJohn Marino 	  print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
729e4b17023SJohn Marino 	  print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
730e4b17023SJohn Marino 	  print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
731e4b17023SJohn Marino 	  break;
732e4b17023SJohn Marino 	}
733e4b17023SJohn Marino       if (code == CALL_EXPR)
734e4b17023SJohn Marino 	{
735e4b17023SJohn Marino 	  call_expr_arg_iterator iter;
736e4b17023SJohn Marino 	  tree arg;
737e4b17023SJohn Marino 	  print_node (file, "fn", CALL_EXPR_FN (node), indent + 4);
738e4b17023SJohn Marino 	  print_node (file, "static_chain", CALL_EXPR_STATIC_CHAIN (node),
739e4b17023SJohn Marino 		      indent + 4);
740e4b17023SJohn Marino 	  i = 0;
741e4b17023SJohn Marino 	  FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
742e4b17023SJohn Marino 	    {
743e4b17023SJohn Marino 	      char temp[10];
744e4b17023SJohn Marino 	      sprintf (temp, "arg %d", i);
745e4b17023SJohn Marino 	      print_node (file, temp, arg, indent + 4);
746e4b17023SJohn Marino 	      i++;
747e4b17023SJohn Marino 	    }
748e4b17023SJohn Marino 	}
749e4b17023SJohn Marino       else
750e4b17023SJohn Marino 	{
751e4b17023SJohn Marino 	  len = TREE_OPERAND_LENGTH (node);
752e4b17023SJohn Marino 
753e4b17023SJohn Marino 	  for (i = 0; i < len; i++)
754e4b17023SJohn Marino 	    {
755e4b17023SJohn Marino 	      char temp[10];
756e4b17023SJohn Marino 
757e4b17023SJohn Marino 	      sprintf (temp, "arg %d", i);
758e4b17023SJohn Marino 	      print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
759e4b17023SJohn Marino 	    }
760e4b17023SJohn Marino 	}
761e4b17023SJohn Marino       if (CODE_CONTAINS_STRUCT (code, TS_COMMON))
762e4b17023SJohn Marino 	print_node (file, "chain", TREE_CHAIN (node), indent + 4);
763e4b17023SJohn Marino       break;
764e4b17023SJohn Marino 
765e4b17023SJohn Marino     case tcc_constant:
766e4b17023SJohn Marino     case tcc_exceptional:
767e4b17023SJohn Marino       switch (code)
768e4b17023SJohn Marino 	{
769e4b17023SJohn Marino 	case INTEGER_CST:
770e4b17023SJohn Marino 	  if (TREE_OVERFLOW (node))
771e4b17023SJohn Marino 	    fprintf (file, " overflow");
772e4b17023SJohn Marino 
773e4b17023SJohn Marino 	  fprintf (file, " ");
774e4b17023SJohn Marino 	  if (TREE_INT_CST_HIGH (node) == 0)
775e4b17023SJohn Marino 	    fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
776e4b17023SJohn Marino 		     TREE_INT_CST_LOW (node));
777e4b17023SJohn Marino 	  else if (TREE_INT_CST_HIGH (node) == -1
778e4b17023SJohn Marino 		   && TREE_INT_CST_LOW (node) != 0)
779e4b17023SJohn Marino 	    fprintf (file, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
780e4b17023SJohn Marino 		     -TREE_INT_CST_LOW (node));
781e4b17023SJohn Marino 	  else
782e4b17023SJohn Marino 	    fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
783e4b17023SJohn Marino 		     (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (node),
784e4b17023SJohn Marino 		     (unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (node));
785e4b17023SJohn Marino 	  break;
786e4b17023SJohn Marino 
787e4b17023SJohn Marino 	case REAL_CST:
788e4b17023SJohn Marino 	  {
789e4b17023SJohn Marino 	    REAL_VALUE_TYPE d;
790e4b17023SJohn Marino 
791e4b17023SJohn Marino 	    if (TREE_OVERFLOW (node))
792e4b17023SJohn Marino 	      fprintf (file, " overflow");
793e4b17023SJohn Marino 
794e4b17023SJohn Marino 	    d = TREE_REAL_CST (node);
795e4b17023SJohn Marino 	    if (REAL_VALUE_ISINF (d))
796e4b17023SJohn Marino 	      fprintf (file,  REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
797e4b17023SJohn Marino 	    else if (REAL_VALUE_ISNAN (d))
798e4b17023SJohn Marino 	      fprintf (file, " Nan");
799e4b17023SJohn Marino 	    else
800e4b17023SJohn Marino 	      {
801e4b17023SJohn Marino 		char string[64];
802e4b17023SJohn Marino 		real_to_decimal (string, &d, sizeof (string), 0, 1);
803e4b17023SJohn Marino 		fprintf (file, " %s", string);
804e4b17023SJohn Marino 	      }
805e4b17023SJohn Marino 	  }
806e4b17023SJohn Marino 	  break;
807e4b17023SJohn Marino 
808e4b17023SJohn Marino 	case FIXED_CST:
809e4b17023SJohn Marino 	  {
810e4b17023SJohn Marino 	    FIXED_VALUE_TYPE f;
811e4b17023SJohn Marino 	    char string[64];
812e4b17023SJohn Marino 
813e4b17023SJohn Marino 	    if (TREE_OVERFLOW (node))
814e4b17023SJohn Marino 	      fprintf (file, " overflow");
815e4b17023SJohn Marino 
816e4b17023SJohn Marino 	    f = TREE_FIXED_CST (node);
817e4b17023SJohn Marino 	    fixed_to_decimal (string, &f, sizeof (string));
818e4b17023SJohn Marino 	    fprintf (file, " %s", string);
819e4b17023SJohn Marino 	  }
820e4b17023SJohn Marino 	  break;
821e4b17023SJohn Marino 
822e4b17023SJohn Marino 	case VECTOR_CST:
823e4b17023SJohn Marino 	  {
824e4b17023SJohn Marino 	    tree vals = TREE_VECTOR_CST_ELTS (node);
825e4b17023SJohn Marino 	    char buf[10];
826e4b17023SJohn Marino 	    tree link;
827e4b17023SJohn Marino 	    int i;
828e4b17023SJohn Marino 
829e4b17023SJohn Marino 	    i = 0;
830e4b17023SJohn Marino 	    for (link = vals; link; link = TREE_CHAIN (link), ++i)
831e4b17023SJohn Marino 	      {
832e4b17023SJohn Marino 		sprintf (buf, "elt%d: ", i);
833e4b17023SJohn Marino 		print_node (file, buf, TREE_VALUE (link), indent + 4);
834e4b17023SJohn Marino 	      }
835e4b17023SJohn Marino 	  }
836e4b17023SJohn Marino 	  break;
837e4b17023SJohn Marino 
838e4b17023SJohn Marino 	case COMPLEX_CST:
839e4b17023SJohn Marino 	  print_node (file, "real", TREE_REALPART (node), indent + 4);
840e4b17023SJohn Marino 	  print_node (file, "imag", TREE_IMAGPART (node), indent + 4);
841e4b17023SJohn Marino 	  break;
842e4b17023SJohn Marino 
843e4b17023SJohn Marino 	case STRING_CST:
844e4b17023SJohn Marino 	  {
845e4b17023SJohn Marino 	    const char *p = TREE_STRING_POINTER (node);
846e4b17023SJohn Marino 	    int i = TREE_STRING_LENGTH (node);
847e4b17023SJohn Marino 	    fputs (" \"", file);
848e4b17023SJohn Marino 	    while (--i >= 0)
849e4b17023SJohn Marino 	      {
850e4b17023SJohn Marino 		char ch = *p++;
851e4b17023SJohn Marino 		if (ch >= ' ' && ch < 127)
852e4b17023SJohn Marino 		  putc (ch, file);
853e4b17023SJohn Marino 		else
854e4b17023SJohn Marino 		  fprintf(file, "\\%03o", ch & 0xFF);
855e4b17023SJohn Marino 	      }
856e4b17023SJohn Marino 	    fputc ('\"', file);
857e4b17023SJohn Marino 	  }
858e4b17023SJohn Marino 	  break;
859e4b17023SJohn Marino 
860e4b17023SJohn Marino 	case IDENTIFIER_NODE:
861e4b17023SJohn Marino 	  lang_hooks.print_identifier (file, node, indent);
862e4b17023SJohn Marino 	  break;
863e4b17023SJohn Marino 
864e4b17023SJohn Marino 	case TREE_LIST:
865e4b17023SJohn Marino 	  print_node (file, "purpose", TREE_PURPOSE (node), indent + 4);
866e4b17023SJohn Marino 	  print_node (file, "value", TREE_VALUE (node), indent + 4);
867e4b17023SJohn Marino 	  print_node (file, "chain", TREE_CHAIN (node), indent + 4);
868e4b17023SJohn Marino 	  break;
869e4b17023SJohn Marino 
870e4b17023SJohn Marino 	case TREE_VEC:
871e4b17023SJohn Marino 	  len = TREE_VEC_LENGTH (node);
872e4b17023SJohn Marino 	  for (i = 0; i < len; i++)
873e4b17023SJohn Marino 	    if (TREE_VEC_ELT (node, i))
874e4b17023SJohn Marino 	      {
875e4b17023SJohn Marino 		char temp[10];
876e4b17023SJohn Marino 		sprintf (temp, "elt %d", i);
877e4b17023SJohn Marino 		print_node (file, temp, TREE_VEC_ELT (node, i), indent + 4);
878e4b17023SJohn Marino 	      }
879e4b17023SJohn Marino 	  break;
880e4b17023SJohn Marino 
881e4b17023SJohn Marino 	case CONSTRUCTOR:
882e4b17023SJohn Marino 	  {
883e4b17023SJohn Marino 	    unsigned HOST_WIDE_INT cnt;
884e4b17023SJohn Marino 	    tree index, value;
885e4b17023SJohn Marino 	    len = VEC_length (constructor_elt, CONSTRUCTOR_ELTS (node));
886e4b17023SJohn Marino 	    fprintf (file, " lngt %d", len);
887e4b17023SJohn Marino 	    FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (node),
888e4b17023SJohn Marino 				      cnt, index, value)
889e4b17023SJohn Marino 	      {
890e4b17023SJohn Marino 		print_node (file, "idx", index, indent + 4);
891e4b17023SJohn Marino 		print_node (file, "val", value, indent + 4);
892e4b17023SJohn Marino 	      }
893e4b17023SJohn Marino 	  }
894e4b17023SJohn Marino 	  break;
895e4b17023SJohn Marino 
896e4b17023SJohn Marino     	case STATEMENT_LIST:
897e4b17023SJohn Marino 	  dump_addr (file, " head ", node->stmt_list.head);
898e4b17023SJohn Marino 	  dump_addr (file, " tail ", node->stmt_list.tail);
899e4b17023SJohn Marino 	  fprintf (file, " stmts");
900e4b17023SJohn Marino 	  {
901e4b17023SJohn Marino 	    tree_stmt_iterator i;
902e4b17023SJohn Marino 	    for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i))
903e4b17023SJohn Marino 	      {
904e4b17023SJohn Marino 		/* Not printing the addresses of the (not-a-tree)
905e4b17023SJohn Marino 		   'struct tree_stmt_list_node's.  */
906e4b17023SJohn Marino 		dump_addr (file, " ", tsi_stmt (i));
907e4b17023SJohn Marino 	      }
908e4b17023SJohn Marino 	    fprintf (file, "\n");
909e4b17023SJohn Marino 	    for (i = tsi_start (node); !tsi_end_p (i); tsi_next (&i))
910e4b17023SJohn Marino 	      {
911e4b17023SJohn Marino 		/* Not printing the addresses of the (not-a-tree)
912e4b17023SJohn Marino 		   'struct tree_stmt_list_node's.  */
913e4b17023SJohn Marino 		print_node (file, "stmt", tsi_stmt (i), indent + 4);
914e4b17023SJohn Marino 	      }
915e4b17023SJohn Marino 	  }
916e4b17023SJohn Marino 	  break;
917e4b17023SJohn Marino 
918e4b17023SJohn Marino 	case BLOCK:
919e4b17023SJohn Marino 	  print_node (file, "vars", BLOCK_VARS (node), indent + 4);
920e4b17023SJohn Marino 	  print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node),
921e4b17023SJohn Marino 		      indent + 4);
922e4b17023SJohn Marino 	  print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
923e4b17023SJohn Marino 	  print_node (file, "chain", BLOCK_CHAIN (node), indent + 4);
924e4b17023SJohn Marino 	  print_node (file, "abstract_origin",
925e4b17023SJohn Marino 		      BLOCK_ABSTRACT_ORIGIN (node), indent + 4);
926e4b17023SJohn Marino 	  break;
927e4b17023SJohn Marino 
928e4b17023SJohn Marino 	case SSA_NAME:
929e4b17023SJohn Marino 	  print_node_brief (file, "var", SSA_NAME_VAR (node), indent + 4);
930e4b17023SJohn Marino 	  fprintf (file, "def_stmt ");
931e4b17023SJohn Marino 	  print_gimple_stmt (file, SSA_NAME_DEF_STMT (node), indent + 4, 0);
932e4b17023SJohn Marino 
933e4b17023SJohn Marino 	  indent_to (file, indent + 4);
934e4b17023SJohn Marino 	  fprintf (file, "version %u", SSA_NAME_VERSION (node));
935e4b17023SJohn Marino 	  if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (node))
936e4b17023SJohn Marino 	    fprintf (file, " in-abnormal-phi");
937e4b17023SJohn Marino 	  if (SSA_NAME_IN_FREE_LIST (node))
938e4b17023SJohn Marino 	    fprintf (file, " in-free-list");
939e4b17023SJohn Marino 
940e4b17023SJohn Marino 	  if (SSA_NAME_PTR_INFO (node))
941e4b17023SJohn Marino 	    {
942e4b17023SJohn Marino 	      indent_to (file, indent + 3);
943e4b17023SJohn Marino 	      if (SSA_NAME_PTR_INFO (node))
944e4b17023SJohn Marino 		dump_addr (file, " ptr-info ", SSA_NAME_PTR_INFO (node));
945e4b17023SJohn Marino 	    }
946e4b17023SJohn Marino 	  break;
947e4b17023SJohn Marino 
948e4b17023SJohn Marino 	case OMP_CLAUSE:
949e4b17023SJohn Marino 	    {
950e4b17023SJohn Marino 	      int i;
951e4b17023SJohn Marino 	      fprintf (file, " %s",
952e4b17023SJohn Marino 		       omp_clause_code_name[OMP_CLAUSE_CODE (node)]);
953e4b17023SJohn Marino 	      for (i = 0; i < omp_clause_num_ops[OMP_CLAUSE_CODE (node)]; i++)
954e4b17023SJohn Marino 		{
955e4b17023SJohn Marino 		  indent_to (file, indent + 4);
956e4b17023SJohn Marino 		  fprintf (file, "op %d:", i);
957e4b17023SJohn Marino 		  print_node_brief (file, "", OMP_CLAUSE_OPERAND (node, i), 0);
958e4b17023SJohn Marino 		}
959e4b17023SJohn Marino 	    }
960e4b17023SJohn Marino 	  break;
961e4b17023SJohn Marino 
962e4b17023SJohn Marino 	case OPTIMIZATION_NODE:
963e4b17023SJohn Marino 	  cl_optimization_print (file, indent + 4, TREE_OPTIMIZATION (node));
964e4b17023SJohn Marino 	  break;
965e4b17023SJohn Marino 
966e4b17023SJohn Marino 	case TARGET_OPTION_NODE:
967e4b17023SJohn Marino 	  cl_target_option_print (file, indent + 4, TREE_TARGET_OPTION (node));
968e4b17023SJohn Marino 	  break;
969e4b17023SJohn Marino 	case IMPORTED_DECL:
970e4b17023SJohn Marino 	  fprintf (file, " imported declaration");
971e4b17023SJohn Marino 	  print_node_brief (file, "associated declaration",
972e4b17023SJohn Marino 			    IMPORTED_DECL_ASSOCIATED_DECL (node),
973e4b17023SJohn Marino 			    indent + 4);
974e4b17023SJohn Marino 	  break;
975e4b17023SJohn Marino 
976e4b17023SJohn Marino 	default:
977e4b17023SJohn Marino 	  if (EXCEPTIONAL_CLASS_P (node))
978e4b17023SJohn Marino 	    lang_hooks.print_xnode (file, node, indent);
979e4b17023SJohn Marino 	  break;
980e4b17023SJohn Marino 	}
981e4b17023SJohn Marino 
982e4b17023SJohn Marino       break;
983e4b17023SJohn Marino     }
984e4b17023SJohn Marino 
985e4b17023SJohn Marino   if (EXPR_HAS_LOCATION (node))
986e4b17023SJohn Marino     {
987e4b17023SJohn Marino       expanded_location xloc = expand_location (EXPR_LOCATION (node));
988e4b17023SJohn Marino       indent_to (file, indent+4);
989e4b17023SJohn Marino       fprintf (file, "%s:%d:%d", xloc.file, xloc.line, xloc.column);
990e4b17023SJohn Marino     }
991e4b17023SJohn Marino 
992e4b17023SJohn Marino   fprintf (file, ">");
993e4b17023SJohn Marino }
994e4b17023SJohn Marino 
995e4b17023SJohn Marino /* Print the tree vector VEC in full on file FILE, preceded by PREFIX,
996e4b17023SJohn Marino    starting in column INDENT.  */
997e4b17023SJohn Marino 
998e4b17023SJohn Marino void
print_vec_tree(FILE * file,const char * prefix,VEC (tree,gc)* vec,int indent)999e4b17023SJohn Marino print_vec_tree (FILE *file, const char *prefix, VEC(tree,gc) *vec, int indent)
1000e4b17023SJohn Marino {
1001e4b17023SJohn Marino   tree elt;
1002e4b17023SJohn Marino   unsigned ix;
1003e4b17023SJohn Marino 
1004e4b17023SJohn Marino   /* Indent to the specified column, since this is the long form.  */
1005e4b17023SJohn Marino   indent_to (file, indent);
1006e4b17023SJohn Marino 
1007e4b17023SJohn Marino   /* Print the slot this node is in, and its code, and address.  */
1008e4b17023SJohn Marino   fprintf (file, "%s <VEC", prefix);
1009e4b17023SJohn Marino   dump_addr (file, " ", vec);
1010e4b17023SJohn Marino 
1011e4b17023SJohn Marino   FOR_EACH_VEC_ELT (tree, vec, ix, elt)
1012e4b17023SJohn Marino     {
1013e4b17023SJohn Marino       char temp[10];
1014e4b17023SJohn Marino       sprintf (temp, "elt %d", ix);
1015e4b17023SJohn Marino       print_node (file, temp, elt, indent + 4);
1016e4b17023SJohn Marino     }
1017e4b17023SJohn Marino }
1018