Annotation of gcc/print-tree.c, revision 1.1.1.4

1.1       root        1: /* Prints out tree in human readable form - GNU C-compiler
1.1.1.4 ! root        2:    Copyright (C) 1990, 1991, 1993 Free Software Foundation, Inc.
1.1       root        3: 
                      4: This file is part of GNU CC.
                      5: 
                      6: GNU CC is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 2, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU CC is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU CC; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     19: 
                     20: 
                     21: #include "config.h"
                     22: #include "tree.h"
                     23: #include <stdio.h>
                     24: 
                     25: extern char **tree_code_name;
                     26: 
                     27: extern char *mode_name[];
                     28: 
                     29: void print_node ();
                     30: void indent_to ();
                     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:   char *object = (char *) oballoc (0);
                     54:   table = (struct bucket **) oballoc (HASH_SIZE * sizeof (struct bucket *));
                     55:   bzero (table, HASH_SIZE * sizeof (struct bucket *));
                     56:   print_node (stderr, "", node, 0);
                     57:   table = 0;
                     58:   obfree (object);
                     59:   fprintf (stderr, "\n");
                     60: }
                     61: 
                     62: /* Print a node in brief fashion, with just the code, address and name.  */
                     63: 
                     64: void
                     65: print_node_brief (file, prefix, node, indent)
                     66:      FILE *file;
                     67:      char *prefix;
                     68:      tree node;
                     69:      int indent;
                     70: {
                     71:   char class;
                     72: 
                     73:   if (node == 0)
                     74:     return;
                     75: 
                     76:   class = TREE_CODE_CLASS (TREE_CODE (node));
                     77: 
                     78:   /* Always print the slot this node is in, and its code, address and
                     79:      name if any.  */
                     80:   if (indent > 0)
                     81:     fprintf (file, " ");
1.1.1.3   root       82:   fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
1.1.1.4 ! root       83:   fprintf (file, HOST_PTR_PRINTF, (HOST_WIDE_INT) node);
1.1       root       84: 
                     85:   if (class == 'd')
                     86:     {
                     87:       if (DECL_NAME (node))
                     88:        fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
                     89:     }
                     90:   else if (class == 't')
                     91:     {
                     92:       if (TYPE_NAME (node))
                     93:        {
                     94:          if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
                     95:            fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
                     96:          else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
                     97:                   && DECL_NAME (TYPE_NAME (node)))
                     98:            fprintf (file, " %s",
                     99:                     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
                    100:        }
                    101:     }
                    102:   if (TREE_CODE (node) == IDENTIFIER_NODE)
                    103:     fprintf (file, " %s", IDENTIFIER_POINTER (node));
                    104:   /* We might as well always print the value of an integer.  */
                    105:   if (TREE_CODE (node) == INTEGER_CST)
                    106:     {
                    107:       if (TREE_INT_CST_HIGH (node) == 0)
                    108:        fprintf (file, " %1u", TREE_INT_CST_LOW (node));
                    109:       else if (TREE_INT_CST_HIGH (node) == -1
                    110:               && TREE_INT_CST_LOW (node) != 0)
                    111:        fprintf (file, " -%1u", -TREE_INT_CST_LOW (node));
                    112:       else
1.1.1.3   root      113:        fprintf (file,
                    114: #if HOST_BITS_PER_WIDE_INT == 64
                    115: #if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
                    116:                 " 0x%lx%016lx",
                    117: #else
                    118:                 " 0x%x%016x",
                    119: #endif
                    120: #else
                    121: #if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
                    122:                 " 0x%lx%08lx",
                    123: #else
                    124:                 " 0x%x%08x",
                    125: #endif
                    126: #endif
                    127:                 TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
1.1       root      128:     }
                    129:   if (TREE_CODE (node) == REAL_CST)
                    130:     {
                    131: #ifndef REAL_IS_NOT_DOUBLE
                    132:       fprintf (file, " %e", TREE_REAL_CST (node));
                    133: #else
                    134:       {
                    135:        int i;
                    136:        char *p = (char *) &TREE_REAL_CST (node);
                    137:        fprintf (file, " 0x");
                    138:        for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
                    139:          fprintf (file, "%02x", *p++);
                    140:        fprintf (file, "");
                    141:       }
                    142: #endif /* REAL_IS_NOT_DOUBLE */
                    143:     }
                    144: 
                    145:   fprintf (file, ">");
                    146: }
                    147: 
                    148: void
                    149: indent_to (file, column)
                    150:      FILE *file;
                    151:      int column;
                    152: {
                    153:   int i;
                    154: 
                    155:   /* Since this is the long way, indent to desired column.  */
                    156:   if (column > 0)
                    157:     fprintf (file, "\n");
                    158:   for (i = 0; i < column; i++)
                    159:     fprintf (file, " ");
                    160: }
                    161: 
                    162: /* Print the node NODE in full on file FILE, preceded by PREFIX,
                    163:    starting in column INDENT.  */
                    164: 
                    165: void
                    166: print_node (file, prefix, node, indent)
                    167:      FILE *file;
                    168:      char *prefix;
                    169:      tree node;
                    170:      int indent;
                    171: {
                    172:   int hash;
                    173:   struct bucket *b;
                    174:   enum machine_mode mode;
                    175:   char class;
                    176:   int len;
                    177:   int first_rtl;
                    178:   int i;
                    179: 
                    180:   if (node == 0)
                    181:     return;
                    182: 
                    183:   class = TREE_CODE_CLASS (TREE_CODE (node));
                    184: 
                    185:   /* Don't get too deep in nesting.  If the user wants to see deeper,
                    186:      it is easy to use the address of a lowest-level node
                    187:      as an argument in another call to debug_tree.  */
                    188: 
                    189:   if (indent > 24)
                    190:     {
                    191:       print_node_brief (file, prefix, node, indent);
                    192:       return;
                    193:     }
                    194: 
                    195:   if (indent > 8 && (class == 't' || class == 'd'))
                    196:     {
                    197:       print_node_brief (file, prefix, node, indent);
                    198:       return;
                    199:     }
                    200: 
                    201:   /* It is unsafe to look at any other filds of an ERROR_MARK node. */
                    202:   if (TREE_CODE (node) == ERROR_MARK)
                    203:     {
                    204:       print_node_brief (file, prefix, node, indent);
                    205:       return;
                    206:     }
                    207: 
1.1.1.3   root      208:   hash = ((unsigned HOST_WIDE_INT) node) % HASH_SIZE;
1.1       root      209: 
                    210:   /* If node is in the table, just mention its address.  */
                    211:   for (b = table[hash]; b; b = b->next)
                    212:     if (b->node == node)
                    213:       {
                    214:        print_node_brief (file, prefix, node, indent);
                    215:        return;
                    216:       }
                    217: 
                    218:   /* Add this node to the table.  */
                    219:   b = (struct bucket *) oballoc (sizeof (struct bucket));
                    220:   b->node = node;
                    221:   b->next = table[hash];
                    222:   table[hash] = b;
                    223: 
                    224:   /* Indent to the specified column, since this is the long form.  */
                    225:   indent_to (file, indent);
                    226: 
                    227:   /* Print the slot this node is in, and its code, and address.  */
1.1.1.3   root      228:   fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
1.1.1.4 ! root      229:   fprintf (file, HOST_PTR_PRINTF, (HOST_WIDE_INT) node);
1.1       root      230: 
                    231:   /* Print the name, if any.  */
                    232:   if (class == 'd')
                    233:     {
                    234:       if (DECL_NAME (node))
                    235:        fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
                    236:     }
                    237:   else if (class == 't')
                    238:     {
                    239:       if (TYPE_NAME (node))
                    240:        {
                    241:          if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
                    242:            fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
                    243:          else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
                    244:                   && DECL_NAME (TYPE_NAME (node)))
                    245:            fprintf (file, " %s",
                    246:                     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
                    247:        }
                    248:     }
                    249:   if (TREE_CODE (node) == IDENTIFIER_NODE)
                    250:     fprintf (file, " %s", IDENTIFIER_POINTER (node));
                    251: 
                    252:   if (TREE_CODE (node) == INTEGER_CST)
                    253:     {
                    254:       if (indent <= 4)
                    255:        print_node_brief (file, "type", TREE_TYPE (node), indent + 4);
                    256:     }
                    257:   else
                    258:     {
                    259:       print_node (file, "type", TREE_TYPE (node), indent + 4);
                    260:       if (TREE_TYPE (node))
                    261:        indent_to (file, indent + 3);
                    262:     }
                    263: 
                    264:   /* If a permanent object is in the wrong obstack, or the reverse, warn.  */
                    265:   if (object_permanent_p (node) != TREE_PERMANENT (node))
                    266:     {
                    267:       if (TREE_PERMANENT (node))
                    268:        fputs (" !!permanent object in non-permanent obstack!!", file);
                    269:       else
                    270:        fputs (" !!non-permanent object in permanent obstack!!", file);
                    271:       indent_to (file, indent + 3);
                    272:     }
                    273: 
                    274:   if (TREE_SIDE_EFFECTS (node))
                    275:     fputs (" side-effects", file);
                    276:   if (TREE_READONLY (node))
                    277:     fputs (" readonly", file);
                    278:   if (TREE_CONSTANT (node))
                    279:     fputs (" constant", file);
                    280:   if (TREE_ADDRESSABLE (node))
                    281:     fputs (" addressable", file);
                    282:   if (TREE_THIS_VOLATILE (node))
                    283:     fputs (" volatile", file);
                    284:   if (TREE_UNSIGNED (node))
                    285:     fputs (" unsigned", file);
                    286:   if (TREE_ASM_WRITTEN (node))
                    287:     fputs (" asm_written", file);
                    288:   if (TREE_USED (node))
                    289:     fputs (" used", file);
1.1.1.3   root      290:   if (TREE_RAISES (node))
                    291:     fputs (" raises", file);
1.1       root      292:   if (TREE_PERMANENT (node))
                    293:     fputs (" permanent", file);
                    294:   if (TREE_PUBLIC (node))
                    295:     fputs (" public", file);
                    296:   if (TREE_STATIC (node))
                    297:     fputs (" static", file);
                    298:   if (TREE_LANG_FLAG_0 (node))
                    299:     fputs (" tree_0", file);
                    300:   if (TREE_LANG_FLAG_1 (node))
                    301:     fputs (" tree_1", file);
                    302:   if (TREE_LANG_FLAG_2 (node))
                    303:     fputs (" tree_2", file);
                    304:   if (TREE_LANG_FLAG_3 (node))
                    305:     fputs (" tree_3", file);
                    306:   if (TREE_LANG_FLAG_4 (node))
                    307:     fputs (" tree_4", file);
                    308:   if (TREE_LANG_FLAG_5 (node))
                    309:     fputs (" tree_5", file);
                    310:   if (TREE_LANG_FLAG_6 (node))
                    311:     fputs (" tree_6", file);
                    312: 
                    313:   /* DECL_ nodes have additional attributes.  */
                    314: 
                    315:   switch (TREE_CODE_CLASS (TREE_CODE (node)))
                    316:     {
                    317:     case 'd':
                    318:       mode = DECL_MODE (node);
                    319: 
1.1.1.3   root      320:       if (DECL_EXTERNAL (node))
1.1       root      321:        fputs (" external", file);
1.1.1.3   root      322:       if (DECL_NONLOCAL (node))
1.1       root      323:        fputs (" nonlocal", file);
1.1.1.3   root      324:       if (DECL_REGISTER (node))
1.1       root      325:        fputs (" regdecl", file);
1.1.1.3   root      326:       if (DECL_INLINE (node))
1.1       root      327:        fputs (" inline", file);
                    328:       if (DECL_BIT_FIELD (node))
                    329:        fputs (" bit-field", file);
                    330:       if (DECL_VIRTUAL_P (node))
                    331:        fputs (" virtual", file);
                    332:       if (DECL_IGNORED_P (node))
                    333:        fputs (" ignored", file);
1.1.1.3   root      334:       if (DECL_IN_SYSTEM_HEADER (node))
                    335:        fputs (" in_system_header", file);
1.1       root      336:       if (DECL_LANG_FLAG_0 (node))
                    337:        fputs (" decl_0", file);
                    338:       if (DECL_LANG_FLAG_1 (node))
                    339:        fputs (" decl_1", file);
                    340:       if (DECL_LANG_FLAG_2 (node))
                    341:        fputs (" decl_2", file);
                    342:       if (DECL_LANG_FLAG_3 (node))
                    343:        fputs (" decl_3", file);
                    344:       if (DECL_LANG_FLAG_4 (node))
                    345:        fputs (" decl_4", file);
                    346:       if (DECL_LANG_FLAG_5 (node))
                    347:        fputs (" decl_5", file);
                    348:       if (DECL_LANG_FLAG_6 (node))
                    349:        fputs (" decl_6", file);
                    350:       if (DECL_LANG_FLAG_7 (node))
                    351:        fputs (" decl_7", file);
                    352: 
                    353:       fprintf (file, " %s", mode_name[(int) mode]);
                    354: 
                    355:       fprintf (file, " file %s line %d",
                    356:               DECL_SOURCE_FILE (node), DECL_SOURCE_LINE (node));
                    357: 
                    358:       print_node (file, "size", DECL_SIZE (node), indent + 4);
                    359:       indent_to (file, indent + 3);
1.1.1.2   root      360:       if (TREE_CODE (node) != FUNCTION_DECL)
                    361:        fprintf (file, " align %d", DECL_ALIGN (node));
1.1.1.3   root      362:       else if (DECL_INLINE (node))
1.1.1.2   root      363:        fprintf (file, " frame_size %d", DECL_FRAME_SIZE (node));
                    364:       else if (DECL_BUILT_IN (node))
                    365:        fprintf (file, " built-in code %d", DECL_FUNCTION_CODE (node));
1.1       root      366:       if (TREE_CODE (node) == FIELD_DECL)
                    367:        print_node (file, "bitpos", DECL_FIELD_BITPOS (node), indent + 4);
                    368:       print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4);
1.1.1.3   root      369:       print_node_brief (file, "abstract_origin",
                    370:                        DECL_ABSTRACT_ORIGIN (node), indent + 4);
1.1       root      371: 
                    372:       print_node (file, "arguments", DECL_ARGUMENTS (node), indent + 4);
                    373:       print_node (file, "result", DECL_RESULT (node), indent + 4);
                    374:       print_node_brief (file, "initial", DECL_INITIAL (node), indent + 4);
                    375: 
                    376:       print_lang_decl (file, node, indent);
                    377: 
                    378:       if (DECL_RTL (node) != 0)
                    379:        {
                    380:          indent_to (file, indent + 4);
                    381:          print_rtl (file, DECL_RTL (node));
                    382:        }
                    383: 
                    384:       if (DECL_SAVED_INSNS (node) != 0)
                    385:        {
                    386:          indent_to (file, indent + 4);
                    387:          if (TREE_CODE (node) == PARM_DECL)
                    388:            {
                    389:              fprintf (file, "incoming-rtl ");
                    390:              print_rtl (file, DECL_INCOMING_RTL (node));
                    391:            }
                    392:          else if (TREE_CODE (node) == FUNCTION_DECL)
1.1.1.3   root      393:            {
                    394:              fprintf (file, "saved-insns ");
1.1.1.4 ! root      395:              fprintf (file, HOST_PTR_PRINTF,
        !           396:                       (HOST_WIDE_INT) DECL_SAVED_INSNS (node));
1.1.1.3   root      397:            }
1.1       root      398:        }
                    399: 
                    400:       /* Print the decl chain only if decl is at second level.  */
                    401:       if (indent == 4)
                    402:        print_node (file, "chain", TREE_CHAIN (node), indent + 4);
                    403:       else
                    404:        print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
                    405:       break;
                    406: 
                    407:     case 't':
                    408:       if (TYPE_NO_FORCE_BLK (node))
                    409:        fputs (" no_force_blk", file);
                    410:       if (TYPE_LANG_FLAG_0 (node))
                    411:        fputs (" type_0", file);
                    412:       if (TYPE_LANG_FLAG_1 (node))
                    413:        fputs (" type_1", file);
                    414:       if (TYPE_LANG_FLAG_2 (node))
                    415:        fputs (" type_2", file);
                    416:       if (TYPE_LANG_FLAG_3 (node))
                    417:        fputs (" type_3", file);
                    418:       if (TYPE_LANG_FLAG_4 (node))
                    419:        fputs (" type_4", file);
                    420:       if (TYPE_LANG_FLAG_5 (node))
                    421:        fputs (" type_5", file);
                    422:       if (TYPE_LANG_FLAG_6 (node))
                    423:        fputs (" type_6", file);
                    424: 
                    425:       mode = TYPE_MODE (node);
                    426:       fprintf (file, " %s", mode_name[(int) mode]);
                    427: 
                    428:       print_node (file, "size", TYPE_SIZE (node), indent + 4);
                    429:       indent_to (file, indent + 3);
                    430: 
                    431:       fprintf (file, " align %d", TYPE_ALIGN (node));
                    432:       fprintf (file, " symtab %d", TYPE_SYMTAB_ADDRESS (node));
                    433: 
                    434:       if (TREE_CODE (node) == ARRAY_TYPE || TREE_CODE (node) == SET_TYPE)
                    435:        print_node (file, "domain", TYPE_DOMAIN (node), indent + 4);
1.1.1.3   root      436:       else if (TREE_CODE (node) == INTEGER_TYPE
                    437:               || TREE_CODE (node) == BOOLEAN_TYPE
                    438:               || TREE_CODE (node) == CHAR_TYPE)
1.1       root      439:        {
                    440:          fprintf (file, " precision %d", TYPE_PRECISION (node));
                    441:          print_node (file, "min", TYPE_MIN_VALUE (node), indent + 4);
                    442:          print_node (file, "max", TYPE_MAX_VALUE (node), indent + 4);
                    443:        }
                    444:       else if (TREE_CODE (node) == ENUMERAL_TYPE)
                    445:        {
                    446:          fprintf (file, " precision %d", TYPE_PRECISION (node));
                    447:          print_node (file, "min", TYPE_MIN_VALUE (node), indent + 4);
                    448:          print_node (file, "max", TYPE_MAX_VALUE (node), indent + 4);
                    449:          print_node (file, "values", TYPE_VALUES (node), indent + 4);
                    450:        }
                    451:       else if (TREE_CODE (node) == REAL_TYPE)
                    452:        fprintf (file, " precision %d", TYPE_PRECISION (node));
1.1.1.4 ! root      453:       else if (TREE_CODE (node) == RECORD_TYPE
        !           454:               || TREE_CODE (node) == UNION_TYPE
        !           455:               || TREE_CODE (node) == QUAL_UNION_TYPE)
1.1       root      456:        print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
                    457:       else if (TREE_CODE (node) == FUNCTION_TYPE || TREE_CODE (node) == METHOD_TYPE)
                    458:        {
                    459:          if (TYPE_METHOD_BASETYPE (node))
                    460:            print_node_brief (file, "method basetype", TYPE_METHOD_BASETYPE (node), indent + 4);
                    461:          print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
                    462:        }
                    463:       if (TYPE_CONTEXT (node))
                    464:        print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);
                    465: 
                    466:       print_lang_type (file, node, indent);
                    467: 
                    468:       if (TYPE_POINTER_TO (node) || TREE_CHAIN (node))
                    469:        indent_to (file, indent + 3);
                    470:       print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node), indent + 4);
                    471:       print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node), indent + 4);
                    472:       print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
                    473:       break;
                    474: 
