+2014-08-27 David Malcolm <dmalcolm@redhat.com>
+
+ * coretypes.h (class rtx_expr_list): Add forward declaration.
+ * emit-rtl.c (gen_rtx_EXPR_LIST): New.
+ * gengenrtl.c (special_rtx): Add EXPR_LIST.
+ * rtl.h (class rtx_expr_list): New subclass of rtx_def, adding
+ invariant: GET_CODE (X) == EXPR_LIST.
+ (is_a_helper <rtx_expr_list *>::test): New.
+ (rtx_expr_list::next): New.
+ (rtx_expr_list::element): New.
+ (gen_rtx_EXPR_LIST): New.
+
2014-08-27 David Malcolm <dmalcolm@redhat.com>
* varasm.c (mark_constants): Convert a GET_CODE check into a
hierarchy, along with the relevant invariant.
Where possible, keep this list in the same order as in rtl.def. */
class rtx_def;
+ class rtx_expr_list; /* GET_CODE (X) == EXPR_LIST */
class rtx_insn_list; /* GET_CODE (X) == INSN_LIST */
class rtx_sequence; /* GET_CODE (X) == SEQUENCE */
class rtx_insn;
functions do the raw handling. If you add to this list, modify
special_rtx in gengenrtl.c as well. */
+rtx_expr_list *
+gen_rtx_EXPR_LIST (enum machine_mode mode, rtx expr, rtx expr_list)
+{
+ return as_a <rtx_expr_list *> (gen_rtx_fmt_ee (EXPR_LIST, mode, expr,
+ expr_list));
+}
+
rtx_insn_list *
gen_rtx_INSN_LIST (enum machine_mode mode, rtx insn, rtx insn_list)
{
static int
special_rtx (int idx)
{
- return (strcmp (defs[idx].enumname, "INSN_LIST") == 0
+ return (strcmp (defs[idx].enumname, "EXPR_LIST") == 0
+ || strcmp (defs[idx].enumname, "INSN_LIST") == 0
|| strcmp (defs[idx].enumname, "CONST_INT") == 0
|| strcmp (defs[idx].enumname, "REG") == 0
|| strcmp (defs[idx].enumname, "SUBREG") == 0
} GTY ((special ("rtx_def"), desc ("GET_CODE (&%0)"))) u;
};
+/* A node for constructing singly-linked lists of rtx. */
+
+class GTY(()) rtx_expr_list : public rtx_def
+{
+ /* No extra fields, but adds invariant: (GET_CODE (X) == EXPR_LIST). */
+
+public:
+ /* Get next in list. */
+ rtx_expr_list *next () const;
+
+ /* Get at the underlying rtx. */
+ rtx element () const;
+};
+
+template <>
+template <>
+inline bool
+is_a_helper <rtx_expr_list *>::test (rtx rt)
+{
+ return rt->code == EXPR_LIST;
+}
+
class GTY(()) rtx_insn_list : public rtx_def
{
/* No extra fields, but adds invariant: (GET_CODE (X) == INSN_LIST).
#define XC2EXP(RTX, N, C1, C2) (RTL_CHECKC2 (RTX, N, C1, C2).rt_rtx)
\f
+/* Methods of rtx_expr_list. */
+
+inline rtx_expr_list *rtx_expr_list::next () const
+{
+ rtx tmp = XEXP (this, 1);
+ return safe_as_a <rtx_expr_list *> (tmp);
+}
+
+inline rtx rtx_expr_list::element () const
+{
+ return XEXP (this, 0);
+}
+
/* Methods of rtx_insn_list. */
inline rtx_insn_list *rtx_insn_list::next () const
generation functions included above do the raw handling. If you
add to this list, modify special_rtx in gengenrtl.c as well. */
+extern rtx_expr_list *gen_rtx_EXPR_LIST (enum machine_mode, rtx, rtx);
extern rtx_insn_list *gen_rtx_INSN_LIST (enum machine_mode, rtx, rtx);
extern rtx gen_rtx_CONST_INT (enum machine_mode, HOST_WIDE_INT);
extern rtx gen_rtx_CONST_VECTOR (enum machine_mode, rtvec);