X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCicode.h;h=8c9ac33dea748e7fcc0d8828e722fb3ae4ee599e;hb=2de847a479c5a08a4e0dc8205a340809be8815f4;hp=51301d88f69a35d669fafc4b1fea992e5fafc03c;hpb=6f39a8c11ee72515f0ea214da12a849a0dff9bec;p=fw%2Fsdcc diff --git a/src/SDCCicode.h b/src/SDCCicode.h index 51301d88..8c9ac33d 100644 --- a/src/SDCCicode.h +++ b/src/SDCCicode.h @@ -67,14 +67,6 @@ OPTYPE; #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 @@ -104,6 +96,22 @@ typedef struct operand } 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 @@ -111,8 +119,7 @@ operand; #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 @@ -170,12 +177,7 @@ typedef struct iCode } 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. */ @@ -185,7 +187,9 @@ typedef struct iCode 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; @@ -275,8 +279,8 @@ iCodeTable; #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 */ /*-----------------------------------------------------------------*/ @@ -313,6 +317,7 @@ int printOperand (operand *, FILE *); void setOperandType (operand *, sym_link *); bool isOperandInFarSpace (operand *); bool isOperandInDirSpace (operand *); +bool isOperandInCodeSpace (operand *); operand *opFromOpWithDU (operand *, bitVect *, bitVect *); iCode *copyiCode (iCode *); operand *newiTempFromOp (operand *);