1*e4b17023SJohn Marino /* Print RTL for GCC.
2*e4b17023SJohn Marino Copyright (C) 1987, 1988, 1992, 1997, 1998, 1999, 2000, 2002, 2003,
3*e4b17023SJohn Marino 2004, 2005, 2007, 2008, 2009, 2010, 2011
4*e4b17023SJohn Marino Free Software Foundation, Inc.
5*e4b17023SJohn Marino
6*e4b17023SJohn Marino This file is part of GCC.
7*e4b17023SJohn Marino
8*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
9*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
10*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
11*e4b17023SJohn Marino version.
12*e4b17023SJohn Marino
13*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
15*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16*e4b17023SJohn Marino for more details.
17*e4b17023SJohn Marino
18*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
19*e4b17023SJohn Marino along with GCC; see the file COPYING3. If not see
20*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */
21*e4b17023SJohn Marino
22*e4b17023SJohn Marino /* This file is compiled twice: once for the generator programs,
23*e4b17023SJohn Marino once for the compiler. */
24*e4b17023SJohn Marino #ifdef GENERATOR_FILE
25*e4b17023SJohn Marino #include "bconfig.h"
26*e4b17023SJohn Marino #else
27*e4b17023SJohn Marino #include "config.h"
28*e4b17023SJohn Marino #endif
29*e4b17023SJohn Marino
30*e4b17023SJohn Marino #include "system.h"
31*e4b17023SJohn Marino #include "coretypes.h"
32*e4b17023SJohn Marino #include "tm.h"
33*e4b17023SJohn Marino #include "rtl.h"
34*e4b17023SJohn Marino
35*e4b17023SJohn Marino /* These headers all define things which are not available in
36*e4b17023SJohn Marino generator programs. */
37*e4b17023SJohn Marino #ifndef GENERATOR_FILE
38*e4b17023SJohn Marino #include "tree.h"
39*e4b17023SJohn Marino #include "flags.h"
40*e4b17023SJohn Marino #include "hard-reg-set.h"
41*e4b17023SJohn Marino #include "basic-block.h"
42*e4b17023SJohn Marino #include "diagnostic.h"
43*e4b17023SJohn Marino #include "tree-pretty-print.h"
44*e4b17023SJohn Marino #include "cselib.h"
45*e4b17023SJohn Marino #include "tree-pass.h"
46*e4b17023SJohn Marino #include "dwarf2out.h"
47*e4b17023SJohn Marino #endif
48*e4b17023SJohn Marino
49*e4b17023SJohn Marino static FILE *outfile;
50*e4b17023SJohn Marino
51*e4b17023SJohn Marino static int sawclose = 0;
52*e4b17023SJohn Marino
53*e4b17023SJohn Marino static int indent;
54*e4b17023SJohn Marino
55*e4b17023SJohn Marino static void print_rtx (const_rtx);
56*e4b17023SJohn Marino
57*e4b17023SJohn Marino /* String printed at beginning of each RTL when it is dumped.
58*e4b17023SJohn Marino This string is set to ASM_COMMENT_START when the RTL is dumped in
59*e4b17023SJohn Marino the assembly output file. */
60*e4b17023SJohn Marino const char *print_rtx_head = "";
61*e4b17023SJohn Marino
62*e4b17023SJohn Marino #ifdef GENERATOR_FILE
63*e4b17023SJohn Marino /* These are defined from the .opt file when not used in generator
64*e4b17023SJohn Marino programs. */
65*e4b17023SJohn Marino
66*e4b17023SJohn Marino /* Nonzero means suppress output of instruction numbers
67*e4b17023SJohn Marino in debugging dumps.
68*e4b17023SJohn Marino This must be defined here so that programs like gencodes can be linked. */
69*e4b17023SJohn Marino int flag_dump_unnumbered = 0;
70*e4b17023SJohn Marino
71*e4b17023SJohn Marino /* Nonzero means suppress output of instruction numbers for previous
72*e4b17023SJohn Marino and next insns in debugging dumps.
73*e4b17023SJohn Marino This must be defined here so that programs like gencodes can be linked. */
74*e4b17023SJohn Marino int flag_dump_unnumbered_links = 0;
75*e4b17023SJohn Marino #endif
76*e4b17023SJohn Marino
77*e4b17023SJohn Marino /* Nonzero means use simplified format without flags, modes, etc. */
78*e4b17023SJohn Marino int flag_simple = 0;
79*e4b17023SJohn Marino
80*e4b17023SJohn Marino /* Nonzero if we are dumping graphical description. */
81*e4b17023SJohn Marino int dump_for_graph;
82*e4b17023SJohn Marino
83*e4b17023SJohn Marino #ifndef GENERATOR_FILE
84*e4b17023SJohn Marino void
print_mem_expr(FILE * outfile,const_tree expr)85*e4b17023SJohn Marino print_mem_expr (FILE *outfile, const_tree expr)
86*e4b17023SJohn Marino {
87*e4b17023SJohn Marino fputc (' ', outfile);
88*e4b17023SJohn Marino print_generic_expr (outfile, CONST_CAST_TREE (expr), dump_flags);
89*e4b17023SJohn Marino }
90*e4b17023SJohn Marino #endif
91*e4b17023SJohn Marino
92*e4b17023SJohn Marino /* Print IN_RTX onto OUTFILE. This is the recursive part of printing. */
93*e4b17023SJohn Marino
94*e4b17023SJohn Marino static void
print_rtx(const_rtx in_rtx)95*e4b17023SJohn Marino print_rtx (const_rtx in_rtx)
96*e4b17023SJohn Marino {
97*e4b17023SJohn Marino int i = 0;
98*e4b17023SJohn Marino int j;
99*e4b17023SJohn Marino const char *format_ptr;
100*e4b17023SJohn Marino int is_insn;
101*e4b17023SJohn Marino
102*e4b17023SJohn Marino if (sawclose)
103*e4b17023SJohn Marino {
104*e4b17023SJohn Marino if (flag_simple)
105*e4b17023SJohn Marino fputc (' ', outfile);
106*e4b17023SJohn Marino else
107*e4b17023SJohn Marino fprintf (outfile, "\n%s%*s", print_rtx_head, indent * 2, "");
108*e4b17023SJohn Marino sawclose = 0;
109*e4b17023SJohn Marino }
110*e4b17023SJohn Marino
111*e4b17023SJohn Marino if (in_rtx == 0)
112*e4b17023SJohn Marino {
113*e4b17023SJohn Marino fputs ("(nil)", outfile);
114*e4b17023SJohn Marino sawclose = 1;
115*e4b17023SJohn Marino return;
116*e4b17023SJohn Marino }
117*e4b17023SJohn Marino else if (GET_CODE (in_rtx) > NUM_RTX_CODE)
118*e4b17023SJohn Marino {
119*e4b17023SJohn Marino fprintf (outfile, "(??? bad code %d\n%s%*s)", GET_CODE (in_rtx),
120*e4b17023SJohn Marino print_rtx_head, indent * 2, "");
121*e4b17023SJohn Marino sawclose = 1;
122*e4b17023SJohn Marino return;
123*e4b17023SJohn Marino }
124*e4b17023SJohn Marino
125*e4b17023SJohn Marino is_insn = INSN_P (in_rtx);
126*e4b17023SJohn Marino
127*e4b17023SJohn Marino /* When printing in VCG format we write INSNs, NOTE, LABEL, and BARRIER
128*e4b17023SJohn Marino in separate nodes and therefore have to handle them special here. */
129*e4b17023SJohn Marino if (dump_for_graph
130*e4b17023SJohn Marino && (is_insn || NOTE_P (in_rtx)
131*e4b17023SJohn Marino || LABEL_P (in_rtx) || BARRIER_P (in_rtx)))
132*e4b17023SJohn Marino {
133*e4b17023SJohn Marino i = 3;
134*e4b17023SJohn Marino indent = 0;
135*e4b17023SJohn Marino }
136*e4b17023SJohn Marino else
137*e4b17023SJohn Marino {
138*e4b17023SJohn Marino /* Print name of expression code. */
139*e4b17023SJohn Marino if (flag_simple && CONST_INT_P (in_rtx))
140*e4b17023SJohn Marino fputc ('(', outfile);
141*e4b17023SJohn Marino else
142*e4b17023SJohn Marino fprintf (outfile, "(%s", GET_RTX_NAME (GET_CODE (in_rtx)));
143*e4b17023SJohn Marino
144*e4b17023SJohn Marino if (! flag_simple)
145*e4b17023SJohn Marino {
146*e4b17023SJohn Marino if (RTX_FLAG (in_rtx, in_struct))
147*e4b17023SJohn Marino fputs ("/s", outfile);
148*e4b17023SJohn Marino
149*e4b17023SJohn Marino if (RTX_FLAG (in_rtx, volatil))
150*e4b17023SJohn Marino fputs ("/v", outfile);
151*e4b17023SJohn Marino
152*e4b17023SJohn Marino if (RTX_FLAG (in_rtx, unchanging))
153*e4b17023SJohn Marino fputs ("/u", outfile);
154*e4b17023SJohn Marino
155*e4b17023SJohn Marino if (RTX_FLAG (in_rtx, frame_related))
156*e4b17023SJohn Marino fputs ("/f", outfile);
157*e4b17023SJohn Marino
158*e4b17023SJohn Marino if (RTX_FLAG (in_rtx, jump))
159*e4b17023SJohn Marino fputs ("/j", outfile);
160*e4b17023SJohn Marino
161*e4b17023SJohn Marino if (RTX_FLAG (in_rtx, call))
162*e4b17023SJohn Marino fputs ("/c", outfile);
163*e4b17023SJohn Marino
164*e4b17023SJohn Marino if (RTX_FLAG (in_rtx, return_val))
165*e4b17023SJohn Marino fputs ("/i", outfile);
166*e4b17023SJohn Marino
167*e4b17023SJohn Marino /* Print REG_NOTE names for EXPR_LIST and INSN_LIST. */
168*e4b17023SJohn Marino if ((GET_CODE (in_rtx) == EXPR_LIST
169*e4b17023SJohn Marino || GET_CODE (in_rtx) == INSN_LIST)
170*e4b17023SJohn Marino && (int)GET_MODE (in_rtx) < REG_NOTE_MAX)
171*e4b17023SJohn Marino fprintf (outfile, ":%s",
172*e4b17023SJohn Marino GET_REG_NOTE_NAME (GET_MODE (in_rtx)));
173*e4b17023SJohn Marino
174*e4b17023SJohn Marino /* For other rtl, print the mode if it's not VOID. */
175*e4b17023SJohn Marino else if (GET_MODE (in_rtx) != VOIDmode)
176*e4b17023SJohn Marino fprintf (outfile, ":%s", GET_MODE_NAME (GET_MODE (in_rtx)));
177*e4b17023SJohn Marino
178*e4b17023SJohn Marino #ifndef GENERATOR_FILE
179*e4b17023SJohn Marino if (GET_CODE (in_rtx) == VAR_LOCATION)
180*e4b17023SJohn Marino {
181*e4b17023SJohn Marino if (TREE_CODE (PAT_VAR_LOCATION_DECL (in_rtx)) == STRING_CST)
182*e4b17023SJohn Marino fputs (" <debug string placeholder>", outfile);
183*e4b17023SJohn Marino else
184*e4b17023SJohn Marino print_mem_expr (outfile, PAT_VAR_LOCATION_DECL (in_rtx));
185*e4b17023SJohn Marino fputc (' ', outfile);
186*e4b17023SJohn Marino print_rtx (PAT_VAR_LOCATION_LOC (in_rtx));
187*e4b17023SJohn Marino if (PAT_VAR_LOCATION_STATUS (in_rtx)
188*e4b17023SJohn Marino == VAR_INIT_STATUS_UNINITIALIZED)
189*e4b17023SJohn Marino fprintf (outfile, " [uninit]");
190*e4b17023SJohn Marino sawclose = 1;
191*e4b17023SJohn Marino i = GET_RTX_LENGTH (VAR_LOCATION);
192*e4b17023SJohn Marino }
193*e4b17023SJohn Marino #endif
194*e4b17023SJohn Marino }
195*e4b17023SJohn Marino }
196*e4b17023SJohn Marino
197*e4b17023SJohn Marino #ifndef GENERATOR_FILE
198*e4b17023SJohn Marino if (GET_CODE (in_rtx) == CONST_DOUBLE && FLOAT_MODE_P (GET_MODE (in_rtx)))
199*e4b17023SJohn Marino i = 5;
200*e4b17023SJohn Marino #endif
201*e4b17023SJohn Marino
202*e4b17023SJohn Marino /* Get the format string and skip the first elements if we have handled
203*e4b17023SJohn Marino them already. */
204*e4b17023SJohn Marino format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx)) + i;
205*e4b17023SJohn Marino for (; i < GET_RTX_LENGTH (GET_CODE (in_rtx)); i++)
206*e4b17023SJohn Marino switch (*format_ptr++)
207*e4b17023SJohn Marino {
208*e4b17023SJohn Marino const char *str;
209*e4b17023SJohn Marino
210*e4b17023SJohn Marino case 'T':
211*e4b17023SJohn Marino str = XTMPL (in_rtx, i);
212*e4b17023SJohn Marino goto string;
213*e4b17023SJohn Marino
214*e4b17023SJohn Marino case 'S':
215*e4b17023SJohn Marino case 's':
216*e4b17023SJohn Marino str = XSTR (in_rtx, i);
217*e4b17023SJohn Marino string:
218*e4b17023SJohn Marino
219*e4b17023SJohn Marino if (str == 0)
220*e4b17023SJohn Marino fputs (dump_for_graph ? " \\\"\\\"" : " \"\"", outfile);
221*e4b17023SJohn Marino else
222*e4b17023SJohn Marino {
223*e4b17023SJohn Marino if (dump_for_graph)
224*e4b17023SJohn Marino fprintf (outfile, " (\\\"%s\\\")", str);
225*e4b17023SJohn Marino else
226*e4b17023SJohn Marino fprintf (outfile, " (\"%s\")", str);
227*e4b17023SJohn Marino }
228*e4b17023SJohn Marino sawclose = 1;
229*e4b17023SJohn Marino break;
230*e4b17023SJohn Marino
231*e4b17023SJohn Marino /* 0 indicates a field for internal use that should not be printed.
232*e4b17023SJohn Marino An exception is the third field of a NOTE, where it indicates
233*e4b17023SJohn Marino that the field has several different valid contents. */
234*e4b17023SJohn Marino case '0':
235*e4b17023SJohn Marino if (i == 1 && REG_P (in_rtx))
236*e4b17023SJohn Marino {
237*e4b17023SJohn Marino if (REGNO (in_rtx) != ORIGINAL_REGNO (in_rtx))
238*e4b17023SJohn Marino fprintf (outfile, " [%d]", ORIGINAL_REGNO (in_rtx));
239*e4b17023SJohn Marino }
240*e4b17023SJohn Marino #ifndef GENERATOR_FILE
241*e4b17023SJohn Marino else if (i == 1 && GET_CODE (in_rtx) == SYMBOL_REF)
242*e4b17023SJohn Marino {
243*e4b17023SJohn Marino int flags = SYMBOL_REF_FLAGS (in_rtx);
244*e4b17023SJohn Marino if (flags)
245*e4b17023SJohn Marino fprintf (outfile, " [flags %#x]", flags);
246*e4b17023SJohn Marino }
247*e4b17023SJohn Marino else if (i == 2 && GET_CODE (in_rtx) == SYMBOL_REF)
248*e4b17023SJohn Marino {
249*e4b17023SJohn Marino tree decl = SYMBOL_REF_DECL (in_rtx);
250*e4b17023SJohn Marino if (decl)
251*e4b17023SJohn Marino print_node_brief (outfile, "", decl, dump_flags);
252*e4b17023SJohn Marino }
253*e4b17023SJohn Marino #endif
254*e4b17023SJohn Marino else if (i == 4 && NOTE_P (in_rtx))
255*e4b17023SJohn Marino {
256*e4b17023SJohn Marino switch (NOTE_KIND (in_rtx))
257*e4b17023SJohn Marino {
258*e4b17023SJohn Marino case NOTE_INSN_EH_REGION_BEG:
259*e4b17023SJohn Marino case NOTE_INSN_EH_REGION_END:
260*e4b17023SJohn Marino if (flag_dump_unnumbered)
261*e4b17023SJohn Marino fprintf (outfile, " #");
262*e4b17023SJohn Marino else
263*e4b17023SJohn Marino fprintf (outfile, " %d", NOTE_EH_HANDLER (in_rtx));
264*e4b17023SJohn Marino sawclose = 1;
265*e4b17023SJohn Marino break;
266*e4b17023SJohn Marino
267*e4b17023SJohn Marino case NOTE_INSN_BLOCK_BEG:
268*e4b17023SJohn Marino case NOTE_INSN_BLOCK_END:
269*e4b17023SJohn Marino #ifndef GENERATOR_FILE
270*e4b17023SJohn Marino dump_addr (outfile, " ", NOTE_BLOCK (in_rtx));
271*e4b17023SJohn Marino #endif
272*e4b17023SJohn Marino sawclose = 1;
273*e4b17023SJohn Marino break;
274*e4b17023SJohn Marino
275*e4b17023SJohn Marino case NOTE_INSN_BASIC_BLOCK:
276*e4b17023SJohn Marino {
277*e4b17023SJohn Marino #ifndef GENERATOR_FILE
278*e4b17023SJohn Marino basic_block bb = NOTE_BASIC_BLOCK (in_rtx);
279*e4b17023SJohn Marino if (bb != 0)
280*e4b17023SJohn Marino fprintf (outfile, " [bb %d]", bb->index);
281*e4b17023SJohn Marino #endif
282*e4b17023SJohn Marino break;
283*e4b17023SJohn Marino }
284*e4b17023SJohn Marino
285*e4b17023SJohn Marino case NOTE_INSN_DELETED_LABEL:
286*e4b17023SJohn Marino case NOTE_INSN_DELETED_DEBUG_LABEL:
287*e4b17023SJohn Marino {
288*e4b17023SJohn Marino const char *label = NOTE_DELETED_LABEL_NAME (in_rtx);
289*e4b17023SJohn Marino if (label)
290*e4b17023SJohn Marino fprintf (outfile, " (\"%s\")", label);
291*e4b17023SJohn Marino else
292*e4b17023SJohn Marino fprintf (outfile, " \"\"");
293*e4b17023SJohn Marino }
294*e4b17023SJohn Marino break;
295*e4b17023SJohn Marino
296*e4b17023SJohn Marino case NOTE_INSN_SWITCH_TEXT_SECTIONS:
297*e4b17023SJohn Marino {
298*e4b17023SJohn Marino #ifndef GENERATOR_FILE
299*e4b17023SJohn Marino basic_block bb = NOTE_BASIC_BLOCK (in_rtx);
300*e4b17023SJohn Marino if (bb != 0)
301*e4b17023SJohn Marino fprintf (outfile, " [bb %d]", bb->index);
302*e4b17023SJohn Marino #endif
303*e4b17023SJohn Marino break;
304*e4b17023SJohn Marino }
305*e4b17023SJohn Marino
306*e4b17023SJohn Marino case NOTE_INSN_VAR_LOCATION:
307*e4b17023SJohn Marino case NOTE_INSN_CALL_ARG_LOCATION:
308*e4b17023SJohn Marino #ifndef GENERATOR_FILE
309*e4b17023SJohn Marino fputc (' ', outfile);
310*e4b17023SJohn Marino print_rtx (NOTE_VAR_LOCATION (in_rtx));
311*e4b17023SJohn Marino #endif
312*e4b17023SJohn Marino break;
313*e4b17023SJohn Marino
314*e4b17023SJohn Marino case NOTE_INSN_CFI:
315*e4b17023SJohn Marino #ifndef GENERATOR_FILE
316*e4b17023SJohn Marino fputc ('\n', outfile);
317*e4b17023SJohn Marino output_cfi_directive (outfile, NOTE_CFI (in_rtx));
318*e4b17023SJohn Marino fputc ('\t', outfile);
319*e4b17023SJohn Marino #endif
320*e4b17023SJohn Marino break;
321*e4b17023SJohn Marino
322*e4b17023SJohn Marino default:
323*e4b17023SJohn Marino break;
324*e4b17023SJohn Marino }
325*e4b17023SJohn Marino }
326*e4b17023SJohn Marino else if (i == 8 && JUMP_P (in_rtx) && JUMP_LABEL (in_rtx) != NULL)
327*e4b17023SJohn Marino {
328*e4b17023SJohn Marino /* Output the JUMP_LABEL reference. */
329*e4b17023SJohn Marino fprintf (outfile, "\n%s%*s -> ", print_rtx_head, indent * 2, "");
330*e4b17023SJohn Marino if (GET_CODE (JUMP_LABEL (in_rtx)) == RETURN)
331*e4b17023SJohn Marino fprintf (outfile, "return");
332*e4b17023SJohn Marino else if (GET_CODE (JUMP_LABEL (in_rtx)) == SIMPLE_RETURN)
333*e4b17023SJohn Marino fprintf (outfile, "simple_return");
334*e4b17023SJohn Marino else
335*e4b17023SJohn Marino fprintf (outfile, "%d", INSN_UID (JUMP_LABEL (in_rtx)));
336*e4b17023SJohn Marino }
337*e4b17023SJohn Marino else if (i == 0 && GET_CODE (in_rtx) == VALUE)
338*e4b17023SJohn Marino {
339*e4b17023SJohn Marino #ifndef GENERATOR_FILE
340*e4b17023SJohn Marino cselib_val *val = CSELIB_VAL_PTR (in_rtx);
341*e4b17023SJohn Marino
342*e4b17023SJohn Marino fprintf (outfile, " %u:%u", val->uid, val->hash);
343*e4b17023SJohn Marino dump_addr (outfile, " @", in_rtx);
344*e4b17023SJohn Marino dump_addr (outfile, "/", (void*)val);
345*e4b17023SJohn Marino #endif
346*e4b17023SJohn Marino }
347*e4b17023SJohn Marino else if (i == 0 && GET_CODE (in_rtx) == DEBUG_EXPR)
348*e4b17023SJohn Marino {
349*e4b17023SJohn Marino #ifndef GENERATOR_FILE
350*e4b17023SJohn Marino fprintf (outfile, " D#%i",
351*e4b17023SJohn Marino DEBUG_TEMP_UID (DEBUG_EXPR_TREE_DECL (in_rtx)));
352*e4b17023SJohn Marino #endif
353*e4b17023SJohn Marino }
354*e4b17023SJohn Marino else if (i == 0 && GET_CODE (in_rtx) == ENTRY_VALUE)
355*e4b17023SJohn Marino {
356*e4b17023SJohn Marino indent += 2;
357*e4b17023SJohn Marino if (!sawclose)
358*e4b17023SJohn Marino fprintf (outfile, " ");
359*e4b17023SJohn Marino print_rtx (ENTRY_VALUE_EXP (in_rtx));
360*e4b17023SJohn Marino indent -= 2;
361*e4b17023SJohn Marino }
362*e4b17023SJohn Marino break;
363*e4b17023SJohn Marino
364*e4b17023SJohn Marino case 'e':
365*e4b17023SJohn Marino do_e:
366*e4b17023SJohn Marino indent += 2;
367*e4b17023SJohn Marino if (i == 7 && INSN_P (in_rtx))
368*e4b17023SJohn Marino /* Put REG_NOTES on their own line. */
369*e4b17023SJohn Marino fprintf (outfile, "\n%s%*s",
370*e4b17023SJohn Marino print_rtx_head, indent * 2, "");
371*e4b17023SJohn Marino if (!sawclose)
372*e4b17023SJohn Marino fprintf (outfile, " ");
373*e4b17023SJohn Marino print_rtx (XEXP (in_rtx, i));
374*e4b17023SJohn Marino indent -= 2;
375*e4b17023SJohn Marino break;
376*e4b17023SJohn Marino
377*e4b17023SJohn Marino case 'E':
378*e4b17023SJohn Marino case 'V':
379*e4b17023SJohn Marino indent += 2;
380*e4b17023SJohn Marino if (sawclose)
381*e4b17023SJohn Marino {
382*e4b17023SJohn Marino fprintf (outfile, "\n%s%*s",
383*e4b17023SJohn Marino print_rtx_head, indent * 2, "");
384*e4b17023SJohn Marino sawclose = 0;
385*e4b17023SJohn Marino }
386*e4b17023SJohn Marino fputs (" [", outfile);
387*e4b17023SJohn Marino if (NULL != XVEC (in_rtx, i))
388*e4b17023SJohn Marino {
389*e4b17023SJohn Marino indent += 2;
390*e4b17023SJohn Marino if (XVECLEN (in_rtx, i))
391*e4b17023SJohn Marino sawclose = 1;
392*e4b17023SJohn Marino
393*e4b17023SJohn Marino for (j = 0; j < XVECLEN (in_rtx, i); j++)
394*e4b17023SJohn Marino print_rtx (XVECEXP (in_rtx, i, j));
395*e4b17023SJohn Marino
396*e4b17023SJohn Marino indent -= 2;
397*e4b17023SJohn Marino }
398*e4b17023SJohn Marino if (sawclose)
399*e4b17023SJohn Marino fprintf (outfile, "\n%s%*s", print_rtx_head, indent * 2, "");
400*e4b17023SJohn Marino
401*e4b17023SJohn Marino fputs ("]", outfile);
402*e4b17023SJohn Marino sawclose = 1;
403*e4b17023SJohn Marino indent -= 2;
404*e4b17023SJohn Marino break;
405*e4b17023SJohn Marino
406*e4b17023SJohn Marino case 'w':
407*e4b17023SJohn Marino if (! flag_simple)
408*e4b17023SJohn Marino fprintf (outfile, " ");
409*e4b17023SJohn Marino fprintf (outfile, HOST_WIDE_INT_PRINT_DEC, XWINT (in_rtx, i));
410*e4b17023SJohn Marino if (! flag_simple)
411*e4b17023SJohn Marino fprintf (outfile, " [" HOST_WIDE_INT_PRINT_HEX "]",
412*e4b17023SJohn Marino (unsigned HOST_WIDE_INT) XWINT (in_rtx, i));
413*e4b17023SJohn Marino break;
414*e4b17023SJohn Marino
415*e4b17023SJohn Marino case 'i':
416*e4b17023SJohn Marino if (i == 5 && INSN_P (in_rtx))
417*e4b17023SJohn Marino {
418*e4b17023SJohn Marino #ifndef GENERATOR_FILE
419*e4b17023SJohn Marino /* Pretty-print insn locators. Ignore scoping as it is mostly
420*e4b17023SJohn Marino redundant with line number information and do not print anything
421*e4b17023SJohn Marino when there is no location information available. */
422*e4b17023SJohn Marino if (INSN_LOCATOR (in_rtx) && insn_file (in_rtx))
423*e4b17023SJohn Marino fprintf(outfile, " %s:%i", insn_file (in_rtx), insn_line (in_rtx));
424*e4b17023SJohn Marino #endif
425*e4b17023SJohn Marino }
426*e4b17023SJohn Marino else if (i == 6 && GET_CODE (in_rtx) == ASM_OPERANDS)
427*e4b17023SJohn Marino {
428*e4b17023SJohn Marino #ifndef GENERATOR_FILE
429*e4b17023SJohn Marino fprintf (outfile, " %s:%i",
430*e4b17023SJohn Marino locator_file (ASM_OPERANDS_SOURCE_LOCATION (in_rtx)),
431*e4b17023SJohn Marino locator_line (ASM_OPERANDS_SOURCE_LOCATION (in_rtx)));
432*e4b17023SJohn Marino #endif
433*e4b17023SJohn Marino }
434*e4b17023SJohn Marino else if (i == 1 && GET_CODE (in_rtx) == ASM_INPUT)
435*e4b17023SJohn Marino {
436*e4b17023SJohn Marino #ifndef GENERATOR_FILE
437*e4b17023SJohn Marino fprintf (outfile, " %s:%i",
438*e4b17023SJohn Marino locator_file (ASM_INPUT_SOURCE_LOCATION (in_rtx)),
439*e4b17023SJohn Marino locator_line (ASM_INPUT_SOURCE_LOCATION (in_rtx)));
440*e4b17023SJohn Marino #endif
441*e4b17023SJohn Marino }
442*e4b17023SJohn Marino else if (i == 6 && NOTE_P (in_rtx))
443*e4b17023SJohn Marino {
444*e4b17023SJohn Marino /* This field is only used for NOTE_INSN_DELETED_LABEL, and
445*e4b17023SJohn Marino other times often contains garbage from INSN->NOTE death. */
446*e4b17023SJohn Marino if (NOTE_KIND (in_rtx) == NOTE_INSN_DELETED_LABEL
447*e4b17023SJohn Marino || NOTE_KIND (in_rtx) == NOTE_INSN_DELETED_DEBUG_LABEL)
448*e4b17023SJohn Marino fprintf (outfile, " %d", XINT (in_rtx, i));
449*e4b17023SJohn Marino }
450*e4b17023SJohn Marino #if !defined(GENERATOR_FILE) && NUM_UNSPECV_VALUES > 0
451*e4b17023SJohn Marino else if (i == 1
452*e4b17023SJohn Marino && GET_CODE (in_rtx) == UNSPEC_VOLATILE
453*e4b17023SJohn Marino && XINT (in_rtx, 1) >= 0
454*e4b17023SJohn Marino && XINT (in_rtx, 1) < NUM_UNSPECV_VALUES)
455*e4b17023SJohn Marino fprintf (outfile, " %s", unspecv_strings[XINT (in_rtx, 1)]);
456*e4b17023SJohn Marino #endif
457*e4b17023SJohn Marino #if !defined(GENERATOR_FILE) && NUM_UNSPEC_VALUES > 0
458*e4b17023SJohn Marino else if (i == 1
459*e4b17023SJohn Marino && (GET_CODE (in_rtx) == UNSPEC
460*e4b17023SJohn Marino || GET_CODE (in_rtx) == UNSPEC_VOLATILE)
461*e4b17023SJohn Marino && XINT (in_rtx, 1) >= 0
462*e4b17023SJohn Marino && XINT (in_rtx, 1) < NUM_UNSPEC_VALUES)
463*e4b17023SJohn Marino fprintf (outfile, " %s", unspec_strings[XINT (in_rtx, 1)]);
464*e4b17023SJohn Marino #endif
465*e4b17023SJohn Marino else
466*e4b17023SJohn Marino {
467*e4b17023SJohn Marino int value = XINT (in_rtx, i);
468*e4b17023SJohn Marino const char *name;
469*e4b17023SJohn Marino
470*e4b17023SJohn Marino #ifndef GENERATOR_FILE
471*e4b17023SJohn Marino if (REG_P (in_rtx) && (unsigned) value < FIRST_PSEUDO_REGISTER)
472*e4b17023SJohn Marino fprintf (outfile, " %d %s", value, reg_names[value]);
473*e4b17023SJohn Marino else if (REG_P (in_rtx)
474*e4b17023SJohn Marino && (unsigned) value <= LAST_VIRTUAL_REGISTER)
475*e4b17023SJohn Marino {
476*e4b17023SJohn Marino if (value == VIRTUAL_INCOMING_ARGS_REGNUM)
477*e4b17023SJohn Marino fprintf (outfile, " %d virtual-incoming-args", value);
478*e4b17023SJohn Marino else if (value == VIRTUAL_STACK_VARS_REGNUM)
479*e4b17023SJohn Marino fprintf (outfile, " %d virtual-stack-vars", value);
480*e4b17023SJohn Marino else if (value == VIRTUAL_STACK_DYNAMIC_REGNUM)
481*e4b17023SJohn Marino fprintf (outfile, " %d virtual-stack-dynamic", value);
482*e4b17023SJohn Marino else if (value == VIRTUAL_OUTGOING_ARGS_REGNUM)
483*e4b17023SJohn Marino fprintf (outfile, " %d virtual-outgoing-args", value);
484*e4b17023SJohn Marino else if (value == VIRTUAL_CFA_REGNUM)
485*e4b17023SJohn Marino fprintf (outfile, " %d virtual-cfa", value);
486*e4b17023SJohn Marino else if (value == VIRTUAL_PREFERRED_STACK_BOUNDARY_REGNUM)
487*e4b17023SJohn Marino fprintf (outfile, " %d virtual-preferred-stack-boundary",
488*e4b17023SJohn Marino value);
489*e4b17023SJohn Marino else
490*e4b17023SJohn Marino fprintf (outfile, " %d virtual-reg-%d", value,
491*e4b17023SJohn Marino value-FIRST_VIRTUAL_REGISTER);
492*e4b17023SJohn Marino }
493*e4b17023SJohn Marino else
494*e4b17023SJohn Marino #endif
495*e4b17023SJohn Marino if (flag_dump_unnumbered
496*e4b17023SJohn Marino && (is_insn || NOTE_P (in_rtx)))
497*e4b17023SJohn Marino fputc ('#', outfile);
498*e4b17023SJohn Marino else
499*e4b17023SJohn Marino fprintf (outfile, " %d", value);
500*e4b17023SJohn Marino
501*e4b17023SJohn Marino #ifndef GENERATOR_FILE
502*e4b17023SJohn Marino if (REG_P (in_rtx) && REG_ATTRS (in_rtx))
503*e4b17023SJohn Marino {
504*e4b17023SJohn Marino fputs (" [", outfile);
505*e4b17023SJohn Marino if (ORIGINAL_REGNO (in_rtx) != REGNO (in_rtx))
506*e4b17023SJohn Marino fprintf (outfile, "orig:%i", ORIGINAL_REGNO (in_rtx));
507*e4b17023SJohn Marino if (REG_EXPR (in_rtx))
508*e4b17023SJohn Marino print_mem_expr (outfile, REG_EXPR (in_rtx));
509*e4b17023SJohn Marino
510*e4b17023SJohn Marino if (REG_OFFSET (in_rtx))
511*e4b17023SJohn Marino fprintf (outfile, "+" HOST_WIDE_INT_PRINT_DEC,
512*e4b17023SJohn Marino REG_OFFSET (in_rtx));
513*e4b17023SJohn Marino fputs (" ]", outfile);
514*e4b17023SJohn Marino }
515*e4b17023SJohn Marino #endif
516*e4b17023SJohn Marino
517*e4b17023SJohn Marino if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, i)
518*e4b17023SJohn Marino && XINT (in_rtx, i) >= 0
519*e4b17023SJohn Marino && (name = get_insn_name (XINT (in_rtx, i))) != NULL)
520*e4b17023SJohn Marino fprintf (outfile, " {%s}", name);
521*e4b17023SJohn Marino sawclose = 0;
522*e4b17023SJohn Marino }
523*e4b17023SJohn Marino break;
524*e4b17023SJohn Marino
525*e4b17023SJohn Marino /* Print NOTE_INSN names rather than integer codes. */
526*e4b17023SJohn Marino
527*e4b17023SJohn Marino case 'n':
528*e4b17023SJohn Marino fprintf (outfile, " %s", GET_NOTE_INSN_NAME (XINT (in_rtx, i)));
529*e4b17023SJohn Marino sawclose = 0;
530*e4b17023SJohn Marino break;
531*e4b17023SJohn Marino
532*e4b17023SJohn Marino case 'u':
533*e4b17023SJohn Marino if (XEXP (in_rtx, i) != NULL)
534*e4b17023SJohn Marino {
535*e4b17023SJohn Marino rtx sub = XEXP (in_rtx, i);
536*e4b17023SJohn Marino enum rtx_code subc = GET_CODE (sub);
537*e4b17023SJohn Marino
538*e4b17023SJohn Marino if (GET_CODE (in_rtx) == LABEL_REF)
539*e4b17023SJohn Marino {
540*e4b17023SJohn Marino if (subc == NOTE
541*e4b17023SJohn Marino && NOTE_KIND (sub) == NOTE_INSN_DELETED_LABEL)
542*e4b17023SJohn Marino {
543*e4b17023SJohn Marino if (flag_dump_unnumbered)
544*e4b17023SJohn Marino fprintf (outfile, " [# deleted]");
545*e4b17023SJohn Marino else
546*e4b17023SJohn Marino fprintf (outfile, " [%d deleted]", INSN_UID (sub));
547*e4b17023SJohn Marino sawclose = 0;
548*e4b17023SJohn Marino break;
549*e4b17023SJohn Marino }
550*e4b17023SJohn Marino
551*e4b17023SJohn Marino if (subc != CODE_LABEL)
552*e4b17023SJohn Marino goto do_e;
553*e4b17023SJohn Marino }
554*e4b17023SJohn Marino
555*e4b17023SJohn Marino if (flag_dump_unnumbered
556*e4b17023SJohn Marino || (flag_dump_unnumbered_links && (i == 1 || i == 2)
557*e4b17023SJohn Marino && (INSN_P (in_rtx) || NOTE_P (in_rtx)
558*e4b17023SJohn Marino || LABEL_P (in_rtx) || BARRIER_P (in_rtx))))
559*e4b17023SJohn Marino fputs (" #", outfile);
560*e4b17023SJohn Marino else
561*e4b17023SJohn Marino fprintf (outfile, " %d", INSN_UID (sub));
562*e4b17023SJohn Marino }
563*e4b17023SJohn Marino else
564*e4b17023SJohn Marino fputs (" 0", outfile);
565*e4b17023SJohn Marino sawclose = 0;
566*e4b17023SJohn Marino break;
567*e4b17023SJohn Marino
568*e4b17023SJohn Marino case 't':
569*e4b17023SJohn Marino #ifndef GENERATOR_FILE
570*e4b17023SJohn Marino if (i == 0 && GET_CODE (in_rtx) == DEBUG_IMPLICIT_PTR)
571*e4b17023SJohn Marino print_mem_expr (outfile, DEBUG_IMPLICIT_PTR_DECL (in_rtx));
572*e4b17023SJohn Marino else if (i == 0 && GET_CODE (in_rtx) == DEBUG_PARAMETER_REF)
573*e4b17023SJohn Marino print_mem_expr (outfile, DEBUG_PARAMETER_REF_DECL (in_rtx));
574*e4b17023SJohn Marino else
575*e4b17023SJohn Marino dump_addr (outfile, " ", XTREE (in_rtx, i));
576*e4b17023SJohn Marino #endif
577*e4b17023SJohn Marino break;
578*e4b17023SJohn Marino
579*e4b17023SJohn Marino case '*':
580*e4b17023SJohn Marino fputs (" Unknown", outfile);
581*e4b17023SJohn Marino sawclose = 0;
582*e4b17023SJohn Marino break;
583*e4b17023SJohn Marino
584*e4b17023SJohn Marino case 'B':
585*e4b17023SJohn Marino #ifndef GENERATOR_FILE
586*e4b17023SJohn Marino if (XBBDEF (in_rtx, i))
587*e4b17023SJohn Marino fprintf (outfile, " %i", XBBDEF (in_rtx, i)->index);
588*e4b17023SJohn Marino #endif
589*e4b17023SJohn Marino break;
590*e4b17023SJohn Marino
591*e4b17023SJohn Marino default:
592*e4b17023SJohn Marino gcc_unreachable ();
593*e4b17023SJohn Marino }
594*e4b17023SJohn Marino
595*e4b17023SJohn Marino switch (GET_CODE (in_rtx))
596*e4b17023SJohn Marino {
597*e4b17023SJohn Marino #ifndef GENERATOR_FILE
598*e4b17023SJohn Marino case MEM:
599*e4b17023SJohn Marino if (__builtin_expect (final_insns_dump_p, false))
600*e4b17023SJohn Marino fprintf (outfile, " [");
601*e4b17023SJohn Marino else
602*e4b17023SJohn Marino fprintf (outfile, " [" HOST_WIDE_INT_PRINT_DEC,
603*e4b17023SJohn Marino (HOST_WIDE_INT) MEM_ALIAS_SET (in_rtx));
604*e4b17023SJohn Marino
605*e4b17023SJohn Marino if (MEM_EXPR (in_rtx))
606*e4b17023SJohn Marino print_mem_expr (outfile, MEM_EXPR (in_rtx));
607*e4b17023SJohn Marino
608*e4b17023SJohn Marino if (MEM_OFFSET_KNOWN_P (in_rtx))
609*e4b17023SJohn Marino fprintf (outfile, "+" HOST_WIDE_INT_PRINT_DEC, MEM_OFFSET (in_rtx));
610*e4b17023SJohn Marino
611*e4b17023SJohn Marino if (MEM_SIZE_KNOWN_P (in_rtx))
612*e4b17023SJohn Marino fprintf (outfile, " S" HOST_WIDE_INT_PRINT_DEC, MEM_SIZE (in_rtx));
613*e4b17023SJohn Marino
614*e4b17023SJohn Marino if (MEM_ALIGN (in_rtx) != 1)
615*e4b17023SJohn Marino fprintf (outfile, " A%u", MEM_ALIGN (in_rtx));
616*e4b17023SJohn Marino
617*e4b17023SJohn Marino if (!ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (in_rtx)))
618*e4b17023SJohn Marino fprintf (outfile, " AS%u", MEM_ADDR_SPACE (in_rtx));
619*e4b17023SJohn Marino
620*e4b17023SJohn Marino fputc (']', outfile);
621*e4b17023SJohn Marino break;
622*e4b17023SJohn Marino
623*e4b17023SJohn Marino case CONST_DOUBLE:
624*e4b17023SJohn Marino if (FLOAT_MODE_P (GET_MODE (in_rtx)))
625*e4b17023SJohn Marino {
626*e4b17023SJohn Marino char s[60];
627*e4b17023SJohn Marino
628*e4b17023SJohn Marino real_to_decimal (s, CONST_DOUBLE_REAL_VALUE (in_rtx),
629*e4b17023SJohn Marino sizeof (s), 0, 1);
630*e4b17023SJohn Marino fprintf (outfile, " %s", s);
631*e4b17023SJohn Marino
632*e4b17023SJohn Marino real_to_hexadecimal (s, CONST_DOUBLE_REAL_VALUE (in_rtx),
633*e4b17023SJohn Marino sizeof (s), 0, 1);
634*e4b17023SJohn Marino fprintf (outfile, " [%s]", s);
635*e4b17023SJohn Marino }
636*e4b17023SJohn Marino break;
637*e4b17023SJohn Marino #endif
638*e4b17023SJohn Marino
639*e4b17023SJohn Marino case CODE_LABEL:
640*e4b17023SJohn Marino fprintf (outfile, " [%d uses]", LABEL_NUSES (in_rtx));
641*e4b17023SJohn Marino switch (LABEL_KIND (in_rtx))
642*e4b17023SJohn Marino {
643*e4b17023SJohn Marino case LABEL_NORMAL: break;
644*e4b17023SJohn Marino case LABEL_STATIC_ENTRY: fputs (" [entry]", outfile); break;
645*e4b17023SJohn Marino case LABEL_GLOBAL_ENTRY: fputs (" [global entry]", outfile); break;
646*e4b17023SJohn Marino case LABEL_WEAK_ENTRY: fputs (" [weak entry]", outfile); break;
647*e4b17023SJohn Marino default: gcc_unreachable ();
648*e4b17023SJohn Marino }
649*e4b17023SJohn Marino break;
650*e4b17023SJohn Marino
651*e4b17023SJohn Marino default:
652*e4b17023SJohn Marino break;
653*e4b17023SJohn Marino }
654*e4b17023SJohn Marino
655*e4b17023SJohn Marino if (dump_for_graph
656*e4b17023SJohn Marino && (is_insn || NOTE_P (in_rtx)
657*e4b17023SJohn Marino || LABEL_P (in_rtx) || BARRIER_P (in_rtx)))
658*e4b17023SJohn Marino sawclose = 0;
659*e4b17023SJohn Marino else
660*e4b17023SJohn Marino {
661*e4b17023SJohn Marino fputc (')', outfile);
662*e4b17023SJohn Marino sawclose = 1;
663*e4b17023SJohn Marino }
664*e4b17023SJohn Marino }
665*e4b17023SJohn Marino
666*e4b17023SJohn Marino /* Print an rtx on the current line of FILE. Initially indent IND
667*e4b17023SJohn Marino characters. */
668*e4b17023SJohn Marino
669*e4b17023SJohn Marino void
print_inline_rtx(FILE * outf,const_rtx x,int ind)670*e4b17023SJohn Marino print_inline_rtx (FILE *outf, const_rtx x, int ind)
671*e4b17023SJohn Marino {
672*e4b17023SJohn Marino int oldsaw = sawclose;
673*e4b17023SJohn Marino int oldindent = indent;
674*e4b17023SJohn Marino
675*e4b17023SJohn Marino sawclose = 0;
676*e4b17023SJohn Marino indent = ind;
677*e4b17023SJohn Marino outfile = outf;
678*e4b17023SJohn Marino print_rtx (x);
679*e4b17023SJohn Marino sawclose = oldsaw;
680*e4b17023SJohn Marino indent = oldindent;
681*e4b17023SJohn Marino }
682*e4b17023SJohn Marino
683*e4b17023SJohn Marino /* Call this function from the debugger to see what X looks like. */
684*e4b17023SJohn Marino
685*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_rtx(const_rtx x)686*e4b17023SJohn Marino debug_rtx (const_rtx x)
687*e4b17023SJohn Marino {
688*e4b17023SJohn Marino outfile = stderr;
689*e4b17023SJohn Marino sawclose = 0;
690*e4b17023SJohn Marino print_rtx (x);
691*e4b17023SJohn Marino fprintf (stderr, "\n");
692*e4b17023SJohn Marino }
693*e4b17023SJohn Marino
694*e4b17023SJohn Marino /* Count of rtx's to print with debug_rtx_list.
695*e4b17023SJohn Marino This global exists because gdb user defined commands have no arguments. */
696*e4b17023SJohn Marino
697*e4b17023SJohn Marino DEBUG_VARIABLE int debug_rtx_count = 0; /* 0 is treated as equivalent to 1 */
698*e4b17023SJohn Marino
699*e4b17023SJohn Marino /* Call this function to print list from X on.
700*e4b17023SJohn Marino
701*e4b17023SJohn Marino N is a count of the rtx's to print. Positive values print from the specified
702*e4b17023SJohn Marino rtx on. Negative values print a window around the rtx.
703*e4b17023SJohn Marino EG: -5 prints 2 rtx's on either side (in addition to the specified rtx). */
704*e4b17023SJohn Marino
705*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_rtx_list(const_rtx x,int n)706*e4b17023SJohn Marino debug_rtx_list (const_rtx x, int n)
707*e4b17023SJohn Marino {
708*e4b17023SJohn Marino int i,count;
709*e4b17023SJohn Marino const_rtx insn;
710*e4b17023SJohn Marino
711*e4b17023SJohn Marino count = n == 0 ? 1 : n < 0 ? -n : n;
712*e4b17023SJohn Marino
713*e4b17023SJohn Marino /* If we are printing a window, back up to the start. */
714*e4b17023SJohn Marino
715*e4b17023SJohn Marino if (n < 0)
716*e4b17023SJohn Marino for (i = count / 2; i > 0; i--)
717*e4b17023SJohn Marino {
718*e4b17023SJohn Marino if (PREV_INSN (x) == 0)
719*e4b17023SJohn Marino break;
720*e4b17023SJohn Marino x = PREV_INSN (x);
721*e4b17023SJohn Marino }
722*e4b17023SJohn Marino
723*e4b17023SJohn Marino for (i = count, insn = x; i > 0 && insn != 0; i--, insn = NEXT_INSN (insn))
724*e4b17023SJohn Marino {
725*e4b17023SJohn Marino debug_rtx (insn);
726*e4b17023SJohn Marino fprintf (stderr, "\n");
727*e4b17023SJohn Marino }
728*e4b17023SJohn Marino }
729*e4b17023SJohn Marino
730*e4b17023SJohn Marino /* Call this function to print an rtx list from START to END inclusive. */
731*e4b17023SJohn Marino
732*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_rtx_range(const_rtx start,const_rtx end)733*e4b17023SJohn Marino debug_rtx_range (const_rtx start, const_rtx end)
734*e4b17023SJohn Marino {
735*e4b17023SJohn Marino while (1)
736*e4b17023SJohn Marino {
737*e4b17023SJohn Marino debug_rtx (start);
738*e4b17023SJohn Marino fprintf (stderr, "\n");
739*e4b17023SJohn Marino if (!start || start == end)
740*e4b17023SJohn Marino break;
741*e4b17023SJohn Marino start = NEXT_INSN (start);
742*e4b17023SJohn Marino }
743*e4b17023SJohn Marino }
744*e4b17023SJohn Marino
745*e4b17023SJohn Marino /* Call this function to search an rtx list to find one with insn uid UID,
746*e4b17023SJohn Marino and then call debug_rtx_list to print it, using DEBUG_RTX_COUNT.
747*e4b17023SJohn Marino The found insn is returned to enable further debugging analysis. */
748*e4b17023SJohn Marino
749*e4b17023SJohn Marino DEBUG_FUNCTION const_rtx
debug_rtx_find(const_rtx x,int uid)750*e4b17023SJohn Marino debug_rtx_find (const_rtx x, int uid)
751*e4b17023SJohn Marino {
752*e4b17023SJohn Marino while (x != 0 && INSN_UID (x) != uid)
753*e4b17023SJohn Marino x = NEXT_INSN (x);
754*e4b17023SJohn Marino if (x != 0)
755*e4b17023SJohn Marino {
756*e4b17023SJohn Marino debug_rtx_list (x, debug_rtx_count);
757*e4b17023SJohn Marino return x;
758*e4b17023SJohn Marino }
759*e4b17023SJohn Marino else
760*e4b17023SJohn Marino {
761*e4b17023SJohn Marino fprintf (stderr, "insn uid %d not found\n", uid);
762*e4b17023SJohn Marino return 0;
763*e4b17023SJohn Marino }
764*e4b17023SJohn Marino }
765*e4b17023SJohn Marino
766*e4b17023SJohn Marino /* External entry point for printing a chain of insns
767*e4b17023SJohn Marino starting with RTX_FIRST onto file OUTF.
768*e4b17023SJohn Marino A blank line separates insns.
769*e4b17023SJohn Marino
770*e4b17023SJohn Marino If RTX_FIRST is not an insn, then it alone is printed, with no newline. */
771*e4b17023SJohn Marino
772*e4b17023SJohn Marino void
print_rtl(FILE * outf,const_rtx rtx_first)773*e4b17023SJohn Marino print_rtl (FILE *outf, const_rtx rtx_first)
774*e4b17023SJohn Marino {
775*e4b17023SJohn Marino const_rtx tmp_rtx;
776*e4b17023SJohn Marino
777*e4b17023SJohn Marino outfile = outf;
778*e4b17023SJohn Marino sawclose = 0;
779*e4b17023SJohn Marino
780*e4b17023SJohn Marino if (rtx_first == 0)
781*e4b17023SJohn Marino {
782*e4b17023SJohn Marino fputs (print_rtx_head, outf);
783*e4b17023SJohn Marino fputs ("(nil)\n", outf);
784*e4b17023SJohn Marino }
785*e4b17023SJohn Marino else
786*e4b17023SJohn Marino switch (GET_CODE (rtx_first))
787*e4b17023SJohn Marino {
788*e4b17023SJohn Marino case INSN:
789*e4b17023SJohn Marino case JUMP_INSN:
790*e4b17023SJohn Marino case CALL_INSN:
791*e4b17023SJohn Marino case NOTE:
792*e4b17023SJohn Marino case CODE_LABEL:
793*e4b17023SJohn Marino case BARRIER:
794*e4b17023SJohn Marino for (tmp_rtx = rtx_first; tmp_rtx != 0; tmp_rtx = NEXT_INSN (tmp_rtx))
795*e4b17023SJohn Marino {
796*e4b17023SJohn Marino fputs (print_rtx_head, outfile);
797*e4b17023SJohn Marino print_rtx (tmp_rtx);
798*e4b17023SJohn Marino fprintf (outfile, "\n");
799*e4b17023SJohn Marino }
800*e4b17023SJohn Marino break;
801*e4b17023SJohn Marino
802*e4b17023SJohn Marino default:
803*e4b17023SJohn Marino fputs (print_rtx_head, outfile);
804*e4b17023SJohn Marino print_rtx (rtx_first);
805*e4b17023SJohn Marino }
806*e4b17023SJohn Marino }
807*e4b17023SJohn Marino
808*e4b17023SJohn Marino /* Like print_rtx, except specify a file. */
809*e4b17023SJohn Marino /* Return nonzero if we actually printed anything. */
810*e4b17023SJohn Marino
811*e4b17023SJohn Marino int
print_rtl_single(FILE * outf,const_rtx x)812*e4b17023SJohn Marino print_rtl_single (FILE *outf, const_rtx x)
813*e4b17023SJohn Marino {
814*e4b17023SJohn Marino outfile = outf;
815*e4b17023SJohn Marino sawclose = 0;
816*e4b17023SJohn Marino fputs (print_rtx_head, outfile);
817*e4b17023SJohn Marino print_rtx (x);
818*e4b17023SJohn Marino putc ('\n', outf);
819*e4b17023SJohn Marino return 1;
820*e4b17023SJohn Marino }
821*e4b17023SJohn Marino
822*e4b17023SJohn Marino
823*e4b17023SJohn Marino /* Like print_rtl except without all the detail; for example,
824*e4b17023SJohn Marino if RTX is a CONST_INT then print in decimal format. */
825*e4b17023SJohn Marino
826*e4b17023SJohn Marino void
print_simple_rtl(FILE * outf,const_rtx x)827*e4b17023SJohn Marino print_simple_rtl (FILE *outf, const_rtx x)
828*e4b17023SJohn Marino {
829*e4b17023SJohn Marino flag_simple = 1;
830*e4b17023SJohn Marino print_rtl (outf, x);
831*e4b17023SJohn Marino flag_simple = 0;
832*e4b17023SJohn Marino }
833