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

1.1       root        1: /* Print RTL for GNU C Compiler.
1.1.1.3   root        2:    Copyright (C) 1987-1991 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 <ctype.h>
                     23: #include <stdio.h>
                     24: #include "rtl.h"
                     25: 
                     26: 
1.1.1.3   root       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: 
1.1       root       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",
1.1.1.3   root       67:               (spaces + (sizeof spaces - 1 - indent * 2)));
1.1       root       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",
1.1.1.3   root      135:                     (spaces + (sizeof spaces - 1 - indent * 2)));
1.1       root      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",
1.1.1.3   root      152:                   (spaces + (sizeof spaces - 1 - indent * 2)));
1.1       root      153: 
                    154:        fprintf (outfile, "] ");
                    155:        sawclose = 1;
                    156:        indent -= 2;
                    157:        break;
                    158: 
1.1.1.3   root      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: 
1.1       root      169:       case 'i':
1.1.1.3   root      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:        }
1.1       root      181:        if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, i)
                    182:            && insn_name_ptr
                    183:            && XINT (in_rtx, i) >= 0)
1.1.1.3   root      184:          fprintf (outfile, " {%s}", insn_name_ptr[XINT (in_rtx, i)]);
1.1       root      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)
1.1.1.2   root      200:          fprintf (outfile, " %d", INSN_UID (XEXP (in_rtx, i)));
1.1       root      201:        else
1.1.1.2   root      202:          fprintf (outfile, " 0");
                    203:        sawclose = 0;
                    204:        break;
                    205: 
                    206:       case '*':
                    207:        fprintf (outfile, " Unknown");
1.1       root      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: 
1.1.1.4 ! root      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: 
1.1       root      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.