OSDN Git Service

* c-decl.c (finish_decl): When setting the DECL_ASSEMBLER_NAME
[pf3gnuchains/gcc-fork.git] / gcc / print-tree.c
1 /* Prints out tree in human readable form - GNU C-compiler
2    Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3    2001, 2002, 2003 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "tree.h"
28 #include "real.h"
29 #include "ggc.h"
30 #include "langhooks.h"
31
32 /* Define the hash table of nodes already seen.
33    Such nodes are not repeated; brief cross-references are used.  */
34
35 #define HASH_SIZE 37
36
37 struct bucket
38 {
39   tree node;
40   struct bucket *next;
41 };
42
43 static struct bucket **table;
44
45 /* Print the node NODE on standard error, for debugging.
46    Most nodes referred to by this one are printed recursively
47    down to a depth of six.  */
48
49 void
50 debug_tree (node)
51      tree node;
52 {
53   table = (struct bucket **) xcalloc (HASH_SIZE, sizeof (struct bucket *));
54   print_node (stderr, "", node, 0);
55   free (table);
56   table = 0;
57   putc ('\n', stderr);
58 }
59
60 /* Print a node in brief fashion, with just the code, address and name.  */
61
62 void
63 print_node_brief (file, prefix, node, indent)
64      FILE *file;
65      const char *prefix;
66      tree node;
67      int indent;
68 {
69   char class;
70
71   if (node == 0)
72     return;
73
74   class = TREE_CODE_CLASS (TREE_CODE (node));
75
76   /* Always print the slot this node is in, and its code, address and
77      name if any.  */
78   if (indent > 0)
79     fprintf (file, " ");
80   fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
81   fprintf (file, HOST_PTR_PRINTF, (char *) node);
82
83   if (class == 'd')
84     {
85       if (DECL_NAME (node))
86         fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
87     }
88   else if (class == 't')
89     {
90       if (TYPE_NAME (node))
91         {
92           if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
93             fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
94           else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
95                    && DECL_NAME (TYPE_NAME (node)))
96             fprintf (file, " %s",
97                      IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
98         }
99     }
100   if (TREE_CODE (node) == IDENTIFIER_NODE)
101     fprintf (file, " %s", IDENTIFIER_POINTER (node));
102
103   /* We might as well always print the value of an integer or real.  */
104   if (TREE_CODE (node) == INTEGER_CST)
105     {
106       if (TREE_CONSTANT_OVERFLOW (node))
107         fprintf (file, " overflow");
108
109       fprintf (file, " ");
110       if (TREE_INT_CST_HIGH (node) == 0)
111         fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, TREE_INT_CST_LOW (node));
112       else if (TREE_INT_CST_HIGH (node) == -1
113                && TREE_INT_CST_LOW (node) != 0)
114         fprintf (file, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
115                  -TREE_INT_CST_LOW (node));
116       else
117         fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
118                  TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
119     }
120   if (TREE_CODE (node) == REAL_CST)
121     {
122       REAL_VALUE_TYPE d;
123
124       if (TREE_OVERFLOW (node))
125         fprintf (file, " overflow");
126
127       d = TREE_REAL_CST (node);
128       if (REAL_VALUE_ISINF (d))
129         fprintf (file, " Inf");
130       else if (REAL_VALUE_ISNAN (d))
131         fprintf (file, " Nan");
132       else
133         {
134           char string[60];
135           real_to_decimal (string, &d, sizeof (string), 0, 1);
136           fprintf (file, " %s", string);
137         }
138     }
139
140   fprintf (file, ">");
141 }
142
143 void
144 indent_to (file, column)
145      FILE *file;
146      int column;
147 {
148   int i;
149
150   /* Since this is the long way, indent to desired column.  */
151   if (column > 0)
152     fprintf (file, "\n");
153   for (i = 0; i < column; i++)
154     fprintf (file, " ");
155 }
156 \f
157 /* Print the node NODE in full on file FILE, preceded by PREFIX,
158    starting in column INDENT.  */
159
160 void
161 print_node (file, prefix, node, indent)
162      FILE *file;
163      const char *prefix;
164      tree node;
165      int indent;
166 {
167   int hash;
168   struct bucket *b;
169   enum machine_mode mode;
170   char class;
171   int len;
172   int first_rtl;
173   int i;
174
175   if (node == 0)
176     return;
177
178   class = TREE_CODE_CLASS (TREE_CODE (node));
179
180   /* Don't get too deep in nesting.  If the user wants to see deeper,
181      it is easy to use the address of a lowest-level node
182      as an argument in another call to debug_tree.  */
183
184   if (indent > 24)
185     {
186       print_node_brief (file, prefix, node, indent);
187       return;
188     }
189
190   if (indent > 8 && (class == 't' || class == 'd'))
191     {
192       print_node_brief (file, prefix, node, indent);
193       return;
194     }
195
196   /* It is unsafe to look at any other fields of an ERROR_MARK node.  */
197   if (TREE_CODE (node) == ERROR_MARK)
198     {
199       print_node_brief (file, prefix, node, indent);
200       return;
201     }
202
203   hash = ((unsigned long) node) % HASH_SIZE;
204
205   /* If node is in the table, just mention its address.  */
206   for (b = table[hash]; b; b = b->next)
207     if (b->node == node)
208       {
209         print_node_brief (file, prefix, node, indent);
210         return;
211       }
212
213   /* Add this node to the table.  */
214   b = (struct bucket *) xmalloc (sizeof (struct bucket));
215   b->node = node;
216   b->next = table[hash];
217   table[hash] = b;
218
219   /* Indent to the specified column, since this is the long form.  */
220   indent_to (file, indent);
221
222   /* Print the slot this node is in, and its code, and address.  */
223   fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
224   fprintf (file, HOST_PTR_PRINTF, (char *) node);
225
226   /* Print the name, if any.  */
227   if (class == 'd')
228     {
229       if (DECL_NAME (node))
230         fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
231     }
232   else if (class == 't')
233     {
234       if (TYPE_NAME (node))
235         {
236           if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
237             fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
238           else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
239                    && DECL_NAME (TYPE_NAME (node)))
240             fprintf (file, " %s",
241                      IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
242         }
243     }
244   if (TREE_CODE (node) == IDENTIFIER_NODE)
245     fprintf (file, " %s", IDENTIFIER_POINTER (node));
246
247   if (TREE_CODE (node) == INTEGER_CST)
248     {
249       if (indent <= 4)
250         print_node_brief (file, "type", TREE_TYPE (node), indent + 4);
251     }
252   else
253     {
254       print_node (file, "type", TREE_TYPE (node), indent + 4);
255       if (TREE_TYPE (node))
256         indent_to (file, indent + 3);
257     }
258
259   if (TREE_SIDE_EFFECTS (node))
260     fputs (" side-effects", file);
261   if (TREE_READONLY (node))
262     fputs (" readonly", file);
263   if (TREE_CONSTANT (node))
264     fputs (" constant", file);
265   if (TREE_ADDRESSABLE (node))
266     fputs (" addressable", file);
267   if (TREE_THIS_VOLATILE (node))
268     fputs (" volatile", file);
269   if (TREE_UNSIGNED (node))
270     fputs (" unsigned", file);
271   if (TREE_ASM_WRITTEN (node))
272     fputs (" asm_written", file);
273   if (TREE_USED (node))
274     fputs (" used", file);
275   if (TREE_NOTHROW (node))
276     fputs (" nothrow", file);
277   if (TREE_PUBLIC (node))
278     fputs (" public", file);
279   if (TREE_PRIVATE (node))
280     fputs (" private", file);
281   if (TREE_PROTECTED (node))
282     fputs (" protected", file);
283   if (TREE_STATIC (node))
284     fputs (" static", file);
285   if (TREE_DEPRECATED (node))
286     fputs (" deprecated", file);
287   if (TREE_LANG_FLAG_0 (node))
288     fputs (" tree_0", file);
289   if (TREE_LANG_FLAG_1 (node))
290     fputs (" tree_1", file);
291   if (TREE_LANG_FLAG_2 (node))
292     fputs (" tree_2", file);
293   if (TREE_LANG_FLAG_3 (node))
294     fputs (" tree_3", file);
295   if (TREE_LANG_FLAG_4 (node))
296     fputs (" tree_4", file);
297   if (TREE_LANG_FLAG_5 (node))
298     fputs (" tree_5", file);
299   if (TREE_LANG_FLAG_6 (node))
300     fputs (" tree_6", file);
301
302   /* DECL_ nodes have additional attributes.  */
303
304   switch (TREE_CODE_CLASS (TREE_CODE (node)))
305     {
306     case 'd':
307       mode = DECL_MODE (node);
308
309       if (DECL_IGNORED_P (node))
310         fputs (" ignored", file);
311       if (DECL_ABSTRACT (node))
312         fputs (" abstract", file);
313       if (DECL_IN_SYSTEM_HEADER (node))
314         fputs (" in_system_header", file);
315       if (DECL_COMMON (node))
316         fputs (" common", file);
317       if (DECL_EXTERNAL (node))
318         fputs (" external", file);
319       if (DECL_WEAK (node))
320         fputs (" weak", file);
321       if (DECL_REGISTER (node) && TREE_CODE (node) != FIELD_DECL
322           && TREE_CODE (node) != FUNCTION_DECL
323           && TREE_CODE (node) != LABEL_DECL)
324         fputs (" regdecl", file);
325       if (DECL_NONLOCAL (node))
326         fputs (" nonlocal", file);
327
328       if (TREE_CODE (node) == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node))
329         fputs (" suppress-debug", file);
330
331       if (TREE_CODE (node) == FUNCTION_DECL && DID_INLINE_FUNC (node))
332         fputs (" autoinline", file);
333       else if (TREE_CODE (node) == FUNCTION_DECL && DECL_INLINE (node))
334         fputs (" inline", file);
335       if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN (node))
336         fputs (" built-in", file);
337       if (TREE_CODE (node) == FUNCTION_DECL && DECL_NO_STATIC_CHAIN (node))
338         fputs (" no-static-chain", file);
339
340       if (TREE_CODE (node) == FIELD_DECL && DECL_PACKED (node))
341         fputs (" packed", file);
342       if (TREE_CODE (node) == FIELD_DECL && DECL_BIT_FIELD (node))
343         fputs (" bit-field", file);
344       if (TREE_CODE (node) == FIELD_DECL && DECL_NONADDRESSABLE_P (node))
345         fputs (" nonaddressable", file);
346
347       if (TREE_CODE (node) == LABEL_DECL && DECL_TOO_LATE (node))
348         fputs (" too-late", file);
349       if (TREE_CODE (node) == LABEL_DECL && DECL_ERROR_ISSUED (node))
350         fputs (" error-issued", file);
351
352       if (TREE_CODE (node) == VAR_DECL && DECL_IN_TEXT_SECTION (node))
353         fputs (" in-text-section", file);
354       if (TREE_CODE (node) == VAR_DECL && DECL_THREAD_LOCAL (node))
355         fputs (" thread-local", file);
356
357       if (TREE_CODE (node) == PARM_DECL && DECL_TRANSPARENT_UNION (node))
358         fputs (" transparent-union", file);
359
360       if (DECL_VIRTUAL_P (node))
361         fputs (" virtual", file);
362       if (DECL_DEFER_OUTPUT (node))
363         fputs (" defer-output", file);
364
365       if (DECL_LANG_FLAG_0 (node))
366         fputs (" decl_0", file);
367       if (DECL_LANG_FLAG_1 (node))
368         fputs (" decl_1", file);
369       if (DECL_LANG_FLAG_2 (node))
370         fputs (" decl_2", file);
371       if (DECL_LANG_FLAG_3 (node))
372         fputs (" decl_3", file);
373       if (DECL_LANG_FLAG_4 (node))
374         fputs (" decl_4", file);
375       if (DECL_LANG_FLAG_5 (node))
376         fputs (" decl_5", file);
377       if (DECL_LANG_FLAG_6 (node))
378         fputs (" decl_6", file);
379       if (DECL_LANG_FLAG_7 (node))
380         fputs (" decl_7", file);
381
382       fprintf (file, " %s", GET_MODE_NAME (mode));
383       fprintf (file, " file %s line %d",
384                DECL_SOURCE_FILE (node), DECL_SOURCE_LINE (node));
385
386       print_node (file, "size", DECL_SIZE (node), indent + 4);
387       print_node (file, "unit size", DECL_SIZE_UNIT (node), indent + 4);
388
389       if (TREE_CODE (node) != FUNCTION_DECL
390           || DECL_INLINE (node) || DECL_BUILT_IN (node))
391         indent_to (file, indent + 3);
392
393       if (TREE_CODE (node) != FUNCTION_DECL)
394         {
395           if (DECL_USER_ALIGN (node))
396             fprintf (file, " user");
397
398           fprintf (file, " align %d", DECL_ALIGN (node));
399           if (TREE_CODE (node) == FIELD_DECL)
400             fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED,
401                      DECL_OFFSET_ALIGN (node));
402         }
403       else if (DECL_BUILT_IN (node))
404         {
405           if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD)
406             fprintf (file, " built-in BUILT_IN_MD %d", DECL_FUNCTION_CODE (node));
407           else
408             fprintf (file, " built-in %s:%s",
409                      built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)],
410                      built_in_names[(int) DECL_FUNCTION_CODE (node)]);
411         }
412
413       if (DECL_POINTER_ALIAS_SET_KNOWN_P (node))
414         fprintf (file, " alias set " HOST_WIDE_INT_PRINT_DEC,
415                  DECL_POINTER_ALIAS_SET (node));
416
417       if (TREE_CODE (node) == FIELD_DECL)
418         {
419           print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4);
420           print_node (file, "bit offset", DECL_FIELD_BIT_OFFSET (node),
421                       indent + 4);
422         }
423
424       print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4);
425       print_node_brief (file, "attributes",
426                         DECL_ATTRIBUTES (node), indent + 4);
427       print_node_brief (file, "abstract_origin",
428                         DECL_ABSTRACT_ORIGIN (node), indent + 4);
429
430       print_node (file, "arguments", DECL_ARGUMENTS (node), indent + 4);
431       print_node (file, "result", DECL_RESULT_FLD (node), indent + 4);
432       print_node_brief (file, "initial", DECL_INITIAL (node), indent + 4);
433
434       (*lang_hooks.print_decl) (file, node, indent);
435
436       if (DECL_RTL_SET_P (node))
437         {
438           indent_to (file, indent + 4);
439           print_rtl (file, DECL_RTL (node));
440         }
441
442       if (TREE_CODE (node) == PARM_DECL)
443         {
444           print_node (file, "arg-type", DECL_ARG_TYPE (node), indent + 4);
445           print_node (file, "arg-type-as-written",
446                       DECL_ARG_TYPE_AS_WRITTEN (node), indent + 4);
447
448           if (DECL_INCOMING_RTL (node) != 0)
449             {
450               indent_to (file, indent + 4);
451               fprintf (file, "incoming-rtl ");
452               print_rtl (file, DECL_INCOMING_RTL (node));
453             }
454         }
455       else if (TREE_CODE (node) == FUNCTION_DECL
456                && DECL_SAVED_INSNS (node) != 0)
457         {
458           indent_to (file, indent + 4);
459           fprintf (file, "saved-insns ");
460           fprintf (file, HOST_PTR_PRINTF, (char *) DECL_SAVED_INSNS (node));
461         }
462
463       /* Print the decl chain only if decl is at second level.  */
464       if (indent == 4)
465         print_node (file, "chain", TREE_CHAIN (node), indent + 4);
466       else
467         print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
468       break;
469
470     case 't':
471       /* The no-force-blk flag is used for different things in
472          different types.  */
473       if ((TREE_CODE (node) == RECORD_TYPE
474            || TREE_CODE (node) == UNION_TYPE
475            || TREE_CODE (node) == QUAL_UNION_TYPE)
476           && TYPE_NO_FORCE_BLK (node))
477         fputs (" no-force-blk", file);
478       else if (TREE_CODE (node) == INTEGER_TYPE
479                && TYPE_IS_SIZETYPE (node))
480         fputs (" sizetype", file);
481       else if (TREE_CODE (node) == FUNCTION_TYPE
482                && TYPE_RETURNS_STACK_DEPRESSED (node))
483         fputs (" returns-stack-depressed", file);
484
485       if (TYPE_STRING_FLAG (node))
486         fputs (" string-flag", file);
487       if (TYPE_NEEDS_CONSTRUCTING (node))
488         fputs (" needs-constructing", file);
489
490       /* The transparent-union flag is used for different things in
491          different nodes.  */
492       if (TREE_CODE (node) == UNION_TYPE && TYPE_TRANSPARENT_UNION (node))
493         fputs (" transparent-union", file);
494       else if (TREE_CODE (node) == ARRAY_TYPE
495                && TYPE_NONALIASED_COMPONENT (node))
496         fputs (" nonaliased-component", file);
497       else if (TREE_CODE (node) == FUNCTION_TYPE
498                && TYPE_AMBIENT_BOUNDEDNESS (node))
499         fputs (" ambient-boundedness", file);
500
501       if (TYPE_PACKED (node))
502         fputs (" packed", file);
503
504       if (TYPE_RESTRICT (node))
505         fputs (" restrict", file);
506
507       if (TYPE_LANG_FLAG_0 (node))
508         fputs (" type_0", file);
509       if (TYPE_LANG_FLAG_1 (node))
510         fputs (" type_1", file);
511       if (TYPE_LANG_FLAG_2 (node))
512         fputs (" type_2", file);
513       if (TYPE_LANG_FLAG_3 (node))
514         fputs (" type_3", file);
515       if (TYPE_LANG_FLAG_4 (node))
516         fputs (" type_4", file);
517       if (TYPE_LANG_FLAG_5 (node))
518         fputs (" type_5", file);
519       if (TYPE_LANG_FLAG_6 (node))
520         fputs (" type_6", file);
521
522       mode = TYPE_MODE (node);
523       fprintf (file, " %s", GET_MODE_NAME (mode));
524
525       print_node (file, "size", TYPE_SIZE (node), indent + 4);
526       print_node (file, "unit size", TYPE_SIZE_UNIT (node), indent + 4);
527       indent_to (file, indent + 3);
528
529       if (TYPE_USER_ALIGN (node))
530         fprintf (file, " user");
531
532       fprintf (file, " align %d symtab %d alias set " HOST_WIDE_INT_PRINT_DEC,
533                TYPE_ALIGN (node), TYPE_SYMTAB_ADDRESS (node),
534                TYPE_ALIAS_SET (node));
535
536       print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4);
537
538       if (INTEGRAL_TYPE_P (node) || TREE_CODE (node) == REAL_TYPE)
539         {
540           fprintf (file, " precision %d", TYPE_PRECISION (node));
541           print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4);
542           print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4);
543         }
544
545       if (TREE_CODE (node) == ENUMERAL_TYPE)
546         print_node (file, "values", TYPE_VALUES (node), indent + 4);
547       else if (TREE_CODE (node) == ARRAY_TYPE || TREE_CODE (node) == SET_TYPE)
548         print_node (file, "domain", TYPE_DOMAIN (node), indent + 4);
549       else if (TREE_CODE (node) == RECORD_TYPE
550                || TREE_CODE (node) == UNION_TYPE
551                || TREE_CODE (node) == QUAL_UNION_TYPE)
552         print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
553       else if (TREE_CODE (node) == FUNCTION_TYPE
554                || TREE_CODE (node) == METHOD_TYPE)
555         {
556           if (TYPE_METHOD_BASETYPE (node))
557             print_node_brief (file, "method basetype",
558                               TYPE_METHOD_BASETYPE (node), indent + 4);
559           print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
560         }
561       else if (TREE_CODE (node) == OFFSET_TYPE)
562         print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node),
563                           indent + 4);
564
565       if (TYPE_CONTEXT (node))
566         print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);
567
568       (*lang_hooks.print_type) (file, node, indent);
569
570       if (TYPE_POINTER_TO (node) || TREE_CHAIN (node))
571         indent_to (file, indent + 3);
572
573       print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node),
574                         indent + 4);
575       print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node),
576                         indent + 4);
577       print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
578       break;
579
580     case 'b':
581       print_node (file, "vars", BLOCK_VARS (node), indent + 4);
582       print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node), indent + 4);
583       print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
584       print_node (file, "chain", BLOCK_CHAIN (node), indent + 4);
585       print_node (file, "abstract_origin",
586                   BLOCK_ABSTRACT_ORIGIN (node), indent + 4);
587       break;
588
589     case 'e':
590     case '<':
591     case '1':
592     case '2':
593     case 'r':
594     case 's':
595       if (TREE_CODE (node) == BIND_EXPR)
596         {
597           print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
598           print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
599           print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
600           break;
601         }
602
603       len = TREE_CODE_LENGTH (TREE_CODE (node));
604
605       /* Some nodes contain rtx's, not trees,
606          after a certain point.  Print the rtx's as rtx's.  */
607       first_rtl = first_rtl_op (TREE_CODE (node));
608
609       for (i = 0; i < len; i++)
610         {
611           if (i >= first_rtl)
612             {
613               indent_to (file, indent + 4);
614               fprintf (file, "rtl %d ", i);
615               if (TREE_OPERAND (node, i))
616                 print_rtl (file, (struct rtx_def *) TREE_OPERAND (node, i));
617               else
618                 fprintf (file, "(nil)");
619               fprintf (file, "\n");
620             }
621           else
622             {
623               char temp[10];
624
625               sprintf (temp, "arg %d", i);
626               print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
627             }
628         }
629
630       if (TREE_CODE (node) == EXPR_WITH_FILE_LOCATION)
631         {
632           indent_to (file, indent+4);
633           fprintf (file, "%s:%d:%d",
634                    (EXPR_WFL_FILENAME_NODE (node ) ?
635                     EXPR_WFL_FILENAME (node) : "(no file info)"),
636                    EXPR_WFL_LINENO (node), EXPR_WFL_COLNO (node));
637         }
638       print_node (file, "chain", TREE_CHAIN (node), indent + 4);
639       break;
640
641     case 'c':
642     case 'x':
643       switch (TREE_CODE (node))
644         {
645         case INTEGER_CST:
646           if (TREE_CONSTANT_OVERFLOW (node))
647             fprintf (file, " overflow");
648
649           fprintf (file, " ");
650           if (TREE_INT_CST_HIGH (node) == 0)
651             fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
652                      TREE_INT_CST_LOW (node));
653           else if (TREE_INT_CST_HIGH (node) == -1
654                    && TREE_INT_CST_LOW (node) != 0)
655             fprintf (file, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
656                      -TREE_INT_CST_LOW (node));
657           else
658             fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
659                      TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
660           break;
661
662         case REAL_CST:
663           {
664             REAL_VALUE_TYPE d;
665
666             if (TREE_OVERFLOW (node))
667               fprintf (file, " overflow");
668
669             d = TREE_REAL_CST (node);
670             if (REAL_VALUE_ISINF (d))
671               fprintf (file, " Inf");
672             else if (REAL_VALUE_ISNAN (d))
673               fprintf (file, " Nan");
674             else
675               {
676                 char string[64];
677                 real_to_decimal (string, &d, sizeof (string), 0, 1);
678                 fprintf (file, " %s", string);
679               }
680           }
681           break;
682
683         case VECTOR_CST:
684           {
685             tree vals = TREE_VECTOR_CST_ELTS (node);
686             char buf[10];
687             tree link;
688             int i;
689
690             i = 0;
691             for (link = vals; link; link = TREE_CHAIN (link), ++i)
692               {
693                 sprintf (buf, "elt%d: ", i);
694                 print_node (file, buf, TREE_VALUE (link), indent + 4);
695               }
696           }
697           break;
698
699         case COMPLEX_CST:
700           print_node (file, "real", TREE_REALPART (node), indent + 4);
701           print_node (file, "imag", TREE_IMAGPART (node), indent + 4);
702           break;
703
704         case STRING_CST:
705           {
706             const char *p = TREE_STRING_POINTER (node);
707             int i = TREE_STRING_LENGTH (node);
708             fputs (" \"", file);
709             while (--i >= 0)
710               {
711                 char ch = *p++;
712                 if (ch >= ' ' && ch < 127)
713                   putc (ch, file);
714                 else
715                   fprintf(file, "\\%03o", ch & 0xFF);
716               }
717             fputc ('\"', file);
718           }
719           /* Print the chain at second level.  */
720           if (indent == 4)
721             print_node (file, "chain", TREE_CHAIN (node), indent + 4);
722           else
723             print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
724           break;
725
726         case IDENTIFIER_NODE:
727           (*lang_hooks.print_identifier) (file, node, indent);
728           break;
729
730         case TREE_LIST:
731           print_node (file, "purpose", TREE_PURPOSE (node), indent + 4);
732           print_node (file, "value", TREE_VALUE (node), indent + 4);
733           print_node (file, "chain", TREE_CHAIN (node), indent + 4);
734           break;
735
736         case TREE_VEC:
737           len = TREE_VEC_LENGTH (node);
738           for (i = 0; i < len; i++)
739             if (TREE_VEC_ELT (node, i))
740               {
741                 char temp[10];
742                 sprintf (temp, "elt %d", i);
743                 indent_to (file, indent + 4);
744                 print_node_brief (file, temp, TREE_VEC_ELT (node, i), 0);
745               }
746           break;
747
748         default:
749           if (TREE_CODE_CLASS (TREE_CODE (node)) == 'x')
750             (*lang_hooks.print_xnode) (file, node, indent);
751           break;
752         }
753
754       break;
755     }
756
757   fprintf (file, ">");
758 }