|
|
1.1 root 1: /* Print RTL for GNU C Compiler.
1.1.1.5 root 2: Copyright (C) 1987, 1988, 1992 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
1.1.1.6 ! root 18: the Free Software Foundation, 59 Temple Place - Suite 330,
! 19: Boston, MA 02111-1307, USA. */
1.1 root 20:
21:
22: #include "config.h"
23: #include <ctype.h>
24: #include <stdio.h>
25: #include "rtl.h"
26:
27:
1.1.1.3 root 28: /* How to print out a register name.
29: We don't use PRINT_REG because some definitions of PRINT_REG
30: don't work here. */
31: #ifndef DEBUG_PRINT_REG
32: #define DEBUG_PRINT_REG(RTX, CODE, FILE) \
33: fprintf ((FILE), "%d %s", REGNO (RTX), reg_names[REGNO (RTX)])
34: #endif
35:
36: /* Array containing all of the register names */
37:
38: #ifdef DEBUG_REGISTER_NAMES
39: static char *reg_names[] = DEBUG_REGISTER_NAMES;
40: #else
41: static char *reg_names[] = REGISTER_NAMES;
42: #endif
43:
1.1 root 44: static FILE *outfile;
45:
46: char spaces[] = " ";
47:
48: static int sawclose = 0;
49:
50: /* Names for patterns. Non-zero only when linked with insn-output.c. */
51:
52: extern char **insn_name_ptr;
53:
54: /* Print IN_RTX onto OUTFILE. This is the recursive part of printing. */
55:
56: static void
57: print_rtx (in_rtx)
58: register rtx in_rtx;
59: {
60: static int indent;
61: register int i, j;
62: register char *format_ptr;
63: register int is_insn;
64:
65: if (sawclose)
66: {
67: fprintf (outfile, "\n%s",
1.1.1.3 root 68: (spaces + (sizeof spaces - 1 - indent * 2)));
1.1 root 69: sawclose = 0;
70: }
71:
72: if (in_rtx == 0)
73: {
74: fprintf (outfile, "(nil)");
75: sawclose = 1;
76: return;
77: }
78:
79: /* print name of expression code */
80: fprintf (outfile, "(%s", GET_RTX_NAME (GET_CODE (in_rtx)));
81:
82: if (in_rtx->in_struct)
83: fprintf (outfile, "/s");
84:
85: if (in_rtx->volatil)
86: fprintf (outfile, "/v");
87:
88: if (in_rtx->unchanging)
89: fprintf (outfile, "/u");
90:
91: if (in_rtx->integrated)
92: fprintf (outfile, "/i");
93:
94: if (GET_MODE (in_rtx) != VOIDmode)
95: {
96: /* Print REG_NOTE names for EXPR_LIST and INSN_LIST. */
97: if (GET_CODE (in_rtx) == EXPR_LIST || GET_CODE (in_rtx) == INSN_LIST)
98: fprintf (outfile, ":%s", GET_REG_NOTE_NAME (GET_MODE (in_rtx)));
99: else
100: fprintf (outfile, ":%s", GET_MODE_NAME (GET_MODE (in_rtx)));
101: }
102:
103: is_insn = (GET_RTX_CLASS (GET_CODE (in_rtx)) == 'i');
104: format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
105:
106: for (i = 0; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
107: switch (*format_ptr++)
108: {
109: case 'S':
110: case 's':
111: if (XSTR (in_rtx, i) == 0)
112: fprintf (outfile, " \"\"");
113: else
114: fprintf (outfile, " (\"%s\")", XSTR (in_rtx, i));
115: sawclose = 1;
116: break;
117:
118: /* 0 indicates a field for internal use that should not be printed. */
119: case '0':
120: break;
121:
122: case 'e':
123: indent += 2;
124: if (!sawclose)
125: fprintf (outfile, " ");
126: print_rtx (XEXP (in_rtx, i));
127: indent -= 2;
128: break;
129:
130: case 'E':
131: case 'V':
132: indent += 2;
133: if (sawclose)
134: {
135: fprintf (outfile, "\n%s",
1.1.1.3 root 136: (spaces + (sizeof spaces - 1 - indent * 2)));
1.1 root 137: sawclose = 0;
138: }
139: fprintf (outfile, "[ ");
140: if (NULL != XVEC (in_rtx, i))
141: {
142: indent += 2;
143: if (XVECLEN (in_rtx, i))
144: sawclose = 1;
145:
146: for (j = 0; j < XVECLEN (in_rtx, i); j++)
147: print_rtx (XVECEXP (in_rtx, i, j));
148:
149: indent -= 2;
150: }
151: if (sawclose)
152: fprintf (outfile, "\n%s",
1.1.1.3 root 153: (spaces + (sizeof spaces - 1 - indent * 2)));
1.1 root 154:
155: fprintf (outfile, "] ");
156: sawclose = 1;
157: indent -= 2;
158: break;
159:
1.1.1.3 root 160: case 'w':
161: fprintf (outfile,
162: #if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_INT
163: " %d",
164: #else
165: " %ld",
166: #endif
167: XWINT (in_rtx, i));
168: break;
169:
1.1 root 170: case 'i':
1.1.1.3 root 171: {
172: register int value = XINT (in_rtx, i);
173:
174: if (GET_CODE (in_rtx) == REG && value < FIRST_PSEUDO_REGISTER)
175: {
176: fputc (' ', outfile);
177: DEBUG_PRINT_REG (in_rtx, 0, outfile);
178: }
179: else
180: fprintf (outfile, " %d", value);
181: }
1.1 root 182: if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, i)
183: && insn_name_ptr
184: && XINT (in_rtx, i) >= 0)
1.1.1.3 root 185: fprintf (outfile, " {%s}", insn_name_ptr[XINT (in_rtx, i)]);
1.1 root 186: sawclose = 0;
187: break;
188:
189: /* Print NOTE_INSN names rather than integer codes. */
190:
191: case 'n':
192: if (XINT (in_rtx, i) <= 0)
193: fprintf (outfile, " %s", GET_NOTE_INSN_NAME (XINT (in_rtx, i)));
194: else
195: fprintf (outfile, " %d", XINT (in_rtx, i));
196: sawclose = 0;
197: break;
198:
199: case 'u':
200: if (XEXP (in_rtx, i) != NULL)
1.1.1.2 root 201: fprintf (outfile, " %d", INSN_UID (XEXP (in_rtx, i)));
1.1 root 202: else
1.1.1.2 root 203: fprintf (outfile, " 0");
204: sawclose = 0;
205: break;
206:
207: case '*':
208: fprintf (outfile, " Unknown");
1.1 root 209: sawclose = 0;
210: break;
211:
212: default:
213: fprintf (stderr,
214: "switch format wrong in rtl.print_rtx(). format was: %c.\n",
215: format_ptr[-1]);
216: abort ();
217: }
218:
219: fprintf (outfile, ")");
220: sawclose = 1;
221: }
222:
223: /* Call this function from the debugger to see what X looks like. */
224:
225: void
226: debug_rtx (x)
227: rtx x;
228: {
229: outfile = stderr;
230: print_rtx (x);
231: fprintf (stderr, "\n");
232: }
233:
1.1.1.4 root 234: /* Count of rtx's to print with debug_rtx_list.
235: This global exists because gdb user defined commands have no arguments. */
236:
237: int debug_rtx_count = 0; /* 0 is treated as equivalent to 1 */
238:
239: /* Call this function to print list from X on.
240:
241: N is a count of the rtx's to print. Positive values print from the specified
242: rtx on. Negative values print a window around the rtx.
243: EG: -5 prints 2 rtx's on either side (in addition to the specified rtx). */
244:
245: void
246: debug_rtx_list (x, n)
247: rtx x;
248: int n;
249: {
250: int i,count;
251: rtx insn;
252:
253: count = n == 0 ? 1 : n < 0 ? -n : n;
254:
255: /* If we are printing a window, back up to the start. */
256:
257: if (n < 0)
258: for (i = count / 2; i > 0; i--)
259: {
260: if (PREV_INSN (x) == 0)
261: break;
262: x = PREV_INSN (x);
263: }
264:
265: for (i = count, insn = x; i > 0 && insn != 0; i--, insn = NEXT_INSN (insn))
266: debug_rtx (insn);
267: }
268:
269: /* Call this function to search an rtx list to find one with insn uid UID,
270: and then call debug_rtx_list to print it, using DEBUG_RTX_COUNT.
271: The found insn is returned to enable further debugging analysis. */
272:
273: rtx
274: debug_rtx_find(x, uid)
275: rtx x;
276: int uid;
277: {
278: while (x != 0 && INSN_UID (x) != uid)
279: x = NEXT_INSN (x);
280: if (x != 0)
281: {
282: debug_rtx_list (x, debug_rtx_count);
283: return x;
284: }
285: else
286: {
287: fprintf (stderr, "insn uid %d not found\n", uid);
288: return 0;
289: }
290: }
291:
1.1 root 292: /* External entry point for printing a chain of insns
293: starting with RTX_FIRST onto file OUTF.
294: A blank line separates insns.
295:
296: If RTX_FIRST is not an insn, then it alone is printed, with no newline. */
297:
298: void
299: print_rtl (outf, rtx_first)
300: FILE *outf;
301: rtx rtx_first;
302: {
303: register rtx tmp_rtx;
304:
305: outfile = outf;
306: sawclose = 0;
307:
308: if (rtx_first == 0)
309: fprintf (outf, "(nil)\n");
310: else
311: switch (GET_CODE (rtx_first))
312: {
313: case INSN:
314: case JUMP_INSN:
315: case CALL_INSN:
316: case NOTE:
317: case CODE_LABEL:
318: case BARRIER:
319: for (tmp_rtx = rtx_first; NULL != tmp_rtx; tmp_rtx = NEXT_INSN (tmp_rtx))
320: {
321: print_rtx (tmp_rtx);
322: fprintf (outfile, "\n");
323: }
324: break;
325:
326: default:
327: print_rtx (rtx_first);
328: }
329: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.