* support/regression/tests/bug1409955.c: new, added
authormaartenbrock <maartenbrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 8 Mar 2006 16:42:33 +0000 (16:42 +0000)
committermaartenbrock <maartenbrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 8 Mar 2006 16:42:33 +0000 (16:42 +0000)
* src/mcs51/gen.h: changed asmop.freed:1 to asmop.allocated for tracking
* src/mcs51/gen.c (newAsmop): set asmop.allocated to 1,
  (aopForSym, aopOp): increment asmop.allocated if reused,
  (freeAsmop): decrement asmop.allocated and check for zero instead of
  using asmop.freed,
  (freeForBranchAsmop): use asmop.allocated instead of asmop.freed,
  (genNot, genCpl, genUminus, genMinus, genMult, genDiv, genMod, genCmpGt,
   genCmpLt, genAndOp, genOrOp, genAnd, genOr, genXor, genRRC, genRLC,
   genGetHbit, genGetAbit, genGetByte, genGetWord, genSwap,
   genLeftShiftLiteral, genLeftShift, genRightShiftLiteral,
   genSignedRightShift, genRightShift, genDataPointerGet,
   genPagedPointerGet, genFarPointerGet, genCodePointerGet,
   genGenPointerGet, genDataPointerSet, genAssign, genCast): free asmop's
    in reverse order from allocation,
  (genPlus, genCmpEq): free asmop's in reverse order from allocation and
    added swappedLR to keep track
* support/regression/fwk/include/testfwk.h: added defines for xdata, idata,
  pdata & code for GCC, z80, gbz80 & hc08
* support/regression/tests/zeropad.c: moved defines to testfwk.h

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4057 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/mcs51/gen.c
src/mcs51/gen.h
support/regression/fwk/include/testfwk.h
support/regression/tests/bug1409955.c [new file with mode: 0644]
support/regression/tests/zeropad.c

index 6e10aecfcabf7859dafa80fe9141a8db5b388cd0..53738661d435f77eb3840717f9986bb2f03912c4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2006-03-08 Maarten Brock <sourceforge.brock AT dse.nl>
+
+       * support/regression/tests/bug1409955.c: new, added
+       * src/mcs51/gen.h: changed asmop.freed:1 to asmop.allocated for tracking
+       * src/mcs51/gen.c (newAsmop): set asmop.allocated to 1,
+         (aopForSym, aopOp): increment asmop.allocated if reused,
+         (freeAsmop): decrement asmop.allocated and check for zero instead of
+         using asmop.freed,
+         (freeForBranchAsmop): use asmop.allocated instead of asmop.freed,
+         (genNot, genCpl, genUminus, genMinus, genMult, genDiv, genMod, genCmpGt,
+          genCmpLt, genAndOp, genOrOp, genAnd, genOr, genXor, genRRC, genRLC,
+          genGetHbit, genGetAbit, genGetByte, genGetWord, genSwap,
+          genLeftShiftLiteral, genLeftShift, genRightShiftLiteral,
+          genSignedRightShift, genRightShift, genDataPointerGet,
+          genPagedPointerGet, genFarPointerGet, genCodePointerGet,
+          genGenPointerGet, genDataPointerSet, genAssign, genCast): free asmop's
+           in reverse order from allocation,
+         (genPlus, genCmpEq): free asmop's in reverse order from allocation and
+           added swappedLR to keep track
+       * support/regression/fwk/include/testfwk.h: added defines for xdata, idata,
+         pdata & code for GCC, z80, gbz80 & hc08
+       * support/regression/tests/zeropad.c: moved defines to testfwk.h
+
 2006-03-08 Raphael Neider <rneider AT web.de>
 
        * src/pic16/main.c (_hasNativeMulFor): fixed bug #1444425
index afce9d527460cb594b5553b8b965cc18b0e50fc1..82408a9600009aa879fbabef99a1b88631a7ba5f 100644 (file)
@@ -472,6 +472,7 @@ newAsmop (short type)
 
   aop = Safe_calloc (1, sizeof (asmop));
   aop->type = type;
+  aop->allocated = 1;
   return aop;
 }
 
@@ -568,7 +569,10 @@ aopForSym (iCode * ic, symbol * sym, bool result)
 
   /* if already has one */
   if (sym->aop)
