X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fld65%2Fobjdata.c;h=2a7a0ac1d9a9f1161c6fe246da4e2294193c68fc;hb=35e1184901ca38bdb2e56d154ed3b71f6096eacc;hp=ade6192a7e54c1d24e5b9f9aabad95bdb4bbdc42;hpb=23b867b7a4ee466062e4e6538d3f2de6c83d2ac4;p=cc65 diff --git a/src/ld65/objdata.c b/src/ld65/objdata.c index ade6192a7..2a7a0ac1d 100644 --- a/src/ld65/objdata.c +++ b/src/ld65/objdata.c @@ -6,7 +6,7 @@ /* */ /* */ /* */ -/* (C) 1998-2010, Ullrich von Bassewitz */ +/* (C) 1998-2011, Ullrich von Bassewitz */ /* Roemerstrasse 52 */ /* D-70794 Filderstadt */ /* EMail: uz@cc65.org */ @@ -43,6 +43,7 @@ #include "error.h" #include "exports.h" #include "fileinfo.h" +#include "library.h" #include "objdata.h" #include "spool.h" @@ -74,24 +75,26 @@ ObjData* NewObjData (void) /* Initialize the data */ O->Next = 0; O->Name = INVALID_STRING_ID; - O->LibName = INVALID_STRING_ID; + O->Lib = 0; O->MTime = 0; - O->Flags = 0; O->Start = 0; - O->ExportCount = 0; + O->Flags = 0; + O->HLLSymBaseId = 0; + O->SymBaseId = 0; + O->ScopeBaseId = 0; + O->SpanBaseId = 0; + O->Files = EmptyCollection; + O->Sections = EmptyCollection; O->Exports = EmptyCollection; - O->ImportCount = 0; O->Imports = EmptyCollection; - O->DbgSymCount = 0; O->DbgSyms = EmptyCollection; - O->LineInfoCount = 0; + O->HLLDbgSyms = EmptyCollection; O->LineInfos = EmptyCollection; O->StringCount = 0; O->Strings = 0; - O->AssertionCount = 0; O->Assertions = EmptyCollection; - O->ScopeCount = 0; O->Scopes = EmptyCollection; + O->Spans = EmptyCollection; /* Return the new entry */ return O; @@ -107,20 +110,34 @@ void FreeObjData (ObjData* O) { unsigned I; - /* Unused ObjData do only have the string pool, Exports and Imports. */ + for (I = 0; I < CollCount (&O->Files); ++I) { + CollDeleteItem (&((FileInfo*) CollAtUnchecked (&O->Files, I))->Modules, O); + } + DoneCollection (&O->Files); + DoneCollection (&O->Sections); for (I = 0; I < CollCount (&O->Exports); ++I) { - FreeExport (CollAt (&O->Exports, I)); + FreeExport (CollAtUnchecked (&O->Exports, I)); } DoneCollection (&O->Exports); for (I = 0; I < CollCount (&O->Imports); ++I) { - FreeImport (CollAt (&O->Imports, I)); + FreeImport (CollAtUnchecked (&O->Imports, I)); } DoneCollection (&O->Imports); DoneCollection (&O->DbgSyms); + DoneCollection (&O->HLLDbgSyms); + + for (I = 0; I < CollCount (&O->LineInfos); ++I) { + FreeLineInfo (CollAtUnchecked (&O->LineInfos, I)); + } DoneCollection (&O->LineInfos); xfree (O->Strings); DoneCollection (&O->Assertions); DoneCollection (&O->Scopes); + for (I = 0; I < CollCount (&O->Spans); ++I) { + FreeSpan (CollAtUnchecked (&O->Spans, I)); + } + DoneCollection (&O->Spans); + xfree (O); } @@ -185,36 +202,112 @@ const char* GetObjFileName (const ObjData* O) -const char* GetSourceFileName (const ObjData* O, unsigned Index) -/* Get the name of the source file with the given index. If O is NULL, return - * "[linker generated]" as the file name. - */ +const struct StrBuf* GetObjString (const ObjData* Obj, unsigned Id) +/* Get a string from an object file checking for an invalid index */ { - /* Check if we have an object file */ - if (O == 0) { + return GetStrBuf (MakeGlobalStringId (Obj, Id)); +} - /* No object file */ - return "[linker generated]"; - } else { - /* Check the parameter */ - 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]"; /* ### */ +struct Section* GetObjSection (const ObjData* O, unsigned Id) +/* Get a section from an object file checking for a valid index */ +{ + if (Id >= CollCount (&O->Sections)) { + Error ("Invalid section index (%u) in module `%s'", + Id, GetObjFileName (O)); + } + return CollAtUnchecked (&O->Sections, Id); +} - } else { - /* Get a pointer to the file info struct */ - const FileInfo* FI = CollConstAt (&O->Files, Index); - /* Return the name */ - return GetString (FI->Name); +struct Import* GetObjImport (const ObjData* O, unsigned Id) +/* Get an import from an object file checking for a valid index */ +{ + if (Id >= CollCount (&O->Imports)) { + Error ("Invalid import index (%u) in module `%s'", + Id, GetObjFileName (O)); + } + return CollAtUnchecked (&O->Imports, Id); +} + + + +struct Export* GetObjExport (const ObjData* O, unsigned Id) +/* Get an export from an object file checking for a valid index */ +{ + if (Id >= CollCount (&O->Exports)) { + Error ("Invalid export index (%u) in module `%s'", + Id, GetObjFileName (O)); + } + return CollAtUnchecked (&O->Exports, Id); +} + + +struct DbgSym* GetObjDbgSym (const ObjData* O, unsigned Id) +/* Get a debug symbol from an object file checking for a valid index */ +{ + if (Id >= CollCount (&O->DbgSyms)) { + Error ("Invalid debug symbol index (%u) in module `%s'", + Id, GetObjFileName (O)); + } + return CollAtUnchecked (&O->DbgSyms, Id); +} + + + +struct Scope* GetObjScope (const ObjData* O, unsigned Id) +/* Get a scope from an object file checking for a valid index */ +{ + if (Id >= CollCount (&O->Scopes)) { + Error ("Invalid scope index (%u) in module `%s'", + Id, GetObjFileName (O)); + } + return CollAtUnchecked (&O->Scopes, Id); +} + + + +unsigned ObjDataCount (void) +/* Return the total number of modules */ +{ + return CollCount (&ObjDataList); +} + + + +void PrintDbgModules (FILE* F) +/* Output the modules to a debug info file */ +{ + unsigned I; + + /* Output modules */ + for (I = 0; I < CollCount (&ObjDataList); ++I) { + + /* Get this object file */ + const ObjData* O = CollConstAt (&ObjDataList, I); + + /* The main source file is the one at index zero */ + const FileInfo* Source = CollConstAt (&O->Files, 0); + + /* Output the module line */ + fprintf (F, + "mod\tid=%u,name=\"%s\",file=%u", + I, + GetObjFileName (O), + Source->Id); + + /* Add library if any */ + if (O->Lib != 0) { + fprintf (F, ",lib=%u", GetLibId (O->Lib)); } + + /* Terminate the output line */ + fputc ('\n', F); } + }