/* Write the export list */
WriteExports ();
+ /* Write the scopes if requested */
+ WriteScopes ();
+
/* Write debug symbols if requested */
WriteDbgSyms ();
S->Left = 0;
S->Right = 0;
S->Locals = 0;
- S->SymTab = 0;
+ S->Sym.Tab = 0;
S->Pos = CurPos;
for (I = 0; I < sizeof (S->GuessedUse) / sizeof (S->GuessedUse[0]); ++I) {
S->GuessedUse[I] = 0;
* NULL if the symbol is a cheap local, or defined on global level.
*/
{
- return (S->SymTab && S->SymTab->Parent)? S->SymTab->Parent : 0;
+ if ((S->Flags & SF_LOCAL) != 0) {
+ /* This is a cheap local symbol */
+ return 0;
+ } else {
+ /* This is a global symbol */
+ return S->Sym.Tab->Parent;
+ }
}
SymEntry* Right; /* Lexically larger entry */
SymEntry* List; /* List of all entries */
SymEntry* Locals; /* Root of subtree for local symbols */
- struct SymTable* SymTab; /* Table this symbol is in, 0 for locals */
+ union {
+ struct SymTable* Tab; /* Table this symbol is in */
+ struct SymEntry* Entry;
+ } Sym;
FilePos Pos; /* File position for this symbol */
FilePos* GuessedUse[1]; /* File position where symbol
* address size was guessed, and the
unsigned char ExportSize; /* Export address size */
unsigned char AddrSize; /* Address size of label */
unsigned char ConDesPrio[CD_TYPE_COUNT]; /* ConDes priorities... */
- /* ...actually value+1 (used as flag) */
+ /* ...actually value+1 (used as flag) */
unsigned Name; /* Name index in global string pool */
};
-
+
/* */
/* */
/* */
-/* (C) 1998-2008 Ullrich von Bassewitz */
-/* Roemerstrasse 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 */
#define SF_DBGINFOVAL (SF_DEFINED)
/* Symbol tables */
-SymTable* CurrentScope = 0; /* Pointer to current symbol table */
-SymTable* RootScope = 0; /* Root symbol table */
+SymTable* CurrentScope = 0; /* Pointer to current symbol table */
+SymTable* RootScope = 0; /* Root symbol table */
+static SymTable* LastScope = 0; /* Pointer to last scope in list */
/* Symbol table variables */
-static unsigned ImportCount = 0; /* Counter for import symbols */
-static unsigned ExportCount = 0; /* Counter for export symbols */
+static unsigned ImportCount = 0; /* Counter for import symbols */
+static unsigned ExportCount = 0; /* Counter for export symbols */
S->Table[Slots] = 0;
}
+ /* Insert the symbol table into the list of all symbol tables and maintain
+ * a unqiue id for each scope.
+ */
+ S->Next = LastScope;
+ if (RootScope == 0) {
+ S->Id = 0;
+ RootScope = S;
+ } else {
+ S->Id = LastScope->Id + 1;
+ }
+ LastScope = S;
+
/* Insert the symbol table into the child tree of the parent */
if (Parent) {
SymTable* T = Parent->Childs;
/* Otherwise create a new entry, insert and return it */
SymEntry* N = NewSymEntry (Name, SF_LOCAL);
+ N->Sym.Entry = Parent;
if (S == 0) {
Parent->Locals = N;
} else if (Cmp < 0) {
/* Otherwise create a new entry, insert and return it */
SymEntry* N = NewSymEntry (Name, SF_NONE);
+ N->Sym.Tab = Scope;
if (S == 0) {
Scope->Table[Hash] = N;
} else if (Cmp < 0) {
} else {
S->Right = N;
}
- N->SymTab = Scope;
++Scope->TableEntries;
return N;
/* Tell the object file module that we're about to start the scopes */
ObjStartScopes ();
- /* For now ...*/
+ /* No debug info requested */
ObjWriteVar (0);
/* Done writing the scopes */
/* */
/* */
/* */
-/* (C) 1998-2008 Ullrich von Bassewitz */
-/* Roemerstrasse 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 */
/* A symbol table */
typedef struct SymTable SymTable;
-struct 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 */
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 */