OSDN Git Service

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