1
0
mirror of https://github.com/cc65/cc65.git synced 2025-01-12 17:30:50 +00:00

Postprocess scope infos. New function cc65_scope_bymodule.

git-svn-id: svn://svn.cc65.org/cc65/trunk@5143 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz 2011-08-10 10:36:37 +00:00
parent 3e42ba1a87
commit 07f795fa78
2 changed files with 114 additions and 3 deletions

View File

@ -258,6 +258,8 @@ struct ModInfo {
unsigned Id; /* Id of library if any */
LibInfo* Info; /* Pointer to library info */
} Lib;
Collection FileInfoByName; /* Files for this module */
Collection ScopeInfoByName;/* Scopes for this module */
char Name[1]; /* Name of module with path */
};
@ -1296,7 +1298,9 @@ static ModInfo* NewModInfo (const StrBuf* Name)
/* Allocate memory */
ModInfo* M = xmalloc (sizeof (ModInfo) + SB_GetLen (Name));
/* Initialize the name */
/* Initialize it */
InitCollection (&M->FileInfoByName);
InitCollection (&M->ScopeInfoByName);
memcpy (M->Name, SB_GetConstBuf (Name), SB_GetLen (Name) + 1);
/* Return it */
@ -1308,6 +1312,11 @@ static ModInfo* NewModInfo (const StrBuf* Name)
static void FreeModInfo (ModInfo* M)
/* Free a ModInfo struct */
{
/* Free the collections */
DoneCollection (&M->FileInfoByName);
DoneCollection (&M->ScopeInfoByName);
/* Free the structure itself */
xfree (M);
}
@ -3757,8 +3766,66 @@ static int FindSymInfoByValue (Collection* SymInfos, long Value, unsigned* Index
static void ProcessScopeInfo (InputData* D)
/* Postprocess scope infos */
{
/* Get pointers to the scope info collections */
Collection* ScopeInfoById = &D->Info->ScopeInfoById;
unsigned I;
/* Walk over all scopes. Resolve the ids and add the scopes to the list
* of scopes for a module.
*/
for (I = 0; I < CollCount (&D->Info->ScopeInfoById); ++I) {
/* Get this scope info */
ScopeInfo* S = CollAt (&D->Info->ScopeInfoById, I);
/* Resolve the module */
if (S->Mod.Id >= CollCount (&D->Info->ModInfoById)) {
ParseError (D,
CC65_ERROR,
"Invalid module id %u for scope with id %u",
S->Mod.Id, S->Id);
S->Mod.Info = 0;
} else {
S->Mod.Info = CollAt (&D->Info->ModInfoById, S->Mod.Id);
/* Add the scope to the list of scopes for this module */
CollAppend (&S->Mod.Info->ScopeInfoByName, S);
}
/* Resolve the parent scope */
if (S->Parent.Id == CC65_INV_ID) {
S->Parent.Info = 0;
} else if (S->Parent.Id >= CollCount (&D->Info->ScopeInfoById)) {
ParseError (D,
CC65_ERROR,
"Invalid parent scope id %u for scope with id %u",
S->Parent.Id, S->Id);
S->Parent.Info = 0;
} else {
S->Parent.Info = CollAt (&D->Info->ScopeInfoById, S->Parent.Id);
}
/* Resolve the label */
if (S->Label.Id == CC65_INV_ID) {
S->Label.Info = 0;
} else if (S->Label.Id >= CollCount (&D->Info->SymInfoById)) {
ParseError (D,
CC65_ERROR,
"Invalid label id %u for scope with id %u",
S->Label.Id, S->Id);
S->Label.Info = 0;
} else {
S->Label.Info = CollAt (&D->Info->SymInfoById, S->Label.Id);
}
}
/* Walk over all modules and sort the scopes by name */
for (I = 0; I < CollCount (&D->Info->ModInfoById); ++I) {
/* Get this module */
ModInfo* M = CollAt (&D->Info->ModInfoById, I);
/* Sort the scopes for this module by name */
CollSort (&M->ScopeInfoByName, CompareScopeInfoByName);
}
}
@ -4651,6 +4718,45 @@ cc65_scopeinfo* cc65_scope_byid (cc65_dbginfo Handle, unsigned Id)
cc65_scopeinfo* cc65_scope_bymodule (cc65_dbginfo Handle, unsigned ModId)
/* Return the list of scopes for one module. The function returns NULL if no
* scope with the given id was found.
*/
{
DbgInfo* Info;
ModInfo* M;
cc65_scopeinfo* D;
unsigned I;
/* Check the parameter */
assert (Handle != 0);
/* The handle is actually a pointer to a debug info struct */
Info = (DbgInfo*) Handle;
/* Check if the module id is valid */
if (ModId >= CollCount (&Info->ModInfoById)) {
return 0;
}
/* Get a pointer to the module info */
M = CollAt (&Info->ModInfoById, ModId);
/* Allocate memory for the data structure returned to the caller */
D = new_cc65_scopeinfo (CollCount (&M->ScopeInfoByName));
/* Fill in the data */
for (I = 0; I < CollCount (&M->ScopeInfoByName); ++I) {
CopyScopeInfo (D->data + I, CollAt (&M->ScopeInfoByName, I));
}
/* Return the result */
return D;
}
void cc65_free_scopeinfo (cc65_dbginfo Handle, cc65_scopeinfo* Info)
/* Free a scope info record */
{

View File

@ -421,6 +421,11 @@ cc65_scopeinfo* cc65_scope_byid (cc65_dbginfo handle, unsigned id);
* with this id was found.
*/
cc65_scopeinfo* cc65_scope_bymodule (cc65_dbginfo handle, unsigned module_id);
/* Return the list of scopes for one module. The function returns NULL if no
* scope with the given id was found.
*/
void cc65_free_scopeinfo (cc65_dbginfo Handle, cc65_scopeinfo* Info);
/* Free a scope info record */