detect missing return values
[fw/sdcc] / src / SDCCopt.c
index 0ffaa5f24b9fca8d0371c9c944a8b5c1e1b0ff21..1d390a69cc9cbcb135c44eacbdf7a978442ff255 100644 (file)
@@ -109,6 +109,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
       if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
        {
          newic = newiCode (SEND, IC_LEFT (ic), NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
        }
       else
        {
@@ -122,7 +123,8 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
       /* second one */
       if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
        {
-         newic = newiCode (SEND, IC_LEFT (ic), NULL);
+         newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
        }
       else
        {
@@ -140,6 +142,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
       if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
        {
          newic = newiCode (SEND, right, NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
        }
       else
        {
@@ -155,6 +158,7 @@ cnvToFcall (iCode * ic, eBBlock * ebp)
       if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
        {
          newic = newiCode (SEND, left, NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
        }
       else
        {
@@ -180,7 +184,7 @@ static void
 cnvToFloatCast (iCode * ic, eBBlock * ebp)
 {
   iCode *ip, *newic;
-  symbol *func;
+  symbol *func = NULL;
   sym_link *type = operandType (IC_RIGHT (ic));
   int linenno = ic->lineno;
   int bwd, su;
@@ -207,8 +211,11 @@ found:
   if (!options.float_rent)
     {
       /* first one */
-      if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
-       newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+       if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) 
+           {
+               newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+               newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+           }
       else
        {
          newic = newiCode ('=', NULL, IC_RIGHT (ic));
@@ -221,8 +228,10 @@ found:
   else
     {
       /* push the left */
-      if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
-       newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+       if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+           newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+           newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+       }
       else
        {
          newic = newiCode (IPUSH, IC_RIGHT (ic), NULL);
@@ -248,7 +257,7 @@ static void
 cnvFromFloatCast (iCode * ic, eBBlock * ebp)
 {
   iCode *ip, *newic;
-  symbol *func;
+  symbol *func = NULL;
   sym_link *type = operandType (IC_LEFT (ic));
   int lineno = ic->lineno;
   int bwd, su;
@@ -276,8 +285,10 @@ found:
   if (!options.float_rent)
     {
       /* first one */
-      if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
-       newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+       if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+           newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+           newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+       }
       else
        {
          newic = newiCode ('=', NULL, IC_RIGHT (ic));
@@ -291,8 +302,10 @@ found:
     {
 
       /* push the left */
-      if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
-       newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+       if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+           newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+           newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+       }
       else
        {
          newic = newiCode (IPUSH, IC_RIGHT (ic), NULL);
@@ -360,8 +373,10 @@ found:
   if (!options.intlong_rent)
     {
       /* first one */
-      if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
-       newic = newiCode (SEND, IC_LEFT (ic), NULL);
+       if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+           newic = newiCode (SEND, IC_LEFT (ic), NULL);
+           newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+       }
       else
        {
          newic = newiCode ('=', NULL, IC_LEFT (ic));
@@ -371,8 +386,10 @@ found:
       newic->lineno = lineno;
 
       /* second one */
-      if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
-       newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+      if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype)) {
+         newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
+      }
       else
        {
          newic = newiCode ('=', NULL, IC_RIGHT (ic));
@@ -389,6 +406,7 @@ found:
       if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
         {
           newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
         }
       else
        {
@@ -404,6 +422,7 @@ found:
       if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
         {
           newic = newiCode (SEND, IC_LEFT (ic), NULL);
+         newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
         }
       else
        {
@@ -867,6 +886,21 @@ eBBlockFromiCode (iCode * ic)
 
     }
 
+  // this is a good place to check missing return values
+  if (currFunc) {
+    if (!IS_VOID(currFunc->type->next)) {
+      eBBlock *bp;
+      // make sure all predecessors of the last block end in a return
+      for (bp=setFirstItem(ebbs[saveCount-1]->predList); 
+          bp; 
+          bp=setNextItem(ebbs[saveCount-1]->predList)) {
+       if (bp->ech->op != RETURN) {
+         werror (E_VOID_FUNC, currFunc->name);
+       }
+      }
+    }
+  }
+
   /* sort it back by block number */
   qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare);
 
@@ -897,6 +931,8 @@ eBBlockFromiCode (iCode * ic)
   /* throw away blocks */
   setToNull ((void **) &graphEdges);
   ebbs = NULL;
+  
+  currFunc=NULL;
 
   return NULL;
 }