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