#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");
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");