X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCsymt.c;h=20ee30adcab89f68e804eb10fa79a439d9f49173;hb=8b1f2b3651c5172eb88e2c9bca4f1f34dfd7131b;hp=ac088cc992d1c160267a3b8b5015f0f5a847a995;hpb=f48318f2d69479489df9cb4cd4bf1991cff174f2;p=fw%2Fsdcc diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index ac088cc9..20ee30ad 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -622,7 +622,9 @@ mergeSpec (sym_link * dest, sym_link * src, char *name) SPEC_BSTR (dest) |= SPEC_BSTR (src); SPEC_TYPEDEF (dest) |= SPEC_TYPEDEF (src); 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); @@ -790,8 +792,8 @@ getSize (sym_link * p) if (DCL_ELEM(p)) { return DCL_ELEM (p) * getSize (p->next); } else { - werror (E_INTERNAL_ERROR, __FILE__, __LINE__, - "can not tell the size of an array[]"); + // werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + // "can not tell the size of an array[]"); return 0; } case IPOINTER: @@ -990,6 +992,7 @@ addSymChain (symbol * symHead) } /* delete current entry */ deleteSym (SymbolTab, csym, csym->name); + deleteFromSeg(csym); } else { /* not extern */ werror (E_DUPLICATE, sym->name); @@ -1028,25 +1031,27 @@ structElemType (sym_link * stype, value * id) sym_link *type, *etype; sym_link *petype = getSpec (stype); - if (!fields || !id) - return NULL; + if (fields && id) { + + /* look for the id */ + while (fields) + { + if (strcmp (fields->rname, id->name) == 0) + { + type = copyLinkChain (fields->type); + etype = getSpec (type); + SPEC_SCLS (etype) = (SPEC_SCLS (petype) == S_REGISTER ? + SPEC_SCLS (etype) : SPEC_SCLS (petype)); + return type; + } + fields = fields->next; + } + } - /* look for the id */ - while (fields) - { - if (strcmp (fields->rname, id->name) == 0) - { - type = copyLinkChain (fields->type); - etype = getSpec (type); - SPEC_SCLS (etype) = (SPEC_SCLS (petype) == S_REGISTER ? - SPEC_SCLS (etype) : SPEC_SCLS (petype)); - return type; - } - fields = fields->next; - } werror (E_NOT_MEMBER, id->name); - - return NULL; + + // the show must go on + return newIntLink(); } /*------------------------------------------------------------------*/ @@ -1116,13 +1121,6 @@ compStructSize (int su, structdef * sdef) sum += getSize (loop->type); } -#if 0 // jwk: this is done now in addDecl() - /* if function then do the arguments for it */ - if (funcInChain (loop->type)) { - processFuncArgs (loop); - } -#endif - loop = loop->next; /* if this is not a bitfield but the */ @@ -1175,13 +1173,22 @@ checkSClass (symbol * sym, int isProto) } /* if absolute address given then it mark it as - volatile */ - if (IS_ABSOLUTE (sym->etype)) - SPEC_VOLATILE (sym->etype) = 1; + volatile -- except in the PIC port */ + +#if !OPT_DISABLE_PIC + /* The PIC port uses a different peep hole optimizer based on "pCode" */ + if (!TARGET_IS_PIC) +#endif + + if (IS_ABSOLUTE (sym->etype)) + SPEC_VOLATILE (sym->etype) = 1; + /* global variables declared const put into code */ + /* if no other storage class specified */ if (sym->level == 0 && - SPEC_CONST (sym->etype)) { + SPEC_CONST (sym->etype) && + SPEC_SCLS(sym->etype) == S_FIXED) { SPEC_SCLS (sym->etype) = S_CODE; } @@ -1682,7 +1689,7 @@ checkFunction (symbol * sym, symbol *csym) /* check if this function is defined as calleeSaves then mark it as such */ - FUNC_CALLEESAVES(sym->type) = inCalleeSaveList (sym->name); + FUNC_CALLEESAVES(sym->type) = inCalleeSaveList (sym->name); /* if interrupt service routine */ /* then it cannot have arguments */ @@ -1694,6 +1701,26 @@ checkFunction (symbol * sym, symbol *csym) } } + for (argCnt=1, acargs = FUNC_ARGS(sym->type); + acargs; + acargs=acargs->next, argCnt++) { + 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 + sprintf (acargs->name, "_%s_PARM_%d", sym->name, argCnt); + acargs->sym = newSymbol (acargs->name, 1); + SPEC_OCLS (acargs->etype) = istack; + acargs->sym->type = copyLinkChain (acargs->type); + acargs->sym->etype = getSpec (acargs->sym->type); + acargs->sym->_isparm = 1; + strcpy (acargs->sym->rname, acargs->name); + } else if (strcmp(acargs->sym->name, acargs->sym->rname)==0) { + // synthesized name + werror(E_PARAM_NAME_OMITTED, sym->name, argCnt); + } + } + if (!csym && !(csym = findSym (SymbolTab, sym, sym->name))) return 1; /* not defined nothing more to check */ @@ -1772,6 +1799,7 @@ checkFunction (symbol * sym, symbol *csym) /* replace with this defition */ sym->cdef = csym->cdef; deleteSym (SymbolTab, csym, csym->name); + deleteFromSeg(csym); addSym (SymbolTab, sym, sym->name, sym->level, sym->block, 1); if (IS_EXTERN (csym->etype) && ! IS_EXTERN (sym->etype)) @@ -1801,7 +1829,7 @@ processFuncArgs (symbol * func) /* if this function has variable argument list */ /* then make the function a reentrant one */ - if (IFFUNC_HASVARARGS(funcType)) + if (IFFUNC_HASVARARGS(funcType) || (options.stackAuto && !func->cdef)) FUNC_ISREENT(funcType)=1; /* check if this function is defined as calleeSaves @@ -1824,13 +1852,17 @@ processFuncArgs (symbol * func) /* change it to pointer to the same type */ while (val) { + int argreg = 0; /* mark it as a register parameter if the function does not have VA_ARG and as port dictates */ if (!IFFUNC_HASVARARGS(funcType) && - (*port->reg_parm) (val->type)) + (argreg = (*port->reg_parm) (val->type))) { SPEC_REGPARM (val->etype) = 1; + SPEC_ARGREG(val->etype) = argreg; + } else if (IFFUNC_ISREENT(funcType)) { + FUNC_HASSTACKPARM(funcType) = 1; } if (IS_AGGREGATE (val->type)) @@ -1865,7 +1897,6 @@ processFuncArgs (symbol * func) /* synthesize a variable name */ if (!val->sym) { - sprintf (val->name, "_%s_PARM_%d", func->name, pNum++); val->sym = newSymbol (val->name, 1); SPEC_OCLS (val->etype) = port->mem.default_local_map; @@ -1953,7 +1984,9 @@ printTypeChain (sym_link * start, FILE * of) switch (DCL_TYPE (type)) { case FUNCTION: - fprintf (of, "function %s", (IFFUNC_ISBUILTIN(type) ? "__builtin__" : " ")); + fprintf (of, "function %s %s", + (IFFUNC_ISBUILTIN(type) ? "__builtin__" : " "), + (IFFUNC_ISJAVANATIVE(type) ? "_JavaNative" : " ")); break; case GPOINTER: if (DCL_PTR_CONST (type)) @@ -1997,7 +2030,11 @@ printTypeChain (sym_link * start, FILE * of) fprintf (of, "unkown * "); break; case ARRAY: - fprintf (of, "[] "); + if (DCL_ELEM(type)) { + fprintf (of, "[%d] ", DCL_ELEM(type)); + } else { + fprintf (of, "[] "); + } break; } } @@ -2026,7 +2063,6 @@ printTypeChain (sym_link * start, FILE * of) fprintf (of, "unsigned "); if (SPEC_CONST (type)) fprintf (of, "const "); - switch (SPEC_NOUN (type)) { case V_INT: @@ -2351,6 +2387,7 @@ _mangleFunctionName(char *in) /* 'x' - xdata */ /* 'p' - code */ /* 'd' - data */ +/* 'F' - function */ /* examples : "ig*" - generic int * */ /* "cx*" - char xdata * */ /* "ui" - unsigned int */ @@ -2397,6 +2434,7 @@ sym_link *typeFromStr (char *s) case 'x': case 'p': case 'd': + case 'F': assert(*(s+1)=='*'); nr = newLink(); nr->next = r; @@ -2415,11 +2453,20 @@ sym_link *typeFromStr (char *s) case 'd': DCL_TYPE(r) = POINTER; break; + case 'F': + DCL_TYPE(r) = FUNCTION; + nr = newLink(); + nr->next = r; + r = nr; + r->class = DECLARATOR ; + DCL_TYPE(r) = CPOINTER; + break; } s++; break; default: - werror(E_INTERNAL_ERROR,"typeFromStr"); + werror(E_INTERNAL_ERROR, __FILE__, __LINE__, + "typeFromStr: unknown type"); break; } if (IS_SPEC(r) && usign) { @@ -2505,12 +2552,12 @@ initCSupport () if (tofrom) { sprintf (buffer, "__fs2%s%s", ssu[su], sbwd[bwd]); - __conv[tofrom][bwd][su] = funcOfType (_mangleFunctionName(buffer), __multypes[bwd][su], floatType, 1, options.float_rent); + __conv[tofrom][bwd][su] = funcOfType (buffer, __multypes[bwd][su], floatType, 1, options.float_rent); } else { sprintf (buffer, "__%s%s2fs", ssu[su], sbwd[bwd]); - __conv[tofrom][bwd][su] = funcOfType (_mangleFunctionName(buffer), floatType, __multypes[bwd][su], 1, options.float_rent); + __conv[tofrom][bwd][su] = funcOfType (buffer, floatType, __multypes[bwd][su], 1, options.float_rent); } } }