+2003-11-14 Erik Petrich <epetrich@ivorytower.norman.ok.us>
+
+ * src/SDCCicode.c (geniCodeAddressOf): fixed part of bug #840381
+ * src/SDCCopt.c (replaceRegEqv, isLocalWithoutDef): fixed other part
+ (SIGSEV) of bug #840381
+ * src/SDCCmain.c (linkEdit, assemble): fixed bug #841606 (don't
+ unlink new file before rename if new and old filenames are the same)
+
2003-11-13 Frieder Ferlemann <Frieder.Ferlemann@web.de>
* src/mcs51/main.c: started fixing bug #737001 (SDCC not clearing
if (IS_VOID(ltype->next) || IS_VOID(rtype->next)) {
return result;
}
-
+
// should we really do this? is this ANSI?
return geniCodeDivision (result,
operandFromLit (getSize (ltype->next)));
{
left = geniCodeRValue (left, FALSE);
}
+
return geniCodeDerefPtr (geniCodeAdd (left, right, lvl), lvl);
}
IC_RESULT (ic)->isaddr = (!IS_AGGREGATE (ltype->next));
ADDTOCHAIN (ic);
-
+
return IC_RESULT (ic);
}
sym_link *optype = operandType (op);
sym_link *opetype = getSpec (optype);
+ if (IS_ITEMP (op) && op->isaddr && IS_PTR (optype))
+ {
+ op = operandFromOperand (op);
+ op->isaddr = 0;
+ return op;
+ }
+
/* lvalue check already done in decorateType */
/* this must be a lvalue */
/* if (!op->isaddr && !IS_AGGREGATE(optype)) { */
return geniCodeDerefPtr (geniCodeRValue (left, FALSE),lvl);
case '-':
- if (right)
+ if (right)
return geniCodeSubtract (geniCodeRValue (left, FALSE),
geniCodeRValue (right, FALSE));
else
strncatz (scratchFileName,
options.out_fmt ? ".S19" : ".ihx",
sizeof(scratchFileName));
- unlink (fullDstFileName);
+ if (strcmp (fullDstFileName, scratchFileName))
+ unlink (fullDstFileName);
rename (scratchFileName, fullDstFileName);
strncpyz (buffer, fullDstFileName, sizeof(buffer));
strncatz (scratchFileName, ".map", sizeof(scratchFileName));
*q = 0;
strncatz(buffer, ".map", sizeof(buffer));
- unlink (buffer);
+ if (strcmp (scratchFileName, buffer))
+ unlink (buffer);
rename (scratchFileName, buffer);
*p = 0;
strncatz (scratchFileName, ".mem", sizeof(scratchFileName));
*q = 0;
strncatz(buffer, ".mem", sizeof(buffer));
- unlink (buffer);
+ if (strcmp (scratchFileName, buffer))
+ unlink (buffer);
rename (scratchFileName, buffer);
if (options.debug)
{
strncatz (scratchFileName, ".cdb", sizeof(scratchFileName));
*q = 0;
strncatz(buffer, ".cdb", sizeof(buffer));
- unlink (buffer);
+ if (strcmp (scratchFileName, buffer))
+ unlink (buffer);
rename (scratchFileName, buffer);
/* and the OMF file without extension: */
*p = 0;
*q = 0;
- unlink (buffer);
+ if (strcmp (scratchFileName, buffer))
+ unlink (buffer);
rename (scratchFileName, buffer);
}
}
strncatz (scratchFileName,
port->linker.rel_ext,
sizeof(scratchFileName));
- unlink (fullDstFileName);
+ if (strcmp (scratchFileName, fullDstFileName))
+ unlink (fullDstFileName);
rename (scratchFileName, fullDstFileName);
}
}
}
}
+/*-----------------------------------------------------------------*/
+/* isLocalWithoutDef - return 1 if sym might be used without a */
+/* defining iCode */
+/*-----------------------------------------------------------------*/
+static int
+isLocalWithoutDef (symbol * sym)
+{
+ if (!sym->level)
+ return 0;
+
+ if (IS_STATIC (sym->etype))
+ return 0;
+
+ if (IS_VOLATILE (sym->type))
+ return 0;
+
+ if (sym->_isparm)
+ return 0;
+
+ if (IS_AGGREGATE (sym->type))
+ return 0;
+
+ return !sym->defs;
+}
+
/*-----------------------------------------------------------------*/
/* replaceRegEqv - replace all local variables with their reqv */
/*-----------------------------------------------------------------*/
{
int i;
+ /* Update the symbols' def bitvector so we know if there is */
+ /* a defining iCode or not. Only replace a local variable */
+ /* with its register equivalent if there is a defining iCode; */
+ /* otherwise, the port's register allocater may choke. */
+ cseAllBlocks (ebbs, count, TRUE);
+
for (i = 0; i < count; i++)
{
if (ic->op == IFX)
{
-
+ if (IC_COND (ic) &&
+ IS_TRUE_SYMOP (IC_COND (ic)) &&
+ isLocalWithoutDef (OP_SYMBOL (IC_COND (ic))))
+ {
+ werror (W_LOCAL_NOINIT,
+ OP_SYMBOL (IC_COND (ic))->name,
+ ic->filename, ic->lineno);
+ OP_REQV (IC_COND (ic)) = NULL;
+ OP_SYMBOL (IC_COND (ic))->allocreq = 1;
+ }
+
if (IS_TRUE_SYMOP (IC_COND (ic)) &&
OP_REQV (IC_COND (ic)))
IC_COND (ic) = opFromOpWithDU (OP_REQV (IC_COND (ic)),
continue;
}
+
if (ic->op == JUMPTABLE)
{
+ if (IC_JTCOND (ic) &&
+ IS_TRUE_SYMOP (IC_JTCOND (ic)) &&
+ isLocalWithoutDef (OP_SYMBOL (IC_JTCOND (ic))))
+ {
+ werror (W_LOCAL_NOINIT,
+ OP_SYMBOL (IC_JTCOND (ic))->name,
+ ic->filename, ic->lineno);
+ OP_REQV (IC_JTCOND (ic)) = NULL;
+ OP_SYMBOL (IC_JTCOND (ic))->allocreq = 1;
+ }
+
if (IS_TRUE_SYMOP (IC_JTCOND (ic)) &&
OP_REQV (IC_JTCOND (ic)))
IC_JTCOND (ic) = opFromOpWithDU (OP_REQV (IC_JTCOND (ic)),
OP_SYMBOL (IC_RESULT (ic))->uses);
}
+ if (IC_RIGHT (ic) &&
+ IS_TRUE_SYMOP (IC_RIGHT (ic)) &&
+ isLocalWithoutDef (OP_SYMBOL (IC_RIGHT (ic))))
+ {
+ werror (W_LOCAL_NOINIT,
+ OP_SYMBOL (IC_RIGHT (ic))->name,
+ ic->filename, ic->lineno);
+ OP_REQV (IC_RIGHT (ic)) = NULL;
+ OP_SYMBOL (IC_RIGHT (ic))->allocreq = 1;
+ }
+
if (IC_RIGHT (ic) &&
IS_TRUE_SYMOP (IC_RIGHT (ic)) &&
OP_REQV (IC_RIGHT (ic)))
IC_RIGHT (ic)->isaddr = 0;
}
+ if (IC_LEFT (ic) &&
+ IS_TRUE_SYMOP (IC_LEFT (ic)) &&
+ isLocalWithoutDef (OP_SYMBOL (IC_LEFT (ic))))
+ {
+ werror (W_LOCAL_NOINIT,
+ OP_SYMBOL (IC_LEFT (ic))->name,
+ ic->filename, ic->lineno);
+ OP_REQV (IC_LEFT (ic)) = NULL;
+ OP_SYMBOL (IC_LEFT (ic))->allocreq = 1;
+ }
+
if (IC_LEFT (ic) &&
IS_TRUE_SYMOP (IC_LEFT (ic)) &&
OP_REQV (IC_LEFT (ic)))