X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCsymt.c;h=a58f176d3c4d1366ae3ede9c260be8631739be57;hb=0ad57338fe62618aafe7a81929c36d5eb931372d;hp=ec3386e24631b84aabe8d8fa5954275a2bb19d53;hpb=1a01e92b433e6a5bc464a5aae4c3d3696db559d0;p=fw%2Fsdcc diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index ec3386e2..a58f176d 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -371,7 +371,7 @@ pointerTypes (sym_link * ptr, sym_link * type) DCL_TYPE (ptr) = EEPPOINTER; break; default: - DCL_TYPE (ptr) = GPOINTER; + DCL_TYPE (ptr) = port->unqualified_pointer; break; } /* the storage class of type ends here */ @@ -385,7 +385,7 @@ pointerTypes (sym_link * ptr, sym_link * type) while (ptr) { if (!IS_SPEC (ptr) && DCL_TYPE (ptr) == UPOINTER) - DCL_TYPE (ptr) = GPOINTER; + DCL_TYPE (ptr) = port->unqualified_pointer; ptr = ptr->next; } @@ -394,7 +394,7 @@ pointerTypes (sym_link * ptr, sym_link * type) while (type) { if (!IS_SPEC (type) && DCL_TYPE (type) == UPOINTER) - DCL_TYPE (type) = GPOINTER; + DCL_TYPE (type) = port->unqualified_pointer; type = type->next; } @@ -621,6 +621,7 @@ mergeSpec (sym_link * dest, sym_link * src, char *name) SPEC_BLEN (dest) |= SPEC_BLEN (src); SPEC_BSTR (dest) |= SPEC_BSTR (src); SPEC_TYPEDEF (dest) |= SPEC_TYPEDEF (src); + SPEC_ENUM (dest) |= SPEC_ENUM (src); if (IS_STRUCT (dest) && SPEC_STRUCT (dest) == NULL) SPEC_STRUCT (dest) = SPEC_STRUCT (src); @@ -633,6 +634,9 @@ mergeSpec (sym_link * dest, sym_link * src, char *name) FUNC_ISREENT(dest) |= FUNC_ISREENT(src); FUNC_ISNAKED(dest) |= FUNC_ISNAKED(src); FUNC_ISISR(dest) |= FUNC_ISISR(src); + FUNC_ISJAVANATIVE(dest) |= FUNC_ISJAVANATIVE(src); + FUNC_ISBUILTIN(dest) |= FUNC_ISBUILTIN(src); + FUNC_ISOVERLAY(dest) |= FUNC_ISOVERLAY(src); FUNC_INTNO(dest) |= FUNC_INTNO(src); FUNC_REGBANK(dest) |= FUNC_REGBANK(src); @@ -783,7 +787,13 @@ getSize (sym_link * p) switch (DCL_TYPE (p)) { case ARRAY: - return DCL_ELEM (p) * getSize (p->next); + 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[]"); + return 0; + } case IPOINTER: case PPOINTER: case POINTER: @@ -980,6 +990,7 @@ addSymChain (symbol * symHead) } /* delete current entry */ deleteSym (SymbolTab, csym, csym->name); + deleteFromSeg(csym); } else { /* not extern */ werror (E_DUPLICATE, sym->name); @@ -1106,13 +1117,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 */ @@ -1170,8 +1174,10 @@ checkSClass (symbol * sym, int isProto) 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; } @@ -1293,7 +1299,7 @@ changePointer (symbol * sym) for (p = sym->type; p; p = p->next) { if (!IS_SPEC (p) && DCL_TYPE (p) == UPOINTER) - DCL_TYPE (p) = GPOINTER; + DCL_TYPE (p) = port->unqualified_pointer; if (IS_PTR (p) && IS_FUNC (p->next)) DCL_TYPE (p) = CPOINTER; } @@ -1410,11 +1416,11 @@ computeType (sym_link * type1, sym_link * type2) else if (IS_BITVAR (etype2) && !IS_BITVAR (etype1)) rType = copyLinkChain (type1); else - /* if one of them is a pointer then that + /* if one of them is a pointer or array then that prevails */ - if (IS_PTR (type1)) + if (IS_PTR (type1) || IS_ARRAY (type1)) rType = copyLinkChain (type1); - else if (IS_PTR (type2)) + else if (IS_PTR (type2) || IS_ARRAY (type2)) rType = copyLinkChain (type2); else if (getSize (type1) > getSize (type2)) rType = copyLinkChain (type1); @@ -1586,14 +1592,14 @@ aggregateToPointer (value * val) } else { #if 1 // this happens for (external) function parameters - DCL_TYPE (val->type) = GPOINTER; + DCL_TYPE (val->type) = port->unqualified_pointer; #else if (TARGET_IS_DS390) { /* The AUTO and REGISTER classes should probably * also become generic pointers, but I haven't yet * devised a test case for that. */ - DCL_TYPE (val->type) = GPOINTER; + DCL_TYPE (val->type) = port->unqualified_pointer; break; } if (options.model==MODEL_LARGE) { @@ -1618,7 +1624,7 @@ aggregateToPointer (value * val) DCL_TYPE (val->type) = EEPPOINTER; break; default: - DCL_TYPE (val->type) = GPOINTER; + DCL_TYPE (val->type) = port->unqualified_pointer; } /* is there is a symbol associated then */ @@ -1762,6 +1768,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)) @@ -1791,7 +1798,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_ISREENT(funcType)=1; /* check if this function is defined as calleeSaves @@ -1821,6 +1828,8 @@ processFuncArgs (symbol * func) (*port->reg_parm) (val->type)) { SPEC_REGPARM (val->etype) = 1; + } else if (IFFUNC_ISREENT(funcType)) { + FUNC_HASSTACKPARM(funcType) = 1; } if (IS_AGGREGATE (val->type)) @@ -1943,7 +1952,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)) @@ -2341,6 +2352,7 @@ _mangleFunctionName(char *in) /* 'x' - xdata */ /* 'p' - code */ /* 'd' - data */ +/* 'F' - function */ /* examples : "ig*" - generic int * */ /* "cx*" - char xdata * */ /* "ui" - unsigned int */ @@ -2381,12 +2393,13 @@ sym_link *typeFromStr (char *s) SPEC_NOUN(r) = V_VOID; break; case '*': - DCL_TYPE(r) = GPOINTER; + DCL_TYPE(r) = port->unqualified_pointer; break; case 'g': case 'x': case 'p': case 'd': + case 'F': assert(*(s+1)=='*'); nr = newLink(); nr->next = r; @@ -2405,6 +2418,14 @@ 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; @@ -2553,5 +2574,6 @@ void initBuiltIns() sym = funcOfTypeVarg(port->builtintable[i].name,port->builtintable[i].rtype, port->builtintable[i].nParms,port->builtintable[i].parm_types); FUNC_ISBUILTIN(sym->type) = 1; + FUNC_ISREENT(sym->type) = 0; /* can never be reentrant */ } }