X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCsymt.c;h=ee4bfe42f54ee2ec0361913bcd50bb954871b694;hb=eb1ed77fb239b4a1af53773f0257ab904c771ddf;hp=661e8e6a0cedf9af1d99ccc70a9a4dd65d28ddea;hpb=777749ea16f6ffb540f71c834281e153fc8dc885;p=fw%2Fsdcc diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index 661e8e6a..ee4bfe42 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -98,16 +98,16 @@ addSym (bucket ** stab, void *sym, char *sname, int level, - int block) + int block, + int checkType) { int i; /* index into the hash Table */ bucket *bp; /* temp bucket * */ - if (getenv("DEBUG_SANITY")) { - fprintf (stderr, "addSym: %s ", sname); - } - /* Make sure sym is a symbol and not a structdef */ - if (StructTab!=stab) { + if (checkType) { + if (getenv("DEBUG_SANITY")) { + fprintf (stderr, "addSym: %s ", sname); + } /* make sure the type is complete and sane */ checkTypeSanity(((symbol *)sym)->etype, ((symbol *)sym)->name); } @@ -412,7 +412,7 @@ addDecl (symbol * sym, int type, sym_link * p) { if (IS_SPEC (sym->etype) && IS_SPEC (head) && head == tail) { - sym->etype = mergeSpec (sym->etype, head); + sym->etype = mergeSpec (sym->etype, head, sym->name); } else { @@ -478,7 +478,7 @@ void checkTypeSanity(sym_link *etype, char *name) { noun=nounName(etype); if (getenv("DEBUG_SANITY")) { - fprintf (stderr, "checking sanity for %s\n", name); + fprintf (stderr, "checking sanity for %s %x\n", name, (int)etype); } if ((SPEC_NOUN(etype)==V_CHAR || @@ -497,18 +497,15 @@ void checkTypeSanity(sym_link *etype, char *name) { werror (E_SIGNED_OR_UNSIGNED_INVALID, noun, name); } - if (!SPEC_NOUN(etype)) { - // special case for just "signed" or "unsigned" or "long" - if (etype->select.s._signed || SPEC_USIGN(etype) || SPEC_LONG(etype)) { - SPEC_NOUN(etype)=V_INT; - } - // special case for just "short" - if (etype->select.s._short) { - SPEC_NOUN(etype)=V_CHAR; // or maybe V_INT - } + // special case for "short" + if (etype->select.s._short) { + SPEC_NOUN(etype) = options.shortisint ? V_INT : V_CHAR; + etype->select.s._short = 0; } - // if still no noun (e.g. "const a;" or "data b;") assume an int + /* if no noun e.g. + "const a;" or "data b;" or "signed s" or "long l" + assume an int */ if (!SPEC_NOUN(etype)) { SPEC_NOUN(etype)=V_INT; } @@ -528,9 +525,13 @@ void checkTypeSanity(sym_link *etype, char *name) { /* mergeSpec - merges two specifiers and returns the new one */ /*------------------------------------------------------------------*/ sym_link * -mergeSpec (sym_link * dest, sym_link * src) +mergeSpec (sym_link * dest, sym_link * src, char *name) { + if (getenv("DEBUG_mergeSpec")) { + fprintf (stderr, "mergeSpec: \"%s\"\n", name); + } + if (SPEC_NOUN(src)) { if (!SPEC_NOUN(dest)) { SPEC_NOUN(dest)=SPEC_NOUN(src); @@ -539,7 +540,7 @@ mergeSpec (sym_link * dest, sym_link * src) if (getenv("DEBUG_SANITY")) { fprintf (stderr, "mergeSpec: "); } - werror(E_TWO_OR_MORE_DATA_TYPES, yylval.yychar); + werror(E_TWO_OR_MORE_DATA_TYPES, name); } } @@ -551,7 +552,7 @@ mergeSpec (sym_link * dest, sym_link * src) if (getenv("DEBUG_SANITY")) { fprintf (stderr, "mergeSpec: "); } - werror(E_TWO_OR_MORE_STORAGE_CLASSES, yylval.yychar); + werror(E_TWO_OR_MORE_STORAGE_CLASSES, name); } } @@ -563,15 +564,15 @@ mergeSpec (sym_link * dest, sym_link * src) if (SPEC_what(dest)) { werror(W_DUPLICATE_SPEC, "what"); } - SPEC_what(dst)=SPEC_what(src); + SPEC_what(dst)|=SPEC_what(src); } #endif // but there are more important thing right now SPEC_LONG (dest) |= SPEC_LONG (src); - dest->select.s._short=src->select.s._short; + dest->select.s._short|=src->select.s._short; SPEC_USIGN (dest) |= SPEC_USIGN (src); - dest->select.s._signed=src->select.s._signed; + dest->select.s._signed|=src->select.s._signed; SPEC_STAT (dest) |= SPEC_STAT (src); SPEC_EXTR (dest) |= SPEC_EXTR (src); SPEC_ABSA (dest) |= SPEC_ABSA (src); @@ -941,7 +942,7 @@ addSymChain (symbol * symHead) /* delete current entry */ deleteSym (SymbolTab, csym, csym->name); /* add new entry */ - addSym (SymbolTab, sym, sym->name, sym->level, sym->block); + addSym (SymbolTab, sym, sym->name, sym->level, sym->block, 1); } else /* not extern */ werror (E_DUPLICATE, sym->name); @@ -959,7 +960,7 @@ addSymChain (symbol * symHead) werror (W_EXTERN_MISMATCH, csym->name); } } - addSym (SymbolTab, sym, sym->name, sym->level, sym->block); + addSym (SymbolTab, sym, sym->name, sym->level, sym->block, 1); } } @@ -1111,11 +1112,18 @@ compStructSize (int su, structdef * sdef) static void checkSClass (symbol * sym) { + if (getenv("DEBUG_SANITY")) { + fprintf (stderr, "checkSClass: %s \n", sym->name); + } + if (strcmp(sym->name, "_testsGlobal")==0) { + printf ("oach\n"); + } + /* type is literal can happen foe 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 the initial value will be xlated */ /* to an absolute address */ @@ -1132,26 +1140,24 @@ checkSClass (symbol * sym) sym->ival = NULL; } } - + /* if absolute address given then it mark it as volatile */ if (IS_ABSOLUTE (sym->etype)) SPEC_VOLATILE (sym->etype) = 1; - + /* global variables declared const put into code */ if (sym->level == 0 && - SPEC_SCLS (sym->etype) == S_CONSTANT) - { - SPEC_SCLS (sym->etype) = S_CODE; - SPEC_CONST (sym->etype) = 1; - } - + SPEC_CONST (sym->etype)) { + SPEC_SCLS (sym->etype) = S_CODE; + } + /* global variable in code space is a constant */ if (sym->level == 0 && SPEC_SCLS (sym->etype) == S_CODE && port->mem.code_ro) SPEC_CONST (sym->etype) = 1; - + /* if bit variable then no storage class can be */ /* specified since bit is already a storage */ @@ -1182,13 +1188,12 @@ checkSClass (symbol * sym) SPEC_SCLS (sym->etype) != S_FIXED && SPEC_SCLS (sym->etype) != S_REGISTER && SPEC_SCLS (sym->etype) != S_STACK && - SPEC_SCLS (sym->etype) != S_XSTACK && - SPEC_SCLS (sym->etype) != S_CONSTANT)) + SPEC_SCLS (sym->etype) != S_XSTACK)) { werror (E_AUTO_ASSUMED, sym->name); SPEC_SCLS (sym->etype) = S_AUTO; } - + /* automatic symbols cannot be given */ /* an absolute address ignore it */ if (sym->level && @@ -1491,7 +1496,7 @@ checkType (sym_link * dest, sym_link * src) } /*------------------------------------------------------------------*/ -/* inCalleeSaveList - return 1 if found in calle save list */ +/* inCalleeSaveList - return 1 if found in callee save list */ /*------------------------------------------------------------------*/ bool inCalleeSaveList (char *s) @@ -1582,6 +1587,7 @@ checkFunction (symbol * sym) { symbol *csym; value *exargs, *acargs; + value *checkValue; int argCnt = 0; if (getenv("DEBUG_SANITY")) { @@ -1651,13 +1657,16 @@ checkFunction (symbol * sym) if (SPEC_INTRTN (csym->etype) != SPEC_INTRTN (sym->etype)) { werror (E_PREV_DEF_CONFLICT, csym->name, "interrupt"); - return 0; } if (SPEC_BANK (csym->etype) != SPEC_BANK (sym->etype)) { werror (E_PREV_DEF_CONFLICT, csym->name, "using"); - return 0; + } + + if (SPEC_NAKED (csym->etype) != SPEC_NAKED (sym->etype)) + { + werror (E_PREV_DEF_CONFLICT, csym->name, "_naked"); } /* compare expected agrs with actual args */ @@ -1669,7 +1678,12 @@ checkFunction (symbol * sym) exargs && acargs; exargs = exargs->next, acargs = acargs->next, argCnt++) { - value *checkValue; + if (getenv("DEBUG_SANITY")) { + fprintf (stderr, "checkFunction: %s ", exargs->name); + } + /* make sure the type is complete and sane */ + checkTypeSanity(exargs->etype, exargs->name); + /* If the actual argument is an array, any prototype * will have modified it to a pointer. Duplicate that * change here. @@ -1699,7 +1713,7 @@ checkFunction (symbol * sym) /* replace with this defition */ sym->cdef = csym->cdef; deleteSym (SymbolTab, csym, csym->name); - addSym (SymbolTab, sym, sym->name, sym->level, sym->block); + addSym (SymbolTab, sym, sym->name, sym->level, sym->block, 1); if (IS_EXTERN (csym->etype) && ! IS_EXTERN (sym->etype)) {