a saver error report
[fw/sdcc] / src / SDCCsymt.c
index 661e8e6a0cedf9af1d99ccc70a9a4dd65d28ddea..ee4bfe42f54ee2ec0361913bcd50bb954871b694 100644 (file)
@@ -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))
     {