a) packRegsForSupport could mess up live information (Fixed)
[fw/sdcc] / src / SDCCsymt.c
index db8e3ad99e4e3f591c4583ef30da3590ad441870..a58f176d3c4d1366ae3ede9c260be8631739be57 100644 (file)
@@ -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);
 
@@ -786,8 +790,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:
@@ -986,6 +990,7 @@ addSymChain (symbol * symHead)
          }
          /* delete current entry */
          deleteSym (SymbolTab, csym, csym->name);
+         deleteFromSeg(csym);
        } else {
          /* not extern */
          werror (E_DUPLICATE, sym->name);
@@ -1112,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 */
@@ -1176,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;
   }
   
@@ -1299,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;
     }
@@ -1592,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) {
@@ -1624,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 */
@@ -1768,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))
@@ -1797,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
@@ -1827,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))
@@ -1949,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))
@@ -2347,6 +2352,7 @@ _mangleFunctionName(char *in)
 /*                      'x' - xdata                                */
 /*                      'p' - code                                 */
 /*                      'd' - data                                 */                     
+/*                      'F' - function                             */                     
 /* examples : "ig*" - generic int *                               */
 /*            "cx*" - char xdata *                                 */
 /*            "ui" -  unsigned int                                 */
@@ -2387,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;
@@ -2411,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;
@@ -2559,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 */
     }
 }