Fixed PCALL and stack adjustment bug
authorkmh <kmh@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Thu, 1 Mar 2001 21:01:49 +0000 (21:01 +0000)
committerkmh <kmh@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Thu, 1 Mar 2001 21:01:49 +0000 (21:01 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@661 4a8a32a2-be11-0410-ad9d-d568d2c75423

src/SDCCast.c
src/SDCCicode.c
src/SDCCicode.h
src/SDCCsymt.c
src/SDCCsymt.h
src/avr/gen.c
src/ds390/gen.c
src/mcs51/gen.c
src/pic/gen.c
src/z80/gen.c
src/z80/ralloc.c

index 948d57de2a296a7587caa6b05abde022e0e0400c..c76148afb9c645fc89af68abaace70ec8418c85f 100644 (file)
@@ -536,7 +536,6 @@ funcOfType (char *name, sym_link * type, sym_link * argType,
            int nArgs, int rent)
 {
   symbol *sym;
-  int argStack = 0;
   /* create the symbol */
   sym = newSymbol (name, 0);
 
@@ -549,7 +548,6 @@ funcOfType (char *name, sym_link * type, sym_link * argType,
 
       while (nArgs--)
        {
-         argStack += getSize (type);
          args->type = copyLinkChain (argType);
          args->etype = getSpec (args->type);
          if (!nArgs)
@@ -568,7 +566,6 @@ funcOfType (char *name, sym_link * type, sym_link * argType,
   /* save it */
   addSymChain (sym);
   sym->cdef = 1;
-  sym->argStack = (rent ? argStack : 0);
   allocVariables (sym);
   return sym;
 
index 56eae7f0d06c49b47f69d59e216fc3f188190aa5..85b42b166456958f18b2697667080b0afde7380d 100644 (file)
@@ -579,6 +579,7 @@ copyiCode (iCode * ic)
   nic->filename = ic->filename;
   nic->block = ic->block;
   nic->level = ic->level;
+  nic->parmBytes = ic->parmBytes;
 
   /* deal with the special cases first */
   switch (ic->op)
@@ -1071,7 +1072,6 @@ newiTempFromOp (operand * op)
   nop->noSpilLoc = op->noSpilLoc;
   nop->usesDefs = op->usesDefs;
   nop->isParm = op->isParm;
-  nop->parmBytes = op->parmBytes;
   return nop;
 }
 
@@ -1095,7 +1095,6 @@ operandFromOperand (operand * op)
   nop->noSpilLoc = op->noSpilLoc;
   nop->usesDefs = op->usesDefs;
   nop->isParm = op->isParm;
-  nop->parmBytes = op->parmBytes;
 
   switch (nop->type)
     {
@@ -1157,7 +1156,6 @@ operandFromSymbol (symbol * sym)
       op->key = sym->key;
       op->isvolatile = isOperandVolatile (op, TRUE);
       op->isGlobal = isOperandGlobal (op);
-      op->parmBytes = sym->argStack;
       return op;
     }
 
@@ -2749,7 +2747,7 @@ geniCodeCall (operand * left, ast * parms)
   geniCodeParms (parms, &stack, getSpec (operandType (left)), OP_SYMBOL (left));
 
   /* now call : if symbol then pcall */
-  if (IS_ITEMP (left))
+  if (IS_OP_POINTER (left))
     ic = newiCode (PCALL, left, NULL);
   else
     ic = newiCode (CALL, left, NULL);
@@ -2763,7 +2761,7 @@ geniCodeCall (operand * left, ast * parms)
   ADDTOCHAIN (ic);
 
   /* stack adjustment after call */
-  left->parmBytes = stack;
+  ic->parmBytes = stack;
 
   return result;
 }
index ca4142468909f2360c6d76b290d1a2eb437c619a..a6f656a67606500c01a8aed4b5bf8d6fd5805852 100644 (file)
@@ -87,7 +87,6 @@ typedef struct operand
     unsigned int noSpilLoc:1;  /* cannot be assigned a spil location */
 
     unsigned key;
-    int parmBytes;
     union
       {
        struct symbol *symOperand;      /* operand is of type symbol */
@@ -176,6 +175,9 @@ typedef struct iCode
 
     int lineno;                        /* file & lineno for debug information */
     char *filename;
+    
+    int parmBytes;             /* if call/pcall, count of parameter bytes 
+                                  on stack */
   }
 iCode;
 
index 774e132ae4b28e0901145928bf7e9ae87e0944c5..0f532e0fefc6c78bd2edef1fb7b5d29a2bbc80c9 100644 (file)
@@ -2086,7 +2086,6 @@ _makeRegParam (symbol * sym)
   while (val)
     {
       SPEC_REGPARM (val->etype) = 1;
-      sym->argStack -= getSize (val->type);
       val = val->next;
     }
 }
index 69184e9d257f2e3d37de48bab2860febb51b14b5..764aa4ef6e39c44be52205c06f6d2460c0073913 100644 (file)
@@ -265,8 +265,6 @@ typedef struct symbol
     int liveTo;                        /* live to sequence number */
     int used;                  /* no. of times this was used */
     int recvSize;              /* size of first argument  */
-    int argStack;              /* stacks used by parameters */
-
   }
 symbol;
 
index b0123d65d905da668fa84f9c58e7564812df3ba3..8954f2131ae9133cf3c7b062aa1160adf35a3fc0 100644 (file)
@@ -1447,15 +1447,15 @@ genCall (iCode * ic)
        }
 
        /* adjust the stack for parameters if required */
