Beautified. Although recommended, it's not my favourite style
[fw/sdcc] / src / SDCCmem.c
index b3c8381f50cfae85bac5f6e1ad5e92e08ee72b86..3fb5899f047c0aa80ad215287854718aafd3b01d 100644 (file)
@@ -25,9 +25,6 @@ memmap        *home   =NULL;   /* Unswitchable code bank      */
    symbols in a single overlay */
 set *ovrSetSets = NULL;    
 
-extern set *operKeyReset ;
-extern set *tmpfileSet ;
-extern symbol *interrupts[];
 int maxRegBank = 0;
 int fatalError = 0                      ;/* fatal error flag                   */
 
@@ -48,7 +45,7 @@ memmap *allocMap (char rspace,     /* sfr space            */
 {
        memmap *map ;
 
-       if (!(map = GC_malloc(sizeof(memmap)))) {
+       if (!(map = calloc(sizeof(memmap), 1))) {
                werror(E_OUT_OF_MEM,__FILE__,sizeof(memmap));
                exit (1);
        }
@@ -266,8 +263,10 @@ void allocIntoSeg (symbol *sym)
 /*-----------------------------------------------------------------*/
 void allocGlobal ( symbol *sym )
 {
+       
     /* symbol name is internal name  */
-    sprintf (sym->rname,"%s%s", port->fun_prefix, sym->name);
+    if (!sym->level) /* local statics can come here */
+           sprintf (sym->rname,"%s%s", port->fun_prefix, sym->name);
     
     /* add it to the operandKey reset */
     addSet(&operKeyReset,sym);
@@ -465,11 +464,15 @@ void allocParms ( value  *val )
                   note here that we put it into the overlay segment
                   first, we will remove it from the overlay segment
                   after the overlay determination has been done */
-               SPEC_OCLS(lval->etype) = SPEC_OCLS(lval->sym->etype) = 
-                   ( options.model  ? port->mem.default_local_map : 
-                     (options.noOverlay ? port->mem.default_local_map
-                      :overlay ));
-           
+               if (options.model == MODEL_SMALL) {
+                   SPEC_OCLS(lval->etype) = SPEC_OCLS(lval->sym->etype) = 
+                       ( options.model == MODEL_SMALL ? port->mem.default_local_map : 
+                         (options.noOverlay ? port->mem.default_local_map
+                          :overlay ));
+               } else {
+                   SPEC_SCLS(lval->etype) = S_XDATA;
+                   SPEC_OCLS(lval->etype) = SPEC_OCLS(lval->sym->etype) = xdata;
+               }
            allocIntoSeg(lval->sym);
        }
     }
@@ -534,9 +537,7 @@ void allocLocal ( symbol *sym  )
 
     /* if this is a static variable */
     if ( IS_STATIC (sym->etype)) {
-/*     SPEC_OCLS(sym->etype) = (options.model ? xdata : data ); */
-       SPEC_OCLS(sym->etype) = port->mem.default_local_map;
-       allocIntoSeg (sym);
+       allocGlobal(sym);
         sym->allocreq = 1;
        return   ;
     }
@@ -641,7 +642,7 @@ void allocLocal ( symbol *sym  )
     /* again note that we have put it into the overlay segment
        will remove and put into the 'data' segment if required after 
        overlay  analysis has been done */   
-    SPEC_OCLS(sym->etype) = ( options.model  ? port->mem.default_local_map : 
+    SPEC_OCLS(sym->etype) = ( options.model == MODEL_SMALL ? port->mem.default_local_map : 
                              (options.noOverlay ? port->mem.default_local_map
                               : overlay )) ;
     allocIntoSeg (sym); 
@@ -786,7 +787,7 @@ int allocVariables ( symbol *symChain )
 /*-----------------------------------------------------------------*/
 /* redoStackOffsets :- will reassign the values for stack offsets  */
 /*-----------------------------------------------------------------*/
-void redoStackOffsets ()
+void redoStackOffsets(void)
 {
     symbol *sym;
     int sPtr = 0;
@@ -915,6 +916,58 @@ static void printAllocInfoSeg ( memmap *map, symbol *func, FILE *of)
     }
 }
 
+/*-----------------------------------------------------------------*/
+/* canOverlayLocals - returns true if the local variables can overlayed */
+/*-----------------------------------------------------------------*/
+static bool canOverlayLocals (eBBlock **ebbs, int count)
+{
+    int i;
+    /* if staticAuto is in effect or the current function
+       being compiled is reentrant or the overlay segment
+       is empty or no overlay option is in effect then */
+    if (options.noOverlay ||
+       options.stackAuto ||
+       (currFunc &&
+        (IS_RENT(currFunc->etype) ||
+         IS_ISR(currFunc->etype))) ||
+       elementsInSet(overlay->syms) == 0)
+       
+       return FALSE;
+
+    /* otherwise do thru the blocks and see if there
+       any function calls if found then return false */
+    for (i = 0; i < count ; i++ ) {
+       iCode *ic;
+
+       for (ic = ebbs[i]->sch; ic ; ic = ic->next)
+           if (ic && ( ic->op == CALL || ic->op == PCALL))
+               return FALSE;
+    }
+
+    /* no function calls found return TRUE */
+    return TRUE;
+}
+
+/*-----------------------------------------------------------------*/
+/* doOverlays - move the overlay segment to appropriate location   */
+/*-----------------------------------------------------------------*/
+void doOverlays( eBBlock **ebbs, int count)
+{
+    /* check if the parameters and local variables
+       of this function can be put in the overlay segment
+       This check is essentially to see if the function
+       calls any other functions if yes then we cannot
+       overlay */
+    if (canOverlayLocals(ebbs,count))
+       /* if we can then put the parameters &
+          local variables in the overlay set */
+       overlay2Set();       
+    else
+       /* otherwise put them into data where
+          they belong */
+       overlay2data();
+}
+
 /*-----------------------------------------------------------------*/
 /* printAllocInfo - prints allocation information for a function   */
 /*-----------------------------------------------------------------*/