]> git.sur5r.net Git - cc65/commitdiff
Fixed a bug that caused problems locating the last parameter of a function
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 10 Aug 2003 17:05:18 +0000 (17:05 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 10 Aug 2003 17:05:18 +0000 (17:05 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2259 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/codeinfo.c
src/cc65/declare.c
src/cc65/expr.c
src/cc65/funcdesc.c
src/cc65/funcdesc.h
src/cc65/function.c

index cf04baf9c3a39808af1ce192f12441896b37e20c..ed4fae03b3b5cd6344dd545f9cc97854e99fdb75 100644 (file)
@@ -287,8 +287,7 @@ void GetFuncInfo (const char* Name, unsigned short* Use, unsigned short* Chg)
            FuncDesc* D = E->V.F.Func;
            if ((D->Flags & FD_FASTCALL) != 0 && D->ParamCount > 0) {
                /* Will use registers depending on the last param */
-               SymEntry* LastParam = D->SymTab->SymTail;
-                unsigned LastParamSize = CheckedSizeOf (LastParam->Type);
+                unsigned LastParamSize = CheckedSizeOf (D->LastParam->Type);
                if (LastParamSize == 1) {
                    *Use = REG_A;
                } else if (LastParamSize == 2) {
index 73f7e27ead1c43fbc2483d3619381e0bb7a8a077..93760bc820401ffde66e67fa25ece85d40aabebb 100644 (file)
@@ -806,11 +806,18 @@ static FuncDesc* ParseFuncDecl (const DeclSpec* Spec)
        ParseOldStyleParamList (F);
     }
 
+    /* Remember the last function parameter. We need it later for several
+     * purposes, for example when passing stuff to fastcall functions. Since
+     * more symbols are added to the table, it is easier if we remember it
+     * now, since it is currently the last entry in the symbol table.
+     */
+    F->LastParam = GetSymTab()->SymTail;
+
     /* Assign offsets. If the function has a variable parameter list,
      * there's one additional byte (the arg size).
      */
     Offs = (F->Flags & FD_VARIADIC)? 1 : 0;
-    Sym = GetSymTab()->SymTail;
+    Sym = F->LastParam;
     while (Sym) {
        unsigned Size = CheckedSizeOf (Sym->Type);
         if (SymIsRegVar (Sym)) {
index b10c568b44bf4f3cb8a70d834856db5b6596d35a..b71d2d6709d06d16b9926210dc42141496ef933e 100644 (file)
@@ -583,8 +583,7 @@ static unsigned FunctionParamList (FuncDesc* Func)
        FrameSize   = Func->ParamSize;
        if (FrameParams > 0 && (Func->Flags & FD_FASTCALL) != 0) {
            /* Last parameter is not pushed */
-           const SymEntry* LastParam = Func->SymTab->SymTail;
-           FrameSize -= CheckedSizeOf (LastParam->Type);
+           FrameSize -= CheckedSizeOf (Func->LastParam->Type);
            --FrameParams;
        }
 
index cccff02c2fe8ac4a3db9f4925cd896e89625ff0f..cfba7fec8d23bb1c655bbee789a32462a5a5dcf3 100644 (file)
@@ -35,7 +35,7 @@
 
 /* common */
 #include "xmalloc.h"
-         
+
 /* cc65 */
 #include "funcdesc.h"
 
@@ -59,6 +59,7 @@ FuncDesc* NewFuncDesc (void)
     F->TagTab    = 0;
     F->ParamCount = 0;
     F->ParamSize  = 0;
+    F->LastParam  = 0;
 
     /* Return the new struct */
     return F;
index afdda89d926a07d7d220e01b045ece16ad50e70f..973e1c2c83336d1d0945903a56f4dc9af23a13e0 100644 (file)
@@ -67,6 +67,7 @@ struct FuncDesc {
     struct SymTable*           TagTab;         /* Symbol table for structs/enums    */
     unsigned           ParamCount;     /* Number of parameters              */
     unsigned           ParamSize;      /* Size of the parameters            */
+    struct SymEntry*   LastParam;      /* Pointer to last parameter         */
 };
 
 
index c4f30ca499bdac676ad0443ec17c5d802c7c108a..fb274d8f99de19133d125e3ade6890ffe875baff 100644 (file)
@@ -334,7 +334,6 @@ void NewFunc (SymEntry* Func)
 /* Parse argument declarations and function body. */
 {
     int HadReturn;
-    SymEntry* LastParam;
     SymEntry* Param;
 
     /* Get the function descriptor from the function entry */
@@ -346,9 +345,6 @@ void NewFunc (SymEntry* Func)
     /* Reenter the lexical level */
     ReenterFunctionLevel (D);
 
-    /* Before adding more symbols, remember the last parameter for later */
-    LastParam = D->SymTab->SymTail;
-
     /* Declare two special functions symbols: __fixargs__ and __argsize__.
      * The latter is different depending on the type of the function (variadic
      * or not).
@@ -394,11 +390,11 @@ void NewFunc (SymEntry* Func)
        CHECK ((D->Flags & FD_VARIADIC) == 0);
 
        /* Generate the push */
-       if (IsTypeFunc (LastParam->Type)) {
+       if (IsTypeFunc (D->LastParam->Type)) {
            /* Pointer to function */
            Flags = CF_PTR;
        } else {
-           Flags = TypeOf (LastParam->Type) | CF_FORCECHAR;
+           Flags = TypeOf (D->LastParam->Type) | CF_FORCECHAR;
        }
        g_push (Flags, 0);
     }