X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fld65%2Fobjfile.c;h=24a9afda81bb3f64c67623acacb23f9493b49f19;hb=35e1184901ca38bdb2e56d154ed3b71f6096eacc;hp=313977973fdfc0b67b9efa68b94dca17ab7a309f;hpb=0aa75f12d63b2f611f64aa2ef29b73e6ffcb512f;p=cc65 diff --git a/src/ld65/objfile.c b/src/ld65/objfile.c index 313977973..24a9afda8 100644 --- a/src/ld65/objfile.c +++ b/src/ld65/objfile.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998-2003 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 1998-2012, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -34,16 +34,13 @@ #include -#include -#include -#include /* EMX needs this */ -#include /* common */ #include "fname.h" #include "xmalloc.h" /* ld65 */ +#include "asserts.h" #include "dbgsyms.h" #include "error.h" #include "exports.h" @@ -52,6 +49,7 @@ #include "lineinfo.h" #include "objdata.h" #include "objfile.h" +#include "scopes.h" #include "segments.h" #include "spool.h" @@ -101,87 +99,146 @@ static void ObjReadHeader (FILE* Obj, ObjHeader* H, const char* Name) H->LineInfoSize = Read32 (Obj); H->StrPoolOffs = Read32 (Obj); H->StrPoolSize = Read32 (Obj); + H->AssertOffs = Read32 (Obj); + H->AssertSize = Read32 (Obj); + H->ScopeOffs = Read32 (Obj); + H->ScopeSize = Read32 (Obj); + H->SpanOffs = Read32 (Obj); + H->SpanSize = Read32 (Obj); } -void ObjReadFiles (FILE* F, ObjData* O) -/* Read the files list from a file at the current position */ +void ObjReadFiles (FILE* F, unsigned long Pos, ObjData* O) +/* Read the files list from a file at the given position */ { unsigned I; + unsigned FileCount; - O->FileCount = ReadVar (F); - O->Files = xmalloc (O->FileCount * sizeof (O->Files[0])); - for (I = 0; I < O->FileCount; ++I) { - O->Files[I] = ReadFileInfo (F, O); + /* Seek to the correct position */ + FileSetPos (F, Pos); + + /* Read the data */ + FileCount = ReadVar (F); + CollGrow (&O->Files, FileCount); + for (I = 0; I < FileCount; ++I) { + CollAppend (&O->Files, ReadFileInfo (F, O)); } } -void ObjReadImports (FILE* F, ObjData* O) -/* Read the imports from a file at the current position */ +void ObjReadSections (FILE* F, unsigned long Pos, ObjData* O) +/* Read the section data from a file at the given position */ { unsigned I; + unsigned SectionCount; + + /* Seek to the correct position */ + FileSetPos (F, Pos); - O->ImportCount = ReadVar (F); - O->Imports = xmalloc (O->ImportCount * sizeof (O->Imports[0])); - for (I = 0; I < O->ImportCount; ++I) { - O->Imports [I] = ReadImport (F, O); - InsertImport (O->Imports [I]); + /* Read the data */ + SectionCount = ReadVar (F); + CollGrow (&O->Sections, SectionCount); + for (I = 0; I < SectionCount; ++I) { + CollAppend (&O->Sections, ReadSection (F, O)); } } -void ObjReadExports (FILE* F, ObjData* O) -/* Read the exports from a file at the current position */ +void ObjReadImports (FILE* F, unsigned long Pos, ObjData* O) +/* Read the imports from a file at the given position */ { unsigned I; + unsigned ImportCount; - O->ExportCount = ReadVar (F); - O->Exports = xmalloc (O->ExportCount * sizeof (O->Exports[0])); - for (I = 0; I < O->ExportCount; ++I) { - O->Exports [I] = ReadExport (F, O); - InsertExport (O->Exports [I]); + /* Seek to the correct position */ + FileSetPos (F, Pos); + + /* Read the data */ + ImportCount = ReadVar (F); + CollGrow (&O->Imports, ImportCount); + for (I = 0; I < ImportCount; ++I) { + CollAppend (&O->Imports, ReadImport (F, O)); } } -void ObjReadDbgSyms (FILE* F, ObjData* O) -/* Read the debug symbols from a file at the current position */ +void ObjReadExports (FILE* F, unsigned long Pos, ObjData* O) +/* Read the exports from a file at the given position */ { unsigned I; + unsigned ExportCount; + + /* Seek to the correct position */ + FileSetPos (F, Pos); - O->DbgSymCount = ReadVar (F); - O->DbgSyms = xmalloc (O->DbgSymCount * sizeof (O->DbgSyms[0])); - for (I = 0; I < O->DbgSymCount; ++I) { - O->DbgSyms [I] = ReadDbgSym (F, O); + /* Read the data */ + ExportCount = ReadVar (F); + CollGrow (&O->Exports, ExportCount); + for (I = 0; I < ExportCount; ++I) { + CollAppend (&O->Exports, ReadExport (F, O)); } } -void ObjReadLineInfos (FILE* F, ObjData* O) -/* Read the line infos from a file at the current position */ +void ObjReadDbgSyms (FILE* F, unsigned long Pos, ObjData* O) +/* Read the debug symbols from a file at the given position */ { unsigned I; + unsigned DbgSymCount; + + /* Seek to the correct position */ + FileSetPos (F, Pos); + + /* Read the asm debug symbols */ + DbgSymCount = ReadVar (F); + CollGrow (&O->DbgSyms, DbgSymCount); + for (I = 0; I < DbgSymCount; ++I) { + CollAppend (&O->DbgSyms, ReadDbgSym (F, O, I)); + } - O->LineInfoCount = ReadVar (F); - O->LineInfos = xmalloc (O->LineInfoCount * sizeof (O->LineInfos[0])); - for (I = 0; I < O->LineInfoCount; ++I) { - O->LineInfos[I] = ReadLineInfo (F, O); + /* Read the hll debug symbols */ + DbgSymCount = ReadVar (F); + CollGrow (&O->HLLDbgSyms, DbgSymCount); + for (I = 0; I < DbgSymCount; ++I) { + CollAppend (&O->HLLDbgSyms, ReadHLLDbgSym (F, O, I)); } } -void ObjReadStrPool (FILE* F, ObjData* O) -/* Read the string pool from a file at the current position */ +void ObjReadLineInfos (FILE* F, unsigned long Pos, ObjData* O) +/* Read the line infos from a file at the given position */ { unsigned I; + unsigned LineInfoCount; + + /* Seek to the correct position */ + FileSetPos (F, Pos); + + /* Read the data */ + LineInfoCount = ReadVar (F); + CollGrow (&O->LineInfos, LineInfoCount); + for (I = 0; I < LineInfoCount; ++I) { + CollAppend (&O->LineInfos, ReadLineInfo (F, O)); + } +} + + +void ObjReadStrPool (FILE* F, unsigned long Pos, ObjData* O) +/* Read the string pool from a file at the given position */ +{ + unsigned I; + + /* Seek to the correct position */ + FileSetPos (F, Pos); + + /* Read the data */ O->StringCount = ReadVar (F); O->Strings = xmalloc (O->StringCount * sizeof (O->Strings[0])); for (I = 0; I < O->StringCount; ++I) { @@ -191,15 +248,58 @@ void ObjReadStrPool (FILE* F, ObjData* O) -void ObjReadSections (FILE* F, ObjData* O) -/* Read the section data from a file at the current position */ +void ObjReadAssertions (FILE* F, unsigned long Pos, ObjData* O) +/* Read the assertions from a file at the given offset */ { unsigned I; + unsigned AssertionCount; + + /* Seek to the correct position */ + FileSetPos (F, Pos); - O->SectionCount = ReadVar (F); - O->Sections = xmalloc (O->SectionCount * sizeof (O->Sections[0])); - for (I = 0; I < O->SectionCount; ++I) { - O->Sections [I] = ReadSection (F, O); + /* Read the data */ + AssertionCount = ReadVar (F); + CollGrow (&O->Assertions, AssertionCount); + for (I = 0; I < AssertionCount; ++I) { + CollAppend (&O->Assertions, ReadAssertion (F, O)); + } +} + + + +void ObjReadScopes (FILE* F, unsigned long Pos, ObjData* O) +/* Read the scope table from a file at the given offset */ +{ + unsigned I; + unsigned ScopeCount; + + /* Seek to the correct position */ + FileSetPos (F, Pos); + + /* Read the data */ + ScopeCount = ReadVar (F); + CollGrow (&O->Scopes, ScopeCount); + for (I = 0; I < ScopeCount; ++I) { + CollAppend (&O->Scopes, ReadScope (F, O, I)); + } +} + + + +void ObjReadSpans (FILE* F, unsigned long Pos, ObjData* O) +/* Read the span table from a file at the given offset */ +{ + unsigned I; + unsigned SpanCount; + + /* Seek to the correct position */ + FileSetPos (F, Pos); + + /* Read the data */ + SpanCount = ReadVar (F); + CollGrow (&O->Spans, SpanCount); + for (I = 0; I < SpanCount; ++I) { + CollAppend (&O->Spans, ReadSpan (F, O, I)); } } @@ -221,35 +321,39 @@ void ObjAdd (FILE* Obj, const char* Name) O->Name = GetModule (Name); /* Read the string pool from the object file */ - fseek (Obj, O->Header.StrPoolOffs, SEEK_SET); - ObjReadStrPool (Obj, O); + ObjReadStrPool (Obj, O->Header.StrPoolOffs, O); /* Read the files list from the object file */ - fseek (Obj, O->Header.FileOffs, SEEK_SET); - ObjReadFiles (Obj, O); + ObjReadFiles (Obj, O->Header.FileOffs, O); + + /* Read the line infos from the object file */ + ObjReadLineInfos (Obj, O->Header.LineInfoOffs, O); /* Read the imports list from the object file */ - fseek (Obj, O->Header.ImportOffs, SEEK_SET); - ObjReadImports (Obj, O); + ObjReadImports (Obj, O->Header.ImportOffs, O); /* Read the object file exports and insert them into the exports list */ - fseek (Obj, O->Header.ExportOffs, SEEK_SET); - ObjReadExports (Obj, O); + ObjReadExports (Obj, O->Header.ExportOffs, O); /* Read the object debug symbols from the object file */ - fseek (Obj, O->Header.DbgSymOffs, SEEK_SET); - ObjReadDbgSyms (Obj, O); + ObjReadDbgSyms (Obj, O->Header.DbgSymOffs, O); - /* Read the line infos from the object file */ - fseek (Obj, O->Header.LineInfoOffs, SEEK_SET); - ObjReadLineInfos (Obj, O); + /* Read the assertions from the object file */ + ObjReadAssertions (Obj, O->Header.AssertOffs, O); - /* Read the segment list from the object file. This must be last, since + /* Read the segment list from the object file. This must be late, since * the expressions stored in the code may reference segments or imported * symbols. */ - fseek (Obj, O->Header.SegOffs, SEEK_SET); - ObjReadSections (Obj, O); + ObjReadSections (Obj, O->Header.SegOffs, O); + + /* Read the scope table from the object file. Scopes reference segments, so + * we must read them after the sections. + */ + ObjReadScopes (Obj, O->Header.ScopeOffs, O); + + /* Read the spans from the object file */ + ObjReadSpans (Obj, O->Header.SpanOffs, O); /* Mark this object file as needed */ O->Flags |= OBJ_REF; @@ -257,13 +361,16 @@ void ObjAdd (FILE* Obj, const char* Name) /* Done, close the file (we read it only, so no error check) */ fclose (Obj); + /* Insert the imports and exports to the global lists */ + InsertObjGlobals (O); + + /* Insert the object into the list of all used object files */ + InsertObjData (O); + /* All references to strings are now resolved, so we can delete the module * string pool. */ FreeObjStrings (O); - - /* Insert the object into the list of all used object files */ - InsertObjData (O); }