|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.