1.1.1.3   root      475:     case 'b':
                    476:       print_node (file, "vars", BLOCK_VARS (node), indent + 4);
                    477:       print_node (file, "tags", BLOCK_TYPE_TAGS (node), indent + 4);
                    478:       print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node), indent + 4);
                    479:       print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
                    480:       print_node (file, "chain", BLOCK_CHAIN (node), indent + 4);
                    481:       print_node (file, "abstract_origin",
                    482:                  BLOCK_ABSTRACT_ORIGIN (node), indent + 4);
                    483:       return;
                    484: 
1.1       root      485:     case 'e':
                    486:     case '<':
                    487:     case '1':
                    488:     case '2':
                    489:     case 'r':
                    490:     case 's':
                    491:       switch (TREE_CODE (node))
                    492:        {
                    493:        case BIND_EXPR:
                    494:          print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
                    495:          print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
1.1.1.2   root      496:          print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
1.1       root      497:          return;
                    498:        }
                    499: 
                    500:       first_rtl = len = tree_code_length[(int) TREE_CODE (node)];
                    501:       /* These kinds of nodes contain rtx's, not trees,
                    502:         after a certain point.  Print the rtx's as rtx's.  */
                    503:       switch (TREE_CODE (node))
                    504:        {
                    505:        case SAVE_EXPR:
                    506:          first_rtl = 2;
                    507:          break;
                    508:        case CALL_EXPR:
                    509:          first_rtl = 2;
                    510:          break;
                    511:        case METHOD_CALL_EXPR:
                    512:          first_rtl = 3;
                    513:          break;
                    514:        case WITH_CLEANUP_EXPR:
                    515:          /* Should be defined to be 2.  */
                    516:          first_rtl = 1;
                    517:          break;
                    518:        case RTL_EXPR:
                    519:          first_rtl = 0;
                    520:        }
                    521:       for (i = 0; i < len; i++)
                    522:        {
                    523:          if (i >= first_rtl)
                    524:            {
                    525:              indent_to (file, indent + 4);
                    526:              fprintf (file, "rtl %d ", i);
                    527:              if (TREE_OPERAND (node, i))
1.1.1.4 ! root      528:                print_rtl (file, (struct rtx_def *) TREE_OPERAND (node, i));
1.1       root      529:              else
                    530:                fprintf (file, "(nil)");
                    531:              fprintf (file, "\n");
                    532:            }
                    533:          else
                    534:            {
                    535:              char temp[10];
                    536: 
                    537:              sprintf (temp, "arg %d", i);
                    538:              print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
                    539:            }
                    540:        }
                    541:       break;
                    542: 
                    543:     case 'c':
                    544:     case 'x':
                    545:       switch (TREE_CODE (node))
                    546:        {
                    547:        case INTEGER_CST:
                    548:          if (TREE_INT_CST_HIGH (node) == 0)
                    549:            fprintf (file, " %1u", TREE_INT_CST_LOW (node));
                    550:          else if (TREE_INT_CST_HIGH (node) == -1
                    551:                   && TREE_INT_CST_LOW (node) != 0)
                    552:            fprintf (file, " -%1u", -TREE_INT_CST_LOW (node));
                    553:          else
1.1.1.3   root      554:            fprintf (file,
                    555: #if HOST_BITS_PER_WIDE_INT == 64
                    556: #if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
                    557:                     " 0x%lx%016lx",
                    558: #else
                    559:                     " 0x%x%016x",
                    560: #endif
                    561: #else
                    562: #if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
                    563:                     " 0x%lx%08lx",
                    564: #else
                    565:                     " 0x%x%08x",
                    566: #endif
                    567: #endif
                    568:                     TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
1.1       root      569:          break;
                    570: 
                    571:        case REAL_CST:
                    572: #ifndef REAL_IS_NOT_DOUBLE
                    573:          fprintf (file, " %e", TREE_REAL_CST (node));
                    574: #else
                    575:          {
                    576:            char *p = (char *) &TREE_REAL_CST (node);
                    577:            fprintf (file, " 0x");
                    578:            for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
                    579:              fprintf (file, "%02x", *p++);
                    580:            fprintf (file, "");
                    581:          }
                    582: #endif /* REAL_IS_NOT_DOUBLE */
                    583:          break;
                    584: 
                    585:        case COMPLEX_CST:
                    586:          print_node (file, "real", TREE_REALPART (node), indent + 4);
                    587:          print_node (file, "imag", TREE_IMAGPART (node), indent + 4);
                    588:          break;
                    589: 
                    590:        case STRING_CST:
                    591:          fprintf (file, " \"%s\"", TREE_STRING_POINTER (node));
1.1.1.4 ! root      592:          /* Print the chain at second level.  */
        !           593:          if (indent == 4)
        !           594:            print_node (file, "chain", TREE_CHAIN (node), indent + 4);
        !           595:          else
        !           596:            print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
1.1       root      597:          break;
                    598: 
                    599:        case IDENTIFIER_NODE:
                    600:          print_lang_identifier (file, node, indent);
                    601:          break;
                    602: 
                    603:        case TREE_LIST:
                    604:          print_node (file, "purpose", TREE_PURPOSE (node), indent + 4);
                    605:          print_node (file, "value", TREE_VALUE (node), indent + 4);
                    606:          print_node (file, "chain", TREE_CHAIN (node), indent + 4);
                    607:          break;
                    608: 
                    609:        case TREE_VEC:
                    610:          len = TREE_VEC_LENGTH (node);
                    611:          for (i = 0; i < len; i++)
1.1.1.3   root      612:            if (TREE_VEC_ELT (node, i))
                    613:              {
                    614:                char temp[10];
                    615:                sprintf (temp, "elt %d", i);
                    616:                indent_to (file, indent + 4);
                    617:                print_node_brief (file, temp, TREE_VEC_ELT (node, i), 0);
                    618:              }
1.1       root      619:          break;
                    620: 
                    621:        case OP_IDENTIFIER:
                    622:          print_node (file, "op1", TREE_PURPOSE (node), indent + 4);
                    623:          print_node (file, "op2", TREE_VALUE (node), indent + 4);
                    624:        }
                    625: 
                    626:       break;
                    627:     }
1.1.1.3   root      628: 
                    629:   fprintf (file, ">");
1.1       root      630: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.