1 /*-----------------------------------------------------------------*/
2 /* SDCCmem.c - 8051 memory management routines */
3 /*-----------------------------------------------------------------*/
8 memmap *xstack = NULL; /* xternal stack data */
9 memmap *istack = NULL; /* internal stack */
10 memmap *code = NULL; /* code segment */
11 memmap *data = NULL; /* internal data upto 128 */
12 memmap *xdata = NULL; /* external data */
13 memmap *xidata = NULL; /* the initialized xdata */
14 memmap *xinit = NULL; /* the initializers for xidata */
15 memmap *idata = NULL; /* internal data upto 256 */
16 memmap *bit = NULL; /* bit addressable space */
17 memmap *statsg = NULL; /* the constant data segment */
18 memmap *sfr = NULL; /* register space */
19 memmap *reg = NULL; /* register space */
20 memmap *sfrbit = NULL; /* sfr bit space */
21 memmap *generic = NULL; /* is a generic pointer */
22 memmap *overlay = NULL; /* overlay segment */
23 memmap *eeprom = NULL; /* eeprom location */
24 memmap *home = NULL; /* Unswitchable code bank */
26 /* this is a set of sets each set containing
27 symbols in a single overlay */
28 set *ovrSetSets = NULL;
31 int fatalError = 0; /* fatal error flag */
33 /*-----------------------------------------------------------------*/
34 /* allocMap - allocates a memory map */
35 /*-----------------------------------------------------------------*/
37 allocMap (char rspace, /* sfr space */
38 char farmap, /* far or near segment */
39 char paged, /* can this segment be paged */
40 char direct, /* directly addressable */
41 char bitaddr, /* bit addressable space */
42 char codemap, /* this is code space */
43 unsigned sloc, /* starting location */
44 const char *name, /* 2 character name */
45 char dbName, /* debug name */
46 int ptrType /* pointer type for this space */
51 if (!(map = Safe_alloc (sizeof (memmap))))
53 werror (E_OUT_OF_MEM, __FILE__, sizeof (memmap));
57 memset (map, ZERO, sizeof (memmap));
63 map->codesp = codemap;
67 map->ptrType = ptrType;
68 if (!(map->oFile = tempfile ()))
70 werror (E_TMPFILE_FAILED);
73 addSetHead (&tmpfileSet, map->oFile);
78 /*-----------------------------------------------------------------*/
79 /* initMem - allocates and initializes all the segments */
80 /*-----------------------------------------------------------------*/
84 /* allocate all the segments */
85 /* xternal stack segment ;
93 POINTER-TYPE - FPOINTER
95 xstack = allocMap (0, 1, 1, 0, 0, 0, options.xstack_loc, XSTACK_NAME, 'A', PPOINTER);
97 /* internal stack segment ;
105 POINTER-TYPE - POINTER
107 istack = allocMap (0, 0, 0, 0, 0, 0, options.stack_loc, ISTACK_NAME, 'B', POINTER);
117 POINTER-TYPE - CPOINTER
119 code = allocMap (0, 1, 0, 0, 0, 1, options.code_loc, CODE_NAME, 'C', CPOINTER);
129 POINTER-TYPE - CPOINTER
131 home = allocMap (0, 1, 0, 0, 0, 1, options.code_loc, CODE_NAME, 'C', CPOINTER);
133 /* Static segment (code for variables );
141 POINTER-TYPE - CPOINTER
143 statsg = allocMap (0, 1, 0, 0, 0, 1, 0, STATIC_NAME, 'D', CPOINTER);
145 /* Data segment - internal storage segment ;
153 POINTER-TYPE - POINTER
155 data = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME, 'E', POINTER);
157 /* overlay segment - same as internal storage segment ;
165 POINTER-TYPE - POINTER
167 overlay = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME, 'E', POINTER);
169 /* Xternal Data segment -
177 POINTER-TYPE - FPOINTER
179 xdata = allocMap (0, 1, 0, 0, 0, 0, options.xdata_loc, XDATA_NAME, 'F', FPOINTER);
180 xidata = allocMap (0, 1, 0, 0, 0, 0, 0, XIDATA_NAME, 'F', FPOINTER);
181 xinit = allocMap (0, 1, 0, 0, 0, 1, 0, XINIT_NAME, 'C', CPOINTER);
183 /* Inderectly addressed internal data segment
191 POINTER-TYPE - IPOINTER
193 idata = allocMap (0, 0, 0, 0, 0, 0, options.idata_loc, IDATA_NAME, 'G', IPOINTER);
195 /* Static segment (code for variables );
203 POINTER-TYPE - _NONE_
205 bit = allocMap (0, 0, 0, 1, 1, 0, 0, BIT_NAME, 'H', 0);
207 /* Special function register space :-
215 POINTER-TYPE - _NONE_
217 sfr = allocMap (1, 0, 0, 1, 0, 0, 0, REG_NAME, 'I', 0);
227 POINTER-TYPE - _NONE_
229 reg = allocMap (1, 0, 0, 0, 0, 0, 0, REG_NAME, ' ', 0);
239 POINTER-TYPE - _NONE_
241 sfrbit = allocMap (1, 0, 0, 1, 1, 0, 0, REG_NAME, 'J', 0);
251 POINTER-TYPE - EEPPOINTER
253 eeprom = allocMap (0, 1, 0, 0, 0, 0, 0, REG_NAME, 'K', EEPPOINTER);
255 /* the unknown map */
256 generic = allocMap (1, 0, 0, 1, 1, 0, 0, REG_NAME, ' ', GPOINTER);
260 /*-----------------------------------------------------------------*/
261 /* allocIntoSeg - puts a symbol into a memory segment */
262 /*-----------------------------------------------------------------*/
264 allocIntoSeg (symbol * sym)
266 memmap *segment = SPEC_OCLS (sym->etype);
267 // should we move this to the initialized data segment?
268 if (port->genXINIT && segment==xdata &&
269 sym->ival && sym->level==0 && !SPEC_ABSA(sym->etype)) {
270 segment=SPEC_OCLS(sym->etype)=xidata;
272 addSet (&segment->syms, sym);
275 /*-----------------------------------------------------------------*/
276 /* allocGlobal - assigns the output segment to a global var */
277 /*-----------------------------------------------------------------*/
279 allocGlobal (symbol * sym)
282 /* symbol name is internal name */
283 if (!sym->level) /* local statics can come here */
284 sprintf (sym->rname, "%s%s", port->fun_prefix, sym->name);
286 /* add it to the operandKey reset */
287 addSet (&operKeyReset, sym);
289 /* if this is a literal e.g. enumerated type */
290 /* put it in the data segment & do nothing */
291 if (IS_LITERAL (sym->etype))
293 SPEC_OCLS (sym->etype) = data;
297 /* if this is a function then assign code space */
298 if (IS_FUNC (sym->type))
300 SPEC_OCLS (sym->etype) = code;
301 /* if this is an interrupt service routine
302 then put it in the interrupt service array */
303 if (FUNC_ISISR (sym->type))
306 if (interrupts[FUNC_INTNO (sym->type)])
307 werror (E_INT_DEFINED,
308 FUNC_INTNO (sym->type),
309 interrupts[FUNC_INTNO (sym->type)]->name);
311 interrupts[FUNC_INTNO (sym->type)] = sym;
313 /* automagically extend the maximum interrupts */
314 if (FUNC_INTNO (sym->type) >= maxInterrupts)
315 maxInterrupts = FUNC_INTNO (sym->type) + 1;
317 /* if it is not compiler defined */
324 /* if this is a SFR or SBIT */
325 if (SPEC_SCLS (sym->etype) == S_SFR ||
326 SPEC_SCLS (sym->etype) == S_SBIT)
329 /* if both absolute address & initial */
330 /* value specified then error */
331 if (IS_ABSOLUTE (sym->etype) && sym->ival)
333 werror (E_SFR_INIT, sym->name);
337 SPEC_OCLS (sym->etype) =
338 (SPEC_SCLS (sym->etype) == S_SFR ? sfr : sfrbit);
344 /* if this is a bit variable and no storage class */
345 if (SPEC_NOUN (sym->etype) == V_BIT
346 && SPEC_SCLS (sym->etype) == S_BIT)
348 SPEC_OCLS (sym->etype) = bit;
353 /* if bit storage class */
354 if (SPEC_SCLS (sym->etype) == S_SBIT)
356 SPEC_OCLS (sym->etype) = bit;
361 /* register storage class ignored changed to FIXED */
362 if (SPEC_SCLS (sym->etype) == S_REGISTER)
363 SPEC_SCLS (sym->etype) = S_FIXED;
365 /* if data specified then */
366 if (SPEC_SCLS (sym->etype) == S_DATA)
368 /* set the output class */
369 SPEC_OCLS (sym->etype) = data;
370 /* generate the symbol */
375 /* if it is fixed, then allocate depending on the */
376 /* current memory model,same for automatics */
377 if (SPEC_SCLS (sym->etype) == S_FIXED ||
378 SPEC_SCLS (sym->etype) == S_AUTO)
380 /* set the output class */
381 SPEC_OCLS (sym->etype) = port->mem.default_globl_map;
382 /* generate the symbol */
387 /* if code change to constant */
388 if (SPEC_SCLS (sym->etype) == S_CODE) {
389 SPEC_OCLS (sym->etype) = statsg;
394 if (SPEC_SCLS (sym->etype) == S_XDATA)
396 SPEC_OCLS (sym->etype) = xdata;
401 if (SPEC_SCLS (sym->etype) == S_IDATA)
403 SPEC_OCLS (sym->etype) = idata;
409 if (SPEC_SCLS (sym->etype) == S_EEPROM)
411 SPEC_OCLS (sym->etype) = eeprom;
419 /*-----------------------------------------------------------------*/
420 /* allocParms - parameters are always passed on stack */
421 /*-----------------------------------------------------------------*/
423 allocParms (value * val)
428 for (lval = val; lval; lval = lval->next, pNum++)
431 /* check the declaration */
432 checkDecl (lval->sym, 0);
434 /* if this a register parm then allocate
435 it as a local variable by adding it
436 to the first block we see in the body */
437 if (IS_REGPARM (lval->etype))
440 /* mark it as my parameter */
441 lval->sym->ismyparm = 1;
442 lval->sym->localof = currFunc;
445 /* if automatic variables r 2b stacked */
446 if (options.stackAuto || IFFUNC_ISREENT (currFunc->type))
450 lval->sym->onStack = 1;
452 /* choose which stack 2 use */
453 /* use xternal stack */
454 if (options.useXstack)
456 /* PENDING: stack direction support */
457 SPEC_OCLS (lval->etype) = SPEC_OCLS (lval->sym->etype) = xstack;
458 SPEC_STAK (lval->etype) = SPEC_STAK (lval->sym->etype) = lval->sym->stack =
459 xstackPtr - getSize (lval->type);
460 xstackPtr -= getSize (lval->type);
463 { /* use internal stack */
464 SPEC_OCLS (lval->etype) = SPEC_OCLS (lval->sym->etype) = istack;
465 if (port->stack.direction > 0)
467 SPEC_STAK (lval->etype) = SPEC_STAK (lval->sym->etype) = lval->sym->stack =
468 stackPtr - (FUNC_REGBANK (currFunc->type) ? port->stack.bank_overhead : 0) -
469 getSize (lval->type) -
470 (FUNC_ISISR (currFunc->type) ? port->stack.isr_overhead : 0);
471 stackPtr -= getSize (lval->type);
475 /* This looks like the wrong order but it turns out OK... */
476 /* PENDING: isr, bank overhead, ... */
477 SPEC_STAK (lval->etype) = SPEC_STAK (lval->sym->etype) = lval->sym->stack =
479 ((IFFUNC_ISBANKEDCALL (currFunc->type) && !SPEC_STAT(getSpec(currFunc->etype)))? port->stack.banked_overhead : 0) +
480 (FUNC_ISISR (currFunc->type) ? port->stack.isr_overhead : 0) +
482 stackPtr += getSize (lval->type);
485 allocIntoSeg (lval->sym);
488 { /* allocate them in the automatic space */
489 /* generate a unique name */
490 sprintf (lval->sym->rname, "%s%s_PARM_%d", port->fun_prefix, currFunc->name, pNum);
491 strcpy (lval->name, lval->sym->rname);
493 /* if declared in external storage */
494 if (SPEC_SCLS (lval->etype) == S_XDATA)
495 SPEC_OCLS (lval->etype) = SPEC_OCLS (lval->sym->etype) = xdata;
497 /* other wise depending on the memory model
498 note here that we put it into the overlay segment
499 first, we will remove it from the overlay segment
500 after the overlay determination has been done */
501 if (options.model == MODEL_SMALL)
503 SPEC_OCLS (lval->etype) = SPEC_OCLS (lval->sym->etype) =
504 (options.noOverlay ? port->mem.default_local_map
509 SPEC_SCLS (lval->etype) = S_XDATA;
510 SPEC_OCLS (lval->etype) = SPEC_OCLS (lval->sym->etype) = xdata;
512 allocIntoSeg (lval->sym);
519 /*-----------------------------------------------------------------*/
520 /* deallocParms - parameters are always passed on stack */
521 /*-----------------------------------------------------------------*/
523 deallocParms (value * val)
527 for (lval = val; lval; lval = lval->next)
530 /* unmark is myparm */
531 lval->sym->ismyparm = 0;
532 /* if on stack then depending on which stack */
534 /* delete it from the symbol table */
535 deleteSym (SymbolTab, lval->sym, lval->sym->name);
537 if (!lval->sym->isref)
539 lval->sym->allocreq = 1;
540 werror (W_NO_REFERENCE, currFunc->name,
541 "function argument", lval->sym->name);
544 /* move the rname if any to the name for both val & sym */
545 /* and leave a copy of it in the symbol table */
546 if (lval->sym->rname[0])
548 char buffer[SDCC_NAME_MAX];
549 strcpy (buffer, lval->sym->rname);
550 lval->sym = copySymbol (lval->sym);
551 strcpy (lval->sym->rname, buffer);
552 strcpy (lval->name, strcpy (lval->sym->name, lval->sym->rname));
553 addSym (SymbolTab, lval->sym, lval->sym->name,
554 lval->sym->level, lval->sym->block, 1);
555 lval->sym->_isparm = 1;
556 addSet (&operKeyReset, lval->sym);
564 /*-----------------------------------------------------------------*/
565 /* allocLocal - allocate local variables */
566 /*-----------------------------------------------------------------*/
568 allocLocal (symbol * sym)
571 /* generate an unique name */
572 sprintf (sym->rname, "%s%s_%s_%d_%d",
574 currFunc->name, sym->name, sym->level, sym->block);
577 sym->localof = currFunc;
579 /* if this is a static variable */
580 if (IS_STATIC (sym->etype))
587 /* if volatile then */
588 if (IS_VOLATILE (sym->etype))
591 /* this is automatic */
593 /* if it to be placed on the stack */
594 if (options.stackAuto || reentrant) {
596 if (options.useXstack) {
597 /* PENDING: stack direction for xstack */
598 SPEC_OCLS (sym->etype) = xstack;
599 SPEC_STAK (sym->etype) = sym->stack = (xstackPtr + 1);
600 xstackPtr += getSize (sym->type);
602 SPEC_OCLS (sym->etype) = istack;
603 if (port->stack.direction > 0) {
604 SPEC_STAK (sym->etype) = sym->stack = (stackPtr + 1);
605 stackPtr += getSize (sym->type);
607 stackPtr -= getSize (sym->type);
608 SPEC_STAK (sym->etype) = sym->stack = stackPtr;
615 /* else depending on the storage class specified */
616 if (SPEC_SCLS (sym->etype) == S_XDATA)
618 SPEC_OCLS (sym->etype) = xdata;
623 if (SPEC_SCLS (sym->etype) == S_CODE && !sym->_isparm) {
624 SPEC_OCLS (sym->etype) = statsg;
629 if (SPEC_SCLS (sym->etype) == S_IDATA)
631 SPEC_OCLS (sym->etype) = idata;
637 /* if this is a function then assign code space */
638 if (IS_FUNC (sym->type))
640 SPEC_OCLS (sym->etype) = code;
644 /* if this is a SFR or SBIT */
645 if (SPEC_SCLS (sym->etype) == S_SFR ||
646 SPEC_SCLS (sym->etype) == S_SBIT)
649 /* if both absolute address & initial */
650 /* value specified then error */
651 if (IS_ABSOLUTE (sym->etype) && sym->ival)
653 werror (E_SFR_INIT, sym->name);
657 SPEC_OCLS (sym->etype) =
658 (SPEC_SCLS (sym->etype) == S_SFR ? sfr : sfrbit);
664 /* if this is a bit variable and no storage class */
665 if (SPEC_NOUN (sym->etype) == V_BIT
666 && (SPEC_SCLS (sym->etype) == S_BIT))
668 SPEC_OCLS (sym->etype) = bit;
673 if (SPEC_SCLS (sym->etype) == S_DATA)
675 SPEC_OCLS (sym->etype) = (options.noOverlay ? data : overlay);
680 if (SPEC_SCLS (sym->etype) == S_EEPROM)
682 SPEC_OCLS (sym->etype) = eeprom;
687 /* again note that we have put it into the overlay segment
688 will remove and put into the 'data' segment if required after
689 overlay analysis has been done */
690 if (options.model == MODEL_SMALL) {
691 SPEC_OCLS (sym->etype) =
692 (options.noOverlay ? port->mem.default_local_map
695 SPEC_OCLS (sym->etype) = port->mem.default_local_map;
700 /*-----------------------------------------------------------------*/
701 /* deallocLocal - deallocates the local variables */
702 /*-----------------------------------------------------------------*/
704 deallocLocal (symbol * csym)
708 for (sym = csym; sym; sym = sym->next)
713 /* if it is on the stack */
716 if (options.useXstack)
717 xstackPtr -= getSize (sym->type);
719 stackPtr -= getSize (sym->type);
721 /* if not used give a warning */
722 if (!sym->isref && !IS_STATIC (sym->etype))
723 werror (W_NO_REFERENCE, currFunc->name,
724 "local variable", sym->name);
725 /* now delete it from the symbol table */
726 deleteSym (SymbolTab, sym, sym->name);
730 /*-----------------------------------------------------------------*/
731 /* overlay2data - moves declarations from the overlay seg to data */
732 /*-----------------------------------------------------------------*/
738 for (sym = setFirstItem (overlay->syms); sym;
739 sym = setNextItem (overlay->syms))
742 SPEC_OCLS (sym->etype) = data;
746 setToNull ((void **) &overlay->syms);
750 /*-----------------------------------------------------------------*/
751 /* overlay2Set - will add all symbols from the overlay segment to */
752 /* the set of sets containing the overlable symbols */
753 /*-----------------------------------------------------------------*/
760 for (sym = setFirstItem (overlay->syms); sym;
761 sym = setNextItem (overlay->syms))
767 setToNull ((void **) &overlay->syms);
768 addSet (&ovrSetSets, oset);
772 /*-----------------------------------------------------------------*/
773 /* allocVariables - creates decl & assign storage class for a v */
774 /*-----------------------------------------------------------------*/
776 allocVariables (symbol * symChain)
783 /* go thru the symbol chain */
784 for (sym = symChain; sym; sym = sym->next)
787 /* if this is a typedef then add it */
788 /* to the typedef table */
789 if (IS_TYPEDEF (sym->etype))
791 /* check if the typedef already exists */
792 csym = findSym (TypedefTab, NULL, sym->name);
793 if (csym && csym->level == sym->level)
794 werror (E_DUPLICATE_TYPEDEF, sym->name);
796 addSym (TypedefTab, sym, sym->name, sym->level, sym->block, 0);
797 continue; /* go to the next one */
799 /* make sure it already exist */
800 csym = findSymWithLevel (SymbolTab, sym);
801 if (!csym || (csym && csym->level != sym->level))
804 /* check the declaration */
807 /* if this is a function or a pointer to function */
808 /* then args processing */
809 if (funcInChain (csym->type))
811 #if 1 // jwk: TODO should have been done already in addDecl() (oclass????)
812 processFuncArgs (csym);
814 /* if register bank specified then update maxRegBank */
815 if (maxRegBank < FUNC_REGBANK (csym->type))
816 maxRegBank = FUNC_REGBANK (csym->type);
819 /* if this is a extern variable then change the */
820 /* level to zero temporarily */
821 if (IS_EXTERN (csym->etype) || IS_FUNC (csym->type))
823 saveLevel = csym->level;
827 /* if this is a literal then it is an enumerated */
828 /* type so need not allocate it space for it */
829 if (IS_LITERAL (sym->etype))
832 /* generate the actual declaration */
837 stack += getSize (csym->type);
842 /* restore the level */
843 if (IS_EXTERN (csym->etype) || IS_FUNC (csym->type))
844 csym->level = saveLevel;
850 /*-----------------------------------------------------------------*/
851 /* redoStackOffsets :- will reassign the values for stack offsets */
852 /*-----------------------------------------------------------------*/
854 redoStackOffsets (void)
860 /* after register allocation is complete we know
861 which variables will need to be assigned space
862 on the stack. We will eliminate those variables
863 which do not have the allocReq flag thus reducing
865 for (sym = setFirstItem (istack->syms); sym;
866 sym = setNextItem (istack->syms))
869 int size = getSize (sym->type);
870 /* nothing to do with parameters so continue */
871 if ((sym->_isparm && !IS_REGPARM (sym->etype)))
874 if (IS_AGGREGATE (sym->type))
876 if (port->stack.direction > 0)
878 SPEC_STAK (sym->etype) = sym->stack = (sPtr + 1);
884 SPEC_STAK (sym->etype) = sym->stack = sPtr;
889 /* if allocation not required then subtract
890 size from overall stack size & continue */
893 currFunc->stack -= size;
894 SPEC_STAK (currFunc->etype) -= size;
898 if (port->stack.direction > 0)
900 SPEC_STAK (sym->etype) = sym->stack = (sPtr + 1);
906 SPEC_STAK (sym->etype) = sym->stack = sPtr;
910 /* do the same for the external stack */
912 for (sym = setFirstItem (xstack->syms); sym;
913 sym = setNextItem (xstack->syms))
916 int size = getSize (sym->type);
917 /* nothing to do with parameters so continue */
918 if ((sym->_isparm && !IS_REGPARM (sym->etype)))
921 if (IS_AGGREGATE (sym->type))
923 SPEC_STAK (sym->etype) = sym->stack = (xsPtr + 1);
928 /* if allocation not required then subtract
929 size from overall stack size & continue */
932 currFunc->xstack -= size;
933 SPEC_STAK (currFunc->etype) -= size;
937 SPEC_STAK (sym->etype) = sym->stack = (xsPtr + 1);
941 /* if the debug option is set then output the
942 symbols to the map file */
945 for (sym = setFirstItem (istack->syms); sym;
946 sym = setNextItem (istack->syms))
947 cdbSymbol (sym, cdbFile, FALSE, FALSE);
949 for (sym = setFirstItem (xstack->syms); sym;
950 sym = setNextItem (xstack->syms))
951 cdbSymbol (sym, cdbFile, FALSE, FALSE);
955 /*-----------------------------------------------------------------*/
956 /* printAllocInfoSeg- print the allocation for a given section */
957 /*-----------------------------------------------------------------*/
959 printAllocInfoSeg (memmap * map, symbol * func, FILE * of)
968 for (sym = setFirstItem (map->syms); sym;
969 sym = setNextItem (map->syms))
974 if (sym->localof != func)
976 fprintf (of, ";%-25s Allocated to ", sym->name);
978 /* if assigned to registers */
979 if (!sym->allocreq && sym->reqv)
982 sym = OP_SYMBOL (sym->reqv);
983 fprintf (of, "registers ");
984 for (i = 0; i < 4 && sym->regs[i]; i++)
985 fprintf (of, "%s ", port->getRegName (sym->regs[i]));
993 fprintf (of, "stack - offset %d\n", sym->stack);
997 /* otherwise give rname */
998 fprintf (of, "in memory with name '%s'\n", sym->rname);
1002 /*-----------------------------------------------------------------*/
1003 /* canOverlayLocals - returns true if the local variables can overlayed */
1004 /*-----------------------------------------------------------------*/
1006 canOverlayLocals (eBBlock ** ebbs, int count)
1009 /* if staticAuto is in effect or the current function
1010 being compiled is reentrant or the overlay segment
1011 is empty or no overlay option is in effect then */
1012 if (options.noOverlay ||
1013 options.stackAuto ||
1015 (IFFUNC_ISREENT (currFunc->type) ||
1016 FUNC_ISISR (currFunc->type))) ||
1017 elementsInSet (overlay->syms) == 0)
1021 /* otherwise do thru the blocks and see if there
1022 any function calls if found then return false */
1023 for (i = 0; i < count; i++)
1027 for (ic = ebbs[i]->sch; ic; ic = ic->next)
1029 if (ic->op == CALL) {
1030 sym_link *ftype = operandType(IC_LEFT(ic));
1031 /* builtins only can use overlays */
1032 if (!IFFUNC_ISBUILTIN(ftype)) return FALSE;
1033 } else if (ic->op == PCALL) return FALSE;
1037 /* no function calls found return TRUE */
1041 /*-----------------------------------------------------------------*/
1042 /* doOverlays - move the overlay segment to appropriate location */
1043 /*-----------------------------------------------------------------*/
1045 doOverlays (eBBlock ** ebbs, int count)
1047 /* check if the parameters and local variables
1048 of this function can be put in the overlay segment
1049 This check is essentially to see if the function
1050 calls any other functions if yes then we cannot
1052 if (canOverlayLocals (ebbs, count))
1053 /* if we can then put the parameters &
1054 local variables in the overlay set */
1057 /* otherwise put them into data where
1062 /*-----------------------------------------------------------------*/
1063 /* printAllocInfo - prints allocation information for a function */
1064 /*-----------------------------------------------------------------*/
1066 printAllocInfo (symbol * func, FILE * of)
1071 /* must be called after register allocation is complete */
1072 fprintf (of, ";------------------------------------------------------------\n");
1073 fprintf (of, ";Allocation info for local variables in function '%s'\n", func->name);
1074 fprintf (of, ";------------------------------------------------------------\n");
1076 printAllocInfoSeg (xstack, func, of);
1077 printAllocInfoSeg (istack, func, of);
1078 printAllocInfoSeg (code, func, of);
1079 printAllocInfoSeg (data, func, of);
1080 printAllocInfoSeg (xdata, func, of);
1081 printAllocInfoSeg (idata, func, of);
1082 printAllocInfoSeg (sfr, func, of);
1083 printAllocInfoSeg (sfrbit, func, of);