X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCsymt.c;h=e950c5800ae4f118f7519cc6661b917558659176;hb=115d5811f8b0d4c6de0412bad52dfc2df11abbb6;hp=205ea31264d1b1d62e30b1d868ec0f77da02f18a;hpb=c9d4b0b754284ba05150358a9272e3eafc1242fb;p=fw%2Fsdcc diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index 205ea312..e950c580 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -40,7 +40,7 @@ void printFromToType(sym_link *from, sym_link *to) { /* noun strings */ char *nounName(sym_link *sl) { - switch (SPEC_NOUN(sl)) + switch (SPEC_NOUN(sl)) { case V_INT: { if (SPEC_LONG(sl)) return "long"; @@ -70,7 +70,7 @@ bucket *enumTab[256]; /* enumerated table */ /*------------------------------------------------------------------*/ /* initSymt () - initialises symbol table related stuff */ /*------------------------------------------------------------------*/ -void +void initSymt () { int i = 0; @@ -81,7 +81,7 @@ initSymt () } /*-----------------------------------------------------------------*/ -/* newBucket - allocates & returns a new bucket */ +/* newBucket - allocates & returns a new bucket */ /*-----------------------------------------------------------------*/ bucket * newBucket () @@ -96,7 +96,7 @@ newBucket () /*-----------------------------------------------------------------*/ /* hashKey - computes the hashkey given a symbol name */ /*-----------------------------------------------------------------*/ -int +int hashKey (const char *s) { unsigned long key = 0; @@ -109,7 +109,7 @@ hashKey (const char *s) /*-----------------------------------------------------------------*/ /* addSym - adds a symbol to the hash Table */ /*-----------------------------------------------------------------*/ -void +void addSym (bucket ** stab, void *sym, char *sname, @@ -118,7 +118,7 @@ addSym (bucket ** stab, int checkType) { int i; /* index into the hash Table */ - bucket *bp; /* temp bucket * */ + bucket *bp; /* temp bucket * */ if (checkType) { symbol *csym = (symbol *)sym; @@ -141,8 +141,8 @@ addSym (bucket ** stab, /* get a free entry */ bp = Safe_alloc ( sizeof (bucket)); - bp->sym = sym; /* update the symbol pointer */ - bp->level = level; /* update the nest level */ + bp->sym = sym; /* update the symbol pointer */ + bp->level = level; /* update the nest level */ bp->block = block; strncpyz (bp->name, sname, sizeof(bp->name)); /* copy the name into place */ @@ -163,9 +163,9 @@ addSym (bucket ** stab, } /*-----------------------------------------------------------------*/ -/* deleteSym - deletes a symbol from the hash Table entry */ +/* deleteSym - deletes a symbol from the hash Table entry */ /*-----------------------------------------------------------------*/ -void +void deleteSym (bucket ** stab, void *sym, char *sname) { int i = 0; @@ -203,7 +203,7 @@ deleteSym (bucket ** stab, void *sym, char *sname) } /*-----------------------------------------------------------------*/ -/* findSym - finds a symbol in a table */ +/* findSym - finds a symbol in a table */ /*-----------------------------------------------------------------*/ void * findSym (bucket ** stab, void *sym, const char *sname) @@ -328,7 +328,7 @@ newStruct (char *tag) strncpyz (s->tag, tag, sizeof(s->tag)); /* copy the tag */ return s; } - + /*------------------------------------------------------------------*/ /* sclsFromPtr - Return the storage class a pointer points into. */ /* S_FIXED is returned for generic pointers or other */ @@ -363,7 +363,7 @@ sclsFromPtr(sym_link *ptr) /*------------------------------------------------------------------*/ /* pointerTypes - do the computation for the pointer types */ /*------------------------------------------------------------------*/ -void +void pointerTypes (sym_link * ptr, sym_link * type) { if (IS_SPEC (ptr)) @@ -376,7 +376,7 @@ pointerTypes (sym_link * ptr, sym_link * type) /* could not find it */ if (!ptr || IS_SPEC (ptr)) return; - + if (IS_PTR(ptr) && DCL_TYPE(ptr)!=UPOINTER) { pointerTypes (ptr->next, type); return; @@ -436,7 +436,7 @@ pointerTypes (sym_link * ptr, sym_link * type) /*------------------------------------------------------------------*/ /* addDecl - adds a declarator @ the end of a chain */ /*------------------------------------------------------------------*/ -void +void addDecl (symbol * sym, int type, sym_link * p) { static sym_link *empty = NULL; @@ -545,19 +545,19 @@ void checkTypeSanity(sym_link *etype, char *name) { fprintf (stderr, "checking sanity for %s %p\n", name, etype); } - if ((SPEC_NOUN(etype)==V_CHAR || - SPEC_NOUN(etype)==V_FLOAT || + if ((SPEC_NOUN(etype)==V_CHAR || + SPEC_NOUN(etype)==V_FLOAT || SPEC_NOUN(etype)==V_FIXED16X16 || - SPEC_NOUN(etype)==V_DOUBLE || + SPEC_NOUN(etype)==V_DOUBLE || SPEC_NOUN(etype)==V_VOID) && (SPEC_SHORT(etype) || SPEC_LONG(etype))) { // long or short for char float double or void werror (E_LONG_OR_SHORT_INVALID, noun, name); } - if ((SPEC_NOUN(etype)==V_FLOAT || + if ((SPEC_NOUN(etype)==V_FLOAT || SPEC_NOUN(etype)==V_FIXED16X16 || - SPEC_NOUN(etype)==V_DOUBLE || - SPEC_NOUN(etype)==V_VOID) && + SPEC_NOUN(etype)==V_DOUBLE || + SPEC_NOUN(etype)==V_VOID) && (etype->select.s.b_signed || SPEC_USIGN(etype))) { // signed or unsigned for float double or void werror (E_SIGNED_OR_UNSIGNED_INVALID, noun, name); @@ -569,7 +569,7 @@ void checkTypeSanity(sym_link *etype, char *name) { SPEC_SHORT(etype) = 0; } - /* if no noun e.g. + /* if no noun e.g. "const a;" or "data b;" or "signed s" or "long l" assume an int */ if (!SPEC_NOUN(etype)) { @@ -585,7 +585,7 @@ void checkTypeSanity(sym_link *etype, char *name) { } if (etype->select.s.b_signed && SPEC_USIGN(etype)) { - // signed AND unsigned + // signed AND unsigned werror (E_SIGNED_AND_UNSIGNED_INVALID, noun, name); } if (SPEC_SHORT(etype) && SPEC_LONG(etype)) { @@ -623,7 +623,7 @@ mergeSpec (sym_link * dest, sym_link * src, char *name) werror(E_TWO_OR_MORE_DATA_TYPES, name); } } - + if (SPEC_SCLS(src)) { /* if destination has no storage class */ if (!SPEC_SCLS (dest) || SPEC_SCLS(dest)==S_REGISTER) { @@ -638,7 +638,7 @@ mergeSpec (sym_link * dest, sym_link * src, char *name) /* copy all the specifications */ - // we really should do: + // we really should do: #if 0 if (SPEC_what(src)) { if (SPEC_what(dest)) { @@ -668,11 +668,11 @@ mergeSpec (sym_link * dest, sym_link * src, char *name) SPEC_ENUM (dest) |= SPEC_ENUM (src); if (SPEC_ARGREG(src) && !SPEC_ARGREG(dest)) SPEC_ARGREG(dest) = SPEC_ARGREG(src); - + if (IS_STRUCT (dest) && SPEC_STRUCT (dest) == NULL) SPEC_STRUCT (dest) = SPEC_STRUCT (src); - /* these are the only function attributes that will be set + /* these are the only function attributes that will be set in a specifier while parsing */ FUNC_NONBANKED(dest) |= FUNC_NONBANKED(src); FUNC_BANKED(dest) |= FUNC_BANKED(src); @@ -690,9 +690,9 @@ mergeSpec (sym_link * dest, sym_link * src, char *name) return dest; } -/*------------------------------------------------------------------*/ +/*-------------------------------------------------------------------*/ /* genSymName - generates and returns a name used for anonymous vars */ -/*------------------------------------------------------------------*/ +/*-------------------------------------------------------------------*/ char * genSymName (int level) { @@ -747,7 +747,7 @@ newFloatLink () } /*------------------------------------------------------------------*/ -/* newFixed16x16Link - a new Float type */ +/* newFixed16x16Link - a new Float type */ /*------------------------------------------------------------------*/ sym_link * newFixed16x16Link () @@ -806,7 +806,7 @@ newBoolLink () /*------------------------------------------------------------------*/ /* getSize - returns size of a type chain in bytes */ /*------------------------------------------------------------------*/ -unsigned int +unsigned int getSize (sym_link * p) { /* if nothing return 0 */ @@ -847,7 +847,7 @@ getSize (sym_link * p) if (DCL_ELEM(p)) { return DCL_ELEM (p) * getSize (p->next); } else { - // werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + // werror (E_INTERNAL_ERROR, __FILE__, __LINE__, // "can not tell the size of an array[]"); return 0; } @@ -908,7 +908,7 @@ checkStructFlexArray (symbol *sym, sym_link *p) /*------------------------------------------------------------------*/ /* bitsForType - returns # of bits required to store this type */ /*------------------------------------------------------------------*/ -unsigned int +unsigned int bitsForType (sym_link * p) { /* if nothing return 0 */ @@ -1007,7 +1007,7 @@ copySymbol (symbol * src) } /*------------------------------------------------------------------*/ -/* reverseSyms - reverses the links for a symbol chain */ +/* reverseSyms - reverses the links for a symbol chain */ /*------------------------------------------------------------------*/ symbol * reverseSyms (symbol * sym) @@ -1032,7 +1032,7 @@ reverseSyms (symbol * sym) } /*------------------------------------------------------------------*/ -/* reverseLink - reverses the links for a type chain */ +/* reverseLink - reverses the links for a type chain */ /*------------------------------------------------------------------*/ sym_link * reverseLink (sym_link * type) @@ -1059,7 +1059,7 @@ reverseLink (sym_link * type) /*------------------------------------------------------------------*/ /* addSymChain - adds a symbol chain to the symboltable */ /*------------------------------------------------------------------*/ -void +void addSymChain (symbol ** symHead) { symbol *sym = *symHead; @@ -1074,11 +1074,15 @@ addSymChain (symbol ** symHead) if (!sym->level && !(IS_SPEC(sym->etype) && IS_TYPEDEF(sym->etype))) checkDecl (sym, 0); + else + { + /* if this is an array without any dimension + then update the dimension from the initial value */ + if (IS_ARRAY (sym->type) && !DCL_ELEM (sym->type)) + DCL_ELEM (sym->type) = getNelements (sym->type, sym->ival); + } - /* if already exists in the symbol table then check if - one of them is an extern definition if yes then - then check if the type match, if the types match then - delete the current entry and add the new entry */ + /* if already exists in the symbol table on the same level */ if ((csym = findSymWithLevel (SymbolTab, sym)) && csym->level == sym->level) { @@ -1089,9 +1093,9 @@ addSymChain (symbol ** symHead) error = 1; else { - /* If the previous definition was for an array with incomplete */ - /* type, and the new definition has completed the type, update */ - /* the original type to match */ + /* If the previous definition was for an array with incomplete + type, and the new definition has completed the type, update + the original type to match */ if (IS_DECL(csym->type) && DCL_TYPE(csym->type)==ARRAY && IS_DECL(sym->type) && DCL_TYPE(sym->type)==ARRAY) { @@ -1148,6 +1152,14 @@ addSymChain (symbol ** symHead) if (csym->ival && !sym->ival) sym->ival = csym->ival; + if (!csym->cdef && !sym->cdef && IS_EXTERN (sym->etype)) + { + /* if none of symbols is a compiler defined function + and at least one is not extern + then set the new symbol to non extern */ + SPEC_EXTR(sym->etype) = SPEC_EXTR(csym->etype); + } + /* delete current entry */ deleteSym (SymbolTab, csym, csym->name); deleteFromSeg(csym); @@ -1168,7 +1180,7 @@ addSymChain (symbol ** symHead) /*------------------------------------------------------------------*/ /* funcInChain - DCL Type 'FUNCTION' found in type chain */ /*------------------------------------------------------------------*/ -int +int funcInChain (sym_link * lnk) { while (lnk) @@ -1237,7 +1249,7 @@ getStructElement (structdef * sdef, symbol * sym) /*------------------------------------------------------------------*/ /* compStructSize - computes the size of a structure */ /*------------------------------------------------------------------*/ -int +int compStructSize (int su, structdef * sdef) { int sum = 0, usum = 0; @@ -1294,7 +1306,7 @@ compStructSize (int su, structdef * sdef) loop->offset = sum; SPEC_BSTR (loop->etype) = bitOffset; bitOffset += loop->bitVar; - } + } else { if( TARGET_IS_PIC16 && getenv("PIC16_PACKED_BITFIELDS") ) { /* if PIC16 && enviroment variable is set, then @@ -1391,12 +1403,12 @@ promoteAnonStructs (int su, structdef * sdef) /* Found an anonymous struct/union. Replace it */ /* with the fields it contains and adjust all */ /* the offsets */ - + base = field->offset; subfield = copySymbolChain (SPEC_STRUCT (field->type)->fields); if (!subfield) continue; /* just in case it's empty */ - + *tofield = subfield; for (;;) { @@ -1415,7 +1427,7 @@ promoteAnonStructs (int su, structdef * sdef) } dupfield = dupfield->next; } - + subfield->offset += base; if (subfield->next) subfield = subfield->next; @@ -1435,26 +1447,26 @@ promoteAnonStructs (int su, structdef * sdef) /*------------------------------------------------------------------*/ /* checkSClass - check the storage class specification */ /*------------------------------------------------------------------*/ -static void +static void checkSClass (symbol * sym, int isProto) { sym_link *t; - + if (getenv("DEBUG_SANITY")) { fprintf (stderr, "checkSClass: %s \n", sym->name); } - + /* type is literal can happen for enums change to auto */ if (SPEC_SCLS (sym->etype) == S_LITERAL && !SPEC_ENUM (sym->etype)) SPEC_SCLS (sym->etype) = S_AUTO; - + /* if sfr or sbit then must also be volatile */ if (SPEC_SCLS (sym->etype) == S_SBIT || SPEC_SCLS (sym->etype) == S_SFR) { SPEC_VOLATILE (sym->etype) = 1; } - + /* make sure restrict is only used with pointers */ if (SPEC_RESTRICT (sym->etype)) { @@ -1472,7 +1484,7 @@ checkSClass (symbol * sym, int isProto) } t = t->next; } - + /* if absolute address given then it mark it as volatile -- except in the PIC port */ @@ -1483,7 +1495,7 @@ checkSClass (symbol * sym, int isProto) if (IS_ABSOLUTE (sym->etype)) SPEC_VOLATILE (sym->etype) = 1; - + if (TARGET_IS_MCS51 && IS_ABSOLUTE (sym->etype) && SPEC_SCLS (sym->etype) == S_SFR) @@ -1586,7 +1598,7 @@ checkSClass (symbol * sym, int isProto) /* automatic symbols cannot be given */ /* an absolute address ignore it */ - if (sym->level && + if (sym->level && !IS_STATIC(sym->etype) && SPEC_ABSA (sym->etype) && (options.stackAuto || reentrant)) { @@ -1643,7 +1655,7 @@ checkSClass (symbol * sym, int isProto) * control this allocation, but the code was originally that way, and * changing it for non-390 ports breaks the compiler badly. */ - bool useXdata = (TARGET_IS_DS390 || TARGET_IS_DS400) ? + bool useXdata = (TARGET_IS_DS390 || TARGET_IS_DS400) ? 1 : options.useXstack; SPEC_SCLS (sym->etype) = (useXdata ? S_XDATA : S_FIXED); @@ -1654,7 +1666,7 @@ checkSClass (symbol * sym, int isProto) /*------------------------------------------------------------------*/ /* changePointer - change pointer to functions */ /*------------------------------------------------------------------*/ -void +void changePointer (sym_link * p) { @@ -1673,14 +1685,14 @@ changePointer (sym_link * p) } /*------------------------------------------------------------------*/ -/* checkDecl - does semantic validation of a declaration */ +/* checkDecl - does semantic validation of a declaration */ /*------------------------------------------------------------------*/ -int +int checkDecl (symbol * sym, int isProto) { - checkSClass (sym, isProto); /* check the storage class */ - changePointer (sym->type); /* change pointers if required */ + checkSClass (sym, isProto); /* check the storage class */ + changePointer (sym->type); /* change pointers if required */ /* if this is an array without any dimension then update the dimension from the initial value */ @@ -1716,7 +1728,7 @@ copyLinkChain (sym_link * p) /* cleanUpBlock - cleansup the symbol table specified for all the */ /* symbols in the given block */ /*------------------------------------------------------------------*/ -void +void cleanUpBlock (bucket ** table, int block) { int i; @@ -1739,7 +1751,7 @@ cleanUpBlock (bucket ** table, int block) /* cleanUpLevel - cleansup the symbol table specified for all the */ /* symbols in the given level */ /*------------------------------------------------------------------*/ -void +void cleanUpLevel (bucket ** table, int level) { int i; @@ -1773,7 +1785,7 @@ computeTypeOr (sym_link * etype1, sym_link * etype2, sym_link * reType) SPEC_USIGN (reType) = SPEC_USIGN (etype1); return reType; } - + if (SPEC_USIGN (etype1)) { if ( IS_LITERAL (etype2) @@ -1853,12 +1865,12 @@ computeType (sym_link * type1, sym_link * type2, rType = newFloatLink (); else if (IS_FLOAT (etype1) && IS_FIXED16X16 (etype2) ) rType = newFloatLink (); - + /* if both are bitvars choose the larger one */ else if (IS_BITVAR (etype1) && IS_BITVAR (etype2)) rType = SPEC_BLEN (etype1) >= SPEC_BLEN (etype2) ? - copyLinkChain (type1) : copyLinkChain (type1); - + copyLinkChain (type1) : copyLinkChain (type2); + /* if only one of them is a bit variable then the other one prevails */ else if (IS_BITVAR (etype1) && !IS_BITVAR (etype2)) { @@ -1896,6 +1908,17 @@ computeType (sym_link * type1, sym_link * type2, switch (resultType) { + case RESULT_TYPE_IFX: + if (TARGET_IS_HC08) + break; + //fallthrough + case RESULT_TYPE_BIT: + if (op == ':') + { + SPEC_NOUN (reType) = V_BIT; + return rType; + } + break; case RESULT_TYPE_CHAR: if (IS_BITVAR (reType)) { @@ -1991,7 +2014,7 @@ computeType (sym_link * type1, sym_link * type2, 2 * 100 = 200; - ToDo: document '|', '^' and '&' - + Homework: - why is (200 * 200 < 0) true? - why is { char l = 200, r = 200; (r * l > 0) } true? */ @@ -2003,7 +2026,7 @@ computeType (sym_link * type1, sym_link * type2, && !(bitsForType (etype1) < bitsForType (reType)) /* char require special handling */ && !IS_CHAR (etype1)) - || /* same for 2nd operand */ + || /* same for 2nd operand */ (SPEC_USIGN (etype2) && !(bitsForType (etype2) < bitsForType (reType)) && !IS_CHAR (etype2)) @@ -2048,30 +2071,55 @@ compareType (sym_link * dest, sym_link * src) return -1; if (IS_FUNC (dest->next) && IS_VOID(src->next)) return -1; - return compareType (dest->next, src->next); + if (IS_VOID (src->next) && IS_VOID (dest->next)) + return 1; + if ((IS_VOID (src->next) && !IS_VOID (dest->next)) || + (!IS_VOID (src->next) && IS_VOID (dest->next)) ) + return -1; + if (compareType (dest->next, src->next) == 1) + return 1; + else + return 0; } - if (DCL_TYPE (src) == DCL_TYPE (dest)) { - if (IS_FUNC(src)) { - //checkFunction(src,dest); + if (DCL_TYPE (src) == DCL_TYPE (dest)) + { + if (IS_FUNC(src)) + { + //checkFunction(src,dest); + } + if (IS_VOID (src->next) && IS_VOID (dest->next)) + return 1; + if ((IS_VOID (src->next) && !IS_VOID (dest->next)) || + (!IS_VOID (src->next) && IS_VOID (dest->next)) ) + return -1; + if (compareType (dest->next, src->next) == 1) + return 1; + else + return 0; } - return compareType (dest->next, src->next); - } - if (IS_PTR (dest) && IS_GENPTR (src) && IS_VOID(src->next)) { - return -1; - } - if (IS_PTR (src) && + if (IS_PTR (dest) && IS_GENPTR (src) && IS_VOID(src->next)) + { + return -1; + } + if (IS_PTR (src) && (IS_GENPTR (dest) || ((DCL_TYPE(src) == POINTER) && (DCL_TYPE(dest) == IPOINTER)) )) - return -1; - if (IS_PTR (dest) && IS_ARRAY (src)) { - value *val=aggregateToPointer (valFromType(src)); - int res=compareType (dest, val->type); - Safe_free(val->type); - Safe_free(val); - return res; - } + { + if (compareType (dest->next, src->next)) + return -1; + else + return 0; + } + if (IS_PTR (dest) && IS_ARRAY (src)) + { + value *val=aggregateToPointer (valFromType(src)); + int res=compareType (dest, val->type); + Safe_free(val->type); + Safe_free(val); + return res; + } if (IS_PTR (dest) && IS_FUNC (dest->next) && IS_FUNC (src)) return compareType (dest->next, src); return 0; @@ -2082,6 +2130,9 @@ compareType (sym_link * dest, sym_link * src) return 0; } + if (IS_PTR (src) && IS_VOID (dest)) + return -1; + /* if one is a specifier and the other is not */ if ((IS_SPEC (src) && !IS_SPEC (dest)) || (IS_SPEC (dest) && !IS_SPEC (src))) @@ -2113,7 +2164,7 @@ compareType (sym_link * dest, sym_link * src) instead of the next two lines, but the regression tests fail with them; I guess it's a problem with replaceCheaperOp */ getSize (dest) == getSize (src) && - !(!IS_BIT (dest) && IS_BIT (src))) + (IS_BIT (dest) == IS_BIT (src))) return 1; else if (IS_ARITHMETIC (dest) && IS_ARITHMETIC (src)) return -1; @@ -2143,7 +2194,7 @@ int compareTypeExact (sym_link * dest, sym_link * src, int level) { STORAGE_CLASS srcScls, destScls; - + if (!dest && !src) return 1; @@ -2209,7 +2260,7 @@ compareTypeExact (sym_link * dest, sym_link * src, int level) /* if one them ended we have a problem */ if ((exargs && !acargs && !IS_VOID (exargs->type)) || (!exargs && acargs && !IS_VOID (acargs->type))) - return 0; + return 0; return 1; } return compareTypeExact (dest->next, src->next, level); @@ -2246,7 +2297,7 @@ compareTypeExact (sym_link * dest, sym_link * src, int level) if (SPEC_SHORT (dest) != SPEC_SHORT (src)) return 0; } - + if (IS_STRUCT (dest)) { if (SPEC_STRUCT (dest) != SPEC_STRUCT (src)) @@ -2263,10 +2314,10 @@ compareTypeExact (sym_link * dest, sym_link * src, int level) return 0; if (SPEC_ABSA (dest) && SPEC_ADDR (dest) != SPEC_ADDR (src)) return 0; - + destScls = SPEC_SCLS (dest); srcScls = SPEC_SCLS (src); - + /* Compensate for const to const code change in checkSClass() */ if (!level & port->mem.code_ro && SPEC_CONST (dest)) { @@ -2276,12 +2327,12 @@ compareTypeExact (sym_link * dest, sym_link * src, int level) srcScls = S_CODE; } - /* compensate for allocGlobal() */ + /* compensate for allocGlobal() */ if ((srcScls == S_FIXED || srcScls == S_AUTO) && port->mem.default_globl_map == xdata && !level) srcScls = S_XDATA; - + if (level>0 && !SPEC_STAT (dest)) { /* Compensate for hack-o-matic in checkSClass() */ @@ -2311,12 +2362,12 @@ compareTypeExact (sym_link * dest, sym_link * src, int level) #endif return 0; } - + return 1; } /*------------------------------------------------------------------*/ -/* inCalleeSaveList - return 1 if found in callee save list */ +/* inCalleeSaveList - return 1 if found in callee save list */ /*------------------------------------------------------------------*/ static int calleeCmp(void *p1, void *p2) @@ -2333,8 +2384,8 @@ inCalleeSaveList(char *s) } /*-----------------------------------------------------------------*/ -/* aggregateToPointer: change an agggregate type function */ -/* argument to a pointer to that type. */ +/* aggregateToPointer: change an aggregate type function */ +/* argument to a pointer to that type. */ /*-----------------------------------------------------------------*/ value * aggregateToPointer (value * val) @@ -2388,7 +2439,7 @@ aggregateToPointer (value * val) default: DCL_TYPE (val->type) = port->unqualified_pointer; } - + /* is there is a symbol associated then */ /* change the type of the symbol as well */ if (val->sym) @@ -2402,7 +2453,7 @@ aggregateToPointer (value * val) /*------------------------------------------------------------------*/ /* checkFunction - does all kinds of check on a function */ /*------------------------------------------------------------------*/ -int +int checkFunction (symbol * sym, symbol *csym) { value *exargs, *acargs; @@ -2418,7 +2469,7 @@ checkFunction (symbol * sym, symbol *csym) werror(E_SYNTAX_ERROR, sym->name); return 0; } - + /* move inline specifier from return type to function attributes */ if (IS_INLINE (sym->etype)) { @@ -2463,11 +2514,10 @@ checkFunction (symbol * sym, symbol *csym) werror (E_SHADOWREGS_NO_ISR, sym->name); } - - for (argCnt=1, acargs = FUNC_ARGS(sym->type); - acargs; + for (argCnt=1, acargs = FUNC_ARGS(sym->type); + acargs; acargs=acargs->next, argCnt++) { - if (!acargs->sym) { + if (!acargs->sym) { // this can happen for reentrant functions werror(E_PARAM_NAME_OMITTED, sym->name, argCnt); // the show must go on: synthesize a name and symbol @@ -2478,13 +2528,16 @@ checkFunction (symbol * sym, symbol *csym) acargs->sym->etype = getSpec (acargs->sym->type); acargs->sym->_isparm = 1; strncpyz (acargs->sym->rname, acargs->name, sizeof(acargs->sym->rname)); - } else if (strcmp(acargs->sym->name, acargs->sym->rname)==0) { + } else if (strcmp(acargs->sym->name, acargs->sym->rname)==0) { // synthesized name werror(E_PARAM_NAME_OMITTED, sym->name, argCnt); } } argCnt--; + /*JCF: Mark the register bank as used*/ + RegBankUsed[FUNC_REGBANK (sym->type)] = 1; + if (!csym && !(csym = findSym (SymbolTab, sym, sym->name))) return 1; /* not defined nothing more to check */ @@ -2541,7 +2594,7 @@ checkFunction (symbol * sym, symbol *csym) { werror (E_PREV_DEF_CONFLICT, csym->name, "shadowregs"); } - + /* compare expected args with actual args */ exargs = FUNC_ARGS(csym->type); @@ -2624,7 +2677,7 @@ void cdbStructBlock (int block) /*-----------------------------------------------------------------*/ /* processFuncPtrArgs - does some processing with args of func ptrs*/ /*-----------------------------------------------------------------*/ -void +void processFuncPtrArgs (sym_link * funcType) { value *val = FUNC_ARGS(funcType); @@ -2640,7 +2693,7 @@ processFuncPtrArgs (sym_link * funcType) /*-----------------------------------------------------------------*/ /* processFuncArgs - does some processing with function args */ /*-----------------------------------------------------------------*/ -void +void processFuncArgs (symbol * func) { value *val; @@ -2682,10 +2735,10 @@ processFuncArgs (symbol * func) { int argreg = 0; char buffer[SDCC_NAME_MAX+1]; - + SNPRINTF (buffer, sizeof(buffer), "%s parameter %d", func->name, pNum); checkTypeSanity (val->etype, buffer); - + /* mark it as a register parameter if the function does not have VA_ARG and as port dictates */ @@ -2730,7 +2783,7 @@ processFuncArgs (symbol * func) /* synthesize a variable name */ if (!val->sym) { - SNPRINTF (val->name, sizeof(val->name), + SNPRINTF (val->name, sizeof(val->name), "_%s_PARM_%d", func->name, pNum++); val->sym = newSymbol (val->name, 1); if (SPEC_SCLS(val->etype) == S_BIT) @@ -2762,7 +2815,7 @@ processFuncArgs (symbol * func) else SPEC_OCLS (val->etype) = SPEC_OCLS (val->sym->etype) = port->mem.default_local_map; - + #if 0 /* ?? static functions shouldn't imply static parameters - EEP */ if (IS_SPEC(func->etype)) { @@ -2784,7 +2837,7 @@ processFuncArgs (symbol * func) /*-----------------------------------------------------------------*/ /* isSymbolEqual - compares two symbols return 1 if they match */ /*-----------------------------------------------------------------*/ -int +int isSymbolEqual (symbol * dest, symbol * src) { /* if pointers match then equal */ @@ -2856,7 +2909,7 @@ dbuf_printTypeChain (sym_link * start, struct dbuf_s *dbuf) while (type) { if (type==start) { - switch (scls) + switch (scls) { case S_DATA: dbuf_append_str (dbuf, "data-"); break; case S_XDATA: dbuf_append_str (dbuf, "xdata-"); break; @@ -2890,12 +2943,12 @@ dbuf_printTypeChain (sym_link * start, struct dbuf_s *dbuf) switch (DCL_TYPE (type)) { case FUNCTION: - dbuf_printf (dbuf, "function %s %s", + dbuf_printf (dbuf, "function %s %s", (IFFUNC_ISBUILTIN(type) ? "__builtin__" : " "), (IFFUNC_ISJAVANATIVE(type) ? "_JavaNative" : " ")); dbuf_append_str (dbuf, "( "); - for (args = FUNC_ARGS(type); - args; + for (args = FUNC_ARGS(type); + args; args=args->next) { dbuf_printTypeChain(args->type, dbuf); if (args->next) @@ -3025,7 +3078,7 @@ printTypeChainRaw (sym_link * start, FILE * of) } type = start; - + while (type) { if (IS_DECL (type)) @@ -3047,12 +3100,12 @@ printTypeChainRaw (sym_link * start, FILE * of) if (IFFUNC_ISINLINE(type)) { fprintf (of, "inline-"); } - fprintf (of, "function %s %s", + fprintf (of, "function %s %s", (IFFUNC_ISBUILTIN(type) ? "__builtin__" : " "), (IFFUNC_ISJAVANATIVE(type) ? "_JavaNative" : " ")); fprintf (of, "( "); - for (args = FUNC_ARGS(type); - args; + for (args = FUNC_ARGS(type); + args; args=args->next) { printTypeChain(args->type, of); if (args->next) @@ -3101,7 +3154,7 @@ printTypeChainRaw (sym_link * start, FILE * of) } else if (IS_SPEC (type)) { - switch (SPEC_SCLS (type)) + switch (SPEC_SCLS (type)) { case S_DATA: fprintf (of, "data-"); break; case S_XDATA: fprintf (of, "xdata-"); break; @@ -3268,8 +3321,8 @@ _mangleFunctionName(char *in) /* pointer modifiers - 'g' - generic */ /* 'x' - xdata */ /* 'p' - code */ -/* 'd' - data */ -/* 'F' - function */ +/* 'd' - data */ +/* 'F' - function */ /* examples : "ig*" - generic int * */ /* "cx*" - char xdata * */ /* "ui" - unsigned int */ @@ -3282,7 +3335,7 @@ sym_link *typeFromStr (char *s) do { sym_link *nr; switch (*s) { - case 'u' : + case 'u' : usign = 1; s++; continue ; @@ -3349,7 +3402,7 @@ sym_link *typeFromStr (char *s) s++; break; default: - werror(E_INTERNAL_ERROR, __FILE__, __LINE__, + werror(E_INTERNAL_ERROR, __FILE__, __LINE__, "typeFromStr: unknown type"); break; } @@ -3365,7 +3418,7 @@ sym_link *typeFromStr (char *s) /*-----------------------------------------------------------------*/ /* initCSupport - create functions for C support routines */ /*-----------------------------------------------------------------*/ -void +void initCSupport () { const char *smuldivmod[] = @@ -3636,15 +3689,15 @@ sym_link *validateLink(sym_link *l, const char select, const char *file, unsigned line) -{ +{ if (l && l->class==select) { return l; } - fprintf(stderr, + fprintf(stderr, "Internal error: validateLink failed in %s(%s) @ %s:%u:" " expected %s, got %s\n", - macro, args, file, line, + macro, args, file, line, DECLSPEC2TXT(select), l ? DECLSPEC2TXT(l->class) : "null-link"); exit(EXIT_FAILURE); return l; // never reached, makes compiler happy. @@ -3666,13 +3719,13 @@ newEnumType (symbol *enumlist) SPEC_NOUN (type) = V_INT; return type; } - + /* Determine the range of the enumerated values */ sym = enumlist; - min = max = (int) floatFromVal (valFromType (sym->type)); + min = max = (int) ulFromVal (valFromType (sym->type)); for (sym = sym->next; sym; sym = sym->next) { - v = (int) floatFromVal (valFromType (sym->type)); + v = (int) ulFromVal (valFromType (sym->type)); if (vmax) @@ -3706,6 +3759,6 @@ newEnumType (symbol *enumlist) if (min>=0) SPEC_USIGN (type) = 1; } - + return type; }