Maintain some additional information for scopes. Write a dummy scope section
into the object file. git-svn-id: svn://svn.cc65.org/cc65/trunk@4808 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
@@ -798,6 +798,9 @@ static void CreateObjFile (void)
|
|||||||
/* Write the export list */
|
/* Write the export list */
|
||||||
WriteExports ();
|
WriteExports ();
|
||||||
|
|
||||||
|
/* Write the scopes if requested */
|
||||||
|
WriteScopes ();
|
||||||
|
|
||||||
/* Write debug symbols if requested */
|
/* Write debug symbols if requested */
|
||||||
WriteDbgSyms ();
|
WriteDbgSyms ();
|
||||||
|
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ SymEntry* NewSymEntry (const StrBuf* Name, unsigned Flags)
|
|||||||
S->Left = 0;
|
S->Left = 0;
|
||||||
S->Right = 0;
|
S->Right = 0;
|
||||||
S->Locals = 0;
|
S->Locals = 0;
|
||||||
S->SymTab = 0;
|
S->Sym.Tab = 0;
|
||||||
S->Pos = CurPos;
|
S->Pos = CurPos;
|
||||||
for (I = 0; I < sizeof (S->GuessedUse) / sizeof (S->GuessedUse[0]); ++I) {
|
for (I = 0; I < sizeof (S->GuessedUse) / sizeof (S->GuessedUse[0]); ++I) {
|
||||||
S->GuessedUse[I] = 0;
|
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.
|
* 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -83,7 +83,10 @@ struct SymEntry {
|
|||||||
SymEntry* Right; /* Lexically larger entry */
|
SymEntry* Right; /* Lexically larger entry */
|
||||||
SymEntry* List; /* List of all entries */
|
SymEntry* List; /* List of all entries */
|
||||||
SymEntry* Locals; /* Root of subtree for local symbols */
|
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 Pos; /* File position for this symbol */
|
||||||
FilePos* GuessedUse[1]; /* File position where symbol
|
FilePos* GuessedUse[1]; /* File position where symbol
|
||||||
* address size was guessed, and the
|
* address size was guessed, and the
|
||||||
@@ -98,7 +101,7 @@ struct SymEntry {
|
|||||||
unsigned char ExportSize; /* Export address size */
|
unsigned char ExportSize; /* Export address size */
|
||||||
unsigned char AddrSize; /* Address size of label */
|
unsigned char AddrSize; /* Address size of label */
|
||||||
unsigned char ConDesPrio[CD_TYPE_COUNT]; /* ConDes priorities... */
|
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 */
|
unsigned Name; /* Name index in global string pool */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -353,4 +356,4 @@ INLINE const FilePos* GetSymPos (const SymEntry* S)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2008 Ullrich von Bassewitz */
|
/* (C) 1998-2010, Ullrich von Bassewitz */
|
||||||
/* Roemerstrasse 52 */
|
/* Roemerstrasse 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@@ -70,12 +70,13 @@
|
|||||||
#define SF_DBGINFOVAL (SF_DEFINED)
|
#define SF_DBGINFOVAL (SF_DEFINED)
|
||||||
|
|
||||||
/* Symbol tables */
|
/* Symbol tables */
|
||||||
SymTable* CurrentScope = 0; /* Pointer to current symbol table */
|
SymTable* CurrentScope = 0; /* Pointer to current symbol table */
|
||||||
SymTable* RootScope = 0; /* Root symbol table */
|
SymTable* RootScope = 0; /* Root symbol table */
|
||||||
|
static SymTable* LastScope = 0; /* Pointer to last scope in list */
|
||||||
|
|
||||||
/* Symbol table variables */
|
/* Symbol table variables */
|
||||||
static unsigned ImportCount = 0; /* Counter for import symbols */
|
static unsigned ImportCount = 0; /* Counter for import symbols */
|
||||||
static unsigned ExportCount = 0; /* Counter for export 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;
|
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 */
|
/* Insert the symbol table into the child tree of the parent */
|
||||||
if (Parent) {
|
if (Parent) {
|
||||||
SymTable* T = Parent->Childs;
|
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 */
|
/* Otherwise create a new entry, insert and return it */
|
||||||
SymEntry* N = NewSymEntry (Name, SF_LOCAL);
|
SymEntry* N = NewSymEntry (Name, SF_LOCAL);
|
||||||
|
N->Sym.Entry = Parent;
|
||||||
if (S == 0) {
|
if (S == 0) {
|
||||||
Parent->Locals = N;
|
Parent->Locals = N;
|
||||||
} else if (Cmp < 0) {
|
} 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 */
|
/* Otherwise create a new entry, insert and return it */
|
||||||
SymEntry* N = NewSymEntry (Name, SF_NONE);
|
SymEntry* N = NewSymEntry (Name, SF_NONE);
|
||||||
|
N->Sym.Tab = Scope;
|
||||||
if (S == 0) {
|
if (S == 0) {
|
||||||
Scope->Table[Hash] = N;
|
Scope->Table[Hash] = N;
|
||||||
} else if (Cmp < 0) {
|
} else if (Cmp < 0) {
|
||||||
@@ -361,7 +376,6 @@ SymEntry* SymFind (SymTable* Scope, const StrBuf* Name, int AllocNew)
|
|||||||
} else {
|
} else {
|
||||||
S->Right = N;
|
S->Right = N;
|
||||||
}
|
}
|
||||||
N->SymTab = Scope;
|
|
||||||
++Scope->TableEntries;
|
++Scope->TableEntries;
|
||||||
return N;
|
return N;
|
||||||
|
|
||||||
@@ -836,7 +850,7 @@ void WriteScopes (void)
|
|||||||
/* Tell the object file module that we're about to start the scopes */
|
/* Tell the object file module that we're about to start the scopes */
|
||||||
ObjStartScopes ();
|
ObjStartScopes ();
|
||||||
|
|
||||||
/* For now ...*/
|
/* No debug info requested */
|
||||||
ObjWriteVar (0);
|
ObjWriteVar (0);
|
||||||
|
|
||||||
/* Done writing the scopes */
|
/* Done writing the scopes */
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2008 Ullrich von Bassewitz */
|
/* (C) 1998-2010, Ullrich von Bassewitz */
|
||||||
/* Roemerstrasse 52 */
|
/* Roemerstrasse 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@@ -73,12 +73,14 @@ enum {
|
|||||||
|
|
||||||
/* A symbol table */
|
/* A symbol table */
|
||||||
typedef struct SymTable SymTable;
|
typedef struct SymTable SymTable;
|
||||||
struct SymTable {
|
struct SymTable {
|
||||||
|
SymTable* Next; /* Pointer to next table in list */
|
||||||
SymTable* Left; /* Pointer to smaller entry */
|
SymTable* Left; /* Pointer to smaller entry */
|
||||||
SymTable* Right; /* Pointer to greater entry */
|
SymTable* Right; /* Pointer to greater entry */
|
||||||
SymTable* Parent; /* Link to enclosing scope if any */
|
SymTable* Parent; /* Link to enclosing scope if any */
|
||||||
SymTable* Childs; /* Pointer to child scopes */
|
SymTable* Childs; /* Pointer to child scopes */
|
||||||
Collection SegRanges; /* Segment ranges for this scope */
|
Collection SegRanges; /* Segment ranges for this scope */
|
||||||
|
unsigned Id; /* Scope id */
|
||||||
unsigned short Flags; /* Symbol table flags */
|
unsigned short Flags; /* Symbol table flags */
|
||||||
unsigned char AddrSize; /* Address size */
|
unsigned char AddrSize; /* Address size */
|
||||||
unsigned char Type; /* Type of the scope */
|
unsigned char Type; /* Type of the scope */
|
||||||
@@ -162,6 +164,9 @@ void WriteExports (void);
|
|||||||
void WriteDbgSyms (void);
|
void WriteDbgSyms (void);
|
||||||
/* Write a list of all symbols to the object file */
|
/* 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 */
|
/* End of symtab.h */
|
||||||
|
|||||||
Reference in New Issue
Block a user