gen_exp now has quite a few arguments that need to be passed to each recursive call. This patch turns it and related routines into member functions of a new generator class, so that the shared information can be stored in member variables.
This also helps to make later patches less noisy. gcc/ * genemit.cc (generator): New structure. (gen_rtx_scratch, gen_exp, gen_emit_seq): Turn into member functions of generator. (gen_insn, gen_expand, gen_split, output_add_clobbers): Update users accordingly. --- gcc/genemit.cc | 76 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 21 deletions(-) diff --git a/gcc/genemit.cc b/gcc/genemit.cc index cdc098f19b8..df2b319fd23 100644 --- a/gcc/genemit.cc +++ b/gcc/genemit.cc @@ -66,8 +66,40 @@ print_code (RTX_CODE code, FILE *file) fprintf (file, "%c", TOUPPER (*p1)); } -static void -gen_rtx_scratch (rtx x, enum rtx_code subroutine_type, FILE *file) +/* A structure used to generate code for a particular expansion. */ +struct generator +{ + generator (rtx_code, char *, const md_rtx_info &, FILE *); + + void gen_rtx_scratch (rtx); + void gen_exp (rtx); + void gen_emit_seq (rtvec); + + /* The type of subroutine that we're expanding. */ + rtx_code subroutine_type; + + /* If nonnull, index N indicates that the original operand N has already + been used to replace a MATCH_OPERATOR or MATCH_DUP, and so any further + replacements must make a copy. */ + char *used; + + /* The construct that we're expanding. */ + const md_rtx_info info; + + /* The output file. */ + FILE *file; +}; + +generator::generator (rtx_code subroutine_type, char *used, + const md_rtx_info &info, FILE *file) + : subroutine_type (subroutine_type), + used (used), + info (info), + file (file) +{} + +void +generator::gen_rtx_scratch (rtx x) { if (subroutine_type == DEFINE_PEEPHOLE2) { @@ -82,9 +114,8 @@ gen_rtx_scratch (rtx x, enum rtx_code subroutine_type, FILE *file) /* Print a C expression to construct an RTX just like X, substituting any operand references appearing within. */ -static void -gen_exp (rtx x, enum rtx_code subroutine_type, char *used, - const md_rtx_info &info, FILE *file) +void +generator::gen_exp (rtx x) { RTX_CODE code; int i; @@ -128,7 +159,7 @@ gen_exp (rtx x, enum rtx_code subroutine_type, char *used, for (i = 0; i < XVECLEN (x, 1); i++) { fprintf (file, ",\n\t\t"); - gen_exp (XVECEXP (x, 1, i), subroutine_type, used, info, file); + gen_exp (XVECEXP (x, 1, i)); } fprintf (file, ")"); return; @@ -142,7 +173,7 @@ gen_exp (rtx x, enum rtx_code subroutine_type, char *used, for (i = 0; i < XVECLEN (x, 2); i++) { fprintf (file, ",\n\t\t"); - gen_exp (XVECEXP (x, 2, i), subroutine_type, used, info, file); + gen_exp (XVECEXP (x, 2, i)); } fprintf (file, ")"); return; @@ -153,7 +184,7 @@ gen_exp (rtx x, enum rtx_code subroutine_type, char *used, return; case MATCH_SCRATCH: - gen_rtx_scratch (x, subroutine_type, file); + gen_rtx_scratch (x); return; case PC: @@ -234,7 +265,7 @@ gen_exp (rtx x, enum rtx_code subroutine_type, char *used, switch (fmt[i]) { case 'e': case 'u': - gen_exp (XEXP (x, i), subroutine_type, used, info, file); + gen_exp (XEXP (x, i)); break; case 'i': @@ -266,7 +297,7 @@ gen_exp (rtx x, enum rtx_code subroutine_type, char *used, for (j = 0; j < XVECLEN (x, i); j++) { fprintf (file, ",\n\t\t"); - gen_exp (XVECEXP (x, i, j), subroutine_type, used, info, file); + gen_exp (XVECEXP (x, i, j)); } fprintf (file, ")"); break; @@ -281,10 +312,10 @@ gen_exp (rtx x, enum rtx_code subroutine_type, char *used, } /* Output code to emit the instruction patterns in VEC, with each element - becoming a separate instruction. USED is as for gen_exp. */ + becoming a separate instruction. */ -static void -gen_emit_seq (rtvec vec, char *used, const md_rtx_info &info, FILE *file) +void +generator::gen_emit_seq (rtvec vec) { for (int i = 0, len = GET_NUM_ELEM (vec); i < len; ++i) { @@ -293,7 +324,7 @@ gen_emit_seq (rtvec vec, char *used, const md_rtx_info &info, FILE *file) if (const char *name = get_emit_function (next)) { fprintf (file, " %s (", name); - gen_exp (next, DEFINE_EXPAND, used, info, file); + gen_exp (next); fprintf (file, ");\n"); if (!last_p && needs_barrier_p (next)) fprintf (file, " emit_barrier ();"); @@ -301,7 +332,7 @@ gen_emit_seq (rtvec vec, char *used, const md_rtx_info &info, FILE *file) else { fprintf (file, " emit ("); - gen_exp (next, DEFINE_EXPAND, used, info, file); + gen_exp (next); fprintf (file, ", %s);\n", last_p ? "false" : "true"); } } @@ -479,7 +510,7 @@ gen_insn (const md_rtx_info &info, FILE *file) ? NULL : XCNEWVEC (char, stats.num_generator_args)); fprintf (file, " return "); - gen_exp (pattern, DEFINE_INSN, used, info, file); + generator (DEFINE_INSN, used, info, file).gen_exp (pattern); fprintf (file, ";\n}\n\n"); XDELETEVEC (used); } @@ -525,7 +556,8 @@ gen_expand (const md_rtx_info &info, FILE *file) && XVECLEN (expand, 1) == 1) { fprintf (file, " return "); - gen_exp (XVECEXP (expand, 1, 0), DEFINE_EXPAND, NULL, info, file); + generator (DEFINE_EXPAND, NULL, info, file) + .gen_exp (XVECEXP (expand, 1, 0)); fprintf (file, ";\n}\n\n"); return; } @@ -559,7 +591,7 @@ gen_expand (const md_rtx_info &info, FILE *file) } used = XCNEWVEC (char, stats.num_operand_vars); - gen_emit_seq (XVEC (expand, 1), used, info, file); + generator (DEFINE_EXPAND, used, info, file).gen_emit_seq (XVEC (expand, 1)); XDELETEVEC (used); /* Call `get_insns' to extract the list of all the @@ -647,7 +679,8 @@ gen_split (const md_rtx_info &info, FILE *file) if (XSTR (split, 3)) emit_c_code (XSTR (split, 3), true, name, file); - gen_emit_seq (XVEC (split, 2), used, info, file); + generator (GET_CODE (split), used, info, file) + .gen_emit_seq (XVEC (split, 2)); /* Call `get_insns' to make a list of all the insns emitted within this gen_... function. */ @@ -683,8 +716,9 @@ output_add_clobbers (const md_rtx_info &info, FILE *file) for (i = clobber->first_clobber; i < GET_NUM_ELEM (clobber->pattern); i++) { fprintf (file, " XVECEXP (pattern, 0, %d) = ", i); - gen_exp (RTVEC_ELT (clobber->pattern, i), - clobber->code, NULL, info, file); + rtx clobbered_value = RTVEC_ELT (clobber->pattern, i); + generator (clobber->code, NULL, info, file) + .gen_exp (clobbered_value); fprintf (file, ";\n"); } -- 2.43.0