* src/mcs51/gen.c (genUnpackBits): don't generate ifxJump, instead return
authorMaartenBrock <MaartenBrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 27 Feb 2008 13:50:39 +0000 (13:50 +0000)
committerMaartenBrock <MaartenBrock@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 27 Feb 2008 13:50:39 +0000 (13:50 +0000)
  ifx condition
  (genNearPointerGet, genPagedPointerGet, genFarPointerGet,
  genCodePointerGet, genGenPointerGet): cleanup aop before generating
    ifxJump to fix bug 1838000
* src/SDCCsymt.c (aggregateToPointer): fix problem for xstack
* support/regression/tests/bug1838000.c: new, added

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

ChangeLog
src/SDCCsymt.c
src/mcs51/gen.c
support/regression/tests/bug1838000.c [new file with mode: 0644]

index dc338bb890ea54be5e34d5df296c5e9afe8fe820..eccfb0deb9d85c0594adbae78f56691dc23b2d84 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008-02-27 Maarten Brock <sourceforge.brock AT dse.nl>
+
+       * src/mcs51/gen.c (genUnpackBits): don't generate ifxJump, instead return
+         ifx condition
+         (genNearPointerGet, genPagedPointerGet, genFarPointerGet,
+         genCodePointerGet, genGenPointerGet): cleanup aop before generating
+           ifxJump to fix bug 1838000
+       * src/SDCCsymt.c (aggregateToPointer): fix problem for xstack
+       * support/regression/tests/bug1838000.c: new, added
+
 2008-02-25 Maarten Brock <sourceforge.brock AT dse.nl>
 
        * src/mcs51/ralloc.c (isSpiltOnStack): fixed bug 1565152
@@ -60,7 +70,8 @@
 
 2008-02-20 Philipp Klaus Krause <pkk AT spth.de>
 
-       * support/regression/tests/bugs-1596270-1736867.c: Regression test for #1596270, #1736867
+       * support/regression/tests/bugs-1596270-1736867.c: Regression test for
+         #1596270, #1736867
 
 2008-02-20 Maarten Brock <sourceforge.brock AT dse.nl>
 
 
 2008-02-20 Philipp Klaus Krause <pkk AT spth.de>
 
-       * src/z80/gen.c: fixed bug in register pair loading when swapping register contents,
-         mostly fixes #1596270
+       * src/z80/gen.c: fixed bug in register pair loading when swapping register
+         contents, mostly fixes #1596270
 
 2008-02-20 Philipp Klaus Krause <pkk AT spth.de>
 
        * src/z80/peeph.def,
-       * src/z80/peeph-z80.def: moved peephole that breaks gbz80 to z80-specific peepholes,
-         fixes #1806565
+       * src/z80/peeph-z80.def: moved peephole that breaks gbz80 to z80-specific
+         peepholes, fixes #1806565
 
 2008-02-20 Maarten Brock <sourceforge.brock AT dse.nl>
 
index b9d4175a6e5a35d302441237f08049ec58b94765..d422daf5061e3c6af11810f6a3afb57349f7ad17 100644 (file)
@@ -2424,6 +2424,8 @@ aggregateToPointer (value * val)
           }
           break;
         case S_AUTO:
+          DCL_TYPE (val->type) = PTR_TYPE(SPEC_OCLS(val->etype));
+          break;
         case S_DATA:
         case S_REGISTER:
           DCL_TYPE (val->type) = POINTER;
index 8fb85cad76451b20c4a5c4474abc462c8bc3a0d5..005e6c1e2cd91f77fe5bcf25bd1eb29982836dcf 100644 (file)
@@ -9729,7 +9729,7 @@ emitPtrByteSet (char *rname, int p_type, char *src)
 /*-----------------------------------------------------------------*/
 /* genUnpackBits - generates code for unpacking bits               */
 /*-----------------------------------------------------------------*/
