From: MaartenBrock Date: Tue, 8 May 2007 19:44:35 +0000 (+0000) Subject: * src/ds390/gen.c (emitcode): don't change properties of previous lines, X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=9e98cf002aeb4e50e7681beb84a25c76358d3aa3;p=fw%2Fsdcc * src/ds390/gen.c (emitcode): don't change properties of previous lines, (throughout): updated generating comments * src/mcs51/gen.c (emitcode): don't change properties of previous lines, (throughout): updated generating comments * src/SDCCpeeph.c (peepHole): continue searching at the first replaced rule instead of at the second, or it might skip lines when removing the complete match * support/regression/tests/bug1714204.c: changed test to foo git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4797 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/ChangeLog b/ChangeLog index e000a761..4404bc66 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2007-05-08 Maarten Brock + + * src/ds390/gen.c (emitcode): don't change properties of previous lines, + (throughout): updated generating comments + * src/mcs51/gen.c (emitcode): don't change properties of previous lines, + (throughout): updated generating comments + * src/SDCCpeeph.c (peepHole): continue searching at the first replaced + rule instead of at the second, or it might skip lines when removing the + complete match + * support/regression/tests/bug1714204.c: changed test to foo + 2007-05-08 Borut Razem * doc/sdccman.lyx: changed sdcc version to 2.7.0, diff --git a/src/SDCCpeeph.c b/src/SDCCpeeph.c index a4341f1f..36bedeb2 100644 --- a/src/SDCCpeeph.c +++ b/src/SDCCpeeph.c @@ -248,7 +248,7 @@ FBYNAME (labelIsReturnOnly) { if (strncmp(pl->line, label, len) == 0) break; /* Found Label */ - if (strlen(pl->line) != 7 || !ISCHARDIGIT(*(pl->line)) || + if (strlen(pl->line) != 7 || !ISCHARDIGIT(*(pl->line)) || !ISCHARDIGIT(*(pl->line+1)) || !ISCHARDIGIT(*(pl->line+2)) || !ISCHARDIGIT(*(pl->line+3)) || !ISCHARDIGIT(*(pl->line+4)) || *(pl->line+5) != '$') @@ -266,7 +266,7 @@ FBYNAME (labelIsReturnOnly) return FALSE; /* next line not valid */ p = pl->line; for (p = pl->line; *p && ISCHARSPACE(*p); p++) - ; + ; retInst = "ret"; if (TARGET_IS_HC08) @@ -2264,7 +2264,7 @@ peepHole (lineNode ** pls) lineNode *spl; peepRule *pr; lineNode *mtail = NULL; - bool restart; + bool restart, replaced; #if !OPT_DISABLE_PIC || !OPT_DISABLE_PIC16 /* The PIC port uses a different peep hole optimizer based on "pCode" */ @@ -2281,8 +2281,10 @@ peepHole (lineNode ** pls) /* for all rules */ for (pr = rootRules; pr; pr = pr->next) { - for (spl = *pls; spl; spl = spl->next) + for (spl = *pls; spl; spl = replaced ? spl : spl->next) { + replaced = FALSE; + /* if inline assembler then no peep hole */ if (spl->isInline) continue; @@ -2299,10 +2301,15 @@ peepHole (lineNode ** pls) /* if it matches */ if (matchRule (spl, &mtail, pr, *pls)) { + /* restart at the replaced line */ + replaced = TRUE; /* then replace */ if (spl == *pls) - replaceRule (pls, mtail, pr); + { + replaceRule (pls, mtail, pr); + spl = *pls; + } else replaceRule (&spl, mtail, pr); diff --git a/src/ds390/gen.c b/src/ds390/gen.c index bbc1f5d6..aa9a8983 100644 --- a/src/ds390/gen.c +++ b/src/ds390/gen.c @@ -238,18 +238,19 @@ emitcode (const char *inst, const char *fmt,...) lbp++; } - if (lbp && *lbp) + if (lbp) { lineCurr = (lineCurr ? connectLine (lineCurr, newLineNode (lb)) : (lineHead = newLineNode (lb))); + + lineCurr->isInline = _G.inLine; + lineCurr->isDebug = _G.debugLine; + lineCurr->ic = _G.current_iCode; + lineCurr->aln = ds390newAsmLineNode(_currentDPS); + lineCurr->isComment = (*lbp == ';'); } - lineCurr->isInline = _G.inLine; - lineCurr->isDebug = _G.debugLine; - lineCurr->ic = _G.current_iCode; - lineCurr->aln = ds390newAsmLineNode(_currentDPS); - lineCurr->isComment = (*lbp == ';'); va_end (ap); dbuf_destroy(&dbuf); @@ -5633,7 +5634,7 @@ genDivbits (operand * left, char *l; bool pushedB; - D(emitcode ("; genDivbits","")); + D(emitcode (";", "genDivbits")); pushedB = pushB (); @@ -5663,7 +5664,7 @@ genDivOneByte (operand * left, symbol *lbl; int size, offset; - D(emitcode ("; genDivOneByte","")); + D(emitcode (";", "genDivOneByte")); offset = 1; lUnsigned = SPEC_USIGN (getSpec (operandType (left))); @@ -7142,10 +7143,10 @@ genAnd (iCode * ic, iCode * ifx) } #ifdef DEBUG_TYPE - emitcode ("", "; Type res[%d] = l[%d]&r[%d]", + emitcode (";", "Type res[%d] = l[%d]&r[%d]", AOP_TYPE (result), AOP_TYPE (left), AOP_TYPE (right)); - emitcode ("", "; Size res[%d] = l[%d]&r[%d]", + emitcode (";", "Size res[%d] = l[%d]&r[%d]", AOP_SIZE (result), AOP_SIZE (left), AOP_SIZE (right)); #endif @@ -7577,10 +7578,10 @@ genOr (iCode * ic, iCode * ifx) #ifdef DEBUG_TYPE - emitcode ("", "; Type res[%d] = l[%d]&r[%d]", + emitcode (";", "Type res[%d] = l[%d]&r[%d]", AOP_TYPE (result), AOP_TYPE (left), AOP_TYPE (right)); - emitcode ("", "; Size res[%d] = l[%d]&r[%d]", + emitcode (";", "Size res[%d] = l[%d]&r[%d]", AOP_SIZE (result), AOP_SIZE (left), AOP_SIZE (right)); #endif @@ -7968,10 +7969,10 @@ genXor (iCode * ic, iCode * ifx) } #ifdef DEBUG_TYPE - emitcode ("", "; Type res[%d] = l[%d]&r[%d]", + emitcode (";", "Type res[%d] = l[%d]&r[%d]", AOP_TYPE (result), AOP_TYPE (left), AOP_TYPE (right)); - emitcode ("", "; Size res[%d] = l[%d]&r[%d]", + emitcode (";", "Size res[%d] = l[%d]&r[%d]", AOP_SIZE (result), AOP_SIZE (left), AOP_SIZE (right)); #endif @@ -8479,7 +8480,7 @@ genSwap (iCode * ic) { operand *left, *result; - D(emitcode ("; genSwap","")); + D(emitcode (";", "genSwap")); left = IC_LEFT (ic); result = IC_RESULT (ic); @@ -10363,7 +10364,7 @@ genUnpackBits (operand * result, char *rname, int ptype) int blen; /* bitfield length */ int bstr; /* bitfield starting bit within byte */ - D(emitcode ("; genUnpackBits","")); + D(emitcode (";", "genUnpackBits")); etype = getSpec (operandType (result)); rsize = getSize (operandType (result)); @@ -11120,7 +11121,7 @@ genPackBits (sym_link * etype, int litval; /* source literal value (if AOP_LIT) */ unsigned char mask; /* bitmask within current byte */ - D(emitcode ("; genPackBits","")); + D(emitcode (";", "genPackBits")); blen = SPEC_BLEN (etype); bstr = SPEC_BSTR (etype); @@ -14034,7 +14035,7 @@ genCritical (iCode *ic) static void genEndCritical (iCode *ic) { - D(emitcode("; genEndCritical","")); + D(emitcode(";", "genEndCritical")); if (IC_RIGHT (ic)) { @@ -14222,14 +14223,14 @@ gen390Code (iCode * lic) debugFile->writeCLine (ic); } if (!options.noCcodeInAsm) { - emitcode ("", ";\t%s:%d: %s", ic->filename, ic->lineno, + emitcode (";", "%s:%d: %s", ic->filename, ic->lineno, printCLine(ic->filename, ic->lineno)); } cln = ic->lineno; } if (options.iCodeInAsm) { char *iLine = printILine(ic); - emitcode("", ";ic:%d: %s", ic->key, iLine); + emitcode(";", "ic:%d: %s", ic->key, iLine); dbuf_free(iLine); } /* if the result is marked as diff --git a/src/mcs51/gen.c b/src/mcs51/gen.c index 03b366ff..be482612 100644 --- a/src/mcs51/gen.c +++ b/src/mcs51/gen.c @@ -181,19 +181,20 @@ emitcode (const char *inst, const char *fmt,...) lbp++; } - if (lbp && *lbp) + if (lbp) { rtrackUpdate (lbp); lineCurr = (lineCurr ? connectLine (lineCurr, newLineNode (lb)) : (lineHead = newLineNode (lb))); + + lineCurr->isInline = _G.inLine; + lineCurr->isDebug = _G.debugLine; + lineCurr->ic = _G.current_iCode; + lineCurr->isComment = (*lbp==';'); } - lineCurr->isInline = _G.inLine; - lineCurr->isDebug = _G.debugLine; - lineCurr->ic = _G.current_iCode; - lineCurr->isComment = (*lbp==';'); va_end (ap); dbuf_destroy(&dbuf); @@ -2669,9 +2670,9 @@ saveRBank (int bank, iCode * ic, bool pushPsw) } if (ic) - { - ic->bankSaved = 1; - } + { + ic->bankSaved = 1; + } } /*-----------------------------------------------------------------*/ @@ -3405,7 +3406,7 @@ genFunction (iCode * ic) } } } - else + else { /* This ISR uses a non-zero bank. * @@ -3590,7 +3591,7 @@ genFunction (iCode * ic) int ofs; _G.current_iCode = ric; - D(emitcode ("; genReceive","")); + D(emitcode (";", "genReceive")); for (ofs=0; ofs < sym->recvSize; ofs++) { if (!strcmp (fReturn[ofs], "a")) @@ -3615,7 +3616,7 @@ genFunction (iCode * ic) int ofs; _G.current_iCode = ric; - D(emitcode ("; genReceive","")); + D(emitcode (";", "genReceive")); for (ofs=0; ofs < sym->recvSize; ofs++) { emitcode ("mov", "%s,%s", rsym->regs[ofs]->name, fReturn[ofs]); @@ -4514,7 +4515,7 @@ genPlus (iCode * ic) && (SPEC_ADDR (OP_SYM_ETYPE (op)) & 0xff) == 0 ) { - D(emitcode ("; genPlus aligned array","")); + D(emitcode (";", "genPlus aligned array")); aopPut (IC_RESULT (ic), aopGet (rightOp, 0, FALSE, FALSE), 0); @@ -4543,7 +4544,7 @@ genPlus (iCode * ic) skip_bytes++; } if (skip_bytes) - D(emitcode ("; genPlus shortcut","")); + D(emitcode (";", "genPlus shortcut")); } while (size--) @@ -5214,7 +5215,7 @@ genDivbits (operand * left, char *l; bool pushedB; - D(emitcode ("; genDivbits","")); + D(emitcode (";", "genDivbits")); pushedB = pushB (); @@ -5247,7 +5248,7 @@ genDivOneByte (operand * left, symbol *lbl; int size, offset; - D(emitcode ("; genDivOneByte","")); + D(emitcode (";", "genDivOneByte")); /* Why is it necessary that genDivOneByte() can return an int result? Have a look at: @@ -6539,10 +6540,10 @@ genAnd (iCode * ic, iCode * ifx) aopOp ((result = IC_RESULT (ic)), ic, TRUE); #ifdef DEBUG_TYPE - emitcode ("", "; Type res[%d] = l[%d]&r[%d]", + emitcode (";", "Type res[%d] = l[%d]&r[%d]", AOP_TYPE (result), AOP_TYPE (left), AOP_TYPE (right)); - emitcode ("", "; Size res[%d] = l[%d]&r[%d]", + emitcode (";", "Size res[%d] = l[%d]&r[%d]", AOP_SIZE (result), AOP_SIZE (left), AOP_SIZE (right)); #endif @@ -6963,10 +6964,10 @@ genOr (iCode * ic, iCode * ifx) aopOp ((result = IC_RESULT (ic)), ic, TRUE); #ifdef DEBUG_TYPE - emitcode ("", "; Type res[%d] = l[%d]&r[%d]", + emitcode (";", "Type res[%d] = l[%d]&r[%d]", AOP_TYPE (result), AOP_TYPE (left), AOP_TYPE (right)); - emitcode ("", "; Size res[%d] = l[%d]&r[%d]", + emitcode (";", "Size res[%d] = l[%d]&r[%d]", AOP_SIZE (result), AOP_SIZE (left), AOP_SIZE (right)); #endif @@ -7340,10 +7341,10 @@ genXor (iCode * ic, iCode * ifx) aopOp ((result = IC_RESULT (ic)), ic, TRUE); #ifdef DEBUG_TYPE - emitcode ("", "; Type res[%d] = l[%d]&r[%d]", + emitcode (";", "Type res[%d] = l[%d]&r[%d]", AOP_TYPE (result), AOP_TYPE (left), AOP_TYPE (right)); - emitcode ("", "; Size res[%d] = l[%d]&r[%d]", + emitcode (";", "Size res[%d] = l[%d]&r[%d]", AOP_SIZE (result), AOP_SIZE (left), AOP_SIZE (right)); #endif @@ -7996,7 +7997,7 @@ genSwap (iCode * ic) { operand *left, *result; - D(emitcode ("; genSwap","")); + D(emitcode (";", "genSwap")); left = IC_LEFT (ic); result = IC_RESULT (ic); @@ -9697,7 +9698,7 @@ genUnpackBits (operand * result, char *rname, int ptype, iCode *ifx) int bstr; /* bitfield starting bit within byte */ char buffer[10]; - D(emitcode ("; genUnpackBits","")); + D(emitcode (";", "genUnpackBits")); etype = getSpec (operandType (result)); rsize = getSize (operandType (result)); @@ -10087,7 +10088,7 @@ loadDptrFromOperand (operand *op, bool loadBToo) else { wassertl(FALSE, "need pointerCode"); - emitcode ("", "; mov b,???"); + emitcode (";", "mov b,???"); /* genPointerGet and genPointerSet originally did different ** things for this case. Both seem wrong. ** from genPointerGet: @@ -10370,7 +10371,7 @@ genPackBits (sym_link * etype, int litval; /* source literal value (if AOP_LIT) */ unsigned char mask; /* bitmask within current byte */ - D(emitcode ("; genPackBits","")); + D(emitcode (";", "genPackBits")); blen = SPEC_BLEN (etype); bstr = SPEC_BSTR (etype); @@ -10754,7 +10755,7 @@ genFarPointerSet (operand * right, sym_link *retype = getSpec (operandType (right)); sym_link *letype = getSpec (operandType (result)); - D(emitcode ("; genFarPointerSet","")); + D(emitcode (";", "genFarPointerSet")); aopOp (result, ic, FALSE); loadDptrFromOperand (result, FALSE); @@ -11703,7 +11704,7 @@ genCritical (iCode *ic) static void genEndCritical (iCode *ic) { - D(emitcode("; genEndCritical","")); + D(emitcode(";", "genEndCritical")); if (IC_RIGHT (ic)) { @@ -11768,7 +11769,7 @@ gen51Code (iCode * lic) debugFile->writeCLine (ic); } if (!options.noCcodeInAsm) { - emitcode ("", ";\t%s:%d: %s", ic->filename, ic->lineno, + emitcode (";", "%s:%d: %s", ic->filename, ic->lineno, printCLine(ic->filename, ic->lineno)); } cln = ic->lineno; @@ -11776,7 +11777,7 @@ gen51Code (iCode * lic) #if 0 if (ic->seqPoint && ic->seqPoint != cseq) { - emitcode ("", "; sequence point %d", ic->seqPoint); + emitcode (";", "sequence point %d", ic->seqPoint); cseq = ic->seqPoint; } #endif @@ -11801,7 +11802,7 @@ gen51Code (iCode * lic) #endif } iLine = printILine(ic); - emitcode("", "; [%s] ic:%d: %s", regsInUse, ic->seq, iLine); + emitcode(";", "[%s] ic:%d: %s", regsInUse, ic->seq, iLine); dbuf_free(iLine); } /* if the result is marked as diff --git a/support/regression/tests/bug1714204.c b/support/regression/tests/bug1714204.c index 8f8fed71..dab02dcc 100644 --- a/support/regression/tests/bug1714204.c +++ b/support/regression/tests/bug1714204.c @@ -10,7 +10,7 @@ typedef struct { unsigned char i1, i2, i3; -void test(TEST_TYPE *p1, TEST_TYPE *p2, TEST_TYPE *p3) +void foo(TEST_TYPE *p1, TEST_TYPE *p2, TEST_TYPE *p3) { if (p2->w[i2] > ++p3->w[i3]) p1->w[i1] = p2->w[i2] + p3->w[i3]; @@ -25,7 +25,7 @@ testBug(void) i1 = i2 = i3 = 0; - test(&t1, &t2, &t3); + foo(&t1, &t2, &t3); ASSERT (t1.w[0] == 1); }