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 */
{
memmap *map ;
- if (!(map = GC_malloc(sizeof(memmap)))) {
+ if (!(map = calloc(sizeof(memmap), 1))) {
werror(E_OUT_OF_MEM,__FILE__,sizeof(memmap));
exit (1);
}
/*-----------------------------------------------------------------*/
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);
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);
}
}
/* 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 ;
}
/* 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);
/*-----------------------------------------------------------------*/
/* redoStackOffsets :- will reassign the values for stack offsets */
/*-----------------------------------------------------------------*/
-void redoStackOffsets ()
+void redoStackOffsets(void)
{
symbol *sym;
int sPtr = 0;
}
}
+/*-----------------------------------------------------------------*/
+/* 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 */
/*-----------------------------------------------------------------*/