xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/print-rtl.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg /* Print RTL for GCC.
2*8feb0f0bSmrg    Copyright (C) 1987-2020 Free Software Foundation, Inc.
31debfc3dSmrg 
41debfc3dSmrg This file is part of GCC.
51debfc3dSmrg 
61debfc3dSmrg GCC is free software; you can redistribute it and/or modify it under
71debfc3dSmrg the terms of the GNU General Public License as published by the Free
81debfc3dSmrg Software Foundation; either version 3, or (at your option) any later
91debfc3dSmrg version.
101debfc3dSmrg 
111debfc3dSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
121debfc3dSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
131debfc3dSmrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
141debfc3dSmrg for more details.
151debfc3dSmrg 
161debfc3dSmrg You should have received a copy of the GNU General Public License
171debfc3dSmrg along with GCC; see the file COPYING3.  If not see
181debfc3dSmrg <http://www.gnu.org/licenses/>.  */
191debfc3dSmrg 
201debfc3dSmrg /* This file is compiled twice: once for the generator programs,
211debfc3dSmrg    once for the compiler.  */
221debfc3dSmrg #ifdef GENERATOR_FILE
231debfc3dSmrg #include "bconfig.h"
241debfc3dSmrg #else
251debfc3dSmrg #include "config.h"
261debfc3dSmrg #endif
271debfc3dSmrg 
281debfc3dSmrg #include "system.h"
291debfc3dSmrg #include "coretypes.h"
301debfc3dSmrg #include "tm.h"
311debfc3dSmrg #include "rtl.h"
321debfc3dSmrg 
331debfc3dSmrg /* These headers all define things which are not available in
341debfc3dSmrg    generator programs.  */
351debfc3dSmrg #ifndef GENERATOR_FILE
361debfc3dSmrg #include "alias.h"
371debfc3dSmrg #include "tree.h"
38a2dc1f3fSmrg #include "basic-block.h"
391debfc3dSmrg #include "print-tree.h"
401debfc3dSmrg #include "flags.h"
411debfc3dSmrg #include "predict.h"
421debfc3dSmrg #include "function.h"
43c0a68be4Smrg #include "cfg.h"
441debfc3dSmrg #include "basic-block.h"
451debfc3dSmrg #include "diagnostic.h"
461debfc3dSmrg #include "tree-pretty-print.h"
471debfc3dSmrg #include "alloc-pool.h"
481debfc3dSmrg #include "cselib.h"
491debfc3dSmrg #include "dumpfile.h"	/* for dump_flags */
501debfc3dSmrg #include "dwarf2out.h"
511debfc3dSmrg #include "pretty-print.h"
521debfc3dSmrg #endif
531debfc3dSmrg 
541debfc3dSmrg #include "print-rtl.h"
551debfc3dSmrg #include "rtl-iter.h"
561debfc3dSmrg 
57*8feb0f0bSmrg /* Disable warnings about quoting issues in the pp_xxx calls below
58*8feb0f0bSmrg    that (intentionally) don't follow GCC diagnostic conventions.  */
59*8feb0f0bSmrg #if __GNUC__ >= 10
60*8feb0f0bSmrg #  pragma GCC diagnostic push
61*8feb0f0bSmrg #  pragma GCC diagnostic ignored "-Wformat-diag"
62*8feb0f0bSmrg #endif
63*8feb0f0bSmrg 
641debfc3dSmrg /* String printed at beginning of each RTL when it is dumped.
651debfc3dSmrg    This string is set to ASM_COMMENT_START when the RTL is dumped in
661debfc3dSmrg    the assembly output file.  */
671debfc3dSmrg const char *print_rtx_head = "";
681debfc3dSmrg 
691debfc3dSmrg #ifdef GENERATOR_FILE
701debfc3dSmrg /* These are defined from the .opt file when not used in generator
711debfc3dSmrg    programs.  */
721debfc3dSmrg 
731debfc3dSmrg /* Nonzero means suppress output of instruction numbers
741debfc3dSmrg    in debugging dumps.
751debfc3dSmrg    This must be defined here so that programs like gencodes can be linked.  */
761debfc3dSmrg int flag_dump_unnumbered = 0;
771debfc3dSmrg 
781debfc3dSmrg /* Nonzero means suppress output of instruction numbers for previous
791debfc3dSmrg    and next insns in debugging dumps.
801debfc3dSmrg    This must be defined here so that programs like gencodes can be linked.  */
811debfc3dSmrg int flag_dump_unnumbered_links = 0;
821debfc3dSmrg #endif
831debfc3dSmrg 
841debfc3dSmrg /* Constructor for rtx_writer.  */
851debfc3dSmrg 
rtx_writer(FILE * outf,int ind,bool simple,bool compact,rtx_reuse_manager * reuse_manager)861debfc3dSmrg rtx_writer::rtx_writer (FILE *outf, int ind, bool simple, bool compact,
871debfc3dSmrg 			rtx_reuse_manager *reuse_manager)
881debfc3dSmrg : m_outfile (outf), m_sawclose (0), m_indent (ind),
891debfc3dSmrg   m_in_call_function_usage (false), m_simple (simple), m_compact (compact),
901debfc3dSmrg   m_rtx_reuse_manager (reuse_manager)
911debfc3dSmrg {
921debfc3dSmrg }
931debfc3dSmrg 
941debfc3dSmrg #ifndef GENERATOR_FILE
951debfc3dSmrg 
961debfc3dSmrg /* rtx_reuse_manager's ctor.  */
971debfc3dSmrg 
rtx_reuse_manager()981debfc3dSmrg rtx_reuse_manager::rtx_reuse_manager ()
991debfc3dSmrg : m_next_id (0)
1001debfc3dSmrg {
1011debfc3dSmrg }
1021debfc3dSmrg 
1031debfc3dSmrg /* Determine if X is of a kind suitable for dumping via reuse_rtx.  */
1041debfc3dSmrg 
1051debfc3dSmrg static bool
uses_rtx_reuse_p(const_rtx x)1061debfc3dSmrg uses_rtx_reuse_p (const_rtx x)
1071debfc3dSmrg {
1081debfc3dSmrg   if (x == NULL)
1091debfc3dSmrg     return false;
1101debfc3dSmrg 
1111debfc3dSmrg   switch (GET_CODE (x))
1121debfc3dSmrg     {
1131debfc3dSmrg     case DEBUG_EXPR:
1141debfc3dSmrg     case VALUE:
1151debfc3dSmrg     case SCRATCH:
1161debfc3dSmrg       return true;
1171debfc3dSmrg 
1181debfc3dSmrg     /* We don't use reuse_rtx for consts.  */
1191debfc3dSmrg     CASE_CONST_UNIQUE:
1201debfc3dSmrg     default:
1211debfc3dSmrg       return false;
1221debfc3dSmrg     }
1231debfc3dSmrg }
1241debfc3dSmrg 
1251debfc3dSmrg /* Traverse X and its descendents, determining if we see any rtx more than
1261debfc3dSmrg    once.  Any rtx suitable for "reuse_rtx" that is seen more than once is
1271debfc3dSmrg    assigned an ID.  */
1281debfc3dSmrg 
1291debfc3dSmrg void
preprocess(const_rtx x)1301debfc3dSmrg rtx_reuse_manager::preprocess (const_rtx x)
1311debfc3dSmrg {
1321debfc3dSmrg   subrtx_iterator::array_type array;
1331debfc3dSmrg   FOR_EACH_SUBRTX (iter, array, x, NONCONST)
1341debfc3dSmrg     if (uses_rtx_reuse_p (*iter))
1351debfc3dSmrg       {
1361debfc3dSmrg 	if (int *count = m_rtx_occurrence_count.get (*iter))
1371debfc3dSmrg 	  {
1381debfc3dSmrg 	    if (*(count++) == 1)
1391debfc3dSmrg 	      m_rtx_reuse_ids.put (*iter, m_next_id++);
1401debfc3dSmrg 	  }
1411debfc3dSmrg 	else
1421debfc3dSmrg 	  m_rtx_occurrence_count.put (*iter, 1);
1431debfc3dSmrg       }
1441debfc3dSmrg }
1451debfc3dSmrg 
1461debfc3dSmrg /* Return true iff X has been assigned a reuse ID.  If it has,
1471debfc3dSmrg    and OUT is non-NULL, then write the reuse ID to *OUT.  */
1481debfc3dSmrg 
1491debfc3dSmrg bool
has_reuse_id(const_rtx x,int * out)1501debfc3dSmrg rtx_reuse_manager::has_reuse_id (const_rtx x, int *out)
1511debfc3dSmrg {
1521debfc3dSmrg   int *id = m_rtx_reuse_ids.get (x);
1531debfc3dSmrg   if (id)
1541debfc3dSmrg     {
1551debfc3dSmrg       if (out)
1561debfc3dSmrg 	*out = *id;
1571debfc3dSmrg       return true;
1581debfc3dSmrg     }
1591debfc3dSmrg   else
1601debfc3dSmrg     return false;
1611debfc3dSmrg }
1621debfc3dSmrg 
1631debfc3dSmrg /* Determine if set_seen_def has been called for the given reuse ID.  */
1641debfc3dSmrg 
1651debfc3dSmrg bool
seen_def_p(int reuse_id)1661debfc3dSmrg rtx_reuse_manager::seen_def_p (int reuse_id)
1671debfc3dSmrg {
168a2dc1f3fSmrg   return bitmap_bit_p (m_defs_seen, reuse_id);
1691debfc3dSmrg }
1701debfc3dSmrg 
1711debfc3dSmrg /* Record that the definition of the given reuse ID has been seen.  */
1721debfc3dSmrg 
1731debfc3dSmrg void
set_seen_def(int reuse_id)1741debfc3dSmrg rtx_reuse_manager::set_seen_def (int reuse_id)
1751debfc3dSmrg {
176a2dc1f3fSmrg   bitmap_set_bit (m_defs_seen, reuse_id);
1771debfc3dSmrg }
1781debfc3dSmrg 
1791debfc3dSmrg #endif /* #ifndef GENERATOR_FILE */
1801debfc3dSmrg 
1811debfc3dSmrg #ifndef GENERATOR_FILE
1821debfc3dSmrg void
print_mem_expr(FILE * outfile,const_tree expr)1831debfc3dSmrg print_mem_expr (FILE *outfile, const_tree expr)
1841debfc3dSmrg {
1851debfc3dSmrg   fputc (' ', outfile);
1861debfc3dSmrg   print_generic_expr (outfile, CONST_CAST_TREE (expr), dump_flags);
1871debfc3dSmrg }
1881debfc3dSmrg #endif
1891debfc3dSmrg 
190a2dc1f3fSmrg /* Print X to FILE.  */
191a2dc1f3fSmrg 
192a2dc1f3fSmrg static void
print_poly_int(FILE * file,poly_int64 x)193a2dc1f3fSmrg print_poly_int (FILE *file, poly_int64 x)
194a2dc1f3fSmrg {
195a2dc1f3fSmrg   HOST_WIDE_INT const_x;
196a2dc1f3fSmrg   if (x.is_constant (&const_x))
197a2dc1f3fSmrg     fprintf (file, HOST_WIDE_INT_PRINT_DEC, const_x);
198a2dc1f3fSmrg   else
199a2dc1f3fSmrg     {
200a2dc1f3fSmrg       fprintf (file, "[" HOST_WIDE_INT_PRINT_DEC, x.coeffs[0]);
201a2dc1f3fSmrg       for (int i = 1; i < NUM_POLY_INT_COEFFS; ++i)
202a2dc1f3fSmrg 	fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC, x.coeffs[i]);
203a2dc1f3fSmrg       fprintf (file, "]");
204a2dc1f3fSmrg     }
205a2dc1f3fSmrg }
206a2dc1f3fSmrg 
2071debfc3dSmrg /* Subroutine of print_rtx_operand for handling code '0'.
2081debfc3dSmrg    0 indicates a field for internal use that should not be printed.
2091debfc3dSmrg    However there are various special cases, such as the third field
2101debfc3dSmrg    of a NOTE, where it indicates that the field has several different
2111debfc3dSmrg    valid contents.  */
2121debfc3dSmrg 
2131debfc3dSmrg void
print_rtx_operand_code_0(const_rtx in_rtx ATTRIBUTE_UNUSED,int idx ATTRIBUTE_UNUSED)2141debfc3dSmrg rtx_writer::print_rtx_operand_code_0 (const_rtx in_rtx ATTRIBUTE_UNUSED,
2151debfc3dSmrg 				      int idx ATTRIBUTE_UNUSED)
2161debfc3dSmrg {
2171debfc3dSmrg #ifndef GENERATOR_FILE
2181debfc3dSmrg   if (idx == 1 && GET_CODE (in_rtx) == SYMBOL_REF)
2191debfc3dSmrg     {
2201debfc3dSmrg       int flags = SYMBOL_REF_FLAGS (in_rtx);
2211debfc3dSmrg       if (flags)
2221debfc3dSmrg 	fprintf (m_outfile, " [flags %#x]", flags);
2231debfc3dSmrg       tree decl = SYMBOL_REF_DECL (in_rtx);
2241debfc3dSmrg       if (decl)
2251debfc3dSmrg 	print_node_brief (m_outfile, "", decl, dump_flags);
2261debfc3dSmrg     }
2271debfc3dSmrg   else if (idx == 3 && NOTE_P (in_rtx))
2281debfc3dSmrg     {
2291debfc3dSmrg       switch (NOTE_KIND (in_rtx))
2301debfc3dSmrg 	{
2311debfc3dSmrg 	case NOTE_INSN_EH_REGION_BEG:
2321debfc3dSmrg 	case NOTE_INSN_EH_REGION_END:
2331debfc3dSmrg 	  if (flag_dump_unnumbered)
2341debfc3dSmrg 	    fprintf (m_outfile, " #");
2351debfc3dSmrg 	  else
2361debfc3dSmrg 	    fprintf (m_outfile, " %d", NOTE_EH_HANDLER (in_rtx));
2371debfc3dSmrg 	  m_sawclose = 1;
2381debfc3dSmrg 	  break;
2391debfc3dSmrg 
2401debfc3dSmrg 	case NOTE_INSN_BLOCK_BEG:
2411debfc3dSmrg 	case NOTE_INSN_BLOCK_END:
2421debfc3dSmrg 	  dump_addr (m_outfile, " ", NOTE_BLOCK (in_rtx));
2431debfc3dSmrg 	  m_sawclose = 1;
2441debfc3dSmrg 	  break;
2451debfc3dSmrg 
2461debfc3dSmrg 	case NOTE_INSN_BASIC_BLOCK:
2471debfc3dSmrg 	  {
2481debfc3dSmrg 	    basic_block bb = NOTE_BASIC_BLOCK (in_rtx);
2491debfc3dSmrg 	    if (bb != 0)
2501debfc3dSmrg 	      fprintf (m_outfile, " [bb %d]", bb->index);
2511debfc3dSmrg 	    break;
2521debfc3dSmrg 	  }
2531debfc3dSmrg 
2541debfc3dSmrg 	case NOTE_INSN_DELETED_LABEL:
2551debfc3dSmrg 	case NOTE_INSN_DELETED_DEBUG_LABEL:
2561debfc3dSmrg 	  {
2571debfc3dSmrg 	    const char *label = NOTE_DELETED_LABEL_NAME (in_rtx);
2581debfc3dSmrg 	    if (label)
2591debfc3dSmrg 	      fprintf (m_outfile, " (\"%s\")", label);
2601debfc3dSmrg 	    else
2611debfc3dSmrg 	      fprintf (m_outfile, " \"\"");
2621debfc3dSmrg 	  }
2631debfc3dSmrg 	  break;
2641debfc3dSmrg 
2651debfc3dSmrg 	case NOTE_INSN_SWITCH_TEXT_SECTIONS:
2661debfc3dSmrg 	  {
2671debfc3dSmrg 	    basic_block bb = NOTE_BASIC_BLOCK (in_rtx);
2681debfc3dSmrg 	    if (bb != 0)
2691debfc3dSmrg 	      fprintf (m_outfile, " [bb %d]", bb->index);
2701debfc3dSmrg 	    break;
2711debfc3dSmrg 	  }
2721debfc3dSmrg 
2731debfc3dSmrg 	case NOTE_INSN_VAR_LOCATION:
2741debfc3dSmrg 	  fputc (' ', m_outfile);
2751debfc3dSmrg 	  print_rtx (NOTE_VAR_LOCATION (in_rtx));
2761debfc3dSmrg 	  break;
2771debfc3dSmrg 
2781debfc3dSmrg 	case NOTE_INSN_CFI:
2791debfc3dSmrg 	  fputc ('\n', m_outfile);
2801debfc3dSmrg 	  output_cfi_directive (m_outfile, NOTE_CFI (in_rtx));
2811debfc3dSmrg 	  fputc ('\t', m_outfile);
2821debfc3dSmrg 	  break;
2831debfc3dSmrg 
284a2dc1f3fSmrg 	case NOTE_INSN_BEGIN_STMT:
285a2dc1f3fSmrg 	case NOTE_INSN_INLINE_ENTRY:
286a2dc1f3fSmrg #ifndef GENERATOR_FILE
287a2dc1f3fSmrg 	  {
288a2dc1f3fSmrg 	    expanded_location xloc
289a2dc1f3fSmrg 	      = expand_location (NOTE_MARKER_LOCATION (in_rtx));
290a2dc1f3fSmrg 	    fprintf (m_outfile, " %s:%i", xloc.file, xloc.line);
291a2dc1f3fSmrg 	  }
292a2dc1f3fSmrg #endif
293a2dc1f3fSmrg 	  break;
294a2dc1f3fSmrg 
2951debfc3dSmrg 	default:
2961debfc3dSmrg 	  break;
2971debfc3dSmrg 	}
2981debfc3dSmrg     }
2991debfc3dSmrg   else if (idx == 7 && JUMP_P (in_rtx) && JUMP_LABEL (in_rtx) != NULL
3001debfc3dSmrg 	   && !m_compact)
3011debfc3dSmrg     {
3021debfc3dSmrg       /* Output the JUMP_LABEL reference.  */
3031debfc3dSmrg       fprintf (m_outfile, "\n%s%*s -> ", print_rtx_head, m_indent * 2, "");
3041debfc3dSmrg       if (GET_CODE (JUMP_LABEL (in_rtx)) == RETURN)
3051debfc3dSmrg 	fprintf (m_outfile, "return");
3061debfc3dSmrg       else if (GET_CODE (JUMP_LABEL (in_rtx)) == SIMPLE_RETURN)
3071debfc3dSmrg 	fprintf (m_outfile, "simple_return");
3081debfc3dSmrg       else
3091debfc3dSmrg 	fprintf (m_outfile, "%d", INSN_UID (JUMP_LABEL (in_rtx)));
3101debfc3dSmrg     }
3111debfc3dSmrg   else if (idx == 0 && GET_CODE (in_rtx) == VALUE)
3121debfc3dSmrg     {
3131debfc3dSmrg       cselib_val *val = CSELIB_VAL_PTR (in_rtx);
3141debfc3dSmrg 
3151debfc3dSmrg       fprintf (m_outfile, " %u:%u", val->uid, val->hash);
3161debfc3dSmrg       dump_addr (m_outfile, " @", in_rtx);
3171debfc3dSmrg       dump_addr (m_outfile, "/", (void*)val);
3181debfc3dSmrg     }
3191debfc3dSmrg   else if (idx == 0 && GET_CODE (in_rtx) == DEBUG_EXPR)
3201debfc3dSmrg     {
3211debfc3dSmrg       fprintf (m_outfile, " D#%i",
3221debfc3dSmrg 	       DEBUG_TEMP_UID (DEBUG_EXPR_TREE_DECL (in_rtx)));
3231debfc3dSmrg     }
3241debfc3dSmrg   else if (idx == 0 && GET_CODE (in_rtx) == ENTRY_VALUE)
3251debfc3dSmrg     {
3261debfc3dSmrg       m_indent += 2;
3271debfc3dSmrg       if (!m_sawclose)
3281debfc3dSmrg 	fprintf (m_outfile, " ");
3291debfc3dSmrg       print_rtx (ENTRY_VALUE_EXP (in_rtx));
3301debfc3dSmrg       m_indent -= 2;
3311debfc3dSmrg     }
3321debfc3dSmrg #endif
3331debfc3dSmrg }
3341debfc3dSmrg 
3351debfc3dSmrg /* Subroutine of print_rtx_operand for handling code 'e'.
3361debfc3dSmrg    Also called by print_rtx_operand_code_u for handling code 'u'
3371debfc3dSmrg    for LABEL_REFs when they don't reference a CODE_LABEL.  */
3381debfc3dSmrg 
3391debfc3dSmrg void
print_rtx_operand_code_e(const_rtx in_rtx,int idx)3401debfc3dSmrg rtx_writer::print_rtx_operand_code_e (const_rtx in_rtx, int idx)
3411debfc3dSmrg {
3421debfc3dSmrg   m_indent += 2;
3431debfc3dSmrg   if (idx == 6 && INSN_P (in_rtx))
3441debfc3dSmrg     /* Put REG_NOTES on their own line.  */
3451debfc3dSmrg     fprintf (m_outfile, "\n%s%*s",
3461debfc3dSmrg 	     print_rtx_head, m_indent * 2, "");
3471debfc3dSmrg   if (!m_sawclose)
3481debfc3dSmrg     fprintf (m_outfile, " ");
3491debfc3dSmrg   if (idx == 7 && CALL_P (in_rtx))
3501debfc3dSmrg     {
3511debfc3dSmrg       m_in_call_function_usage = true;
3521debfc3dSmrg       print_rtx (XEXP (in_rtx, idx));
3531debfc3dSmrg       m_in_call_function_usage = false;
3541debfc3dSmrg     }
3551debfc3dSmrg   else
3561debfc3dSmrg     print_rtx (XEXP (in_rtx, idx));
3571debfc3dSmrg   m_indent -= 2;
3581debfc3dSmrg }
3591debfc3dSmrg 
3601debfc3dSmrg /* Subroutine of print_rtx_operand for handling codes 'E' and 'V'.  */
3611debfc3dSmrg 
3621debfc3dSmrg void
print_rtx_operand_codes_E_and_V(const_rtx in_rtx,int idx)3631debfc3dSmrg rtx_writer::print_rtx_operand_codes_E_and_V (const_rtx in_rtx, int idx)
3641debfc3dSmrg {
3651debfc3dSmrg   m_indent += 2;
3661debfc3dSmrg   if (m_sawclose)
3671debfc3dSmrg     {
3681debfc3dSmrg       fprintf (m_outfile, "\n%s%*s",
3691debfc3dSmrg       print_rtx_head, m_indent * 2, "");
3701debfc3dSmrg       m_sawclose = 0;
3711debfc3dSmrg     }
3721debfc3dSmrg   fputs (" [", m_outfile);
373a2dc1f3fSmrg   if (XVEC (in_rtx, idx) != NULL)
3741debfc3dSmrg     {
3751debfc3dSmrg       m_indent += 2;
3761debfc3dSmrg       if (XVECLEN (in_rtx, idx))
3771debfc3dSmrg 	m_sawclose = 1;
3781debfc3dSmrg 
3791debfc3dSmrg       for (int j = 0; j < XVECLEN (in_rtx, idx); j++)
380c0a68be4Smrg 	{
381c0a68be4Smrg 	  int j1;
382c0a68be4Smrg 
3831debfc3dSmrg 	  print_rtx (XVECEXP (in_rtx, idx, j));
384c0a68be4Smrg 	  for (j1 = j + 1; j1 < XVECLEN (in_rtx, idx); j1++)
385c0a68be4Smrg 	    if (XVECEXP (in_rtx, idx, j) != XVECEXP (in_rtx, idx, j1))
386c0a68be4Smrg 	      break;
387c0a68be4Smrg 
388c0a68be4Smrg 	  if (j1 != j + 1)
389c0a68be4Smrg 	    {
390c0a68be4Smrg 	      fprintf (m_outfile, " repeated x%i", j1 - j);
391c0a68be4Smrg 	      j = j1 - 1;
392c0a68be4Smrg 	    }
393c0a68be4Smrg 	}
3941debfc3dSmrg 
3951debfc3dSmrg       m_indent -= 2;
3961debfc3dSmrg     }
3971debfc3dSmrg   if (m_sawclose)
3981debfc3dSmrg     fprintf (m_outfile, "\n%s%*s", print_rtx_head, m_indent * 2, "");
3991debfc3dSmrg 
4001debfc3dSmrg   fputs ("]", m_outfile);
4011debfc3dSmrg   m_sawclose = 1;
4021debfc3dSmrg   m_indent -= 2;
4031debfc3dSmrg }
4041debfc3dSmrg 
4051debfc3dSmrg /* Subroutine of print_rtx_operand for handling code 'i'.  */
4061debfc3dSmrg 
4071debfc3dSmrg void
print_rtx_operand_code_i(const_rtx in_rtx,int idx)4081debfc3dSmrg rtx_writer::print_rtx_operand_code_i (const_rtx in_rtx, int idx)
4091debfc3dSmrg {
4101debfc3dSmrg   if (idx == 4 && INSN_P (in_rtx))
4111debfc3dSmrg     {
4121debfc3dSmrg #ifndef GENERATOR_FILE
4131debfc3dSmrg       const rtx_insn *in_insn = as_a <const rtx_insn *> (in_rtx);
4141debfc3dSmrg 
4151debfc3dSmrg       /*  Pretty-print insn locations.  Ignore scoping as it is mostly
4161debfc3dSmrg 	  redundant with line number information and do not print anything
4171debfc3dSmrg 	  when there is no location information available.  */
4181debfc3dSmrg       if (INSN_HAS_LOCATION (in_insn))
4191debfc3dSmrg 	{
4201debfc3dSmrg 	  expanded_location xloc = insn_location (in_insn);
421c0a68be4Smrg 	  fprintf (m_outfile, " \"%s\":%i:%i", xloc.file, xloc.line,
422c0a68be4Smrg 		   xloc.column);
4231debfc3dSmrg 	}
4241debfc3dSmrg #endif
4251debfc3dSmrg     }
4261debfc3dSmrg   else if (idx == 6 && GET_CODE (in_rtx) == ASM_OPERANDS)
4271debfc3dSmrg     {
4281debfc3dSmrg #ifndef GENERATOR_FILE
4291debfc3dSmrg       if (ASM_OPERANDS_SOURCE_LOCATION (in_rtx) != UNKNOWN_LOCATION)
4301debfc3dSmrg 	fprintf (m_outfile, " %s:%i",
4311debfc3dSmrg 		 LOCATION_FILE (ASM_OPERANDS_SOURCE_LOCATION (in_rtx)),
4321debfc3dSmrg 		 LOCATION_LINE (ASM_OPERANDS_SOURCE_LOCATION (in_rtx)));
4331debfc3dSmrg #endif
4341debfc3dSmrg     }
4351debfc3dSmrg   else if (idx == 1 && GET_CODE (in_rtx) == ASM_INPUT)
4361debfc3dSmrg     {
4371debfc3dSmrg #ifndef GENERATOR_FILE
4381debfc3dSmrg       if (ASM_INPUT_SOURCE_LOCATION (in_rtx) != UNKNOWN_LOCATION)
4391debfc3dSmrg 	fprintf (m_outfile, " %s:%i",
4401debfc3dSmrg 		 LOCATION_FILE (ASM_INPUT_SOURCE_LOCATION (in_rtx)),
4411debfc3dSmrg 		 LOCATION_LINE (ASM_INPUT_SOURCE_LOCATION (in_rtx)));
4421debfc3dSmrg #endif
4431debfc3dSmrg     }
4441debfc3dSmrg   else if (idx == 5 && NOTE_P (in_rtx))
4451debfc3dSmrg     {
4461debfc3dSmrg       /* This field is only used for NOTE_INSN_DELETED_LABEL, and
4471debfc3dSmrg 	 other times often contains garbage from INSN->NOTE death.  */
4481debfc3dSmrg       if (NOTE_KIND (in_rtx) == NOTE_INSN_DELETED_LABEL
4491debfc3dSmrg 	  || NOTE_KIND (in_rtx) == NOTE_INSN_DELETED_DEBUG_LABEL)
4501debfc3dSmrg 	fprintf (m_outfile, " %d",  XINT (in_rtx, idx));
4511debfc3dSmrg     }
4521debfc3dSmrg #if !defined(GENERATOR_FILE) && NUM_UNSPECV_VALUES > 0
4531debfc3dSmrg   else if (idx == 1
4541debfc3dSmrg 	   && GET_CODE (in_rtx) == UNSPEC_VOLATILE
4551debfc3dSmrg 	   && XINT (in_rtx, 1) >= 0
4561debfc3dSmrg 	   && XINT (in_rtx, 1) < NUM_UNSPECV_VALUES)
4571debfc3dSmrg     fprintf (m_outfile, " %s", unspecv_strings[XINT (in_rtx, 1)]);
4581debfc3dSmrg #endif
4591debfc3dSmrg #if !defined(GENERATOR_FILE) && NUM_UNSPEC_VALUES > 0
4601debfc3dSmrg   else if (idx == 1
4611debfc3dSmrg 	   && (GET_CODE (in_rtx) == UNSPEC
4621debfc3dSmrg 	       || GET_CODE (in_rtx) == UNSPEC_VOLATILE)
4631debfc3dSmrg 	   && XINT (in_rtx, 1) >= 0
4641debfc3dSmrg 	   && XINT (in_rtx, 1) < NUM_UNSPEC_VALUES)
4651debfc3dSmrg     fprintf (m_outfile, " %s", unspec_strings[XINT (in_rtx, 1)]);
4661debfc3dSmrg #endif
4671debfc3dSmrg   else
4681debfc3dSmrg     {
4691debfc3dSmrg       int value = XINT (in_rtx, idx);
4701debfc3dSmrg       const char *name;
4711debfc3dSmrg       int is_insn = INSN_P (in_rtx);
4721debfc3dSmrg 
4731debfc3dSmrg       /* Don't print INSN_CODEs in compact mode.  */
4741debfc3dSmrg       if (m_compact && is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, idx))
4751debfc3dSmrg 	{
4761debfc3dSmrg 	  m_sawclose = 0;
4771debfc3dSmrg 	  return;
4781debfc3dSmrg 	}
4791debfc3dSmrg 
4801debfc3dSmrg       if (flag_dump_unnumbered
4811debfc3dSmrg 	  && (is_insn || NOTE_P (in_rtx)))
4821debfc3dSmrg 	fputc ('#', m_outfile);
4831debfc3dSmrg       else
4841debfc3dSmrg 	fprintf (m_outfile, " %d", value);
4851debfc3dSmrg 
4861debfc3dSmrg       if (is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, idx)
4871debfc3dSmrg 	  && XINT (in_rtx, idx) >= 0
4881debfc3dSmrg 	  && (name = get_insn_name (XINT (in_rtx, idx))) != NULL)
4891debfc3dSmrg 	fprintf (m_outfile, " {%s}", name);
4901debfc3dSmrg       m_sawclose = 0;
4911debfc3dSmrg     }
4921debfc3dSmrg }
4931debfc3dSmrg 
4941debfc3dSmrg /* Subroutine of print_rtx_operand for handling code 'r'.  */
4951debfc3dSmrg 
4961debfc3dSmrg void
print_rtx_operand_code_r(const_rtx in_rtx)4971debfc3dSmrg rtx_writer::print_rtx_operand_code_r (const_rtx in_rtx)
4981debfc3dSmrg {
4991debfc3dSmrg   int is_insn = INSN_P (in_rtx);
5001debfc3dSmrg   unsigned int regno = REGNO (in_rtx);
5011debfc3dSmrg 
5021debfc3dSmrg #ifndef GENERATOR_FILE
5031debfc3dSmrg   /* For hard registers and virtuals, always print the
5041debfc3dSmrg      regno, except in compact mode.  */
5051debfc3dSmrg   if (regno <= LAST_VIRTUAL_REGISTER && !m_compact)
5061debfc3dSmrg     fprintf (m_outfile, " %d", regno);
5071debfc3dSmrg   if (regno < FIRST_PSEUDO_REGISTER)
5081debfc3dSmrg     fprintf (m_outfile, " %s", reg_names[regno]);
5091debfc3dSmrg   else if (regno <= LAST_VIRTUAL_REGISTER)
5101debfc3dSmrg     {
5111debfc3dSmrg       if (regno == VIRTUAL_INCOMING_ARGS_REGNUM)
5121debfc3dSmrg 	fprintf (m_outfile, " virtual-incoming-args");
5131debfc3dSmrg       else if (regno == VIRTUAL_STACK_VARS_REGNUM)
5141debfc3dSmrg 	fprintf (m_outfile, " virtual-stack-vars");
5151debfc3dSmrg       else if (regno == VIRTUAL_STACK_DYNAMIC_REGNUM)
5161debfc3dSmrg 	fprintf (m_outfile, " virtual-stack-dynamic");
5171debfc3dSmrg       else if (regno == VIRTUAL_OUTGOING_ARGS_REGNUM)
5181debfc3dSmrg 	fprintf (m_outfile, " virtual-outgoing-args");
5191debfc3dSmrg       else if (regno == VIRTUAL_CFA_REGNUM)
5201debfc3dSmrg 	fprintf (m_outfile, " virtual-cfa");
5211debfc3dSmrg       else if (regno == VIRTUAL_PREFERRED_STACK_BOUNDARY_REGNUM)
5221debfc3dSmrg 	fprintf (m_outfile, " virtual-preferred-stack-boundary");
5231debfc3dSmrg       else
5241debfc3dSmrg 	fprintf (m_outfile, " virtual-reg-%d", regno-FIRST_VIRTUAL_REGISTER);
5251debfc3dSmrg     }
5261debfc3dSmrg   else
5271debfc3dSmrg #endif
5281debfc3dSmrg     if (flag_dump_unnumbered && is_insn)
5291debfc3dSmrg       fputc ('#', m_outfile);
5301debfc3dSmrg     else if (m_compact)
5311debfc3dSmrg       {
5321debfc3dSmrg 	/* In compact mode, print pseudos with '< and '>' wrapping the regno,
5331debfc3dSmrg 	   offseting it by (LAST_VIRTUAL_REGISTER + 1), so that the
5341debfc3dSmrg 	   first non-virtual pseudo is dumped as "<0>".  */
5351debfc3dSmrg 	gcc_assert (regno > LAST_VIRTUAL_REGISTER);
5361debfc3dSmrg 	fprintf (m_outfile, " <%d>", regno - (LAST_VIRTUAL_REGISTER + 1));
5371debfc3dSmrg       }
5381debfc3dSmrg     else
5391debfc3dSmrg       fprintf (m_outfile, " %d", regno);
5401debfc3dSmrg 
5411debfc3dSmrg #ifndef GENERATOR_FILE
5421debfc3dSmrg   if (REG_ATTRS (in_rtx))
5431debfc3dSmrg     {
5441debfc3dSmrg       fputs (" [", m_outfile);
5451debfc3dSmrg       if (regno != ORIGINAL_REGNO (in_rtx))
5461debfc3dSmrg 	fprintf (m_outfile, "orig:%i", ORIGINAL_REGNO (in_rtx));
5471debfc3dSmrg       if (REG_EXPR (in_rtx))
5481debfc3dSmrg 	print_mem_expr (m_outfile, REG_EXPR (in_rtx));
5491debfc3dSmrg 
550a2dc1f3fSmrg       if (maybe_ne (REG_OFFSET (in_rtx), 0))
551a2dc1f3fSmrg 	{
552a2dc1f3fSmrg 	  fprintf (m_outfile, "+");
553a2dc1f3fSmrg 	  print_poly_int (m_outfile, REG_OFFSET (in_rtx));
554a2dc1f3fSmrg 	}
5551debfc3dSmrg       fputs (" ]", m_outfile);
5561debfc3dSmrg     }
5571debfc3dSmrg   if (regno != ORIGINAL_REGNO (in_rtx))
5581debfc3dSmrg     fprintf (m_outfile, " [%d]", ORIGINAL_REGNO (in_rtx));
5591debfc3dSmrg #endif
5601debfc3dSmrg }
5611debfc3dSmrg 
5621debfc3dSmrg /* Subroutine of print_rtx_operand for handling code 'u'.  */
5631debfc3dSmrg 
5641debfc3dSmrg void
print_rtx_operand_code_u(const_rtx in_rtx,int idx)5651debfc3dSmrg rtx_writer::print_rtx_operand_code_u (const_rtx in_rtx, int idx)
5661debfc3dSmrg {
5671debfc3dSmrg   /* Don't print insn UIDs for PREV/NEXT_INSN in compact mode.  */
5681debfc3dSmrg   if (m_compact && INSN_CHAIN_CODE_P (GET_CODE (in_rtx)) && idx < 2)
5691debfc3dSmrg     return;
5701debfc3dSmrg 
5711debfc3dSmrg   if (XEXP (in_rtx, idx) != NULL)
5721debfc3dSmrg     {
5731debfc3dSmrg       rtx sub = XEXP (in_rtx, idx);
5741debfc3dSmrg       enum rtx_code subc = GET_CODE (sub);
5751debfc3dSmrg 
5761debfc3dSmrg       if (GET_CODE (in_rtx) == LABEL_REF)
5771debfc3dSmrg 	{
5781debfc3dSmrg 	  if (subc == NOTE
5791debfc3dSmrg 	      && NOTE_KIND (sub) == NOTE_INSN_DELETED_LABEL)
5801debfc3dSmrg 	    {
5811debfc3dSmrg 	      if (flag_dump_unnumbered)
5821debfc3dSmrg 		fprintf (m_outfile, " [# deleted]");
5831debfc3dSmrg 	      else
5841debfc3dSmrg 		fprintf (m_outfile, " [%d deleted]", INSN_UID (sub));
5851debfc3dSmrg 	      m_sawclose = 0;
5861debfc3dSmrg 	      return;
5871debfc3dSmrg 	    }
5881debfc3dSmrg 
5891debfc3dSmrg 	  if (subc != CODE_LABEL)
5901debfc3dSmrg 	    {
5911debfc3dSmrg 	      print_rtx_operand_code_e (in_rtx, idx);
5921debfc3dSmrg 	      return;
5931debfc3dSmrg 	    }
5941debfc3dSmrg 	}
5951debfc3dSmrg 
5961debfc3dSmrg       if (flag_dump_unnumbered
5971debfc3dSmrg 	  || (flag_dump_unnumbered_links && idx <= 1
5981debfc3dSmrg 	      && (INSN_P (in_rtx) || NOTE_P (in_rtx)
5991debfc3dSmrg 		  || LABEL_P (in_rtx) || BARRIER_P (in_rtx))))
6001debfc3dSmrg 	fputs (" #", m_outfile);
6011debfc3dSmrg       else
6021debfc3dSmrg 	fprintf (m_outfile, " %d", INSN_UID (sub));
6031debfc3dSmrg     }
6041debfc3dSmrg   else
6051debfc3dSmrg     fputs (" 0", m_outfile);
6061debfc3dSmrg   m_sawclose = 0;
6071debfc3dSmrg }
6081debfc3dSmrg 
6091debfc3dSmrg /* Subroutine of print_rtx.   Print operand IDX of IN_RTX.  */
6101debfc3dSmrg 
6111debfc3dSmrg void
print_rtx_operand(const_rtx in_rtx,int idx)6121debfc3dSmrg rtx_writer::print_rtx_operand (const_rtx in_rtx, int idx)
6131debfc3dSmrg {
6141debfc3dSmrg   const char *format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
6151debfc3dSmrg 
6161debfc3dSmrg   switch (format_ptr[idx])
6171debfc3dSmrg     {
6181debfc3dSmrg       const char *str;
6191debfc3dSmrg 
6201debfc3dSmrg     case 'T':
6211debfc3dSmrg       str = XTMPL (in_rtx, idx);
6221debfc3dSmrg       goto string;
6231debfc3dSmrg 
6241debfc3dSmrg     case 'S':
6251debfc3dSmrg     case 's':
6261debfc3dSmrg       str = XSTR (in_rtx, idx);
6271debfc3dSmrg     string:
6281debfc3dSmrg 
6291debfc3dSmrg       if (str == 0)
6301debfc3dSmrg 	fputs (" (nil)", m_outfile);
6311debfc3dSmrg       else
6321debfc3dSmrg 	fprintf (m_outfile, " (\"%s\")", str);
6331debfc3dSmrg       m_sawclose = 1;
6341debfc3dSmrg       break;
6351debfc3dSmrg 
6361debfc3dSmrg     case '0':
6371debfc3dSmrg       print_rtx_operand_code_0 (in_rtx, idx);
6381debfc3dSmrg       break;
6391debfc3dSmrg 
6401debfc3dSmrg     case 'e':
6411debfc3dSmrg       print_rtx_operand_code_e (in_rtx, idx);
6421debfc3dSmrg       break;
6431debfc3dSmrg 
6441debfc3dSmrg     case 'E':
6451debfc3dSmrg     case 'V':
6461debfc3dSmrg       print_rtx_operand_codes_E_and_V (in_rtx, idx);
6471debfc3dSmrg       break;
6481debfc3dSmrg 
6491debfc3dSmrg     case 'w':
6501debfc3dSmrg       if (! m_simple)
6511debfc3dSmrg 	fprintf (m_outfile, " ");
6521debfc3dSmrg       fprintf (m_outfile, HOST_WIDE_INT_PRINT_DEC, XWINT (in_rtx, idx));
6531debfc3dSmrg       if (! m_simple && !m_compact)
6541debfc3dSmrg 	fprintf (m_outfile, " [" HOST_WIDE_INT_PRINT_HEX "]",
6551debfc3dSmrg 		 (unsigned HOST_WIDE_INT) XWINT (in_rtx, idx));
6561debfc3dSmrg       break;
6571debfc3dSmrg 
6581debfc3dSmrg     case 'i':
6591debfc3dSmrg       print_rtx_operand_code_i (in_rtx, idx);
6601debfc3dSmrg       break;
6611debfc3dSmrg 
662a2dc1f3fSmrg     case 'p':
663a2dc1f3fSmrg       fprintf (m_outfile, " ");
664a2dc1f3fSmrg       print_poly_int (m_outfile, SUBREG_BYTE (in_rtx));
665a2dc1f3fSmrg       break;
666a2dc1f3fSmrg 
6671debfc3dSmrg     case 'r':
6681debfc3dSmrg       print_rtx_operand_code_r (in_rtx);
6691debfc3dSmrg       break;
6701debfc3dSmrg 
6711debfc3dSmrg     /* Print NOTE_INSN names rather than integer codes.  */
6721debfc3dSmrg 
6731debfc3dSmrg     case 'n':
6741debfc3dSmrg       fprintf (m_outfile, " %s", GET_NOTE_INSN_NAME (XINT (in_rtx, idx)));
6751debfc3dSmrg       m_sawclose = 0;
6761debfc3dSmrg       break;
6771debfc3dSmrg 
6781debfc3dSmrg     case 'u':
6791debfc3dSmrg       print_rtx_operand_code_u (in_rtx, idx);
6801debfc3dSmrg       break;
6811debfc3dSmrg 
6821debfc3dSmrg     case 't':
6831debfc3dSmrg #ifndef GENERATOR_FILE
6841debfc3dSmrg       if (idx == 0 && GET_CODE (in_rtx) == DEBUG_IMPLICIT_PTR)
6851debfc3dSmrg 	print_mem_expr (m_outfile, DEBUG_IMPLICIT_PTR_DECL (in_rtx));
6861debfc3dSmrg       else if (idx == 0 && GET_CODE (in_rtx) == DEBUG_PARAMETER_REF)
6871debfc3dSmrg 	print_mem_expr (m_outfile, DEBUG_PARAMETER_REF_DECL (in_rtx));
6881debfc3dSmrg       else
6891debfc3dSmrg 	dump_addr (m_outfile, " ", XTREE (in_rtx, idx));
6901debfc3dSmrg #endif
6911debfc3dSmrg       break;
6921debfc3dSmrg 
6931debfc3dSmrg     case '*':
6941debfc3dSmrg       fputs (" Unknown", m_outfile);
6951debfc3dSmrg       m_sawclose = 0;
6961debfc3dSmrg       break;
6971debfc3dSmrg 
6981debfc3dSmrg     case 'B':
6991debfc3dSmrg       /* Don't print basic block ids in compact mode.  */
7001debfc3dSmrg       if (m_compact)
7011debfc3dSmrg 	break;
7021debfc3dSmrg #ifndef GENERATOR_FILE
7031debfc3dSmrg       if (XBBDEF (in_rtx, idx))
7041debfc3dSmrg 	fprintf (m_outfile, " %i", XBBDEF (in_rtx, idx)->index);
7051debfc3dSmrg #endif
7061debfc3dSmrg       break;
7071debfc3dSmrg 
7081debfc3dSmrg     default:
7091debfc3dSmrg       gcc_unreachable ();
7101debfc3dSmrg     }
7111debfc3dSmrg }
7121debfc3dSmrg 
7131debfc3dSmrg /* Subroutine of rtx_writer::print_rtx.
7141debfc3dSmrg    In compact mode, determine if operand IDX of IN_RTX is interesting
7151debfc3dSmrg    to dump, or (if in a trailing position) it can be omitted.  */
7161debfc3dSmrg 
7171debfc3dSmrg bool
operand_has_default_value_p(const_rtx in_rtx,int idx)7181debfc3dSmrg rtx_writer::operand_has_default_value_p (const_rtx in_rtx, int idx)
7191debfc3dSmrg {
7201debfc3dSmrg   const char *format_ptr = GET_RTX_FORMAT (GET_CODE (in_rtx));
7211debfc3dSmrg 
7221debfc3dSmrg   switch (format_ptr[idx])
7231debfc3dSmrg     {
7241debfc3dSmrg     case 'e':
7251debfc3dSmrg     case 'u':
7261debfc3dSmrg       return XEXP (in_rtx, idx) == NULL_RTX;
7271debfc3dSmrg 
7281debfc3dSmrg     case 's':
7291debfc3dSmrg       return XSTR (in_rtx, idx) == NULL;
7301debfc3dSmrg 
7311debfc3dSmrg     case '0':
7321debfc3dSmrg       switch (GET_CODE (in_rtx))
7331debfc3dSmrg 	{
7341debfc3dSmrg 	case JUMP_INSN:
7351debfc3dSmrg 	  /* JUMP_LABELs are always omitted in compact mode, so treat
7361debfc3dSmrg 	     any value here as omittable, so that earlier operands can
7371debfc3dSmrg 	     potentially be omitted also.  */
7381debfc3dSmrg 	  return m_compact;
7391debfc3dSmrg 
7401debfc3dSmrg 	default:
7411debfc3dSmrg 	  return false;
7421debfc3dSmrg 
7431debfc3dSmrg 	}
7441debfc3dSmrg 
7451debfc3dSmrg     default:
7461debfc3dSmrg       return false;
7471debfc3dSmrg     }
7481debfc3dSmrg }
7491debfc3dSmrg 
7501debfc3dSmrg /* Print IN_RTX onto m_outfile.  This is the recursive part of printing.  */
7511debfc3dSmrg 
7521debfc3dSmrg void
print_rtx(const_rtx in_rtx)7531debfc3dSmrg rtx_writer::print_rtx (const_rtx in_rtx)
7541debfc3dSmrg {
7551debfc3dSmrg   int idx = 0;
7561debfc3dSmrg 
7571debfc3dSmrg   if (m_sawclose)
7581debfc3dSmrg     {
7591debfc3dSmrg       if (m_simple)
7601debfc3dSmrg 	fputc (' ', m_outfile);
7611debfc3dSmrg       else
7621debfc3dSmrg 	fprintf (m_outfile, "\n%s%*s", print_rtx_head, m_indent * 2, "");
7631debfc3dSmrg       m_sawclose = 0;
7641debfc3dSmrg     }
7651debfc3dSmrg 
7661debfc3dSmrg   if (in_rtx == 0)
7671debfc3dSmrg     {
7681debfc3dSmrg       fputs ("(nil)", m_outfile);
7691debfc3dSmrg       m_sawclose = 1;
7701debfc3dSmrg       return;
7711debfc3dSmrg     }
7721debfc3dSmrg   else if (GET_CODE (in_rtx) > NUM_RTX_CODE)
7731debfc3dSmrg     {
7741debfc3dSmrg        fprintf (m_outfile, "(??? bad code %d\n%s%*s)", GET_CODE (in_rtx),
7751debfc3dSmrg 		print_rtx_head, m_indent * 2, "");
7761debfc3dSmrg        m_sawclose = 1;
7771debfc3dSmrg        return;
7781debfc3dSmrg     }
7791debfc3dSmrg 
7801debfc3dSmrg   fputc ('(', m_outfile);
7811debfc3dSmrg 
7821debfc3dSmrg   /* Print name of expression code.  */
7831debfc3dSmrg 
7841debfc3dSmrg   /* Handle reuse.  */
7851debfc3dSmrg #ifndef GENERATOR_FILE
7861debfc3dSmrg   if (m_rtx_reuse_manager)
7871debfc3dSmrg     {
7881debfc3dSmrg       int reuse_id;
7891debfc3dSmrg       if (m_rtx_reuse_manager->has_reuse_id (in_rtx, &reuse_id))
7901debfc3dSmrg 	{
7911debfc3dSmrg 	  /* Have we already seen the defn of this rtx?  */
7921debfc3dSmrg 	  if (m_rtx_reuse_manager->seen_def_p (reuse_id))
7931debfc3dSmrg 	    {
7941debfc3dSmrg 	      fprintf (m_outfile, "reuse_rtx %i)", reuse_id);
7951debfc3dSmrg 	      m_sawclose = 1;
7961debfc3dSmrg 	      return;
7971debfc3dSmrg 	    }
7981debfc3dSmrg 	  else
7991debfc3dSmrg 	    {
8001debfc3dSmrg 	      /* First time we've seen this reused-rtx.  */
8011debfc3dSmrg 	      fprintf (m_outfile, "%i|", reuse_id);
8021debfc3dSmrg 	      m_rtx_reuse_manager->set_seen_def (reuse_id);
8031debfc3dSmrg 	    }
8041debfc3dSmrg 	}
8051debfc3dSmrg     }
8061debfc3dSmrg #endif /* #ifndef GENERATOR_FILE */
8071debfc3dSmrg 
8081debfc3dSmrg   /* In compact mode, prefix the code of insns with "c",
8091debfc3dSmrg      giving "cinsn", "cnote" etc.  */
8101debfc3dSmrg   if (m_compact && is_a <const rtx_insn *, const struct rtx_def> (in_rtx))
8111debfc3dSmrg     {
8121debfc3dSmrg       /* "ccode_label" is slightly awkward, so special-case it as
8131debfc3dSmrg 	 just "clabel".  */
8141debfc3dSmrg       rtx_code code = GET_CODE (in_rtx);
8151debfc3dSmrg       if (code == CODE_LABEL)
8161debfc3dSmrg 	fprintf (m_outfile, "clabel");
8171debfc3dSmrg       else
8181debfc3dSmrg 	fprintf (m_outfile, "c%s", GET_RTX_NAME (code));
8191debfc3dSmrg     }
8201debfc3dSmrg   else if (m_simple && CONST_INT_P (in_rtx))
8211debfc3dSmrg     ; /* no code.  */
8221debfc3dSmrg   else
8231debfc3dSmrg     fprintf (m_outfile, "%s", GET_RTX_NAME (GET_CODE (in_rtx)));
8241debfc3dSmrg 
8251debfc3dSmrg   if (! m_simple)
8261debfc3dSmrg     {
8271debfc3dSmrg       if (RTX_FLAG (in_rtx, in_struct))
8281debfc3dSmrg 	fputs ("/s", m_outfile);
8291debfc3dSmrg 
8301debfc3dSmrg       if (RTX_FLAG (in_rtx, volatil))
8311debfc3dSmrg 	fputs ("/v", m_outfile);
8321debfc3dSmrg 
8331debfc3dSmrg       if (RTX_FLAG (in_rtx, unchanging))
8341debfc3dSmrg 	fputs ("/u", m_outfile);
8351debfc3dSmrg 
8361debfc3dSmrg       if (RTX_FLAG (in_rtx, frame_related))
8371debfc3dSmrg 	fputs ("/f", m_outfile);
8381debfc3dSmrg 
8391debfc3dSmrg       if (RTX_FLAG (in_rtx, jump))
8401debfc3dSmrg 	fputs ("/j", m_outfile);
8411debfc3dSmrg 
8421debfc3dSmrg       if (RTX_FLAG (in_rtx, call))
8431debfc3dSmrg 	fputs ("/c", m_outfile);
8441debfc3dSmrg 
8451debfc3dSmrg       if (RTX_FLAG (in_rtx, return_val))
8461debfc3dSmrg 	fputs ("/i", m_outfile);
8471debfc3dSmrg 
8481debfc3dSmrg       /* Print REG_NOTE names for EXPR_LIST and INSN_LIST.  */
8491debfc3dSmrg       if ((GET_CODE (in_rtx) == EXPR_LIST
8501debfc3dSmrg 	   || GET_CODE (in_rtx) == INSN_LIST
8511debfc3dSmrg 	   || GET_CODE (in_rtx) == INT_LIST)
8521debfc3dSmrg 	  && (int)GET_MODE (in_rtx) < REG_NOTE_MAX
8531debfc3dSmrg 	  && !m_in_call_function_usage)
8541debfc3dSmrg 	fprintf (m_outfile, ":%s",
8551debfc3dSmrg 		 GET_REG_NOTE_NAME (GET_MODE (in_rtx)));
8561debfc3dSmrg 
8571debfc3dSmrg       /* For other rtl, print the mode if it's not VOID.  */
8581debfc3dSmrg       else if (GET_MODE (in_rtx) != VOIDmode)
8591debfc3dSmrg 	fprintf (m_outfile, ":%s", GET_MODE_NAME (GET_MODE (in_rtx)));
8601debfc3dSmrg 
8611debfc3dSmrg #ifndef GENERATOR_FILE
8621debfc3dSmrg       if (GET_CODE (in_rtx) == VAR_LOCATION)
8631debfc3dSmrg 	{
8641debfc3dSmrg 	  if (TREE_CODE (PAT_VAR_LOCATION_DECL (in_rtx)) == STRING_CST)
8651debfc3dSmrg 	    fputs (" <debug string placeholder>", m_outfile);
8661debfc3dSmrg 	  else
8671debfc3dSmrg 	    print_mem_expr (m_outfile, PAT_VAR_LOCATION_DECL (in_rtx));
8681debfc3dSmrg 	  fputc (' ', m_outfile);
8691debfc3dSmrg 	  print_rtx (PAT_VAR_LOCATION_LOC (in_rtx));
8701debfc3dSmrg 	  if (PAT_VAR_LOCATION_STATUS (in_rtx)
8711debfc3dSmrg 	      == VAR_INIT_STATUS_UNINITIALIZED)
8721debfc3dSmrg 	    fprintf (m_outfile, " [uninit]");
8731debfc3dSmrg 	  m_sawclose = 1;
8741debfc3dSmrg 	  idx = GET_RTX_LENGTH (VAR_LOCATION);
8751debfc3dSmrg 	}
8761debfc3dSmrg #endif
8771debfc3dSmrg     }
8781debfc3dSmrg 
8791debfc3dSmrg #ifndef GENERATOR_FILE
8801debfc3dSmrg   if (CONST_DOUBLE_AS_FLOAT_P (in_rtx))
8811debfc3dSmrg     idx = 5;
8821debfc3dSmrg #endif
8831debfc3dSmrg 
8841debfc3dSmrg   /* For insns, print the INSN_UID.  */
8851debfc3dSmrg   if (INSN_CHAIN_CODE_P (GET_CODE (in_rtx)))
8861debfc3dSmrg     {
8871debfc3dSmrg       if (flag_dump_unnumbered)
8881debfc3dSmrg 	fprintf (m_outfile, " #");
8891debfc3dSmrg       else
8901debfc3dSmrg 	fprintf (m_outfile, " %d", INSN_UID (in_rtx));
8911debfc3dSmrg     }
8921debfc3dSmrg 
8931debfc3dSmrg   /* Determine which is the final operand to print.
8941debfc3dSmrg      In compact mode, skip trailing operands that have the default values
8951debfc3dSmrg      e.g. trailing "(nil)" values.  */
8961debfc3dSmrg   int limit = GET_RTX_LENGTH (GET_CODE (in_rtx));
8971debfc3dSmrg   if (m_compact)
8981debfc3dSmrg     while (limit > idx && operand_has_default_value_p (in_rtx, limit - 1))
8991debfc3dSmrg       limit--;
9001debfc3dSmrg 
9011debfc3dSmrg   /* Get the format string and skip the first elements if we have handled
9021debfc3dSmrg      them already.  */
9031debfc3dSmrg 
9041debfc3dSmrg   for (; idx < limit; idx++)
9051debfc3dSmrg     print_rtx_operand (in_rtx, idx);
9061debfc3dSmrg 
9071debfc3dSmrg   switch (GET_CODE (in_rtx))
9081debfc3dSmrg     {
9091debfc3dSmrg #ifndef GENERATOR_FILE
9101debfc3dSmrg     case MEM:
9111debfc3dSmrg       if (__builtin_expect (final_insns_dump_p, false))
9121debfc3dSmrg 	fprintf (m_outfile, " [");
9131debfc3dSmrg       else
9141debfc3dSmrg 	fprintf (m_outfile, " [" HOST_WIDE_INT_PRINT_DEC,
9151debfc3dSmrg 		 (HOST_WIDE_INT) MEM_ALIAS_SET (in_rtx));
9161debfc3dSmrg 
9171debfc3dSmrg       if (MEM_EXPR (in_rtx))
9181debfc3dSmrg 	print_mem_expr (m_outfile, MEM_EXPR (in_rtx));
9191debfc3dSmrg       else
9201debfc3dSmrg 	fputc (' ', m_outfile);
9211debfc3dSmrg 
9221debfc3dSmrg       if (MEM_OFFSET_KNOWN_P (in_rtx))
923a2dc1f3fSmrg 	{
924a2dc1f3fSmrg 	  fprintf (m_outfile, "+");
925a2dc1f3fSmrg 	  print_poly_int (m_outfile, MEM_OFFSET (in_rtx));
926a2dc1f3fSmrg 	}
9271debfc3dSmrg 
9281debfc3dSmrg       if (MEM_SIZE_KNOWN_P (in_rtx))
929a2dc1f3fSmrg 	{
930a2dc1f3fSmrg 	  fprintf (m_outfile, " S");
931a2dc1f3fSmrg 	  print_poly_int (m_outfile, MEM_SIZE (in_rtx));
932a2dc1f3fSmrg 	}
9331debfc3dSmrg 
9341debfc3dSmrg       if (MEM_ALIGN (in_rtx) != 1)
9351debfc3dSmrg 	fprintf (m_outfile, " A%u", MEM_ALIGN (in_rtx));
9361debfc3dSmrg 
9371debfc3dSmrg       if (!ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (in_rtx)))
9381debfc3dSmrg 	fprintf (m_outfile, " AS%u", MEM_ADDR_SPACE (in_rtx));
9391debfc3dSmrg 
9401debfc3dSmrg       fputc (']', m_outfile);
9411debfc3dSmrg       break;
9421debfc3dSmrg 
9431debfc3dSmrg     case CONST_DOUBLE:
9441debfc3dSmrg       if (FLOAT_MODE_P (GET_MODE (in_rtx)))
9451debfc3dSmrg 	{
9461debfc3dSmrg 	  char s[60];
9471debfc3dSmrg 
9481debfc3dSmrg 	  real_to_decimal (s, CONST_DOUBLE_REAL_VALUE (in_rtx),
9491debfc3dSmrg 			   sizeof (s), 0, 1);
9501debfc3dSmrg 	  fprintf (m_outfile, " %s", s);
9511debfc3dSmrg 
9521debfc3dSmrg 	  real_to_hexadecimal (s, CONST_DOUBLE_REAL_VALUE (in_rtx),
9531debfc3dSmrg 			       sizeof (s), 0, 1);
9541debfc3dSmrg 	  fprintf (m_outfile, " [%s]", s);
9551debfc3dSmrg 	}
9561debfc3dSmrg       break;
9571debfc3dSmrg 
9581debfc3dSmrg     case CONST_WIDE_INT:
9591debfc3dSmrg       fprintf (m_outfile, " ");
9601debfc3dSmrg       cwi_output_hex (m_outfile, in_rtx);
9611debfc3dSmrg       break;
962a2dc1f3fSmrg 
963a2dc1f3fSmrg     case CONST_POLY_INT:
964a2dc1f3fSmrg       fprintf (m_outfile, " [");
965a2dc1f3fSmrg       print_dec (CONST_POLY_INT_COEFFS (in_rtx)[0], m_outfile, SIGNED);
966a2dc1f3fSmrg       for (unsigned int i = 1; i < NUM_POLY_INT_COEFFS; ++i)
967a2dc1f3fSmrg 	{
968a2dc1f3fSmrg 	  fprintf (m_outfile, ", ");
969a2dc1f3fSmrg 	  print_dec (CONST_POLY_INT_COEFFS (in_rtx)[i], m_outfile, SIGNED);
970a2dc1f3fSmrg 	}
971a2dc1f3fSmrg       fprintf (m_outfile, "]");
972a2dc1f3fSmrg       break;
9731debfc3dSmrg #endif
9741debfc3dSmrg 
9751debfc3dSmrg     case CODE_LABEL:
9761debfc3dSmrg       if (!m_compact)
9771debfc3dSmrg 	fprintf (m_outfile, " [%d uses]", LABEL_NUSES (in_rtx));
9781debfc3dSmrg       switch (LABEL_KIND (in_rtx))
9791debfc3dSmrg 	{
9801debfc3dSmrg 	  case LABEL_NORMAL: break;
9811debfc3dSmrg 	  case LABEL_STATIC_ENTRY: fputs (" [entry]", m_outfile); break;
9821debfc3dSmrg 	  case LABEL_GLOBAL_ENTRY: fputs (" [global entry]", m_outfile); break;
9831debfc3dSmrg 	  case LABEL_WEAK_ENTRY: fputs (" [weak entry]", m_outfile); break;
9841debfc3dSmrg 	  default: gcc_unreachable ();
9851debfc3dSmrg 	}
9861debfc3dSmrg       break;
9871debfc3dSmrg 
9881debfc3dSmrg     default:
9891debfc3dSmrg       break;
9901debfc3dSmrg     }
9911debfc3dSmrg 
9921debfc3dSmrg   fputc (')', m_outfile);
9931debfc3dSmrg   m_sawclose = 1;
9941debfc3dSmrg }
9951debfc3dSmrg 
9961debfc3dSmrg /* Emit a closing parenthesis and newline.  */
9971debfc3dSmrg 
9981debfc3dSmrg void
finish_directive()9991debfc3dSmrg rtx_writer::finish_directive ()
10001debfc3dSmrg {
10011debfc3dSmrg   fprintf (m_outfile, ")\n");
10021debfc3dSmrg   m_sawclose = 0;
10031debfc3dSmrg }
10041debfc3dSmrg 
10051debfc3dSmrg /* Print an rtx on the current line of FILE.  Initially indent IND
10061debfc3dSmrg    characters.  */
10071debfc3dSmrg 
10081debfc3dSmrg void
print_inline_rtx(FILE * outf,const_rtx x,int ind)10091debfc3dSmrg print_inline_rtx (FILE *outf, const_rtx x, int ind)
10101debfc3dSmrg {
10111debfc3dSmrg   rtx_writer w (outf, ind, false, false, NULL);
10121debfc3dSmrg   w.print_rtx (x);
10131debfc3dSmrg }
10141debfc3dSmrg 
10151debfc3dSmrg /* Call this function from the debugger to see what X looks like.  */
10161debfc3dSmrg 
10171debfc3dSmrg DEBUG_FUNCTION void
debug_rtx(const_rtx x)10181debfc3dSmrg debug_rtx (const_rtx x)
10191debfc3dSmrg {
10201debfc3dSmrg   rtx_writer w (stderr, 0, false, false, NULL);
10211debfc3dSmrg   w.print_rtx (x);
10221debfc3dSmrg   fprintf (stderr, "\n");
10231debfc3dSmrg }
10241debfc3dSmrg 
10251debfc3dSmrg /* Dump rtx REF.  */
10261debfc3dSmrg 
10271debfc3dSmrg DEBUG_FUNCTION void
debug(const rtx_def & ref)10281debfc3dSmrg debug (const rtx_def &ref)
10291debfc3dSmrg {
10301debfc3dSmrg   debug_rtx (&ref);
10311debfc3dSmrg }
10321debfc3dSmrg 
10331debfc3dSmrg DEBUG_FUNCTION void
debug(const rtx_def * ptr)10341debfc3dSmrg debug (const rtx_def *ptr)
10351debfc3dSmrg {
10361debfc3dSmrg   if (ptr)
10371debfc3dSmrg     debug (*ptr);
10381debfc3dSmrg   else
10391debfc3dSmrg     fprintf (stderr, "<nil>\n");
10401debfc3dSmrg }
10411debfc3dSmrg 
1042a2dc1f3fSmrg /* Like debug_rtx but with no newline, as debug_helper will add one.
1043a2dc1f3fSmrg 
1044a2dc1f3fSmrg    Note: No debug_slim(rtx_insn *) variant implemented, as this
1045a2dc1f3fSmrg    function can serve for both rtx and rtx_insn.  */
1046a2dc1f3fSmrg 
1047a2dc1f3fSmrg static void
debug_slim(const_rtx x)1048a2dc1f3fSmrg debug_slim (const_rtx x)
1049a2dc1f3fSmrg {
1050a2dc1f3fSmrg   rtx_writer w (stderr, 0, false, false, NULL);
1051a2dc1f3fSmrg   w.print_rtx (x);
1052a2dc1f3fSmrg }
1053a2dc1f3fSmrg 
1054a2dc1f3fSmrg DEFINE_DEBUG_VEC (rtx_def *)
1055a2dc1f3fSmrg DEFINE_DEBUG_VEC (rtx_insn *)
1056a2dc1f3fSmrg DEFINE_DEBUG_HASH_SET (rtx_def *)
1057a2dc1f3fSmrg DEFINE_DEBUG_HASH_SET (rtx_insn *)
1058a2dc1f3fSmrg 
10591debfc3dSmrg /* Count of rtx's to print with debug_rtx_list.
10601debfc3dSmrg    This global exists because gdb user defined commands have no arguments.  */
10611debfc3dSmrg 
10621debfc3dSmrg DEBUG_VARIABLE int debug_rtx_count = 0;	/* 0 is treated as equivalent to 1 */
10631debfc3dSmrg 
10641debfc3dSmrg /* Call this function to print list from X on.
10651debfc3dSmrg 
10661debfc3dSmrg    N is a count of the rtx's to print. Positive values print from the specified
10671debfc3dSmrg    rtx_insn on.  Negative values print a window around the rtx_insn.
10681debfc3dSmrg    EG: -5 prints 2 rtx_insn's on either side (in addition to the specified
10691debfc3dSmrg    rtx_insn).  */
10701debfc3dSmrg 
10711debfc3dSmrg DEBUG_FUNCTION void
debug_rtx_list(const rtx_insn * x,int n)10721debfc3dSmrg debug_rtx_list (const rtx_insn *x, int n)
10731debfc3dSmrg {
10741debfc3dSmrg   int i,count;
10751debfc3dSmrg   const rtx_insn *insn;
10761debfc3dSmrg 
10771debfc3dSmrg   count = n == 0 ? 1 : n < 0 ? -n : n;
10781debfc3dSmrg 
10791debfc3dSmrg   /* If we are printing a window, back up to the start.  */
10801debfc3dSmrg 
10811debfc3dSmrg   if (n < 0)
10821debfc3dSmrg     for (i = count / 2; i > 0; i--)
10831debfc3dSmrg       {
10841debfc3dSmrg 	if (PREV_INSN (x) == 0)
10851debfc3dSmrg 	  break;
10861debfc3dSmrg 	x = PREV_INSN (x);
10871debfc3dSmrg       }
10881debfc3dSmrg 
10891debfc3dSmrg   for (i = count, insn = x; i > 0 && insn != 0; i--, insn = NEXT_INSN (insn))
10901debfc3dSmrg     {
10911debfc3dSmrg       debug_rtx (insn);
10921debfc3dSmrg       fprintf (stderr, "\n");
10931debfc3dSmrg     }
10941debfc3dSmrg }
10951debfc3dSmrg 
10961debfc3dSmrg /* Call this function to print an rtx_insn list from START to END
10971debfc3dSmrg    inclusive.  */
10981debfc3dSmrg 
10991debfc3dSmrg DEBUG_FUNCTION void
debug_rtx_range(const rtx_insn * start,const rtx_insn * end)11001debfc3dSmrg debug_rtx_range (const rtx_insn *start, const rtx_insn *end)
11011debfc3dSmrg {
11021debfc3dSmrg   while (1)
11031debfc3dSmrg     {
11041debfc3dSmrg       debug_rtx (start);
11051debfc3dSmrg       fprintf (stderr, "\n");
11061debfc3dSmrg       if (!start || start == end)
11071debfc3dSmrg 	break;
11081debfc3dSmrg       start = NEXT_INSN (start);
11091debfc3dSmrg     }
11101debfc3dSmrg }
11111debfc3dSmrg 
11121debfc3dSmrg /* Call this function to search an rtx_insn list to find one with insn uid UID,
11131debfc3dSmrg    and then call debug_rtx_list to print it, using DEBUG_RTX_COUNT.
11141debfc3dSmrg    The found insn is returned to enable further debugging analysis.  */
11151debfc3dSmrg 
11161debfc3dSmrg DEBUG_FUNCTION const rtx_insn *
debug_rtx_find(const rtx_insn * x,int uid)11171debfc3dSmrg debug_rtx_find (const rtx_insn *x, int uid)
11181debfc3dSmrg {
11191debfc3dSmrg   while (x != 0 && INSN_UID (x) != uid)
11201debfc3dSmrg     x = NEXT_INSN (x);
11211debfc3dSmrg   if (x != 0)
11221debfc3dSmrg     {
11231debfc3dSmrg       debug_rtx_list (x, debug_rtx_count);
11241debfc3dSmrg       return x;
11251debfc3dSmrg     }
11261debfc3dSmrg   else
11271debfc3dSmrg     {
11281debfc3dSmrg       fprintf (stderr, "insn uid %d not found\n", uid);
11291debfc3dSmrg       return 0;
11301debfc3dSmrg     }
11311debfc3dSmrg }
11321debfc3dSmrg 
11331debfc3dSmrg /* External entry point for printing a chain of insns
11341debfc3dSmrg    starting with RTX_FIRST.
11351debfc3dSmrg    A blank line separates insns.
11361debfc3dSmrg 
11371debfc3dSmrg    If RTX_FIRST is not an insn, then it alone is printed, with no newline.  */
11381debfc3dSmrg 
11391debfc3dSmrg void
print_rtl(const_rtx rtx_first)11401debfc3dSmrg rtx_writer::print_rtl (const_rtx rtx_first)
11411debfc3dSmrg {
11421debfc3dSmrg   const rtx_insn *tmp_rtx;
11431debfc3dSmrg 
11441debfc3dSmrg   if (rtx_first == 0)
11451debfc3dSmrg     {
11461debfc3dSmrg       fputs (print_rtx_head, m_outfile);
11471debfc3dSmrg       fputs ("(nil)\n", m_outfile);
11481debfc3dSmrg     }
11491debfc3dSmrg   else
11501debfc3dSmrg     switch (GET_CODE (rtx_first))
11511debfc3dSmrg       {
11521debfc3dSmrg       case INSN:
11531debfc3dSmrg       case JUMP_INSN:
11541debfc3dSmrg       case CALL_INSN:
11551debfc3dSmrg       case NOTE:
11561debfc3dSmrg       case CODE_LABEL:
11571debfc3dSmrg       case JUMP_TABLE_DATA:
11581debfc3dSmrg       case BARRIER:
11591debfc3dSmrg 	for (tmp_rtx = as_a <const rtx_insn *> (rtx_first);
11601debfc3dSmrg 	     tmp_rtx != 0;
11611debfc3dSmrg 	     tmp_rtx = NEXT_INSN (tmp_rtx))
11621debfc3dSmrg 	  {
11631debfc3dSmrg 	    fputs (print_rtx_head, m_outfile);
11641debfc3dSmrg 	    print_rtx (tmp_rtx);
11651debfc3dSmrg 	    fprintf (m_outfile, "\n");
11661debfc3dSmrg 	  }
11671debfc3dSmrg 	break;
11681debfc3dSmrg 
11691debfc3dSmrg       default:
11701debfc3dSmrg 	fputs (print_rtx_head, m_outfile);
11711debfc3dSmrg 	print_rtx (rtx_first);
11721debfc3dSmrg       }
11731debfc3dSmrg }
11741debfc3dSmrg 
11751debfc3dSmrg /* External entry point for printing a chain of insns
11761debfc3dSmrg    starting with RTX_FIRST onto file OUTF.
11771debfc3dSmrg    A blank line separates insns.
11781debfc3dSmrg 
11791debfc3dSmrg    If RTX_FIRST is not an insn, then it alone is printed, with no newline.  */
11801debfc3dSmrg 
11811debfc3dSmrg void
print_rtl(FILE * outf,const_rtx rtx_first)11821debfc3dSmrg print_rtl (FILE *outf, const_rtx rtx_first)
11831debfc3dSmrg {
11841debfc3dSmrg   rtx_writer w (outf, 0, false, false, NULL);
11851debfc3dSmrg   w.print_rtl (rtx_first);
11861debfc3dSmrg }
11871debfc3dSmrg 
11881debfc3dSmrg /* Like print_rtx, except specify a file.  */
11891debfc3dSmrg /* Return nonzero if we actually printed anything.  */
11901debfc3dSmrg 
11911debfc3dSmrg int
print_rtl_single(FILE * outf,const_rtx x)11921debfc3dSmrg print_rtl_single (FILE *outf, const_rtx x)
11931debfc3dSmrg {
11941debfc3dSmrg   rtx_writer w (outf, 0, false, false, NULL);
11951debfc3dSmrg   return w.print_rtl_single_with_indent (x, 0);
11961debfc3dSmrg }
11971debfc3dSmrg 
11981debfc3dSmrg /* Like print_rtl_single, except specify an indentation.  */
11991debfc3dSmrg 
12001debfc3dSmrg int
print_rtl_single_with_indent(const_rtx x,int ind)12011debfc3dSmrg rtx_writer::print_rtl_single_with_indent (const_rtx x, int ind)
12021debfc3dSmrg {
12031debfc3dSmrg   char *s_indent = (char *) alloca ((size_t) ind + 1);
12041debfc3dSmrg   memset ((void *) s_indent, ' ', (size_t) ind);
12051debfc3dSmrg   s_indent[ind] = '\0';
12061debfc3dSmrg   fputs (s_indent, m_outfile);
12071debfc3dSmrg   fputs (print_rtx_head, m_outfile);
12081debfc3dSmrg 
12091debfc3dSmrg   int old_indent = m_indent;
12101debfc3dSmrg   m_indent = ind;
12111debfc3dSmrg   m_sawclose = 0;
12121debfc3dSmrg   print_rtx (x);
12131debfc3dSmrg   putc ('\n', m_outfile);
12141debfc3dSmrg   m_indent = old_indent;
12151debfc3dSmrg   return 1;
12161debfc3dSmrg }
12171debfc3dSmrg 
12181debfc3dSmrg 
12191debfc3dSmrg /* Like print_rtl except without all the detail; for example,
12201debfc3dSmrg    if RTX is a CONST_INT then print in decimal format.  */
12211debfc3dSmrg 
12221debfc3dSmrg void
print_simple_rtl(FILE * outf,const_rtx x)12231debfc3dSmrg print_simple_rtl (FILE *outf, const_rtx x)
12241debfc3dSmrg {
12251debfc3dSmrg   rtx_writer w (outf, 0, true, false, NULL);
12261debfc3dSmrg   w.print_rtl (x);
12271debfc3dSmrg }
12281debfc3dSmrg 
12291debfc3dSmrg /* Print the elements of VEC to FILE.  */
12301debfc3dSmrg 
12311debfc3dSmrg void
print_rtx_insn_vec(FILE * file,const vec<rtx_insn * > & vec)12321debfc3dSmrg print_rtx_insn_vec (FILE *file, const vec<rtx_insn *> &vec)
12331debfc3dSmrg {
12341debfc3dSmrg   fputc('{', file);
12351debfc3dSmrg 
12361debfc3dSmrg   unsigned int len = vec.length ();
12371debfc3dSmrg   for (unsigned int i = 0; i < len; i++)
12381debfc3dSmrg     {
12391debfc3dSmrg       print_rtl (file, vec[i]);
12401debfc3dSmrg       if (i < len - 1)
12411debfc3dSmrg 	fputs (", ", file);
12421debfc3dSmrg     }
12431debfc3dSmrg 
12441debfc3dSmrg   fputc ('}', file);
12451debfc3dSmrg }
12461debfc3dSmrg 
12471debfc3dSmrg #ifndef GENERATOR_FILE
12481debfc3dSmrg /* The functions below  try to print RTL in a form resembling assembler
12491debfc3dSmrg    mnemonics.  Because this form is more concise than the "traditional" form
12501debfc3dSmrg    of RTL printing in Lisp-style, the form printed by this file is called
12511debfc3dSmrg    "slim".  RTL dumps in slim format can be obtained by appending the "-slim"
12521debfc3dSmrg    option to -fdump-rtl-<pass>.  Control flow graph output as a DOT file is
12531debfc3dSmrg    always printed in slim form.
12541debfc3dSmrg 
12551debfc3dSmrg    The normal interface to the functionality provided in this pretty-printer
12561debfc3dSmrg    is through the dump_*_slim functions to print to a stream, or via the
12571debfc3dSmrg    print_*_slim functions to print into a user's pretty-printer.
12581debfc3dSmrg 
12591debfc3dSmrg    It is also possible to obtain a string for a single pattern as a string
12601debfc3dSmrg    pointer, via str_pattern_slim, but this usage is discouraged.  */
12611debfc3dSmrg 
12621debfc3dSmrg /* For insns we print patterns, and for some patterns we print insns...  */
12631debfc3dSmrg static void print_insn_with_notes (pretty_printer *, const rtx_insn *);
12641debfc3dSmrg 
12651debfc3dSmrg /* This recognizes rtx'en classified as expressions.  These are always
12661debfc3dSmrg    represent some action on values or results of other expression, that
12671debfc3dSmrg    may be stored in objects representing values.  */
12681debfc3dSmrg 
12691debfc3dSmrg static void
print_exp(pretty_printer * pp,const_rtx x,int verbose)12701debfc3dSmrg print_exp (pretty_printer *pp, const_rtx x, int verbose)
12711debfc3dSmrg {
12721debfc3dSmrg   const char *st[4];
12731debfc3dSmrg   const char *fun;
12741debfc3dSmrg   rtx op[4];
12751debfc3dSmrg   int i;
12761debfc3dSmrg 
12771debfc3dSmrg   fun = (char *) 0;
12781debfc3dSmrg   for (i = 0; i < 4; i++)
12791debfc3dSmrg     {
12801debfc3dSmrg       st[i] = (char *) 0;
12811debfc3dSmrg       op[i] = NULL_RTX;
12821debfc3dSmrg     }
12831debfc3dSmrg 
12841debfc3dSmrg   switch (GET_CODE (x))
12851debfc3dSmrg     {
12861debfc3dSmrg     case PLUS:
12871debfc3dSmrg       op[0] = XEXP (x, 0);
12881debfc3dSmrg       if (CONST_INT_P (XEXP (x, 1))
12891debfc3dSmrg 	  && INTVAL (XEXP (x, 1)) < 0)
12901debfc3dSmrg 	{
12911debfc3dSmrg 	  st[1] = "-";
12921debfc3dSmrg 	  op[1] = GEN_INT (-INTVAL (XEXP (x, 1)));
12931debfc3dSmrg 	}
12941debfc3dSmrg       else
12951debfc3dSmrg 	{
12961debfc3dSmrg 	  st[1] = "+";
12971debfc3dSmrg 	  op[1] = XEXP (x, 1);
12981debfc3dSmrg 	}
12991debfc3dSmrg       break;
13001debfc3dSmrg     case LO_SUM:
13011debfc3dSmrg       op[0] = XEXP (x, 0);
13021debfc3dSmrg       st[1] = "+low(";
13031debfc3dSmrg       op[1] = XEXP (x, 1);
13041debfc3dSmrg       st[2] = ")";
13051debfc3dSmrg       break;
13061debfc3dSmrg     case MINUS:
13071debfc3dSmrg       op[0] = XEXP (x, 0);
13081debfc3dSmrg       st[1] = "-";
13091debfc3dSmrg       op[1] = XEXP (x, 1);
13101debfc3dSmrg       break;
13111debfc3dSmrg     case COMPARE:
13121debfc3dSmrg       fun = "cmp";
13131debfc3dSmrg       op[0] = XEXP (x, 0);
13141debfc3dSmrg       op[1] = XEXP (x, 1);
13151debfc3dSmrg       break;
13161debfc3dSmrg     case NEG:
13171debfc3dSmrg       st[0] = "-";
13181debfc3dSmrg       op[0] = XEXP (x, 0);
13191debfc3dSmrg       break;
13201debfc3dSmrg     case FMA:
13211debfc3dSmrg       st[0] = "{";
13221debfc3dSmrg       op[0] = XEXP (x, 0);
13231debfc3dSmrg       st[1] = "*";
13241debfc3dSmrg       op[1] = XEXP (x, 1);
13251debfc3dSmrg       st[2] = "+";
13261debfc3dSmrg       op[2] = XEXP (x, 2);
13271debfc3dSmrg       st[3] = "}";
13281debfc3dSmrg       break;
13291debfc3dSmrg     case MULT:
13301debfc3dSmrg       op[0] = XEXP (x, 0);
13311debfc3dSmrg       st[1] = "*";
13321debfc3dSmrg       op[1] = XEXP (x, 1);
13331debfc3dSmrg       break;
13341debfc3dSmrg     case DIV:
13351debfc3dSmrg       op[0] = XEXP (x, 0);
13361debfc3dSmrg       st[1] = "/";
13371debfc3dSmrg       op[1] = XEXP (x, 1);
13381debfc3dSmrg       break;
13391debfc3dSmrg     case UDIV:
13401debfc3dSmrg       fun = "udiv";
13411debfc3dSmrg       op[0] = XEXP (x, 0);
13421debfc3dSmrg       op[1] = XEXP (x, 1);
13431debfc3dSmrg       break;
13441debfc3dSmrg     case MOD:
13451debfc3dSmrg       op[0] = XEXP (x, 0);
13461debfc3dSmrg       st[1] = "%";
13471debfc3dSmrg       op[1] = XEXP (x, 1);
13481debfc3dSmrg       break;
13491debfc3dSmrg     case UMOD:
13501debfc3dSmrg       fun = "umod";
13511debfc3dSmrg       op[0] = XEXP (x, 0);
13521debfc3dSmrg       op[1] = XEXP (x, 1);
13531debfc3dSmrg       break;
13541debfc3dSmrg     case SMIN:
13551debfc3dSmrg       fun = "smin";
13561debfc3dSmrg       op[0] = XEXP (x, 0);
13571debfc3dSmrg       op[1] = XEXP (x, 1);
13581debfc3dSmrg       break;
13591debfc3dSmrg     case SMAX:
13601debfc3dSmrg       fun = "smax";
13611debfc3dSmrg       op[0] = XEXP (x, 0);
13621debfc3dSmrg       op[1] = XEXP (x, 1);
13631debfc3dSmrg       break;
13641debfc3dSmrg     case UMIN:
13651debfc3dSmrg       fun = "umin";
13661debfc3dSmrg       op[0] = XEXP (x, 0);
13671debfc3dSmrg       op[1] = XEXP (x, 1);
13681debfc3dSmrg       break;
13691debfc3dSmrg     case UMAX:
13701debfc3dSmrg       fun = "umax";
13711debfc3dSmrg       op[0] = XEXP (x, 0);
13721debfc3dSmrg       op[1] = XEXP (x, 1);
13731debfc3dSmrg       break;
13741debfc3dSmrg     case NOT:
1375a2dc1f3fSmrg       st[0] = "~";
13761debfc3dSmrg       op[0] = XEXP (x, 0);
13771debfc3dSmrg       break;
13781debfc3dSmrg     case AND:
13791debfc3dSmrg       op[0] = XEXP (x, 0);
13801debfc3dSmrg       st[1] = "&";
13811debfc3dSmrg       op[1] = XEXP (x, 1);
13821debfc3dSmrg       break;
13831debfc3dSmrg     case IOR:
13841debfc3dSmrg       op[0] = XEXP (x, 0);
13851debfc3dSmrg       st[1] = "|";
13861debfc3dSmrg       op[1] = XEXP (x, 1);
13871debfc3dSmrg       break;
13881debfc3dSmrg     case XOR:
13891debfc3dSmrg       op[0] = XEXP (x, 0);
13901debfc3dSmrg       st[1] = "^";
13911debfc3dSmrg       op[1] = XEXP (x, 1);
13921debfc3dSmrg       break;
13931debfc3dSmrg     case ASHIFT:
13941debfc3dSmrg       op[0] = XEXP (x, 0);
13951debfc3dSmrg       st[1] = "<<";
13961debfc3dSmrg       op[1] = XEXP (x, 1);
13971debfc3dSmrg       break;
13981debfc3dSmrg     case LSHIFTRT:
13991debfc3dSmrg       op[0] = XEXP (x, 0);
14001debfc3dSmrg       st[1] = " 0>>";
14011debfc3dSmrg       op[1] = XEXP (x, 1);
14021debfc3dSmrg       break;
14031debfc3dSmrg     case ASHIFTRT:
14041debfc3dSmrg       op[0] = XEXP (x, 0);
14051debfc3dSmrg       st[1] = ">>";
14061debfc3dSmrg       op[1] = XEXP (x, 1);
14071debfc3dSmrg       break;
14081debfc3dSmrg     case ROTATE:
14091debfc3dSmrg       op[0] = XEXP (x, 0);
14101debfc3dSmrg       st[1] = "<-<";
14111debfc3dSmrg       op[1] = XEXP (x, 1);
14121debfc3dSmrg       break;
14131debfc3dSmrg     case ROTATERT:
14141debfc3dSmrg       op[0] = XEXP (x, 0);
14151debfc3dSmrg       st[1] = ">->";
14161debfc3dSmrg       op[1] = XEXP (x, 1);
14171debfc3dSmrg       break;
14181debfc3dSmrg     case NE:
14191debfc3dSmrg       op[0] = XEXP (x, 0);
14201debfc3dSmrg       st[1] = "!=";
14211debfc3dSmrg       op[1] = XEXP (x, 1);
14221debfc3dSmrg       break;
14231debfc3dSmrg     case EQ:
14241debfc3dSmrg       op[0] = XEXP (x, 0);
14251debfc3dSmrg       st[1] = "==";
14261debfc3dSmrg       op[1] = XEXP (x, 1);
14271debfc3dSmrg       break;
14281debfc3dSmrg     case GE:
14291debfc3dSmrg       op[0] = XEXP (x, 0);
14301debfc3dSmrg       st[1] = ">=";
14311debfc3dSmrg       op[1] = XEXP (x, 1);
14321debfc3dSmrg       break;
14331debfc3dSmrg     case GT:
14341debfc3dSmrg       op[0] = XEXP (x, 0);
14351debfc3dSmrg       st[1] = ">";
14361debfc3dSmrg       op[1] = XEXP (x, 1);
14371debfc3dSmrg       break;
14381debfc3dSmrg     case LE:
14391debfc3dSmrg       op[0] = XEXP (x, 0);
14401debfc3dSmrg       st[1] = "<=";
14411debfc3dSmrg       op[1] = XEXP (x, 1);
14421debfc3dSmrg       break;
14431debfc3dSmrg     case LT:
14441debfc3dSmrg       op[0] = XEXP (x, 0);
14451debfc3dSmrg       st[1] = "<";
14461debfc3dSmrg       op[1] = XEXP (x, 1);
14471debfc3dSmrg       break;
14481debfc3dSmrg     case SIGN_EXTRACT:
14491debfc3dSmrg       fun = (verbose) ? "sign_extract" : "sxt";
14501debfc3dSmrg       op[0] = XEXP (x, 0);
14511debfc3dSmrg       op[1] = XEXP (x, 1);
14521debfc3dSmrg       op[2] = XEXP (x, 2);
14531debfc3dSmrg       break;
14541debfc3dSmrg     case ZERO_EXTRACT:
14551debfc3dSmrg       fun = (verbose) ? "zero_extract" : "zxt";
14561debfc3dSmrg       op[0] = XEXP (x, 0);
14571debfc3dSmrg       op[1] = XEXP (x, 1);
14581debfc3dSmrg       op[2] = XEXP (x, 2);
14591debfc3dSmrg       break;
14601debfc3dSmrg     case SIGN_EXTEND:
14611debfc3dSmrg       fun = (verbose) ? "sign_extend" : "sxn";
14621debfc3dSmrg       op[0] = XEXP (x, 0);
14631debfc3dSmrg       break;
14641debfc3dSmrg     case ZERO_EXTEND:
14651debfc3dSmrg       fun = (verbose) ? "zero_extend" : "zxn";
14661debfc3dSmrg       op[0] = XEXP (x, 0);
14671debfc3dSmrg       break;
14681debfc3dSmrg     case FLOAT_EXTEND:
14691debfc3dSmrg       fun = (verbose) ? "float_extend" : "fxn";
14701debfc3dSmrg       op[0] = XEXP (x, 0);
14711debfc3dSmrg       break;
14721debfc3dSmrg     case TRUNCATE:
14731debfc3dSmrg       fun = (verbose) ? "trunc" : "trn";
14741debfc3dSmrg       op[0] = XEXP (x, 0);
14751debfc3dSmrg       break;
14761debfc3dSmrg     case FLOAT_TRUNCATE:
14771debfc3dSmrg       fun = (verbose) ? "float_trunc" : "ftr";
14781debfc3dSmrg       op[0] = XEXP (x, 0);
14791debfc3dSmrg       break;
14801debfc3dSmrg     case FLOAT:
14811debfc3dSmrg       fun = (verbose) ? "float" : "flt";
14821debfc3dSmrg       op[0] = XEXP (x, 0);
14831debfc3dSmrg       break;
14841debfc3dSmrg     case UNSIGNED_FLOAT:
14851debfc3dSmrg       fun = (verbose) ? "uns_float" : "ufl";
14861debfc3dSmrg       op[0] = XEXP (x, 0);
14871debfc3dSmrg       break;
14881debfc3dSmrg     case FIX:
14891debfc3dSmrg       fun = "fix";
14901debfc3dSmrg       op[0] = XEXP (x, 0);
14911debfc3dSmrg       break;
14921debfc3dSmrg     case UNSIGNED_FIX:
14931debfc3dSmrg       fun = (verbose) ? "uns_fix" : "ufx";
14941debfc3dSmrg       op[0] = XEXP (x, 0);
14951debfc3dSmrg       break;
14961debfc3dSmrg     case PRE_DEC:
14971debfc3dSmrg       st[0] = "--";
14981debfc3dSmrg       op[0] = XEXP (x, 0);
14991debfc3dSmrg       break;
15001debfc3dSmrg     case PRE_INC:
15011debfc3dSmrg       st[0] = "++";
15021debfc3dSmrg       op[0] = XEXP (x, 0);
15031debfc3dSmrg       break;
15041debfc3dSmrg     case POST_DEC:
15051debfc3dSmrg       op[0] = XEXP (x, 0);
15061debfc3dSmrg       st[1] = "--";
15071debfc3dSmrg       break;
15081debfc3dSmrg     case POST_INC:
15091debfc3dSmrg       op[0] = XEXP (x, 0);
15101debfc3dSmrg       st[1] = "++";
15111debfc3dSmrg       break;
15121debfc3dSmrg     case PRE_MODIFY:
15131debfc3dSmrg       st[0] = "pre ";
15141debfc3dSmrg       op[0] = XEXP (XEXP (x, 1), 0);
15151debfc3dSmrg       st[1] = "+=";
15161debfc3dSmrg       op[1] = XEXP (XEXP (x, 1), 1);
15171debfc3dSmrg       break;
15181debfc3dSmrg     case POST_MODIFY:
15191debfc3dSmrg       st[0] = "post ";
15201debfc3dSmrg       op[0] = XEXP (XEXP (x, 1), 0);
15211debfc3dSmrg       st[1] = "+=";
15221debfc3dSmrg       op[1] = XEXP (XEXP (x, 1), 1);
15231debfc3dSmrg       break;
15241debfc3dSmrg     case CALL:
15251debfc3dSmrg       st[0] = "call ";
15261debfc3dSmrg       op[0] = XEXP (x, 0);
15271debfc3dSmrg       if (verbose)
15281debfc3dSmrg 	{
15291debfc3dSmrg 	  st[1] = " argc:";
15301debfc3dSmrg 	  op[1] = XEXP (x, 1);
15311debfc3dSmrg 	}
15321debfc3dSmrg       break;
15331debfc3dSmrg     case IF_THEN_ELSE:
15341debfc3dSmrg       st[0] = "{(";
15351debfc3dSmrg       op[0] = XEXP (x, 0);
15361debfc3dSmrg       st[1] = ")?";
15371debfc3dSmrg       op[1] = XEXP (x, 1);
15381debfc3dSmrg       st[2] = ":";
15391debfc3dSmrg       op[2] = XEXP (x, 2);
15401debfc3dSmrg       st[3] = "}";
15411debfc3dSmrg       break;
15421debfc3dSmrg     case TRAP_IF:
15431debfc3dSmrg       fun = "trap_if";
15441debfc3dSmrg       op[0] = TRAP_CONDITION (x);
15451debfc3dSmrg       break;
15461debfc3dSmrg     case PREFETCH:
15471debfc3dSmrg       fun = "prefetch";
15481debfc3dSmrg       op[0] = XEXP (x, 0);
15491debfc3dSmrg       op[1] = XEXP (x, 1);
15501debfc3dSmrg       op[2] = XEXP (x, 2);
15511debfc3dSmrg       break;
15521debfc3dSmrg     case UNSPEC:
15531debfc3dSmrg     case UNSPEC_VOLATILE:
15541debfc3dSmrg       {
15551debfc3dSmrg 	pp_string (pp, "unspec");
15561debfc3dSmrg 	if (GET_CODE (x) == UNSPEC_VOLATILE)
15571debfc3dSmrg 	  pp_string (pp, "/v");
15581debfc3dSmrg 	pp_left_bracket (pp);
15591debfc3dSmrg 	for (i = 0; i < XVECLEN (x, 0); i++)
15601debfc3dSmrg 	  {
15611debfc3dSmrg 	    if (i != 0)
15621debfc3dSmrg 	      pp_comma (pp);
15631debfc3dSmrg 	    print_pattern (pp, XVECEXP (x, 0, i), verbose);
15641debfc3dSmrg 	  }
15651debfc3dSmrg 	pp_string (pp, "] ");
15661debfc3dSmrg 	pp_decimal_int (pp, XINT (x, 1));
15671debfc3dSmrg       }
15681debfc3dSmrg       break;
15691debfc3dSmrg     default:
15701debfc3dSmrg       {
15711debfc3dSmrg 	/* Most unhandled codes can be printed as pseudo-functions.  */
15721debfc3dSmrg         if (GET_RTX_CLASS (GET_CODE (x)) == RTX_UNARY)
15731debfc3dSmrg 	  {
15741debfc3dSmrg 	    fun = GET_RTX_NAME (GET_CODE (x));
15751debfc3dSmrg 	    op[0] = XEXP (x, 0);
15761debfc3dSmrg 	  }
15771debfc3dSmrg         else if (GET_RTX_CLASS (GET_CODE (x)) == RTX_COMPARE
15781debfc3dSmrg 		 || GET_RTX_CLASS (GET_CODE (x)) == RTX_COMM_COMPARE
15791debfc3dSmrg 		 || GET_RTX_CLASS (GET_CODE (x)) == RTX_BIN_ARITH
15801debfc3dSmrg 		 || GET_RTX_CLASS (GET_CODE (x)) == RTX_COMM_ARITH)
15811debfc3dSmrg 	  {
15821debfc3dSmrg 	    fun = GET_RTX_NAME (GET_CODE (x));
15831debfc3dSmrg 	    op[0] = XEXP (x, 0);
15841debfc3dSmrg 	    op[1] = XEXP (x, 1);
15851debfc3dSmrg 	  }
15861debfc3dSmrg         else if (GET_RTX_CLASS (GET_CODE (x)) == RTX_TERNARY)
15871debfc3dSmrg 	  {
15881debfc3dSmrg 	    fun = GET_RTX_NAME (GET_CODE (x));
15891debfc3dSmrg 	    op[0] = XEXP (x, 0);
15901debfc3dSmrg 	    op[1] = XEXP (x, 1);
15911debfc3dSmrg 	    op[2] = XEXP (x, 2);
15921debfc3dSmrg 	  }
15931debfc3dSmrg 	else
15941debfc3dSmrg 	  /* Give up, just print the RTX name.  */
15951debfc3dSmrg 	  st[0] = GET_RTX_NAME (GET_CODE (x));
15961debfc3dSmrg       }
15971debfc3dSmrg       break;
15981debfc3dSmrg     }
15991debfc3dSmrg 
16001debfc3dSmrg   /* Print this as a function?  */
16011debfc3dSmrg   if (fun)
16021debfc3dSmrg     {
16031debfc3dSmrg       pp_string (pp, fun);
16041debfc3dSmrg       pp_left_paren (pp);
16051debfc3dSmrg     }
16061debfc3dSmrg 
16071debfc3dSmrg   for (i = 0; i < 4; i++)
16081debfc3dSmrg     {
16091debfc3dSmrg       if (st[i])
16101debfc3dSmrg         pp_string (pp, st[i]);
16111debfc3dSmrg 
16121debfc3dSmrg       if (op[i])
16131debfc3dSmrg 	{
16141debfc3dSmrg 	  if (fun && i != 0)
16151debfc3dSmrg 	    pp_comma (pp);
16161debfc3dSmrg 	  print_value (pp, op[i], verbose);
16171debfc3dSmrg 	}
16181debfc3dSmrg     }
16191debfc3dSmrg 
16201debfc3dSmrg   if (fun)
16211debfc3dSmrg     pp_right_paren (pp);
16221debfc3dSmrg }		/* print_exp */
16231debfc3dSmrg 
16241debfc3dSmrg /* Prints rtxes, I customarily classified as values.  They're constants,
16251debfc3dSmrg    registers, labels, symbols and memory accesses.  */
16261debfc3dSmrg 
16271debfc3dSmrg void
print_value(pretty_printer * pp,const_rtx x,int verbose)16281debfc3dSmrg print_value (pretty_printer *pp, const_rtx x, int verbose)
16291debfc3dSmrg {
16301debfc3dSmrg   char tmp[1024];
16311debfc3dSmrg 
16321debfc3dSmrg   if (!x)
16331debfc3dSmrg     {
16341debfc3dSmrg       pp_string (pp, "(nil)");
16351debfc3dSmrg       return;
16361debfc3dSmrg     }
16371debfc3dSmrg   switch (GET_CODE (x))
16381debfc3dSmrg     {
16391debfc3dSmrg     case CONST_INT:
16401debfc3dSmrg       pp_scalar (pp, HOST_WIDE_INT_PRINT_HEX,
16411debfc3dSmrg 		 (unsigned HOST_WIDE_INT) INTVAL (x));
16421debfc3dSmrg       break;
16431debfc3dSmrg 
16441debfc3dSmrg     case CONST_WIDE_INT:
16451debfc3dSmrg       {
16461debfc3dSmrg 	const char *sep = "<";
16471debfc3dSmrg 	int i;
16481debfc3dSmrg 	for (i = CONST_WIDE_INT_NUNITS (x) - 1; i >= 0; i--)
16491debfc3dSmrg 	  {
16501debfc3dSmrg 	    pp_string (pp, sep);
16511debfc3dSmrg 	    sep = ",";
16521debfc3dSmrg 	    sprintf (tmp, HOST_WIDE_INT_PRINT_HEX,
16531debfc3dSmrg 		     (unsigned HOST_WIDE_INT) CONST_WIDE_INT_ELT (x, i));
16541debfc3dSmrg 	    pp_string (pp, tmp);
16551debfc3dSmrg 	  }
16561debfc3dSmrg         pp_greater (pp);
16571debfc3dSmrg       }
16581debfc3dSmrg       break;
16591debfc3dSmrg 
1660a2dc1f3fSmrg     case CONST_POLY_INT:
1661a2dc1f3fSmrg       pp_left_bracket (pp);
1662a2dc1f3fSmrg       pp_wide_int (pp, CONST_POLY_INT_COEFFS (x)[0], SIGNED);
1663a2dc1f3fSmrg       for (unsigned int i = 1; i < NUM_POLY_INT_COEFFS; ++i)
1664a2dc1f3fSmrg 	{
1665a2dc1f3fSmrg 	  pp_string (pp, ", ");
1666a2dc1f3fSmrg 	  pp_wide_int (pp, CONST_POLY_INT_COEFFS (x)[i], SIGNED);
1667a2dc1f3fSmrg 	}
1668a2dc1f3fSmrg       pp_right_bracket (pp);
1669a2dc1f3fSmrg       break;
1670a2dc1f3fSmrg 
16711debfc3dSmrg     case CONST_DOUBLE:
16721debfc3dSmrg       if (FLOAT_MODE_P (GET_MODE (x)))
16731debfc3dSmrg 	{
16741debfc3dSmrg 	  real_to_decimal (tmp, CONST_DOUBLE_REAL_VALUE (x),
16751debfc3dSmrg 			   sizeof (tmp), 0, 1);
16761debfc3dSmrg 	  pp_string (pp, tmp);
16771debfc3dSmrg 	}
16781debfc3dSmrg       else
16791debfc3dSmrg 	pp_printf (pp, "<%wx,%wx>",
16801debfc3dSmrg 		   (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (x),
16811debfc3dSmrg 		   (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (x));
16821debfc3dSmrg       break;
16831debfc3dSmrg     case CONST_FIXED:
16841debfc3dSmrg       fixed_to_decimal (tmp, CONST_FIXED_VALUE (x), sizeof (tmp));
16851debfc3dSmrg       pp_string (pp, tmp);
16861debfc3dSmrg       break;
16871debfc3dSmrg     case CONST_STRING:
1688*8feb0f0bSmrg       pp_string (pp, "\"");
1689*8feb0f0bSmrg       pretty_print_string (pp, XSTR (x, 0), strlen (XSTR (x, 0)));
1690*8feb0f0bSmrg       pp_string (pp, "\"");
16911debfc3dSmrg       break;
16921debfc3dSmrg     case SYMBOL_REF:
16931debfc3dSmrg       pp_printf (pp, "`%s'", XSTR (x, 0));
16941debfc3dSmrg       break;
16951debfc3dSmrg     case LABEL_REF:
16961debfc3dSmrg       pp_printf (pp, "L%d", INSN_UID (label_ref_label (x)));
16971debfc3dSmrg       break;
16981debfc3dSmrg     case CONST:
16991debfc3dSmrg     case HIGH:
17001debfc3dSmrg     case STRICT_LOW_PART:
17011debfc3dSmrg       pp_printf (pp, "%s(", GET_RTX_NAME (GET_CODE (x)));
17021debfc3dSmrg       print_value (pp, XEXP (x, 0), verbose);
17031debfc3dSmrg       pp_right_paren (pp);
17041debfc3dSmrg       break;
17051debfc3dSmrg     case REG:
17061debfc3dSmrg       if (REGNO (x) < FIRST_PSEUDO_REGISTER)
17071debfc3dSmrg 	{
17081debfc3dSmrg 	  if (ISDIGIT (reg_names[REGNO (x)][0]))
17091debfc3dSmrg 	    pp_modulo (pp);
17101debfc3dSmrg 	  pp_string (pp, reg_names[REGNO (x)]);
17111debfc3dSmrg 	}
17121debfc3dSmrg       else
17131debfc3dSmrg 	pp_printf (pp, "r%d", REGNO (x));
17141debfc3dSmrg       if (verbose)
17151debfc3dSmrg 	pp_printf (pp, ":%s", GET_MODE_NAME (GET_MODE (x)));
17161debfc3dSmrg       break;
17171debfc3dSmrg     case SUBREG:
17181debfc3dSmrg       print_value (pp, SUBREG_REG (x), verbose);
1719a2dc1f3fSmrg       pp_printf (pp, "#");
1720a2dc1f3fSmrg       pp_wide_integer (pp, SUBREG_BYTE (x));
17211debfc3dSmrg       break;
17221debfc3dSmrg     case SCRATCH:
17231debfc3dSmrg     case CC0:
17241debfc3dSmrg     case PC:
17251debfc3dSmrg       pp_string (pp, GET_RTX_NAME (GET_CODE (x)));
17261debfc3dSmrg       break;
17271debfc3dSmrg     case MEM:
17281debfc3dSmrg       pp_left_bracket (pp);
17291debfc3dSmrg       print_value (pp, XEXP (x, 0), verbose);
17301debfc3dSmrg       pp_right_bracket (pp);
17311debfc3dSmrg       break;
17321debfc3dSmrg     case DEBUG_EXPR:
17331debfc3dSmrg       pp_printf (pp, "D#%i", DEBUG_TEMP_UID (DEBUG_EXPR_TREE_DECL (x)));
17341debfc3dSmrg       break;
17351debfc3dSmrg     default:
17361debfc3dSmrg       print_exp (pp, x, verbose);
17371debfc3dSmrg       break;
17381debfc3dSmrg     }
17391debfc3dSmrg }				/* print_value */
17401debfc3dSmrg 
17411debfc3dSmrg /* The next step in insn detalization, its pattern recognition.  */
17421debfc3dSmrg 
17431debfc3dSmrg void
print_pattern(pretty_printer * pp,const_rtx x,int verbose)17441debfc3dSmrg print_pattern (pretty_printer *pp, const_rtx x, int verbose)
17451debfc3dSmrg {
17461debfc3dSmrg   if (! x)
17471debfc3dSmrg     {
17481debfc3dSmrg       pp_string (pp, "(nil)");
17491debfc3dSmrg       return;
17501debfc3dSmrg     }
17511debfc3dSmrg 
17521debfc3dSmrg   switch (GET_CODE (x))
17531debfc3dSmrg     {
17541debfc3dSmrg     case SET:
17551debfc3dSmrg       print_value (pp, SET_DEST (x), verbose);
17561debfc3dSmrg       pp_equal (pp);
17571debfc3dSmrg       print_value (pp, SET_SRC (x), verbose);
17581debfc3dSmrg       break;
17591debfc3dSmrg     case RETURN:
17601debfc3dSmrg     case SIMPLE_RETURN:
17611debfc3dSmrg     case EH_RETURN:
17621debfc3dSmrg       pp_string (pp, GET_RTX_NAME (GET_CODE (x)));
17631debfc3dSmrg       break;
17641debfc3dSmrg     case CALL:
17651debfc3dSmrg       print_exp (pp, x, verbose);
17661debfc3dSmrg       break;
17671debfc3dSmrg     case CLOBBER:
17681debfc3dSmrg     case USE:
17691debfc3dSmrg       pp_printf (pp, "%s ", GET_RTX_NAME (GET_CODE (x)));
17701debfc3dSmrg       print_value (pp, XEXP (x, 0), verbose);
17711debfc3dSmrg       break;
17721debfc3dSmrg     case VAR_LOCATION:
17731debfc3dSmrg       pp_string (pp, "loc ");
17741debfc3dSmrg       print_value (pp, PAT_VAR_LOCATION_LOC (x), verbose);
17751debfc3dSmrg       break;
17761debfc3dSmrg     case COND_EXEC:
17771debfc3dSmrg       pp_left_paren (pp);
17781debfc3dSmrg       if (GET_CODE (COND_EXEC_TEST (x)) == NE
17791debfc3dSmrg 	  && XEXP (COND_EXEC_TEST (x), 1) == const0_rtx)
17801debfc3dSmrg 	print_value (pp, XEXP (COND_EXEC_TEST (x), 0), verbose);
17811debfc3dSmrg       else if (GET_CODE (COND_EXEC_TEST (x)) == EQ
17821debfc3dSmrg 	       && XEXP (COND_EXEC_TEST (x), 1) == const0_rtx)
17831debfc3dSmrg 	{
17841debfc3dSmrg 	  pp_exclamation (pp);
17851debfc3dSmrg 	  print_value (pp, XEXP (COND_EXEC_TEST (x), 0), verbose);
17861debfc3dSmrg 	}
17871debfc3dSmrg       else
17881debfc3dSmrg 	print_value (pp, COND_EXEC_TEST (x), verbose);
17891debfc3dSmrg       pp_string (pp, ") ");
17901debfc3dSmrg       print_pattern (pp, COND_EXEC_CODE (x), verbose);
17911debfc3dSmrg       break;
17921debfc3dSmrg     case PARALLEL:
17931debfc3dSmrg       {
17941debfc3dSmrg 	int i;
17951debfc3dSmrg 
17961debfc3dSmrg 	pp_left_brace (pp);
17971debfc3dSmrg 	for (i = 0; i < XVECLEN (x, 0); i++)
17981debfc3dSmrg 	  {
17991debfc3dSmrg 	    print_pattern (pp, XVECEXP (x, 0, i), verbose);
18001debfc3dSmrg 	    pp_semicolon (pp);
18011debfc3dSmrg 	  }
18021debfc3dSmrg 	pp_right_brace (pp);
18031debfc3dSmrg       }
18041debfc3dSmrg       break;
18051debfc3dSmrg     case SEQUENCE:
18061debfc3dSmrg       {
18071debfc3dSmrg 	const rtx_sequence *seq = as_a <const rtx_sequence *> (x);
18081debfc3dSmrg 	pp_string (pp, "sequence{");
18091debfc3dSmrg 	if (INSN_P (seq->element (0)))
18101debfc3dSmrg 	  {
18111debfc3dSmrg 	    /* Print the sequence insns indented.  */
18121debfc3dSmrg 	    const char * save_print_rtx_head = print_rtx_head;
18131debfc3dSmrg 	    char indented_print_rtx_head[32];
18141debfc3dSmrg 
18151debfc3dSmrg 	    pp_newline (pp);
18161debfc3dSmrg 	    gcc_assert (strlen (print_rtx_head) < sizeof (indented_print_rtx_head) - 4);
18171debfc3dSmrg 	    snprintf (indented_print_rtx_head,
18181debfc3dSmrg 		      sizeof (indented_print_rtx_head),
18191debfc3dSmrg 		      "%s    ", print_rtx_head);
18201debfc3dSmrg 	    print_rtx_head = indented_print_rtx_head;
18211debfc3dSmrg 	    for (int i = 0; i < seq->len (); i++)
18221debfc3dSmrg 	      print_insn_with_notes (pp, seq->insn (i));
18231debfc3dSmrg 	    pp_printf (pp, "%s      ", save_print_rtx_head);
18241debfc3dSmrg 	    print_rtx_head = save_print_rtx_head;
18251debfc3dSmrg 	  }
18261debfc3dSmrg 	else
18271debfc3dSmrg 	  {
18281debfc3dSmrg 	    for (int i = 0; i < seq->len (); i++)
18291debfc3dSmrg 	      {
18301debfc3dSmrg 		print_pattern (pp, seq->element (i), verbose);
18311debfc3dSmrg 		pp_semicolon (pp);
18321debfc3dSmrg 	      }
18331debfc3dSmrg 	  }
18341debfc3dSmrg 	pp_right_brace (pp);
18351debfc3dSmrg       }
18361debfc3dSmrg       break;
18371debfc3dSmrg     case ASM_INPUT:
18381debfc3dSmrg       pp_printf (pp, "asm {%s}", XSTR (x, 0));
18391debfc3dSmrg       break;
18401debfc3dSmrg     case ADDR_VEC:
18411debfc3dSmrg       for (int i = 0; i < XVECLEN (x, 0); i++)
18421debfc3dSmrg 	{
18431debfc3dSmrg 	  print_value (pp, XVECEXP (x, 0, i), verbose);
18441debfc3dSmrg 	  pp_semicolon (pp);
18451debfc3dSmrg 	}
18461debfc3dSmrg       break;
18471debfc3dSmrg     case ADDR_DIFF_VEC:
18481debfc3dSmrg       for (int i = 0; i < XVECLEN (x, 1); i++)
18491debfc3dSmrg 	{
18501debfc3dSmrg 	  print_value (pp, XVECEXP (x, 1, i), verbose);
18511debfc3dSmrg 	  pp_semicolon (pp);
18521debfc3dSmrg 	}
18531debfc3dSmrg       break;
18541debfc3dSmrg     case TRAP_IF:
18551debfc3dSmrg       pp_string (pp, "trap_if ");
18561debfc3dSmrg       print_value (pp, TRAP_CONDITION (x), verbose);
18571debfc3dSmrg       break;
18581debfc3dSmrg     case UNSPEC:
18591debfc3dSmrg     case UNSPEC_VOLATILE:
18601debfc3dSmrg       /* Fallthru -- leave UNSPECs to print_exp.  */
18611debfc3dSmrg     default:
18621debfc3dSmrg       print_value (pp, x, verbose);
18631debfc3dSmrg     }
18641debfc3dSmrg }				/* print_pattern */
18651debfc3dSmrg 
18661debfc3dSmrg /* This is the main function in slim rtl visualization mechanism.
18671debfc3dSmrg 
18681debfc3dSmrg    X is an insn, to be printed into PP.
18691debfc3dSmrg 
18701debfc3dSmrg    This function tries to print it properly in human-readable form,
18711debfc3dSmrg    resembling assembler mnemonics (instead of the older Lisp-style
18721debfc3dSmrg    form).
18731debfc3dSmrg 
18741debfc3dSmrg    If VERBOSE is TRUE, insns are printed with more complete (but
18751debfc3dSmrg    longer) pattern names and with extra information, and prefixed
18761debfc3dSmrg    with their INSN_UIDs.  */
18771debfc3dSmrg 
18781debfc3dSmrg void
print_insn(pretty_printer * pp,const rtx_insn * x,int verbose)18791debfc3dSmrg print_insn (pretty_printer *pp, const rtx_insn *x, int verbose)
18801debfc3dSmrg {
18811debfc3dSmrg   if (verbose)
18821debfc3dSmrg     {
18831debfc3dSmrg       /* Blech, pretty-print can't print integers with a specified width.  */
18841debfc3dSmrg       char uid_prefix[32];
18851debfc3dSmrg       snprintf (uid_prefix, sizeof uid_prefix, " %4d: ", INSN_UID (x));
18861debfc3dSmrg       pp_string (pp, uid_prefix);
18871debfc3dSmrg     }
18881debfc3dSmrg 
18891debfc3dSmrg   switch (GET_CODE (x))
18901debfc3dSmrg     {
18911debfc3dSmrg     case INSN:
18921debfc3dSmrg       print_pattern (pp, PATTERN (x), verbose);
18931debfc3dSmrg       break;
18941debfc3dSmrg 
18951debfc3dSmrg     case DEBUG_INSN:
18961debfc3dSmrg       {
1897a2dc1f3fSmrg 	if (DEBUG_MARKER_INSN_P (x))
1898a2dc1f3fSmrg 	  {
1899a2dc1f3fSmrg 	    switch (INSN_DEBUG_MARKER_KIND (x))
1900a2dc1f3fSmrg 	      {
1901a2dc1f3fSmrg 	      case NOTE_INSN_BEGIN_STMT:
1902a2dc1f3fSmrg 		pp_string (pp, "debug begin stmt marker");
1903a2dc1f3fSmrg 		break;
1904a2dc1f3fSmrg 
1905a2dc1f3fSmrg 	      case NOTE_INSN_INLINE_ENTRY:
1906a2dc1f3fSmrg 		pp_string (pp, "debug inline entry marker");
1907a2dc1f3fSmrg 		break;
1908a2dc1f3fSmrg 
1909a2dc1f3fSmrg 	      default:
1910a2dc1f3fSmrg 		gcc_unreachable ();
1911a2dc1f3fSmrg 	      }
1912a2dc1f3fSmrg 	    break;
1913a2dc1f3fSmrg 	  }
1914a2dc1f3fSmrg 
19151debfc3dSmrg 	const char *name = "?";
19161debfc3dSmrg 	char idbuf[32];
19171debfc3dSmrg 
19181debfc3dSmrg 	if (DECL_P (INSN_VAR_LOCATION_DECL (x)))
19191debfc3dSmrg 	  {
19201debfc3dSmrg 	    tree id = DECL_NAME (INSN_VAR_LOCATION_DECL (x));
19211debfc3dSmrg 	    if (id)
19221debfc3dSmrg 	      name = IDENTIFIER_POINTER (id);
19231debfc3dSmrg 	    else if (TREE_CODE (INSN_VAR_LOCATION_DECL (x))
19241debfc3dSmrg 		     == DEBUG_EXPR_DECL)
19251debfc3dSmrg 	      {
19261debfc3dSmrg 		sprintf (idbuf, "D#%i",
19271debfc3dSmrg 			 DEBUG_TEMP_UID (INSN_VAR_LOCATION_DECL (x)));
19281debfc3dSmrg 		name = idbuf;
19291debfc3dSmrg 	      }
19301debfc3dSmrg 	    else
19311debfc3dSmrg 	      {
19321debfc3dSmrg 		sprintf (idbuf, "D.%i",
19331debfc3dSmrg 			 DECL_UID (INSN_VAR_LOCATION_DECL (x)));
19341debfc3dSmrg 		name = idbuf;
19351debfc3dSmrg 	      }
19361debfc3dSmrg 	  }
19371debfc3dSmrg 	pp_printf (pp, "debug %s => ", name);
19381debfc3dSmrg 	if (VAR_LOC_UNKNOWN_P (INSN_VAR_LOCATION_LOC (x)))
19391debfc3dSmrg 	  pp_string (pp, "optimized away");
19401debfc3dSmrg 	else
19411debfc3dSmrg 	  print_pattern (pp, INSN_VAR_LOCATION_LOC (x), verbose);
19421debfc3dSmrg       }
19431debfc3dSmrg       break;
19441debfc3dSmrg 
19451debfc3dSmrg     case JUMP_INSN:
19461debfc3dSmrg       print_pattern (pp, PATTERN (x), verbose);
19471debfc3dSmrg       break;
19481debfc3dSmrg     case CALL_INSN:
19491debfc3dSmrg       if (GET_CODE (PATTERN (x)) == PARALLEL)
19501debfc3dSmrg         print_pattern (pp, XVECEXP (PATTERN (x), 0, 0), verbose);
19511debfc3dSmrg       else
19521debfc3dSmrg 	print_pattern (pp, PATTERN (x), verbose);
19531debfc3dSmrg       break;
19541debfc3dSmrg     case CODE_LABEL:
19551debfc3dSmrg       pp_printf (pp, "L%d:", INSN_UID (x));
19561debfc3dSmrg       break;
19571debfc3dSmrg     case JUMP_TABLE_DATA:
19581debfc3dSmrg       pp_string (pp, "jump_table_data{\n");
19591debfc3dSmrg       print_pattern (pp, PATTERN (x), verbose);
19601debfc3dSmrg       pp_right_brace (pp);
19611debfc3dSmrg       break;
19621debfc3dSmrg     case BARRIER:
19631debfc3dSmrg       pp_string (pp, "barrier");
19641debfc3dSmrg       break;
19651debfc3dSmrg     case NOTE:
19661debfc3dSmrg       {
19671debfc3dSmrg 	pp_string (pp, GET_NOTE_INSN_NAME (NOTE_KIND (x)));
19681debfc3dSmrg 	switch (NOTE_KIND (x))
19691debfc3dSmrg 	  {
19701debfc3dSmrg 	  case NOTE_INSN_EH_REGION_BEG:
19711debfc3dSmrg 	  case NOTE_INSN_EH_REGION_END:
19721debfc3dSmrg 	    pp_printf (pp, " %d", NOTE_EH_HANDLER (x));
19731debfc3dSmrg 	    break;
19741debfc3dSmrg 
19751debfc3dSmrg 	  case NOTE_INSN_BLOCK_BEG:
19761debfc3dSmrg 	  case NOTE_INSN_BLOCK_END:
19771debfc3dSmrg 	    pp_printf (pp, " %d", BLOCK_NUMBER (NOTE_BLOCK (x)));
19781debfc3dSmrg 	    break;
19791debfc3dSmrg 
19801debfc3dSmrg 	  case NOTE_INSN_BASIC_BLOCK:
19811debfc3dSmrg 	    pp_printf (pp, " %d", NOTE_BASIC_BLOCK (x)->index);
19821debfc3dSmrg 	    break;
19831debfc3dSmrg 
19841debfc3dSmrg 	  case NOTE_INSN_DELETED_LABEL:
19851debfc3dSmrg 	  case NOTE_INSN_DELETED_DEBUG_LABEL:
19861debfc3dSmrg 	    {
19871debfc3dSmrg 	      const char *label = NOTE_DELETED_LABEL_NAME (x);
19881debfc3dSmrg 	      if (label == NULL)
19891debfc3dSmrg 		label = "";
19901debfc3dSmrg 	      pp_printf (pp, " (\"%s\")", label);
19911debfc3dSmrg 	    }
19921debfc3dSmrg 	    break;
19931debfc3dSmrg 
19941debfc3dSmrg 	  case NOTE_INSN_VAR_LOCATION:
19951debfc3dSmrg 	    pp_left_brace (pp);
19961debfc3dSmrg 	    print_pattern (pp, NOTE_VAR_LOCATION (x), verbose);
19971debfc3dSmrg 	    pp_right_brace (pp);
19981debfc3dSmrg 	    break;
19991debfc3dSmrg 
20001debfc3dSmrg 	  default:
20011debfc3dSmrg 	    break;
20021debfc3dSmrg 	  }
20031debfc3dSmrg 	break;
20041debfc3dSmrg       }
20051debfc3dSmrg     default:
20061debfc3dSmrg       gcc_unreachable ();
20071debfc3dSmrg     }
20081debfc3dSmrg }				/* print_insn */
20091debfc3dSmrg 
20101debfc3dSmrg /* Pretty-print a slim dump of X (an insn) to PP, including any register
20111debfc3dSmrg    note attached to the instruction.  */
20121debfc3dSmrg 
20131debfc3dSmrg static void
print_insn_with_notes(pretty_printer * pp,const rtx_insn * x)20141debfc3dSmrg print_insn_with_notes (pretty_printer *pp, const rtx_insn *x)
20151debfc3dSmrg {
20161debfc3dSmrg   pp_string (pp, print_rtx_head);
20171debfc3dSmrg   print_insn (pp, x, 1);
20181debfc3dSmrg   pp_newline (pp);
20191debfc3dSmrg   if (INSN_P (x) && REG_NOTES (x))
20201debfc3dSmrg     for (rtx note = REG_NOTES (x); note; note = XEXP (note, 1))
20211debfc3dSmrg       {
20221debfc3dSmrg 	pp_printf (pp, "%s      %s ", print_rtx_head,
20231debfc3dSmrg 		   GET_REG_NOTE_NAME (REG_NOTE_KIND (note)));
20241debfc3dSmrg 	if (GET_CODE (note) == INT_LIST)
20251debfc3dSmrg 	  pp_printf (pp, "%d", XINT (note, 0));
20261debfc3dSmrg 	else
20271debfc3dSmrg 	  print_pattern (pp, XEXP (note, 0), 1);
20281debfc3dSmrg 	pp_newline (pp);
20291debfc3dSmrg       }
20301debfc3dSmrg }
20311debfc3dSmrg 
20321debfc3dSmrg /* Print X, an RTL value node, to file F in slim format.  Include
20331debfc3dSmrg    additional information if VERBOSE is nonzero.
20341debfc3dSmrg 
20351debfc3dSmrg    Value nodes are constants, registers, labels, symbols and
20361debfc3dSmrg    memory.  */
20371debfc3dSmrg 
20381debfc3dSmrg void
dump_value_slim(FILE * f,const_rtx x,int verbose)20391debfc3dSmrg dump_value_slim (FILE *f, const_rtx x, int verbose)
20401debfc3dSmrg {
20411debfc3dSmrg   pretty_printer rtl_slim_pp;
20421debfc3dSmrg   rtl_slim_pp.buffer->stream = f;
20431debfc3dSmrg   print_value (&rtl_slim_pp, x, verbose);
20441debfc3dSmrg   pp_flush (&rtl_slim_pp);
20451debfc3dSmrg }
20461debfc3dSmrg 
20471debfc3dSmrg /* Emit a slim dump of X (an insn) to the file F, including any register
20481debfc3dSmrg    note attached to the instruction.  */
20491debfc3dSmrg void
dump_insn_slim(FILE * f,const rtx_insn * x)20501debfc3dSmrg dump_insn_slim (FILE *f, const rtx_insn *x)
20511debfc3dSmrg {
20521debfc3dSmrg   pretty_printer rtl_slim_pp;
20531debfc3dSmrg   rtl_slim_pp.buffer->stream = f;
20541debfc3dSmrg   print_insn_with_notes (&rtl_slim_pp, x);
20551debfc3dSmrg   pp_flush (&rtl_slim_pp);
20561debfc3dSmrg }
20571debfc3dSmrg 
20581debfc3dSmrg /* Same as above, but stop at LAST or when COUNT == 0.
20591debfc3dSmrg    If COUNT < 0 it will stop only at LAST or NULL rtx.  */
20601debfc3dSmrg 
20611debfc3dSmrg void
dump_rtl_slim(FILE * f,const rtx_insn * first,const rtx_insn * last,int count,int flags ATTRIBUTE_UNUSED)20621debfc3dSmrg dump_rtl_slim (FILE *f, const rtx_insn *first, const rtx_insn *last,
20631debfc3dSmrg 	       int count, int flags ATTRIBUTE_UNUSED)
20641debfc3dSmrg {
20651debfc3dSmrg   const rtx_insn *insn, *tail;
20661debfc3dSmrg   pretty_printer rtl_slim_pp;
20671debfc3dSmrg   rtl_slim_pp.buffer->stream = f;
20681debfc3dSmrg 
20691debfc3dSmrg   tail = last ? NEXT_INSN (last) : NULL;
20701debfc3dSmrg   for (insn = first;
20711debfc3dSmrg        (insn != NULL) && (insn != tail) && (count != 0);
20721debfc3dSmrg        insn = NEXT_INSN (insn))
20731debfc3dSmrg     {
20741debfc3dSmrg       print_insn_with_notes (&rtl_slim_pp, insn);
20751debfc3dSmrg       if (count > 0)
20761debfc3dSmrg         count--;
20771debfc3dSmrg     }
20781debfc3dSmrg 
20791debfc3dSmrg   pp_flush (&rtl_slim_pp);
20801debfc3dSmrg }
20811debfc3dSmrg 
20821debfc3dSmrg /* Dumps basic block BB to pretty-printer PP in slim form and without and
20831debfc3dSmrg    no indentation, for use as a label of a DOT graph record-node.  */
20841debfc3dSmrg 
20851debfc3dSmrg void
rtl_dump_bb_for_graph(pretty_printer * pp,basic_block bb)20861debfc3dSmrg rtl_dump_bb_for_graph (pretty_printer *pp, basic_block bb)
20871debfc3dSmrg {
20881debfc3dSmrg   rtx_insn *insn;
20891debfc3dSmrg   bool first = true;
20901debfc3dSmrg 
20911debfc3dSmrg   /* TODO: inter-bb stuff.  */
20921debfc3dSmrg   FOR_BB_INSNS (bb, insn)
20931debfc3dSmrg     {
20941debfc3dSmrg       if (! first)
20951debfc3dSmrg 	{
20961debfc3dSmrg 	  pp_bar (pp);
20971debfc3dSmrg 	  pp_write_text_to_stream (pp);
20981debfc3dSmrg 	}
20991debfc3dSmrg       first = false;
21001debfc3dSmrg       print_insn_with_notes (pp, insn);
21011debfc3dSmrg       pp_write_text_as_dot_label_to_stream (pp, /*for_record=*/true);
21021debfc3dSmrg     }
21031debfc3dSmrg }
21041debfc3dSmrg 
21051debfc3dSmrg /* Pretty-print pattern X of some insn in non-verbose mode.
21061debfc3dSmrg    Return a string pointer to the pretty-printer buffer.
21071debfc3dSmrg 
21081debfc3dSmrg    This function is only exported exists only to accommodate some older users
21091debfc3dSmrg    of the slim RTL pretty printers.  Please do not use it for new code.  */
21101debfc3dSmrg 
21111debfc3dSmrg const char *
str_pattern_slim(const_rtx x)21121debfc3dSmrg str_pattern_slim (const_rtx x)
21131debfc3dSmrg {
21141debfc3dSmrg   pretty_printer rtl_slim_pp;
21151debfc3dSmrg   print_pattern (&rtl_slim_pp, x, 0);
21161debfc3dSmrg   return ggc_strdup (pp_formatted_text (&rtl_slim_pp));
21171debfc3dSmrg }
21181debfc3dSmrg 
21191debfc3dSmrg /* Emit a slim dump of X (an insn) to stderr.  */
21201debfc3dSmrg extern void debug_insn_slim (const rtx_insn *);
21211debfc3dSmrg DEBUG_FUNCTION void
debug_insn_slim(const rtx_insn * x)21221debfc3dSmrg debug_insn_slim (const rtx_insn *x)
21231debfc3dSmrg {
21241debfc3dSmrg   dump_insn_slim (stderr, x);
21251debfc3dSmrg }
21261debfc3dSmrg 
21271debfc3dSmrg /* Same as above, but using dump_rtl_slim.  */
21281debfc3dSmrg extern void debug_rtl_slim (FILE *, const rtx_insn *, const rtx_insn *,
21291debfc3dSmrg 			    int, int);
21301debfc3dSmrg DEBUG_FUNCTION void
debug_rtl_slim(const rtx_insn * first,const rtx_insn * last,int count,int flags)21311debfc3dSmrg debug_rtl_slim (const rtx_insn *first, const rtx_insn *last, int count,
21321debfc3dSmrg 		int flags)
21331debfc3dSmrg {
21341debfc3dSmrg   dump_rtl_slim (stderr, first, last, count, flags);
21351debfc3dSmrg }
21361debfc3dSmrg 
21371debfc3dSmrg extern void debug_bb_slim (basic_block);
21381debfc3dSmrg DEBUG_FUNCTION void
debug_bb_slim(basic_block bb)21391debfc3dSmrg debug_bb_slim (basic_block bb)
21401debfc3dSmrg {
21411debfc3dSmrg   dump_bb (stderr, bb, 0, TDF_SLIM | TDF_BLOCKS);
21421debfc3dSmrg }
21431debfc3dSmrg 
21441debfc3dSmrg extern void debug_bb_n_slim (int);
21451debfc3dSmrg DEBUG_FUNCTION void
debug_bb_n_slim(int n)21461debfc3dSmrg debug_bb_n_slim (int n)
21471debfc3dSmrg {
21481debfc3dSmrg   basic_block bb = BASIC_BLOCK_FOR_FN (cfun, n);
21491debfc3dSmrg   debug_bb_slim (bb);
21501debfc3dSmrg }
21511debfc3dSmrg 
21521debfc3dSmrg #endif
2153*8feb0f0bSmrg 
2154*8feb0f0bSmrg #if __GNUC__ >= 10
2155*8feb0f0bSmrg #  pragma GCC diagnostic pop
2156*8feb0f0bSmrg #endif
2157