X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCglue.c;h=0347280d6f284fcd9356ddcf18a25997d27097c4;hb=915e3f80069090c147c9eea0562958a78cbaf0d7;hp=c317fffcbece14dc441cfde531d84bf06d7c8e52;hpb=3b82d3ae8fc16d749c74ec5121a516f669aec161;p=fw%2Fsdcc diff --git a/src/SDCCglue.c b/src/SDCCglue.c index c317fffc..0347280d 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,7 +289,10 @@ 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); @@ -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; } } @@ -581,11 +585,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 +653,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 +718,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; @@ -951,30 +968,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); } - fprintf (oFile, "\t.byte %s,%s,%s\n", - aopLiteral (val, 0), - aopLiteral (val, 1), - aopLiteral (val, 2)); + 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)); + } break; case 4: 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", - aopLiteral (val, 0), - aopLiteral (val, 1), - aopLiteral (val, 2), - aopLiteral (val, 3)); + 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; default: assert (0); @@ -1033,12 +1068,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; } @@ -1512,6 +1557,17 @@ glue (void) FILE *asmFile; FILE *ovrFile = tempfile (); char moduleBuf[PATH_MAX]; + int mcs51_like; + + if(port->general.glue_up_main && + (TARGET_IS_MCS51 || TARGET_IS_DS390 || TARGET_IS_XA51 || TARGET_IS_DS400)) + { + mcs51_like=1; /*So it has bits, sfr, sbits, data, idata, etc...*/ + } + else + { + mcs51_like=0; + } addSetHead (&tmpfileSet, ovrFile); /* print the global struct definitions */ @@ -1561,6 +1617,33 @@ glue (void) /* print module name */ tfprintf (asmFile, "\t!module\n", spacesToUnderscores (moduleBuf, moduleName, sizeof moduleBuf)); + if(mcs51_like) + { + fprintf (asmFile, "\t.optsdcc -m%s", port->target); + + switch(options.model) + { + case MODEL_SMALL: fprintf (asmFile, " --model-small"); break; + case MODEL_COMPACT: fprintf (asmFile, " --model-compact"); break; + case MODEL_MEDIUM: fprintf (asmFile, " --model-medium"); break; + case MODEL_LARGE: fprintf (asmFile, " --model-large"); break; + case MODEL_FLAT24: fprintf (asmFile, " --model-flat24"); break; + case MODEL_PAGE0: fprintf (asmFile, " --model-page0"); break; + default: break; + } + /*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.noRegParams) fprintf (asmFile, " --no-reg-params"); + if(options.parms_in_bank1) fprintf (asmFile, " --parms-in-bank1"); + fprintf (asmFile, "\n"); + } + else if(TARGET_IS_Z80 || TARGET_IS_GBZ80 ) + { + fprintf (asmFile, "\t.optsdcc -m%s\n", port->target); + } + tfprintf (asmFile, "\t!fileprelude\n"); /* Let the port generate any global directives, etc. */ @@ -1574,22 +1657,25 @@ glue (void) if (port->assembler.externGlobal) printExterns (asmFile); - /* copy the sfr segment */ - fprintf (asmFile, "%s", iComments2); - fprintf (asmFile, "; special function registers\n"); - fprintf (asmFile, "%s", iComments2); - copyFile (asmFile, sfr->oFile); - - /* copy the sbit segment */ - fprintf (asmFile, "%s", iComments2); - fprintf (asmFile, "; special function bits \n"); - fprintf (asmFile, "%s", iComments2); - copyFile (asmFile, sfrbit->oFile); + 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); + } - /*JCF: Create the areas for the register banks*/ - if(port->general.glue_up_main && - (TARGET_IS_MCS51 || TARGET_IS_DS390 || TARGET_IS_XA51 || TARGET_IS_DS400)) + if(mcs51_like) { + /* copy the sbit segment */ + fprintf (asmFile, "%s", iComments2); + fprintf (asmFile, "; special function bits \n"); + fprintf (asmFile, "%s", iComments2); + copyFile (asmFile, sfrbit->oFile); + + /*JCF: Create the areas for the register banks*/ if(RegBankUsed[0]||RegBankUsed[1]||RegBankUsed[2]||RegBankUsed[3]) { fprintf (asmFile, "%s", iComments2); @@ -1608,7 +1694,7 @@ glue (void) /* copy the data segment */ fprintf (asmFile, "%s", iComments2); - fprintf (asmFile, "; internal ram data\n"); + fprintf (asmFile, "; %s ram data\n", mcs51_like?"internal":""); fprintf (asmFile, "%s", iComments2); copyFile (asmFile, data->oFile); @@ -1616,7 +1702,7 @@ glue (void) /* create the overlay segments */ if (overlay) { fprintf (asmFile, "%s", iComments2); - fprintf (asmFile, "; overlayable items in internal ram \n"); + fprintf (asmFile, "; overlayable items in %s ram \n", mcs51_like?"internal":""); fprintf (asmFile, "%s", iComments2); copyFile (asmFile, ovrFile); } @@ -1632,7 +1718,7 @@ glue (void) } /* create the idata segment */ - if (idata) { + if ( (idata) && (mcs51_like) ) { fprintf (asmFile, "%s", iComments2); fprintf (asmFile, "; indirectly addressable internal ram data\n"); fprintf (asmFile, "%s", iComments2); @@ -1640,10 +1726,12 @@ glue (void) } /* copy the bit segment */ - fprintf (asmFile, "%s", iComments2); - fprintf (asmFile, "; bit data\n"); - fprintf (asmFile, "%s", iComments2); - copyFile (asmFile, bit->oFile); + if (mcs51_like) { + fprintf (asmFile, "%s", iComments2); + fprintf (asmFile, "; bit data\n"); + fprintf (asmFile, "%s", iComments2); + copyFile (asmFile, bit->oFile); + } /* if external stack then reserve space of it */ if (mainf && IFFUNC_HASBODY(mainf->type) && options.useXstack) @@ -1657,10 +1745,12 @@ glue (void) /* copy xtern ram data */ - fprintf (asmFile, "%s", iComments2); - fprintf (asmFile, "; external ram data\n"); - fprintf (asmFile, "%s", iComments2); - copyFile (asmFile, xdata->oFile); + if (mcs51_like) { + fprintf (asmFile, "%s", iComments2); + fprintf (asmFile, "; external ram data\n"); + fprintf (asmFile, "%s", iComments2); + copyFile (asmFile, xdata->oFile); + } /* copy xternal initialized ram data */ fprintf (asmFile, "%s", iComments2); @@ -1668,6 +1758,13 @@ glue (void) fprintf (asmFile, "%s", iComments2); copyFile (asmFile, xidata->oFile); + /* If the port wants to generate any extra areas, let it do so. */ + if (port->extraAreas.genExtraAreaDeclaration) + { + port->extraAreas.genExtraAreaDeclaration(asmFile, + mainf && IFFUNC_HASBODY(mainf->type)); + } + /* copy the interrupt vector table */ if (mainf && IFFUNC_HASBODY(mainf->type)) {