Yet more scaffolding: convert the NEXT_INSN/PREV_INSN macros and their SET_* variants into functions.
Convert the rvalue-style functions into returning rtx_insn * rather than plain rtx. For now, this is done by adding a checked cast, but I hope this can eventually become a field lookup. The lvalue forms for now return an rtx& to allow in-place modification. gcc/ * rtl.h (PREV_INSN): Convert to an inline function. Strengthen the return type from rtx to rtx_insn *, which will enable various conversions in followup patches. For now this is is done by a checked cast. (NEXT_INSN): Likewise. (SET_PREV_INSN): Convert to an inilne function. This is intended for use as an lvalue, and so returns an rtx& to allow in-place modification. (SET_NEXT_INSN): Likewise. --- gcc/rtl.h | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/gcc/rtl.h b/gcc/rtl.h index e08f05b..5936829 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -972,15 +972,33 @@ extern void rtl_check_failed_flag (const char *, const_rtx, const char *, (RTL_INSN_CHAIN_FLAG_CHECK ("INSN_UID", (INSN))->u2.insn_uid) /* Chain insns together in sequence. */ + /* For now these are split in two: an rvalue form: PREV_INSN/NEXT_INSN and an lvalue form: SET_NEXT_INSN/SET_PREV_INSN. */ -#define PREV_INSN(INSN) XEXP ((const_rtx)(INSN), 0) -#define SET_PREV_INSN(INSN) XEXP (INSN, 0) -#define NEXT_INSN(INSN) XEXP ((const_rtx)(INSN), 1) -#define SET_NEXT_INSN(INSN) XEXP (INSN, 1) +inline rtx_insn *PREV_INSN (const_rtx insn) +{ + rtx prev = XEXP (insn, 0); + return as_a_nullable <rtx_insn *> (prev); +} + +inline rtx& SET_PREV_INSN (rtx insn) +{ + return XEXP (insn, 0); +} + +inline rtx_insn *NEXT_INSN (const_rtx insn) +{ + rtx next = XEXP (insn, 1); + return as_a_nullable <rtx_insn *> (next); +} + +inline rtx& SET_NEXT_INSN (rtx insn) +{ + return XEXP (insn, 1); +} #define BLOCK_FOR_INSN(INSN) XBBDEF (INSN, 2) -- 1.8.5.3