#define IS_OP_GLOBAL(op) (IS_SYMOP(op) && op->isGlobal)
#define IS_OP_POINTER(op) (IS_SYMOP(op) && op->isPtr)
#define IS_OP_PARM(op) (IS_SYMOP(op) && op->isParm)
-#define OP_SYMBOL(op) op->operand.symOperand
-#define OP_SYM_TYPE(op) op->operand.symOperand->type
-#define OP_SYM_ETYPE(op) op->operand.symOperand->etype
-#define OP_VALUE(op) op->operand.valOperand
-#define SPIL_LOC(op) op->operand.symOperand->usl.spillLoc
-#define OP_LIVEFROM(op) op->operand.symOperand->liveFrom
-#define OP_LIVETO(op) op->operand.symOperand->liveTo
-#define OP_REQV(op) op->operand.symOperand->reqv
#define OP_ISLIVE_FCALL(op) (IS_ITEMP(op) && OP_SYMBOL(op)->isLiveFcall)
#define SYM_SPIL_LOC(sym) sym->usl.spillLoc
}
operand;
+extern operand *validateOpType(operand *op,
+ const char *macro,
+ const char *args,
+ OPTYPE type,
+ const char *file,
+ unsigned line);
+
+#define OP_SYMBOL(op) validateOpType(op, "OP_SYMBOL", #op, SYMBOL, __FILE__, __LINE__)->operand.symOperand
+#define OP_VALUE(op) validateOpType(op, "OP_VALUE", #op, VALUE, __FILE__, __LINE__)->operand.valOperand
+#define OP_SYM_TYPE(op) validateOpType(op, "OP_SYM_TYPE", #op, SYMBOL, __FILE__, __LINE__)->operand.symOperand->type
+#define OP_SYM_ETYPE(op) validateOpType(op, "OP_SYM_ETYPE", #op, SYMBOL, __FILE__, __LINE__)->operand.symOperand->etype
+#define SPIL_LOC(op) validateOpType(op, "SPIL_LOC", #op, SYMBOL, __FILE__, __LINE__)->operand.symOperand->usl.spillLoc
+#define OP_LIVEFROM(op) validateOpType(op, "OP_LIVEFROM", #op, SYMBOL, __FILE__, __LINE__)->operand.symOperand->liveFrom
+#define OP_LIVETO(op) validateOpType(op, "OP_LIVETO", #op, SYMBOL, __FILE__, __LINE__)->operand.symOperand->liveTo
+#define OP_REQV(op) validateOpType(op, "OP_REQV", #op, SYMBOL, __FILE__, __LINE__)->operand.symOperand->reqv
+
/* definition for intermediate code */
#define IC_RESULT(x) (x)->ulrrcnd.lrr.result
#define IC_LEFT(x) (x)->ulrrcnd.lrr.left
#define IC_COND(x) (x)->ulrrcnd.cnd.condition
#define IC_TRUE(x) (x)->ulrrcnd.cnd.trueLabel
#define IC_FALSE(x) (x)->ulrrcnd.cnd.falseLabel
-#define IC_LABEL(x) (x)->argLabel.label
-// jwk #define IC_ARGS(x) (x)->argLabel.args
+#define IC_LABEL(x) (x)->label
#define IC_JTCOND(x) (x)->ulrrcnd.jmpTab.condition
#define IC_JTLABELS(x) (x)->ulrrcnd.jmpTab.labels
#define IC_INLINE(x) (x)->inlineAsm
}
ulrrcnd;
- union
- {
- symbol *label; /* for a goto statement */
- // jwk value *args; /* for a function */
- }
- argLabel;
+ symbol *label; /* for a goto statement */
char *inlineAsm; /* pointer to inline assembler code */
literalList *arrayInitList; /* point to array initializer list. */
int parmBytes; /* if call/pcall, count of parameter bytes
on stack */
+ int argreg; /* argument regno for SEND/RECEIVE */
int eBBlockNum; /* belongs to which eBBlock */
+ char riu; /* after ralloc, the registers in use */
}
iCode;
#define SET_RESULT_RIGHT(ic) {SET_ISADDR(IC_RIGHT(ic),0); SET_ISADDR(IC_RESULT(ic),0);}
#define IS_ASSIGN_ICODE(ic) (ASSIGNMENT(ic) && !POINTER_SET(ic))
-#define OP_DEFS(op) op->operand.symOperand->defs
-#define OP_USES(op) op->operand.symOperand->uses
+#define OP_DEFS(op) validateOpType(op, "OP_DEFS", #op, SYMBOL, __FILE__, __LINE__)->operand.symOperand->defs
+#define OP_USES(op) validateOpType(op, "OP_USES", #op, SYMBOL, __FILE__, __LINE__)->operand.symOperand->uses
/*-----------------------------------------------------------------*/
/* forward references for functions */
/*-----------------------------------------------------------------*/