#include <unistd.h>
#endif
-symbol *interrupts[256];
+symbol *interrupts[INTNO_MAX+1];
void printIval (symbol *, sym_link *, initList *, FILE *);
set *publics = NULL; /* public variables */
/* 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 */
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);
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;
// but try to do it anyway
}
allocInfo = 0;
- eBBlockFromiCode (iCodeFromAst (ival));
+ if (!astErrors(ival))
+ eBBlockFromiCode (iCodeFromAst (ival));
allocInfo = 1;
}
}
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) {
return val;
}
wrong:
- werror (E_INCOMPAT_PTYPES);
+ if (expr)
+ werrorfl (expr->filename, expr->lineno, E_INCOMPAT_PTYPES);
+ else
+ werror (E_INCOMPAT_PTYPES);
return NULL;
}
while (len && pplen < plen)
{
i = 60;
- while (i && *s && pplen < plen)
+ while (i && pplen < plen)
{
if (*s < ' ' || *s == '\"' || *s=='\\')
{
else
len = 0;
}
- tfprintf (ofile, "\t!db !constbyte\n", 0);
+ while (pplen < plen)
+ {
+ tfprintf (ofile, "\t!db !constbyte\n", 0);
+ pplen++;
+ }
}
/*-----------------------------------------------------------------*/
{
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);
}
}
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;
}
}
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;
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;
}
}
}
if (iloop) {
- werror (W_EXCESS_INITIALIZERS, "struct", sym->name, sym->lineDef);
+ werrorfl (filename, sym->lineDef, W_EXCESS_INITIALIZERS, "struct", sym->name);
}
return;
}
printIvalChar (sym_link * type, initList * ilist, FILE * oFile, char *s)
{
value *val;
- int remain;
if (!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
/* 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,
/* 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;
}
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;
}
}
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);
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);
/* check the type */
if (compareType (type, val->type) == 0) {
- werror (W_INIT_WRONG);
+ werrorfl (filename, ilist->lineno, W_INIT_WRONG);
printFromToType (val->type, type);
}
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;
}
if (!ilist)
return;
- /* update line number for error msgs */
- lineno=sym->lineDef;
-
/* if structure then */
if (IS_STRUCT (type))
{
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;
}
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);
}
}
{
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,
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 */
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);
}
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");
+ }
}
}
}
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");
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 */
/* 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. */
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);
/* 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);
/* 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);
}
}
/* 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);
}
/* 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)
/* 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);
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))
{