From 856bec502c833ef1a19a685c08bd51120c2a4de0 Mon Sep 17 00:00:00 2001 From: epetrich Date: Fri, 14 Nov 2003 08:33:10 +0000 Subject: [PATCH] * 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) git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3015 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 8 +++++ src/SDCCicode.c | 14 +++++++-- src/SDCCmain.c | 18 ++++++++---- src/SDCCopt.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 107 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7adda506..024fd697 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2003-11-14 Erik Petrich + + * 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 * src/mcs51/main.c: started fixing bug #737001 (SDCC not clearing diff --git a/src/SDCCicode.c b/src/SDCCicode.c index dbb17c25..2672a1ab 100644 --- a/src/SDCCicode.c +++ b/src/SDCCicode.c @@ -2108,7 +2108,7 @@ subtractExit: 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))); @@ -2275,6 +2275,7 @@ geniCodeArray (operand * left, operand * right,int lvl) { left = geniCodeRValue (left, FALSE); } + return geniCodeDerefPtr (geniCodeAdd (left, right, lvl), lvl); } @@ -2300,7 +2301,7 @@ geniCodeArray (operand * left, operand * right,int lvl) IC_RESULT (ic)->isaddr = (!IS_AGGREGATE (ltype->next)); ADDTOCHAIN (ic); - + return IC_RESULT (ic); } @@ -2538,6 +2539,13 @@ geniCodeAddressOf (operand * op) 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)) { */ @@ -3731,7 +3739,7 @@ ast2iCode (ast * tree,int lvl) return geniCodeDerefPtr (geniCodeRValue (left, FALSE),lvl); case '-': - if (right) + if (right) return geniCodeSubtract (geniCodeRValue (left, FALSE), geniCodeRValue (right, FALSE)); else diff --git a/src/SDCCmain.c b/src/SDCCmain.c index bf48bba6..a3e563e9 100644 --- a/src/SDCCmain.c +++ b/src/SDCCmain.c @@ -1616,7 +1616,8 @@ linkEdit (char **envp) 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)); @@ -1631,13 +1632,15 @@ linkEdit (char **envp) 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) { @@ -1645,12 +1648,14 @@ linkEdit (char **envp) 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); } } @@ -1702,7 +1707,8 @@ assemble (char **envp) strncatz (scratchFileName, port->linker.rel_ext, sizeof(scratchFileName)); - unlink (fullDstFileName); + if (strcmp (scratchFileName, fullDstFileName)) + unlink (fullDstFileName); rename (scratchFileName, fullDstFileName); } } diff --git a/src/SDCCopt.c b/src/SDCCopt.c index aea6e373..8c12927a 100644 --- a/src/SDCCopt.c +++ b/src/SDCCopt.c @@ -550,6 +550,31 @@ convertToFcall (eBBlock ** ebbs, int count) } } +/*-----------------------------------------------------------------*/ +/* 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 */ /*-----------------------------------------------------------------*/ @@ -558,6 +583,12 @@ replaceRegEqv (eBBlock ** ebbs, int count) { 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++) { @@ -571,7 +602,17 @@ replaceRegEqv (eBBlock ** ebbs, int count) 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)), @@ -581,8 +622,20 @@ replaceRegEqv (eBBlock ** ebbs, int count) 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)), @@ -615,6 +668,17 @@ replaceRegEqv (eBBlock ** ebbs, int count) 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))) @@ -625,6 +689,17 @@ replaceRegEqv (eBBlock ** ebbs, int count) 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))) -- 2.30.2