X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCmem.c;h=b1e192e0169790a8ed915d7e3451b97fc4d00d47;hb=2fa210072055dd1d0dccd08192a6a6039d3ef8b9;hp=a0e137d4998f46178c3f452ce389a5f8117738cf;hpb=8ca6e6b0b974cbce5ae477ff71e64d5b3322bb3a;p=fw%2Fsdcc diff --git a/src/SDCCmem.c b/src/SDCCmem.c index a0e137d4..b1e192e0 100644 --- a/src/SDCCmem.c +++ b/src/SDCCmem.c @@ -104,7 +104,12 @@ initMem () DEBUG-NAME - 'B' POINTER-TYPE - POINTER */ - istack = allocMap (0, 0, 0, 0, 0, 0, options.stack_loc, ISTACK_NAME, 'B', POINTER); + if (ISTACK_NAME) { + istack = allocMap (0, 0, 0, 0, 0, 0, options.stack_loc, + ISTACK_NAME, 'B', POINTER); + } else { + istack=NULL; + } /* code segment ; SFRSPACE - NO @@ -164,7 +169,11 @@ initMem () DEBUG-NAME - 'E' POINTER-TYPE - POINTER */ - overlay = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME, 'E', POINTER); + if (OVERLAY_NAME) { + overlay = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME, 'E', POINTER); + } else { + overlay = NULL; + } /* Xternal Data segment - SFRSPACE - NO @@ -190,7 +199,12 @@ initMem () DEBUG-NAME - 'G' POINTER-TYPE - IPOINTER */ - idata = allocMap (0, 0, 0, 0, 0, 0, options.idata_loc, IDATA_NAME, 'G', IPOINTER); + if (IDATA_NAME) { + idata = allocMap (0, 0, 0, 0, 0, 0, options.idata_loc, + IDATA_NAME, 'G', IPOINTER); + } else { + idata=NULL; + } /* Static segment (code for variables ); SFRSPACE - NO @@ -381,16 +395,19 @@ allocGlobal (symbol * sym) } /* if it is fixed, then allocate depending on the */ - /* current memory model,same for automatics */ + /* current memory model, same for automatics */ if (SPEC_SCLS (sym->etype) == S_FIXED || - SPEC_SCLS (sym->etype) == S_AUTO) - { + SPEC_SCLS (sym->etype) == S_AUTO) { + if (port->mem.default_globl_map != xdata) { /* set the output class */ SPEC_OCLS (sym->etype) = port->mem.default_globl_map; /* generate the symbol */ allocIntoSeg (sym); return; + } else { + SPEC_SCLS (sym->etype) = S_XDATA; } + } /* if code change to constant */ if (SPEC_SCLS (sym->etype) == S_CODE) { @@ -401,12 +418,12 @@ allocGlobal (symbol * sym) if (SPEC_SCLS (sym->etype) == S_XDATA) { - SPEC_OCLS (sym->etype) = xdata; // should we move this to the initialized data segment? if (port->genXINIT && sym->ival && (sym->level==0) && !SPEC_ABSA(sym->etype)) { SPEC_OCLS(sym->etype)=xidata; - addSet(&xidata->syms, sym); + } else { + SPEC_OCLS (sym->etype) = xdata; } allocIntoSeg (sym); return; @@ -543,14 +560,13 @@ deallocParms (value * val) /* unmark is myparm */ lval->sym->ismyparm = 0; - /* if on stack then depending on which stack */ /* delete it from the symbol table */ deleteSym (SymbolTab, lval->sym, lval->sym->name); if (!lval->sym->isref) { - lval->sym->allocreq = 1; + lval->sym->allocreq = 0; werror (W_NO_REFERENCE, currFunc->name, "function argument", lval->sym->name); } @@ -721,7 +737,7 @@ deallocLocal (symbol * csym) for (sym = csym; sym; sym = sym->next) { - if (sym->_isparm) + if (sym->_isparm) continue; /* if it is on the stack */ @@ -828,6 +844,8 @@ allocVariables (symbol * symChain) /* if register bank specified then update maxRegBank */ if (maxRegBank < FUNC_REGBANK (csym->type)) maxRegBank = FUNC_REGBANK (csym->type); + /*JCF: Mark the register bank as used*/ + RegBankUsed[FUNC_REGBANK(csym->type)]=1; } /* if this is a extern variable then change the */ @@ -1061,6 +1079,10 @@ canOverlayLocals (eBBlock ** ebbs, int count) void doOverlays (eBBlock ** ebbs, int count) { + if (!overlay) { + return; + } + /* 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 @@ -1098,4 +1120,5 @@ printAllocInfo (symbol * func, FILE * of) printAllocInfoSeg (idata, func, of); printAllocInfoSeg (sfr, func, of); printAllocInfoSeg (sfrbit, func, of); + fprintf (of, ";------------------------------------------------------------\n"); }