X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCast.h;h=d46ad5f18c9076023ae5d1c96c556625bc9f39ad;hb=67613b6eceb41c8a242c2556a0f59311adb0b388;hp=617b944d689288c2c30ada0d30746b9898b636f3;hpb=899ee91ab8169609f83f2c34c14d9112df2bb085;p=fw%2Fsdcc diff --git a/src/SDCCast.h b/src/SDCCast.h index 617b944d..d46ad5f1 100644 --- a/src/SDCCast.h +++ b/src/SDCCast.h @@ -29,78 +29,90 @@ #include "SDCCsymt.h" #include "SDCCval.h" #include "SDCCset.h" +#include "SDCCmem.h" -#define EX_OP 0 -#define EX_VALUE 1 -#define EX_LINK 2 -#define EX_STMNT 3 -#define EX_OPERAND 4 +typedef enum { + EX_OP=0, + EX_VALUE, + EX_LINK, + EX_OPERAND +} ASTTYPE; /* expression tree */ -typedef struct ast { - - unsigned type :3 ; - unsigned decorated :1 ; - unsigned hasVargs :1 ; - unsigned isError :1 ; - unsigned funcName :1 ; - unsigned rvalue :1 ; - unsigned lvalue :1 ; - unsigned initMode :1 ; - int level ; /* level for expr */ - int block ; /* block number */ +typedef struct ast + { + + ASTTYPE type; + unsigned decorated:1; + unsigned isError:1; + unsigned funcName:1; + unsigned rvalue:1; + unsigned lvalue:1; + unsigned initMode:1; + int level; /* level for expr */ + int block; /* block number */ + int seqPoint; /* sequence point */ /* union of values expression can have */ - union { - value *val ; /* value if type = EX_VALUE */ - sym_link *lnk ; /* sym_link * if type= EX_LINK */ - struct operand *oprnd; /* used only for side effecting function calls */ - unsigned stmnt ; /* statement if type=EX_STMNT */ - unsigned op ; /* operator if type= EX_OP */ - } opval ; - + union + { + value *val; /* value if type = EX_VALUE */ + sym_link *lnk; /* sym_link * if type= EX_LINK */ + struct operand *oprnd; /* used only for side effecting function calls */ + unsigned op; /* operator if type= EX_OP */ + } + opval; + /* union for special processing */ - union { - char *inlineasm ; /* pointer to inline assembler code */ - symbol *sym ; /* if block then -> symbols */ - value *args ; /* if function then args */ + union + { + char *inlineasm; /* pointer to inline assembler code */ + literalList *constlist; /* init list for array initializer. */ + symbol *sym; /* if block then -> symbols */ + value *args; /* if function then args */ /* if switch then switch values */ - struct { - value *swVals ; /* switch comparison values */ - int swDefault ; /* default if present */ - int swNum ; /* switch number */ - } switchVals ; + struct + { + value *swVals; /* switch comparison values */ + int swDefault; /* default if present */ + int swNum; /* switch number */ + } + switchVals; /* if for then for values */ - struct { - struct ast *initExpr ; /* init portion */ - struct ast *condExpr ; /* conditional portion */ - struct ast *loopExpr ; /* iteration portion */ - symbol *trueLabel; /* entry point into body */ - symbol *falseLabel; /* exit point */ - symbol *continueLabel; /* conditional check */ - symbol *condLabel; /* conditional label */ - } forVals ; - unsigned literalFromCast; /* true if this is an EX_VALUE of LITERAL - * type resulting from a typecast. - */ - } values ; - - int lineno ; /* source file line number */ - char *filename ; /* filename of the source file */ - - sym_link *ftype ; /* start of type chain for this subtree */ - sym_link *etype ; /* end of type chain for this subtree */ - - symbol *argSym ; /* argument symbols */ - value *args ; /* args of a function */ - struct ast *left ; /* pointer to left tree */ - struct ast *right; /* pointer to right tree */ - symbol *trueLabel ; /* if statement trueLabel */ - symbol *falseLabel ; /* if statement falseLabel */ -} ast ; + struct + { + struct ast *initExpr; /* init portion */ + struct ast *condExpr; /* conditional portion */ + struct ast *loopExpr; /* iteration portion */ + symbol *trueLabel; /* entry point into body */ + symbol *falseLabel; /* exit point */ + symbol *continueLabel; /* conditional check */ + symbol *condLabel; /* conditional label */ + } + forVals; + unsigned literalFromCast; /* true if this is an EX_VALUE of LITERAL + * type resulting from a typecast. + */ + int argreg; /* argreg number when operand type == EX_OPERAND */ + } + values; + + int lineno; /* source file line number */ + char *filename; /* filename of the source file */ + + sym_link *ftype; /* start of type chain for this subtree */ + sym_link *etype; /* end of type chain for this subtree */ + + struct ast *left; /* pointer to left tree */ + struct ast *right; /* pointer to right tree */ + symbol *trueLabel; /* if statement trueLabel */ + symbol *falseLabel; /* if statement falseLabel */ + } +ast; /* easy access macros */ #define IS_AST_OP(x) (x && x->type == EX_OP) +#define IS_CALLOP(x) (IS_AST_OP(x) && x->opval.op == CALL) #define IS_BITOR(x) (IS_AST_OP(x) && x->opval.op == '|') #define IS_BITAND(x) (IS_AST_OP(x) && x->opval.op == '&' && \ x->left && x->right ) @@ -108,7 +120,7 @@ typedef struct ast { #define IS_LEFT_OP(x) (IS_AST_OP(x) && x->opval.op == LEFT_OP) #define IS_RIGHT_OP(x) (IS_AST_OP(x) && x->opval.op == RIGHT_OP) #define IS_AST_VALUE(x) (x && x->type == EX_VALUE && x->opval.val) -#define IS_AST_LINK(x) (x->type == EX_LINK) +#define IS_AST_LINK(x) (x->type == EX_LINK) #define IS_AST_NOT_OPER(x) (x && IS_AST_OP(x) && x->opval.op == '!') #define IS_ARRAY_OP(x) (IS_AST_OP(x) && x->opval.op == '[') #define IS_COMPARE_OP(x) (IS_AST_OP(x) && \ @@ -119,6 +131,8 @@ typedef struct ast { x->opval.op == EQ_OP || \ x->opval.op == NE_OP )) #define IS_CAST_OP(x) (IS_AST_OP(x) && x->opval.op == CAST) +#define IS_TERNARY_OP(x) (IS_AST_OP(x) && x->opval.op == '?') +#define IS_COLON_OP(x) (IS_AST_OP(x) && x->opval.op == ':') #define IS_ADDRESS_OF_OP(x) (IS_AST_OP(x) && \ x->opval.op == '&' && \ x->right == NULL ) @@ -130,6 +144,9 @@ typedef struct ast { #define AST_VALUE(x) (x->opval.val) #define AST_VALUES(x,y) (x->values.y) #define AST_FOR(x,y) x->values.forVals.y +#define AST_ARGREG(x) x->values.argreg + +#define IS_AST_PARAM(x) (IS_AST_OP(x) && x->opval.op == PARAM) #define CAN_EVAL(x) ( x == '[' || x == '.' || x == PTR_OP || \ x == '&' || x == '|' || x == '^' || x == '*' || \ @@ -154,43 +171,53 @@ typedef struct ast { #define IS_DEREF_OP(x) (( x->opval.op == '*' && x->right == NULL) || x->opval.op == '.') /* forward declarations for global variables */ -extern ast *staticAutos ; +extern ast *staticAutos; extern FILE *codeOutFile; +extern struct memmap *GcurMemmap; /* forward definitions for functions */ -ast* newAst_VALUE(value*val); -ast* newAst_OP (unsigned op); -ast* newAst_LINK (sym_link*val); -ast* newAst_STMNT(unsigned val); - -void initAst ( ); -ast *newNode (long ,ast * ,ast * ); -ast *copyAst (ast * ); -value *sizeofOp (sym_link * ); -value *evalStmnt (ast * ); -ast *createFunction(symbol *,ast * ); -ast *createBlock (symbol *,ast * ); -ast *createLabel (symbol *,ast * ); -ast *createCase (ast *,ast *,ast *); -ast *createDefault (ast *,ast * ); -ast *optimizeCompare (ast * ); -ast *forLoopOptForm( ast * ); -ast *argAst ( ast * ); -ast *resolveSymbols (ast *) ; -ast *decorateType (ast *) ; -ast *createWhile (symbol *, symbol *, symbol *, ast *, ast *); -ast *createIf (ast *, ast *, ast *); -ast *createDo (symbol *,symbol *,symbol *,ast *,ast *); -ast *createFor (symbol *,symbol *,symbol *,symbol *,ast *,ast *,ast *, ast *); -void eval2icode (ast *); -value *constExprValue (ast *,int); -symbol *funcOfType (char *,sym_link *,sym_link *,int,int); -ast *initAggregates ( symbol *,initList *, ast *); -bool hasSEFcalls ( ast *); -void addSymToBlock (symbol *, ast *) ; +ast *newAst_VALUE (value * val); +ast *newAst_OP (unsigned op); +ast *newAst_LINK (sym_link * val); + +void initAst (); +ast *newNode (long, ast *, ast *); +ast *copyAst (ast *); +ast *removeIncDecOps (ast *); +ast *removePreIncDecOps (ast *); +ast *removePostIncDecOps (ast *); +value *sizeofOp (sym_link *); +value *evalStmnt (ast *); +ast *createFunction (symbol *, ast *); +ast *createBlock (symbol *, ast *); +ast *createLabel (symbol *, ast *); +ast *createCase (ast *, ast *, ast *); +ast *createDefault (ast *, ast *, ast *); +ast *forLoopOptForm (ast *); +ast *argAst (ast *); +ast *resolveSymbols (ast *); +ast *decorateType (ast *, RESULT_TYPE); +ast *createWhile (symbol *, symbol *, symbol *, ast *, ast *); +ast *createIf (ast *, ast *, ast *); +ast *createDo (symbol *, symbol *, symbol *, ast *, ast *); +ast *createFor (symbol *, symbol *, symbol *, symbol *, ast *, ast *, ast *, ast *); +void eval2icode (ast *); +value *constExprValue (ast *, int); +bool constExprTree (ast *); +int setAstLineno (ast *, int); +symbol *funcOfType (char *, sym_link *, sym_link *, int, int); +symbol * funcOfTypeVarg (char *, char * , int , char **); +ast *initAggregates (symbol *, initList *, ast *); +bool hasSEFcalls (ast *); +void addSymToBlock (symbol *, ast *); +void freeStringSymbol(symbol *); +DEFSETFUNC(resetParmKey); +int astErrors(ast *); +RESULT_TYPE getResultTypeFromType (sym_link *); // exported variables extern set *operKeyReset; extern int noAlloc; +extern int inInitMode; -#endif +#endif