X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCClabel.c;h=718e75f90fd3f7cb30ab7d57bf7ffb90c3276be4;hb=e4f047502f42d0f9e9fd9b61323f464c9426ea27;hp=04ce55681ec77c2e601c4fd080186f97a2534650;hpb=352fa0f35ea5438842550a8b438c303a2cd8f5b1;p=fw%2Fsdcc diff --git a/src/SDCClabel.c b/src/SDCClabel.c index 04ce5568..718e75f9 100644 --- a/src/SDCClabel.c +++ b/src/SDCClabel.c @@ -95,6 +95,36 @@ labelGotoNext (iCode * ic) return change; } +/*-------------------------------------------------------------------*/ +/* deleteIfx - delete an IFX iCode or convert to DUMMY_READ_VOLATILE */ +/*-------------------------------------------------------------------*/ +static void +deleteIfx (iCode * loop, int key) +{ + if (!options.lessPedantic) + { + werrorfl (loop->filename, loop->lineno, W_CONTROL_FLOW); + } + hTabDeleteItem (&labelRef, key, loop, DELETE_ITEM, NULL); + + /* If the condition was volatile, convert IFX to */ + /* DUMMY_READ_VOLATILE. Otherwise just delete the */ + /* IFX iCode */ + if (IS_OP_VOLATILE (IC_COND (loop))) + { + IC_RIGHT (loop) = IC_COND (loop); + IC_LEFT (loop) = NULL; + IC_RESULT (loop) = NULL; + loop->op = DUMMY_READ_VOLATILE; + } + else + { + loop->prev->next = loop->next; + loop->next->prev = loop->prev; + } +} + + /*-----------------------------------------------------------------*/ /* labelIfx - special case Ifx elimination */ /*-----------------------------------------------------------------*/ @@ -119,33 +149,16 @@ labelIfx (iCode * ic) if (IC_TRUE (loop) && IC_TRUE (loop)->key == IC_LABEL (loop->next)->key) { - - /* get rid of this if */ - if (!options.lessPedantic) { - werror (W_CONTROL_FLOW, loop->filename, loop->lineno); - } - loop->prev->next = loop->next; - loop->next->prev = loop->prev; - hTabDeleteItem (&labelRef, - (IC_TRUE (loop))->key, - loop, DELETE_ITEM, NULL); + deleteIfx (loop, IC_TRUE (loop)->key); change++; - continue; + continue; } else { if (IC_FALSE (loop) && IC_FALSE (loop)->key == IC_LABEL (loop->next)->key) { - /* get rid of this if */ - if (!options.lessPedantic) { - werror (W_CONTROL_FLOW, loop->filename, loop->lineno); - } - loop->prev->next = loop->next; - loop->next->prev = loop->prev; - hTabDeleteItem (&labelRef, - (IC_FALSE (loop))->key, - loop, DELETE_ITEM, NULL); + deleteIfx (loop, IC_FALSE (loop)->key); change++; continue; } @@ -160,14 +173,7 @@ labelIfx (iCode * ic) ((IC_TRUE (loop) && IC_TRUE (loop)->key == IC_LABEL (loop->next)->key) || (IC_FALSE (loop) && IC_FALSE (loop)->key == IC_LABEL (loop->next)->key))) { - if (!options.lessPedantic) { - werror (W_CONTROL_FLOW, loop->filename, loop->lineno); - } - loop->prev->next = loop->next; - loop->next->prev = loop->prev; - hTabDeleteItem (&labelRef, - IC_LABEL (loop->next)->key, - loop, DELETE_ITEM, NULL); + deleteIfx (loop, IC_LABEL (loop->next)->key); change++; continue; } @@ -378,6 +384,7 @@ labelUnreach (iCode * ic) /* statement is not a label */ if (loop->op == GOTO || loop->op == RETURN) { + int warn = 0; if (loop->next && (loop->next->op == LABEL || @@ -399,15 +406,22 @@ labelUnreach (iCode * ic) hTabDeleteItem (&labelRef, IC_LABEL (tic)->key, tic, DELETE_ITEM, NULL); break; case IFX: + warn = 1; if (IC_TRUE (tic)) hTabDeleteItem (&labelRef, IC_TRUE (tic)->key, tic, DELETE_ITEM, NULL); else hTabDeleteItem (&labelRef, IC_FALSE (tic)->key, tic, DELETE_ITEM, NULL); break; + default: + warn = 1; } } + if (warn) + werrorfl (loop->next->filename, loop->next->lineno, + W_CODE_UNREACH); + /* now set up the pointers */ loop->next = loop2; if (loop2)