]> git.sur5r.net Git - cc65/blobdiff - src/ca65/symtab.h
More lineinfo usage.
[cc65] / src / ca65 / symtab.h
index 54ee0620350ec44d6e4c20224d7394c19297158e..9761da025af069522ff4a945a2e2e37d41e01791 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2003 Ullrich von Bassewitz                                       */
-/*               Römerstrasse 52                                             */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 1998-2010, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 
 /* common */
 #include "exprdefs.h"
+#include "inline.h"
 
 /* ca65 */
+#include "segrange.h"
 #include "symentry.h"
 
 
 
 
 
-/* Scope identifiers */
-#define SCOPE_ANY       0
-#define SCOPE_GLOBAL    1
-#define SCOPE_LOCAL     2
+/* Symbol table flags */
+#define ST_NONE         0x00            /* No flags */
+#define ST_DEFINED      0x01            /* Scope has been defined */
+
+/* Symbol table types */
+enum {
+    ST_GLOBAL,                          /* Root level */
+    ST_PROC,                            /* .PROC */
+    ST_SCOPE,                           /* .SCOPE */
+    ST_SCOPE_HAS_DATA = ST_SCOPE,       /* Last scope that contains data */
+    ST_STRUCT,                          /* .STRUCT/.UNION */
+    ST_ENUM,                            /* .ENUM */
+    ST_UNDEF    = 0xFF
+};
+
+/* A symbol table */
+typedef struct SymTable SymTable;
+struct SymTable {                                     
+    SymTable*           Next;           /* Pointer to next table in list */
+    SymTable*           Left;           /* Pointer to smaller entry */
+    SymTable*           Right;          /* Pointer to greater entry */
+    SymTable*                  Parent;         /* Link to enclosing scope if any */
+    SymTable*           Childs;         /* Pointer to child scopes */
+    Collection          SegRanges;      /* Segment ranges for this scope */
+    unsigned            Id;             /* Scope id */
+    unsigned short      Flags;          /* Symbol table flags */
+    unsigned char      AddrSize;       /* Address size */
+    unsigned char       Type;           /* Type of the scope */
+    unsigned            Level;          /* Lexical level */
+    unsigned                   TableSlots;     /* Number of hash table slots */
+    unsigned                   TableEntries;   /* Number of entries in the table */
+    unsigned            Name;           /* Name of the scope */
+    SymEntry*                  Table[1];       /* Dynamic allocation */
+};
+
+/* Symbol tables */
+extern SymTable*        CurrentScope;   /* Pointer to current symbol table */
+extern SymTable*       RootScope;      /* Root symbol table */
 
 
 
 
 
 
-void SymEnterLevel (void);
+void SymEnterLevel (const StrBuf* ScopeName, unsigned char Type, unsigned char AddrSize);
 /* Enter a new lexical level */
 
 void SymLeaveLevel (void);
 /* Leave the current lexical level */
 
-void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label);
-/* Define a new symbol */
+SymTable* SymFindScope (SymTable* Parent, const StrBuf* Name, int AllocNew);
+/* Find a scope in the given enclosing scope */
 
-SymEntry* SymRef (const char* Name, int Scope);
-/* Search for the symbol and return it */
-
-int SymIsDef (const char* Name, int Scope);
-/* Return true if the given symbol is already defined */
-
-int SymIsRef (const char* Name, int Scope);
-/* Return true if the given symbol has been referenced */
-
-void SymImport (const char* Name);
-/* Mark the given symbol as an imported symbol */
-
-void SymImportZP (const char* Name);
-/* Mark the given symbol as a imported zeropage symbol */
-
-void SymImportForced (const char* Name);
-/* Mark the given symbol as a forced imported symbol */
-
-void SymExport (const char* Name);
-/* Mark the given symbol as an exported symbol */
-
-void SymExportZP (const char* Name);
-/* Mark the given symbol as an exported zeropage symbol */
-
-void SymGlobal (const char* Name);
-/* Mark the given symbol as a global symbol, that is, as a symbol that is
- * either imported or exported.
- */
-                                
-void SymGlobalZP (const char* Name);
-/* Mark the given symbol as a global zeropage symbol, that is, as a symbol
- * that is either imported or exported.
+SymTable* SymFindAnyScope (SymTable* Parent, const StrBuf* Name);
+/* Find a scope in the given or any of its parent scopes. The function will
+ * never create a new symbol, since this can only be done in one specific
+ * scope.
  */
 
-void SymConDes (const char* Name, unsigned Type, unsigned Prio);
-/* Mark the given symbol as a module constructor/destructor. This will also
- * mark the symbol as an export. Initializers may never be zero page symbols.
+SymEntry* SymFindLocal (SymEntry* Parent, const StrBuf* StrBuf, int AllocNew);
+/* Find a cheap local symbol. If AllocNew is given and the entry is not
+ * found, create a new one. Return the entry found, or the new entry created,
+ * or - in case AllocNew is zero - return 0.
  */
 
-int SymIsConst (SymEntry* Sym);
-/* Return true if the given symbol has a constant value */
-
-int SymIsZP (SymEntry* Sym);
-/* Return true if the symbol is explicitly marked as zeropage symbol */
-
-int SymIsImport (SymEntry* Sym);
-/* Return true if the given symbol is marked as import */
-
-int SymHasExpr (SymEntry* Sym);
-/* Return true if the given symbol has an associated expression */
-
-void SymMarkUser (SymEntry* Sym);
-/* Set a user mark on the specified symbol */
-
-void SymUnmarkUser (SymEntry* Sym);
-/* Remove a user mark from the specified symbol */
-
-int SymHasUserMark (SymEntry* Sym);
-/* Return the state of the user mark for the specified symbol */
-
-long GetSymVal (SymEntry* Sym);
-/* Return the symbol value */
-
-ExprNode* GetSymExpr (SymEntry* Sym);
-/* Get the expression for a non-const symbol */
+SymEntry* SymFind (SymTable* Scope, const StrBuf* Name, int AllocNew);
+/* Find a new symbol table entry in the given table. If AllocNew is given and
+ * the entry is not found, create a new one. Return the entry found, or the
+ * new entry created, or - in case AllocNew is zero - return 0.
+ */
 
-const char* GetSymName (SymEntry* Sym);
-/* Return the name of the symbol */
+SymEntry* SymFindAny (SymTable* Scope, const StrBuf* Name);
+/* Find a symbol in the given or any of its parent scopes. The function will
+ * never create a new symbol, since this can only be done in one specific
+ * scope.
+ */
 
-unsigned GetSymIndex (SymEntry* Sym);
-/* Return the symbol index for the given symbol */
+#if defined(HAVE_INLINE)
+INLINE unsigned char GetSymTabType (const SymTable* S)
+/* Return the type of the given symbol table */
+{
+    return S->Type;
+}
+#else
+#  define GetSymTabType(S)      ((S)->Type)
+#endif
 
-const FilePos* GetSymPos (SymEntry* Sym);
-/* Return the position of first occurence in the source for the given symbol */
+unsigned char GetCurrentSymTabType ();
+/* Return the type of the current symbol table */
 
 void SymCheck (void);
 /* Run through all symbols and check for anomalies and errors */
@@ -166,6 +164,9 @@ void WriteExports (void);
 void WriteDbgSyms (void);
 /* Write a list of all symbols to the object file */
 
+void WriteScopes (void);
+/* Write the scope table to the object file */
+
 
 
 /* End of symtab.h */
@@ -174,4 +175,3 @@ void WriteDbgSyms (void);
 
 
 
-