-#define VARRAY_CHAR(VA, N) VARRAY_CHECK (VA, N, c)
-#define VARRAY_UCHAR(VA, N) VARRAY_CHECK (VA, N, uc)
-#define VARRAY_SHORT(VA, N) VARRAY_CHECK (VA, N, s)
-#define VARRAY_USHORT(VA, N) VARRAY_CHECK (VA, N, us)
-#define VARRAY_INT(VA, N) VARRAY_CHECK (VA, N, i)
-#define VARRAY_UINT(VA, N) VARRAY_CHECK (VA, N, u)
-#define VARRAY_LONG(VA, N) VARRAY_CHECK (VA, N, l)
-#define VARRAY_ULONG(VA, N) VARRAY_CHECK (VA, N, ul)
-#define VARRAY_WIDE_INT(VA, N) VARRAY_CHECK (VA, N, hint)
-#define VARRAY_UWIDE_INT(VA, N) VARRAY_CHECK (VA, N, uhint)
-#define VARRAY_GENERIC_PTR(VA,N) VARRAY_CHECK (VA, N, generic)
-#define VARRAY_CHAR_PTR(VA,N) VARRAY_CHECK (VA, N, cptr)
-#define VARRAY_RTX(VA, N) VARRAY_CHECK (VA, N, rtx)
-#define VARRAY_RTVEC(VA, N) VARRAY_CHECK (VA, N, rtvec)
-#define VARRAY_TREE(VA, N) VARRAY_CHECK (VA, N, tree)
-#define VARRAY_BITMAP(VA, N) VARRAY_CHECK (VA, N, bitmap)
-#define VARRAY_SCHED(VA, N) VARRAY_CHECK (VA, N, sched)
-#define VARRAY_REG(VA, N) VARRAY_CHECK (VA, N, reg)
-#define VARRAY_CONST_EQUIV(VA, N) VARRAY_CHECK (VA, N, const_equiv)
-#define VARRAY_BB(VA, N) VARRAY_CHECK (VA, N, bb)
-
-#endif /* _VARRAY_H_ */
+/* Push X onto VA. T is the name of the field in varray_data
+ corresponding to the type of X. */
+#define VARRAY_PUSH(VA, T, X) \
+ do \
+ { \
+ if ((VA)->elements_used >= (VA)->num_elements) \
+ VARRAY_GROW ((VA), 2 * (VA)->num_elements); \
+ (VA)->data.T[(VA)->elements_used++] = (X); \
+ } \
+ while (0)
+
+#define VARRAY_CHAR(VA, N) VARRAY_CHECK (VA, N, vdt_c)
+#define VARRAY_UCHAR(VA, N) VARRAY_CHECK (VA, N, vdt_uc)
+#define VARRAY_SHORT(VA, N) VARRAY_CHECK (VA, N, vdt_s)
+#define VARRAY_USHORT(VA, N) VARRAY_CHECK (VA, N, vdt_us)
+#define VARRAY_INT(VA, N) VARRAY_CHECK (VA, N, vdt_i)
+#define VARRAY_UINT(VA, N) VARRAY_CHECK (VA, N, vdt_u)
+#define VARRAY_LONG(VA, N) VARRAY_CHECK (VA, N, vdt_l)
+#define VARRAY_ULONG(VA, N) VARRAY_CHECK (VA, N, vdt_ul)
+#define VARRAY_WIDE_INT(VA, N) VARRAY_CHECK (VA, N, vdt_hint)
+#define VARRAY_UWIDE_INT(VA, N) VARRAY_CHECK (VA, N, vdt_uhint)
+#define VARRAY_GENERIC_PTR(VA,N) VARRAY_CHECK (VA, N, vdt_generic)
+#define VARRAY_GENERIC_PTR_NOGC(VA,N) VARRAY_CHECK (VA, N, vdt_generic_nogc)
+#define VARRAY_CHAR_PTR(VA,N) VARRAY_CHECK (VA, N, vdt_cptr)
+#define VARRAY_RTX(VA, N) VARRAY_CHECK (VA, N, vdt_rtx)
+#define VARRAY_RTVEC(VA, N) VARRAY_CHECK (VA, N, vdt_rtvec)
+#define VARRAY_TREE(VA, N) VARRAY_CHECK (VA, N, vdt_tree)
+#define VARRAY_BITMAP(VA, N) VARRAY_CHECK (VA, N, vdt_bitmap)
+#define VARRAY_REG(VA, N) VARRAY_CHECK (VA, N, vdt_reg)
+#define VARRAY_BB(VA, N) VARRAY_CHECK (VA, N, vdt_bb)
+#define VARRAY_ELT_LIST(VA, N) VARRAY_CHECK (VA, N, vdt_te)
+#define VARRAY_EDGE(VA, N) VARRAY_CHECK (VA, N, vdt_e)
+#define VARRAY_TREE_PTR(VA, N) VARRAY_CHECK (VA, N, vdt_tp)
+
+/* Push a new element on the end of VA, extending it if necessary. */
+#define VARRAY_PUSH_CHAR(VA, X) VARRAY_PUSH (VA, vdt_c, X)
+#define VARRAY_PUSH_UCHAR(VA, X) VARRAY_PUSH (VA, vdt_uc, X)
+#define VARRAY_PUSH_SHORT(VA, X) VARRAY_PUSH (VA, vdt_s, X)
+#define VARRAY_PUSH_USHORT(VA, X) VARRAY_PUSH (VA, vdt_us, X)
+#define VARRAY_PUSH_INT(VA, X) VARRAY_PUSH (VA, vdt_i, X)
+#define VARRAY_PUSH_UINT(VA, X) VARRAY_PUSH (VA, vdt_u, X)
+#define VARRAY_PUSH_LONG(VA, X) VARRAY_PUSH (VA, vdt_l, X)
+#define VARRAY_PUSH_ULONG(VA, X) VARRAY_PUSH (VA, vdt_ul, X)
+#define VARRAY_PUSH_WIDE_INT(VA, X) VARRAY_PUSH (VA, vdt_hint, X)
+#define VARRAY_PUSH_UWIDE_INT(VA, X) VARRAY_PUSH (VA, vdt_uhint, X)
+#define VARRAY_PUSH_GENERIC_PTR(VA, X) VARRAY_PUSH (VA, vdt_generic, X)
+#define VARRAY_PUSH_GENERIC_PTR_NOGC(VA, X) VARRAY_PUSH (VA, vdt_generic_nogc, X)
+#define VARRAY_PUSH_CHAR_PTR(VA, X) VARRAY_PUSH (VA, vdt_cptr, X)
+#define VARRAY_PUSH_RTX(VA, X) VARRAY_PUSH (VA, vdt_rtx, X)
+#define VARRAY_PUSH_RTVEC(VA, X) VARRAY_PUSH (VA, vdt_rtvec, X)
+#define VARRAY_PUSH_TREE(VA, X) VARRAY_PUSH (VA, vdt_tree, X)
+#define VARRAY_PUSH_BITMAP(VA, X) VARRAY_PUSH (VA, vdt_bitmap, X)
+#define VARRAY_PUSH_REG(VA, X) VARRAY_PUSH (VA, vdt_reg, X)
+#define VARRAY_PUSH_BB(VA, X) VARRAY_PUSH (VA, vdt_bb, X)
+#define VARRAY_PUSH_EDGE(VA, X) VARRAY_PUSH (VA, vdt_e, X)
+#define VARRAY_PUSH_TREE_PTR(VA, X) VARRAY_PUSH (VA, vdt_tp, X)
+
+/* Return the last element of VA. */
+#define VARRAY_TOP(VA, T) VARRAY_CHECK(VA, (VA)->elements_used - 1, T)
+
+#define VARRAY_TOP_CHAR(VA) VARRAY_TOP (VA, vdt_c)
+#define VARRAY_TOP_UCHAR(VA) VARRAY_TOP (VA, vdt_uc)
+#define VARRAY_TOP_SHORT(VA) VARRAY_TOP (VA, vdt_s)
+#define VARRAY_TOP_USHORT(VA) VARRAY_TOP (VA, vdt_us)
+#define VARRAY_TOP_INT(VA) VARRAY_TOP (VA, vdt_i)
+#define VARRAY_TOP_UINT(VA) VARRAY_TOP (VA, vdt_u)
+#define VARRAY_TOP_LONG(VA) VARRAY_TOP (VA, vdt_l)
+#define VARRAY_TOP_ULONG(VA) VARRAY_TOP (VA, vdt_ul)
+#define VARRAY_TOP_WIDE_INT(VA) VARRAY_TOP (VA, vdt_hint)
+#define VARRAY_TOP_UWIDE_INT(VA) VARRAY_TOP (VA, vdt_uhint)
+#define VARRAY_TOP_GENERIC_PTR(VA) VARRAY_TOP (VA, vdt_generic)
+#define VARRAY_TOP_GENERIC_PTR_NOGC(VA) VARRAY_TOP (VA, vdt_generic_nogc)
+#define VARRAY_TOP_CHAR_PTR(VA) VARRAY_TOP (VA, vdt_cptr)
+#define VARRAY_TOP_RTX(VA) VARRAY_TOP (VA, vdt_rtx)
+#define VARRAY_TOP_RTVEC(VA) VARRAY_TOP (VA, vdt_rtvec)
+#define VARRAY_TOP_TREE(VA) VARRAY_TOP (VA, vdt_tree)
+#define VARRAY_TOP_BITMAP(VA) VARRAY_TOP (VA, vdt_bitmap)
+#define VARRAY_TOP_REG(VA) VARRAY_TOP (VA, vdt_reg)
+#define VARRAY_TOP_BB(VA) VARRAY_TOP (VA, vdt_bb)
+#define VARRAY_TOP_EDGE(VA) VARRAY_TOP (VA, vdt_e)
+#define VARRAY_TOP_TREE_PTR(VA) VARRAY_TOP (VA, vdt_tp)
+
+#endif /* ! GCC_VARRAY_H */