X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCmem.c;h=5bc6bb92c31ea1354df22ec3801954349b6dbacc;hb=4bafa836005a601b321ee04bb15e0c27242036df;hp=a128b8b674991f130e2b4eeb2191ce88b35a80a2;hpb=4c527a8dc0a11d9bb33bebfe2fafa42e34b2895b;p=fw%2Fsdcc diff --git a/src/SDCCmem.c b/src/SDCCmem.c index a128b8b6..5bc6bb92 100644 --- a/src/SDCCmem.c +++ b/src/SDCCmem.c @@ -33,7 +33,6 @@ memmap *home = NULL; /* Unswitchable code bank */ symbols in a single overlay */ set *ovrSetSets = NULL; -int maxRegBank = 0; int fatalError = 0; /* fatal error flag */ /*-----------------------------------------------------------------*/ @@ -107,12 +106,14 @@ initMem () DEBUG-NAME - 'B' POINTER-TYPE - POINTER */ - if (ISTACK_NAME) { - istack = allocMap (0, 0, 0, 0, 0, 0, options.stack_loc, - ISTACK_NAME, 'B', POINTER); - } else { - istack=NULL; - } + 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 @@ -184,11 +185,14 @@ initMem () DEBUG-NAME - 'E' POINTER-TYPE - POINTER */ - if (IABS_NAME) { - d_abs = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, IABS_NAME, 'E', POINTER); - } else { - d_abs = NULL; - } + if (IABS_NAME) + { + d_abs = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, IABS_NAME, 'E', POINTER); + } + else + { + d_abs = NULL; + } /* overlay segment - same as internal storage segment ; SFRSPACE - NO @@ -200,11 +204,14 @@ initMem () DEBUG-NAME - 'E' POINTER-TYPE - POINTER */ - if (OVERLAY_NAME) { - overlay = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME, 'E', POINTER); - } else { - overlay = NULL; - } + if (OVERLAY_NAME) + { + overlay = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME, 'E', POINTER); + } + else + { + overlay = NULL; + } /* Xternal paged segment ; SFRSPACE - NO @@ -216,11 +223,14 @@ initMem () DEBUG-NAME - 'P' POINTER-TYPE - PPOINTER */ - if (PDATA_NAME) { - pdata = allocMap (0, 0, 1, 0, 0, 0, options.xstack_loc, PDATA_NAME, 'P', PPOINTER); - } else { - pdata = NULL; - } + if (PDATA_NAME) + { + pdata = allocMap (0, 0, 1, 0, 0, 0, options.xstack_loc, PDATA_NAME, 'P', PPOINTER); + } + else + { + pdata = NULL; + } /* Xternal Data segment - SFRSPACE - NO @@ -236,6 +246,25 @@ initMem () xidata = allocMap (0, 1, 0, 0, 0, 0, 0, XIDATA_NAME, 'F', FPOINTER); xinit = allocMap (0, 1, 0, 0, 0, 1, 0, XINIT_NAME, 'C', CPOINTER); + /* Absolute external storage segment ; + SFRSPACE - NO + FAR-SPACE - YES + PAGED - NO + DIRECT-ACCESS - NO + BIT-ACCESS - NO + CODE-ACCESS - NO + DEBUG-NAME - 'F' + POINTER-TYPE - FPOINTER + */ + if (XABS_NAME) + { + x_abs = allocMap (0, 1, 0, 0, 0, 0, options.xdata_loc, XABS_NAME, 'F', FPOINTER); + } + else + { + x_abs = NULL; + } + /* Indirectly addressed internal data segment SFRSPACE - NO FAR-SPACE - NO @@ -246,12 +275,14 @@ initMem () DEBUG-NAME - 'G' POINTER-TYPE - IPOINTER */ - if (IDATA_NAME) { - idata = allocMap (0, 0, 0, 0, 0, 0, options.idata_loc, - IDATA_NAME, 'G', IPOINTER); - } else { - idata=NULL; - } + if (IDATA_NAME) + { + idata = allocMap (0, 0, 0, 0, 0, 0, options.idata_loc, IDATA_NAME, 'G', IPOINTER); + } + else + { + idata = NULL; + } /* Indirectly addressed absolute internal segment SFRSPACE - NO @@ -263,11 +294,14 @@ initMem () DEBUG-NAME - 'E' POINTER-TYPE - IPOINTER */ - if (IABS_NAME) { - i_abs = allocMap (0, 0, 0, 0, 0, 0, options.data_loc, IABS_NAME, 'E', IPOINTER); - } else { - i_abs = NULL; - } + if (IABS_NAME) + { + i_abs = allocMap (0, 0, 0, 0, 0, 0, options.data_loc, IABS_NAME, 'E', IPOINTER); + } + else + { + i_abs = NULL; + } /* Bit space ; SFRSPACE - NO @@ -376,36 +410,52 @@ allocDefault (symbol * sym) if (sym->_isparm) return FALSE; /* if code change to constant */ - if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) { - SPEC_OCLS(sym->etype) = c_abs; - } else { - SPEC_OCLS (sym->etype) = statsg; - } + if (sym->ival && SPEC_ABSA (sym->etype)) + { + SPEC_OCLS(sym->etype) = c_abs; + } + else + { + SPEC_OCLS (sym->etype) = statsg; + } break; case S_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; - } else { - SPEC_OCLS (sym->etype) = xdata; - } + /* absolute initialized global */ + if (sym->ival && SPEC_ABSA (sym->etype)) + { + SPEC_OCLS(sym->etype) = x_abs; + } + /* or should we move this to the initialized data segment? */ + else if (port->genXINIT && sym->ival && (sym->level==0)) + { + SPEC_OCLS(sym->etype) = xidata; + } + else + { + SPEC_OCLS (sym->etype) = xdata; + } break; case S_DATA: /* absolute initialized global */ - if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) { - SPEC_OCLS(sym->etype) = d_abs; - } else { - SPEC_OCLS (sym->etype) = data; - } + if (sym->ival && SPEC_ABSA (sym->etype)) + { + SPEC_OCLS(sym->etype) = d_abs; + } + else + { + SPEC_OCLS (sym->etype) = data; + } break; case S_IDATA: /* absolute initialized global */ - if (sym->ival && (sym->level==0) && SPEC_ABSA (sym->etype)) { - SPEC_OCLS(sym->etype) = i_abs; - } else { - SPEC_OCLS (sym->etype) = idata; - } + if (sym->ival && SPEC_ABSA (sym->etype)) + { + SPEC_OCLS(sym->etype) = i_abs; + } + else + { + SPEC_OCLS (sym->etype) = idata; + } sym->iaccess = 1; break; case S_PDATA: @@ -647,11 +697,16 @@ deallocParms (value * val) if (lval->sym->rname[0]) { char buffer[SDCC_NAME_MAX]; + symbol * argsym = lval->sym; + strncpyz (buffer, lval->sym->rname, sizeof(buffer)); lval->sym = copySymbol (lval->sym); strncpyz (lval->sym->rname, buffer, sizeof(lval->sym->rname)); + strncpyz (lval->sym->name, buffer, sizeof(lval->sym->name)); - strncpyz (lval->name, buffer, sizeof(lval->name)); + /* need to keep the original name for inlining to work */ + /*strncpyz (lval->name, buffer, sizeof(lval->name)); */ + addSym (SymbolTab, lval->sym, lval->sym->name, lval->sym->level, lval->sym->block, 1); lval->sym->_isparm = 1; @@ -659,6 +714,9 @@ deallocParms (value * val) { addSet(&operKeyReset, lval->sym); } + + /* restore the original symbol */ + lval->sym = argsym; } } return; @@ -856,9 +914,9 @@ allocVariables (symbol * symChain) SPEC_EXTR (sym->etype) = 0; addSym (TypedefTab, sym, sym->name, sym->level, sym->block, 0); - continue; /* go to the next one */ + continue; /* go to the next one */ } - /* make sure it already exist */ + /* make sure it already exists */ csym = findSymWithLevel (SymbolTab, sym); if (!csym || (csym && csym->level != sym->level)) csym = sym; @@ -866,21 +924,15 @@ allocVariables (symbol * symChain) /* check the declaration */ checkDecl (csym,0); - /* if this is a function or a pointer to function */ - /* then args processing */ + /* if this is a function or a pointer to a */ + /* function then do args processing */ if (funcInChain (csym->type)) { processFuncArgs (csym); - - /* 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 */ - /* level to zero temporarily */ + /* level to zero temporarily */ if (IS_EXTERN (csym->etype) || IS_FUNC (csym->type)) { saveLevel = csym->level; @@ -892,7 +944,7 @@ allocVariables (symbol * symChain) if (IS_LITERAL (sym->etype)) continue; - /* generate the actual declaration */ + /* generate the actual declaration */ if (csym->level) { allocLocal (csym);