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

1.1       root        1: /* Print RTL for GNU C Compiler.
                      2:    Copyright (C) 1987, 1991 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: static FILE *outfile;
                     28: 
                     29: char spaces[] = "                                                                                                                                                                ";
                     30: 
                     31: static int sawclose = 0;
                     32: 
                     33: /* Names for patterns.  Non-zero only when linked with insn-output.c.  */
                     34: 
                     35: extern char **insn_name_ptr;
                     36: 
                     37: /* Print IN_RTX onto OUTFILE.  This is the recursive part of printing.  */
                     38: 
                     39: static void
                     40: print_rtx (in_rtx)
                     41:      register rtx in_rtx;
                     42: {
                     43:   static int indent;
                     44:   register int i, j;
                     45:   register char *format_ptr;
                     46:   register int is_insn;
                     47: 
                     48:   if (sawclose)
                     49:     {
                     50:       fprintf (outfile, "\n%s",
                     51:               (spaces + (sizeof spaces - indent * 2)));
                     52:       sawclose = 0;
                     53:     }
                     54: 
                     55:   if (in_rtx == 0)
                     56:     {
                     57:       fprintf (outfile, "(nil)");
                     58:       sawclose = 1;
                     59:       return;
                     60:     }
                     61: 
                     62:   /* print name of expression code */
                     63:   fprintf (outfile, "(%s", GET_RTX_NAME (GET_CODE (in_rtx)));
                     64: 
                     65:   if (in_rtx->in_struct)
                     66:     fprintf (outfile, "/s");
                     67: 
                     68:   if (in_rtx->volatil)
                     69:     fprintf (outfile, "/v");
                     70: 
                     71:   if (in_rtx->unchanging)
                     72:     fprintf (outfile, "/u");
                     73: 
                     74:   if (in_rtx->integrated)
                     75:     fprintf (outfile, "/i");
                     76: 
                     77:   if (GET_MODE (in_rtx) != VOIDmode)
                     78:     {
                     79:       /* Print REG_NOTE names for EXPR_LIST and INSN_LIST.  */
                     80:       if (GET_CODE (in_rtx) == EXPR_LIST || GET_CODE (in_rtx) == INSN_LIST)
                     81:        fprintf (outfile, ":%s", GET_REG_NOTE_NAME (GET_MODE (in_rtx)));
                     82:       else
                     83:        fprintf (outfile, ":%s", GET_MODE_NAME (GET_MODE (in_rtx)));
                     84:     }
                     85: 
                     86:   is_insn = (GET_RTX_CLASS (GET_CODE (in_rtx)) == 'i');
                     87:   format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
                     88: 
                     89:   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
                     90:     switch (*format_ptr++)
                     91:       {
                     92:       case 'S':
                     93:       case 's':
                     94:        if (XSTR (in_rtx, i) == 0)
                     95:          fprintf (outfile, " \"\"");
                     96:        else
                     97:          fprintf (outfile, " (\"%s\")", XSTR (in_rtx, i));
                     98:        sawclose = 1;
                     99:        break;
                    100: 
                    101:        /* 0 indicates a field for internal use that should not be printed.  */
                    102:       case '0':
                    103:        break;
                    104: 
                    105:       case 'e':
                    106:        indent += 2;
                    107:        if (!sawclose)
                    108:          fprintf (outfile, " ");
                    109:        print_rtx (XEXP (in_rtx, i));
                    110:        indent -= 2;
                    111:        break;
                    112: 
                    113:       case 'E':
                    114:       case 'V':
                    115:        indent += 2;
                    116:        if (sawclose)
                    117:          {
                    118:            fprintf (outfile, "\n%s",
                    119:                     (spaces + (sizeof spaces - indent * 2)));
                    120:            sawclose = 0;
                    121:          }
                    122:        fprintf (outfile, "[ ");
                    123:        if (NULL != XVEC (in_rtx, i))
                    124:          {
                    125:            indent += 2;
                    126:            if (XVECLEN (in_rtx, i))
                    127:              sawclose = 1;
                    128: 
                    129:            for (j = 0; j < XVECLEN (in_rtx, i); j++)
                    130:              print_rtx (XVECEXP (in_rtx, i, j));
                    131: 
                    132:            indent -= 2;
                    133:          }
                    134:        if (sawclose)
                    135:          fprintf (outfile, "\n%s",
                    136:                   (spaces + (sizeof spaces - indent * 2)));
                    137: 
                    138:        fprintf (outfile, "] ");
                    139:        sawclose = 1;
                    140:        indent -= 2;
                    141:        break;
                    142: 
                    143:       case 'i':
                    144:        fprintf (outfile, " %d", XINT (in_rtx, i));
                    145:        if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, i)
                    146:            && insn_name_ptr
                    147:            && XINT (in_rtx, i) >= 0)
                    148:            fprintf (outfile, " {%s}", insn_name_ptr[XINT (in_rtx, i)]);
                    149:        sawclose = 0;
                    150:        break;
                    151: 
                    152:       /* Print NOTE_INSN names rather than integer codes.  */
                    153: 
                    154:       case 'n':
                    155:        if (XINT (in_rtx, i) <= 0)
                    156:          fprintf (outfile, " %s", GET_NOTE_INSN_NAME (XINT (in_rtx, i)));
                    157:        else
                    158:          fprintf (outfile, " %d", XINT (in_rtx, i));
                    159:        sawclose = 0;
                    160:        break;
                    161: 
                    162:       case 'u':
                    163:        if (XEXP (in_rtx, i) != NULL)