-    return sym->aop;
+    {
+         sym->aop->allocated++;
+      return sym->aop;
+    }
 
   /* assign depending on the storage class */
   /* if it is on the stack or indirectly addressable */
@@ -856,13 +860,17 @@ aopOp (operand * op, iCode * ic, bool result)
     }
 
   /* if already has a asmop then continue */
-  if (op->aop )
-    return;
+  if (op->aop)
+    {
+         op->aop->allocated++;
+      return;
+    }
 
   /* if the underlying symbol has a aop */
   if (IS_SYMOP (op) && OP_SYMBOL (op)->aop)
     {
       op->aop = OP_SYMBOL (op)->aop;
+         op->aop->allocated++;
       return;
     }
 
@@ -979,13 +987,13 @@ freeAsmop (operand * op, asmop * aaop, iCode * ic, bool pop)
   if (!aop)
     return;
 
-  if (aop->freed)
-    goto dealloc;
+  aop->allocated--;
 
-  aop->freed = 1;
+  if (aop->allocated)
+    goto dealloc;
 
-  /* depending on the asmop type only three cases need work AOP_RO
-     , AOP_R1 && AOP_STK */
+  /* depending on the asmop type only three cases need work
+     AOP_R0, AOP_R1 & AOP_STK */
   switch (aop->type)
     {
     case AOP_R0:
@@ -1098,7 +1106,7 @@ freeForBranchAsmop (operand * op)
   if (!aop)
     return;
 
-  if (aop->freed)
+  if (!aop->allocated)
     return;
 
   switch (aop->type)
@@ -1809,8 +1817,8 @@ genNot (iCode * ic)
 
 release:
   /* release the aops */
-  freeAsmop (IC_LEFT (ic), NULL, ic, (RESULTONSTACK (ic) ? 0 : 1));
   freeAsmop (IC_RESULT (ic), NULL, ic, TRUE);
+  freeAsmop (IC_LEFT (ic), NULL, ic, (RESULTONSTACK (ic) ? 0 : 1));
 }
 
 
@@ -1877,8 +1885,8 @@ genCpl (iCode * ic)
 
 release:
   /* release the aops */
-  freeAsmop (IC_LEFT (ic), NULL, ic, (RESULTONSTACK (ic) ? 0 : 1));
   freeAsmop (IC_RESULT (ic), NULL, ic, TRUE);
+  freeAsmop (IC_LEFT (ic), NULL, ic, (RESULTONSTACK (ic) ? 0 : 1));
 }
 
 /*-----------------------------------------------------------------*/
@@ -1987,8 +1995,8 @@ genUminus (iCode * ic)
 
 release:
   /* release the aops */
-  freeAsmop (IC_LEFT (ic), NULL, ic, (RESULTONSTACK (ic) ? 0 : 1));
   freeAsmop (IC_RESULT (ic), NULL, ic, TRUE);
+  freeAsmop (IC_LEFT (ic), NULL, ic, (RESULTONSTACK (ic) ? 0 : 1));
 }
 
 /*-----------------------------------------------------------------*/
@@ -4229,6 +4237,7 @@ genPlus (iCode * ic)
   int size, offset = 0;
   int skip_bytes = 0;
   char *add = "add";
+  bool swappedLR = FALSE;
   operand *leftOp, *rightOp;
   operand * op;
 
@@ -4250,6 +4259,7 @@ genPlus (iCode * ic)
       operand *t = IC_RIGHT (ic);
       IC_RIGHT (ic) = IC_LEFT (ic);
       IC_LEFT (ic) = t;
+         swappedLR = TRUE;
     }
 
   /* if both left & right are in bit
@@ -4294,7 +4304,7 @@ genPlus (iCode * ic)
   size = getDataSize (IC_RESULT (ic));
   leftOp = IC_LEFT(ic);
   rightOp = IC_RIGHT(ic);
-  op=IC_LEFT(ic);
+  op = IC_LEFT(ic);
 
   /* if this is an add for an array access
      at a 256 byte boundary */
@@ -4385,9 +4395,17 @@ genPlus (iCode * ic)
   adjustArithmeticResult (ic);
 
 release:
