summaryrefslogtreecommitdiff
path: root/gcc/print-rtl.c
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2016-10-13 13:17:59 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2016-10-13 13:17:59 +0000
commit7810c4ebfc4ecaf5efd532d05af6a3ed75b1e6dc (patch)
treede1bdc49e4b5ea7c8cb945574137a3e85c85f946 /gcc/print-rtl.c
parent950e6f418ae2c2a110bc72520deba87289def55e (diff)
Add a "compact" mode to print_rtx_function
gcc/ChangeLog: * function-tests.c (selftest::test_expansion_to_rtl): Add "true" for new "compact" param of print_rtx_function. Check for "cinsn" rather than "insn". * print-rtl-function.c (flag_compact): New decl. (print_rtx_function): Add param "compact" and use it to set flag_compact, adding a description of the effect to the leading comment, and updating the example output. * print-rtl.c (flag_compact): New variable. (print_rtx_operand_code_0): Omit the JUMP_LABEL reference in compact mode. (print_rtx_operand_code_i): When printing source locations, wrap xloc.file in quotes. Don't print INSN_CODEs in compact mode. (print_rtx_operand_code_r): Don't print regnos for hard regs and virtuals in compact mode. (print_rtx_operand_code_u): Don't print insn UIDs in compact mode, apart from in LABEL_REFs. (print_rtx_operand): In case 'w', don't print in hex in compact mode. Don't print basic block ids in compact mode. (print_rtx): In compact mode, prefix the code of insns with "c", only print the INSN_UID of CODE_LABELs, and omit their LABEL_NUSES. * print-rtl.h (print_rtx_function): Add "compact" param. gcc/testsuite/ChangeLog: * gcc.target/i386/vararg-loc.c: Update for quoting of xloc.file in INSN_LOCATION. From-SVN: r241120
Diffstat (limited to 'gcc/print-rtl.c')
-rw-r--r--gcc/print-rtl.c73
1 files changed, 57 insertions, 16 deletions
diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c
index 29e8ee2e180..f114cb4055d 100644
--- a/gcc/print-rtl.c
+++ b/gcc/print-rtl.c
@@ -60,6 +60,13 @@ static int indent;
static bool in_call_function_usage;
+/* If true, use compact dump format:
+ - INSN_UIDs are omitted, except for jumps and CODE_LABELs,
+ - INSN_CODEs are omitted,
+ - register numbers are omitted for hard and virtual regs
+ - insn names are prefixed with "c" (e.g. "cinsn", "cnote", etc). */
+bool flag_compact;
+
static void print_rtx (const_rtx);
/* String printed at beginning of each RTL when it is dumped.
@@ -176,7 +183,8 @@ print_rtx_operand_code_0 (const_rtx in_rtx ATTRIBUTE_UNUSED,
break;
}
}
- else if (idx == 7 && JUMP_P (in_rtx) && JUMP_LABEL (in_rtx) != NULL)
+ else if (idx == 7 && JUMP_P (in_rtx) && JUMP_LABEL (in_rtx) != NULL
+ && !flag_compact)
{
/* Output the JUMP_LABEL reference. */
fprintf (outfile, "\n%s%*s -> ", print_rtx_head, indent * 2, "");
@@ -284,7 +292,7 @@ print_rtx_operand_code_i (const_rtx in_rtx, int idx)
if (INSN_HAS_LOCATION (in_insn))
{
expanded_location xloc = insn_location (in_insn);
- fprintf (outfile, " %s:%i", xloc.file, xloc.line);
+ fprintf (outfile, " \"%s\":%i", xloc.file, xloc.line);
}
#endif
}
@@ -335,6 +343,13 @@ print_rtx_operand_code_i (const_rtx in_rtx, int idx)
const char *name;
int is_insn = INSN_P (in_rtx);
+ /* Don't print INSN_CODEs in compact mode. */
+ if (flag_compact && is_insn && &INSN_CODE (in_rtx) == &XINT (in_rtx, idx))
+ {
+ sawclose = 0;
+ return;
+ }
+
if (flag_dump_unnumbered
&& (is_insn || NOTE_P (in_rtx)))
fputc ('#', outfile);
@@ -358,26 +373,28 @@ print_rtx_operand_code_r (const_rtx in_rtx)
unsigned int regno = REGNO (in_rtx);
#ifndef GENERATOR_FILE
+ /* For hard registers and virtuals, always print the
+ regno, except in compact mode. */
+ if (regno <= LAST_VIRTUAL_REGISTER && !flag_compact)
+ fprintf (outfile, " %d", regno);
if (regno < FIRST_PSEUDO_REGISTER)
- fprintf (outfile, " %d %s", regno, reg_names[regno]);
+ fprintf (outfile, " %s", reg_names[regno]);
else if (regno <= LAST_VIRTUAL_REGISTER)
{
if (regno == VIRTUAL_INCOMING_ARGS_REGNUM)
- fprintf (outfile, " %d virtual-incoming-args", regno);
+ fprintf (outfile, " virtual-incoming-args");
else if (regno == VIRTUAL_STACK_VARS_REGNUM)
- fprintf (outfile, " %d virtual-stack-vars", regno);
+ fprintf (outfile, " virtual-stack-vars");
else if (regno == VIRTUAL_STACK_DYNAMIC_REGNUM)
- fprintf (outfile, " %d virtual-stack-dynamic", regno);
+ fprintf (outfile, " virtual-stack-dynamic");
else if (regno == VIRTUAL_OUTGOING_ARGS_REGNUM)
- fprintf (outfile, " %d virtual-outgoing-args", regno);
+ fprintf (outfile, " virtual-outgoing-args");
else if (regno == VIRTUAL_CFA_REGNUM)
- fprintf (outfile, " %d virtual-cfa", regno);
+ fprintf (outfile, " virtual-cfa");
else if (regno == VIRTUAL_PREFERRED_STACK_BOUNDARY_REGNUM)
- fprintf (outfile, " %d virtual-preferred-stack-boundary",
- regno);
+ fprintf (outfile, " virtual-preferred-stack-boundary");
else
- fprintf (outfile, " %d virtual-reg-%d", regno,
- regno-FIRST_VIRTUAL_REGISTER);
+ fprintf (outfile, " virtual-reg-%d", regno-FIRST_VIRTUAL_REGISTER);
}
else
#endif
@@ -410,6 +427,10 @@ print_rtx_operand_code_r (const_rtx in_rtx)
static void
print_rtx_operand_code_u (const_rtx in_rtx, int idx)
{
+ /* Don't print insn UIDs in compact mode, apart from in LABEL_REFs. */
+ if (flag_compact && GET_CODE (in_rtx) != LABEL_REF)
+ return;
+
if (XEXP (in_rtx, idx) != NULL)
{
rtx sub = XEXP (in_rtx, idx);
@@ -492,7 +513,7 @@ print_rtx_operand (const_rtx in_rtx, int idx)
if (! flag_simple)
fprintf (outfile, " ");
fprintf (outfile, HOST_WIDE_INT_PRINT_DEC, XWINT (in_rtx, idx));
- if (! flag_simple)
+ if (! flag_simple && !flag_compact)
fprintf (outfile, " [" HOST_WIDE_INT_PRINT_HEX "]",
(unsigned HOST_WIDE_INT) XWINT (in_rtx, idx));
break;
@@ -533,6 +554,9 @@ print_rtx_operand (const_rtx in_rtx, int idx)
break;
case 'B':
+ /* Don't print basic block ids in compact mode. */
+ if (flag_compact)
+ break;
#ifndef GENERATOR_FILE
if (XBBDEF (in_rtx, idx))
fprintf (outfile, " %i", XBBDEF (in_rtx, idx)->index);
@@ -575,7 +599,20 @@ print_rtx (const_rtx in_rtx)
}
/* Print name of expression code. */
- if (flag_simple && CONST_INT_P (in_rtx))
+
+ /* In compact mode, prefix the code of insns with "c",
+ giving "cinsn", "cnote" etc. */
+ if (flag_compact && is_a <const rtx_insn *, const struct rtx_def> (in_rtx))
+ {
+ /* "ccode_label" is slightly awkward, so special-case it as
+ just "clabel". */
+ rtx_code code = GET_CODE (in_rtx);
+ if (code == CODE_LABEL)
+ fprintf (outfile, "(clabel");
+ else
+ fprintf (outfile, "(c%s", GET_RTX_NAME (code));
+ }
+ else if (flag_simple && CONST_INT_P (in_rtx))
fputc ('(', outfile);
else
fprintf (outfile, "(%s", GET_RTX_NAME (GET_CODE (in_rtx)));
@@ -639,7 +676,10 @@ print_rtx (const_rtx in_rtx)
idx = 5;
#endif
- if (INSN_CHAIN_CODE_P (GET_CODE (in_rtx)))
+ /* For insns, print the INSN_UID.
+ In compact mode, we only print the INSN_UID of CODE_LABELs. */
+ if (INSN_CHAIN_CODE_P (GET_CODE (in_rtx))
+ && (!flag_compact || GET_CODE (in_rtx) == CODE_LABEL))
{
if (flag_dump_unnumbered)
fprintf (outfile, " #");
@@ -704,7 +744,8 @@ print_rtx (const_rtx in_rtx)
#endif
case CODE_LABEL:
- fprintf (outfile, " [%d uses]", LABEL_NUSES (in_rtx));
+ if (!flag_compact)
+ fprintf (outfile, " [%d uses]", LABEL_NUSES (in_rtx));
switch (LABEL_KIND (in_rtx))
{
case LABEL_NORMAL: break;