X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCglue.c;h=da74378f09a5e7171c73f0948c6a41c96106a4df;hb=80b2a5b23482ecbc28c3f70566ecafa524169016;hp=6f89cb01db600a67b5fc981255b6ae4edcead1cf;hpb=e66b24b02e50bd0b7ae4b8a2f2b7407a7f6ce32e;p=fw%2Fsdcc diff --git a/src/SDCCglue.c b/src/SDCCglue.c index 6f89cb01..da74378f 100644 --- a/src/SDCCglue.c +++ b/src/SDCCglue.c @@ -154,9 +154,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 +178,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 +237,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,41 +259,19 @@ 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); - // check if this is a constant expression - if (constExprTree(ival)) { - allocInfo = 0; - eBBlockFromiCode (iCodeFromAst (ival)); - allocInfo = 1; - } else { + // check if this is not a constant expression + if (!constExprTree(ival)) { werror (E_CONST_EXPECTED, "found expression"); + // but try to do it anyway } + allocInfo = 0; + 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 +279,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); } } } @@ -743,12 +724,16 @@ printIvalArray (symbol * sym, sym_link * type, initList * ilist, /* 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 (W_INIT_WRONG); + 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) { @@ -799,6 +784,16 @@ printIvalFuncPtr (sym_link * type, initList * ilist, FILE * oFile) int dLvl = 0; val = list2val (ilist); + + 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 +893,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 +903,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", @@ -1156,7 +1151,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 +1296,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 +1303,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;