]> git.sur5r.net Git - cc65/commitdiff
Make __fixargs__ an actual symbol table entry. Add a new pseudo variable
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 23 Mar 2001 10:16:50 +0000 (10:16 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 23 Mar 2001 10:16:50 +0000 (10:16 +0000)
__argsize__.

git-svn-id: svn://svn.cc65.org/cc65/trunk@646 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/expr.c
src/cc65/function.c
src/cc65/scanner.c
src/cc65/symentry.c
src/cc65/symentry.h
src/cc65/symtab.c
src/cc65/symtab.h

index dc05dcfee5d9ebe610db8dd0cce0710565cd5613..5ff685b9701f075c7e3278f59b77cfb06f8d458d 100644 (file)
@@ -772,7 +772,8 @@ static int primary (struct expent* lval)
            }
 
            /* Check for legal symbol types */
-                   if ((Sym->Flags & SC_ENUM) == SC_ENUM) {
+                   if ((Sym->Flags & SC_CONST) == SC_CONST) {
+               /* Enum or some other numeric constant */
                lval->e_flags = E_MCONST;
                lval->e_const = Sym->V.EnumVal;
                return 0;
index 9ec1f52ab37a29906ee2189e03c59ea03f3c6bf2..c0b913ab46e73bf2e11df79c52b1af845ee42ed0 100644 (file)
@@ -219,6 +219,20 @@ void NewFunc (SymEntry* Func)
     /* Reenter the lexical level */
     ReenterFunctionLevel (D);
 
+    /* Declare two special functions symbols: __fixargs__ and __argsize__.
+     * The latter is different depending on the type of the function (variadic
+     * or not).
+     */
+    AddLocalSym ("__fixargs__", type_uint, SC_DEF | SC_CONST, D->ParamSize);
+    if (D->Flags & FD_ELLIPSIS) {
+       /* Variadic function. The variable must be const. */
+       static const type T [] = { T_UCHAR | T_QUAL_CONST, T_END };
+       AddLocalSym ("__argsize__", T, SC_DEF | SC_REF | SC_AUTO, 0);
+    } else {
+       /* Non variadic */
+       AddLocalSym ("__argsize__", type_uchar, SC_DEF | SC_CONST, D->ParamSize);
+    }
+
     /* Function body now defined */
     Func->Flags |= SC_DEF;
 
@@ -235,12 +249,16 @@ void NewFunc (SymEntry* Func)
     g_defgloblabel (Func->Name);
 
     /* If this is a fastcall function, push the last parameter onto the stack */
-    if (IsFastCallFunc (Func->Type) && D->ParamCount > 0 && (D->Flags & FD_ELLIPSIS) == 0) {
+    if (IsFastCallFunc (Func->Type) && D->ParamCount > 0) {
 
+       SymEntry* LastParam;
        unsigned Flags;
 
+       /* Fastcall functions may never have an ellipsis or the compiler is buggy */
+       CHECK ((D->Flags & FD_ELLIPSIS) == 0);
+
        /* Get a pointer to the last parameter entry */
-       SymEntry* LastParam = D->SymTab->SymTail;
+       LastParam = D->SymTab->SymTail;
 
        /* Generate the push */
        if (IsTypeFunc (LastParam->Type)) {
index e8939052c88df81b563b5f7ea4262a0028522fae..58df8f76d346e7ba1a3fd7d018f441c397c9600c 100644 (file)
@@ -507,11 +507,6 @@ void NextToken (void)
                nxtval  = GetCurrentLine();
                nxttype = type_int;
                return;
-           } else if (strcmp (token, "__fixargs__") == 0) {
-               nxttok  = TOK_ICONST;
-               nxtval  = GetParamSize (CurrentFunc);
-               nxttype = type_uint;
-               return;
            } else if (strcmp (token, "__func__") == 0) {
                /* __func__ is only defined in functions */
                if (CurrentFunc) {
index 35ed800b4d0c5c20bc0882ba6509793d76e1a287..59f34e4ab52432c06b544af198192a4520f91dd4 100644 (file)
 
 
 #include <string.h>
-                  
+
 /* common */
 #include "xmalloc.h"
-         
+
 /* cc65 */
 #include "symentry.h"
 
@@ -47,7 +47,7 @@
 /*                                  Code                                    */
 /*****************************************************************************/
 
-         
+
 
 SymEntry* NewSymEntry (const char* Name, unsigned Flags)
 /* Create a new symbol table with the given name */
@@ -99,6 +99,7 @@ void DumpSymEntry (FILE* F, const SymEntry* E)
        { "SC_STATIC",      SC_STATIC   },
        { "SC_EXTERN",      SC_EXTERN   },
        { "SC_ENUM",        SC_ENUM     },
+       { "SC_CONST",       SC_CONST    },
        { "SC_LABEL",       SC_LABEL    },
        { "SC_PARAM",       SC_PARAM    },
        { "SC_FUNC",        SC_FUNC     },
index 82f9458b98ed50d95fab2e11076f01884fe0504a..610a06ee37630c28a1cab25c293ef043a32c0b33 100644 (file)
 #define SC_STATIC      0x0004U
 #define SC_EXTERN      0x0008U
 
-#define SC_ENUM                0x0010U /* An enum (numeric constant) */
-#define SC_LABEL               0x0020U /* A goto label */
-#define SC_PARAM               0x0040U /* This is a function parameter */
-#define SC_FUNC                0x0080U /* Function entry */
-
-#define SC_STORAGE             0x0100U /* Symbol with associated storage */
-#define SC_DEFAULT             0x0200U /* Flag: default storage class was used */
-
-#define SC_DEF         0x0400U /* Symbol is defined */
-#define SC_REF                 0x0800U /* Symbol is referenced */
-
-#define SC_TYPE                0x1000U /* This is a type, struct, typedef, etc. */
-#define SC_STRUCT              0x1001U /* Struct or union */
-#define SC_SFLD                0x1002U /* Struct or union field */
-#define SC_TYPEDEF             0x1003U /* A typedef */
+#define SC_ENUM                0x0030U /* An enum (numeric constant) */    
+#define SC_CONST       0x0020U /* A numeric constant with a type */
+#define SC_LABEL               0x0040U /* A goto label */
+#define SC_PARAM               0x0080U /* This is a function parameter */
+#define SC_FUNC                0x0100U /* Function entry */
+
+#define SC_STORAGE             0x0400U /* Symbol with associated storage */
+#define SC_DEFAULT             0x0800U /* Flag: default storage class was used */
+
+#define SC_DEF         0x1000U /* Symbol is defined */
+#define SC_REF                 0x2000U /* Symbol is referenced */
+
+#define SC_TYPE                0x4000U /* This is a type, struct, typedef, etc. */
+#define SC_STRUCT              0x4001U /* Struct or union */
+#define SC_SFLD                0x4002U /* Struct or union field */
+#define SC_TYPEDEF             0x4003U /* A typedef */
 
 #define SC_ZEROPAGE    0x8000U /* Symbol marked as zeropage */
 
index 3bab90d7c01bb838937a6e56f3648ce55cc500ed..9228e5628617abec115547b8f077a11492fdb0f5 100644 (file)
@@ -631,7 +631,7 @@ SymEntry* AddLabelSym (const char* Name, unsigned Flags)
 
 
 
-SymEntry* AddLocalSym (const char* Name, type* Type, unsigned Flags, int Offs)
+SymEntry* AddLocalSym (const char* Name, const type* Type, unsigned Flags, int Offs)
 /* Add a local symbol and return the symbol entry */
 {
     /* Do we have an entry with this name already? */
@@ -661,7 +661,7 @@ SymEntry* AddLocalSym (const char* Name, type* Type, unsigned Flags, int Offs)
 
 
 
-SymEntry* AddGlobalSym (const char* Name, type* Type, unsigned Flags)
+SymEntry* AddGlobalSym (const char* Name, const type* Type, unsigned Flags)
 /* Add an external or global symbol to the symbol table and return the entry */
 {
     /* Functions must be inserted in the global symbol table */
@@ -729,7 +729,7 @@ SymEntry* AddGlobalSym (const char* Name, type* Type, unsigned Flags)
        /* Create a new entry */
        Entry = NewSymEntry (Name, Flags);
 
-       /* Set the symbol attributes */
+       /* Set the symbol attributes */         
        Entry->Type = TypeDup (Type);
 
        /* Add the entry to the symbol table */
index 2e8c2a0e5ed25620a95b0f631c3d6c6cd7d85e8d..2628ecd5ef64bc312bec6294dbafd18b5db0d6a0 100644 (file)
@@ -143,10 +143,10 @@ SymEntry* AddEnumSym (const char* Name, int Val);
 SymEntry* AddLabelSym (const char* Name, unsigned Flags);
 /* Add a goto label to the symbol table */
 
-SymEntry* AddLocalSym (const char* Name, type* Type, unsigned Flags, int Offs);
+SymEntry* AddLocalSym (const char* Name, const type* Type, unsigned Flags, int Offs);
 /* Add a local symbol and return the symbol entry */
 
-SymEntry* AddGlobalSym (const char* Name, type* Type, unsigned Flags);
+SymEntry* AddGlobalSym (const char* Name, const type* Type, unsigned Flags);
 /* Add an external or global symbol to the symbol table and return the entry */