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

1.1       root        1: /* Print RTL for GNU C Compiler.
                      2:    Copyright (C) 1987, 1988, 1992 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 <ctype.h>
                     23: #include <stdio.h>
                     24: #include "rtl.h"
                     25: 
                     26: 
                     27: /* How to print out a register name.
                     28:    We don't use PRINT_REG because some definitions of PRINT_REG
                     29:    don't work here.  */
                     30: #ifndef DEBUG_PRINT_REG
                     31: #define DEBUG_PRINT_REG(RTX, CODE, FILE) \
                     32:   fprintf ((FILE), "%d %s", REGNO (RTX), reg_names[REGNO (RTX)])
                     33: #endif
                     34: 
                     35: /* Array containing all of the register names */
                     36: 
                     37: #ifdef DEBUG_REGISTER_NAMES
                     38: static char *reg_names[] = DEBUG_REGISTER_NAMES;
                     39: #else
                     40: static char *reg_names[] = REGISTER_NAMES;
                     41: #endif
                     42: 
                     43: static FILE *outfile;
                     44: 
                     45: char spaces[] = "                                                                                                                                                                ";
                     46: 
                     47: static int sawclose = 0;
                     48: 
                     49: /* Names for patterns.  Non-zero only when linked with insn-output.c.  */
                     50: 
                     51: extern char **insn_name_ptr;
                     52: 
                     53: /* Print IN_RTX onto OUTFILE.  This is the recursive part of printing.  */
                     54: 
                     55: static void
                     56: print_rtx (in_rtx)
                     57:      register rtx in_rtx;
                     58: {
                     59:   static int indent;
                     60:   register int i, j;
                     61:   register char *format_ptr;
                     62:   register int is_insn;
                     63: 
                     64:   if (sawclose)
                     65:     {
                     66:       fprintf (outfile, "\n%s",
                     67:               (spaces + (sizeof spaces - 1 - indent * 2)));
                     68:       sawclose = 0;
                     69:     }
                     70: 
                     71:   if (in_rtx == 0)
                     72:     {
                     73:       fprintf (outfile, "(nil)");
                     74:       sawclose = 1;
                     75:       return;
                     76:     }
                     77: 
                     78:   /* print name of expression code */
                     79:   fprintf (outfile, "(%s", GET_RTX_NAME (GET_CODE (in_rtx)));
                     80: 
                     81:   if (in_rtx->in_struct)
                     82:     fprintf (outfile, "/s");
                     83: 
                     84:   if (in_rtx->volatil)
                     85:     fprintf (outfile, "/v");
                     86: 
                     87:   if (in_rtx->unchanging)
                     88:     fprintf (outfile, "/u");
                     89: 
                     90:   if (in_rtx->integrated)
                     91:     fprintf (outfile, "/i");
                     92: 
                     93:   if (GET_MODE (in_rtx) != VOIDmode)
                     94:     {
                     95:       /* Print REG_NOTE names for EXPR_LIST and INSN_LIST.  */
                     96:       if (GET_CODE (in_rtx) == EXPR_LIST || GET_CODE (in_rtx) == INSN_LIST)
                     97:        fprintf (outfile, ":%s", GET_REG_NOTE_NAME (GET_MODE (in_rtx)));
                     98:       else
                     99:        fprintf (outfile, ":%s", GET_MODE_NAME (GET_MODE (in_rtx)));
                    100:     }
                    101: 
                    102:   is_insn = (GET_RTX_CLASS (GET_CODE (in_rtx)) == 'i');
                    103:   format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
                    104: 
                    105:   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
                    106:     switch (*format_ptr++)
                    107:       {
                    108:       case 'S':
                    109:       case 's':
                    110:        if (XSTR (in_rtx, i) == 0)
                    111:          fprintf (outfile, " \"\"");
                    112:        else
                    113:          fprintf (outfile, " (\"%s\")", XSTR (in_rtx, i));
                    114:        sawclose = 1;
                    115:        break;
                    116: 
                    117:        /* 0 indicates a field for internal use that should not be printed.  */
                    118:       case '0':
                    119:        break;
                    120: 
                    121:       case 'e':
                    122:        indent += 2;
                    123:        if (!sawclose)
                    124:          fprintf (outfile, " ");
                    125:        print_rtx (XEXP (in_rtx, i));
                    126:        indent -= 2;
                    127:        break;
                    128: 
                    129:       case 'E':
                    130:       case 'V':
                    131:        indent += 2;
                    132:        if (sawclose)
                    133:          {
                    134:            fprintf (outfile, "\n%s",
                    135:                     (spaces + (sizeof spaces - 1 - indent * 2)));
                    136:            sawclose = 0;
                    137:          }
                    138:        fprintf (outfile, "[ ");
                    139:        if (NULL != XVEC (in_rtx, i))
                    140:          {
                    141:            indent += 2;
                    142:            if (XVECLEN (in_rtx, i))
                    143:              sawclose = 1;
                    144: 
                    145:            for (j = 0; j < XVECLEN (in_rtx, i); j++)
                    146:              print_rtx (XVECEXP (in_rtx, i, j));
                    147: 
                    148:            indent -= 2;
                    149:          }
                    150:        if (sawclose)
                    151:          fprintf (outfile, "\n%s",
                    152:                   (spaces + (sizeof spaces - 1 - indent * 2)));
                    153: 
                    154:        fprintf (outfile, "] ");
                    155:        sawclose = 1;
                    156:        indent -= 2;
                    157:        break;
                    158: 
                    159:       case 'w':
                    160:        fprintf (outfile,
                    161: #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
                    162:                 " %d",
                    163: #else
                    164:                 " %ld",
                    165: #endif
                    166:                 XWINT (in_rtx, i));
                    167:        break;
                    168: 
                    169:       case 'i':
                    170:        {
                    171:          register int value = XINT (in_rtx, i);
                    172: 
                    173:          if (GET_CODE (in_rtx) == REG && value < FIRST_PSEUDO_REGISTER)
                    174:            {
                    175:              fputc (' ', outfile);
                    176:              DEBUG_PRINT_REG (in_rtx, 0, outfile);
                    177:            }
                    178:          else
                    179:            fprintf (outfile, " %d", value);
                    180:        }
                    181:        if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, i)
                    182:            && insn_name_ptr
                    183:            && XINT (in_rtx, i) >= 0)
                    184:          fprintf (outfile, " {%s}", insn_name_ptr[XINT (in_rtx, i)]);
                    185:        sawclose = 0;
                    186:        break;
                    187: 
                    188:       /* Print NOTE_INSN names rather than integer codes.  */
                    189: 
                    190:       case 'n':
                    191:        if (XINT (in_rtx, i) <= 0)
                    192:          fprintf (outfile, " %s", GET_NOTE_INSN_NAME (XINT (in_rtx, i)));
                    193:        else
                    194:          fprintf (outfile, " %d", XINT (in_rtx, i));
                    195:        sawclose = 0;
                    196:        break;
                    197: 
                    198:       case 'u':
                    199:        if (XEXP (in_rtx, i) != NULL)
                    200:          fprintf (outfile, " %d", INSN_UID (XEXP (in_rtx, i)));
                    201:        else
                    202:          fprintf (outfile, " 0");
                    203:        sawclose = 0;
                    204:        break;
                    205: 
                    206:       case '*':
                    207:        fprintf (outfile, " Unknown");
                    208:        sawclose = 0;
                    209:        break;
                    210: 
                    211:       default:
                    212:        fprintf (stderr,
                    213:                 "switch format wrong in rtl.print_rtx(). format was: %c.\n",
                    214:                 format_ptr[-1]);
                    215:        abort ();
                    216:       }
                    217: 
                    218:   fprintf (outfile, ")");
                    219:   sawclose = 1;
                    220: }
                    221: 
                    222: /* Call this function from the debugger to see what X looks like.  */
                    223: 
                    224: void
                    225: debug_rtx (x)
                    226:      rtx x;
                    227: {
                    228:   outfile = stderr;
                    229:   print_rtx (x);
                    230:   fprintf (stderr, "\n");
                    231: }
                    232: 
                    233: /* Count of rtx's to print with debug_rtx_list.
                    234:    This global exists because gdb user defined commands have no arguments.  */
                    235: 
                    236: int debug_rtx_count = 0;       /* 0 is treated as equivalent to 1 */
                    237: 
                    238: /* Call this function to print list from X on.
                    239: 
                    240:    N is a count of the rtx's to print. Positive values print from the specified
                    241:    rtx on.  Negative values print a window around the rtx.
                    242:    EG: -5 prints 2 rtx's on either side (in addition to the specified rtx).  */
                    243: 
                    244: void
                    245: debug_rtx_list (x, n)
                    246:      rtx x;
                    247:      int n;
                    248: {
                    249:   int i,count;
                    250:   rtx insn;
                    251: 
                    252:   count = n == 0 ? 1 : n < 0 ? -n : n;
                    253: 
                    254:   /* If we are printing a window, back up to the start.  */
                    255: 
                    256:   if (n < 0)
                    257:     for (i = count / 2; i > 0; i--)
                    258:       {
                    259:        if (PREV_INSN (x) == 0)
                    260:          break;
                    261:        x = PREV_INSN (x);
                    262:       }
                    263: 
                    264:   for (i = count, insn = x; i > 0 && insn != 0; i--, insn = NEXT_INSN (insn))
                    265:     debug_rtx (insn);
                    266: }
                    267: 
                    268: /* Call this function to search an rtx list to find one with insn uid UID,
                    269:    and then call debug_rtx_list to print it, using DEBUG_RTX_COUNT.
                    270:    The found insn is returned to enable further debugging analysis.  */
                    271: 
                    272: rtx
                    273: debug_rtx_find(x, uid)
                    274:      rtx x;
                    275:      int uid;
                    276: {
                    277:   while (x != 0 && INSN_UID (x) != uid)
                    278:     x = NEXT_INSN (x);
                    279:   if (x != 0)
                    280:     {
                    281:       debug_rtx_list (x, debug_rtx_count);
                    282:       return x;
                    283:     }
                    284:   else
                    285:     {
                    286:       fprintf (stderr, "insn uid %d not found\n", uid);
                    287:       return 0;
                    288:     }
                    289: }
                    290: 
                    291: /* External entry point for printing a chain of insns
                    292:    starting with RTX_FIRST onto file OUTF.
                    293:    A blank line separates insns.
                    294: 
                    295:    If RTX_FIRST is not an insn, then it alone is printed, with no newline.  */
                    296: 
                    297: void
                    298: print_rtl (outf, rtx_first)
                    299:      FILE *outf;
                    300:      rtx rtx_first;
                    301: {
                    302:   register rtx tmp_rtx;
                    303: 
                    304:   outfile = outf;
                    305:   sawclose = 0;
                    306: 
                    307:   if (rtx_first == 0)
                    308:     fprintf (outf, "(nil)\n");
                    309:   else
                    310:     switch (GET_CODE (rtx_first))
                    311:       {
                    312:       case INSN:
                    313:       case JUMP_INSN:
                    314:       case CALL_INSN:
                    315:       case NOTE:
                    316:       case CODE_LABEL:
                    317:       case BARRIER:
                    318:        for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
                    319:          {
                    320:            print_rtx (tmp_rtx);
                    321:            fprintf (outfile, "\n");
                    322:          }
                    323:        break;
                    324: 
                    325:       default:
                    326:        print_rtx (rtx_first);
                    327:       }
                    328: }

unix.superglobalmegacorp.com

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