diff --git a/src/ca65/main.c b/src/ca65/main.c index eae7c384f..934ad6f3d 100644 --- a/src/ca65/main.c +++ b/src/ca65/main.c @@ -798,6 +798,9 @@ static void CreateObjFile (void) /* Write the export list */ WriteExports (); + /* Write the scopes if requested */ + WriteScopes (); + /* Write debug symbols if requested */ WriteDbgSyms (); diff --git a/src/ca65/symentry.c b/src/ca65/symentry.c index 9146aea38..7bae7e019 100644 --- a/src/ca65/symentry.c +++ b/src/ca65/symentry.c @@ -84,7 +84,7 @@ SymEntry* NewSymEntry (const StrBuf* Name, unsigned Flags) 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; @@ -620,7 +620,13 @@ SymTable* GetSymParentScope (SymEntry* S) * 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; + } } diff --git a/src/ca65/symentry.h b/src/ca65/symentry.h index 42b281ed7..36ea6aed3 100644 --- a/src/ca65/symentry.h +++ b/src/ca65/symentry.h @@ -83,7 +83,10 @@ struct SymEntry { 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 @@ -98,7 +101,7 @@ struct SymEntry { 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 */ }; @@ -353,4 +356,4 @@ INLINE const FilePos* GetSymPos (const SymEntry* S) - + diff --git a/src/ca65/symtab.c b/src/ca65/symtab.c index 615e1086a..593b5d520 100644 --- a/src/ca65/symtab.c +++ b/src/ca65/symtab.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (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 */ @@ -70,12 +70,13 @@ #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 */ @@ -124,6 +125,18 @@ static SymTable* NewSymTable (SymTable* Parent, const StrBuf* Name) 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; @@ -315,6 +328,7 @@ SymEntry* SymFindLocal (SymEntry* Parent, const StrBuf* Name, int AllocNew) /* 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) { @@ -354,6 +368,7 @@ SymEntry* SymFind (SymTable* Scope, const StrBuf* Name, int AllocNew) /* 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) { @@ -361,7 +376,6 @@ SymEntry* SymFind (SymTable* Scope, const StrBuf* Name, int AllocNew) } else { S->Right = N; } - N->SymTab = Scope; ++Scope->TableEntries; return N; @@ -836,7 +850,7 @@ void WriteScopes (void) /* 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 */ diff --git a/src/ca65/symtab.h b/src/ca65/symtab.h index 9b45cfd49..9761da025 100644 --- a/src/ca65/symtab.h +++ b/src/ca65/symtab.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (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 */ @@ -73,12 +73,14 @@ enum { /* 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 */ @@ -162,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 */