X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCsymt.h;h=4e3340dbe81dd59b997d165ee0b02e0d6fd3ae30;hb=1e1c6a588fe0a45598443b59686c6f6cd0f84cca;hp=c24d6d99304fc7a7fc926ce1178bce390fe2d225;hpb=3d82fa71091d058893f8de85ffb2560a653be90e;p=fw%2Fsdcc diff --git a/src/SDCCsymt.h b/src/SDCCsymt.h index c24d6d99..4e3340db 100644 --- a/src/SDCCsymt.h +++ b/src/SDCCsymt.h @@ -58,13 +58,11 @@ enum { TYPEOF_EEPPOINTER }; -// values for first byte of generic pointer. -#define GPTYPE_NEAR 0 -#define GPTYPE_FAR 1 -#define GPTYPE_CODE 2 -#define GPTYPE_XSTACK 3 -#define GPTYPE_GPTR 4 // Never used? -#define GPTYPE_IDATA 5 +// values for first byte (or 3 most significant bits) of generic pointer. +#define GPTYPE_FAR 0x00 +#define GPTYPE_NEAR 0x40 +#define GPTYPE_XSTACK 0x60 +#define GPTYPE_CODE 0x80 #define HASHTAB_SIZE 256 @@ -152,13 +150,13 @@ typedef struct specifier int argreg; /* reg no for regparm */ union { /* Values if constant or enum */ - TYPE_WORD v_int; /* 2 bytes: int and char values */ - char *v_char; /* character string */ - TYPE_UWORD v_uint; /* 2 bytes: unsigned int const value */ - TYPE_DWORD v_long; /* 4 bytes: long constant value */ - TYPE_UDWORD v_ulong; /* 4 bytes: unsigned long constant val */ + TYPE_WORD v_int; /* 2 bytes: int and char values */ + char *v_char; /* character string */ + TYPE_UWORD v_uint; /* 2 bytes: unsigned int const value */ + TYPE_DWORD v_long; /* 4 bytes: long constant value */ + TYPE_UDWORD v_ulong; /* 4 bytes: unsigned long constant value */ double v_float; /* floating point constant value */ - struct symbol *v_enum; /* ptr 2 enum_list if enum==1 */ + struct symbol *v_enum; /* ptr to enum_list if enum==1 */ } const_val; struct structdef *v_struct; /* structure pointer */ @@ -218,13 +216,15 @@ typedef struct sym_link unsigned reent:1; /* function is reentrant */ unsigned naked:1; /* naked function */ + unsigned shadowregs:1; /* function uses shadow registers (pic16 port) */ + unsigned wparam:1; /* first byte of arguments is passed via WREG (pic16 port) */ unsigned nonbanked:1; /* function has the nonbanked attribute */ unsigned banked:1; /* function has the banked attribute */ unsigned critical:1; /* critical function */ - unsigned intrtn:1; /* this is an interrupt routin */ + unsigned intrtn:1; /* this is an interrupt routine */ unsigned rbank:1; /* seperate register bank */ unsigned intno; /* 1=Interrupt svc routine */ - unsigned regbank; /* register bank 2b used */ + short regbank; /* register bank 2b used */ unsigned builtin; /* is a builtin function */ unsigned javaNative; /* is a JavaNative Function (TININative ONLY) */ unsigned overlay; /* force parameters & locals into overlay segment */ @@ -279,7 +279,7 @@ typedef struct symbol unsigned noSpilLoc:1; /* cannot be assigned a spil location */ unsigned isstrlit; /* is a string literal and it's usage count */ unsigned accuse; /* can be left in the accumulator - On the Z80 accuse is devided into + On the Z80 accuse is divided into ACCUSE_A and ACCUSE_HL as the idea is quite similar. */ @@ -295,7 +295,7 @@ typedef struct symbol struct regs *regs[4]; /* can have at the most 4 registers */ struct asmop *aop; /* asmoperand for this symbol */ struct iCode *fuse; /* furthest use */ - struct iCode *rematiCode; /* rematerialse with which instruction */ + struct iCode *rematiCode; /* rematerialise with which instruction */ struct operand *reqv; /* register equivalent of a local variable */ struct symbol *prereqv; /* symbol before register equiv. substituion */ struct symbol *psbase; /* if pseudo symbol, the symbol it is based on */ @@ -311,8 +311,8 @@ typedef struct symbol int lineDef; /* defined line number */ char *fileDef; /* defined filename */ int lastLine; /* for functions the last line */ - struct sym_link *type; /* 1st link to declator chain */ - struct sym_link *etype; /* last link to declarator chn */ + struct sym_link *type; /* 1st link to declarator chain */ + struct sym_link *etype; /* last link to declarator chain */ struct symbol *next; /* crosslink to next symbol */ struct symbol *localof; /* local variable of which function */ struct initList *ival; /* ptr to initializer if any */ @@ -360,6 +360,10 @@ extern sym_link *validateLink(sym_link *l, #define FUNC_ISREENT(x) (x->funcAttrs.reent) #define IFFUNC_ISREENT(x) (IS_FUNC(x) && FUNC_ISREENT(x)) +#define FUNC_ISSHADOWREGS(x) (x->funcAttrs.shadowregs) +#define IFFUNC_ISSHADOWREGS(x) (IS_FUNC(x) && FUNC_ISSHADOWREGS(x)) +#define FUNC_ISWPARAM(x) (x->funcAttrs.wparam) +#define IFFUNC_ISWPARAM(x) (IS_FUNC(x) && FUNC_ISWPARAM(x)) #define FUNC_ISNAKED(x) (x->funcAttrs.naked) #define IFFUNC_ISNAKED(x) (IS_FUNC(x) && FUNC_ISNAKED(x)) #define FUNC_NONBANKED(x) (x->funcAttrs.nonbanked) @@ -376,8 +380,9 @@ extern sym_link *validateLink(sym_link *l, #define IFFUNC_ISOVERLAY(x) (IS_FUNC(x) && FUNC_ISOVERLAY(x)) #define IFFUNC_ISBANKEDCALL(x) (!IFFUNC_NONBANKED(x) && \ - (options.model == MODEL_LARGE || \ - options.model == MODEL_MEDIUM || \ + (options.model == MODEL_HUGE || \ + ((options.model == MODEL_LARGE || options.model == MODEL_MEDIUM) && \ + (TARGET_IS_Z80 || TARGET_IS_GBZ80)) || \ IFFUNC_BANKED(x))) #define SPEC_NOUN(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s.noun @@ -428,6 +433,7 @@ extern sym_link *validateLink(sym_link *l, #define IS_FARPTR(x) (IS_DECL(x) && DCL_TYPE(x) == FPOINTER) #define IS_CODEPTR(x) (IS_DECL(x) && DCL_TYPE(x) == CPOINTER) #define IS_GENPTR(x) (IS_DECL(x) && DCL_TYPE(x) == GPOINTER) +#define IS_FUNCPTR(x) (IS_DECL(x) && (DCL_TYPE(x) == CPOINTER || DCL_TYPE(x) == GPOINTER) && IS_FUNC(x->next)) #define IS_FUNC(x) (IS_DECL(x) && DCL_TYPE(x) == FUNCTION) #define IS_LONG(x) (IS_SPEC(x) && x->select.s._long) #define IS_UNSIGNED(x) (IS_SPEC(x) && x->select.s._unsigned) @@ -511,7 +517,6 @@ extern sym_link *floatType; typedef enum { RESULT_TYPE_NONE = 0, /* operands will be promoted to int */ - RESULT_CHECK = 0, /* TODO: replace all occurences with the appropriate type and remove me */ RESULT_TYPE_BIT, RESULT_TYPE_CHAR, RESULT_TYPE_INT, @@ -556,7 +561,7 @@ int checkFunction (symbol *, symbol *); void cleanUpLevel (bucket **, int); void cleanUpBlock (bucket **, int); int funcInChain (sym_link *); -void addSymChain (symbol *); +void addSymChain (symbol **); sym_link *structElemType (sym_link *, value *); symbol *getStructElement (structdef *, symbol *); sym_link *computeType (sym_link *, sym_link *, RESULT_TYPE, int);