mirror of
https://github.com/cc65/cc65.git
synced 2025-03-01 11:29:27 +00:00
Write scope information to the object file.
git-svn-id: svn://svn.cc65.org/cc65/trunk@5091 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
9c55586569
commit
359e119a6b
src/ca65
@ -6,10 +6,10 @@
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
/* (C) 2003 Ullrich von Bassewitz */
|
||||
/* Römerstraße 52 */
|
||||
/* D-70794 Filderstadt */
|
||||
/* EMail: uz@cc65.org */
|
||||
/* (C) 2003-2011, Ullrich von Bassewitz */
|
||||
/* Roemerstrasse 52 */
|
||||
/* D-70794 Filderstadt */
|
||||
/* EMail: uz@cc65.org */
|
||||
/* */
|
||||
/* */
|
||||
/* This software is provided 'as-is', without any expressed or implied */
|
||||
@ -37,6 +37,7 @@
|
||||
#include "xmalloc.h"
|
||||
|
||||
/* ca65 */
|
||||
#include "objfile.h"
|
||||
#include "segment.h"
|
||||
#include "segrange.h"
|
||||
|
||||
@ -94,7 +95,7 @@ void AddSegRanges (Collection* Ranges)
|
||||
void CloseSegRanges (Collection* Ranges)
|
||||
/* Close all open segment ranges by setting PC to the current PC for the
|
||||
* segment.
|
||||
*/
|
||||
*/
|
||||
{
|
||||
unsigned I;
|
||||
|
||||
@ -111,3 +112,43 @@ void CloseSegRanges (Collection* Ranges)
|
||||
|
||||
|
||||
|
||||
void WriteSegRanges (const Collection* Ranges)
|
||||
/* Write a list of segment ranges to the output file */
|
||||
{
|
||||
unsigned I;
|
||||
unsigned Count;
|
||||
|
||||
/* Determine how many of the segments contain actual data */
|
||||
Count = 0;
|
||||
for (I = 0; I < CollCount (Ranges); ++I) {
|
||||
|
||||
/* Get next range */
|
||||
const SegRange* R = CollConstAt (Ranges, I);
|
||||
|
||||
/* Is this segment range empty? */
|
||||
if (R->Start != R->End) {
|
||||
++Count;
|
||||
}
|
||||
}
|
||||
|
||||
/* Write the number of ranges with data */
|
||||
ObjWriteVar (Count);
|
||||
|
||||
/* Write the ranges */
|
||||
for (I = 0; I < CollCount (Ranges); ++I) {
|
||||
|
||||
/* Get next range */
|
||||
const SegRange* R = CollConstAt (Ranges, I);
|
||||
|
||||
/* Write data for non empty ranges */
|
||||
if (R->Start != R->End) {
|
||||
ObjWriteVar (R->Seg->Num);
|
||||
ObjWriteVar (R->Start);
|
||||
ObjWriteVar (R->End);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -6,10 +6,10 @@
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
/* (C) 2003 Ullrich von Bassewitz */
|
||||
/* Römerstraße 52 */
|
||||
/* D-70794 Filderstadt */
|
||||
/* EMail: uz@cc65.org */
|
||||
/* (C) 2003-2011, Ullrich von Bassewitz */
|
||||
/* Roemerstrasse 52 */
|
||||
/* D-70794 Filderstadt */
|
||||
/* EMail: uz@cc65.org */
|
||||
/* */
|
||||
/* */
|
||||
/* This software is provided 'as-is', without any expressed or implied */
|
||||
@ -92,6 +92,9 @@ void CloseSegRanges (Collection* Ranges);
|
||||
* segment.
|
||||
*/
|
||||
|
||||
void WriteSegRanges (const Collection* Ranges);
|
||||
/* Write a list of segment ranges to the output file */
|
||||
|
||||
|
||||
|
||||
/* End of segrange.h */
|
||||
@ -100,4 +103,4 @@ void CloseSegRanges (Collection* Ranges);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -73,6 +73,7 @@
|
||||
SymTable* CurrentScope = 0; /* Pointer to current symbol table */
|
||||
SymTable* RootScope = 0; /* Root symbol table */
|
||||
static SymTable* LastScope = 0; /* Pointer to last scope in list */
|
||||
static unsigned ScopeCount = 0; /* Number of scopes */
|
||||
|
||||
/* Symbol table variables */
|
||||
static unsigned ImportCount = 0; /* Counter for import symbols */
|
||||
@ -127,7 +128,7 @@ static SymTable* NewSymTable (SymTable* Parent, const StrBuf* Name)
|
||||
}
|
||||
|
||||
/* Insert the symbol table into the list of all symbol tables and maintain
|
||||
* a unqiue id for each scope.
|
||||
* a unqiue id for each scope. Count the number of scopes.
|
||||
*/
|
||||
S->Next = LastScope;
|
||||
if (RootScope == 0) {
|
||||
@ -137,6 +138,7 @@ static SymTable* NewSymTable (SymTable* Parent, const StrBuf* Name)
|
||||
S->Id = LastScope->Id + 1;
|
||||
}
|
||||
LastScope = S;
|
||||
++ScopeCount;
|
||||
|
||||
/* Insert the symbol table into the child tree of the parent */
|
||||
if (Parent) {
|
||||
@ -161,7 +163,7 @@ static SymTable* NewSymTable (SymTable* Parent, const StrBuf* Name)
|
||||
} else {
|
||||
T->Right = S;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* Duplicate scope name */
|
||||
Internal ("Duplicate scope name: `%m%p'", Name);
|
||||
@ -245,7 +247,7 @@ void SymLeaveLevel (void)
|
||||
const SegRange* R = CollAtUnchecked (&CurrentScope->SegRanges, 0);
|
||||
unsigned long Size = GetSegRangeSize (R);
|
||||
DefSizeOfScope (CurrentScope, Size);
|
||||
if (CurrentScope->OwnerSym) {
|
||||
if (CurrentScope->OwnerSym) {
|
||||
DefSizeOfSymbol (CurrentScope->OwnerSym, Size);
|
||||
}
|
||||
}
|
||||
@ -889,8 +891,56 @@ void WriteScopes (void)
|
||||
/* Tell the object file module that we're about to start the scopes */
|
||||
ObjStartScopes ();
|
||||
|
||||
/* No debug info requested */
|
||||
ObjWriteVar (0);
|
||||
/* We will write scopes only if debug symbols are requested */
|
||||
if (DbgSyms) {
|
||||
|
||||
/* Get head of list */
|
||||
const SymTable* S = LastScope;
|
||||
|
||||
/* Write the scope count to the file */
|
||||
ObjWriteVar (ScopeCount);
|
||||
|
||||
/* Walk through all scopes and write them to the file */
|
||||
while (S) {
|
||||
|
||||
/* Type must be defined */
|
||||
CHECK (S->Type != ST_UNDEF);
|
||||
|
||||
/* Id of scope */
|
||||
ObjWriteVar (S->Id);
|
||||
|
||||
/* Id of parent scope */
|
||||
if (S->Parent) {
|
||||
ObjWriteVar (S->Parent->Id);
|
||||
} else {
|
||||
ObjWriteVar (0);
|
||||
}
|
||||
|
||||
/* Lexical level */
|
||||
ObjWriteVar (S->Level);
|
||||
|
||||
/* Scope flags (currently always zero) */
|
||||
ObjWriteVar (0);
|
||||
|
||||
/* Type of scope */
|
||||
ObjWriteVar (S->Type);
|
||||
|
||||
/* Name of the scope */
|
||||
ObjWriteVar (S->Name);
|
||||
|
||||
/* Segment ranges for this scope */
|
||||
WriteSegRanges (&S->SegRanges);
|
||||
|
||||
/* Next scope */
|
||||
S = S->Next;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
/* No debug info requested */
|
||||
ObjWriteVar (0);
|
||||
|
||||
}
|
||||
|
||||
/* Done writing the scopes */
|
||||
ObjEndScopes ();
|
||||
|
Loading…
x
Reference in New Issue
Block a user