-       if (IC_LEFT (ic)->parmBytes) {
-               if (IC_LEFT (ic)->parmBytes > 63) {
-                       emitcode ("sbiw", "r28,%d", IC_LEFT (ic)->parmBytes);
+       if (ic->parmBytes) {
+               if (ic->parmBytes > 63) {
+                       emitcode ("sbiw", "r28,%d", ic->parmBytes);
                }
                else {
                        emitcode ("subi", "r28,lo8(%d)",
-                                 IC_LEFT (ic)->parmBytes);
+                                 ic->parmBytes);
                        emitcode ("sbci", "r29,hi8(%d)",
-                                 IC_LEFT (ic)->parmBytes);
+                                 ic->parmBytes);
                }
        }
 
@@ -1515,30 +1515,30 @@ genPcall (iCode * ic)
 
        /* adjust the stack for parameters if
           required */
-       if (IC_LEFT (ic)->parmBytes) {
+       if (ic->parmBytes) {
                int i;
-               if (IC_LEFT (ic)->parmBytes > 3) {
+               if (ic->parmBytes > 3) {
                        emitcode ("mov", "a,%s", spname);
                        emitcode ("add", "a,#0x%02x",
-                                 (-IC_LEFT (ic)->parmBytes) & 0xff);
+                                 (-ic->parmBytes) & 0xff);
                        emitcode ("mov", "%s,a", spname);
                }
                else
-                       for (i = 0; i < IC_LEFT (ic)->parmBytes; i++)
+                       for (i = 0; i < ic->parmBytes; i++)
                                emitcode ("dec", "%s", spname);
 
        }
 
        /* adjust the stack for parameters if required */
-       if (IC_LEFT (ic)->parmBytes) {
-               if (IC_LEFT (ic)->parmBytes > 63) {
-                       emitcode ("sbiw", "r28,%d", IC_LEFT (ic)->parmBytes);
+       if (ic->parmBytes) {
+               if (ic->parmBytes > 63) {
+                       emitcode ("sbiw", "r28,%d", ic->parmBytes);
                }
                else {
                        emitcode ("subi", "r28,lo8(%d)",
-                                 IC_LEFT (ic)->parmBytes);
+                                 ic->parmBytes);
                        emitcode ("sbci", "r29,hi8(%d)",
-                                 IC_LEFT (ic)->parmBytes);
+                                 ic->parmBytes);
                }
        }
        if (ic->regsSaved)
index 54117117655d202d78cd858ee309b1c6b1e948bf..79c276c958c71b2236473f5db0627f33e844a91a 100644 (file)
@@ -2243,17 +2243,17 @@ genCall (iCode * ic)
 
   /* adjust the stack for parameters if
      required */
-  if (IC_LEFT (ic)->parmBytes)
+  if (ic->parmBytes)
     {
       int i;
-      if (IC_LEFT (ic)->parmBytes > 3)
+      if (ic->parmBytes > 3)
        {
          emitcode ("mov", "a,%s", spname);
-         emitcode ("add", "a,#0x%02x", (-IC_LEFT (ic)->parmBytes) & 0xff);
+         emitcode ("add", "a,#0x%02x", (-ic->parmBytes) & 0xff);
          emitcode ("mov", "%s,a", spname);
        }
       else
-       for (i = 0; i < IC_LEFT (ic)->parmBytes; i++)
+       for (i = 0; i < ic->parmBytes; i++)
          emitcode ("dec", "%s", spname);
 
     }
@@ -2368,17 +2368,17 @@ genPcall (iCode * ic)
 
   /* adjust the stack for parameters if
      required */
-  if (IC_LEFT (ic)->parmBytes)
+  if (ic->parmBytes)
     {
       int i;
-      if (IC_LEFT (ic)->parmBytes > 3)
+      if (ic->parmBytes > 3)
        {
          emitcode ("mov", "a,%s", spname);
-         emitcode ("add", "a,#0x%02x", (-IC_LEFT (ic)->parmBytes) & 0xff);
+         emitcode ("add", "a,#0x%02x", (-ic->parmBytes) & 0xff);
          emitcode ("mov", "%s,a", spname);
        }
       else
-       for (i = 0; i < IC_LEFT (ic)->parmBytes; i++)
+       for (i = 0; i < ic->parmBytes; i++)
          emitcode ("dec", "%s", spname);
 
     }
index ac7e903300355ca6bb1f8a98ce07d90d47057c3e..4a1025f69b3ffa59a9731a068bd065aaffddb8c8 100644 (file)
@@ -1975,17 +1975,17 @@ genCall (iCode * ic)
 
   /* adjust the stack for parameters if
      required */
-  if (IC_LEFT (ic)->parmBytes)
+  if (ic->parmBytes)
     {
       int i;
-      if (IC_LEFT (ic)->parmBytes > 3)
+      if (ic->parmBytes > 3)
        {
          emitcode ("mov", "a,%s", spname);
-         emitcode ("add", "a,#0x%02x", (-IC_LEFT (ic)->parmBytes) & 0xff);
+         emitcode ("add", "a,#0x%02x", (-ic->parmBytes) & 0xff);
          emitcode ("mov", "%s,a", spname);
        }
       else
-       for (i = 0; i < IC_LEFT (ic)->parmBytes; i++)
+       for (i = 0; i < ic->parmBytes; i++)
          emitcode ("dec", "%s", spname);
 
     }
@@ -2092,17 +2092,17 @@ genPcall (iCode * ic)
 
   /* adjust the stack for parameters if
      required */
-  if (IC_LEFT (ic)->parmBytes)
+  if (ic->parmBytes)
     {
       int i;
-      if (IC_LEFT (ic)->parmBytes > 3)
+      if (ic->parmBytes > 3)
        {
          emitcode ("mov", "a,%s", spname);
-         emitcode ("add", "a,#0x%02x", (-IC_LEFT (ic)->parmBytes) & 0xff);
+         emitcode ("add", "a,#0x%02x", (-ic->parmBytes) & 0xff);
          emitcode ("mov", "%s,a", spname);
        }
       else
-       for (i = 0; i < IC_LEFT (ic)->parmBytes; i++)
+       for (i = 0; i < ic->parmBytes; i++)
          emitcode ("dec", "%s", spname);
 
     }
index 9bd8650d5eed415e32521c0de7317e4fd28726da..3955885cb4cdda1d3a96c2962264022b898c3073 100644 (file)
@@ -2189,14 +2189,14 @@ static void genCall (iCode *ic)
 
     /* adjust the stack for parameters if 
     required */
-    if (IC_LEFT(ic)->parmBytes) {
+    if (ic->parmBytes) {
         int i;
-        if (IC_LEFT(ic)->parmBytes > 3) {
+        if (ic->parmBytes > 3) {
             emitcode("mov","a,%s",spname);
-            emitcode("add","a,#0x%02x", (- IC_LEFT(ic)->parmBytes) & 0xff);
+            emitcode("add","a,#0x%02x", (- ic->parmBytes) & 0xff);
             emitcode("mov","%s,a",spname);
         } else 
-            for ( i = 0 ; i <  IC_LEFT(ic)->parmBytes ;i++)
+            for ( i = 0 ; i <  ic->parmBytes ;i++)
                 emitcode("dec","%s",spname);
 
     }
@@ -2299,14 +2299,14 @@ static void genPcall (iCode *ic)
 
     /* adjust the stack for parameters if 
     required */
-    if (IC_LEFT(ic)->parmBytes) {
+    if (ic->parmBytes) {
         int i;
-        if (IC_LEFT(ic)->parmBytes > 3) {
+        if (ic->parmBytes > 3) {
             emitcode("mov","a,%s",spname);
-            emitcode("add","a,#0x%02x", (- IC_LEFT(ic)->parmBytes) & 0xff);
+            emitcode("add","a,#0x%02x", (- ic->parmBytes) & 0xff);
             emitcode("mov","%s,a",spname);
         } else 
-            for ( i = 0 ; i <  IC_LEFT(ic)->parmBytes ;i++)
+            for ( i = 0 ; i <  ic->parmBytes ;i++)
                 emitcode("dec","%s",spname);
 
     }
index f52e8e4e183c748eee00f8e7f047a7b8fd08b340..81935dfca642ce23503423f860c3514f06f8239a 100644 (file)
@@ -2082,9 +2082,9 @@ emitCall (iCode * ic, bool ispcall)
     }
 
   /* adjust the stack for parameters if required */
-  if (IC_LEFT (ic)->parmBytes)
+  if (ic->parmBytes)
     {
-      int i = IC_LEFT (ic)->parmBytes;
+      int i = ic->parmBytes;
       _G.stack.pushed -= i;
       if (IS_GB)
        {
index 02a71f3f597591b1609c2db261d42ac37ebe233e..6dfca4cdf759663e5a65378a88e3b1c307c3a41c 100644 (file)
@@ -1980,7 +1980,7 @@ packRegsForHLUse (iCode * ic)
 
   if (ic->op == ADDRESS_OF && uic->op == IPUSH)
     goto hluse;
-  if (ic->op == CALL && IC_LEFT (ic)->parmBytes == 0 && (uic->op == '-' || uic->op == '+'))
+  if (ic->op == CALL && ic->parmBytes == 0 && (uic->op == '-' || uic->op == '+'))
     goto hluse;
   return;
 hluse: