1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-25 02:29:52 +00:00

Use collections in the object file structure instead of managing the items

manually.


git-svn-id: svn://svn.cc65.org/cc65/trunk@4773 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz 2010-07-30 20:58:51 +00:00
parent 5bffbc98ff
commit f308a3c4d1
11 changed files with 135 additions and 124 deletions

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 2001-2008 Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 2001-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -53,17 +53,17 @@ void PrintDbgInfo (ObjData* O, FILE* F)
unsigned I, J;
/* Output the files section */
for (I = 0; I < O->FileCount; ++I) {
const FileInfo* FI = O->Files[I];
for (I = 0; I < CollCount (&O->Files); ++I) {
const FileInfo* FI = CollConstAt (&O->Files, I);
fprintf (F, "file\t\"%s\",size=%lu,mtime=0x%08lX\n",
GetString (FI->Name), FI->Size, FI->MTime);
}
/* Output the line infos */
for (I = 0; I < O->LineInfoCount; ++I) {
for (I = 0; I < CollCount (&O->LineInfos); ++I) {
/* Get this line info */
const LineInfo* LI = O->LineInfos[I];
const LineInfo* LI = CollConstAt (&O->LineInfos, I);
/* Get a pointer to the code ranges */
const Collection* CodeRanges = &LI->CodeRanges;

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 1998-2008 Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 1998-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -82,7 +82,7 @@ static DbgSym* NewDbgSym (unsigned char Type, unsigned char AddrSize, ObjData* O
D->Flags = 0;
D->Obj = O;
D->Expr = 0;
D->Name = 0;
D->Name = 0;
D->Type = Type;
D->AddrSize = AddrSize;
@ -99,9 +99,9 @@ static DbgSym* GetDbgSym (DbgSym* D, long Val)
{
/* Create the hash. We hash over the symbol value */
unsigned Hash = ((Val >> 24) & 0xFF) ^
((Val >> 16) & 0xFF) ^
((Val >> 8) & 0xFF) ^
((Val >> 0) & 0xFF);
((Val >> 16) & 0xFF) ^
((Val >> 8) & 0xFF) ^
((Val >> 0) & 0xFF);
/* Check for this symbol */
DbgSym* Sym = DbgSymPool[Hash];
@ -184,7 +184,7 @@ void ClearDbgSymTable (void)
long GetDbgSymVal (DbgSym* D)
long GetDbgSymVal (const DbgSym* D)
/* Get the value of this symbol */
{
CHECK (D->Expr != 0);
@ -199,12 +199,12 @@ void PrintDbgSyms (ObjData* O, FILE* F)
unsigned I;
/* Walk through all debug symbols in this module */
for (I = 0; I < O->DbgSymCount; ++I) {
for (I = 0; I < CollCount (&O->DbgSyms); ++I) {
long Val;
/* Get the next debug symbol */
DbgSym* D = O->DbgSyms [I];
DbgSym* D = CollAt (&O->DbgSyms, I);
/* Get the symbol value */
Val = GetDbgSymVal (D);
@ -237,12 +237,12 @@ void PrintDbgSymLabels (ObjData* O, FILE* F)
unsigned I;
/* Walk through all debug symbols in this module */
for (I = 0; I < O->DbgSymCount; ++I) {
for (I = 0; I < CollCount (&O->DbgSyms); ++I) {
long Val;
/* Get the next debug symbol */
DbgSym* D = O->DbgSyms [I];
DbgSym* D = CollAt (&O->DbgSyms, I);
/* Emit this symbol only if it is a label (ignore equates) */
if (IS_EXP_EQUATE (D->Type)) {

View File

@ -79,7 +79,7 @@ struct DbgSym {
DbgSym* ReadDbgSym (FILE* F, ObjData* Obj);
/* Read a debug symbol from a file, insert and return it */
long GetDbgSymVal (DbgSym* D);
long GetDbgSymVal (const DbgSym* D);
/* Get the value of this symbol */
void ClearDbgSymTable (void);

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 1998-2007 Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 1998-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -201,7 +201,7 @@ Import* GetExprImport (ExprNode* Expr)
PRECONDITION (Expr->Op == EXPR_SYMBOL);
/* Return the import */
return Expr->Obj->Imports [Expr->V.ImpNum];
return CollAt (&Expr->Obj->Imports, Expr->V.ImpNum);
}
@ -212,8 +212,8 @@ Export* GetExprExport (ExprNode* Expr)
/* Check that this is really a symbol */
PRECONDITION (Expr->Op == EXPR_SYMBOL);
/* Return the export */
return Expr->Obj->Imports [Expr->V.ImpNum]->Exp;
/* Return the export for an import*/
return GetExprImport (Expr)->Exp;
}
@ -230,7 +230,7 @@ Section* GetExprSection (ExprNode* Expr)
*/
if (Expr->Obj) {
/* Return the export */
return Expr->Obj->Sections[Expr->V.SegNum];
return CollAt (&Expr->Obj->Sections, Expr->V.SegNum);
} else {
return Expr->V.Sec;
}
@ -343,7 +343,7 @@ long GetExprVal (ExprNode* Expr)
case EXPR_BOOLXOR:
return (GetExprVal (Expr->Left) != 0) ^ (GetExprVal (Expr->Right) != 0);
case EXPR_MAX:
Left = GetExprVal (Expr->Left);
Right = GetExprVal (Expr->Right);

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 1998-2005 Ullrich von Bassewitz */
/* Römerstraße 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 1998-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -259,17 +259,15 @@ static void LibCheckExports (ObjData* O)
unsigned I;
/* Check all exports */
for (I = 0; I < O->ExportCount; ++I) {
if (IsUnresolved (O->Exports[I]->Name)) {
/* We need this module */
O->Flags |= OBJ_REF; break;
for (I = 0; I < CollCount (&O->Exports); ++I) {
const Export* E = CollConstAt (&O->Exports, I);
if (IsUnresolved (E->Name)) {
/* We need this module, insert the imports and exports */
O->Flags |= OBJ_REF;
InsertObjGlobals (O);
break;
}
}
/* If we need this module, insert the imports and exports */
if (O->Flags & OBJ_REF) {
InsertObjGlobals (O);
}
}

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 2001 Ullrich von Bassewitz */
/* Römerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 2001-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -95,8 +95,8 @@ LineInfo* ReadLineInfo (FILE* F, ObjData* O)
ReadFilePos (F, &LI->Pos);
/* Resolve the file index to a pointer to FileInfo struct */
CHECK (LI->Pos.Name < O->FileCount);
LI->File = O->Files[LI->Pos.Name];
CHECK (LI->Pos.Name < CollCount (&O->Files));
LI->File = CollAt (&O->Files, LI->Pos.Name);
/* Return the new LineInfo */
return LI;
@ -189,3 +189,4 @@ void RelocLineInfo (Segment* S)

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 1998-2005 Ullrich von Bassewitz */
/* Römerstraße 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 1998-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -86,8 +86,8 @@ void CreateMapFile (int ShortMap)
} else {
fprintf (F, "%s:\n", GetObjFileName (O));
}
for (J = 0; J < O->SectionCount; ++J) {
const Section* S = O->Sections [J];
for (J = 0; J < CollCount (&O->Sections); ++J) {
const Section* S = CollConstAt (&O->Sections, J);
/* Don't include zero sized sections if not explicitly
* requested
*/

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 1998-2003 Ullrich von Bassewitz */
/* Römerstraße 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 1998-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -49,7 +49,7 @@
/*****************************************************************************/
/* Data */
/* Data */
/*****************************************************************************/
@ -60,7 +60,7 @@ Collection ObjDataList = STATIC_COLLECTION_INITIALIZER;
/*****************************************************************************/
/* Code */
/* Code */
/*****************************************************************************/
@ -79,19 +79,19 @@ ObjData* NewObjData (void)
O->Flags = 0;
O->Start = 0;
O->ExportCount = 0;
O->Exports = 0;
O->Exports = EmptyCollection;
O->ImportCount = 0;
O->Imports = 0;
O->Imports = EmptyCollection;
O->DbgSymCount = 0;
O->DbgSyms = 0;
O->DbgSyms = EmptyCollection;
O->LineInfoCount = 0;
O->LineInfos = 0;
O->LineInfos = EmptyCollection;
O->StringCount = 0;
O->Strings = 0;
O->AssertionCount = 0;
O->Assertions = 0;
O->Assertions = EmptyCollection;
O->ScopeCount = 0;
O->Scopes = 0;
O->Scopes = EmptyCollection;
/* Return the new entry */
return O;
@ -105,16 +105,22 @@ void FreeObjData (ObjData* O)
* referenced.
*/
{
unsigned I;
/* Unused ObjData do only have the string pool, Exports and Imports. */
while (O->ExportCount) {
FreeExport (O->Exports[--O->ExportCount]);
for (I = 0; I < CollCount (&O->Exports); ++I) {
FreeExport (CollAt (&O->Exports, I));
}
xfree (O->Exports);
while (O->ImportCount) {
FreeImport (O->Imports[--O->ImportCount]);
DoneCollection (&O->Exports);
for (I = 0; I < CollCount (&O->Imports); ++I) {
FreeImport (CollAt (&O->Imports, I));
}
xfree (O->Imports);
DoneCollection (&O->Imports);
DoneCollection (&O->DbgSyms);
DoneCollection (&O->LineInfos);
xfree (O->Strings);
DoneCollection (&O->Assertions);
DoneCollection (&O->Scopes);
xfree (O);
}
@ -147,11 +153,11 @@ void InsertObjGlobals (ObjData* O)
unsigned I;
/* Insert exports and imports */
for (I = 0; I < O->ExportCount; ++I) {
InsertExport (O->Exports[I]);
for (I = 0; I < CollCount (&O->Exports); ++I) {
InsertExport (CollAt (&O->Exports, I));
}
for (I = 0; I < O->ImportCount; ++I) {
InsertImport (O->Imports[I]);
for (I = 0; I < CollCount (&O->Imports); ++I) {
InsertImport (CollAt (&O->Imports, I));
}
}
@ -193,16 +199,21 @@ const char* GetSourceFileName (const ObjData* O, unsigned Index)
} else {
/* Check the parameter */
if (Index >= O->FileCount) {
if (Index >= CollCount (&O->Files)) {
/* Error() will terminate the program */
Warning ("Invalid file index (%u) in module `%s' (input file corrupt?)",
Index, GetObjFileName (O));
return "[invalid]"; /* ### */
} else {
/* Get a pointer to the file info struct */
const FileInfo* FI = CollAt (&O->Files, Index);
/* Return the name */
return GetString (FI->Name);
}
/* Return the name */
return GetString (O->Files[Index]->Name);
}
}

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 1998-2003 Ullrich von Bassewitz */
/* Römerstraße 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 1998-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -65,23 +65,23 @@ struct ObjData {
unsigned long Start; /* Start offset of data in library */
unsigned Flags;
unsigned FileCount; /* Input file count */
struct FileInfo** Files; /* List of input files */
Collection Files; /* List of input files */
unsigned SectionCount; /* Count of sections in this object */
struct Section** Sections; /* List of all sections */
Collection Sections; /* List of all sections */
unsigned ExportCount; /* Count of exports */
struct Export** Exports; /* List of all exports */
Collection Exports; /* List of all exports */
unsigned ImportCount; /* Count of imports */
struct Import** Imports; /* List of all imports */
Collection Imports; /* List of all imports */
unsigned DbgSymCount; /* Count of debug symbols */
struct DbgSym** DbgSyms; /* List of debug symbols */
Collection DbgSyms; /* List of debug symbols */
unsigned LineInfoCount; /* Count of additional line infos */
struct LineInfo** LineInfos; /* List of additional line infos */
Collection LineInfos; /* List of additional line infos */
unsigned StringCount; /* Count of strings */
unsigned* Strings; /* List of global string indices */
unsigned AssertionCount; /* Count of module assertions */
struct Assertion** Assertions; /* List of module assertions */
Collection Assertions; /* List of module assertions */
unsigned ScopeCount; /* Count of scopes */
struct Scope** Scopes; /* List of scopes */
Collection Scopes; /* List of scopes */
};
@ -131,10 +131,10 @@ const char* GetObjFileName (const ObjData* O);
INLINE int ObjHasFiles (const ObjData* O)
/* Return true if the files list does exist */
{
return (O != 0 && O->Files != 0);
return (O != 0 && CollCount (&O->Files) != 0);
}
#else
# define ObjHasFiles(O) ((O) != 0 && (O)->Files != 0)
# define ObjHasFiles(O) ((O) != 0 && CollCount ((O)->Files) != 0)
#endif
const char* GetSourceFileName (const ObjData* O, unsigned Index);

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 1998-2003 Ullrich von Bassewitz */
/* Römerstraße 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 1998-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -120,9 +120,9 @@ void ObjReadFiles (FILE* F, unsigned long Pos, ObjData* O)
/* Read the data */
O->FileCount = ReadVar (F);
O->Files = xmalloc (O->FileCount * sizeof (O->Files[0]));
CollGrow (&O->Files, O->FileCount);
for (I = 0; I < O->FileCount; ++I) {
O->Files[I] = ReadFileInfo (F, O);
CollAppend (&O->Files, ReadFileInfo (F, O));
}
}
@ -138,9 +138,9 @@ void ObjReadSections (FILE* F, unsigned long Pos, ObjData* O)
/* Read the data */
O->SectionCount = ReadVar (F);
O->Sections = xmalloc (O->SectionCount * sizeof (O->Sections[0]));
CollGrow (&O->Sections, O->SectionCount);
for (I = 0; I < O->SectionCount; ++I) {
O->Sections [I] = ReadSection (F, O);
CollAppend (&O->Sections, ReadSection (F, O));
}
}
@ -156,9 +156,9 @@ void ObjReadImports (FILE* F, unsigned long Pos, ObjData* O)
/* Read the data */
O->ImportCount = ReadVar (F);
O->Imports = xmalloc (O->ImportCount * sizeof (O->Imports[0]));
CollGrow (&O->Imports, O->ImportCount);
for (I = 0; I < O->ImportCount; ++I) {
O->Imports [I] = ReadImport (F, O);
CollAppend (&O->Imports, ReadImport (F, O));
}
}
@ -174,9 +174,9 @@ void ObjReadExports (FILE* F, unsigned long Pos, ObjData* O)
/* Read the data */
O->ExportCount = ReadVar (F);
O->Exports = xmalloc (O->ExportCount * sizeof (O->Exports[0]));
CollGrow (&O->Exports, O->ExportCount);
for (I = 0; I < O->ExportCount; ++I) {
O->Exports [I] = ReadExport (F, O);
CollAppend (&O->Exports, ReadExport (F, O));
}
}
@ -192,9 +192,9 @@ void ObjReadDbgSyms (FILE* F, unsigned long Pos, ObjData* O)
/* Read the data */
O->DbgSymCount = ReadVar (F);
O->DbgSyms = xmalloc (O->DbgSymCount * sizeof (O->DbgSyms[0]));
CollGrow (&O->DbgSyms, O->DbgSymCount);
for (I = 0; I < O->DbgSymCount; ++I) {
O->DbgSyms [I] = ReadDbgSym (F, O);
CollAppend (&O->DbgSyms, ReadDbgSym (F, O));
}
}
@ -210,9 +210,9 @@ void ObjReadLineInfos (FILE* F, unsigned long Pos, ObjData* O)
/* Read the data */
O->LineInfoCount = ReadVar (F);
O->LineInfos = xmalloc (O->LineInfoCount * sizeof (O->LineInfos[0]));
CollGrow (&O->LineInfos, O->LineInfoCount);
for (I = 0; I < O->LineInfoCount; ++I) {
O->LineInfos[I] = ReadLineInfo (F, O);
CollAppend (&O->LineInfos, ReadLineInfo (F, O));
}
}
@ -246,9 +246,9 @@ void ObjReadAssertions (FILE* F, unsigned long Pos, ObjData* O)
/* Read the data */
O->AssertionCount = ReadVar (F);
O->Assertions = xmalloc (O->AssertionCount * sizeof (O->Assertions[0]));
CollGrow (&O->Assertions, O->AssertionCount);
for (I = 0; I < O->AssertionCount; ++I) {
O->Assertions[I] = ReadAssertion (F, O);
CollAppend (&O->Assertions, ReadAssertion (F, O));
}
}
@ -264,9 +264,9 @@ void ObjReadScopes (FILE* F, unsigned long Pos, ObjData* O)
/* Read the data */
O->ScopeCount = ReadVar (F);
O->Scopes = xmalloc (O->ScopeCount * sizeof (O->Scopes[0]));
CollGrow (&O->Scopes, O->ScopeCount);
for (I = 0; I < O->ScopeCount; ++I) {
O->Scopes[I] = 0; /* ReadScope (F, O); ### not implemented */
CollAppend (&O->Scopes, 0); /* ReadScope (F, O); ### not implemented */
}
}

View File

@ -6,10 +6,10 @@
/* */
/* */
/* */
/* (C) 1998-2003 Ullrich von Bassewitz */
/* Römerstraße 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* (C) 1998-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
@ -276,15 +276,16 @@ Section* ReadSection (FILE* F, ObjData* O)
LineInfoIndex = ReadVar (F);
if (LineInfoIndex) {
--LineInfoIndex;
if (LineInfoIndex >= O->LineInfoCount) {
if (LineInfoIndex >= CollCount (&O->LineInfos)) {
Internal ("In module `%s', file `%s', line %lu: Invalid line "
"info with index %u (max count %u)",
GetObjFileName (O),
GetSourceFileName (O, Frag->Pos.Name),
Frag->Pos.Line, LineInfoIndex, O->LineInfoCount);
Frag->Pos.Line, LineInfoIndex,
CollCount (&O->LineInfos));
}
/* Point from the fragment to the line info... */
Frag->LI = O->LineInfos[LineInfoIndex];
Frag->LI = CollAt (&O->LineInfos, LineInfoIndex);
/* ...and back from the line info to the fragment */
CollAppend (&Frag->LI->Fragments, Frag);
}