Started to add spans.
git-svn-id: svn://svn.cc65.org/cc65/trunk@5148 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
@@ -149,6 +149,7 @@ typedef enum {
|
|||||||
TOK_SCOPE, /* SCOPE keyword */
|
TOK_SCOPE, /* SCOPE keyword */
|
||||||
TOK_SEGMENT, /* SEGMENT keyword */
|
TOK_SEGMENT, /* SEGMENT keyword */
|
||||||
TOK_SIZE, /* SIZE keyword */
|
TOK_SIZE, /* SIZE keyword */
|
||||||
|
TOK_SPAN, /* SPAN keyword */
|
||||||
TOK_START, /* START keyword */
|
TOK_START, /* START keyword */
|
||||||
TOK_STRUCT, /* STRUCT keyword */
|
TOK_STRUCT, /* STRUCT keyword */
|
||||||
TOK_SYM, /* SYM keyword */
|
TOK_SYM, /* SYM keyword */
|
||||||
@@ -180,6 +181,7 @@ struct DbgInfo {
|
|||||||
Collection ModInfoById; /* Module infos sorted by id */
|
Collection ModInfoById; /* Module infos sorted by id */
|
||||||
Collection ScopeInfoById; /* Scope infos sorted by id */
|
Collection ScopeInfoById; /* Scope infos sorted by id */
|
||||||
Collection SegInfoById; /* Segment infos sorted by id */
|
Collection SegInfoById; /* Segment infos sorted by id */
|
||||||
|
Collection SpanInfoById; /* Span infos sorted by id */
|
||||||
Collection SymInfoById; /* Symbol infos sorted by id */
|
Collection SymInfoById; /* Symbol infos sorted by id */
|
||||||
|
|
||||||
/* Collections with other sort criteria */
|
/* Collections with other sort criteria */
|
||||||
@@ -220,6 +222,7 @@ typedef struct LineInfo LineInfo;
|
|||||||
typedef struct ModInfo ModInfo;
|
typedef struct ModInfo ModInfo;
|
||||||
typedef struct ScopeInfo ScopeInfo;
|
typedef struct ScopeInfo ScopeInfo;
|
||||||
typedef struct SegInfo SegInfo;
|
typedef struct SegInfo SegInfo;
|
||||||
|
typedef struct SpanInfo SpanInfo;
|
||||||
typedef struct SymInfo SymInfo;
|
typedef struct SymInfo SymInfo;
|
||||||
|
|
||||||
/* Internally used file info struct */
|
/* Internally used file info struct */
|
||||||
@@ -296,12 +299,23 @@ struct ScopeInfo {
|
|||||||
struct SegInfo {
|
struct SegInfo {
|
||||||
unsigned Id; /* Id of segment */
|
unsigned Id; /* Id of segment */
|
||||||
cc65_addr Start; /* Start address of segment */
|
cc65_addr Start; /* Start address of segment */
|
||||||
cc65_addr Size; /* Size of segment */
|
cc65_size Size; /* Size of segment */
|
||||||
char* OutputName; /* Name of output file */
|
char* OutputName; /* Name of output file */
|
||||||
unsigned long OutputOffs; /* Offset in output file */
|
unsigned long OutputOffs; /* Offset in output file */
|
||||||
char Name[1]; /* Name of segment */
|
char Name[1]; /* Name of segment */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Internally used span info struct */
|
||||||
|
struct SpanInfo {
|
||||||
|
unsigned Id; /* Id of span */
|
||||||
|
cc65_addr Offs; /* Start offset of span */
|
||||||
|
cc65_size Size; /* Size of span */
|
||||||
|
union {
|
||||||
|
unsigned Id; /* Id of segment */
|
||||||
|
SegInfo* Info; /* Pointer to segment */
|
||||||
|
} Seg;
|
||||||
|
};
|
||||||
|
|
||||||
/* Internally used symbol info struct */
|
/* Internally used symbol info struct */
|
||||||
struct SymInfo {
|
struct SymInfo {
|
||||||
unsigned Id; /* Id of symbol */
|
unsigned Id; /* Id of symbol */
|
||||||
@@ -1598,6 +1612,53 @@ static int CompareSegInfoByName (const void* L, const void* R)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Span info */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static SpanInfo* NewSpanInfo (void)
|
||||||
|
/* Create a new SpanInfo struct, intialize and return it */
|
||||||
|
{
|
||||||
|
/* Allocate memory and return it */
|
||||||
|
return xmalloc (sizeof (SpanInfo));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void FreeSpanInfo (SpanInfo* S)
|
||||||
|
/* Free a SpanInfo struct */
|
||||||
|
{
|
||||||
|
xfree (S);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static cc65_spaninfo* new_cc65_spaninfo (unsigned Count)
|
||||||
|
/* Allocate and return a cc65_spaninfo struct that is able to hold Count
|
||||||
|
* entries. Initialize the count field of the returned struct.
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
cc65_spaninfo* S = xmalloc (sizeof (*S) - sizeof (S->data[0]) +
|
||||||
|
Count * sizeof (S->data[0]));
|
||||||
|
S->count = Count;
|
||||||
|
return S;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void CopySpanInfo (cc65_spandata* D, const SpanInfo* S)
|
||||||
|
/* Copy data from a SpanInfo struct to a cc65_spandata struct */
|
||||||
|
{
|
||||||
|
D->span_id = S->Id;
|
||||||
|
D->span_offs = S->Offs;
|
||||||
|
D->span_size = S->Size;
|
||||||
|
D->segment_id = S->Seg.Info->Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Symbol info */
|
/* Symbol info */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@@ -1709,6 +1770,7 @@ static DbgInfo* NewDbgInfo (void)
|
|||||||
CollInit (&Info->ModInfoById);
|
CollInit (&Info->ModInfoById);
|
||||||
CollInit (&Info->ScopeInfoById);
|
CollInit (&Info->ScopeInfoById);
|
||||||
CollInit (&Info->SegInfoById);
|
CollInit (&Info->SegInfoById);
|
||||||
|
CollInit (&Info->SpanInfoById);
|
||||||
CollInit (&Info->SymInfoById);
|
CollInit (&Info->SymInfoById);
|
||||||
|
|
||||||
CollInit (&Info->FileInfoByName);
|
CollInit (&Info->FileInfoByName);
|
||||||
@@ -1749,6 +1811,9 @@ static void FreeDbgInfo (DbgInfo* Info)
|
|||||||
for (I = 0; I < CollCount (&Info->SegInfoById); ++I) {
|
for (I = 0; I < CollCount (&Info->SegInfoById); ++I) {
|
||||||
FreeSegInfo (CollAt (&Info->SegInfoById, I));
|
FreeSegInfo (CollAt (&Info->SegInfoById, I));
|
||||||
}
|
}
|
||||||
|
for (I = 0; I < CollCount (&Info->SpanInfoById); ++I) {
|
||||||
|
FreeSpanInfo (CollAt (&Info->SpanInfoById, I));
|
||||||
|
}
|
||||||
for (I = 0; I < CollCount (&Info->SymInfoById); ++I) {
|
for (I = 0; I < CollCount (&Info->SymInfoById); ++I) {
|
||||||
FreeSymInfo (CollAt (&Info->SymInfoById, I));
|
FreeSymInfo (CollAt (&Info->SymInfoById, I));
|
||||||
}
|
}
|
||||||
@@ -1760,6 +1825,7 @@ static void FreeDbgInfo (DbgInfo* Info)
|
|||||||
CollDone (&Info->ModInfoById);
|
CollDone (&Info->ModInfoById);
|
||||||
CollDone (&Info->ScopeInfoById);
|
CollDone (&Info->ScopeInfoById);
|
||||||
CollDone (&Info->SegInfoById);
|
CollDone (&Info->SegInfoById);
|
||||||
|
CollDone (&Info->SpanInfoById);
|
||||||
CollDone (&Info->SymInfoById);
|
CollDone (&Info->SymInfoById);
|
||||||
|
|
||||||
/* Free the memory used by the other collections */
|
/* Free the memory used by the other collections */
|
||||||
@@ -1940,6 +2006,7 @@ static void NextToken (InputData* D)
|
|||||||
{ "scope", TOK_SCOPE },
|
{ "scope", TOK_SCOPE },
|
||||||
{ "seg", TOK_SEGMENT },
|
{ "seg", TOK_SEGMENT },
|
||||||
{ "size", TOK_SIZE },
|
{ "size", TOK_SIZE },
|
||||||
|
{ "span", TOK_SPAN },
|
||||||
{ "start", TOK_START },
|
{ "start", TOK_START },
|
||||||
{ "struct", TOK_STRUCT },
|
{ "struct", TOK_STRUCT },
|
||||||
{ "sym", TOK_SYM },
|
{ "sym", TOK_SYM },
|
||||||
|
|||||||
@@ -242,6 +242,44 @@ void cc65_free_moduleinfo (cc65_dbginfo handle, cc65_moduleinfo* info);
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Spans */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Span information */
|
||||||
|
typedef struct cc65_spandata cc65_spandata;
|
||||||
|
struct cc65_spandata {
|
||||||
|
unsigned span_id; /* The internal span id */
|
||||||
|
cc65_addr span_offs; /* Offset of the span in the segment */
|
||||||
|
cc65_size span_size; /* Size of the span */
|
||||||
|
unsigned segment_id; /* Id of the segment */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct cc65_spaninfo cc65_spaninfo;
|
||||||
|
struct cc65_spaninfo {
|
||||||
|
unsigned count; /* Number of data sets that follow */
|
||||||
|
cc65_spandata data[1]; /* Data sets, number is dynamic */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cc65_spaninfo* cc65_get_spanlist (cc65_dbginfo handle);
|
||||||
|
/* Return a list of all spans */
|
||||||
|
|
||||||
|
cc65_spaninfo* cc65_spaninfo_byid (cc65_dbginfo handle, unsigned id);
|
||||||
|
/* Return information about a span with a specific id. The function
|
||||||
|
* returns NULL if the id is invalid (no such span) and otherwise a
|
||||||
|
* cc65_spaninfo structure with one entry that contains the requested
|
||||||
|
* span information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void cc65_free_spaninfo (cc65_dbginfo handle, cc65_spaninfo* info);
|
||||||
|
/* Free a span info record */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Source files */
|
/* Source files */
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@@ -305,7 +343,7 @@ struct cc65_segmentdata {
|
|||||||
unsigned segment_id; /* The internal segment id */
|
unsigned segment_id; /* The internal segment id */
|
||||||
const char* segment_name; /* Name of the segment */
|
const char* segment_name; /* Name of the segment */
|
||||||
cc65_addr segment_start; /* Start address of segment */
|
cc65_addr segment_start; /* Start address of segment */
|
||||||
cc65_addr segment_size; /* Size of segment */
|
cc65_size segment_size; /* Size of segment */
|
||||||
const char* output_name; /* Output file this seg was written to */
|
const char* output_name; /* Output file this seg was written to */
|
||||||
unsigned long output_offs; /* Offset of this seg in output file */
|
unsigned long output_offs; /* Offset of this seg in output file */
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user