From 38db956515d019d220431a1699e8daeca391c922 Mon Sep 17 00:00:00 2001 From: epetrich Date: Tue, 20 Apr 2004 05:16:13 +0000 Subject: [PATCH] * src/z80/peeph-z80.def: removed some peephole rules that don't work with multibyte arithmetic (fixed bug #937126) * src/mcs51/peeph.def: fixed peephole rules 150-158 to apply only to registers and not global variables * src/SDCCicode.c (geniCodeAssign, ast2iCode, geniCodePostInc, geniCodePreInc, geniCodePostDec, geniCodePreDec, geniCodeLogicAndOr, geniCodeConditional): enforce strict lvalue checking for assignments not internally generated (fixed bug #931895) * src/SDCC.y (postfix_expr): ignore typedefs when looking for a structure member (fixed bug #930072) git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3293 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 13 +++++++ src/SDCC.y | 20 +++++----- src/SDCCicode.c | 53 +++++++++++++------------- src/mcs51/peeph.def | 86 +++++++++++++++++++++---------------------- src/z80/peeph-z80.def | 39 -------------------- 5 files changed, 94 insertions(+), 117 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0baf823c..c2712504 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2004-04-20 Erik Petrich + + * src/z80/peeph-z80.def: removed some peephole rules that don't + work with multibyte arithmetic (fixed bug #937126) + * src/mcs51/peeph.def: fixed peephole rules 150-158 to apply only + to registers and not global variables + * src/SDCCicode.c (geniCodeAssign, ast2iCode, geniCodePostInc, + geniCodePreInc, geniCodePostDec, geniCodePreDec, + geniCodeLogicAndOr, geniCodeConditional): enforce strict lvalue + checking for assignments not internally generated (fixed bug #931895) + * src/SDCC.y (postfix_expr): ignore typedefs when looking for a + structure member (fixed bug #930072) + 2004-04-19 Erik Petrich * src/SDCCmain.c (linkEdit), diff --git a/src/SDCC.y b/src/SDCC.y index 475cb5eb..442e17e5 100644 --- a/src/SDCC.y +++ b/src/SDCC.y @@ -256,18 +256,20 @@ postfix_expr { $$ = newNode (CALL,$1,$3) ; $$->left->funcName = 1; } - | postfix_expr '.' identifier + | postfix_expr '.' { ignoreTypedefType = 1; } identifier { - $3 = newSymbol($3->name,NestLevel); - $3->implicit = 1; - $$ = newNode(PTR_OP,newNode('&',$1,NULL),newAst_VALUE(symbolVal($3))); -/* $$ = newNode('.',$1,newAst(EX_VALUE,symbolVal($3))) ; */ + ignoreTypedefType = 0; + $4 = newSymbol($4->name,NestLevel); + $4->implicit = 1; + $$ = newNode(PTR_OP,newNode('&',$1,NULL),newAst_VALUE(symbolVal($4))); +/* $$ = newNode('.',$1,newAst(EX_VALUE,symbolVal($4))) ; */ } - | postfix_expr PTR_OP identifier + | postfix_expr PTR_OP { ignoreTypedefType = 1; } identifier { - $3 = newSymbol($3->name,NestLevel); - $3->implicit = 1; - $$ = newNode(PTR_OP,$1,newAst_VALUE(symbolVal($3))); + ignoreTypedefType = 0; + $4 = newSymbol($4->name,NestLevel); + $4->implicit = 1; + $$ = newNode(PTR_OP,$1,newAst_VALUE(symbolVal($4))); } | postfix_expr INC_OP { $$ = newNode(INC_OP,$1,NULL);} diff --git a/src/SDCCicode.c b/src/SDCCicode.c index ae54a48a..7e3321fc 100644 --- a/src/SDCCicode.c +++ b/src/SDCCicode.c @@ -45,7 +45,7 @@ symbol *entryLabel; /* function entry label */ /*-----------------------------------------------------------------*/ /* forward definition of some functions */ -operand *geniCodeAssign (operand *, operand *, int); +operand *geniCodeAssign (operand *, operand *, int, int); static operand *geniCodeArray (operand *, operand *,int); static operand *geniCodeArray2Ptr (operand *); operand *geniCodeRValue (operand *, bool); @@ -2469,7 +2469,7 @@ geniCodePostInc (operand * op) if (IS_ITEMP (rv)) OP_SYMBOL(rv)->noSpilLoc = 1; - geniCodeAssign (rOp, rv, 0); + geniCodeAssign (rOp, rv, 0, 0); size = (IS_PTR (rvtype) ? getSize (rvtype->next) : 1); if (IS_FLOAT (rvtype)) @@ -2480,7 +2480,7 @@ geniCodePostInc (operand * op) IC_RESULT (ic) = result = newiTempOperand (rvtype, 0); ADDTOCHAIN (ic); - geniCodeAssign (op, result, 0); + geniCodeAssign (op, result, 0, 0); return rOp; @@ -2516,7 +2516,7 @@ geniCodePreInc (operand * op, bool lvalue) IC_RESULT (ic) = result = newiTempOperand (roptype, 0); ADDTOCHAIN (ic); - (void) geniCodeAssign (op, result, 0); + (void) geniCodeAssign (op, result, 0, 0); if (lvalue || IS_TRUE_SYMOP (op)) return op; else @@ -2552,7 +2552,7 @@ geniCodePostDec (operand * op) if (IS_ITEMP (rv)) OP_SYMBOL(rv)->noSpilLoc = 1; - geniCodeAssign (rOp, rv, 0); + geniCodeAssign (rOp, rv, 0, 0); size = (IS_PTR (rvtype) ? getSize (rvtype->next) : 1); if (IS_FLOAT (rvtype)) @@ -2563,7 +2563,7 @@ geniCodePostDec (operand * op) IC_RESULT (ic) = result = newiTempOperand (rvtype, 0); ADDTOCHAIN (ic); - geniCodeAssign (op, result, 0); + geniCodeAssign (op, result, 0, 0); return rOp; @@ -2599,7 +2599,7 @@ geniCodePreDec (operand * op, bool lvalue) IC_RESULT (ic) = result = newiTempOperand (roptype, 0); ADDTOCHAIN (ic); - (void) geniCodeAssign (op, result, 0); + (void) geniCodeAssign (op, result, 0, 0); if (lvalue || IS_TRUE_SYMOP (op)) return op; else @@ -2950,12 +2950,12 @@ geniCodeLogicAndOr (ast *tree, int lvl) result = newiTempOperand (newCharLink(), 1); geniCodeLabel (falseLabel); - geniCodeAssign (result, operandFromLit (0), 0); + geniCodeAssign (result, operandFromLit (0), 0, 0); /* generate an unconditional goto */ geniCodeGoto (exitLabel); geniCodeLabel (trueLabel); - geniCodeAssign (result, operandFromLit (1), 0); + geniCodeAssign (result, operandFromLit (1), 0, 0); geniCodeLabel (exitLabel); @@ -2995,7 +2995,7 @@ geniCodeConditional (ast * tree,int lvl) /* move the value to a new Operand */ result = newiTempOperand (tree->right->ftype, 0); - geniCodeAssign (result, geniCodeRValue (true, FALSE), 0); + geniCodeAssign (result, geniCodeRValue (true, FALSE), 0, 0); /* generate an unconditional goto */ geniCodeGoto (exitLabel); @@ -3004,7 +3004,7 @@ geniCodeConditional (ast * tree,int lvl) geniCodeLabel (falseLabel); false = ast2iCode (tree->right->right,lvl+1); - geniCodeAssign (result, geniCodeRValue (false, FALSE), 0); + geniCodeAssign (result, geniCodeRValue (false, FALSE), 0, 0); /* create the exit label */ geniCodeLabel (exitLabel); @@ -3016,13 +3016,13 @@ geniCodeConditional (ast * tree,int lvl) /* geniCodeAssign - generate code for assignment */ /*-----------------------------------------------------------------*/ operand * -geniCodeAssign (operand * left, operand * right, int nosupdate) +geniCodeAssign (operand * left, operand * right, int nosupdate, int strictLval) { iCode *ic; sym_link *ltype = operandType (left); sym_link *rtype = operandType (right); - if (!left->isaddr && !IS_ITEMP (left)) + if (!left->isaddr && (!IS_ITEMP (left) || strictLval)) { werror (E_LVALUE_REQUIRED, "assignment"); return left; @@ -3200,7 +3200,7 @@ geniCodeParms (ast * parms, value *argVals, int *stack, operand *top = operandFromSymbol (argVals->sym); /* clear useDef and other bitVectors */ OP_USES(top)=OP_DEFS(top)=OP_SYMBOL(top)->clashes = NULL; - geniCodeAssign (top, pval, 1); + geniCodeAssign (top, pval, 1, 0); } else { @@ -4014,7 +4014,7 @@ ast2iCode (ast * tree,int lvl) else right = geniCodeRValue (right, FALSE); - geniCodeAssign (left, right, 0); + geniCodeAssign (left, right, 0, 1); return right; } case MUL_ASSIGN: @@ -4022,8 +4022,9 @@ ast2iCode (ast * tree,int lvl) geniCodeAssign (left, geniCodeMultiply (geniCodeRValue (operandFromOperand (left), FALSE), - geniCodeRValue (right, FALSE), FALSE), - getResultTypeFromType (tree->ftype)); + geniCodeRValue (right, FALSE), + getResultTypeFromType (tree->ftype)), + 0, 1); case DIV_ASSIGN: return @@ -4032,7 +4033,7 @@ ast2iCode (ast * tree,int lvl) FALSE), geniCodeRValue (right, FALSE), getResultTypeFromType (tree->ftype)), - 0); + 0, 1); case MOD_ASSIGN: return geniCodeAssign (left, @@ -4040,7 +4041,7 @@ ast2iCode (ast * tree,int lvl) FALSE), geniCodeRValue (right, FALSE), getResultTypeFromType (tree->ftype)), - 0); + 0, 1); case ADD_ASSIGN: { sym_link *rtype = operandType (right); @@ -4058,7 +4059,7 @@ ast2iCode (ast * tree,int lvl) right, getResultTypeFromType (tree->ftype), lvl), - 0); + 0, 1); } case SUB_ASSIGN: { @@ -4079,7 +4080,7 @@ ast2iCode (ast * tree,int lvl) FALSE), right, getResultTypeFromType (tree->ftype)), - 0); + 0, 1); } case LEFT_ASSIGN: return @@ -4088,13 +4089,13 @@ ast2iCode (ast * tree,int lvl) ,FALSE), geniCodeRValue (right, FALSE), getResultTypeFromType (tree->ftype)), - 0); + 0, 1); case RIGHT_ASSIGN: return geniCodeAssign (left, geniCodeRightShift (geniCodeRValue (operandFromOperand (left) ,FALSE), - geniCodeRValue (right, FALSE)), 0); + geniCodeRValue (right, FALSE)), 0, 1); case AND_ASSIGN: return geniCodeAssign (left, @@ -4102,7 +4103,7 @@ ast2iCode (ast * tree,int lvl) FALSE), geniCodeRValue (right, FALSE), BITWISEAND, - operandType (left)), 0); + operandType (left)), 0, 1); case XOR_ASSIGN: return geniCodeAssign (left, @@ -4110,7 +4111,7 @@ ast2iCode (ast * tree,int lvl) FALSE), geniCodeRValue (right, FALSE), '^', - operandType (left)), 0); + operandType (left)), 0, 1); case OR_ASSIGN: return geniCodeAssign (left, @@ -4118,7 +4119,7 @@ ast2iCode (ast * tree,int lvl) ,FALSE), geniCodeRValue (right, FALSE), '|', - operandType (left)), 0); + operandType (left)), 0, 1); case ',': return geniCodeRValue (right, FALSE); diff --git a/src/mcs51/peeph.def b/src/mcs51/peeph.def index a4117ac1..b7005720 100644 --- a/src/mcs51/peeph.def +++ b/src/mcs51/peeph.def @@ -676,8 +676,8 @@ replace { } replace { - mov %1,dpl - mov dpl,%1 + mov r%1,dpl + mov dpl,r%1 %9: ret } by { @@ -687,10 +687,10 @@ replace { } replace { - mov %1,dpl - mov %2,dph - mov dpl,%1 - mov dph,%2 + mov r%1,dpl + mov r%2,dph + mov dpl,r%1 + mov dph,r%2 %9: ret } by { @@ -700,9 +700,9 @@ replace { } replace { - mov %1,dpl - mov %2,dph - mov dpl,%1 + mov r%1,dpl + mov r%2,dph + mov dpl,r%1 %9: ret } by { @@ -712,12 +712,12 @@ replace { } replace { - mov %1,dpl - mov %2,dph - mov %3,b - mov dpl,%1 - mov dph,%2 - mov b,%3 + mov r%1,dpl + mov r%2,dph + mov r%3,b + mov dpl,r%1 + mov dph,r%2 + mov b,r%3 %9: ret } by { @@ -727,10 +727,10 @@ replace { } replace { - mov %1,dpl - mov %2,dph - mov %3,b - mov dpl,%1 + mov r%1,dpl + mov r%2,dph + mov r%3,b + mov dpl,r%1 %9: ret } by { @@ -740,11 +740,11 @@ replace { } replace { - mov %1,dpl - mov %2,dph - mov %3,b - mov dpl,%1 - mov dph,%2 + mov r%1,dpl + mov r%2,dph + mov r%3,b + mov dpl,r%1 + mov dph,r%2 %9: ret } by { @@ -754,14 +754,14 @@ replace { } replace { - mov %1,dpl - mov %2,dph - mov %3,b - mov %4,a - mov dpl,%1 - mov dph,%2 - mov b,%3 - mov a,%4 + mov r%1,dpl + mov r%2,dph + mov r%3,b + mov r%4,a + mov dpl,r%1 + mov dph,r%2 + mov b,r%3 + mov a,r%4 %9: ret } by { @@ -771,12 +771,12 @@ replace { } replace { - mov %1,dpl - mov %2,dph - mov %3,b - mov %4,a - mov dpl,%1 - mov dph,%2 + mov r%1,dpl + mov r%2,dph + mov r%3,b + mov r%4,a + mov dpl,r%1 + mov dph,r%2 %9: ret } by { @@ -786,11 +786,11 @@ replace { } replace { - mov %1,dpl - mov %2,dph - mov %3,b - mov %4,a - mov dpl,%1 + mov r%1,dpl + mov r%2,dph + mov r%3,b + mov r%4,a + mov dpl,r%1 %9: ret } by { diff --git a/src/z80/peeph-z80.def b/src/z80/peeph-z80.def index 09d8e160..948531d9 100644 --- a/src/z80/peeph-z80.def +++ b/src/z80/peeph-z80.def @@ -55,28 +55,6 @@ replace restart { ; z80 removed redundant pop/push ld %1,%2 } -; -;replace restart { - ld a,%1 - add a,#0x01 - ld l,a -} by { - ; z80 improved usage of 'inc' - ld l,%1 - inc l - ld a,l -} - -replace restart { - ld a,%1 - add a,#0xFF - ld l,a -} by { - ; z80 improved usage of 'dec' - ld l,%1 - dec l - ld a,l -} replace restart { ld l,a @@ -123,23 +101,6 @@ replace restart { ld c,a } -; I don't think this works. neg does a unary minus of A, not HL -- EEP -; -;replace { -; ld a,c -; sub a,%1 -; ld l,a -; ld a,b -; sbc a,%2 -; ld h,a -;} by { -; ; z80/z180 peephole byte pointer subtraction -; xor a -; ld h,%1 -; ld l,%2 -; sbc hl,bc -; neg -;} replace { %1: -- 2.30.2