|
|
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.