OSDN Git Service

* ltconfig (osf[345]): Append $major to soname_spec.
[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 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 "tree.h"
26 #include "real.h"
27 #include "ggc.h"
28 #include "langhooks.h"
29
30 /* Define the hash table of nodes already seen.
31    Such nodes are not repeated; brief cross-references are used.  */
32
33 #define HASH_SIZE 37
34
35 struct bucket
36 {
37   tree node;
38   struct bucket *next;
39 };
40
41 static struct bucket **table;
42
43 /* Print the node NODE on standard error, for debugging.
44    Most nodes referred to by this one are printed recursively
45    down to a depth of six.  */
46
47 void
48 debug_tree (node)
49      tree node;
50 {
51   table = (struct bucket **) xcalloc (HASH_SIZE, sizeof (struct bucket *));
52   print_node (stderr, "", node, 0);
53   table = 0;
54   fprintf (stderr, "\n");
55 }
56
57 /* Print a node in brief fashion, with just the code, address and name.  */
58
59 void
60 print_node_brief (file, prefix, node, indent)
61      FILE *file;
62      const char *prefix;
63      tree node;
64      int indent;
65 {
66   char class;
67
68   if (node == 0)
69     return;
70
71   class = TREE_CODE_CLASS (TREE_CODE (node));
72
73   /* Always print the slot this node is in, and its code, address and
74      name if any.  */
75   if (indent > 0)
76     fprintf (file, " ");
77   fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
78   fprintf (file, HOST_PTR_PRINTF, (char *) node);
79
80   if (class == 'd')
81     {
82       if (DECL_NAME (node))
83         fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
84     }
85   else if (class == 't')
86     {
87       if (TYPE_NAME (node))
88         {
89           if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
90             fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
91           else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
92                    && DECL_NAME (TYPE_NAME (node)))
93             fprintf (file, " %s",
94                      IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
95         }
96     }
97   if (TREE_CODE (node) == IDENTIFIER_NODE)
98     fprintf (file, " %s", IDENTIFIER_POINTER (node));
99
100   /* We might as well always print the value of an integer or real.  */
101   if (TREE_CODE (node) == INTEGER_CST)
102     {
103       if (TREE_CONSTANT_OVERFLOW (node))
104         fprintf (file, " overflow");
105
106       fprintf (file, " ");
107       if (TREE_INT_CST_HIGH (node) == 0)
108         fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED, TREE_INT_CST_LOW (node));
109       else if (TREE_INT_CST_HIGH (node) == -1
110                && TREE_INT_CST_LOW (node) != 0)
111         {
112           fprintf (file, "-");
113           fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
114                    -TREE_INT_CST_LOW (node));
115         }
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 filds 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 && DECL_INLINE (node))
332         fputs (" inline", file);
333       if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN (node))
334         fputs (" built-in", file);
335       if (TREE_CODE (node) == FUNCTION_DECL && DECL_BUILT_IN_NONANSI (node))
336         fputs (" built-in-nonansi", 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             {
401               fprintf (file, " offset_align ");
402               fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
403                        DECL_OFFSET_ALIGN (node));
404             }
405         }
406       else if (DECL_BUILT_IN (node))
407         {
408           if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD)
409             fprintf (file, " built-in BUILT_IN_MD %d", DECL_FUNCTION_CODE (node));
410           else
411             fprintf (file, " built-in %s:%s",
412                      built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)],
413                      built_in_names[(int) DECL_FUNCTION_CODE (node)]);
414         }
415
416       if (DECL_POINTER_ALIAS_SET_KNOWN_P (node))
417         {
418           fprintf (file, " alias set ");
419           fprintf (file, HOST_WIDE_INT_PRINT_DEC,
420                    DECL_POINTER_ALIAS_SET (node));
421         }
422
423       if (TREE_CODE (node) == FIELD_DECL)
424         {
425           print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4);
426           print_node (file, "bit offset", DECL_FIELD_BIT_OFFSET (node),
427                       indent + 4);
428         }
429
430       print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4);
431       print_node_brief (file, "attributes",
432                         DECL_ATTRIBUTES (node), indent + 4);
433       print_node_brief (file, "abstract_origin",
434                         DECL_ABSTRACT_ORIGIN (node), indent + 4);
435
436       print_node (file, "arguments", DECL_ARGUMENTS (node), indent + 4);
437       print_node (file, "result", DECL_RESULT_FLD (node), indent + 4);
438       print_node_brief (file, "initial", DECL_INITIAL (node), indent + 4);
439
440       (*lang_hooks.print_decl) (file, node, indent);
441
442       if (DECL_RTL_SET_P (node))
443         {
444           indent_to (file, indent + 4);
445           print_rtl (file, DECL_RTL (node));
446         }
447
448       if (TREE_CODE (node) == PARM_DECL)
449         {
450           print_node (file, "arg-type", DECL_ARG_TYPE (node), indent + 4);
451           print_node (file, "arg-type-as-written",
452                       DECL_ARG_TYPE_AS_WRITTEN (node), indent + 4);
453
454           if (DECL_INCOMING_RTL (node) != 0)
455             {
456               indent_to (file, indent + 4);
457               fprintf (file, "incoming-rtl ");
458               print_rtl (file, DECL_INCOMING_RTL (node));
459             }
460         }
461       else if (TREE_CODE (node) == FUNCTION_DECL
462                && DECL_SAVED_INSNS (node) != 0)
463         {
464           indent_to (file, indent + 4);
465           fprintf (file, "saved-insns ");
466           fprintf (file, HOST_PTR_PRINTF, (char *) DECL_SAVED_INSNS (node));
467         }
468
469       /* Print the decl chain only if decl is at second level.  */
470       if (indent == 4)
471         print_node (file, "chain", TREE_CHAIN (node), indent + 4);
472       else
473         print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
474       break;
475
476     case 't':
477       /* The no-force-blk flag is used for different things in
478          different types.  */
479       if ((TREE_CODE (node) == RECORD_TYPE
480            || TREE_CODE (node) == UNION_TYPE
481            || TREE_CODE (node) == QUAL_UNION_TYPE)
482           && TYPE_NO_FORCE_BLK (node))
483         fputs (" no-force-blk", file);
484       else if (TREE_CODE (node) == INTEGER_TYPE
485                && TYPE_IS_SIZETYPE (node))
486         fputs (" sizetype", file);
487       else if (TREE_CODE (node) == FUNCTION_TYPE
488                && TYPE_RETURNS_STACK_DEPRESSED (node))
489         fputs (" returns-stack-depressed", file);
490
491       if (TYPE_STRING_FLAG (node))
492         fputs (" string-flag", file);
493       if (TYPE_NEEDS_CONSTRUCTING (node))
494         fputs (" needs-constructing", file);
495
496       /* The transparent-union flag is used for different things in
497          different nodes.  */
498       if (TREE_CODE (node) == UNION_TYPE && TYPE_TRANSPARENT_UNION (node))
499         fputs (" transparent-union", file);
500       else if (TREE_CODE (node) == ARRAY_TYPE
501                && TYPE_NONALIASED_COMPONENT (node))
502         fputs (" nonaliased-component", file);
503       else if (TREE_CODE (node) == FUNCTION_TYPE
504                && TYPE_AMBIENT_BOUNDEDNESS (node))
505         fputs (" ambient-boundedness", file);
506
507       if (TYPE_PACKED (node))
508         fputs (" packed", file);
509
510       if (TYPE_RESTRICT (node))
511         fputs (" restrict", file);
512
513       if (TYPE_LANG_FLAG_0 (node))
514         fputs (" type_0", file);
515       if (TYPE_LANG_FLAG_1 (node))
516         fputs (" type_1", file);
517       if (TYPE_LANG_FLAG_2 (node))
518         fputs (" type_2", file);
519       if (TYPE_LANG_FLAG_3 (node))
520         fputs (" type_3", file);
521       if (TYPE_LANG_FLAG_4 (node))
522         fputs (" type_4", file);
523       if (TYPE_LANG_FLAG_5 (node))
524         fputs (" type_5", file);
525       if (TYPE_LANG_FLAG_6 (node))
526         fputs (" type_6", file);
527
528       mode = TYPE_MODE (node);
529       fprintf (file, " %s", GET_MODE_NAME (mode));
530
531       print_node (file, "size", TYPE_SIZE (node), indent + 4);
532       print_node (file, "unit size", TYPE_SIZE_UNIT (node), indent + 4);
533       indent_to (file, indent + 3);
534
535       if (TYPE_USER_ALIGN (node))
536         fprintf (file, " user");
537
538       fprintf (file, " align %d", TYPE_ALIGN (node));
539       fprintf (file, " symtab %d", TYPE_SYMTAB_ADDRESS (node));
540       fprintf (file, " alias set ");
541       fprintf (file, HOST_WIDE_INT_PRINT_DEC, TYPE_ALIAS_SET (node));
542
543       print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4);
544
545       if (INTEGRAL_TYPE_P (node) || TREE_CODE (node) == REAL_TYPE)
546         {
547           fprintf (file, " precision %d", TYPE_PRECISION (node));
548           print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4);
549           print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4);
550         }
551
552       if (TREE_CODE (node) == ENUMERAL_TYPE)
553         print_node (file, "values", TYPE_VALUES (node), indent + 4);
554       else if (TREE_CODE (node) == ARRAY_TYPE || TREE_CODE (node) == SET_TYPE)
555         print_node (file, "domain", TYPE_DOMAIN (node), indent + 4);
556       else if (TREE_CODE (node) == RECORD_TYPE
557                || TREE_CODE (node) == UNION_TYPE
558                || TREE_CODE (node) == QUAL_UNION_TYPE)
559         print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
560       else if (TREE_CODE (node) == FUNCTION_TYPE
561                || TREE_CODE (node) == METHOD_TYPE)
562         {
563           if (TYPE_METHOD_BASETYPE (node))
564             print_node_brief (file, "method basetype",
565                               TYPE_METHOD_BASETYPE (node), indent + 4);
566           print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
567         }
568       else if (TREE_CODE (node) == OFFSET_TYPE)
569         print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node),
570                           indent + 4);
571
572       if (TYPE_CONTEXT (node))
573         print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);
574
575       (*lang_hooks.print_type) (file, node, indent);
576
577       if (TYPE_POINTER_TO (node) || TREE_CHAIN (node))
578         indent_to (file, indent + 3);
579
580       print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node),
581                         indent + 4);
582       print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node),
583                         indent + 4);
584       print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
585       break;
586
587     case 'b':
588       print_node (file, "vars", BLOCK_VARS (node), indent + 4);
589       print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node), indent + 4);
590       print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
591       print_node (file, "chain", BLOCK_CHAIN (node), indent + 4);
592       print_node (file, "abstract_origin",
593                   BLOCK_ABSTRACT_ORIGIN (node), indent + 4);
594       break;
595
596     case 'e':
597     case '<':
598     case '1':
599     case '2':
600     case 'r':
601     case 's':
602       if (TREE_CODE (node) == BIND_EXPR)
603         {
604           print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
605           print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
606           print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
607           break;
608         }
609
610       len = TREE_CODE_LENGTH (TREE_CODE (node));
611
612       /* Some nodes contain rtx's, not trees,
613          after a certain point.  Print the rtx's as rtx's.  */
614       first_rtl = first_rtl_op (TREE_CODE (node));
615
616       for (i = 0; i < len; i++)
617         {
618           if (i >= first_rtl)
619             {
620               indent_to (file, indent + 4);
621               fprintf (file, "rtl %d ", i);
622               if (TREE_OPERAND (node, i))
623                 print_rtl (file, (struct rtx_def *) TREE_OPERAND (node, i));
624               else
625                 fprintf (file, "(nil)");
626               fprintf (file, "\n");
627             }
628           else
629             {
630               char temp[10];
631
632               sprintf (temp, "arg %d", i);
633               print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
634             }
635         }
636
637       if (TREE_CODE (node) == EXPR_WITH_FILE_LOCATION)
638         {
639           indent_to (file, indent+4);
640           fprintf (file, "%s:%d:%d",
641                    (EXPR_WFL_FILENAME_NODE (node ) ?
642                     EXPR_WFL_FILENAME (node) : "(no file info)"),
643                    EXPR_WFL_LINENO (node), EXPR_WFL_COLNO (node));
644         }
645       print_node (file, "chain", TREE_CHAIN (node), indent + 4);
646       break;
647
648     case 'c':
649     case 'x':
650       switch (TREE_CODE (node))
651         {
652         case INTEGER_CST:
653           if (TREE_CONSTANT_OVERFLOW (node))
654             fprintf (file, " overflow");
655
656           fprintf (file, " ");
657           if (TREE_INT_CST_HIGH (node) == 0)
658             fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
659                      TREE_INT_CST_LOW (node));
660           else if (TREE_INT_CST_HIGH (node) == -1
661                    && TREE_INT_CST_LOW (node) != 0)
662             {
663               fprintf (file, "-");
664               fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
665                        -TREE_INT_CST_LOW (node));
666             }
667           else
668             fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
669                      TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
670           break;
671
672         case REAL_CST:
673           {
674             REAL_VALUE_TYPE d;
675
676             if (TREE_OVERFLOW (node))
677               fprintf (file, " overflow");
678
679             d = TREE_REAL_CST (node);
680             if (REAL_VALUE_ISINF (d))
681               fprintf (file, " Inf");
682             else if (REAL_VALUE_ISNAN (d))
683               fprintf (file, " Nan");
684             else
685               {
686                 char string[64];
687                 real_to_decimal (string, &d, sizeof (string), 0, 1);
688                 fprintf (file, " %s", string);
689               }
690           }
691           break;
692
693         case VECTOR_CST:
694           {
695             tree vals = TREE_VECTOR_CST_ELTS (node);
696             char buf[10];
697             tree link;
698             int i;
699
700             i = 0;
701             for (link = vals; link; link = TREE_CHAIN (link), ++i)
702               {
703                 sprintf (buf, "elt%d: ", i);
704                 print_node (file, buf, TREE_VALUE (link), indent + 4);
705               }
706           }
707           break;
708
709         case COMPLEX_CST:
710           print_node (file, "real", TREE_REALPART (node), indent + 4);
711           print_node (file, "imag", TREE_IMAGPART (node), indent + 4);
712           break;
713
714         case STRING_CST:
715           {
716             const char *p = TREE_STRING_POINTER (node);
717             int i = TREE_STRING_LENGTH (node);
718             fputs (" \"", file);
719             while (--i >= 0)
720               {
721                 char ch = *p++;
722                 if (ch >= ' ' && ch < 127)
723                   putc (ch, file);
724                 else
725                   fprintf(file, "\\%03o", ch & 0xFF);
726               }
727             fputc ('\"', file);
728           }
729           /* Print the chain at second level.  */
730           if (indent == 4)
731             print_node (file, "chain", TREE_CHAIN (node), indent + 4);
732           else
733             print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
734           break;
735
736         case IDENTIFIER_NODE:
737           (*lang_hooks.print_identifier) (file, node, indent);
738           break;
739
740         case TREE_LIST:
741           print_node (file, "purpose", TREE_PURPOSE (node), indent + 4);
742           print_node (file, "value", TREE_VALUE (node), indent + 4);
743           print_node (file, "chain", TREE_CHAIN (node), indent + 4);
744           break;
745
746         case TREE_VEC:
747           len = TREE_VEC_LENGTH (node);
748           for (i = 0; i < len; i++)
749             if (TREE_VEC_ELT (node, i))
750               {
751                 char temp[10];
752                 sprintf (temp, "elt %d", i);
753                 indent_to (file, indent + 4);
754                 print_node_brief (file, temp, TREE_VEC_ELT (node, i), 0);
755               }
756           break;
757
758         default:
759           if (TREE_CODE_CLASS (TREE_CODE (node)) == 'x')
760             (*lang_hooks.print_xnode) (file, node, indent);
761           break;
762         }
763
764       break;
765     }
766
767   fprintf (file, ">");
768 }