X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCsymt.c;h=0dce6fa4a2e08e20d43c8aa840aef4182c3691fa;hb=9a41b4db10ee40ac3a381f4dbbfd3cc2fa9014a6;hp=9ef1a688e2ba48ffef29e3acfe35be3b7a155509;hpb=c3bf2d8fd69b69dcf7564d3e24cd045d2bcc385c;p=fw%2Fsdcc diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index 9ef1a688..0dce6fa4 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -138,7 +138,7 @@ addSym (bucket ** stab, bp->sym = sym; /* update the symbol pointer */ bp->level = level; /* update the nest level */ bp->block = block; - strcpy (bp->name, sname); /* copy the name into place */ + strncpyz (bp->name, sname, sizeof(bp->name)); /* copy the name into place */ /* if this is the first entry */ if (stab[i] == NULL) @@ -287,7 +287,7 @@ newSymbol (char *name, int scope) sym = Safe_alloc ( sizeof (symbol)); - strcpy (sym->name, name); /* copy the name */ + strncpyz (sym->name, name, sizeof(sym->name)); /* copy the name */ sym->level = scope; /* set the level */ sym->block = currBlockno; sym->lineDef = yylineno; /* set the line number */ @@ -317,7 +317,7 @@ newStruct (char *tag) s = Safe_alloc ( sizeof (structdef)); - strcpy (s->tag, tag); /* copy the tag */ + strncpyz (s->tag, tag, sizeof(s->tag)); /* copy the tag */ return s; } @@ -347,8 +347,6 @@ pointerTypes (sym_link * ptr, sym_link * type) storage class of the type */ if (IS_SPEC (type)) { - DCL_PTR_CONST (ptr) = SPEC_CONST (type); - DCL_PTR_VOLATILE (ptr) = SPEC_VOLATILE (type); switch (SPEC_SCLS (type)) { case S_XDATA: @@ -364,7 +362,6 @@ pointerTypes (sym_link * ptr, sym_link * type) DCL_TYPE (ptr) = POINTER; break; case S_CODE: - DCL_PTR_CONST (ptr) = port->mem.code_ro; DCL_TYPE (ptr) = CPOINTER; break; case S_EEPROM: @@ -457,22 +454,26 @@ addDecl (symbol * sym, int type, sym_link * p) } /* if the type is an unknown pointer and has - a tspec then take the storage class const & volatile + a tspec then take the const & volatile attribute from the tspec & make it those of this symbol */ + if (p && - !IS_SPEC (p) && - //DCL_TYPE (p) == UPOINTER && + IS_DECL (p) && + DCL_TYPE (p) == UPOINTER && DCL_TSPEC (p)) { + // only for declarators + wassert (IS_DECL(sym->type)); + if (!IS_SPEC (sym->etype)) { sym->etype = sym->etype->next = newLink (); sym->etype->class = SPECIFIER; } - SPEC_SCLS (sym->etype) = SPEC_SCLS (DCL_TSPEC (p)); - SPEC_CONST (sym->etype) = SPEC_CONST (DCL_TSPEC (p)); - SPEC_VOLATILE (sym->etype) = SPEC_VOLATILE (DCL_TSPEC (p)); + + DCL_PTR_CONST (sym->type) = SPEC_CONST (DCL_TSPEC (p)); + DCL_PTR_VOLATILE (sym->type) = SPEC_VOLATILE (DCL_TSPEC (p)); DCL_TSPEC (p) = NULL; } @@ -508,7 +509,7 @@ void checkTypeSanity(sym_link *etype, char *name) { noun=nounName(etype); if (getenv("DEBUG_SANITY")) { - fprintf (stderr, "checking sanity for %s %x\n", name, (int)etype); + fprintf (stderr, "checking sanity for %s %p\n", name, etype); } if ((SPEC_NOUN(etype)==V_CHAR || @@ -645,23 +646,6 @@ mergeSpec (sym_link * dest, sym_link * src, char *name) return symlink; } -/*------------------------------------------------------------------*/ -/* cloneSpec - copies the entire spec and returns a new spec */ -/*------------------------------------------------------------------*/ -sym_link * -cloneSpec (sym_link * src) -{ - sym_link *spec; - - /* go thru chain till we find the specifier */ - while (src && src->class != SPECIFIER) - src = src->next; - - spec = newLink (); - memcpy (spec, src, sizeof (sym_link)); - return spec; -} - /*------------------------------------------------------------------*/ /* genSymName - generates and returns a name used for anonymous vars */ /*------------------------------------------------------------------*/ @@ -671,7 +655,7 @@ genSymName (int level) static int gCount = 0; static char gname[SDCC_NAME_MAX + 1]; - sprintf (gname, "__%04d%04d", level, gCount++); + SNPRINTF (gname, sizeof(gname), "__%04d%04d", level, gCount++); return gname; } @@ -990,14 +974,16 @@ addSymChain (symbol * symHead) werror (E_EXTERN_MISMATCH, csym->name); continue; } - /* delete current entry */ - deleteSym (SymbolTab, csym, csym->name); - deleteFromSeg(csym); } else { /* not extern */ - werror (E_DUPLICATE, sym->name); - continue; + if (compareType (csym->type, sym->type) != 1) { + werror (E_DUPLICATE, sym->name); + continue; + } } + /* delete current entry */ + deleteSym (SymbolTab, csym, csym->name); + deleteFromSeg(csym); } /* add new entry */ @@ -1031,24 +1017,25 @@ 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); - + // the show must go on return newIntLink(); } @@ -1085,7 +1072,7 @@ compStructSize (int su, structdef * sdef) while (loop) { /* create the internal name for this variable */ - sprintf (loop->rname, "_%s", loop->name); + SNPRINTF (loop->rname, sizeof(loop->rname), "_%s", loop->name); loop->offset = (su == UNION ? sum = 0 : sum); SPEC_VOLATILE (loop->etype) |= (su == UNION ? 1 : 0); @@ -1172,10 +1159,17 @@ 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 && @@ -1473,6 +1467,9 @@ compareType (sym_link * dest, sym_link * src) } return compareType (dest->next, src->next); } + if (IS_PTR (dest) && IS_GENPTR (src) && IS_VOID(src->next)) { + return 1; + } if (IS_PTR (src) && IS_GENPTR (dest)) return -1; if (IS_PTR (dest) && IS_ARRAY (src)) { @@ -1480,7 +1477,6 @@ compareType (sym_link * dest, sym_link * src) int res=compareType (dest, val->type); Safe_free(val->type); Safe_free(val); - //return res ? -1 : 0; return res; } if (IS_PTR (dest) && IS_FUNC (dest->next) && IS_FUNC (src)) @@ -1700,13 +1696,13 @@ checkFunction (symbol * sym, symbol *csym) // 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); + SNPRINTF (acargs->name, sizeof(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); + strncpyz (acargs->sym->rname, acargs->name, sizeof(acargs->sym->rname)); } else if (strcmp(acargs->sym->name, acargs->sym->rname)==0) { // synthesized name werror(E_PARAM_NAME_OMITTED, sym->name, argCnt); @@ -1889,13 +1885,14 @@ processFuncArgs (symbol * func) /* synthesize a variable name */ if (!val->sym) { - sprintf (val->name, "_%s_PARM_%d", func->name, pNum++); + SNPRINTF (val->name, sizeof(val->name), + "_%s_PARM_%d", func->name, pNum++); val->sym = newSymbol (val->name, 1); SPEC_OCLS (val->etype) = port->mem.default_local_map; val->sym->type = copyLinkChain (val->type); val->sym->etype = getSpec (val->sym->type); val->sym->_isparm = 1; - strcpy (val->sym->rname, val->name); + strncpyz (val->sym->rname, val->name, sizeof(val->sym->rname)); SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) = SPEC_STAT (func->etype); addSymChain (val->sym); @@ -1904,14 +1901,18 @@ processFuncArgs (symbol * func) else /* symbol name given create synth name */ { - sprintf (val->name, "_%s_PARM_%d", func->name, pNum++); - strcpy (val->sym->rname, val->name); + SNPRINTF (val->name, sizeof(val->name), "_%s_PARM_%d", func->name, pNum++); + strncpyz (val->sym->rname, val->name, sizeof(val->sym->rname)); 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 (!isinSet(operKeyReset, val->sym)) { + addSet (&operKeyReset, val->sym); + applyToSet (operKeyReset, resetParmKey); + } val = val->next; } } @@ -2022,7 +2023,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; } } @@ -2092,12 +2097,12 @@ printTypeChain (sym_link * start, FILE * of) break; } } - /* search entry in list before "type" */ - for (search = start; search && search->next != type;) - search = search->next; - type = search; - if (type) - fputc (' ', of); + /* search entry in list before "type" */ + for (search = start; search && search->next != type;) + search = search->next; + type = search; + if (type) + fputc (' ', of); } if (nlr) fprintf (of, "\n"); @@ -2453,7 +2458,8 @@ sym_link *typeFromStr (char *s) s++; break; default: - werror(E_INTERNAL_ERROR,"typeFromStr"); + werror(E_INTERNAL_ERROR, __FILE__, __LINE__, + "typeFromStr: unknown type"); break; } if (IS_SPEC(r) && usign) { @@ -2499,7 +2505,7 @@ initCSupport () for (bwd = 0; bwd < 3; bwd++) { - sym_link *l; + sym_link *l = NULL; switch (bwd) { case 0: @@ -2538,13 +2544,13 @@ 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); + SNPRINTF (buffer, sizeof(buffer), "__fs2%s%s", ssu[su], sbwd[bwd]); + __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); + SNPRINTF (buffer, sizeof(buffer), "__%s%s2fs", ssu[su], sbwd[bwd]); + __conv[tofrom][bwd][su] = funcOfType (buffer, floatType, __multypes[bwd][su], 1, options.float_rent); } } } @@ -2556,7 +2562,8 @@ initCSupport () { for (su = 0; su < 2; su++) { - sprintf (buffer, "_%s%s%s", + SNPRINTF (buffer, sizeof(buffer), + "_%s%s%s", smuldivmod[muldivmod], ssu[su], sbwd[bwd]); @@ -2572,7 +2579,8 @@ initCSupport () { for (su = 0; su < 2; su++) { - sprintf (buffer, "_%s%s%s", + SNPRINTF (buffer, sizeof(buffer), + "_%s%s%s", srlrr[rlrr], ssu[su], sbwd[bwd]);