From: David Malcolm Date: Wed, 27 Aug 2014 19:56:45 +0000 (+0000) Subject: Introduce rtx_sequence subclass of rtx_def X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=84fa8d9c4ed2aa3ffc3dded1f3ac9b5bb9ac29e0;p=gcc.git Introduce rtx_sequence subclass of rtx_def gcc/ 2014-08-27 David Malcolm * coretypes.h (class rtx_sequence): Add forward declaration. * rtl.h (class rtx_sequence): New subclass of rtx_def, adding invariant: GET_CODE (X) == SEQUENCE. (is_a_helper ::test): New. (is_a_helper ::test): New. (rtx_sequence::len): New. (rtx_sequence::element): New. (rtx_sequence::insn): New. From-SVN: r214591 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b82355b0525..dce1cb407df 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2014-08-27 David Malcolm + + * coretypes.h (class rtx_sequence): Add forward declaration. + * rtl.h (class rtx_sequence): New subclass of rtx_def, adding + invariant: GET_CODE (X) == SEQUENCE. + (is_a_helper ::test): New. + (is_a_helper ::test): New. + (rtx_sequence::len): New. + (rtx_sequence::element): New. + (rtx_sequence::insn): New. + 2014-08-27 David Malcolm * rtl.h (free_INSN_LIST_list): Strengthen param from rtx * to diff --git a/gcc/coretypes.h b/gcc/coretypes.h index 99ddbdbaf14..d5d4885a0ec 100644 --- a/gcc/coretypes.h +++ b/gcc/coretypes.h @@ -61,6 +61,7 @@ typedef const struct rtx_def *const_rtx; Where possible, keep this list in the same order as in rtl.def. */ class rtx_def; class rtx_insn_list; /* GET_CODE (X) == INSN_LIST */ + class rtx_sequence; /* GET_CODE (X) == SEQUENCE */ class rtx_insn; class rtx_debug_insn; /* DEBUG_INSN_P (X) */ class rtx_nonjump_insn; /* NONJUMP_INSN_P (X) */ diff --git a/gcc/rtl.h b/gcc/rtl.h index 0062a0c03f9..fe8201dca72 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -431,6 +431,41 @@ is_a_helper ::test (rtx rt) return rt->code == INSN_LIST; } +/* A node with invariant GET_CODE (X) == SEQUENCE i.e. a vector of rtx, + typically (but not always) of rtx_insn *, used in the late passes. */ + +class GTY(()) rtx_sequence : public rtx_def +{ + /* No extra fields, but adds invariant: (GET_CODE (X) == SEQUENCE). */ + +public: + /* Get number of elements in sequence. */ + int len () const; + + /* Get i-th element of the sequence. */ + rtx element (int index) const; + + /* Get i-th element of the sequence, with a checked cast to + rtx_insn *. */ + rtx_insn *insn (int index) const; +}; + +template <> +template <> +inline bool +is_a_helper ::test (rtx rt) +{ + return rt->code == SEQUENCE; +} + +template <> +template <> +inline bool +is_a_helper ::test (const_rtx rt) +{ + return rt->code == SEQUENCE; +} + class GTY(()) rtx_insn : public rtx_def { /* No extra fields, but adds the invariant: @@ -1212,6 +1247,23 @@ inline rtx_insn *rtx_insn_list::insn () const return safe_as_a (tmp); } +/* Methods of rtx_sequence. */ + +inline int rtx_sequence::len () const +{ + return XVECLEN (this, 0); +} + +inline rtx rtx_sequence::element (int index) const +{ + return XVECEXP (this, 0, index); +} + +inline rtx_insn *rtx_sequence::insn (int index) const +{ + return as_a (XVECEXP (this, 0, index)); +} + /* ACCESS MACROS for particular fields of insns. */ /* Holds a unique number for each insn.