/* if extern then add it into the extern list */
if (IS_EXTERN (sym->etype))
{
- addSetHead (&externs, sym);
+ addSetHead (&externs, sym);
continue;
}
sprintf (newSym->name, "_xinit_%s", sym->name);
sprintf (newSym->rname,"_xinit_%s", sym->rname);
SPEC_CONST(newSym->etype)=1;
- SPEC_STAT(newSym->etype)=1;
+ //SPEC_STAT(newSym->etype)=1;
addSym (SymbolTab, newSym, newSym->name, 0, 0, 1);
// add it to the "XINIT (CODE)" segment
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 (ival) {
+ // set ival's lineno to where the symbol was defined
+ lineno=ival->lineno=sym->lineDef;
+#if 0
+ // check if this is a constant expression
+ if (constExprTree(ival->right)) {
+ allocInfo = 0;
+#endif
+ eBBlockFromiCode (iCodeFromAst (ival));
+ allocInfo = 1;
+#if 0
+ } else {
+ werror (E_CONST_EXPECTED, "found expression");
+ }
+#endif
+ }
}
/* if the ival is a symbol assigned to an aggregate,
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);
}
- }
+ }
}
}
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));
}
/* 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) {
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);
}
}
}
for (sym = setFirstItem (externs); sym;
sym = setNextItem (externs))
- tfprintf (afile, "\t!global\n", sym->rname);
+ tfprintf (afile, "\t!extern\n", sym->rname);
}
/*-----------------------------------------------------------------*/
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 */
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);
- }
-
+ }
+
}
}
}
}
copyFile (asmFile, code->oFile);
+ if (port->genAssemblerEnd) {
+ port->genAssemblerEnd(asmFile);
+ }
fclose (asmFile);
applyToSet (tmpfileSet, closeTmpFiles);
applyToSet (tmpfileNameSet, rmTmpFiles);