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