X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCsymt.c;h=4b4e00c415d2b9b4fe3e0205de41d813fb1c5985;hb=2a0b6db43f32c888c8df5f9d862f01baf24202a6;hp=14bcaee6f72dd93fbdc313ad35100c7c783f183c;hpb=59649e00927d0db09488038b2eb7543bbe0f2214;p=fw%2Fsdcc diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index 14bcaee6..4b4e00c4 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -1338,7 +1338,7 @@ checkSClass (symbol * sym, int isProto) } } } - + /* automatic symbols cannot be given */ /* an absolute address ignore it */ if (sym->level && @@ -1513,7 +1513,7 @@ cleanUpLevel (bucket ** table, int level) /* computeType - computes the resultant type from two types */ /*------------------------------------------------------------------*/ sym_link * -computeType (sym_link * type1, sym_link * type2) +computeType (sym_link * type1, sym_link * type2, bool promoteCharToInt) { sym_link *rType; sym_link *reType; @@ -1546,14 +1546,18 @@ computeType (sym_link * type1, sym_link * type2) rType = copyLinkChain (type2); reType = getSpec (rType); -#if 0 - if (SPEC_NOUN (reType) == V_CHAR) + + /* avoid conflicting types */ + reType->select.s._signed = 0; + + if (IS_CHAR (reType) && promoteCharToInt) SPEC_NOUN (reType) = V_INT; -#endif - /* if either of them unsigned but not val then make this unsigned */ - if ((SPEC_USIGN (etype1) || SPEC_USIGN (etype2)) && - !IS_FLOAT (reType)) + if ( ( ( SPEC_USIGN (etype1) + && (getSize (etype1) >= getSize (reType))) + || ( SPEC_USIGN (etype2) + && (getSize (etype2) >= getSize (reType)))) + && !IS_FLOAT (reType)) SPEC_USIGN (reType) = 1; else SPEC_USIGN (reType) = 0; @@ -2223,10 +2227,13 @@ processFuncArgs (symbol * func) val->sym->etype = getSpec (val->sym->type); val->sym->_isparm = 1; strncpyz (val->sym->rname, val->name, sizeof(val->sym->rname)); + #if 0 + /* ?? static functions shouldn't imply static parameters - EEP */ if (IS_SPEC(func->etype)) { SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) = SPEC_STAT (func->etype); } + #endif addSymChain (val->sym); } @@ -2238,10 +2245,14 @@ processFuncArgs (symbol * func) val->sym->_isparm = 1; SPEC_OCLS (val->etype) = SPEC_OCLS (val->sym->etype) = (options.model != MODEL_SMALL ? xdata : data); + + #if 0 + /* ?? static functions shouldn't imply static parameters - EEP */ if (IS_SPEC(func->etype)) { SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) = SPEC_STAT (func->etype); } + #endif } if (!isinSet(operKeyReset, val->sym)) { addSet (&operKeyReset, val->sym); @@ -2628,8 +2639,8 @@ printTypeChainRaw (sym_link * start, FILE * of) /*-----------------------------------------------------------------*/ /* powof2 - returns power of two for the number if number is pow 2 */ /*-----------------------------------------------------------------*/ -int -powof2 (unsigned long num) +int +powof2 (TYPE_UDWORD num) { int nshifts = 0; int n1s = 0; @@ -2672,7 +2683,7 @@ sym_link *floatType; static char * _mangleFunctionName(char *in) { - if (port->getMangledFunctionName) + if (port->getMangledFunctionName) { return port->getMangledFunctionName(in); } @@ -2996,3 +3007,63 @@ sym_link *validateLink(sym_link *l, exit(-1); return l; // never reached, makes compiler happy. } + +/*--------------------------------------------------------------------*/ +/* newEnumType - create an integer type compatible with enumerations */ +/*--------------------------------------------------------------------*/ +sym_link * +newEnumType (symbol *enumlist) +{ + int min, max, v; + symbol *sym; + sym_link *type; + + if (!enumlist) + { + type = newLink (SPECIFIER); + SPEC_NOUN (type) = V_INT; + return type; + } + + /* Determine the range of the enumerated values */ + sym = enumlist; + min = max = (int) floatFromVal (valFromType (sym->type)); + for (sym = sym->next; sym; sym = sym->next) + { + v = (int) floatFromVal (valFromType (sym->type)); + if (vmax) + max = v; + } + + /* Determine the smallest integer type that is compatible with this range */ + type = newLink (SPECIFIER); + if (min>=0 && max<=255) + { + SPEC_NOUN (type) = V_CHAR; + SPEC_USIGN (type) = 1; + } + else if (min>=-128 && max<=127) + { + SPEC_NOUN (type) = V_CHAR; + } + else if (min>=0 && max<=65535) + { + SPEC_NOUN (type) = V_INT; + SPEC_USIGN (type) = 1; + } + else if (min>=-32768 && max<=32767) + { + SPEC_NOUN (type) = V_INT; + } + else + { + SPEC_NOUN (type) = V_INT; + SPEC_LONG (type) = 1; + if (min>=0) + SPEC_USIGN (type) = 1; + } + + return type; +}