From 0a7b42b5b63d54f909838b94fe502440d9af6554 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm@redhat.com>
Date: Fri, 11 Jul 2014 10:34:14 -0400
Subject: [PATCH 211/236] Introduce rtx_expr_list subclass of rtx_def

gcc/
	* 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.
---
 gcc/coretypes.h |  1 +
 gcc/emit-rtl.c  |  7 +++++++
 gcc/gengenrtl.c |  3 ++-
 gcc/rtl.h       | 36 ++++++++++++++++++++++++++++++++++++
 4 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/gcc/coretypes.h b/gcc/coretypes.h
index 02cac5a..5ba83b1 100644
--- a/gcc/coretypes.h
+++ b/gcc/coretypes.h
@@ -60,6 +60,7 @@ typedef const struct rtx_def *const_rtx;
    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;
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index fef4faa..5d946b8 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -404,6 +404,13 @@ gen_raw_REG (enum machine_mode mode, int regno)
    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)
 {
diff --git a/gcc/gengenrtl.c b/gcc/gengenrtl.c
index cd29341..885dd20 100644
--- a/gcc/gengenrtl.c
+++ b/gcc/gengenrtl.c
@@ -123,7 +123,8 @@ special_format (const char *fmt)
 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
diff --git a/gcc/rtl.h b/gcc/rtl.h
index ed736cc..6fe89ec 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -402,6 +402,28 @@ struct GTY((desc("0"), tag("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).
@@ -1252,6 +1274,19 @@ extern void rtl_check_failed_flag (const char *, const_rtx, const char *,
 #define XC2EXP(RTX, N, C1, C2)      (RTL_CHECKC2 (RTX, N, C1, C2).rt_rtx)
 
 
+/* Methods of rtx_expr_list.  */
+
+inline rtx_expr_list *rtx_expr_list::next () const
+{
+  rtx tmp = XEXP (this, 1);
+  return as_a_nullable <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
@@ -3021,6 +3056,7 @@ get_mem_attrs (const_rtx x)
    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);
-- 
1.8.5.3