-static void
+static char*
 genUnpackBits (operand * result, char *rname, int ptype, iCode *ifx)
 {
   int offset = 0;       /* result byte offset */
@@ -9738,7 +9738,8 @@ genUnpackBits (operand * result, char *rname, int ptype, iCode *ifx)
   sym_link *etype;      /* bitfield type information */
   int blen;             /* bitfield length */
   int bstr;             /* bitfield starting bit within byte */
-  char buffer[10];
+  static char* const accBits[] = {"acc.0", "acc.1", "acc.2", "acc.3",
+                                  "acc.4", "acc.5", "acc.6", "acc.7"};
 
   D(emitcode (";", "genUnpackBits"));
 
@@ -9752,18 +9753,15 @@ genUnpackBits (operand * result, char *rname, int ptype, iCode *ifx)
       emitPtrByteGet (rname, ptype, FALSE);
       if (blen == 1)
         {
-          SNPRINTF (buffer, sizeof(buffer),
-                    "acc.%d", bstr);
-          genIfxJump (ifx, buffer, NULL, NULL, NULL);
+          return accBits[bstr];;
         }
       else
         {
           if (blen < 8)
             emitcode ("anl", "a,#0x%02x",
                       (((unsigned char) -1) >> (8 - blen)) << bstr);
-          genIfxJump (ifx, "a", NULL, NULL, NULL);
+          return "a";
         }
-      return;
     }
   wassert (!ifx);
 
@@ -9832,6 +9830,7 @@ finish:
       while (rsize--)
         aopPut (result, source, offset++);
     }
+  return NULL;
 }
 
 