-  freeAsmop (IC_RIGHT (ic), NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
-  freeAsmop (IC_LEFT (ic), NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
   freeAsmop (IC_RESULT (ic), NULL, ic, TRUE);
+  if (!swappedLR)
+    {
+      freeAsmop (IC_RIGHT (ic), NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
+      freeAsmop (IC_LEFT (ic), NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
+    }
+  else
+    {
+      freeAsmop (IC_LEFT (ic), NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
+      freeAsmop (IC_RIGHT (ic), NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
+    }
 }
 
 /*-----------------------------------------------------------------*/
@@ -4701,9 +4719,9 @@ genMinus (iCode * ic)
   adjustArithmeticResult (ic);
 
 release:
+  freeAsmop (IC_RESULT (ic), NULL, ic, TRUE);
   freeAsmop (IC_RIGHT (ic), NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
   freeAsmop (IC_LEFT (ic), NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
-  freeAsmop (IC_RESULT (ic), NULL, ic, TRUE);
 }
 
 
@@ -4969,9 +4987,9 @@ genMult (iCode * ic)
   assert (0);
 
 release:
+  freeAsmop (result, NULL, ic, TRUE);
   freeAsmop (right, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
   freeAsmop (left, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
-  freeAsmop (result, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -5255,9 +5273,9 @@ genDiv (iCode * ic)
   /* should have been converted to function call */
   assert (0);
 release:
+  freeAsmop (result, NULL, ic, TRUE);
   freeAsmop (right, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
   freeAsmop (left, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
-  freeAsmop (result, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -5526,9 +5544,9 @@ genMod (iCode * ic)
   assert (0);
 
 release:
+  freeAsmop (result, NULL, ic, TRUE);
   freeAsmop (right, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
   freeAsmop (left, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
-  freeAsmop (result, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -5727,9 +5745,9 @@ genCmpGt (iCode * ic, iCode * ifx)
   sign = !((SPEC_USIGN (letype) && !(IS_CHAR (letype) && IS_LITERAL (letype))) ||
            (SPEC_USIGN (retype) && !(IS_CHAR (retype) && IS_LITERAL (retype))));
   /* assign the amsops */
+  aopOp (result, ic, TRUE);
   aopOp (left, ic, FALSE);
   aopOp (right, ic, FALSE);
-  aopOp (result, ic, TRUE);
 
   genCmp (right, left, result, ifx, sign, ic);
 
@@ -5757,9 +5775,9 @@ genCmpLt (iCode * ic, iCode * ifx)
   sign = !((SPEC_USIGN (letype) && !(IS_CHAR (letype) && IS_LITERAL (letype))) ||
            (SPEC_USIGN (retype) && !(IS_CHAR (retype) && IS_LITERAL (retype))));
   /* assign the amsops */
+  aopOp (result, ic, TRUE);
   aopOp (left, ic, FALSE);
   aopOp (right, ic, FALSE);
-  aopOp (result, ic, TRUE);
 
   genCmp (left, right, result, ifx, sign, ic);
 
@@ -5869,6 +5887,7 @@ gencjne (operand * left, operand * right, symbol * lbl)
 static void
 genCmpEq (iCode * ic, iCode * ifx)
 {
+  bool swappedLR = FALSE;
   operand *left, *right, *result;
 
   D(emitcode (";     genCmpEq",""));
@@ -5886,6 +5905,7 @@ genCmpEq (iCode * ic, iCode * ifx)
       operand *t = IC_RIGHT (ic);
       IC_RIGHT (ic) = IC_LEFT (ic);
       IC_LEFT (ic) = t;
+         swappedLR = TRUE;
     }
 
   if (ifx && !AOP_SIZE (result))
@@ -6037,9 +6057,17 @@ genCmpEq (iCode * ic, iCode * ifx)
     }
 
 release:
-  freeAsmop (right, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
-  freeAsmop (left, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
   freeAsmop (result, NULL, ic, TRUE);
+  if (!swappedLR)
+    {
+      freeAsmop (right, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
+      freeAsmop (left, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
+    }
+  else
+    {
+      freeAsmop (left, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
+      freeAsmop (right, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
+    }
 }
 
 /*-----------------------------------------------------------------*/
@@ -6137,9 +6165,9 @@ genAndOp (iCode * ic)
       outBitAcc (result);
     }
 
+  freeAsmop (result, NULL, ic, TRUE);
   freeAsmop (right, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
   freeAsmop (left, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
-  freeAsmop (result, NULL, ic, TRUE);
 }
 
 
@@ -6179,9 +6207,9 @@ genOrOp (iCode * ic)
       outBitAcc (result);
     }
 
+  freeAsmop (result, NULL, ic, TRUE);
   freeAsmop (right, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
   freeAsmop (left, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
-  freeAsmop (result, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -6651,9 +6679,9 @@ genAnd (iCode * ic, iCode * ifx)
     }
 
 release:
+  freeAsmop (result, NULL, ic, TRUE);
   freeAsmop (right, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
   freeAsmop (left, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
-  freeAsmop (result, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -6983,9 +7011,9 @@ genOr (iCode * ic, iCode * ifx)
     }
 
 release:
+  freeAsmop (result, NULL, ic, TRUE);
   freeAsmop (right, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
   freeAsmop (left, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
-  freeAsmop (result, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -7290,9 +7318,9 @@ genXor (iCode * ic, iCode * ifx)
     }
 
 release:
+  freeAsmop (result, NULL, ic, TRUE);
   freeAsmop (right, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
   freeAsmop (left, NULL, ic, (RESULTONSTACK (ic) ? FALSE : TRUE));
-  freeAsmop (result, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -7386,8 +7414,8 @@ genRRC (iCode * ic)
   emitcode ("mov", "acc.7,c");
  release:
   aopPut (result, "a", AOP_SIZE (result) - 1, isOperandVolatile (result, FALSE));
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -7441,8 +7469,8 @@ genRLC (iCode * ic)
   emitcode ("mov", "acc.0,c");
  release:
   aopPut (result, "a", 0, isOperandVolatile (result, FALSE));
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -7474,8 +7502,8 @@ genGetHbit (iCode * ic)
       outAcc (result);
     }
 
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -7545,9 +7573,9 @@ genGetAbit (iCode * ic)
       outAcc (result);
     }
 
+  freeAsmop (result, NULL, ic, TRUE);
   freeAsmop (right, NULL, ic, TRUE);
   freeAsmop (left, NULL, ic, TRUE);
-  freeAsmop (result, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -7574,9 +7602,9 @@ genGetByte (iCode * ic)
           0,
           isOperandVolatile (result, FALSE));
 
+  freeAsmop (result, NULL, ic, TRUE);
   freeAsmop (right, NULL, ic, TRUE);
   freeAsmop (left, NULL, ic, TRUE);
-  freeAsmop (result, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -7607,9 +7635,9 @@ genGetWord (iCode * ic)
           1,
           isOperandVolatile (result, FALSE));
 
+  freeAsmop (result, NULL, ic, TRUE);
   freeAsmop (right, NULL, ic, TRUE);
   freeAsmop (left, NULL, ic, TRUE);
-  freeAsmop (result, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -7674,8 +7702,8 @@ genSwap (iCode * ic)
       wassertl(FALSE, "unsupported SWAP operand size");
     }
 
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 
@@ -8583,8 +8611,8 @@ genLeftShiftLiteral (operand * left,
           break;
         }
     }
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -8693,8 +8721,8 @@ genLeftShift (iCode * ic)
   emitcode ("djnz", "b,%05d$", tlbl->key + 100);
   popB (pushedB);
 release:
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -8933,8 +8961,8 @@ genRightShiftLiteral (operand * left,
           break;
         }
     }
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -9044,8 +9072,8 @@ genSignedRightShift (iCode * ic)
   popB (pushedB);
 
 release:
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -9169,8 +9197,8 @@ genRightShift (iCode * ic)
   popB (pushedB);
 
 release:
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -9396,8 +9424,8 @@ genDataPointerGet (operand * left,
       aopPut (result, buffer, offset++, isOperandVolatile (result, FALSE));
     }
 
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -9633,10 +9661,9 @@ genPagedPointerGet (operand * left,
     }
 
   /* done */
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
   if (pi) pi->generated = 1;
-
 }
 
 /*--------------------------------------------------------------------*/
@@ -9747,8 +9774,8 @@ genFarPointerGet (operand * left,
       genIfxJump (ifx, "a", left, NULL, result);
     }
 
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -9809,8 +9836,8 @@ genCodePointerGet (operand * left,
       genIfxJump (ifx, "a", left, NULL, result);
     }
 
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -9861,9 +9888,8 @@ genGenPointerGet (operand * left,
       genIfxJump (ifx, "a", left, NULL, result);
     }
 
-
-  freeAsmop (left, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (left, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -10097,8 +10123,8 @@ genDataPointerSet (operand * right,
                 aopGet (right, offset++, FALSE, FALSE));
     }
 
-  freeAsmop (right, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (right, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -10321,8 +10347,6 @@ genPagedPointerSet (operand * right,
   if (pi) pi->generated = 1;
   freeAsmop (result, NULL, ic, TRUE);
   freeAsmop (right, NULL, ic, TRUE);
-
-
 }
 
 /*-----------------------------------------------------------------*/
@@ -10621,7 +10645,6 @@ genFarFarAssign (operand * result, operand * right, iCode * ic)
       aopPut (result, "a", --offset, isOperandVolatile (result, FALSE));
     }
   freeAsmop (result, NULL, ic, FALSE);
-
 }
 
 /*-----------------------------------------------------------------*/
@@ -10736,8 +10759,8 @@ genAssign (iCode * ic)
     }
 
 release:
-  freeAsmop (right, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
+  freeAsmop (right, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
@@ -11021,9 +11044,8 @@ genCast (iCode * ic)
   /* we are done hurray !!!! */
 
 release:
-  freeAsmop (right, NULL, ic, TRUE);
   freeAsmop (result, NULL, ic, TRUE);
-
+  freeAsmop (right, NULL, ic, TRUE);
 }
 
 /*-----------------------------------------------------------------*/
index 9988061d68beb57ffb7220ed14be74af24996ac6..3cd811f20c981f4ee3006a658e3be4948e2ba352 100644 (file)
@@ -59,7 +59,7 @@ typedef struct asmop
     short size;                        /* total size */
     unsigned code:1;           /* is in Code space */
     unsigned paged:1;          /* in paged memory  */
-    unsigned freed:1;          /* already freed    */
+    unsigned short allocated;  /* number of times allocated */
     union
       {
        value *aop_lit;         /* if literal */
index 2f8c3225dd907a7af607b377c278222bd9737a2a..2e99300aa21b17fb819acddfa711c8034b26abf7 100644 (file)
@@ -22,4 +22,16 @@ const char *getSuiteName(void);
 
 #define UNUSED(_a)  if (_a) { }
 
+#if defined(PORT_HOST) || defined(SDCC_z80) || defined(SDCC_gbz80)
+# define idata
+# define pdata
+# define xdata
+# define code
+#endif
+
+#if defined(SDCC_hc08)
+# define idata data
+# define pdata data
+#endif
+
 #endif
diff --git a/support/regression/tests/bug1409955.c b/support/regression/tests/bug1409955.c
new file mode 100644 (file)
index 0000000..a2a5ed7
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+   bug1409955.c
+*/
+
+#include <testfwk.h>
+
+void
+WriteToXData(char* buffer)
+{
+       (void)buffer;
+}
+
+void
+test_push_pop(void)
+{
+    char         a;
+    xdata char*  p;
+    char         d[5];
+
+    d[0] = 0;
+    d[1] = 0;
+    d[2] = 0;
+    d[3] = 0;
+    d[4] = 0;
+    p = 0;
+    do
+    {   if( (unsigned short)p > 10 ) a = 10-(char)p;
+        else                                            a = 60;
+               d[0] = 0x12;
+        d[1] = 0x34;
+        WriteToXData(d);       // Watch the xdata: 0, 1!
+        p += a;
+        ASSERT (d[0] == 0x12);
+        ASSERT (d[1] == 0x34);
+    } while( !p );
+    d[0] = 1;
+    d[1] = 2;
+    d[2] = 3;
+    d[3] = 4;
+    d[4] = 5;
+}
index 779b5898384cb0871a5ff14dc1e4e2bf2590f0f9..fef5ff50f62b8e766c6af6cfb5f549dc5676a82a 100644 (file)
 typedef unsigned int size_t;
 #define offsetof(s,m)   (size_t)&(((s *)0)->m)
 
-#if defined(PORT_HOST) || defined(SDCC_z80) || defined(SDCC_gbz80)
-# define idata
-# define pdata
-# define xdata
-# define code
-#endif
-
-#if defined(SDCC_hc08)
-# define idata data
-# define pdata data
-#endif
-
 const char *string1 = "\x00\x01";
 const char string2[] = "\x00\x01";