xref: /dragonfly/contrib/gcc-4.7/gcc/print-rtl.c (revision e4b17023)
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