OSDN Git Service

* calls.c (expand_call): Convert structure_value_addr to Pmode if
[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
498       if (TYPE_PACKED (node))
499         fputs (" packed", file);
500
501       if (TYPE_RESTRICT (node))
502         fputs (" restrict", file);
503
504       if (TYPE_LANG_FLAG_0 (node))
505         fputs (" type_0", file);
506       if (TYPE_LANG_FLAG_1 (node))
507         fputs (" type_1", file);
508       if (TYPE_LANG_FLAG_2 (node))
509         fputs (" type_2", file);
510       if (TYPE_LANG_FLAG_3 (node))
511         fputs (" type_3", file);
512       if (TYPE_LANG_FLAG_4 (node))
513         fputs (" type_4", file);
514       if (TYPE_LANG_FLAG_5 (node))
515         fputs (" type_5", file);
516       if (TYPE_LANG_FLAG_6 (node))
517         fputs (" type_6", file);
518
519       mode = TYPE_MODE (node);
520       fprintf (file, " %s", GET_MODE_NAME (mode));
521
522       print_node (file, "size", TYPE_SIZE (node), indent + 4);
523       print_node (file, "unit size", TYPE_SIZE_UNIT (node), indent + 4);
524       indent_to (file, indent + 3);
525
526       if (TYPE_USER_ALIGN (node))
527         fprintf (file, " user");
528
529       fprintf (file, " align %d symtab %d alias set " HOST_WIDE_INT_PRINT_DEC,
530                TYPE_ALIGN (node), TYPE_SYMTAB_ADDRESS (node),
531                TYPE_ALIAS_SET (node));
532
533       print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4);
534
535       if (INTEGRAL_TYPE_P (node) || TREE_CODE (node) == REAL_TYPE)
536         {
537           fprintf (file, " precision %d", TYPE_PRECISION (node));
538           print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4);
539           print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4);
540         }
541
542       if (TREE_CODE (node) == ENUMERAL_TYPE)
543         print_node (file, "values", TYPE_VALUES (node), indent + 4);
544       else if (TREE_CODE (node) == ARRAY_TYPE || TREE_CODE (node) == SET_TYPE)
545         print_node (file, "domain", TYPE_DOMAIN (node), indent + 4);
546       else if (TREE_CODE (node) == RECORD_TYPE
547                || TREE_CODE (node) == UNION_TYPE
548                || TREE_CODE (node) == QUAL_UNION_TYPE)
549         print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
550       else if (TREE_CODE (node) == FUNCTION_TYPE
551                || TREE_CODE (node) == METHOD_TYPE)
552         {
553           if (TYPE_METHOD_BASETYPE (node))
554             print_node_brief (file, "method basetype",
555                               TYPE_METHOD_BASETYPE (node), indent + 4);
556           print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
557         }
558       else if (TREE_CODE (node) == OFFSET_TYPE)
559         print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node),
560                           indent + 4);
561
562       if (TYPE_CONTEXT (node))
563         print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);
564
565       (*lang_hooks.print_type) (file, node, indent);
566
567       if (TYPE_POINTER_TO (node) || TREE_CHAIN (node))
568         indent_to (file, indent + 3);
569
570       print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node),
571                         indent + 4);
572       print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node),
573                         indent + 4);
574       print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
575       break;
576
577     case 'b':
578       print_node (file, "vars", BLOCK_VARS (node), indent + 4);
579       print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node), indent + 4);
580       print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
581       print_node (file, "chain", BLOCK_CHAIN (node), indent + 4);
582       print_node (file, "abstract_origin",
583                   BLOCK_ABSTRACT_ORIGIN (node), indent + 4);
584       break;
585
586     case 'e':
587     case '<':
588     case '1':
589     case '2':
590     case 'r':
591     case 's':
592       if (TREE_CODE (node) == BIND_EXPR)
593         {
594           print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
595           print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
596           print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
597           break;
598         }
599
600       len = TREE_CODE_LENGTH (TREE_CODE (node));
601
602       /* Some nodes contain rtx's, not trees,
603          after a certain point.  Print the rtx's as rtx's.  */
604       first_rtl = first_rtl_op (TREE_CODE (node));
605
606       for (i = 0; i < len; i++)
607         {
608           if (i >= first_rtl)
609             {
610               indent_to (file, indent + 4);
611               fprintf (file, "rtl %d ", i);
612               if (TREE_OPERAND (node, i))
613                 print_rtl (file, (struct rtx_def *) TREE_OPERAND (node, i));
614               else
615                 fprintf (file, "(nil)");
616               fprintf (file, "\n");
617             }
618           else
619             {
620               char temp[10];
621
622               sprintf (temp, "arg %d", i);
623               print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
624             }
625         }
626
627       if (TREE_CODE (node) == EXPR_WITH_FILE_LOCATION)
628         {
629           indent_to (file, indent+4);
630           fprintf (file, "%s:%d:%d",
631                    (EXPR_WFL_FILENAME_NODE (node ) ?
632                     EXPR_WFL_FILENAME (node) : "(no file info)"),
633                    EXPR_WFL_LINENO (node), EXPR_WFL_COLNO (node));
634         }
635       print_node (file, "chain", TREE_CHAIN (node), indent + 4);
636       break;
637
638     case 'c':
639     case 'x':
640       switch (TREE_CODE (node))
641         {
642         case INTEGER_CST:
643           if (TREE_CONSTANT_OVERFLOW (node))
644             fprintf (file, " overflow");
645
646           fprintf (file, " ");
647           if (TREE_INT_CST_HIGH (node) == 0)
648             fprintf (file, HOST_WIDE_INT_PRINT_UNSIGNED,
649                      TREE_INT_CST_LOW (node));
650           else if (TREE_INT_CST_HIGH (node) == -1
651                    && TREE_INT_CST_LOW (node) != 0)
652             fprintf (file, "-" HOST_WIDE_INT_PRINT_UNSIGNED,
653                      -TREE_INT_CST_LOW (node));
654           else
655             fprintf (file, HOST_WIDE_INT_PRINT_DOUBLE_HEX,
656                      TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
657           break;
658
659         case REAL_CST:
660           {
661             REAL_VALUE_TYPE d;
662
663             if (TREE_OVERFLOW (node))
664               fprintf (file, " overflow");
665
666             d = TREE_REAL_CST (node);
667             if (REAL_VALUE_ISINF (d))
668               fprintf (file, " Inf");
669             else if (REAL_VALUE_ISNAN (d))
670               fprintf (file, " Nan");
671             else
672               {
673                 char string[64];
674                 real_to_decimal (string, &d, sizeof (string), 0, 1);
675                 fprintf (file, " %s", string);
676               }
677           }
678           break;
679
680         case VECTOR_CST:
681           {
682             tree vals = TREE_VECTOR_CST_ELTS (node);
683             char buf[10];
684             tree link;
685             int i;
686
687             i = 0;
688             for (link = vals; link; link = TREE_CHAIN (link), ++i)
689               {
690                 sprintf (buf, "elt%d: ", i);
691                 print_node (file, buf, TREE_VALUE (link), indent + 4);
692               }
693           }
694           break;
695
696         case COMPLEX_CST:
697           print_node (file, "real", TREE_REALPART (node), indent + 4);
698           print_node (file, "imag", TREE_IMAGPART (node), indent + 4);
699           break;
700
701         case STRING_CST:
702           {
703             const char *p = TREE_STRING_POINTER (node);
704             int i = TREE_STRING_LENGTH (node);
705             fputs (" \"", file);
706             while (--i >= 0)
707               {
708                 char ch = *p++;
709                 if (ch >= ' ' && ch < 127)
710                   putc (ch, file);
711                 else
712                   fprintf(file, "\\%03o", ch & 0xFF);
713               }
714             fputc ('\"', file);
715           }
716           /* Print the chain at second level.  */
717           if (indent == 4)
718             print_node (file, "chain", TREE_CHAIN (node), indent + 4);
719           else
720             print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
721           break;
722
723         case IDENTIFIER_NODE:
724           (*lang_hooks.print_identifier) (file, node, indent);
725           break;
726
727         case TREE_LIST:
728           print_node (file, "purpose", TREE_PURPOSE (node), indent + 4);
729           print_node (file, "value", TREE_VALUE (node), indent + 4);
730           print_node (file, "chain", TREE_CHAIN (node), indent + 4);
731           break;
732
733         case TREE_VEC:
734           len = TREE_VEC_LENGTH (node);
735           for (i = 0; i < len; i++)
736             if (TREE_VEC_ELT (node, i))
737               {
738                 char temp[10];
739                 sprintf (temp, "elt %d", i);
740                 indent_to (file, indent + 4);
741                 print_node_brief (file, temp, TREE_VEC_ELT (node, i), 0);
742               }
743           break;
744
745         default:
746           if (TREE_CODE_CLASS (TREE_CODE (node)) == 'x')
747             (*lang_hooks.print_xnode) (file, node, indent);
748           break;
749         }
750
751       break;
752     }
753
754   fprintf (file, ">");
755 }