From 2afcba84a2dd97e26c2af22a7219c892722f7005 Mon Sep 17 00:00:00 2001 From: MaartenBrock Date: Wed, 27 Feb 2008 13:50:39 +0000 Subject: [PATCH] * 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 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@5054 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 21 +++++++--- src/SDCCsymt.c | 2 + src/mcs51/gen.c | 56 ++++++++++++++------------- support/regression/tests/bug1838000.c | 30 ++++++++++++++ 4 files changed, 78 insertions(+), 31 deletions(-) create mode 100644 support/regression/tests/bug1838000.c diff --git a/ChangeLog b/ChangeLog index dc338bb8..eccfb0de 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-02-27 Maarten Brock + + * 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 * src/mcs51/ralloc.c (isSpiltOnStack): fixed bug 1565152 @@ -60,7 +70,8 @@ 2008-02-20 Philipp Klaus Krause - * 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 @@ -73,14 +84,14 @@ 2008-02-20 Philipp Klaus Krause - * 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 * 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 diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index b9d4175a..d422daf5 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -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; diff --git a/src/mcs51/gen.c b/src/mcs51/gen.c index 8fb85cad..005e6c1e 100644 --- a/src/mcs51/gen.c +++ b/src/mcs51/gen.c @@ -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 index 00000000..eb54db93 --- /dev/null +++ b/support/regression/tests/bug1838000.c @@ -0,0 +1,30 @@ +/* + bug 1838000 +*/ + +#include + +#ifdef SDCC + #include +#else + #define _AUTOMEM + #define _STATMEM +#endif + +typedef struct { char b:1; } t; +t glbl = { 0 }; +t _STATMEM * gp = &glbl; + +void func(char _AUTOMEM *p) +{ + *p++ = gp->b ? 'A' : 'B'; + *p = 'C'; +} + +void +testBug(void) +{ + char x[2]; + func(x); + ASSERT(x[0]=='B'); +} -- 2.47.2