From: johanknol Date: Fri, 14 Mar 2003 10:40:18 +0000 (+0000) Subject: catch DECLARATOR / SPECIFIER abuse X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=20d011f428a26a3ae0546e7dbc0c1f89ded856ce;p=fw%2Fsdcc catch DECLARATOR / SPECIFIER abuse git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2388 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/src/SDCC.y b/src/SDCC.y index 16839f81..c8515cd0 100644 --- a/src/SDCC.y +++ b/src/SDCC.y @@ -177,39 +177,31 @@ function_attribute function_attributes : USING CONSTANT { - $$ = newLink() ; - $$->class = SPECIFIER ; + $$ = newLink(SPECIFIER) ; FUNC_REGBANK($$) = (int) floatFromVal($2); } - | REENTRANT { $$ = newLink (); - $$->class = SPECIFIER ; + | REENTRANT { $$ = newLink (SPECIFIER); FUNC_ISREENT($$)=1; } - | CRITICAL { $$ = newLink (); - $$->class = SPECIFIER ; + | CRITICAL { $$ = newLink (SPECIFIER); FUNC_ISCRITICAL($$) = 1; } - | NAKED { $$ = newLink (); - $$->class = SPECIFIER ; + | NAKED { $$ = newLink (SPECIFIER); FUNC_ISNAKED($$)=1; } - | JAVANATIVE { $$ = newLink (); - $$->class = SPECIFIER ; + | JAVANATIVE { $$ = newLink (SPECIFIER); FUNC_ISJAVANATIVE($$)=1; } - | OVERLAY { $$ = newLink (); - $$->class = SPECIFIER ; + | OVERLAY { $$ = newLink (SPECIFIER); FUNC_ISOVERLAY($$)=1; } - | NONBANKED {$$ = newLink (); - $$->class = SPECIFIER ; + | NONBANKED {$$ = newLink (SPECIFIER); FUNC_NONBANKED($$) = 1; if (FUNC_BANKED($$)) { werror(W_BANKED_WITH_NONBANKED); } } - | BANKED {$$ = newLink (); - $$->class = SPECIFIER ; + | BANKED {$$ = newLink (SPECIFIER); FUNC_BANKED($$) = 1; if (FUNC_NONBANKED($$)) { werror(W_BANKED_WITH_NONBANKED); @@ -220,8 +212,7 @@ function_attributes } | Interrupt_storage { - $$ = newLink () ; - $$->class = SPECIFIER ; + $$ = newLink (SPECIFIER) ; FUNC_INTNO($$) = $1 ; FUNC_ISISR($$) = 1; } @@ -528,28 +519,23 @@ init_declarator storage_class_specifier : TYPEDEF { - $$ = newLink () ; - $$->class = SPECIFIER ; + $$ = newLink (SPECIFIER) ; SPEC_TYPEDEF($$) = 1 ; } | EXTERN { - $$ = newLink(); - $$->class = SPECIFIER ; + $$ = newLink(SPECIFIER); SPEC_EXTR($$) = 1 ; } | STATIC { - $$ = newLink (); - $$->class = SPECIFIER ; + $$ = newLink (SPECIFIER); SPEC_STAT($$) = 1 ; } | AUTO { - $$ = newLink () ; - $$->class = SPECIFIER ; + $$ = newLink (SPECIFIER) ; SPEC_SCLS($$) = S_AUTO ; } | REGISTER { - $$ = newLink (); - $$->class = SPECIFIER ; + $$ = newLink (SPECIFIER); SPEC_SCLS($$) = S_REGISTER ; } ; @@ -571,88 +557,71 @@ type_specifier type_specifier2 : CHAR { - $$=newLink(); - $$->class = SPECIFIER ; + $$=newLink(SPECIFIER); SPEC_NOUN($$) = V_CHAR ; } | SHORT { - $$=newLink(); - $$->class = SPECIFIER ; + $$=newLink(SPECIFIER); $$->select.s._short = 1 ; } | INT { - $$=newLink(); - $$->class = SPECIFIER ; + $$=newLink(SPECIFIER); SPEC_NOUN($$) = V_INT ; } | LONG { - $$=newLink(); - $$->class = SPECIFIER ; + $$=newLink(SPECIFIER); SPEC_LONG($$) = 1 ; } | SIGNED { - $$=newLink(); - $$->class = SPECIFIER ; + $$=newLink(SPECIFIER); $$->select.s._signed = 1; } | UNSIGNED { - $$=newLink(); - $$->class = SPECIFIER ; + $$=newLink(SPECIFIER); SPEC_USIGN($$) = 1 ; } | VOID { - $$=newLink(); - $$->class = SPECIFIER ; + $$=newLink(SPECIFIER); SPEC_NOUN($$) = V_VOID ; } | CONST { - $$=newLink(); - $$->class = SPECIFIER ; + $$=newLink(SPECIFIER); SPEC_CONST($$) = 1; } | VOLATILE { - $$=newLink(); - $$->class = SPECIFIER ; + $$=newLink(SPECIFIER); SPEC_VOLATILE($$) = 1 ; } | FLOAT { - $$=newLink(); + $$=newLink(SPECIFIER); SPEC_NOUN($$) = V_FLOAT; - $$->class = SPECIFIER ; } | XDATA { - $$ = newLink (); - $$->class = SPECIFIER ; + $$ = newLink (SPECIFIER); SPEC_SCLS($$) = S_XDATA ; } | CODE { - $$ = newLink () ; - $$->class = SPECIFIER ; + $$ = newLink (SPECIFIER) ; SPEC_SCLS($$) = S_CODE ; } | EEPROM { - $$ = newLink () ; - $$->class = SPECIFIER ; + $$ = newLink (SPECIFIER) ; SPEC_SCLS($$) = S_EEPROM ; } | DATA { - $$ = newLink (); - $$->class = SPECIFIER ; + $$ = newLink (SPECIFIER); SPEC_SCLS($$) = S_DATA ; } | IDATA { - $$ = newLink (); - $$->class = SPECIFIER ; + $$ = newLink (SPECIFIER); SPEC_SCLS($$) = S_IDATA ; } | PDATA { - $$ = newLink (); - $$->class = SPECIFIER ; + $$ = newLink (SPECIFIER); SPEC_SCLS($$) = S_PDATA ; } | BIT { - $$=newLink(); - $$->class = SPECIFIER ; + $$=newLink(SPECIFIER); SPEC_NOUN($$) = V_BIT ; SPEC_SCLS($$) = S_BIT ; SPEC_BLEN($$) = 1; @@ -677,14 +646,12 @@ type_specifier2 sfr_reg_bit : SBIT { - $$ = newLink() ; - $$->class = SPECIFIER ; + $$ = newLink(SPECIFIER) ; SPEC_NOUN($$) = V_SBIT; SPEC_SCLS($$) = S_SBIT; } | SFR { - $$ = newLink() ; - $$->class = SPECIFIER ; + $$ = newLink(SPECIFIER) ; SPEC_NOUN($$) = V_CHAR; SPEC_SCLS($$) = S_SFR ; SPEC_USIGN($$) = 1 ; @@ -702,15 +669,13 @@ struct_or_union_specifier sdef->size = compStructSize($1,sdef); /* update size of */ /* Create the specifier */ - $$ = newLink () ; - $$->class = SPECIFIER ; + $$ = newLink (SPECIFIER) ; SPEC_NOUN($$) = V_STRUCT; SPEC_STRUCT($$)= sdef ; } | struct_or_union stag { - $$ = newLink() ; - $$->class = SPECIFIER ; + $$ = newLink(SPECIFIER) ; SPEC_NOUN($$) = V_STRUCT; SPEC_STRUCT($$) = $2 ; } @@ -827,8 +792,7 @@ enum_specifier if ((csym = findSym(enumTab,$2,$2->name))) $$ = copyLinkChain(csym->type); else { - $$ = newLink() ; - $$->class = SPECIFIER ; + $$ = newLink(SPECIFIER) ; SPEC_NOUN($$) = V_INT ; } @@ -919,7 +883,7 @@ declarator2 { sym_link *p; - p = newLink (); + p = newLink (DECLARATOR); DCL_TYPE(p) = ARRAY ; DCL_ELEM(p) = 0 ; addDecl($1,0,p); @@ -934,7 +898,7 @@ declarator2 if ( SPEC_SCLS(p) != S_LITERAL) werror(E_CONST_EXPECTED) ; else { - p = newLink (); + p = newLink (DECLARATOR); DCL_TYPE(p) = ARRAY ; DCL_ELEM(p) = (int) floatFromVal(tval) ; addDecl($1,0,p); @@ -1029,7 +993,7 @@ pointer unqualified_pointer : '*' { - $$ = newLink(); + $$ = newLink(DECLARATOR); DCL_TYPE($$)=UPOINTER; } ; @@ -1123,18 +1087,18 @@ abstract_declarator abstract_declarator2 : '(' abstract_declarator ')' { $$ = $2 ; } | '[' ']' { - $$ = newLink (); + $$ = newLink (DECLARATOR); DCL_TYPE($$) = ARRAY ; DCL_ELEM($$) = 0 ; } | '[' constant_expr ']' { value *val ; - $$ = newLink (); + $$ = newLink (DECLARATOR); DCL_TYPE($$) = ARRAY ; DCL_ELEM($$) = (int) floatFromVal(val = constExprValue($2,TRUE)); } | abstract_declarator2 '[' ']' { - $$ = newLink (); + $$ = newLink (DECLARATOR); DCL_TYPE($$) = ARRAY ; DCL_ELEM($$) = 0 ; $$->next = $1 ; @@ -1142,7 +1106,7 @@ abstract_declarator2 | abstract_declarator2 '[' constant_expr ']' { value *val ; - $$ = newLink (); + $$ = newLink (DECLARATOR); DCL_TYPE($$) = ARRAY ; DCL_ELEM($$) = (int) floatFromVal(val = constExprValue($3,TRUE)); $$->next = $1 ; @@ -1151,11 +1115,11 @@ abstract_declarator2 | '(' parameter_type_list ')' { $$ = NULL;} | abstract_declarator2 '(' ')' { // $1 must be a pointer to a function - sym_link *p=newLink(); + sym_link *p=newLink(DECLARATOR); DCL_TYPE(p) = FUNCTION; if (!$1) { // ((void (code *) ()) 0) () - $1=newLink(); + $1=newLink(DECLARATOR); DCL_TYPE($1)=CPOINTER; $$ = $1; } @@ -1167,11 +1131,11 @@ abstract_declarator2 werror(E_TOO_FEW_PARMS); } else { // $1 must be a pointer to a function - sym_link *p=newLink(); + sym_link *p=newLink(DECLARATOR); DCL_TYPE(p) = FUNCTION; if (!$1) { // ((void (code *) (void)) 0) () - $1=newLink(); + $1=newLink(DECLARATOR); DCL_TYPE($1)=CPOINTER; $$ = $1; } diff --git a/src/SDCCast.c b/src/SDCCast.c index 093a9043..35d8cc82 100644 --- a/src/SDCCast.c +++ b/src/SDCCast.c @@ -448,7 +448,7 @@ resolveSymbols (ast * tree) /* mark it as returning an int */ if (tree->funcName) { - tree->opval.val->sym->type = newLink (); + tree->opval.val->sym->type = newLink (DECLARATOR); DCL_TYPE (tree->opval.val->sym->type) = FUNCTION; tree->opval.val->sym->type->next = tree->opval.val->sym->etype = newIntLink (); @@ -501,7 +501,7 @@ funcOfType (char *name, sym_link * type, sym_link * argType, sym = newSymbol (name, 0); /* setup return value */ - sym->type = newLink (); + sym->type = newLink (DECLARATOR); DCL_TYPE (sym->type) = FUNCTION; sym->type->next = copyLinkChain (type); sym->etype = getSpec (sym->type); @@ -545,7 +545,7 @@ funcOfTypeVarg (char *name, char * rtype, int nArgs , char **atypes) sym = newSymbol (name, 0); /* setup return value */ - sym->type = newLink (); + sym->type = newLink (DECLARATOR); DCL_TYPE (sym->type) = FUNCTION; sym->type->next = typeFromStr(rtype); sym->etype = getSpec (sym->type); @@ -2205,8 +2205,7 @@ decorateType (ast * tree) /*----------------------------*/ /* address of */ /*----------------------------*/ - p = newLink (); - p->class = DECLARATOR; + p = newLink (DECLARATOR); /* if bit field then error */ if (IS_BITVAR (tree->left->etype)) { @@ -2783,7 +2782,7 @@ decorateType (ast * tree) ((int)floatFromVal(valFromType(RETYPE(tree)))) !=0 ) /* special case of NULL */ { sym_link *rest = LTYPE(tree)->next; werror(W_LITERAL_GENERIC); - TTYPE(tree) = newLink(); + TTYPE(tree) = newLink(DECLARATOR); DCL_TYPE(TTYPE(tree)) = FPOINTER; TTYPE(tree)->next = rest; tree->left->opval.lnk = TTYPE(tree); diff --git a/src/SDCCglue.c b/src/SDCCglue.c index e72964cd..22af1da0 100644 --- a/src/SDCCglue.c +++ b/src/SDCCglue.c @@ -405,7 +405,7 @@ initPointer (initList * ilist, sym_link *toType) /* address of symbol */ if (IS_AST_SYM_VALUE (expr->left)) { val = copyValue (AST_VALUE (expr->left)); - val->type = newLink (); + val->type = newLink (DECLARATOR); if (SPEC_SCLS (expr->left->etype) == S_CODE) { DCL_TYPE (val->type) = CPOINTER; } @@ -463,7 +463,7 @@ initPointer (initList * ilist, sym_link *toType) IS_ARRAY(expr->right->ftype)) { val = copyValue (AST_VALUE (expr->right)); - val->type = newLink (); + val->type = newLink (DECLARATOR); if (SPEC_SCLS (expr->right->etype) == S_CODE) { DCL_TYPE (val->type) = CPOINTER; } @@ -808,8 +808,11 @@ printIvalArray (symbol * sym, sym_link * type, initList * ilist, iloop = ilist->init.deep; lcnt = DCL_ELEM (type); - for (last_type = type->next; last_type && DCL_ELEM (last_type); last_type = last_type->next) + for (last_type = type->next; + last_type && IS_DECL(last_type) && DCL_ELEM (last_type); + last_type = last_type->next) { lcnt *= DCL_ELEM (last_type); + } for (;;) { diff --git a/src/SDCCicode.c b/src/SDCCicode.c index 32f913ae..49d1aaa4 100644 --- a/src/SDCCicode.c +++ b/src/SDCCicode.c @@ -2118,7 +2118,7 @@ aggrToPtr (sym_link * type, bool force) return type; etype = getSpec (type); - ptype = newLink (); + ptype = newLink (DECLARATOR); ptype->next = type; @@ -2451,8 +2451,7 @@ geniCodeAddressOf (operand * op) /* return op; */ /* } */ - p = newLink (); - p->class = DECLARATOR; + p = newLink (DECLARATOR); #ifdef JWK /* set the pointer depending on the storage class */ diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index 7e5e40a5..a2c11a2a 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -298,11 +298,12 @@ newSymbol (char *name, int scope) /* newLink - creates a new link (declarator,specifier) */ /*------------------------------------------------------------------*/ sym_link * -newLink () +newLink (SYM_LINK_CLASS select) { sym_link *p; p = Safe_alloc ( sizeof (sym_link)); + p->class=select; return p; } @@ -419,7 +420,7 @@ addDecl (symbol * sym, int type, sym_link * p) } else { - head = tail = newLink (); + head = tail = newLink (DECLARATOR); DCL_TYPE (head) = type; } @@ -468,8 +469,7 @@ addDecl (symbol * sym, int type, sym_link * p) if (!IS_SPEC (sym->etype)) { - sym->etype = sym->etype->next = newLink (); - sym->etype->class = SPECIFIER; + sym->etype = sym->etype->next = newLink (SPECIFIER); } DCL_PTR_CONST (sym->type) = SPEC_CONST (DCL_TSPEC (p)); @@ -682,8 +682,7 @@ newCharLink () { sym_link *p; - p = newLink (); - p->class = SPECIFIER; + p = newLink (SPECIFIER); SPEC_NOUN (p) = V_CHAR; return p; @@ -697,8 +696,7 @@ newFloatLink () { sym_link *p; - p = newLink (); - p->class = SPECIFIER; + p = newLink (SPECIFIER); SPEC_NOUN (p) = V_FLOAT; return p; @@ -712,8 +710,7 @@ newLongLink () { sym_link *p; - p = newLink (); - p->class = SPECIFIER; + p = newLink (SPECIFIER); SPEC_NOUN (p) = V_INT; SPEC_LONG (p) = 1; @@ -728,8 +725,7 @@ newIntLink () { sym_link *p; - p = newLink (); - p->class = SPECIFIER; + p = newLink (SPECIFIER); SPEC_NOUN (p) = V_INT; return p; @@ -1330,11 +1326,11 @@ copyLinkChain (sym_link * p) sym_link *head, *curr, *loop; curr = p; - head = loop = (curr ? newLink () : (void *) NULL); + head = loop = (curr ? newLink (p->class) : (void *) NULL); while (curr) { memcpy (loop, curr, sizeof (sym_link)); /* copy it */ - loop->next = (curr->next ? newLink () : (void *) NULL); + loop->next = (curr->next ? newLink (curr->next->class) : (void *) NULL); loop = loop->next; curr = curr->next; } @@ -1572,7 +1568,7 @@ aggregateToPointer (value * val) sym_link *p = val->type; werror (W_STRUCT_AS_ARG, val->name); - val->type = newLink (); + val->type = newLink (DECLARATOR); val->type->next = p; } @@ -1879,8 +1875,10 @@ processFuncArgs (symbol * func) val->sym->etype = getSpec (val->sym->type); val->sym->_isparm = 1; strncpyz (val->sym->rname, val->name, sizeof(val->sym->rname)); - SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) = - SPEC_STAT (func->etype); + if (IS_SPEC(func->etype)) { + SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) = + SPEC_STAT (func->etype); + } addSymChain (val->sym); } @@ -1892,8 +1890,10 @@ processFuncArgs (symbol * func) val->sym->_isparm = 1; SPEC_OCLS (val->etype) = SPEC_OCLS (val->sym->etype) = (options.model != MODEL_SMALL ? xdata : data); - SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) = - SPEC_STAT (func->etype); + if (IS_SPEC(func->etype)) { + SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) = + SPEC_STAT (func->etype); + } } if (!isinSet(operKeyReset, val->sym)) { addSet (&operKeyReset, val->sym); @@ -2373,7 +2373,7 @@ _mangleFunctionName(char *in) /*-----------------------------------------------------------------*/ sym_link *typeFromStr (char *s) { - sym_link *r = newLink(); + sym_link *r = newLink(DECLARATOR); int usign = 0; do { @@ -2415,10 +2415,9 @@ sym_link *typeFromStr (char *s) case 'd': case 'F': assert(*(s+1)=='*'); - nr = newLink(); + nr = newLink(DECLARATOR); nr->next = r; r = nr; - r->class = DECLARATOR ; switch (*s) { case 'g': DCL_TYPE(r) = GPOINTER; @@ -2434,10 +2433,9 @@ sym_link *typeFromStr (char *s) break; case 'F': DCL_TYPE(r) = FUNCTION; - nr = newLink(); + nr = newLink(DECLARATOR); nr->next = r; r = nr; - r->class = DECLARATOR ; DCL_TYPE(r) = CPOINTER; break; } @@ -2594,3 +2592,23 @@ void initBuiltIns() FUNC_ISREENT(sym->type) = 0; /* can never be reentrant */ } } + +sym_link *validateLink(sym_link *l, + const char *macro, + const char *args, + const char select, + const char *file, + unsigned line) +{ + if (l && l->class==select) + { + return l; + } + fprintf(stderr, + "Internal error: validateLink failed in %s(%s) @ %s:%u:" + " expected %s, got %s\n", + macro, args, file, line, + DECLSPEC2TXT(select), l ? DECLSPEC2TXT(l->class) : "null-link"); + exit(-1); + return l; // never reached, makes compiler happy. +} diff --git a/src/SDCCsymt.h b/src/SDCCsymt.h index f49036fa..d13e58ed 100644 --- a/src/SDCCsymt.h +++ b/src/SDCCsymt.h @@ -183,12 +183,15 @@ typedef struct declarator } declarator; -#define DECLARATOR 0 -#define SPECIFIER 1 +typedef enum { + DECLARATOR=1, + SPECIFIER +} SYM_LINK_CLASS; +#define DECLSPEC2TXT(select) (select==DECLARATOR?"DECLARATOR":select==SPECIFIER?"SPECIFIER":"UNKNOW") typedef struct sym_link { - unsigned class:1; /* DECLARATOR or SPECIFIER */ + SYM_LINK_CLASS class; /* DECLARATOR or SPECIFIER */ unsigned tdef:1; /* current link created by */ /* typedef if this flag is set */ union @@ -313,12 +316,18 @@ typedef struct symbol } symbol; +extern sym_link *validateLink(sym_link *l, + const char *macro, + const char *args, + const char select, + const char *file, + unsigned line); /* Easy Access Macros */ -#define DCL_TYPE(l) l->select.d.dcl_type -#define DCL_ELEM(l) l->select.d.num_elem -#define DCL_PTR_CONST(l) l->select.d.ptr_const -#define DCL_PTR_VOLATILE(l) l->select.d.ptr_volatile -#define DCL_TSPEC(l) l->select.d.tspec +#define DCL_TYPE(l) validateLink(l, "DCL_TYPE", #l, DECLARATOR, __FILE__, __LINE__)->select.d.dcl_type +#define DCL_ELEM(l) validateLink(l, "DCL_ELEM", #l, DECLARATOR, __FILE__, __LINE__)->select.d.num_elem +#define DCL_PTR_CONST(l) validateLink(l, "DCL_PTR_CONST", #l, DECLARATOR, __FILE__, __LINE__)->select.d.ptr_const +#define DCL_PTR_VOLATILE(l) validateLink(l, "DCL_PTR_VOLATILE", #l, DECLARATOR, __FILE__, __LINE__)->select.d.ptr_volatile +#define DCL_TSPEC(l) validateLink(l, "DCL_TSPEC", #l, DECLARATOR, __FILE__, __LINE__)->select.d.tspec #define FUNC_DEBUG //assert(IS_FUNC(x)); #define FUNC_HASVARARGS(x) (x->funcAttrs.hasVargs) @@ -362,35 +371,35 @@ symbol; options.model == MODEL_MEDIUM || \ IFFUNC_BANKED(x))) -#define SPEC_NOUN(x) x->select.s.noun -#define SPEC_LONG(x) x->select.s._long -#define SPEC_USIGN(x) x->select.s._unsigned -#define SPEC_SCLS(x) x->select.s.sclass -#define SPEC_ENUM(x) x->select.s._isenum -#define SPEC_OCLS(x) x->select.s.oclass -#define SPEC_STAT(x) x->select.s._static -#define SPEC_EXTR(x) x->select.s._extern -#define SPEC_CODE(x) x->select.s._codesg -#define SPEC_ABSA(x) x->select.s._absadr -#define SPEC_BANK(x) x->select.s._regbank -#define SPEC_ADDR(x) x->select.s._addr -#define SPEC_STAK(x) x->select.s._stack -#define SPEC_CVAL(x) x->select.s.const_val -#define SPEC_BSTR(x) x->select.s._bitStart -#define SPEC_BLEN(x) x->select.s._bitLength +#define SPEC_NOUN(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s.noun +#define SPEC_LONG(x) validateLink(x, "SPEC_LONG", #x, SPECIFIER, __FILE__, __LINE__)->select.s._long +#define SPEC_USIGN(x) validateLink(x, "SPEC_USIGN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._unsigned +#define SPEC_SCLS(x) validateLink(x, "SPEC_SCLS", #x, SPECIFIER, __FILE__, __LINE__)->select.s.sclass +#define SPEC_ENUM(x) validateLink(x, "SPEC_ENUM", #x, SPECIFIER, __FILE__, __LINE__)->select.s._isenum +#define SPEC_OCLS(x) validateLink(x, "SPEC_OCLS", #x, SPECIFIER, __FILE__, __LINE__)->select.s.oclass +#define SPEC_STAT(x) validateLink(x, "SPEC_STAT", #x, SPECIFIER, __FILE__, __LINE__)->select.s._static +#define SPEC_EXTR(x) validateLink(x, "SPEC_EXTR", #x, SPECIFIER, __FILE__, __LINE__)->select.s._extern +#define SPEC_CODE(x) validateLink(x, "SPEC_CODE", #x, SPECIFIER, __FILE__, __LINE__)->select.s._codesg +#define SPEC_ABSA(x) validateLink(x, "SPEC_ABSA", #x, SPECIFIER, __FILE__, __LINE__)->select.s._absadr +#define SPEC_BANK(x) validateLink(x, "SPEC_BANK", #x, SPECIFIER, __FILE__, __LINE__)->select.s._regbank +#define SPEC_ADDR(x) validateLink(x, "SPEC_ADDR", #x, SPECIFIER, __FILE__, __LINE__)->select.s._addr +#define SPEC_STAK(x) validateLink(x, "SPEC_STAK", #x, SPECIFIER, __FILE__, __LINE__)->select.s._stack +#define SPEC_CVAL(x) validateLink(x, "SPEC_CVAL", #x, SPECIFIER, __FILE__, __LINE__)->select.s.const_val +#define SPEC_BSTR(x) validateLink(x, "SPEC_BSTR", #x, SPECIFIER, __FILE__, __LINE__)->select.s._bitStart +#define SPEC_BLEN(x) validateLink(x, "SPEC_BLEN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._bitLength /* Sleaze: SPEC_ISR_SAVED_BANKS is only used on * function type symbols, which obviously cannot * be of BIT type. Therefore, we recycle the * _bitStart field instead of defining a new field. */ -#define SPEC_ISR_SAVED_BANKS(x) x->select.s._bitStart -#define SPEC_VOLATILE(x) x->select.s._volatile -#define SPEC_CONST(x) x->select.s._const -#define SPEC_STRUCT(x) x->select.s.v_struct -#define SPEC_TYPEDEF(x) x->select.s._typedef -#define SPEC_REGPARM(x) x->select.s._isregparm -#define SPEC_ARGREG(x) x->select.s.argreg +#define SPEC_ISR_SAVED_BANKS(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._bitStart +#define SPEC_VOLATILE(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._volatile +#define SPEC_CONST(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._const +#define SPEC_STRUCT(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s.v_struct +#define SPEC_TYPEDEF(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._typedef +#define SPEC_REGPARM(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._isregparm +#define SPEC_ARGREG(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s.argreg /* type check macros */ #define IS_DECL(x) ( x && x->class == DECLARATOR ) @@ -415,7 +424,7 @@ symbol; #define IS_TYPEDEF(x)(IS_SPEC(x) && x->select.s._typedef) #define IS_CONSTANT(x) (!x ? 0 : \ IS_SPEC(x) ? \ - x->select.s._const == 1 : \ + x->select.s._const : \ x->select.d.ptr_const) #define IS_STRUCT(x) (IS_SPEC(x) && x->select.s.noun == V_STRUCT) #define IS_ABSOLUTE(x) (IS_SPEC(x) && x->select.s._absadr ) @@ -485,7 +494,7 @@ extern sym_link *floatType; /* forward definitions for the symbol table related functions */ void initSymt (); symbol *newSymbol (char *, int); -sym_link *newLink (); +sym_link *newLink (SYM_LINK_CLASS); sym_link *newFloatLink (); structdef *newStruct (char *); void addDecl (symbol *, int, sym_link *); diff --git a/src/SDCCval.c b/src/SDCCval.c index b2a98996..687a2a3f 100644 --- a/src/SDCCval.c +++ b/src/SDCCval.c @@ -403,8 +403,7 @@ constFloatVal (char *s) return constVal ("0"); } - val->type = val->etype = newLink (); - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); SPEC_NOUN (val->type) = V_FLOAT; SPEC_SCLS (val->type) = S_LITERAL; SPEC_CVAL (val->type).v_float = sval; @@ -425,8 +424,7 @@ value *constVal (char *s) val = newValue (); /* alloc space for value */ - val->type = val->etype = newLink (); /* create the spcifier */ - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); /* create the spcifier */ SPEC_SCLS (val->type) = S_LITERAL; // let's start with an unsigned char SPEC_NOUN (val->type) = V_CHAR; @@ -665,10 +663,9 @@ strVal (char *s) val = newValue (); /* get a new one */ /* get a declarator */ - val->type = newLink (); + val->type = newLink (DECLARATOR); DCL_TYPE (val->type) = ARRAY; - val->type->next = val->etype = newLink (); - val->etype->class = SPECIFIER; + val->type->next = val->etype = newLink (SPECIFIER); SPEC_NOUN (val->etype) = V_CHAR; SPEC_SCLS (val->etype) = S_LITERAL; @@ -776,8 +773,7 @@ charVal (char *s) val = newValue (); - val->type = val->etype = newLink (); - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); SPEC_NOUN (val->type) = V_CHAR; SPEC_USIGN(val->type) = 1; SPEC_SCLS (val->type) = S_LITERAL; @@ -1018,8 +1014,7 @@ valMult (value * lval, value * rval) /* create a new value */ val = newValue (); - val->type = val->etype = newLink (); - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); SPEC_NOUN (val->type) = (IS_FLOAT (lval->etype) || IS_FLOAT (rval->etype) ? V_FLOAT : V_INT); SPEC_SCLS (val->type) = S_LITERAL; /* will remain literal */ @@ -1059,8 +1054,7 @@ valDiv (value * lval, value * rval) /* create a new value */ val = newValue (); - val->type = val->etype = newLink(); - val->type->class = SPECIFIER; + val->type = val->etype = newLink(SPECIFIER); SPEC_NOUN (val->type) = (IS_FLOAT (lval->etype) || IS_FLOAT (rval->etype) ? V_FLOAT : V_INT); SPEC_SCLS (val->etype) = S_LITERAL; @@ -1105,8 +1099,7 @@ valMod (value * lval, value * rval) /* create a new value */ val = newValue (); - val->type = val->etype = newLink (); - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); SPEC_NOUN (val->type) = V_INT; /* type is int */ SPEC_SCLS (val->type) = S_LITERAL; /* will remain literal */ SPEC_USIGN (val->type) = (SPEC_USIGN (lval->etype) & SPEC_USIGN (rval->etype)); @@ -1145,8 +1138,7 @@ valPlus (value * lval, value * rval) /* create a new value */ val = newValue (); - val->type = val->etype = newLink (); - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); SPEC_NOUN (val->type) = (IS_FLOAT (lval->etype) || IS_FLOAT (rval->etype) ? V_FLOAT : V_INT); SPEC_SCLS (val->type) = S_LITERAL; /* will remain literal */ @@ -1184,8 +1176,7 @@ valMinus (value * lval, value * rval) /* create a new value */ val = newValue (); - val->type = val->etype = newLink (); - val->type->class = SPECIFIER; + val->type = val->etype = newLink (SPECIFIER); SPEC_NOUN (val->type) = (IS_FLOAT (lval->etype) || IS_FLOAT (rval->etype) ? V_FLOAT : V_INT); SPEC_SCLS (val->type) = S_LITERAL; /* will remain literal */ @@ -1542,7 +1533,7 @@ valForArray (ast * arrExpr) SNPRINTF (val->name, sizeof(val->name), "(%s + %d)", buffer, (int) AST_LIT_VALUE (arrExpr->right) * size); - val->type = newLink (); + val->type = newLink (DECLARATOR); if (SPEC_SCLS (arrExpr->left->etype) == S_CODE) { DCL_TYPE (val->type) = CPOINTER; @@ -1612,7 +1603,7 @@ valForStructElem (ast * structT, ast * elemT) SNPRINTF (val->name, sizeof(val->name), "(%s + %d)", buffer, (int) sym->offset); - val->type = newLink (); + val->type = newLink (DECLARATOR); if (SPEC_SCLS (structT->etype) == S_CODE) { DCL_TYPE (val->type) = CPOINTER; diff --git a/src/ds390/ralloc.c b/src/ds390/ralloc.c index c323459a..d6206f52 100644 --- a/src/ds390/ralloc.c +++ b/src/ds390/ralloc.c @@ -2628,6 +2628,7 @@ packForPush (iCode * ic, eBBlock * ebp) if (bitVectBitValue(dbv,lic->key)) return ; } /* make sure they have the same type */ + if (IS_SPEC(operandType(IC_LEFT(ic)))) { sym_link *itype=operandType(IC_LEFT(ic)); sym_link *ditype=operandType(IC_RIGHT(dic)); diff --git a/src/mcs51/ralloc.c b/src/mcs51/ralloc.c index 82bda5a5..8ecb55b3 100644 --- a/src/mcs51/ralloc.c +++ b/src/mcs51/ralloc.c @@ -2503,6 +2503,7 @@ packForPush (iCode * ic, eBBlock ** ebpp, int blockno) return ; } /* make sure they have the same type */ + if (IS_SPEC(operandType(IC_LEFT(ic)))) { sym_link *itype=operandType(IC_LEFT(ic)); sym_link *ditype=operandType(IC_RIGHT(dic));