X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCglue.c;h=1a4913767ad331b6a58c8b801cf55487f272b63d;hb=238e1b53dc1ac88bd559c93bd7f355d0887d39e1;hp=69d4b453e676080e279a292ddd686281be35e301;hpb=88e560b915dc753c85898e35af1e0a751a4cf723;p=fw%2Fsdcc diff --git a/src/SDCCglue.c b/src/SDCCglue.c index 69d4b453..1a491376 100644 --- a/src/SDCCglue.c +++ b/src/SDCCglue.c @@ -35,7 +35,7 @@ #include #endif -symbol *interrupts[256]; +symbol *interrupts[INTNO_MAX+1]; void printIval (symbol *, sym_link *, initList *, FILE *); set *publics = NULL; /* public variables */ @@ -258,7 +258,7 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) /* if extern then do nothing or is a function then do nothing */ - if (IS_FUNC (sym->type)) + if (IS_FUNC (sym->type) && !(sym->isitmp)) continue; /* print extra debug info if required */ @@ -289,9 +289,12 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) SPEC_OCLS(newSym->etype)=xinit; SNPRINTF (newSym->name, sizeof(newSym->name), "__xinit_%s", sym->name); SNPRINTF (newSym->rname, sizeof(newSym->rname), "__xinit_%s", sym->rname); - SPEC_CONST(newSym->etype)=1; + if (IS_SPEC (newSym->type)) + SPEC_CONST (newSym->type) = 1; + else + DCL_PTR_CONST (newSym->type) = 1; SPEC_STAT(newSym->etype)=1; - resolveIvalSym(newSym->ival); + resolveIvalSym(newSym->ival, newSym->type); // add it to the "XINIT (CODE)" segment addSet(&xinit->syms, newSym); @@ -301,11 +304,11 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) ival = initAggregates (sym, sym->ival, NULL); } else { if (getNelements(sym->type, sym->ival)>1) { - werror (W_EXCESS_INITIALIZERS, "scalar", - sym->name, sym->lineDef); + werrorfl (filename, sym->lineDef, W_EXCESS_INITIALIZERS, "scalar", + sym->name); } ival = newNode ('=', newAst_VALUE (symbolVal (sym)), - decorateType (resolveSymbols (list2expr (sym->ival)))); + decorateType (resolveSymbols (list2expr (sym->ival)), RESULT_CHECK)); } codeOutFile = statsg->oFile; @@ -318,7 +321,8 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) // but try to do it anyway } allocInfo = 0; - eBBlockFromiCode (iCodeFromAst (ival)); + if (!astErrors(ival)) + eBBlockFromiCode (iCodeFromAst (ival)); allocInfo = 1; } } @@ -347,7 +351,7 @@ emitRegularMap (memmap * map, bool addPublics, bool arFlag) else { int size = getSize (sym->type); if (size==0) { - werror(E_UNKNOWN_SIZE,sym->name); + werrorfl (filename, sym->lineDef, E_UNKNOWN_SIZE, sym->name); } /* allocate space */ if (options.debug) { @@ -488,7 +492,10 @@ initPointer (initList * ilist, sym_link *toType) return val; } wrong: - werror (E_INCOMPAT_PTYPES); + if (expr) + werrorfl (expr->filename, expr->lineno, E_INCOMPAT_PTYPES); + else + werror (E_INCOMPAT_PTYPES); return NULL; } @@ -508,7 +515,7 @@ printChar (FILE * ofile, char *s, int plen) while (len && pplen < plen) { i = 60; - while (i && *s && pplen < plen) + while (i && pplen < plen) { if (*s < ' ' || *s == '\"' || *s=='\\') { @@ -539,7 +546,11 @@ printChar (FILE * ofile, char *s, int plen) else len = 0; } - tfprintf (ofile, "\t!db !constbyte\n", 0); + while (pplen < plen) + { + tfprintf (ofile, "\t!db !constbyte\n", 0); + pplen++; + } } /*-----------------------------------------------------------------*/ @@ -581,11 +592,17 @@ _printPointerType (FILE * oFile, const char *name) { if (options.model == MODEL_FLAT24) { - fprintf (oFile, "\t.byte %s,(%s >> 8),(%s >> 16)", name, name, name); + if (port->little_endian) + fprintf (oFile, "\t.byte %s,(%s >> 8),(%s >> 16)", name, name, name); + else + fprintf (oFile, "\t.byte (%s >> 16),(%s >> 8),%s", name, name, name); } else { - fprintf (oFile, "\t.byte %s,(%s >> 8)", name, name); + if (port->little_endian) + fprintf (oFile, "\t.byte %s,(%s >> 8)", name, name); + else + fprintf (oFile, "\t.byte (%s >> 8),%s", name, name); } } @@ -643,19 +660,26 @@ printIvalType (symbol *sym, sym_link * type, initList * ilist, FILE * oFile) case 2: if (port->use_dw_for_init) tfprintf (oFile, "\t!dws\n", aopLiteralLong (val, 0, 2)); - else + else if (port->little_endian) fprintf (oFile, "\t.byte %s,%s\n", aopLiteral (val, 0), aopLiteral (val, 1)); + else + fprintf (oFile, "\t.byte %s,%s\n", aopLiteral (val, 1), aopLiteral (val, 0)); break; case 4: if (!val) { tfprintf (oFile, "\t!dw !constword\n", 0); tfprintf (oFile, "\t!dw !constword\n", 0); } - else { + else if (port->little_endian) { fprintf (oFile, "\t.byte %s,%s,%s,%s\n", aopLiteral (val, 0), aopLiteral (val, 1), aopLiteral (val, 2), aopLiteral (val, 3)); } + else { + fprintf (oFile, "\t.byte %s,%s,%s,%s\n", + aopLiteral (val, 3), aopLiteral (val, 2), + aopLiteral (val, 1), aopLiteral (val, 0)); + } break; } } @@ -701,7 +725,7 @@ void printIvalBitFields(symbol **sym, initList **ilist, FILE * oFile) case 2: tfprintf (oFile, "\t!dw !constword\n",ival); break; - case 4: + case 4: /* EEP: why is this db and not dw? */ tfprintf (oFile, "\t!db !constword,!constword\n", (ival >> 8) & 0xffff, (ival & 0xffff)); break; @@ -722,7 +746,7 @@ printIvalStruct (symbol * sym, sym_link * type, sflds = SPEC_STRUCT (type)->fields; if (ilist->type != INIT_DEEP) { - werror (E_INIT_STRUCT, sym->name); + werrorfl (filename, sym->lineDef, E_INIT_STRUCT, sym->name); return; } @@ -736,7 +760,7 @@ printIvalStruct (symbol * sym, sym_link * type, } } if (iloop) { - werror (W_EXCESS_INITIALIZERS, "struct", sym->name, sym->lineDef); + werrorfl (filename, sym->lineDef, W_EXCESS_INITIALIZERS, "struct", sym->name); } return; } @@ -748,7 +772,6 @@ int printIvalChar (sym_link * type, initList * ilist, FILE * oFile, char *s) { value *val; - int remain; if (!s) { @@ -762,10 +785,6 @@ printIvalChar (sym_link * type, initList * ilist, FILE * oFile, char *s) printChar (oFile, SPEC_CVAL (val->etype).v_char, DCL_ELEM (type)); - if ((remain = (DCL_ELEM (type) - strlen (SPEC_CVAL (val->etype).v_char) - 1)) > 0) - while (remain--) - tfprintf (oFile, "\t!db !constbyte\n", 0); - return 1; } else @@ -791,7 +810,7 @@ printIvalArray (symbol * sym, sym_link * type, initList * ilist, /* by a string */ if (IS_CHAR (type->next)) { if (!IS_LITERAL(list2val(ilist)->etype)) { - werror (E_CONST_EXPECTED); + werrorfl (filename, ilist->lineno, E_CONST_EXPECTED); return; } if (printIvalChar (type, @@ -802,7 +821,7 @@ printIvalArray (symbol * sym, sym_link * type, initList * ilist, /* not the special case */ if (ilist->type != INIT_DEEP) { - werror (E_INIT_STRUCT, sym->name); + werrorfl (filename, ilist->lineno, E_INIT_STRUCT, sym->name); return; } @@ -811,7 +830,7 @@ printIvalArray (symbol * sym, sym_link * type, initList * ilist, printIval (sym, type->next, iloop, oFile); if (++size > DCL_ELEM(type)) { - werror (W_EXCESS_INITIALIZERS, "array", sym->name, sym->lineDef); + werrorfl (filename, sym->lineDef, W_EXCESS_INITIALIZERS, "array", sym->name); break; } } @@ -850,7 +869,7 @@ printIvalFuncPtr (sym_link * type, initList * ilist, FILE * oFile) if (IS_LITERAL(val->etype)) { if (compareType(type,val->etype)==0) { - werror (E_INCOMPAT_TYPES); + werrorfl (filename, ilist->lineno, E_INCOMPAT_TYPES); printFromToType (val->type, type); } printIvalCharPtr (NULL, type, val, oFile); @@ -951,30 +970,48 @@ printIvalCharPtr (symbol * sym, sym_link * type, value * val, FILE * oFile) case 2: if (port->use_dw_for_init) tfprintf (oFile, "\t!dws\n", aopLiteralLong (val, 0, size)); - else + else if (port->little_endian) tfprintf (oFile, "\t.byte %s,%s\n", aopLiteral (val, 0), aopLiteral (val, 1)); + else + tfprintf (oFile, "\t.byte %s,%s\n", + aopLiteral (val, 1), aopLiteral (val, 0)); break; case 3: if (IS_GENPTR(type) && floatFromVal(val)!=0) { // non-zero mcs51 generic pointer - werror (E_LITERAL_GENERIC); + werrorfl (filename, sym->lineDef, E_LITERAL_GENERIC); + } + if (port->little_endian) { + fprintf (oFile, "\t.byte %s,%s,%s\n", + aopLiteral (val, 0), + aopLiteral (val, 1), + aopLiteral (val, 2)); + } else { + fprintf (oFile, "\t.byte %s,%s,%s\n", + aopLiteral (val, 2), + aopLiteral (val, 1), + aopLiteral (val, 0)); } - fprintf (oFile, "\t.byte %s,%s,%s\n", - aopLiteral (val, 0), - aopLiteral (val, 1), - aopLiteral (val, 2)); break; case 4: if (IS_GENPTR(type) && floatFromVal(val)!=0) { // non-zero ds390 generic pointer - werror (E_LITERAL_GENERIC); + werrorfl (filename, sym->lineDef, E_LITERAL_GENERIC); + } + if (port->little_endian) { + fprintf (oFile, "\t.byte %s,%s,%s,%s\n", + aopLiteral (val, 0), + aopLiteral (val, 1), + aopLiteral (val, 2), + aopLiteral (val, 3)); + } else { + fprintf (oFile, "\t.byte %s,%s,%s,%s\n", + aopLiteral (val, 3), + aopLiteral (val, 2), + aopLiteral (val, 1), + aopLiteral (val, 0)); } - fprintf (oFile, "\t.byte %s,%s,%s,%s\n", - aopLiteral (val, 0), - aopLiteral (val, 1), - aopLiteral (val, 2), - aopLiteral (val, 3)); break; default: assert (0); @@ -1018,7 +1055,7 @@ printIvalPtr (symbol * sym, sym_link * type, initList * ilist, FILE * oFile) /* check the type */ if (compareType (type, val->type) == 0) { - werror (W_INIT_WRONG); + werrorfl (filename, ilist->lineno, W_INIT_WRONG); printFromToType (val->type, type); } @@ -1033,12 +1070,22 @@ printIvalPtr (symbol * sym, sym_link * type, initList * ilist, FILE * oFile) case 2: if (port->use_dw_for_init) tfprintf (oFile, "\t!dws\n", aopLiteralLong (val, 0, 2)); - else + else if (port->little_endian) tfprintf (oFile, "\t.byte %s,%s\n", aopLiteral (val, 0), aopLiteral (val, 1)); + else + tfprintf (oFile, "\t.byte %s,%s\n", aopLiteral (val, 1), aopLiteral (val, 0)); break; case 3: // how about '390?? - fprintf (oFile, "\t.byte %s,%s,#0x%d\n", - aopLiteral (val, 0), aopLiteral (val, 1), GPTYPE_CODE); + if (port->little_endian) + { + fprintf (oFile, "\t.byte %s,%s,#0x%d\n", + aopLiteral (val, 0), aopLiteral (val, 1), GPTYPE_CODE); + } + else + { + fprintf (oFile, "\t.byte %s,%s,#0x%d\n", + aopLiteral (val, 1), aopLiteral (val, 0), GPTYPE_CODE); + } } return; } @@ -1078,9 +1125,6 @@ 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)) { @@ -1099,8 +1143,8 @@ printIval (symbol * sym, sym_link * type, initList * ilist, FILE * oFile) if (ilist->type!=INIT_NODE) { // or a 1-element list if (ilist->init.deep->next) { - werror (W_EXCESS_INITIALIZERS, "scalar", - sym->name, sym->lineDef); + werrorfl (filename, sym->lineDef, W_EXCESS_INITIALIZERS, "scalar", + sym->name); } else { ilist=ilist->init.deep; } @@ -1116,7 +1160,7 @@ printIval (symbol * sym, sym_link * type, initList * ilist, FILE * oFile) IS_PTR(type) && DCL_TYPE(type)==CPOINTER) { // no sweat } else { - werror (E_TYPE_MISMATCH, "assignment", " "); + werrorfl (filename, ilist->lineno, E_TYPE_MISMATCH, "assignment", " "); printFromToType(itype, type); } } @@ -1199,7 +1243,7 @@ emitStaticSeg (memmap * map, FILE * out) { fprintf (out, "%s:\n", sym->rname); noAlloc++; - resolveIvalSym (sym->ival); + resolveIvalSym (sym->ival, sym->type); printIval (sym, sym->type, sym->ival, out); noAlloc--; /* if sym is a simple string and sym->ival is a string, @@ -1215,7 +1259,7 @@ emitStaticSeg (memmap * map, FILE * out) int size = getSize (sym->type); if (size==0) { - werror(E_UNKNOWN_SIZE,sym->name); + werrorfl (filename, sym->lineDef, E_UNKNOWN_SIZE,sym->name); } fprintf (out, "%s:\n", sym->rname); /* special case for character strings */ @@ -1223,7 +1267,7 @@ emitStaticSeg (memmap * map, FILE * out) SPEC_CVAL (sym->etype).v_char) printChar (out, SPEC_CVAL (sym->etype).v_char, - strlen (SPEC_CVAL (sym->etype).v_char) + 1); + size); else tfprintf (out, "\t!ds\n", (unsigned int) size & 0xffff); } @@ -1310,14 +1354,21 @@ createInterruptVect (FILE * vFile) fprintf (vFile, "\tljmp\t__sdcc_gsinit_startup\n"); - /* now for the other interrupts */ for (; i < maxInterrupts; i++) { if (interrupts[i]) - fprintf (vFile, "\tljmp\t%s\n\t.ds\t5\n", interrupts[i]->rname); + { + fprintf (vFile, "\tljmp\t%s\n", interrupts[i]->rname); + if ( i != maxInterrupts - 1 ) + fprintf (vFile, "\t.ds\t5\n"); + } else - fprintf (vFile, "\treti\n\t.ds\t7\n"); + { + fprintf (vFile, "\treti\n"); + if ( i != maxInterrupts - 1 ) + fprintf (vFile, "\t.ds\t7\n"); + } } } } @@ -1464,7 +1515,7 @@ emitOverlay (FILE * afile) int size = getSize(sym->type); if (size==0) { - werror(E_UNKNOWN_SIZE,sym->name); + werrorfl (filename, sym->lineDef, E_UNKNOWN_SIZE); } if (options.debug) fprintf (afile, "==.\n"); @@ -1586,10 +1637,10 @@ glue (void) case MODEL_PAGE0: fprintf (asmFile, " --model-page0"); break; default: break; } - if(options.stackAuto) fprintf (asmFile, " --stack-auto"); + /*if(options.stackAuto) fprintf (asmFile, " --stack-auto");*/ if(options.useXstack) fprintf (asmFile, " --xstack"); - if(options.intlong_rent) fprintf (asmFile, " --int-long-rent"); - if(options.float_rent) fprintf (asmFile, " --float-rent"); + /*if(options.intlong_rent) fprintf (asmFile, " --int-long-rent");*/ + /*if(options.float_rent) fprintf (asmFile, " --float-rent");*/ if(options.noRegParams) fprintf (asmFile, " --no-reg-params"); if(options.parms_in_bank1) fprintf (asmFile, " --parms-in-bank1"); fprintf (asmFile, "\n"); @@ -1612,14 +1663,18 @@ glue (void) if (port->assembler.externGlobal) printExterns (asmFile); - if(mcs51_like) + if(( mcs51_like ) + ||( TARGET_IS_Z80 )) /*.p.t.20030924 need to output SFR table for Z80 as well */ { /* copy the sfr segment */ fprintf (asmFile, "%s", iComments2); fprintf (asmFile, "; special function registers\n"); fprintf (asmFile, "%s", iComments2); copyFile (asmFile, sfr->oFile); - + } + + if(mcs51_like) + { /* copy the sbit segment */ fprintf (asmFile, "%s", iComments2); fprintf (asmFile, "; special function bits \n");