@@ -9885,9 +9884,9 @@ genNearPointerGet (operand * left,
   asmop *aop = NULL;
   regs *preg = NULL;
   char *rname;
+  char *ifxCond = "a";
   sym_link *rtype, *retype;
   sym_link *ltype = operandType (left);
-  char buffer[80];
 
   D (emitcode (";", "genNearPointerGet"));
 
@@ -9908,6 +9907,9 @@ genNearPointerGet (operand * left,
       return;
     }
 
+  //aopOp (result, ic, FALSE);
+  aopOp (result, ic, result?TRUE:FALSE);
+
  /* if the value is already in a pointer register
      then don't need anything more */
   if (!AOP_INPREG (AOP (left)))
@@ -9942,12 +9944,9 @@ genNearPointerGet (operand * left,
   else
     rname = aopGet (left, 0, FALSE, FALSE);
 
-  //aopOp (result, ic, FALSE);
-  aopOp (result, ic, result?TRUE:FALSE);
-
   /* if bitfield then unpack the bits */
   if (IS_BITFIELD (retype))
-    genUnpackBits (result, rname, POINTER, ifx);
+    ifxCond = genUnpackBits (result, rname, POINTER, ifx);
   else
     {
       /* we have can just get the values */
@@ -9965,6 +9964,8 @@ genNearPointerGet (operand * left,
             }
           else
             {
+              char buffer[80];
+
               SNPRINTF (buffer, sizeof(buffer), "@%s", rname);
               aopPut (result, buffer, offset);
             }
@@ -10003,7 +10004,7 @@ genNearPointerGet (operand * left,
 
   if (ifx && !ifx->generated)
     {
-      genIfxJump (ifx, "a", left, NULL, result);
+      genIfxJump (ifx, ifxCond, left, NULL, result);
     }
 
   /* done */
@@ -10025,6 +10026,7 @@ genPagedPointerGet (operand * left,
   asmop *aop = NULL;
   regs *preg = NULL;
   char *rname;
+  char *ifxCond = "a";
   sym_link *rtype, *retype;
 
   D (emitcode (";", "genPagedPointerGet"));
@@ -10034,6 +10036,8 @@ genPagedPointerGet (operand * left,
 
   aopOp (left, ic, FALSE);
 
+  aopOp (result, ic, FALSE);
+
   /* if the value is already in a pointer register
      then don't need anything more */
   if (!AOP_INPREG (AOP (left)))
@@ -10049,11 +10053,9 @@ genPagedPointerGet (operand * left,
   else
     rname = aopGet (left, 0, FALSE, FALSE);
 
-  aopOp (result, ic, FALSE);
-
   /* if bitfield then unpack the bits */
   if (IS_BITFIELD (retype))
-    genUnpackBits (result, rname, PPOINTER, ifx);
+    ifxCond = genUnpackBits (result, rname, PPOINTER, ifx);
   else
     {
       /* we have can just get the values */
@@ -10102,7 +10104,7 @@ genPagedPointerGet (operand * left,
 
   if (ifx && !ifx->generated)
     {
-      genIfxJump (ifx, "a", left, NULL, result);
+      genIfxJump (ifx, ifxCond, left, NULL, result);
     }
 
   /* done */
@@ -10179,6 +10181,7 @@ genFarPointerGet (operand * left,
                   operand * result, iCode * ic, iCode * pi, iCode * ifx)
 {
   int size, offset;
+  char *ifxCond = "a";
   sym_link *retype = getSpec (operandType (result));
 
   D (emitcode (";", "genFarPointerGet"));
@@ -10191,7 +10194,7 @@ genFarPointerGet (operand * left,
 
   /* if bit then unpack */
   if (IS_BITFIELD (retype))
-    genUnpackBits (result, "dptr", FPOINTER, ifx);
+    ifxCond = genUnpackBits (result, "dptr", FPOINTER, ifx);
   else
     {
       size = AOP_SIZE (result);
@@ -10216,7 +10219,7 @@ genFarPointerGet (operand * left,
 
   if (ifx && !ifx->generated)
     {
-      genIfxJump (ifx, "a", left, NULL, result);
+      genIfxJump (ifx, ifxCond, left, NULL, result);
     }
 
   freeAsmop (result, NULL, ic, TRUE);
@@ -10231,6 +10234,7 @@ genCodePointerGet (operand * left,
                     operand * result, iCode * ic, iCode *pi, iCode *ifx)
 {
   int size, offset;
+  char *ifxCond = "a";
   sym_link *retype = getSpec (operandType (result));
 
   D (emitcode (";", "genCodePointerGet"));
@@ -10243,7 +10247,7 @@ genCodePointerGet (operand * left,
 
   /* if bit then unpack */
   if (IS_BITFIELD (retype))
-    genUnpackBits (result, "dptr", CPOINTER, ifx);
+    ifxCond = genUnpackBits (result, "dptr", CPOINTER, ifx);
   else
     {
       size = AOP_SIZE (result);
@@ -10269,7 +10273,7 @@ genCodePointerGet (operand * left,
 
   if (ifx && !ifx->generated)
     {
-      genIfxJump (ifx, "a", left, NULL, result);
+      genIfxJump (ifx, ifxCond, left, NULL, result);
     }
 
   freeAsmop (result, NULL, ic, TRUE);
@@ -10284,6 +10288,7 @@ genGenPointerGet (operand * left,
                   operand * result, iCode * ic, iCode *pi, iCode *ifx)
 {
   int size, offset;
+  char *ifxCond = "a";
   sym_link *retype = getSpec (operandType (result));
 
   D (emitcode (";", "genGenPointerGet"));
@@ -10297,7 +10302,7 @@ genGenPointerGet (operand * left,
   /* if bit then unpack */
   if (IS_BITFIELD (retype))
     {
-      genUnpackBits (result, "dptr", GPOINTER, ifx);
+      ifxCond = genUnpackBits (result, "dptr", GPOINTER, ifx);
     }
   else
     {
@@ -10323,7 +10328,7 @@ genGenPointerGet (operand * left,
 
   if (ifx && !ifx->generated)
     {
-      genIfxJump (ifx, "a", left, NULL, result);
+      genIfxJump (ifx, ifxCond, left, NULL, result);
     }
 
   freeAsmop (result, NULL, ic, TRUE);
@@ -10788,10 +10793,9 @@ genPagedPointerSet (operand * right,
          if size > 0 && this could be used again
          we have to point it back to where it
          belongs */
-      if ((AOP_SIZE (right) > 1 &&
+      if (AOP_SIZE (right) > 1 &&
           !OP_SYMBOL (result)->remat &&
-          (OP_SYMBOL (result)->liveTo > ic->seq ||
-            ic->depth)) &&
+          (OP_SYMBOL (result)->liveTo > ic->seq || ic->depth) &&
           !pi)
         {
           int size = AOP_SIZE (right) - 1;
diff --git a/support/regression/tests/bug1838000.c b/support/regression/tests/bug1838000.c
new file mode 100644 (file)
index 0000000..eb54db9
--- /dev/null
@@ -0,0 +1,30 @@
+/*\r
+    bug 1838000\r
+*/\r
+\r
+#include <testfwk.h>\r
+\r
+#ifdef SDCC\r
+ #include <sdcc-lib.h>\r
+#else\r
+ #define _AUTOMEM\r
+ #define _STATMEM\r
+#endif\r
+\r
+typedef struct { char b:1; } t;\r
+t glbl = { 0 };\r
+t _STATMEM * gp = &glbl;\r
+\r
+void func(char _AUTOMEM *p)\r
+{\r
+       *p++ = gp->b ? 'A' : 'B';\r
+       *p   = 'C';\r
+}\r
+\r
+void\r
+testBug(void)\r
+{\r
+       char x[2];\r
+       func(x);\r
+       ASSERT(x[0]=='B');\r
+}\r