1.1.1.2 ! root      164:          fprintf (outfile, " %d", INSN_UID (XEXP (in_rtx, i)));
1.1       root      165:        else
1.1.1.2 ! root      166:          fprintf (outfile, " 0");
        !           167:        sawclose = 0;
        !           168:        break;
        !           169: 
        !           170:       case '*':
        !           171:        fprintf (outfile, " Unknown");
1.1       root      172:        sawclose = 0;
                    173:        break;
                    174: 
                    175:       default:
                    176:        fprintf (stderr,
                    177:                 "switch format wrong in rtl.print_rtx(). format was: %c.\n",
                    178:                 format_ptr[-1]);
                    179:        abort ();
                    180:       }
                    181: 
                    182:   fprintf (outfile, ")");
                    183:   sawclose = 1;
                    184: }
                    185: 
                    186: /* Call this function from the debugger to see what X looks like.  */
                    187: 
                    188: void
                    189: debug_rtx (x)
                    190:      rtx x;
                    191: {
                    192:   outfile = stderr;
                    193:   print_rtx (x);
                    194:   fprintf (stderr, "\n");
                    195: }
                    196: 
                    197: /* External entry point for printing a chain of insns
                    198:    starting with RTX_FIRST onto file OUTF.
                    199:    A blank line separates insns.
                    200: 
                    201:    If RTX_FIRST is not an insn, then it alone is printed, with no newline.  */
                    202: 
                    203: void
                    204: print_rtl (outf, rtx_first)
                    205:      FILE *outf;
                    206:      rtx rtx_first;
                    207: {
                    208:   register rtx tmp_rtx;
                    209: 
                    210:   outfile = outf;
                    211:   sawclose = 0;
                    212: 
                    213:   if (rtx_first == 0)
                    214:     fprintf (outf, "(nil)\n");
                    215:   else
                    216:     switch (GET_CODE (rtx_first))
                    217:       {
                    218:       case INSN:
                    219:       case JUMP_INSN:
                    220:       case CALL_INSN:
                    221:       case NOTE:
                    222:       case CODE_LABEL:
                    223:       case BARRIER:
                    224:        for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
                    225:          {
                    226:            print_rtx (tmp_rtx);
                    227:            fprintf (outfile, "\n");
                    228:          }
                    229:        break;
                    230: 
                    231:       default:
                    232:        print_rtx (rtx_first);
                    233:       }
                    234: }

unix.superglobalmegacorp.com

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