Annotation of GNUtools/cc/print-tree.c, revision 1.1.1.1

1.1       root        1: /* Prints out tree in human readable form - GNU C-compiler
                      2:    Copyright (C) 1990, 1991, 1993 Free Software Foundation, Inc.
                      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, " ");
                     82:   fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
                     83:   fprintf (file, HOST_PTR_PRINTF, (HOST_WIDE_INT) node);
                     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
                    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));
                    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:        unsigned char *p = (unsigned 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: 
                    208:   hash = ((unsigned HOST_WIDE_INT) node) % HASH_SIZE;
                    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.  */
                    228:   fprintf (file, "%s <%s ", prefix, tree_code_name[(int) TREE_CODE (node)]);
                    229:   fprintf (file, HOST_PTR_PRINTF, (HOST_WIDE_INT) node);
                    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:       print_obstack_name ((char *) node, file, "");
                    264:       indent_to (file, indent + 3);
                    265:     }
                    266: 
                    267:   /* If a permanent object is in the wrong obstack, or the reverse, warn.  */
                    268:   if (object_permanent_p (node) != TREE_PERMANENT (node))
                    269:     {
                    270:       if (TREE_PERMANENT (node))
                    271:        fputs (" !!permanent object in non-permanent obstack!!", file);
                    272:       else
                    273:        fputs (" !!non-permanent object in permanent obstack!!", file);
                    274:       indent_to (file, indent + 3);
                    275:     }
                    276: 
                    277:   if (TREE_SIDE_EFFECTS (node))
                    278:     fputs (" side-effects", file);
                    279:   if (TREE_READONLY (node))
                    280:     fputs (" readonly", file);
                    281:   if (TREE_CONSTANT (node))
                    282:     fputs (" constant", file);
                    283:   if (TREE_ADDRESSABLE (node))
                    284:     fputs (" addressable", file);
                    285:   if (TREE_THIS_VOLATILE (node))
                    286:     fputs (" volatile", file);
                    287:   if (TREE_UNSIGNED (node))
                    288:     fputs (" unsigned", file);
                    289:   if (TREE_ASM_WRITTEN (node))
                    290:     fputs (" asm_written", file);
                    291:   if (TREE_USED (node))
                    292:     fputs (" used", file);
                    293:   if (TREE_RAISES (node))
                    294:     fputs (" raises", file);
                    295:   if (TREE_PERMANENT (node))
                    296:     fputs (" permanent", file);
                    297:   if (TREE_PUBLIC (node))
                    298:     fputs (" public", file);
                    299:   if (TREE_STATIC (node))
                    300:     fputs (" static", file);
                    301:   if (TREE_LANG_FLAG_0 (node))
                    302:     fputs (" tree_0", file);
                    303:   if (TREE_LANG_FLAG_1 (node))
                    304:     fputs (" tree_1", file);
                    305:   if (TREE_LANG_FLAG_2 (node))
                    306:     fputs (" tree_2", file);
                    307:   if (TREE_LANG_FLAG_3 (node))
                    308:     fputs (" tree_3", file);
                    309:   if (TREE_LANG_FLAG_4 (node))
                    310:     fputs (" tree_4", file);
                    311:   if (TREE_LANG_FLAG_5 (node))
                    312:     fputs (" tree_5", file);
                    313:   if (TREE_LANG_FLAG_6 (node))
                    314:     fputs (" tree_6", file);
                    315: 
                    316:   /* DECL_ nodes have additional attributes.  */
                    317: 
                    318:   switch (TREE_CODE_CLASS (TREE_CODE (node)))
                    319:     {
                    320:     case 'd':
                    321:       mode = DECL_MODE (node);
                    322: 
                    323:       if (DECL_EXTERNAL (node))
                    324:        fputs (" external", file);
                    325:       if (DECL_NONLOCAL (node))
                    326:        fputs (" nonlocal", file);
                    327:       if (DECL_REGISTER (node))
                    328:        fputs (" regdecl", file);
                    329:       if (DECL_INLINE (node))
                    330:        fputs (" inline", file);
                    331:       if (DECL_BIT_FIELD (node))
                    332:        fputs (" bit-field", file);
                    333:       if (DECL_VIRTUAL_P (node))
                    334:        fputs (" virtual", file);
                    335:       if (DECL_IGNORED_P (node))
                    336:        fputs (" ignored", file);
                    337:       if (DECL_IN_SYSTEM_HEADER (node))
                    338:        fputs (" in_system_header", file);
                    339:       if (DECL_LANG_FLAG_0 (node))
                    340:        fputs (" decl_0", file);
                    341:       if (DECL_LANG_FLAG_1 (node))
                    342:        fputs (" decl_1", file);
                    343:       if (DECL_LANG_FLAG_2 (node))
                    344:        fputs (" decl_2", file);
                    345:       if (DECL_LANG_FLAG_3 (node))
                    346:        fputs (" decl_3", file);
                    347:       if (DECL_LANG_FLAG_4 (node))
                    348:        fputs (" decl_4", file);
                    349:       if (DECL_LANG_FLAG_5 (node))
                    350:        fputs (" decl_5", file);
                    351:       if (DECL_LANG_FLAG_6 (node))
                    352:        fputs (" decl_6", file);
                    353:       if (DECL_LANG_FLAG_7 (node))
                    354:        fputs (" decl_7", file);
                    355: 
                    356:       fprintf (file, " %s", mode_name[(int) mode]);
                    357: 
                    358:       fprintf (file, " file %s line %d",
                    359:               DECL_SOURCE_FILE (node), DECL_SOURCE_LINE (node));
                    360: 
                    361:       print_node (file, "size", DECL_SIZE (node), indent + 4);
                    362:       indent_to (file, indent + 3);
                    363:       if (TREE_CODE (node) != FUNCTION_DECL)
                    364:        fprintf (file, " align %d", DECL_ALIGN (node));
                    365:       else if (DECL_INLINE (node))
                    366:        fprintf (file, " frame_size %d", DECL_FRAME_SIZE (node));
                    367:       else if (DECL_BUILT_IN (node))
                    368:        fprintf (file, " built-in code %d", DECL_FUNCTION_CODE (node));
                    369:       if (TREE_CODE (node) == FIELD_DECL)
                    370:        print_node (file, "bitpos", DECL_FIELD_BITPOS (node), indent + 4);
                    371:       print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4);
                    372:       print_node_brief (file, "abstract_origin",
                    373:                        DECL_ABSTRACT_ORIGIN (node), indent + 4);
                    374: 
                    375:       print_node (file, "arguments", DECL_ARGUMENTS (node), indent + 4);
                    376:       print_node (file, "result", DECL_RESULT (node), indent + 4);
                    377:       print_node_brief (file, "initial", DECL_INITIAL (node), indent + 4);
                    378: 
                    379:       print_lang_decl (file, node, indent);
                    380: 
                    381:       if (DECL_RTL (node) != 0)
                    382:        {
                    383:          indent_to (file, indent + 4);
                    384:          print_rtl (file, DECL_RTL (node));
                    385:        }
                    386: 
                    387:       if (DECL_SAVED_INSNS (node) != 0)
                    388:        {
                    389:          indent_to (file, indent + 4);
                    390:          if (TREE_CODE (node) == PARM_DECL)
                    391:            {
                    392:              fprintf (file, "incoming-rtl ");
                    393:              print_rtl (file, DECL_INCOMING_RTL (node));
                    394:            }
                    395:          else if (TREE_CODE (node) == FUNCTION_DECL)
                    396:            {
                    397:              fprintf (file, "saved-insns ");
                    398:              fprintf (file, HOST_PTR_PRINTF,
                    399:                       (HOST_WIDE_INT) DECL_SAVED_INSNS (node));
                    400:            }
                    401:        }
                    402: 
                    403:       /* Print the decl chain only if decl is at second level.  */
                    404:       if (indent == 4)
                    405:        print_node (file, "chain", TREE_CHAIN (node), indent + 4);
                    406:       else
                    407:        print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
                    408:       break;
                    409: 
                    410:     case 't':
                    411:       if (TYPE_NO_FORCE_BLK (node))
                    412:        fputs (" no_force_blk", file);
                    413:       if (TYPE_LANG_FLAG_0 (node))
                    414:        fputs (" type_0", file);
                    415:       if (TYPE_LANG_FLAG_1 (node))
                    416:        fputs (" type_1", file);
                    417:       if (TYPE_LANG_FLAG_2 (node))
                    418:        fputs (" type_2", file);
                    419:       if (TYPE_LANG_FLAG_3 (node))
                    420:        fputs (" type_3", file);
                    421:       if (TYPE_LANG_FLAG_4 (node))
                    422:        fputs (" type_4", file);
                    423:       if (TYPE_LANG_FLAG_5 (node))
                    424:        fputs (" type_5", file);
                    425:       if (TYPE_LANG_FLAG_6 (node))
                    426:        fputs (" type_6", file);
                    427: 
                    428:       mode = TYPE_MODE (node);
                    429:       fprintf (file, " %s", mode_name[(int) mode]);
                    430: 
                    431:       print_node (file, "size", TYPE_SIZE (node), indent + 4);
                    432:       indent_to (file, indent + 3);
                    433: 
                    434:       fprintf (file, " align %d", TYPE_ALIGN (node));
                    435:       fprintf (file, " symtab %d", TYPE_SYMTAB_ADDRESS (node));
                    436: 
                    437:       if (TREE_CODE (node) == ARRAY_TYPE || TREE_CODE (node) == SET_TYPE)
                    438:        print_node (file, "domain", TYPE_DOMAIN (node), indent + 4);
                    439:       else if (TREE_CODE (node) == INTEGER_TYPE
                    440:               || TREE_CODE (node) == BOOLEAN_TYPE
                    441:               || TREE_CODE (node) == CHAR_TYPE)
                    442:        {
                    443:          fprintf (file, " precision %d", TYPE_PRECISION (node));
                    444:          print_node (file, "min", TYPE_MIN_VALUE (node), indent + 4);
                    445:          print_node (file, "max", TYPE_MAX_VALUE (node), indent + 4);
                    446:        }
                    447:       else if (TREE_CODE (node) == ENUMERAL_TYPE)
                    448:        {
                    449:          fprintf (file, " precision %d", TYPE_PRECISION (node));
                    450:          print_node (file, "min", TYPE_MIN_VALUE (node), indent + 4);
                    451:          print_node (file, "max", TYPE_MAX_VALUE (node), indent + 4);
                    452:          print_node (file, "values", TYPE_VALUES (node), indent + 4);
                    453:        }
                    454:       else if (TREE_CODE (node) == REAL_TYPE)
                    455:        fprintf (file, " precision %d", TYPE_PRECISION (node));
                    456:       else if (TREE_CODE (node) == RECORD_TYPE
                    457:               || TREE_CODE (node) == UNION_TYPE
                    458:               || TREE_CODE (node) == QUAL_UNION_TYPE)
                    459:        print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
                    460:       else if (TREE_CODE (node) == FUNCTION_TYPE || TREE_CODE (node) == METHOD_TYPE)
                    461:        {
                    462:          if (TYPE_METHOD_BASETYPE (node))
                    463:            print_node_brief (file, "method basetype", TYPE_METHOD_BASETYPE (node), indent + 4);
                    464:          print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
                    465:        }
                    466:       if (TYPE_CONTEXT (node))
                    467:        print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);
                    468: 
                    469:       print_lang_type (file, node, indent);
                    470: 
                    471:       if (TYPE_POINTER_TO (node) || TREE_CHAIN (node))
                    472:        indent_to (file, indent + 3);
                    473:       print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node), indent + 4);
                    474:       print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node), indent + 4);
                    475:       print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
                    476:       break;
                    477: 
                    478:     case 'b':
                    479:       print_node (file, "vars", BLOCK_VARS (node), indent + 4);
                    480:       print_node (file, "tags", BLOCK_TYPE_TAGS (node), indent + 4);
                    481:       print_node (file, "supercontext", BLOCK_SUPERCONTEXT (node), indent + 4);
                    482:       print_node (file, "subblocks", BLOCK_SUBBLOCKS (node), indent + 4);
                    483:       print_node (file, "chain", BLOCK_CHAIN (node), indent + 4);
                    484:       print_node (file, "abstract_origin",
                    485:                  BLOCK_ABSTRACT_ORIGIN (node), indent + 4);
                    486:       return;
                    487: 
                    488:     case 'e':
                    489:     case '<':
                    490:     case '1':
                    491:     case '2':
                    492:     case 'r':
                    493:     case 's':
                    494:       switch (TREE_CODE (node))
                    495:        {
                    496:        case BIND_EXPR:
                    497:          print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
                    498:          print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
                    499:          print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
                    500:          return;
                    501:        }
                    502: 
                    503:       first_rtl = len = tree_code_length[(int) TREE_CODE (node)];
                    504:       /* These kinds of nodes contain rtx's, not trees,
                    505:         after a certain point.  Print the rtx's as rtx's.  */
                    506:       switch (TREE_CODE (node))
                    507:        {
                    508:        case SAVE_EXPR:
                    509:          first_rtl = 2;
                    510:          break;
                    511:        case CALL_EXPR:
                    512:          first_rtl = 2;
                    513:          break;
                    514:        case METHOD_CALL_EXPR:
                    515:          first_rtl = 3;
                    516:          break;
                    517:        case WITH_CLEANUP_EXPR:
                    518:          /* Should be defined to be 2.  */
                    519:          first_rtl = 1;
                    520:          break;
                    521:        case RTL_EXPR:
                    522:          first_rtl = 0;
                    523:        }
                    524:       for (i = 0; i < len; i++)
                    525:        {
                    526:          if (i >= first_rtl)
                    527:            {
                    528:              indent_to (file, indent + 4);
                    529:              fprintf (file, "rtl %d ", i);
                    530:              if (TREE_OPERAND (node, i))
                    531:                print_rtl (file, (struct rtx_def *) TREE_OPERAND (node, i));
                    532:              else
                    533:                fprintf (file, "(nil)");
                    534:              fprintf (file, "\n");
                    535:            }
                    536:          else
                    537:            {
                    538:              char temp[10];
                    539: 
                    540:              sprintf (temp, "arg %d", i);
                    541:              print_node (file, temp, TREE_OPERAND (node, i), indent + 4);
                    542:            }
                    543:        }
                    544:       break;
                    545: 
                    546:     case 'c':
                    547:     case 'x':
                    548:       switch (TREE_CODE (node))
                    549:        {
                    550:        case INTEGER_CST:
                    551:          if (TREE_INT_CST_HIGH (node) == 0)
                    552:            fprintf (file, " %1u", TREE_INT_CST_LOW (node));
                    553:          else if (TREE_INT_CST_HIGH (node) == -1
                    554:                   && TREE_INT_CST_LOW (node) != 0)
                    555:            fprintf (file, " -%1u", -TREE_INT_CST_LOW (node));
                    556:          else
                    557:            fprintf (file,
                    558: #if HOST_BITS_PER_WIDE_INT == 64
                    559: #if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
                    560:                     " 0x%lx%016lx",
                    561: #else
                    562:                     " 0x%x%016x",
                    563: #endif
                    564: #else
                    565: #if HOST_BITS_PER_WIDE_INT != HOST_BITS_PER_INT
                    566:                     " 0x%lx%08lx",
                    567: #else
                    568:                     " 0x%x%08x",
                    569: #endif
                    570: #endif
                    571:                     TREE_INT_CST_HIGH (node), TREE_INT_CST_LOW (node));
                    572:          break;
                    573: 
                    574:        case REAL_CST:
                    575: #ifndef REAL_IS_NOT_DOUBLE
                    576:          fprintf (file, " %e", TREE_REAL_CST (node));
                    577: #else
                    578:          {
                    579:            char *p = (char *) &TREE_REAL_CST (node);
                    580:            fprintf (file, " 0x");
                    581:            for (i = 0; i < sizeof TREE_REAL_CST (node); i++)
                    582:              fprintf (file, "%02x", *p++);
                    583:            fprintf (file, "");
                    584:          }
                    585: #endif /* REAL_IS_NOT_DOUBLE */
                    586:          break;
                    587: 
                    588:        case COMPLEX_CST:
                    589:          print_node (file, "real", TREE_REALPART (node), indent + 4);
                    590:          print_node (file, "imag", TREE_IMAGPART (node), indent + 4);
                    591:          break;
                    592: 
                    593:        case STRING_CST:
                    594:          fprintf (file, " \"%s\"", TREE_STRING_POINTER (node));
                    595:          /* Print the chain at second level.  */
                    596:          if (indent == 4)
                    597:            print_node (file, "chain", TREE_CHAIN (node), indent + 4);
                    598:          else
                    599:            print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
                    600:          break;
                    601: 
                    602:        case IDENTIFIER_NODE:
                    603:          print_lang_identifier (file, node, indent);
                    604:          break;
                    605: 
                    606:        case TREE_LIST:
                    607:          print_node (file, "purpose", TREE_PURPOSE (node), indent + 4);
                    608:          print_node (file, "value", TREE_VALUE (node), indent + 4);
                    609:          print_node (file, "chain", TREE_CHAIN (node), indent + 4);
                    610:          break;
                    611: 
                    612:        case TREE_VEC:
                    613:          len = TREE_VEC_LENGTH (node);
                    614:          for (i = 0; i < len; i++)
                    615:            if (TREE_VEC_ELT (node, i))
                    616:              {
                    617:                char temp[10];
                    618:                sprintf (temp, "elt %d", i);
                    619:                indent_to (file, indent + 4);
                    620:                print_node_brief (file, temp, TREE_VEC_ELT (node, i), 0);
                    621:              }
                    622:          break;
                    623: 
                    624:        case OP_IDENTIFIER:
                    625:          print_node (file, "op1", TREE_PURPOSE (node), indent + 4);
                    626:          print_node (file, "op2", TREE_VALUE (node), indent + 4);
                    627:        }
                    628: 
                    629:       break;
                    630:     }
                    631: 
                    632:   fprintf (file, ">");
                    633: }

unix.superglobalmegacorp.com

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