mirror of
https://github.com/cc65/cc65.git
synced 2025-01-05 15:30:44 +00:00
Postprocess module infos. Add new index for modules sorted by name.
git-svn-id: svn://svn.cc65.org/cc65/trunk@5147 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
060b297a78
commit
ebfa369319
@ -184,6 +184,7 @@ struct DbgInfo {
|
||||
|
||||
/* Collections with other sort criteria */
|
||||
Collection FileInfoByName; /* File infos sorted by name */
|
||||
Collection ModInfoByName; /* Module info sorted by name */
|
||||
Collection SegInfoByName; /* Segment infos sorted by name */
|
||||
Collection SymInfoByName; /* Symbol infos sorted by name */
|
||||
Collection SymInfoByVal; /* Symbol infos sorted by value */
|
||||
@ -1711,6 +1712,7 @@ static DbgInfo* NewDbgInfo (void)
|
||||
CollInit (&Info->SymInfoById);
|
||||
|
||||
CollInit (&Info->FileInfoByName);
|
||||
CollInit (&Info->ModInfoByName);
|
||||
CollInit (&Info->SegInfoByName);
|
||||
CollInit (&Info->SymInfoByName);
|
||||
CollInit (&Info->SymInfoByVal);
|
||||
@ -1751,7 +1753,7 @@ static void FreeDbgInfo (DbgInfo* Info)
|
||||
FreeSymInfo (CollAt (&Info->SymInfoById, I));
|
||||
}
|
||||
|
||||
/* Free the memory used by the collections themselves */
|
||||
/* Free the memory used by the id collections */
|
||||
CollDone (&Info->FileInfoById);
|
||||
CollDone (&Info->LibInfoById);
|
||||
CollDone (&Info->LineInfoById);
|
||||
@ -1760,7 +1762,9 @@ static void FreeDbgInfo (DbgInfo* Info)
|
||||
CollDone (&Info->SegInfoById);
|
||||
CollDone (&Info->SymInfoById);
|
||||
|
||||
/* Free the memory used by the other collections */
|
||||
CollDone (&Info->FileInfoByName);
|
||||
CollDone (&Info->ModInfoByName);
|
||||
CollDone (&Info->SegInfoByName);
|
||||
CollDone (&Info->SymInfoByName);
|
||||
CollDone (&Info->SymInfoByVal);
|
||||
@ -2332,7 +2336,8 @@ static void ParseInfo (InputData* D)
|
||||
switch (Tok) {
|
||||
|
||||
case TOK_FILE:
|
||||
CollGrow (&D->Info->FileInfoById, D->IVal);
|
||||
CollGrow (&D->Info->FileInfoById, D->IVal);
|
||||
CollGrow (&D->Info->FileInfoByName, D->IVal);
|
||||
break;
|
||||
|
||||
case TOK_LIBRARY:
|
||||
@ -2340,11 +2345,12 @@ static void ParseInfo (InputData* D)
|
||||
break;
|
||||
|
||||
case TOK_LINE:
|
||||
/*CollGrow (&D->Info->LineInfoById, D->IVal);*/
|
||||
CollGrow (&D->Info->LineInfoById, D->IVal);
|
||||
break;
|
||||
|
||||
case TOK_MODULE:
|
||||
CollGrow (&D->Info->ModInfoById, D->IVal);
|
||||
CollGrow (&D->Info->ModInfoById, D->IVal);
|
||||
CollGrow (&D->Info->ModInfoByName, D->IVal);
|
||||
break;
|
||||
|
||||
case TOK_SCOPE:
|
||||
@ -2352,11 +2358,14 @@ static void ParseInfo (InputData* D)
|
||||
break;
|
||||
|
||||
case TOK_SEGMENT:
|
||||
CollGrow (&D->Info->SegInfoById, D->IVal);
|
||||
CollGrow (&D->Info->SegInfoById, D->IVal);
|
||||
CollGrow (&D->Info->SegInfoByName, D->IVal);
|
||||
break;
|
||||
|
||||
case TOK_SYM:
|
||||
CollGrow (&D->Info->SymInfoById, D->IVal);
|
||||
CollGrow (&D->Info->SymInfoById, D->IVal);
|
||||
CollGrow (&D->Info->SymInfoByName, D->IVal);
|
||||
CollGrow (&D->Info->SymInfoByVal, D->IVal);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -2800,6 +2809,7 @@ static void ParseModule (InputData* D)
|
||||
|
||||
/* ... and remember it */
|
||||
CollReplaceExpand (&D->Info->ModInfoById, M, Id);
|
||||
CollAppend (&D->Info->ModInfoByName, M);
|
||||
|
||||
ErrorExit:
|
||||
/* Entry point in case of errors */
|
||||
@ -2809,9 +2819,6 @@ ErrorExit:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static void ParseScope (InputData* D)
|
||||
/* Parse a SCOPE line */
|
||||
{
|
||||
@ -3517,11 +3524,159 @@ static int FindFileInfoByName (Collection* FileInfos, const char* Name,
|
||||
|
||||
|
||||
|
||||
static void ProcessSegInfo (InputData* D)
|
||||
/* Postprocess segment infos */
|
||||
static LineInfoListEntry* FindLineInfoByAddr (const LineInfoList* L, cc65_addr Addr)
|
||||
/* Find the index of a LineInfo for a given address. Returns 0 if no such
|
||||
* lineinfo was found.
|
||||
*/
|
||||
{
|
||||
/* Sort the segment infos by name */
|
||||
CollSort (&D->Info->SegInfoByName, CompareSegInfoByName);
|
||||
/* Do a binary search */
|
||||
int Lo = 0;
|
||||
int Hi = (int) L->Count - 1;
|
||||
while (Lo <= Hi) {
|
||||
|
||||
/* Mid of range */
|
||||
int Cur = (Lo + Hi) / 2;
|
||||
|
||||
/* Get item */
|
||||
LineInfoListEntry* CurItem = &L->List[Cur];
|
||||
|
||||
/* Found? */
|
||||
if (CurItem->Addr > Addr) {
|
||||
Hi = Cur - 1;
|
||||
} else if (CurItem->Addr < Addr) {
|
||||
Lo = Cur + 1;
|
||||
} else {
|
||||
/* Found */
|
||||
return CurItem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Not found */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int FindLineInfoByLine (Collection* LineInfos, cc65_line Line,
|
||||
unsigned* Index)
|
||||
/* Find the LineInfo for a given line number. The function returns true if the
|
||||
* line was found. In this case, Index contains the index of the first item
|
||||
* that matches. If the item wasn't found, the function returns false and
|
||||
* Index contains the insert position for the line.
|
||||
*/
|
||||
{
|
||||
/* Do a binary search */
|
||||
int Lo = 0;
|
||||
int Hi = (int) CollCount (LineInfos) - 1;
|
||||
int Found = 0;
|
||||
while (Lo <= Hi) {
|
||||
|
||||
/* Mid of range */
|
||||
int Cur = (Lo + Hi) / 2;
|
||||
|
||||
/* Get item */
|
||||
const LineInfo* CurItem = CollAt (LineInfos, Cur);
|
||||
|
||||
/* Found? */
|
||||
if (Line > CurItem->Line) {
|
||||
Lo = Cur + 1;
|
||||
} else {
|
||||
Hi = Cur - 1;
|
||||
/* Since we may have duplicates, repeat the search until we've
|
||||
* the first item that has a match.
|
||||
*/
|
||||
if (Line == CurItem->Line) {
|
||||
Found = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Pass back the index. This is also the insert position */
|
||||
*Index = Lo;
|
||||
return Found;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int FindSymInfoByName (Collection* SymInfos, const char* Name, unsigned* Index)
|
||||
/* Find the SymInfo for a given file name. The function returns true if the
|
||||
* name was found. In this case, Index contains the index of the first item
|
||||
* that matches. If the item wasn't found, the function returns false and
|
||||
* Index contains the insert position for Name.
|
||||
*/
|
||||
{
|
||||
/* Do a binary search */
|
||||
int Lo = 0;
|
||||
int Hi = (int) CollCount (SymInfos) - 1;
|
||||
int Found = 0;
|
||||
while (Lo <= Hi) {
|
||||
|
||||
/* Mid of range */
|
||||
int Cur = (Lo + Hi) / 2;
|
||||
|
||||
/* Get item */
|
||||
SymInfo* CurItem = CollAt (SymInfos, Cur);
|
||||
|
||||
/* Compare */
|
||||
int Res = strcmp (CurItem->Name, Name);
|
||||
|
||||
/* Found? */
|
||||
if (Res < 0) {
|
||||
Lo = Cur + 1;
|
||||
} else {
|
||||
Hi = Cur - 1;
|
||||
/* Since we may have duplicates, repeat the search until we've
|
||||
* the first item that has a match.
|
||||
*/
|
||||
if (Res == 0) {
|
||||
Found = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Pass back the index. This is also the insert position */
|
||||
*Index = Lo;
|
||||
return Found;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int FindSymInfoByValue (Collection* SymInfos, long Value, unsigned* Index)
|
||||
/* Find the SymInfo for a given value. The function returns true if the
|
||||
* value was found. In this case, Index contains the index of the first item
|
||||
* that matches. If the item wasn't found, the function returns false and
|
||||
* Index contains the insert position for the given value.
|
||||
*/
|
||||
{
|
||||
/* Do a binary search */
|
||||
int Lo = 0;
|
||||
int Hi = (int) CollCount (SymInfos) - 1;
|
||||
int Found = 0;
|
||||
while (Lo <= Hi) {
|
||||
|
||||
/* Mid of range */
|
||||
int Cur = (Lo + Hi) / 2;
|
||||
|
||||
/* Get item */
|
||||
SymInfo* CurItem = CollAt (SymInfos, Cur);
|
||||
|
||||
/* Found? */
|
||||
if (Value > CurItem->Value) {
|
||||
Lo = Cur + 1;
|
||||
} else {
|
||||
Hi = Cur - 1;
|
||||
/* Since we may have duplicates, repeat the search until we've
|
||||
* the first item that has a match.
|
||||
*/
|
||||
if (Value == CurItem->Value) {
|
||||
Found = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Pass back the index. This is also the insert position */
|
||||
*Index = Lo;
|
||||
return Found;
|
||||
}
|
||||
|
||||
|
||||
@ -3666,76 +3821,120 @@ static void ProcessLineInfo (InputData* D)
|
||||
|
||||
|
||||
|
||||
static LineInfoListEntry* FindLineInfoByAddr (const LineInfoList* L, cc65_addr Addr)
|
||||
/* Find the index of a LineInfo for a given address. Returns 0 if no such
|
||||
* lineinfo was found.
|
||||
*/
|
||||
static void ProcessModInfo (InputData* D)
|
||||
/* Postprocess module infos */
|
||||
{
|
||||
/* Do a binary search */
|
||||
int Lo = 0;
|
||||
int Hi = (int) L->Count - 1;
|
||||
while (Lo <= Hi) {
|
||||
unsigned I;
|
||||
|
||||
/* Mid of range */
|
||||
int Cur = (Lo + Hi) / 2;
|
||||
/* Walk over all scopes and resolve the ids */
|
||||
for (I = 0; I < CollCount (&D->Info->ModInfoById); ++I) {
|
||||
|
||||
/* Get item */
|
||||
LineInfoListEntry* CurItem = &L->List[Cur];
|
||||
/* Get this module info */
|
||||
ModInfo* M = CollAt (&D->Info->ModInfoById, I);
|
||||
|
||||
/* Found? */
|
||||
if (CurItem->Addr > Addr) {
|
||||
Hi = Cur - 1;
|
||||
} else if (CurItem->Addr < Addr) {
|
||||
Lo = Cur + 1;
|
||||
/* Resolve the main file */
|
||||
if (M->File.Id >= CollCount (&D->Info->FileInfoById)) {
|
||||
ParseError (D,
|
||||
CC65_ERROR,
|
||||
"Invalid file id %u for module with id %u",
|
||||
M->File.Id, M->Id);
|
||||
M->File.Info = 0;
|
||||
} else {
|
||||
/* Found */
|
||||
return CurItem;
|
||||
M->File.Info = CollAt (&D->Info->FileInfoById, M->File.Id);
|
||||
}
|
||||
|
||||
/* Resolve the library */
|
||||
if (M->Lib.Id == CC65_INV_ID) {
|
||||
M->Lib.Info = 0;
|
||||
} else if (M->Lib.Id >= CollCount (&D->Info->LibInfoById)) {
|
||||
ParseError (D,
|
||||
CC65_ERROR,
|
||||
"Invalid library id %u for module with id %u",
|
||||
M->Lib.Id, M->Id);
|
||||
M->Lib.Info = 0;
|
||||
} else {
|
||||
M->Lib.Info = CollAt (&D->Info->LibInfoById, M->Lib.Id);
|
||||
}
|
||||
}
|
||||
|
||||
/* Not found */
|
||||
return 0;
|
||||
/* Sort the collection that contains the module info by name */
|
||||
CollSort (&D->Info->ModInfoByName, CompareModInfoByName);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int FindLineInfoByLine (Collection* LineInfos, cc65_line Line,
|
||||
unsigned* Index)
|
||||
/* Find the LineInfo for a given line number. The function returns true if the
|
||||
* line was found. In this case, Index contains the index of the first item
|
||||
* that matches. If the item wasn't found, the function returns false and
|
||||
* Index contains the insert position for the line.
|
||||
*/
|
||||
static void ProcessScopeInfo (InputData* D)
|
||||
/* Postprocess scope infos */
|
||||
{
|
||||
/* Do a binary search */
|
||||
int Lo = 0;
|
||||
int Hi = (int) CollCount (LineInfos) - 1;
|
||||
int Found = 0;
|
||||
while (Lo <= Hi) {
|
||||
unsigned I;
|
||||
|
||||
/* Mid of range */
|
||||
int Cur = (Lo + Hi) / 2;
|
||||
/* 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 item */
|
||||
const LineInfo* CurItem = CollAt (LineInfos, Cur);
|
||||
/* Get this scope info */
|
||||
ScopeInfo* S = CollAt (&D->Info->ScopeInfoById, I);
|
||||
|
||||
/* Found? */
|
||||
if (Line > CurItem->Line) {
|
||||
Lo = Cur + 1;
|
||||
/* 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 {
|
||||
Hi = Cur - 1;
|
||||
/* Since we may have duplicates, repeat the search until we've
|
||||
* the first item that has a match.
|
||||
*/
|
||||
if (Line == CurItem->Line) {
|
||||
Found = 1;
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/* Pass back the index. This is also the insert position */
|
||||
*Index = Lo;
|
||||
return Found;
|
||||
/* 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void ProcessSegInfo (InputData* D)
|
||||
/* Postprocess segment infos */
|
||||
{
|
||||
/* Sort the segment infos by name */
|
||||
CollSort (&D->Info->SegInfoByName, CompareSegInfoByName);
|
||||
}
|
||||
|
||||
|
||||
@ -3822,156 +4021,6 @@ static void ProcessSymInfo (InputData* D)
|
||||
|
||||
|
||||
|
||||
static int FindSymInfoByName (Collection* SymInfos, const char* Name, unsigned* Index)
|
||||
/* Find the SymInfo for a given file name. The function returns true if the
|
||||
* name was found. In this case, Index contains the index of the first item
|
||||
* that matches. If the item wasn't found, the function returns false and
|
||||
* Index contains the insert position for Name.
|
||||
*/
|
||||
{
|
||||
/* Do a binary search */
|
||||
int Lo = 0;
|
||||
int Hi = (int) CollCount (SymInfos) - 1;
|
||||
int Found = 0;
|
||||
while (Lo <= Hi) {
|
||||
|
||||
/* Mid of range */
|
||||
int Cur = (Lo + Hi) / 2;
|
||||
|
||||
/* Get item */
|
||||
SymInfo* CurItem = CollAt (SymInfos, Cur);
|
||||
|
||||
/* Compare */
|
||||
int Res = strcmp (CurItem->Name, Name);
|
||||
|
||||
/* Found? */
|
||||
if (Res < 0) {
|
||||
Lo = Cur + 1;
|
||||
} else {
|
||||
Hi = Cur - 1;
|
||||
/* Since we may have duplicates, repeat the search until we've
|
||||
* the first item that has a match.
|
||||
*/
|
||||
if (Res == 0) {
|
||||
Found = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Pass back the index. This is also the insert position */
|
||||
*Index = Lo;
|
||||
return Found;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int FindSymInfoByValue (Collection* SymInfos, long Value, unsigned* Index)
|
||||
/* Find the SymInfo for a given value. The function returns true if the
|
||||
* value was found. In this case, Index contains the index of the first item
|
||||
* that matches. If the item wasn't found, the function returns false and
|
||||
* Index contains the insert position for the given value.
|
||||
*/
|
||||
{
|
||||
/* Do a binary search */
|
||||
int Lo = 0;
|
||||
int Hi = (int) CollCount (SymInfos) - 1;
|
||||
int Found = 0;
|
||||
while (Lo <= Hi) {
|
||||
|
||||
/* Mid of range */
|
||||
int Cur = (Lo + Hi) / 2;
|
||||
|
||||
/* Get item */
|
||||
SymInfo* CurItem = CollAt (SymInfos, Cur);
|
||||
|
||||
/* Found? */
|
||||
if (Value > CurItem->Value) {
|
||||
Lo = Cur + 1;
|
||||
} else {
|
||||
Hi = Cur - 1;
|
||||
/* Since we may have duplicates, repeat the search until we've
|
||||
* the first item that has a match.
|
||||
*/
|
||||
if (Value == CurItem->Value) {
|
||||
Found = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Pass back the index. This is also the insert position */
|
||||
*Index = Lo;
|
||||
return Found;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void ProcessScopeInfo (InputData* D)
|
||||
/* Postprocess scope infos */
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* Debug info files */
|
||||
/*****************************************************************************/
|
||||
@ -4139,11 +4188,12 @@ CloseAndExit:
|
||||
/* We do now have all the information from the input file. Do
|
||||
* postprocessing.
|
||||
*/
|
||||
ProcessSegInfo (&D);
|
||||
ProcessFileInfo (&D);
|
||||
ProcessLineInfo (&D);
|
||||
ProcessSymInfo (&D);
|
||||
ProcessModInfo (&D);
|
||||
ProcessScopeInfo (&D);
|
||||
ProcessSegInfo (&D);
|
||||
ProcessSymInfo (&D);
|
||||
|
||||
#if DEBUG
|
||||
/* Debug output */
|
||||
|
Loading…
Reference in New Issue
Block a user