fixed bug #494721
[fw/sdcc] / src / SDCCast.c
index f5e17f81085b57c0d2e8ea85e6e56187831f91d8..116ef2c63de01c455562be2854de0f3529af9a27 100644 (file)
@@ -617,7 +617,7 @@ funcOfTypeVarg (char *name, char * rtype, int nArgs , char **atypes)
 /*-----------------------------------------------------------------*/
 /* reverseParms - will reverse a parameter tree                    */
 /*-----------------------------------------------------------------*/
-void 
+static void 
 reverseParms (ast * ptree)
 {
   ast *ttree;
@@ -714,13 +714,13 @@ processParms (ast * func,
       if (IS_PTR(ftype) && !IS_GENPTR(ftype))
        {
          newType = newAst_LINK (copyLinkChain(ftype));
-         DCL_TYPE (newType->opval.lnk) = GPOINTER;
+         DCL_TYPE (newType->opval.lnk) = port->unqualified_pointer;
        }
 
       if (IS_AGGREGATE (ftype))
        {
          newType = newAst_LINK (copyLinkChain (ftype));
-         DCL_TYPE (newType->opval.lnk) = GPOINTER;
+         DCL_TYPE (newType->opval.lnk) = port->unqualified_pointer;
        }
       if (newType)
        {
@@ -1057,42 +1057,7 @@ createIval (ast * sym, sym_link * type, initList * ilist, ast * wid)
 /*-----------------------------------------------------------------*/
 /* initAggregates - initialises aggregate variables with initv     */
 /*-----------------------------------------------------------------*/
-
-/* this has to go */ void printIval (symbol *, sym_link *, initList *, FILE *);
-
 ast * initAggregates (symbol * sym, initList * ival, ast * wid) {
-  ast *ast;
-  symbol *newSym;
-
-  if (getenv("TRY_THE_NEW_INITIALIZER")) {
-
-    if (!TARGET_IS_MCS51 || !(options.model==MODEL_LARGE)) {
-      fprintf (stderr, "Can't \"TRY_THE_NEW_INITIALIZER\" unless "
-              "with -mmcs51 and --model-large\n");
-      exit(404);
-    }
-
-    if (SPEC_OCLS(sym->etype)==xdata &&
-       getSize(sym->type) > 16) { // else it isn't worth it: do it the old way
-
-      // copy this symbol
-      newSym=copySymbol (sym);
-      SPEC_OCLS(newSym->etype)=code;
-      sprintf (newSym->name, "%s_init__", sym->name);
-      sprintf (newSym->rname,"%s_init__", sym->rname);
-      addSym (SymbolTab, newSym, newSym->name, 0, 0, 1);
-
-      // emit it in the static segment
-      addSet(&statsg->syms, newSym);
-
-      // now memcpy() the entire array from cseg
-      ast=newNode (ARRAYINIT, // ASSIGN_AGGREGATE
-                  newAst_VALUE (symbolVal (sym)), 
-                  newAst_VALUE (symbolVal (newSym)));
-      return decorateType(resolveSymbols(ast));
-    }
-  }
-  
   return createIval (newAst_VALUE (symbolVal (sym)), sym->type, ival, wid);
 }
 
@@ -2025,6 +1990,33 @@ decorateType (ast * tree)
                                     (tree->right->type == EX_VALUE ?
                               tree->right->opval.val : NULL));
       TETYPE (tree) = getSpec (TTYPE (tree));
+
+      /* adjust the storage class */
+      switch (DCL_TYPE(tree->left->ftype)) {
+      case POINTER:
+       break;
+      case FPOINTER:
+               SPEC_SCLS(TETYPE(tree)) = S_XDATA; 
+       break;
+      case CPOINTER:
+               SPEC_SCLS(TETYPE(tree)) = S_CODE; 
+       break;
+      case GPOINTER:
+       break;
+      case PPOINTER:
+               SPEC_SCLS(TETYPE(tree)) = S_XSTACK; 
+       break;
+      case IPOINTER:
+               SPEC_SCLS(TETYPE(tree)) = S_IDATA;
+       break;
+      case EEPPOINTER:
+               SPEC_SCLS(TETYPE(tree)) = S_EEPROM;
+       break;
+      case UPOINTER:
+      case ARRAY:
+      case FUNCTION:
+      }
+
       return tree;
 
 /*------------------------------------------------------------------*/
@@ -4331,7 +4323,7 @@ skipall:
 
   /* we are done freeup memory & cleanup */
   noLineno--;
-  labelKey = 1;
+  if (port->reset_labelKey) labelKey = 1;
   name->key = 0;
   FUNC_HASBODY(name->type) = 1;
   addSet (&operKeyReset, name);