From: epetrich Date: Tue, 8 Jun 2004 04:04:41 +0000 (+0000) Subject: * src/SDCCicode.c (geniCodeJumpTable): fixed bug #967601 X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=988f106351e5b5e86245c72a795fe7fbfcadd028;p=fw%2Fsdcc * src/SDCCicode.c (geniCodeJumpTable): fixed bug #967601 * src/SDCCpeeph.c (labelIsReturnOnly): fixed bug #966505 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3355 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/ChangeLog b/ChangeLog index 8cbd19d6..36d2c9d3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-06-08 Erik Petrich + + * src/SDCCicode.c (geniCodeJumpTable): fixed bug #967601 + * src/SDCCpeeph.c (labelIsReturnOnly): fixed bug #966505 + 2004-06-07 Vangelis Rokas Cumulative patch for pic16 port: diff --git a/src/SDCCicode.c b/src/SDCCicode.c index 9b841e52..cc530311 100644 --- a/src/SDCCicode.c +++ b/src/SDCCicode.c @@ -3522,6 +3522,23 @@ geniCodeJumpTable (operand * cond, value * caseVals, ast * tree) falseLabel = newiTempLabel (buffer); + /* If cond is volatile, it might change after the boundary */ + /* conditions are tested to an out of bounds value, causing */ + /* a jump to a location outside of the jump table. To avoid */ + /* this possibility, use a non-volatile copy of it instead. */ + if (IS_OP_VOLATILE (cond)) + { + operand * newcond; + iCode * ic; + + newcond = newiTempOperand (operandType (cond), TRUE); + newcond->isvolatile = 0; + ic = newiCode ('=', NULL, cond); + IC_RESULT (ic) = newcond; + ADDTOCHAIN (ic); + cond = newcond; + } + /* so we can create a jumptable */ /* first we rule out the boundary conditions */ /* if only optimization says so */ diff --git a/src/SDCCpeeph.c b/src/SDCCpeeph.c index a034e34c..670f7079 100644 --- a/src/SDCCpeeph.c +++ b/src/SDCCpeeph.c @@ -193,7 +193,7 @@ FBYNAME (labelIsReturnOnly) len = strlen(label); for(pl = currPl; pl; pl = pl->next) { - if (pl->line && !pl->isDebug && + if (pl->line && !pl->isDebug && !pl->isComment && pl->line[strlen(pl->line)-1] == ':') { if (strncmp(pl->line, label, len) == 0) break; /* Found Label */ if (strlen(pl->line) != 7 || !isdigit(*(pl->line)) || @@ -206,6 +206,8 @@ FBYNAME (labelIsReturnOnly) } if (!pl) return FALSE; /* did not find the label */ pl = pl->next; + while (pl && (pl->isDebug || pl->isComment)) + pl = pl->next; if (!pl || !pl->line || pl->isDebug) return FALSE; /* next line not valid */ p = pl->line; for (p = pl->line; *p && isspace(*p); p++)