X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCglue.c;h=45d374228148f75f9a0f1bed58d43e907d4508f8;hb=f3bb9804b6fc03d01d2eba03d578863e8b63e06c;hp=e1e8f3232069203868c5db506bb60b0e94e1d9c8;hpb=6cf005ad44bcebf9a5d6f6b8efdac2f85488cfa8;p=fw%2Fsdcc diff --git a/src/SDCCglue.c b/src/SDCCglue.c index e1e8f323..45d37422 100644 --- a/src/SDCCglue.c +++ b/src/SDCCglue.c @@ -60,7 +60,7 @@ DEFSETFUNC (closeTmpFiles) } /*-----------------------------------------------------------------*/ -/* rmTmpFiles - closes all tmp files created by the compiler */ +/* rmTmpFiles - unlinks all tmp files created by the compiler */ /* because of BRAIN DEAD MS/DOS & CYGNUS Libraries */ /*-----------------------------------------------------------------*/ DEFSETFUNC (rmTmpFiles) @@ -75,6 +75,21 @@ DEFSETFUNC (rmTmpFiles) return 0; } +/*-----------------------------------------------------------------*/ +/* rm_tmpfiles - close and remove temporary files and delete sets */ +/*-----------------------------------------------------------------*/ +void +rm_tmpfiles (void) +{ + /* close temporary files */ + applyToSet (tmpfileSet, closeTmpFiles); + /* remove temporary files */ + applyToSet (tmpfileNameSet, rmTmpFiles); + /* delete temorary file sets */ + deleteSet (&tmpfileSet); + deleteSet (&tmpfileNameSet); +} + /*-----------------------------------------------------------------*/ /* copyFile - copies source file to destination file */ /*-----------------------------------------------------------------*/ @@ -154,9 +169,11 @@ aopLiteral (value * val, int offset) static void emitRegularMap (memmap * map, bool addPublics, bool arFlag) { - symbol *sym, *symIval; + symbol *sym; ast *ival = NULL; - memmap *segment; + + if (!map) + return; if (addPublics) { @@ -176,7 +193,6 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) { symbol *newSym=NULL; - /* if extern then add it into the extern list */ if (IS_EXTERN (sym->etype)) { @@ -236,17 +252,15 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) // create a new "XINIT (CODE)" symbol, that will be emitted later newSym=copySymbol (sym); SPEC_OCLS(newSym->etype)=xinit; - sprintf (newSym->name, "_xinit_%s", sym->name); - sprintf (newSym->rname,"_xinit_%s", sym->rname); + sprintf (newSym->name, "__xinit_%s", sym->name); + sprintf (newSym->rname,"__xinit_%s", sym->rname); SPEC_CONST(newSym->etype)=1; - //SPEC_STAT(newSym->etype)=1; - addSym (SymbolTab, newSym, newSym->name, 0, 0, 1); - + SPEC_STAT(newSym->etype)=1; + resolveIvalSym(newSym->ival); + // add it to the "XINIT (CODE)" segment addSet(&xinit->syms, newSym); - - //fprintf (stderr, "moved %s from xdata to xidata\n", sym->rname); - + sym->ival=NULL; } else { if (IS_AGGREGATE (sym->type)) { ival = initAggregates (sym, sym->ival, NULL); @@ -260,15 +274,6 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) } codeOutFile = statsg->oFile; -#if 0 - if (ival) { - // set ival's lineno to where the symbol was defined - lineno=ival->lineno=sym->lineDef; - allocInfo = 0; - eBBlockFromiCode (iCodeFromAst (ival)); - allocInfo = 1; - } -#else if (ival) { // set ival's lineno to where the symbol was defined setAstLineno (ival, lineno=sym->lineDef); @@ -281,20 +286,7 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) eBBlockFromiCode (iCodeFromAst (ival)); allocInfo = 1; } -#endif } - - /* if the ival is a symbol assigned to an aggregate, - (bug #458099 -> #462479) - we don't need it anymore, so delete it from its segment */ - if (sym->ival->type == INIT_NODE && - IS_AST_SYM_VALUE(sym->ival->init.node) && - IS_AGGREGATE (sym->type) ) { - symIval=AST_SYMBOL(sym->ival->init.node); - segment = SPEC_OCLS (symIval->etype); - deleteSetItem (&segment->syms, symIval); - } - sym->ival = NULL; } @@ -302,32 +294,36 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) an equate for this no need to allocate space */ if (SPEC_ABSA (sym->etype)) { + char *equ="="; if (options.debug) { fprintf (map->oFile, " == 0x%04x\n", SPEC_ADDR (sym->etype)); } - fprintf (map->oFile, "%s\t=\t0x%04x\n", - sym->rname, + if (TARGET_IS_XA51) { + if (map==sfr) { + equ="sfr"; + } else if (map==bit || map==sfrbit) { + equ="bit"; + } + } + fprintf (map->oFile, "%s\t%s\t0x%04x\n", + sym->rname, equ, SPEC_ADDR (sym->etype)); } else { - if (newSym) { - // this has been moved to another segment - } else { - int size = getSize (sym->type); - if (size==0) { - werror(E_UNKNOWN_SIZE,sym->name); - } - /* allocate space */ - if (options.debug) { - fprintf (map->oFile, "==.\n"); - } - if (IS_STATIC (sym->etype)) - tfprintf (map->oFile, "!slabeldef\n", sym->rname); - else - tfprintf (map->oFile, "!labeldef\n", sym->rname); - tfprintf (map->oFile, "\t!ds\n", - (unsigned int) size & 0xffff); - } + int size = getSize (sym->type); + if (size==0) { + werror(E_UNKNOWN_SIZE,sym->name); + } + /* allocate space */ + if (options.debug) { + fprintf (map->oFile, "==.\n"); + } + if (IS_STATIC (sym->etype)) + tfprintf (map->oFile, "!slabeldef\n", sym->rname); + else + tfprintf (map->oFile, "!labeldef\n", sym->rname); + tfprintf (map->oFile, "\t!ds\n", + (unsigned int) size & 0xffff); } } } @@ -336,7 +332,7 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) /* initPointer - pointer initialization code massaging */ /*-----------------------------------------------------------------*/ value * -initPointer (initList * ilist) +initPointer (initList * ilist, sym_link *toType) { value *val; ast *expr = list2expr (ilist); @@ -348,6 +344,29 @@ initPointer (initList * ilist) if ((val = constExprValue (expr, FALSE))) return val; + /* ( ptr + constant ) */ + if (IS_AST_OP (expr) && + (expr->opval.op == '+' || expr->opval.op == '-') && + IS_AST_SYM_VALUE (expr->left) && + (IS_ARRAY(expr->left->ftype) || IS_PTR(expr->left->ftype)) && + compareType(toType, expr->left->ftype) && + IS_AST_LIT_VALUE (expr->right)) { + return valForCastAggr (expr->left, expr->left->ftype, + expr->right, + expr->opval.op); + } + + /* (char *)&a */ + if (IS_AST_OP(expr) && expr->opval.op==CAST && + IS_AST_OP(expr->right) && expr->right->opval.op=='&') { + if (compareType(toType, expr->left->ftype)!=1) { + werror (W_INIT_WRONG); + printFromToType(expr->left->ftype, toType); + } + // skip the cast ??? + expr=expr->right; + } + /* no then we have to do these cludgy checks */ /* pointers can be initialized with address of a variable or address of an array element */ @@ -409,7 +428,6 @@ initPointer (initList * ilist) expr->right, expr->opval.op); } - /* case 4. (char *)(array type) */ if (IS_CAST_OP(expr) && IS_AST_SYM_VALUE (expr->right) && IS_ARRAY(expr->right->ftype)) { @@ -435,7 +453,7 @@ initPointer (initList * ilist) return val; } wrong: - werror (W_INIT_WRONG); + werror (E_INCOMPAT_PTYPES); return NULL; } @@ -499,20 +517,18 @@ pointerTypeToGPByte (const int p_type, const char *iname, const char *oname) { case IPOINTER: case POINTER: - return 0; + return GPTYPE_NEAR; case GPOINTER: - /* hack - if we get a generic pointer, we just assume - * it's an FPOINTER (i.e. in XDATA space). - */ - werror (E_CANNOT_USE_GENERIC_POINTER, iname, oname); + werror (E_CANNOT_USE_GENERIC_POINTER, + iname ? iname : "", + oname ? oname : ""); exit (1); - // fall through case FPOINTER: - return 1; + return GPTYPE_FAR; case CPOINTER: - return 2; + return GPTYPE_CODE; case PPOINTER: - return 3; + return GPTYPE_XSTACK; default: fprintf (stderr, "*** internal error: unknown pointer type %d in GPByte.\n", p_type); @@ -733,22 +749,27 @@ printIvalChar (sym_link * type, initList * ilist, FILE * oFile, char *s) /*-----------------------------------------------------------------*/ /* printIvalArray - generates code for array initialization */ /*-----------------------------------------------------------------*/ -void +void printIvalArray (symbol * sym, sym_link * type, initList * ilist, FILE * oFile) { initList *iloop; int lcnt = 0, size = 0; + sym_link *last_type; /* take care of the special case */ /* array of characters can be init */ /* by a string */ - if (IS_CHAR (type->next)) + if (IS_CHAR (type->next)) { + if (!IS_LITERAL(list2val(ilist)->etype)) { + werror (E_CONST_EXPECTED); + return; + } if (printIvalChar (type, (ilist->type == INIT_DEEP ? ilist->init.deep : ilist), oFile, SPEC_CVAL (sym->etype).v_char)) return; - + } /* not the special case */ if (ilist->type != INIT_DEEP) { @@ -758,6 +779,8 @@ printIvalArray (symbol * sym, sym_link * type, initList * ilist, iloop = ilist->init.deep; lcnt = DCL_ELEM (type); + for (last_type = type->next; last_type && DCL_ELEM (last_type); last_type = last_type->next) + lcnt *= DCL_ELEM (last_type); for (;;) { @@ -799,6 +822,21 @@ printIvalFuncPtr (sym_link * type, initList * ilist, FILE * oFile) int dLvl = 0; val = list2val (ilist); + + if (!val) { + // an error has been thrown allready + val=constVal("0"); + } + + if (IS_LITERAL(val->etype)) { + if (compareType(type,val->etype)==0) { + werror (E_INCOMPAT_TYPES); + printFromToType (val->type, type); + } + printIvalCharPtr (NULL, type, val, oFile); + return; + } + /* check the types */ if ((dLvl = compareType (val->type, type->next)) <= 0) { @@ -898,8 +936,8 @@ printIvalCharPtr (symbol * sym, sym_link * type, value * val, FILE * oFile) aopLiteral (val, 0), aopLiteral (val, 1)); break; case 3: - // mcs51 generic pointer - if (floatFromVal(val)!=0) { + if (IS_GENPTR(type) && floatFromVal(val)!=0) { + // non-zero mcs51 generic pointer werror (E_LITERAL_GENERIC); } fprintf (oFile, "\t.byte %s,%s,%s\n", @@ -908,8 +946,8 @@ printIvalCharPtr (symbol * sym, sym_link * type, value * val, FILE * oFile) aopLiteral (val, 2)); break; case 4: - // ds390 generic pointer - if (floatFromVal(val)!=0) { + if (IS_GENPTR(type) && floatFromVal(val)!=0) { + // non-zero ds390 generic pointer werror (E_LITERAL_GENERIC); } fprintf (oFile, "\t.byte %s,%s,%s,%s\n", @@ -950,7 +988,7 @@ printIvalPtr (symbol * sym, sym_link * type, initList * ilist, FILE * oFile) return; } - if (!(val = initPointer (ilist))) + if (!(val = initPointer (ilist, type))) return; /* if character pointer */ @@ -959,8 +997,10 @@ printIvalPtr (symbol * sym, sym_link * type, initList * ilist, FILE * oFile) return; /* check the type */ - if (compareType (type, val->type) == 0) + if (compareType (type, val->type) == 0) { werror (W_INIT_WRONG); + printFromToType (val->type, type); + } /* if val is literal */ if (IS_LITERAL (val->etype)) @@ -976,9 +1016,9 @@ printIvalPtr (symbol * sym, sym_link * type, initList * ilist, FILE * oFile) else tfprintf (oFile, "\t.byte %s,%s\n", aopLiteral (val, 0), aopLiteral (val, 1)); break; - case 3: - fprintf (oFile, "\t.byte %s,%s,#0x02\n", - aopLiteral (val, 0), aopLiteral (val, 1)); + case 3: // how about '390?? + fprintf (oFile, "\t.byte %s,%s,#0x%d\n", + aopLiteral (val, 0), aopLiteral (val, 1), GPTYPE_CODE); } return; } @@ -1016,6 +1056,9 @@ printIval (symbol * sym, sym_link * type, initList * ilist, FILE * oFile) if (!ilist) return; + /* update line number for error msgs */ + lineno=sym->lineDef; + /* if structure then */ if (IS_STRUCT (type)) { @@ -1137,7 +1180,7 @@ emitStaticSeg (memmap * map, FILE * out) /* emitMaps - emits the code for the data portion the code */ /*-----------------------------------------------------------------*/ void -emitMaps () +emitMaps (void) { inInitMode++; /* no special considerations for the following @@ -1156,7 +1199,7 @@ emitMaps () emitStaticSeg (statsg, code->oFile); if (port->genXINIT) { - fprintf (code->oFile, "\t.area\t%s\n", xinit->sname); + tfprintf (code->oFile, "\t!area\n", xinit->sname); emitStaticSeg (xinit, code->oFile); } inInitMode--; @@ -1301,15 +1344,6 @@ emitOverlay (FILE * afile) if (elementsInSet (ovrset)) { -#if 0 - /* this dummy area is used to fool the assembler - otherwise the assembler will append each of these - declarations into one chunk and will not overlay - sad but true */ - fprintf (afile, "\t.area _DUMMY\n"); -#else - /* not anymore since asmain.c:1.13 */ -#endif /* output the area informtion */ fprintf (afile, "\t.area\t%s\n", port->mem.overlay_name); /* MOF */ } @@ -1317,8 +1351,7 @@ emitOverlay (FILE * afile) for (sym = setFirstItem (ovrset); sym; sym = setNextItem (ovrset)) { - - /* if extern then add it to the publics tabledo nothing */ + /* if extern then it is in the publics table: do nothing */ if (IS_EXTERN (sym->etype)) continue; @@ -1396,7 +1429,7 @@ emitOverlay (FILE * afile) /* glue - the final glue that hold the whole thing together */ /*-----------------------------------------------------------------*/ void -glue () +glue (void) { FILE *vFile; FILE *asmFile; @@ -1470,6 +1503,25 @@ glue () fprintf (asmFile, "; special function bits \n"); fprintf (asmFile, "%s", iComments2); copyFile (asmFile, sfrbit->oFile); + + /*JCF: Create the areas for the register banks*/ + if( TARGET_IS_MCS51 || TARGET_IS_DS390 || TARGET_IS_XA51 ) + { + if(RegBankUsed[0]||RegBankUsed[1]||RegBankUsed[2]||RegBankUsed[3]) + { + fprintf (asmFile, "%s", iComments2); + fprintf (asmFile, "; overlayable register banks \n"); + fprintf (asmFile, "%s", iComments2); + if(RegBankUsed[0]) + fprintf (asmFile, "\t.area REG_BANK_0\t(REL,OVR,DATA)\n\t.ds 8\n"); + if(RegBankUsed[1]||options.parms_in_bank1) + fprintf (asmFile, "\t.area REG_BANK_1\t(REL,OVR,DATA)\n\t.ds 8\n"); + if(RegBankUsed[2]) + fprintf (asmFile, "\t.area REG_BANK_2\t(REL,OVR,DATA)\n\t.ds 8\n"); + if(RegBankUsed[3]) + fprintf (asmFile, "\t.area REG_BANK_3\t(REL,OVR,DATA)\n\t.ds 8\n"); + } + } /* copy the data segment */ fprintf (asmFile, "%s", iComments2); @@ -1479,10 +1531,12 @@ glue () /* create the overlay segments */ - fprintf (asmFile, "%s", iComments2); - fprintf (asmFile, "; overlayable items in internal ram \n"); - fprintf (asmFile, "%s", iComments2); - copyFile (asmFile, ovrFile); + if (overlay) { + fprintf (asmFile, "%s", iComments2); + fprintf (asmFile, "; overlayable items in internal ram \n"); + fprintf (asmFile, "%s", iComments2); + copyFile (asmFile, ovrFile); + } /* create the stack segment MOF */ if (mainf && IFFUNC_HASBODY(mainf->type)) @@ -1495,10 +1549,12 @@ glue () } /* create the idata segment */ - fprintf (asmFile, "%s", iComments2); - fprintf (asmFile, "; indirectly addressable internal ram data\n"); - fprintf (asmFile, "%s", iComments2); - copyFile (asmFile, idata->oFile); + if (idata) { + fprintf (asmFile, "%s", iComments2); + fprintf (asmFile, "; indirectly addressable internal ram data\n"); + fprintf (asmFile, "%s", iComments2); + copyFile (asmFile, idata->oFile); + } /* copy the bit segment */ fprintf (asmFile, "%s", iComments2); @@ -1568,15 +1624,7 @@ glue () (unsigned int) options.xdata_loc & 0xff); } - /* initialise the stack pointer */ - /* if the user specified a value then use it */ - if (options.stack_loc) - fprintf (asmFile, "\tmov\tsp,#%d\n", options.stack_loc & 0xff); - else - /* no: we have to compute it */ - if (!options.stackOnData && maxRegBank <= 3) - fprintf (asmFile, "\tmov\tsp,#%d\n", ((maxRegBank + 1) * 8) - 1); - else + /* initialise the stack pointer. JCF: aslink takes care of the location */ fprintf (asmFile, "\tmov\tsp,#__start__stack\n"); /* MOF */ fprintf (asmFile, "\tlcall\t__sdcc_external_startup\n"); @@ -1643,18 +1691,9 @@ glue () port->genAssemblerEnd(asmFile); } fclose (asmFile); - applyToSet (tmpfileSet, closeTmpFiles); - applyToSet (tmpfileNameSet, rmTmpFiles); -} -#if defined (__MINGW32__) || defined (__CYGWIN__) || defined (_MSC_VER) -void -rm_tmpfiles (void) -{ - applyToSet (tmpfileSet, closeTmpFiles); - applyToSet (tmpfileNameSet, rmTmpFiles); + rm_tmpfiles (); } -#endif /** Creates a temporary file name a'la tmpnam which avoids the bugs in cygwin wrt c:\tmp. @@ -1663,7 +1702,6 @@ rm_tmpfiles (void) char * tempfilename (void) { -#if !defined(_MSC_VER) const char *tmpdir = NULL; if (getenv ("TMP")) tmpdir = getenv ("TMP"); @@ -1679,7 +1717,6 @@ tempfilename (void) return name; } } -#endif return tmpnam (NULL); } @@ -1690,7 +1727,6 @@ tempfilename (void) FILE * tempfile (void) { -#if !defined(_MSC_VER) const char *tmpdir = NULL; if (getenv ("TMP")) tmpdir = getenv ("TMP"); @@ -1712,7 +1748,5 @@ tempfile (void) } return NULL; } -#endif return tmpfile (); } -