+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 *.
+
2014-08-20 Jan Hubicka <hubicka@ucw.cz>
* tree-profile.c (tree_profiling): Skip external functions
return insn_data[code].output.multi[which_alternative];
case INSN_OUTPUT_FORMAT_FUNCTION:
gcc_assert (insn);
- return (*insn_data[code].output.function) (recog_data.operand, insn);
+ return (*insn_data[code].output.function) (recog_data.operand,
+ as_a <rtx_insn *> (insn));
default:
gcc_unreachable ();
puts ("\
/* Dummy external declarations. */\n\
-extern rtx insn;\n\
+extern rtx_insn *insn;\n\
extern rtx ins1;\n\
extern rtx operands[];\n\
\n\
/* Output the prototype, function name and argument declarations. */
if (GET_CODE (split) == DEFINE_PEEPHOLE2)
{
- printf ("extern rtx gen_%s_%d (rtx, rtx *);\n",
+ printf ("extern rtx gen_%s_%d (rtx_insn *, rtx *);\n",
name, insn_code_number);
- printf ("rtx\ngen_%s_%d (rtx curr_insn ATTRIBUTE_UNUSED, rtx *operands%s)\n",
+ printf ("rtx\ngen_%s_%d (rtx_insn *curr_insn ATTRIBUTE_UNUSED, rtx *operands%s)\n",
name, insn_code_number, unused);
}
else
{
- printf ("extern rtx gen_split_%d (rtx, rtx *);\n", insn_code_number);
- printf ("rtx\ngen_split_%d (rtx curr_insn ATTRIBUTE_UNUSED, rtx *operands%s)\n",
+ printf ("extern rtx gen_split_%d (rtx_insn *, rtx *);\n", insn_code_number);
+ printf ("rtx\ngen_split_%d (rtx_insn *curr_insn ATTRIBUTE_UNUSED, rtx *operands%s)\n",
insn_code_number, unused);
}
printf ("{\n");
d->output_format = INSN_OUTPUT_FORMAT_FUNCTION;
puts ("\nstatic const char *");
- printf ("output_%d (rtx *operands ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED)\n",
+ printf ("output_%d (rtx *operands ATTRIBUTE_UNUSED, rtx_insn *insn ATTRIBUTE_UNUSED)\n",
d->code_number);
puts ("{");
print_md_ptr_loc (template_code);
d->output_format = INSN_OUTPUT_FORMAT_FUNCTION;
puts ("\nstatic const char *");
printf ("output_%d (rtx *operands ATTRIBUTE_UNUSED, "
- "rtx insn ATTRIBUTE_UNUSED)\n", d->code_number);
+ "rtx_insn *insn ATTRIBUTE_UNUSED)\n", d->code_number);
puts ("{");
puts (" switch (which_alternative)\n {");
}
const char *s_or_e;
char extension[32];
int i;
+ const char *insn_param;
s_or_e = subfunction ? "static " : "";
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;
}
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
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;
}
each insn-code value. */
typedef int (*insn_operand_predicate_fn) (rtx, enum machine_mode);
-typedef const char * (*insn_output_fn) (rtx *, rtx);
+typedef const char * (*insn_output_fn) (rtx *, rtx_insn *);
struct insn_gen_fn
{