X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=src%2FSDCCglue.c;h=e1e8f3232069203868c5db506bb60b0e94e1d9c8;hb=940ddadd79bebcdd9ccf131e03d09de45d088e23;hp=1ad47d6102f70c0e79afda67e4c81431a658ee91;hpb=2f41baf7a7147e28054520cba359b5dd8a2e2db6;p=fw%2Fsdcc diff --git a/src/SDCCglue.c b/src/SDCCglue.c index 1ad47d61..e1e8f323 100644 --- a/src/SDCCglue.c +++ b/src/SDCCglue.c @@ -180,7 +180,7 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) /* if extern then add it into the extern list */ if (IS_EXTERN (sym->etype)) { - addSetHead (&externs, sym); + addSetHead (&externs, sym); continue; } @@ -232,12 +232,8 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) /* if it has an initial value then do it only if it is a global variable */ if (sym->ival && sym->level == 0) { - // can we copy xidata from xinit? - if (port->genXINIT && - SPEC_OCLS(sym->etype)==xdata && - !SPEC_ABSA(sym->etype)) { - - // create a new "XINIT (CODE)" symbol + if (SPEC_OCLS(sym->etype)==xidata) { + // 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); @@ -249,11 +245,6 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) // add it to the "XINIT (CODE)" segment addSet(&xinit->syms, newSym); - // move sym from "XSEG (XDATA)" to "XISEG (XDATA)" segment - //deleteSetItem(&xdata->syms, sym); - addSet(&xidata->syms, sym); - SPEC_OCLS(sym->etype)=xidata; - //fprintf (stderr, "moved %s from xdata to xidata\n", sym->rname); } else { @@ -268,12 +259,29 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) decorateType (resolveSymbols (list2expr (sym->ival)))); } codeOutFile = statsg->oFile; - allocInfo = 0; - - // set ival's lineno to where the symbol was defined - if (ival) ival->lineno=sym->lineDef; - eBBlockFromiCode (iCodeFromAst (ival)); - allocInfo = 1; + +#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 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, @@ -301,23 +309,26 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) sym->rname, SPEC_ADDR (sym->etype)); } - else - { + else { if (newSym) { - // this has been moved to another segment + // this has been moved to another segment } else { - /* 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) getSize (sym->type) & 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); } - } + } } } @@ -380,10 +391,10 @@ initPointer (initList * ilist) (&some_struct)->element */ if (IS_AST_OP (expr->left) && expr->left->opval.op == PTR_OP && - IS_ADDRESS_OF_OP (expr->left->left)) - return valForStructElem (expr->left->left->left, - expr->left->right); - + IS_ADDRESS_OF_OP (expr->left->left)) { + return valForStructElem (expr->left->left->left, + expr->left->right); + } } /* case 3. (((char *) &a) +/- constant) */ if (IS_AST_OP (expr) && @@ -565,7 +576,15 @@ printIvalType (symbol *sym, sym_link * type, initList * ilist, FILE * oFile) werror (W_EXCESS_INITIALIZERS, "scalar", sym->name, sym->lineDef); } - val = list2val (ilist); + if (!(val = list2val (ilist))) { + // assuming a warning has been thrown + val=constVal("0"); + } + + if (val->type != type) { + val = valCastLiteral(type, floatFromVal(val)); + } + switch (getSize (type)) { case 1: if (!val) @@ -865,7 +884,7 @@ printIvalCharPtr (symbol * sym, sym_link * type, value * val, FILE * oFile) } else { - /* What is this case? Are these pointers? */ + // these are literals assigned to pointers switch (size) { case 1: @@ -879,14 +898,20 @@ printIvalCharPtr (symbol * sym, sym_link * type, value * val, FILE * oFile) aopLiteral (val, 0), aopLiteral (val, 1)); break; case 3: - werror (E_LITERAL_GENERIC); + // mcs51 generic pointer + if (floatFromVal(val)!=0) { + werror (E_LITERAL_GENERIC); + } fprintf (oFile, "\t.byte %s,%s,%s\n", aopLiteral (val, 0), aopLiteral (val, 1), aopLiteral (val, 2)); break; case 4: - werror (E_LITERAL_GENERIC); + // ds390 generic pointer + if (floatFromVal(val)!=0) { + werror (E_LITERAL_GENERIC); + } fprintf (oFile, "\t.byte %s,%s,%s,%s\n", aopLiteral (val, 0), aopLiteral (val, 1), @@ -1042,7 +1067,9 @@ emitStaticSeg (memmap * map, FILE * out) /* if it is not static add it to the public table */ if (!IS_STATIC (sym->etype)) - addSetHead (&publics, sym); + { + addSetHead (&publics, sym); + } /* print extra debug info if required */ if (options.debug) { @@ -1085,18 +1112,22 @@ emitStaticSeg (memmap * map, FILE * out) printIval (sym, sym->type, sym->ival, out); noAlloc--; } - else - { + else { /* allocate space */ + int size = getSize (sym->type); + + if (size==0) { + werror(E_UNKNOWN_SIZE,sym->name); + } fprintf (out, "%s:\n", sym->rname); /* special case for character strings */ if (IS_ARRAY (sym->type) && IS_CHAR (sym->type->next) && SPEC_CVAL (sym->etype).v_char) - printChar (out, - SPEC_CVAL (sym->etype).v_char, - strlen (SPEC_CVAL (sym->etype).v_char) + 1); + printChar (out, + SPEC_CVAL (sym->etype).v_char, + strlen (SPEC_CVAL (sym->etype).v_char) + 1); else - tfprintf (out, "\t!ds\n", (unsigned int) getSize (sym->type) & 0xffff); + tfprintf (out, "\t!ds\n", (unsigned int) size & 0xffff); } } } @@ -1247,7 +1278,7 @@ printExterns (FILE * afile) for (sym = setFirstItem (externs); sym; sym = setNextItem (externs)) - tfprintf (afile, "\t!global\n", sym->rname); + tfprintf (afile, "\t!extern\n", sym->rname); } /*-----------------------------------------------------------------*/ @@ -1303,7 +1334,9 @@ emitOverlay (FILE * afile) and addPublics allowed then add it to the public set */ if ((sym->_isparm && !IS_REGPARM (sym->etype)) && !IS_STATIC (sym->etype)) - addSetHead (&publics, sym); + { + addSetHead (&publics, sym); + } /* if extern then do nothing or is a function then do nothing */ @@ -1341,16 +1374,20 @@ emitOverlay (FILE * afile) sym->rname, SPEC_ADDR (sym->etype)); } - else - { + else { + int size = getSize(sym->type); + + if (size==0) { + werror(E_UNKNOWN_SIZE,sym->name); + } if (options.debug) - fprintf (afile, "==.\n"); + fprintf (afile, "==.\n"); /* allocate space */ tfprintf (afile, "!labeldef\n", sym->rname); tfprintf (afile, "\t!ds\n", (unsigned int) getSize (sym->type) & 0xffff); - } - + } + } } } @@ -1602,6 +1639,9 @@ glue () } copyFile (asmFile, code->oFile); + if (port->genAssemblerEnd) { + port->genAssemblerEnd(asmFile); + } fclose (asmFile); applyToSet (tmpfileSet, closeTmpFiles); applyToSet (tmpfileNameSet, rmTmpFiles);