summaryrefslogtreecommitdiff
path: root/gcc/genrecog.c
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2014-08-21 07:49:28 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2014-08-21 07:49:28 +0000
commit95770ca3202ebd8529d202aaf4714343a2c4e14e (patch)
tree3a51c7e76552c742934054882bbc0166fa7aacf9 /gcc/genrecog.c
parent07db0f9bb354bd9a46e62c6d9960a9a3c40d1c15 (diff)
downloadgcc-95770ca3202ebd8529d202aaf4714343a2c4e14e.tar.gz
Use rtx_insn internally within generated functions
2014-08-21 David Malcolm <dmalcolm@redhat.com> * recog.h (insn_output_fn): Update this function typedef to match the changes below to the generated output functions, strengthening the 2nd param from rtx to rtx_insn *. * final.c (get_insn_template): Add a checked cast to rtx_insn * on insn when invoking an output function, to match the new signature of insn_output_fn with a stronger second param. * genconditions.c (write_header): In the generated code for gencondmd.c, strengthen the global "insn" from rtx to rtx_insn * to match the other changes in this patch. * genemit.c (gen_split): Strengthen the 1st param "curr_insn" of the generated "gen_" functions from rtx to rtx_insn * within their implementations. * genrecog.c (write_subroutine): Strengthen the 2nd param "insn" of the subfunctions within the generated "recog_", "split", "peephole2" function trees from rtx to rtx_insn *. For now, the top-level generated functions ("recog", "split", "peephole2") continue to take a plain rtx for "insn", to avoid introducing dependencies on other patches. Rename this 2nd param from "insn" to "uncast_insn", and reintroduce "insn" as a local variable of type rtx_insn *, initialized at the top of the generated function with a checked cast on "uncast_insn". (make_insn_sequence): Strengthen the 1st param "curr_insn" of the generated "gen_" functions from rtx to rtx_insn * within their prototypes. * genoutput.c (process_template): Strengthen the 2nd param within the generated "output_" functions "insn" from rtx to rtx_insn *. From-SVN: r214257
Diffstat (limited to 'gcc/genrecog.c')
-rw-r--r--gcc/genrecog.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/gcc/genrecog.c b/gcc/genrecog.c
index 457b59c901d..1f09dd661e8 100644
--- a/gcc/genrecog.c
+++ b/gcc/genrecog.c
@@ -2180,6 +2180,7 @@ write_subroutine (struct decision_head *head, enum routine_type type)
const char *s_or_e;
char extension[32];
int i;
+ const char *insn_param;
s_or_e = subfunction ? "static " : "";
@@ -2190,21 +2191,27 @@ write_subroutine (struct decision_head *head, enum routine_type type)
else
strcpy (extension, "_insns");
+ /* For now, the top-level functions take a plain "rtx", and perform a
+ checked cast to "rtx_insn *" for use throughout the rest of the
+ function and the code it calls. */
+ insn_param = subfunction ? "rtx_insn *insn" : "rtx uncast_insn";
+
switch (type)
{
case RECOG:
printf ("%sint\n\
-recog%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *pnum_clobbers ATTRIBUTE_UNUSED)\n", s_or_e, extension);
+recog%s (rtx x0 ATTRIBUTE_UNUSED,\n\t%s ATTRIBUTE_UNUSED,\n\tint *pnum_clobbers ATTRIBUTE_UNUSED)\n",
+ s_or_e, extension, insn_param);
break;
case SPLIT:
printf ("%srtx\n\
-split%s (rtx x0 ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED)\n",
- s_or_e, extension);
+split%s (rtx x0 ATTRIBUTE_UNUSED, %s ATTRIBUTE_UNUSED)\n",
+ s_or_e, extension, insn_param);
break;
case PEEPHOLE2:
printf ("%srtx\n\
-peephole2%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *_pmatch_len ATTRIBUTE_UNUSED)\n",
- s_or_e, extension);
+peephole2%s (rtx x0 ATTRIBUTE_UNUSED,\n\t%s ATTRIBUTE_UNUSED,\n\tint *_pmatch_len ATTRIBUTE_UNUSED)\n",
+ s_or_e, extension, insn_param);
break;
}
@@ -2217,6 +2224,14 @@ peephole2%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *_pma
if (!subfunction)
printf (" recog_data.insn = NULL_RTX;\n");
+ /* For now add the downcast to rtx_insn *, at the top of each top-level
+ function. */
+ if (!subfunction)
+ {
+ printf (" rtx_insn *insn ATTRIBUTE_UNUSED;\n");
+ printf (" insn = safe_as_a <rtx_insn *> (uncast_insn);\n");
+ }
+
if (head->first)
write_tree (head, &root_pos, type, 1);
else
@@ -2461,12 +2476,12 @@ make_insn_sequence (rtx insn, enum routine_type type)
case SPLIT:
/* Define the subroutine we will call below and emit in genemit. */
- printf ("extern rtx gen_split_%d (rtx, rtx *);\n", next_insn_code);
+ printf ("extern rtx gen_split_%d (rtx_insn *, rtx *);\n", next_insn_code);
break;
case PEEPHOLE2:
/* Define the subroutine we will call below and emit in genemit. */
- printf ("extern rtx gen_peephole2_%d (rtx, rtx *);\n",
+ printf ("extern rtx gen_peephole2_%d (rtx_insn *, rtx *);\n",
next_insn_code);
break;
}