|
|
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) ! 164: fprintf(outfile, " %d", INSN_UID (XEXP (in_rtx, i))); ! 165: else ! 166: fprintf(outfile, " 0"); ! 167: sawclose = 0; ! 168: break; ! 169: ! 170: default: ! 171: fprintf (stderr, ! 172: "switch format wrong in rtl.print_rtx(). format was: %c.\n", ! 173: format_ptr[-1]); ! 174: abort (); ! 175: } ! 176: ! 177: fprintf (outfile, ")"); ! 178: sawclose = 1; ! 179: } ! 180: ! 181: /* Call this function from the debugger to see what X looks like. */ ! 182: ! 183: void ! 184: debug_rtx (x) ! 185: rtx x; ! 186: { ! 187: outfile = stderr; ! 188: print_rtx (x); ! 189: fprintf (stderr, "\n"); ! 190: } ! 191: ! 192: /* External entry point for printing a chain of insns ! 193: starting with RTX_FIRST onto file OUTF. ! 194: A blank line separates insns. ! 195: ! 196: If RTX_FIRST is not an insn, then it alone is printed, with no newline. */ ! 197: ! 198: void ! 199: print_rtl (outf, rtx_first) ! 200: FILE *outf; ! 201: rtx rtx_first; ! 202: { ! 203: register rtx tmp_rtx; ! 204: ! 205: outfile = outf; ! 206: sawclose = 0; ! 207: ! 208: if (rtx_first == 0) ! 209: fprintf (outf, "(nil)\n"); ! 210: else ! 211: switch (GET_CODE (rtx_first)) ! 212: { ! 213: case INSN: ! 214: case JUMP_INSN: ! 215: case CALL_INSN: ! 216: case NOTE: ! 217: case CODE_LABEL: ! 218: case BARRIER: ! 219: for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx)) ! 220: { ! 221: print_rtx (tmp_rtx); ! 222: fprintf (outfile, "\n"); ! 223: } ! 224: break; ! 225: ! 226: default: ! 227: print_rtx (rtx_first); ! 228: } ! 229: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.