* src/SDCCicode.c (geniCodeAddressOf): fixed part of bug #840381
authorepetrich <epetrich@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 14 Nov 2003 08:33:10 +0000 (08:33 +0000)
committerepetrich <epetrich@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 14 Nov 2003 08:33:10 +0000 (08:33 +0000)
* 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
src/SDCCicode.c
src/SDCCmain.c
src/SDCCopt.c

index 7adda5064a90c22fd870c1fe1491d63314ba9fd8..024fd697ba935a4c10260084d20190cdb69474ac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+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
index dbb17c25dfd76296f8aa476272c1178ba7c036b4..2672a1ab6812af6dad99c95312aeaadb6c4652d5 100644 (file)
@@ -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
index bf48bba681ea60cc92bbfcf785d7e37a1d37c962..a3e563e9e4c60b8cd4641e78e012780adaa08a1a 100644 (file)
@@ -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);
     }
 }
index aea6e373f457f7cc6d4a1ce57d2f68fee469e244..8c12927ab03570b3a5b2104061963ce24d3751dd 100644 (file)
@@ -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)))