From bfbedfa54b98d059c62f82609a0966f4acddd174 Mon Sep 17 00:00:00 2001 From: cuz Date: Wed, 23 May 2001 19:03:40 +0000 Subject: [PATCH] Added line infos git-svn-id: svn://svn.cc65.org/cc65/trunk@748 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/ar65/objfile.c | 48 ++++++++++++++----------- src/ca65/dbginfo.c | 14 ++++++++ src/ca65/lineinfo.c | 43 +++++++++++++++++++++++ src/ca65/lineinfo.h | 14 ++++++++ src/ca65/main.c | 7 ++++ src/ca65/objcode.c | 7 ++++ src/ca65/objfile.c | 8 +++-- src/ca65/pseudo.c | 3 -- src/cc65/codeseg.c | 5 +++ src/common/libdefs.h | 2 +- src/common/objdefs.h | 6 ++-- src/ld65/fragment.c | 5 +-- src/ld65/fragment.h | 5 +-- src/ld65/lineinfo.c | 81 +++++++++++++++++++++++++++++++++++++++++++ src/ld65/lineinfo.h | 79 +++++++++++++++++++++++++++++++++++++++++ src/ld65/make/gcc.mak | 1 + src/ld65/objdata.c | 11 +++--- src/ld65/objdata.h | 13 ++++--- src/ld65/objfile.c | 49 ++++++++++++++++++-------- src/ld65/segments.c | 19 ++++++++-- src/ld65/segments.h | 4 +-- src/od65/dump.c | 71 ++++++++++++++++++++++++++++++++----- src/od65/dump.h | 11 +++--- src/od65/fileio.c | 4 ++- src/od65/global.h | 1 + src/od65/main.c | 17 +++++++-- 26 files changed, 451 insertions(+), 77 deletions(-) create mode 100644 src/ld65/lineinfo.c create mode 100644 src/ld65/lineinfo.h diff --git a/src/ar65/objfile.c b/src/ar65/objfile.c index 6fb40f9af..28d133201 100644 --- a/src/ar65/objfile.c +++ b/src/ar65/objfile.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* (C) 1998-2001 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -47,7 +47,7 @@ /* common */ #include "xmalloc.h" - + /* ar65 */ #include "error.h" #include "objdata.h" @@ -94,19 +94,21 @@ void ObjReadHeader (FILE* Obj, ObjHeader* H, const char* Name) if (H->Version != OBJ_VERSION) { Error ("Object file `%s' has wrong version", Name); } - H->Flags = Read16 (Obj); - H->OptionOffs = Read32 (Obj); - H->OptionSize = Read32 (Obj); - H->FileOffs = Read32 (Obj); - H->FileSize = Read32 (Obj); - H->SegOffs = Read32 (Obj); - H->SegSize = Read32 (Obj); - H->ImportOffs = Read32 (Obj); - H->ImportSize = Read32 (Obj); - H->ExportOffs = Read32 (Obj); - H->ExportSize = Read32 (Obj); - H->DbgSymOffs = Read32 (Obj); - H->DbgSymSize = Read32 (Obj); + H->Flags = Read16 (Obj); + H->OptionOffs = Read32 (Obj); + H->OptionSize = Read32 (Obj); + H->FileOffs = Read32 (Obj); + H->FileSize = Read32 (Obj); + H->SegOffs = Read32 (Obj); + H->SegSize = Read32 (Obj); + H->ImportOffs = Read32 (Obj); + H->ImportSize = Read32 (Obj); + H->ExportOffs = Read32 (Obj); + H->ExportSize = Read32 (Obj); + H->DbgSymOffs = Read32 (Obj); + H->DbgSymSize = Read32 (Obj); + H->LineInfoOffs = Read32 (Obj); + H->LineInfoSize = Read32 (Obj); } @@ -129,6 +131,8 @@ void ObjWriteHeader (FILE* Obj, ObjHeader* H) Write32 (Obj, H->ExportSize); Write32 (Obj, H->DbgSymOffs); Write32 (Obj, H->DbgSymSize); + Write32 (Obj, H->LineInfoOffs); + Write32 (Obj, H->LineInfoSize); } @@ -173,9 +177,9 @@ void ObjAdd (const char* Name) } /* Initialize the object module data structure */ - O->Name = xstrdup (Module); - O->Flags = OBJ_HAVEDATA; - O->MTime = StatBuf.st_mtime; + O->Name = xstrdup (Module); + O->Flags = OBJ_HAVEDATA; + O->MTime = StatBuf.st_mtime; O->ImportSize = H.ImportSize; O->Imports = xmalloc (O->ImportSize); O->ExportSize = H.ExportSize; @@ -200,6 +204,8 @@ void ObjAdd (const char* Name) H.SegOffs = LibCopyTo (Obj, H.SegSize) - O->Start; fseek (Obj, H.FileOffs, SEEK_SET); H.FileOffs = LibCopyTo (Obj, H.FileSize) - O->Start; + fseek (Obj, H.LineInfoOffs, SEEK_SET); + H.LineInfoOffs = LibCopyTo (Obj, H.LineInfoSize) - O->Start; /* Calculate the amount of data written */ O->Size = ftell (NewLib) - O->Start; diff --git a/src/ca65/dbginfo.c b/src/ca65/dbginfo.c index ade483c15..62b76fd71 100644 --- a/src/ca65/dbginfo.c +++ b/src/ca65/dbginfo.c @@ -58,6 +58,9 @@ void DbgInfoFile (void) unsigned long Size; unsigned long MTime; + /* Parameters are separated by a comma */ + ConsumeComma (); + /* Name */ if (Tok != TOK_STRCON) { ErrorSkip (ERR_STRCON_EXPECTED); @@ -90,6 +93,17 @@ void DbgInfoLine (void) unsigned Index; long LineNum; + /* If a parameters follow, this is actual line info. If no parameters + * follow, the last line info is terminated. + */ + if (Tok == TOK_SEP) { + ClearLineInfo (); + return; + } + + /* Parameters are separated by a comma */ + ConsumeComma (); + /* The name of the file follows */ if (Tok != TOK_STRCON) { ErrorSkip (ERR_STRCON_EXPECTED); diff --git a/src/ca65/lineinfo.c b/src/ca65/lineinfo.c index 5634c5a9b..26e12fff5 100644 --- a/src/ca65/lineinfo.c +++ b/src/ca65/lineinfo.c @@ -48,6 +48,7 @@ #include "xmalloc.h" /* ca65 */ +#include "objfile.h" #include "lineinfo.h" @@ -128,6 +129,14 @@ void GenLineInfo (unsigned FileIndex, unsigned long LineNum) +void ClearLineInfo (void) +/* Clear the current line info */ +{ + CurLineInfo = 0; +} + + + void MakeLineInfoIndex (void) /* Walk over the line info list and make an index of all entries ignoring * those with a usage count of zero. @@ -145,3 +154,37 @@ void MakeLineInfoIndex (void) +void WriteLineInfo (void) +/* Write a list of all line infos to the object file. */ +{ + LineInfo* LI; + + /* Tell the object file module that we're about to write line infos */ + ObjStartLineInfos (); + + /* Check if debug info is requested */ + if (DbgSyms) { + + /* Write the line info count to the list */ + ObjWriteVar (LineInfoValid); + + /* Walk through list and write all line infos that have references */ + LI = LineInfoRoot; + while (LI) { + if (LI->Usage) { + /* Write the source file position */ + ObjWritePos (&LI->Pos); + } + LI = LI->Next; + } + + } else { + + /* No line infos */ + ObjWriteVar (0); + + } +} + + + diff --git a/src/ca65/lineinfo.h b/src/ca65/lineinfo.h index f00843b82..faf69f284 100644 --- a/src/ca65/lineinfo.h +++ b/src/ca65/lineinfo.h @@ -51,6 +51,9 @@ /* common */ #include "filepos.h" +/* ca65 */ +#include "global.h" + /*****************************************************************************/ @@ -95,6 +98,17 @@ LineInfo* UseLineInfo (LineInfo* LI); void GenLineInfo (unsigned FileIndex, unsigned long LineNum); /* Generate a new line info */ +void ClearLineInfo (void); +/* Clear the current line info */ + +void MakeLineInfoIndex (void); +/* Walk over the line info list and make an index of all entries ignoring + * those with a usage count of zero. + */ + +void WriteLineInfo (void); +/* Write a list of all line infos to the object file. */ + /* End of lineinfo.h */ diff --git a/src/ca65/main.c b/src/ca65/main.c index 61e72d885..b029e2f0c 100644 --- a/src/ca65/main.c +++ b/src/ca65/main.c @@ -56,6 +56,7 @@ #include "incpath.h" #include "instr.h" #include "istack.h" +#include "lineinfo.h" #include "listing.h" #include "macro.h" #include "nexttok.h" @@ -480,6 +481,9 @@ static void CreateObjFile (void) /* Write debug symbols if requested */ WriteDbgSyms (); + /* Write line infos if requested */ + WriteLineInfo (); + /* Write an updated header and close the file */ ObjClose (); } @@ -636,6 +640,9 @@ int main (int argc, char* argv []) SegCheck (); } + /* If we didn't have an errors, index the line infos */ + MakeLineInfoIndex (); + /* Dump the data */ if (Verbosity >= 2) { SymDump (stdout); diff --git a/src/ca65/objcode.c b/src/ca65/objcode.c index 81d16420e..a231b289b 100644 --- a/src/ca65/objcode.c +++ b/src/ca65/objcode.c @@ -460,6 +460,7 @@ static void WriteOneSeg (Segment* Seg) Fragment* Frag; Fragment* F; unsigned long Size; + unsigned LineInfoIndex; /* Write the segment name followed by the byte count in this segment */ ObjWriteStr (Seg->Name); @@ -534,6 +535,12 @@ static void WriteOneSeg (Segment* Seg) /* Write the file position of this fragment */ ObjWritePos (&Frag->Pos); + /* Write extra line info for this fragment. Zero is considered + * "no line info", so add one to the value. + */ + LineInfoIndex = Frag->LI? Frag->LI->Index + 1 : 0; + ObjWriteVar (LineInfoIndex); + /* Next fragment */ Frag = Frag->Next; } diff --git a/src/ca65/objfile.c b/src/ca65/objfile.c index cd5c49622..867f771ab 100644 --- a/src/ca65/objfile.c +++ b/src/ca65/objfile.c @@ -113,12 +113,14 @@ static void ObjWriteHeader (void) ObjWrite32 (Header.ExportSize); ObjWrite32 (Header.DbgSymOffs); ObjWrite32 (Header.DbgSymSize); + ObjWrite32 (Header.LineInfoOffs); + ObjWrite32 (Header.LineInfoSize); } /*****************************************************************************/ -/* Code */ +/* Code */ /*****************************************************************************/ @@ -241,7 +243,7 @@ void ObjWriteStr (const char* S) */ ObjWriteVar (Len); ObjWriteData (S, Len); -} +} @@ -370,6 +372,7 @@ void ObjEndDbgSyms (void) void ObjStartLineInfos (void) /* Mark the start of the line info section */ { + Header.LineInfoOffs = ftell (F); } @@ -377,6 +380,7 @@ void ObjStartLineInfos (void) void ObjEndLineInfos (void) /* Mark the end of the line info section */ { + Header.LineInfoSize = ftell (F) - Header.LineInfoOffs; } diff --git a/src/ca65/pseudo.c b/src/ca65/pseudo.c index f7dc8bb4e..801db02ba 100644 --- a/src/ca65/pseudo.c +++ b/src/ca65/pseudo.c @@ -482,9 +482,6 @@ static void DoDbg (void) /* Skip the subkey */ NextTok (); - /* Parameters are separated by a comma */ - ConsumeComma (); - /* Check the key and dispatch to a handler */ switch (Key) { case 0: DbgInfoFile (); break; diff --git a/src/cc65/codeseg.c b/src/cc65/codeseg.c index 116b67b30..adf023971 100644 --- a/src/cc65/codeseg.c +++ b/src/cc65/codeseg.c @@ -966,6 +966,11 @@ void OutputCodeSeg (const CodeSeg* S, FILE* F) OutputCodeEntry (E, F); } + /* If debug info is enabled, terminate the last line number information */ + if (DebugInfo) { + fprintf (F, "\t.dbg\tline\n"); + } + /* If this is a segment for a function, leave the function */ if (S->Func) { fprintf (F, "\n.endproc\n\n"); diff --git a/src/common/libdefs.h b/src/common/libdefs.h index f717b4358..2c02a6fdb 100644 --- a/src/common/libdefs.h +++ b/src/common/libdefs.h @@ -46,7 +46,7 @@ /* Defines for magic and version */ #define LIB_MAGIC 0x7A55616E -#define LIB_VERSION 0x0008 +#define LIB_VERSION 0x0009 /* Size of an library file header */ #define LIB_HDR_SIZE 12 diff --git a/src/common/objdefs.h b/src/common/objdefs.h index 7678f4763..c173ba651 100644 --- a/src/common/objdefs.h +++ b/src/common/objdefs.h @@ -46,10 +46,10 @@ /* Defines for magic and version */ #define OBJ_MAGIC 0x616E7A55 -#define OBJ_VERSION 0x0008 +#define OBJ_VERSION 0x0009 /* Size of an object file header */ -#define OBJ_HDR_SIZE 56 +#define OBJ_HDR_SIZE 64 /* Flag bits */ #define OBJ_FLAGS_DBGINFO 0x0001 /* File has debug info */ @@ -74,6 +74,8 @@ struct ObjHeader_ { unsigned long ExportSize; /* 32: Size of export list */ unsigned long DbgSymOffs; /* 32: Offset to list of debug symbols */ unsigned long DbgSymSize; /* 32: Size of debug symbols */ + unsigned long LineInfoOffs; /* 32: Offset to list of line infos */ + unsigned long LineInfoSize; /* 32: Size of line infos */ }; diff --git a/src/ld65/fragment.c b/src/ld65/fragment.c index 991ed3565..0051a26d5 100644 --- a/src/ld65/fragment.c +++ b/src/ld65/fragment.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998-2000 Ullrich von Bassewitz */ +/* (C) 1998-2001 Ullrich von Bassewitz */ /* Wacholderweg 14 */ /* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -60,6 +60,7 @@ Fragment* NewFragment (unsigned char Type, unsigned long Size, Section* S) F->Size = Size; F->Expr = 0; InitFilePos (&F->Pos); + F->LI = 0; F->Type = Type; /* Insert the code fragment into the section */ diff --git a/src/ld65/fragment.h b/src/ld65/fragment.h index cae0a1513..9e8fc2f58 100644 --- a/src/ld65/fragment.h +++ b/src/ld65/fragment.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998-2000 Ullrich von Bassewitz */ +/* (C) 1998-2001 Ullrich von Bassewitz */ /* Wacholderweg 14 */ /* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -57,6 +57,7 @@ struct Fragment { unsigned long Size; /* Size of data/expression */ struct ExprNode* Expr; /* Expression if FRAG_EXPR */ FilePos Pos; /* File position in source */ + struct LineInfo* LI; /* Additional line info */ unsigned char Type; /* Type of fragment */ unsigned char LitBuf [1]; /* Dynamically alloc'ed literal buffer */ }; diff --git a/src/ld65/lineinfo.c b/src/ld65/lineinfo.c new file mode 100644 index 000000000..5cc2e19e1 --- /dev/null +++ b/src/ld65/lineinfo.c @@ -0,0 +1,81 @@ +/*****************************************************************************/ +/* */ +/* lineinfo.h */ +/* */ +/* Source file line info structure */ +/* */ +/* */ +/* */ +/* (C) 2001 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +/* common */ +#include "xmalloc.h" + +/* ld65 */ +#include "fileio.h" +#include "lineinfo.h" + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +static LineInfo* NewLineInfo (void) +/* Create and return a new LineInfo struct */ +{ + /* Allocate memory */ + LineInfo* LI = xmalloc (sizeof (LineInfo)); + + /* Initialize the fields */ + InitFilePos (&LI->Pos); + InitCollection (&LI->Fragments); + + /* Return the new struct */ + return LI; +} + + + +LineInfo* ReadLineInfo (FILE* F, ObjData* O) +/* Read a line info from a file and return it */ +{ + /* Allocate a new LineInfo struct and initialize it */ + LineInfo* LI = NewLineInfo (); + + /* Read the file position */ + ReadFilePos (F, &LI->Pos); + + /* Return the new LineInfo */ + return LI; +} + + + diff --git a/src/ld65/lineinfo.h b/src/ld65/lineinfo.h new file mode 100644 index 000000000..98138c47c --- /dev/null +++ b/src/ld65/lineinfo.h @@ -0,0 +1,79 @@ +/*****************************************************************************/ +/* */ +/* lineinfo.h */ +/* */ +/* Source file line info structure */ +/* */ +/* */ +/* */ +/* (C) 2001 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* This software is provided 'as-is', without any expressed or implied */ +/* warranty. In no event will the authors be held liable for any damages */ +/* arising from the use of this software. */ +/* */ +/* Permission is granted to anyone to use this software for any purpose, */ +/* including commercial applications, and to alter it and redistribute it */ +/* freely, subject to the following restrictions: */ +/* */ +/* 1. The origin of this software must not be misrepresented; you must not */ +/* claim that you wrote the original software. If you use this software */ +/* in a product, an acknowledgment in the product documentation would be */ +/* appreciated but is not required. */ +/* 2. Altered source versions must be plainly marked as such, and must not */ +/* be misrepresented as being the original software. */ +/* 3. This notice may not be removed or altered from any source */ +/* distribution. */ +/* */ +/*****************************************************************************/ + + + +#ifndef LINEINFO_H +#define LINEINFO_H + + + +/* common */ +#include "coll.h" +#include "filepos.h" + +/* ld65 */ +#include "objdata.h" + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +typedef struct LineInfo LineInfo; +struct LineInfo { + FilePos Pos; /* File position */ + Collection Fragments; /* Fragments for this line */ +}; + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +LineInfo* ReadLineInfo (FILE* F, ObjData* O); +/* Read a line info from a file and return it */ + + + +/* End of lineinfo.h */ +#endif + + + diff --git a/src/ld65/make/gcc.mak b/src/ld65/make/gcc.mak index 633b9f360..f48fc8bc5 100644 --- a/src/ld65/make/gcc.mak +++ b/src/ld65/make/gcc.mak @@ -31,6 +31,7 @@ OBJS = bin.o \ fragment.o \ global.o \ library.o \ + lineinfo.o \ main.o \ mapfile.o \ o65.o \ diff --git a/src/ld65/objdata.c b/src/ld65/objdata.c index ce88775dc..8deecb0f7 100644 --- a/src/ld65/objdata.c +++ b/src/ld65/objdata.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998-2000 Ullrich von Bassewitz */ +/* (C) 1998-2001 Ullrich von Bassewitz */ /* Wacholderweg 14 */ /* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -83,6 +83,8 @@ ObjData* NewObjData (void) O->Imports = 0; O->DbgSymCount = 0; O->DbgSyms = 0; + O->LineInfoCount = 0; + O->LineInfos = 0; /* Link it into the list */ if (ObjLast) { @@ -108,7 +110,8 @@ void FreeObjData (ObjData* O) xfree (O->Name); xfree (O->Imports); xfree (O->Exports); - xfree (O->DbgSyms); + xfree (O->DbgSyms); + xfree (O->LineInfos); xfree (O); } @@ -143,7 +146,7 @@ const char* GetSourceFileName (const ObjData* O, unsigned Index) /* Return the name */ return O->Files[Index]; - } + } } diff --git a/src/ld65/objdata.h b/src/ld65/objdata.h index 1fa339944..a6d39ace7 100644 --- a/src/ld65/objdata.h +++ b/src/ld65/objdata.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* (C) 1998-2001 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -74,6 +74,8 @@ struct ObjData { struct Import** Imports; /* List of all imports */ unsigned DbgSymCount; /* Count of debug symbols */ struct DbgSym** DbgSyms; /* List of debug symbols */ + unsigned LineInfoCount; /* Count of additional line infos */ + struct LineInfo** LineInfos; /* List of additional line infos */ }; @@ -104,7 +106,7 @@ 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. + * "[linker generated]" as the file name. */ @@ -116,3 +118,4 @@ const char* GetSourceFileName (const ObjData* O, unsigned Index); + diff --git a/src/ld65/objfile.c b/src/ld65/objfile.c index 671c496db..f08b14761 100644 --- a/src/ld65/objfile.c +++ b/src/ld65/objfile.c @@ -47,6 +47,7 @@ #include "error.h" #include "exports.h" #include "fileio.h" +#include "lineinfo.h" #include "objdata.h" #include "segments.h" #include "objfile.h" @@ -86,19 +87,21 @@ static void ObjReadHeader (FILE* Obj, ObjHeader* H, const char* Name) if (H->Version != OBJ_VERSION) { Error ("Object file `%s' has wrong version", Name); } - H->Flags = Read16 (Obj); - H->OptionOffs = Read32 (Obj); - H->OptionSize = Read32 (Obj); - H->FileOffs = Read32 (Obj); - H->FileSize = Read32 (Obj); - H->SegOffs = Read32 (Obj); - H->SegSize = Read32 (Obj); - H->ImportOffs = Read32 (Obj); - H->ImportSize = Read32 (Obj); - H->ExportOffs = Read32 (Obj); - H->ExportSize = Read32 (Obj); - H->DbgSymOffs = Read32 (Obj); - H->DbgSymSize = Read32 (Obj); + H->Flags = Read16 (Obj); + H->OptionOffs = Read32 (Obj); + H->OptionSize = Read32 (Obj); + H->FileOffs = Read32 (Obj); + H->FileSize = Read32 (Obj); + H->SegOffs = Read32 (Obj); + H->SegSize = Read32 (Obj); + H->ImportOffs = Read32 (Obj); + H->ImportSize = Read32 (Obj); + H->ExportOffs = Read32 (Obj); + H->ExportSize = Read32 (Obj); + H->DbgSymOffs = Read32 (Obj); + H->DbgSymSize = Read32 (Obj); + H->LineInfoOffs = Read32 (Obj); + H->LineInfoSize = Read32 (Obj); } @@ -155,7 +158,7 @@ void ObjReadDbgSyms (FILE* F, ObjData* O) /* Read the debug symbols from a file at the current position */ { unsigned I; - + O->DbgSymCount = ReadVar (F); O->DbgSyms = xmalloc (O->DbgSymCount * sizeof (DbgSym*)); for (I = 0; I < O->DbgSymCount; ++I) { @@ -165,6 +168,20 @@ void ObjReadDbgSyms (FILE* F, ObjData* O) +void ObjReadLineInfos (FILE* F, ObjData* O) +/* Read the line infos from a file at the current position */ +{ + unsigned I; + + O->LineInfoCount = ReadVar (F); + O->LineInfos = xmalloc (O->LineInfoCount * sizeof (LineInfo*)); + for (I = 0; I < O->LineInfoCount; ++I) { + O->LineInfos[I] = ReadLineInfo (F, O); + } +} + + + void ObjReadSections (FILE* F, ObjData* O) /* Read the section data from a file at the current position */ { @@ -211,6 +228,10 @@ void ObjAdd (FILE* Obj, const char* Name) fseek (Obj, O->Header.DbgSymOffs, SEEK_SET); ObjReadDbgSyms (Obj, O); + /* Read the line infos from the object file */ + fseek (Obj, O->Header.LineInfoOffs, SEEK_SET); + ObjReadLineInfos (Obj, O); + /* Read the segment list from the object file. This must be last, since * the expressions stored in the code may reference segments or imported * symbols. diff --git a/src/ld65/segments.c b/src/ld65/segments.c index 684521dcd..3946fbad6 100644 --- a/src/ld65/segments.c +++ b/src/ld65/segments.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998-2000 Ullrich von Bassewitz */ +/* (C) 1998-2001 Ullrich von Bassewitz */ /* Wacholderweg 14 */ /* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -51,6 +51,7 @@ #include "fileio.h" #include "fragment.h" #include "global.h" +#include "lineinfo.h" #include "segments.h" @@ -253,6 +254,7 @@ Section* ReadSection (FILE* F, ObjData* O) while (Size) { Fragment* Frag; + unsigned LineInfoIndex; /* Read the fragment type */ unsigned char Type = Read8 (F); @@ -299,13 +301,24 @@ Section* ReadSection (FILE* F, ObjData* O) case FRAG_SEXPR: /* An expression */ Frag->Expr = ReadExpr (F, O); - break; + break; } /* Read the file position of the fragment */ ReadFilePos (F, &Frag->Pos); + /* Read the additional line info and resolve it */ + LineInfoIndex = ReadVar (F); + if (LineInfoIndex) { + --LineInfoIndex; + CHECK (LineInfoIndex < O->LineInfoCount); + /* Point from the fragment to the line info... */ + Frag->LI = O->LineInfos[LineInfoIndex]; + /* ...and back from the line info to the fragment */ + CollAppend (&Frag->LI->Fragments, Frag); + } + /* Remember the module we had this fragment from */ Frag->Obj = O; diff --git a/src/ld65/segments.h b/src/ld65/segments.h index 7a0a6a974..f90ad9c3f 100644 --- a/src/ld65/segments.h +++ b/src/ld65/segments.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998-2000 Ullrich von Bassewitz */ +/* (C) 1998-2001 Ullrich von Bassewitz */ /* Wacholderweg 14 */ /* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ diff --git a/src/od65/dump.c b/src/od65/dump.c index d44e12efd..431ced527 100644 --- a/src/od65/dump.c +++ b/src/od65/dump.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* (C) 2000-2001 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -191,6 +191,9 @@ static unsigned SkipFragment (FILE* F) /* Skip the file position of the fragment */ ReadFilePos (F, &Pos); + /* Skip the additional line info */ + (void) ReadVar (F); + /* Return the size */ return Size; } @@ -388,7 +391,7 @@ void DumpObjFiles (FILE* F, unsigned long Offset) /* Read the header */ ReadObjHeader (F, &H); - /* Seek to the start of the options */ + /* Seek to the start of the source files */ FileSeek (F, Offset + H.FileOffs); /* Output a header */ @@ -436,7 +439,7 @@ void DumpObjSegments (FILE* F, unsigned long Offset) /* Read the header */ ReadObjHeader (F, &H); - /* Seek to the start of the options */ + /* Seek to the start of the segments */ FileSeek (F, Offset + H.SegOffs); /* Output a header */ @@ -511,7 +514,7 @@ void DumpObjImports (FILE* F, unsigned long Offset) /* Read the header */ ReadObjHeader (F, &H); - /* Seek to the start of the options */ + /* Seek to the start of the imports */ FileSeek (F, Offset + H.ImportOffs); /* Output a header */ @@ -567,7 +570,7 @@ void DumpObjExports (FILE* F, unsigned long Offset) /* Read the header */ ReadObjHeader (F, &H); - /* Seek to the start of the options */ + /* Seek to the start of the exports */ FileSeek (F, Offset + H.ExportOffs); /* Output a header */ @@ -633,7 +636,7 @@ void DumpObjDbgSyms (FILE* F, unsigned long Offset) /* Read the header */ ReadObjHeader (F, &H); - /* Seek to the start of the options */ + /* Seek to the start of the debug syms */ FileSeek (F, Offset + H.DbgSymOffs); /* Output a header */ @@ -691,4 +694,54 @@ void DumpObjDbgSyms (FILE* F, unsigned long Offset) +void DumpObjLineInfo (FILE* F, unsigned long Offset) +/* Dump the line info from an object file */ +{ + ObjHeader H; + unsigned Count; + unsigned I; + + /* Seek to the header position */ + FileSeek (F, Offset); + + /* Read the header */ + ReadObjHeader (F, &H); + + /* Seek to the start of line infos */ + FileSeek (F, Offset + H.LineInfoOffs); + + /* Output a header */ + printf (" Line info:\n"); + + /* Check if the object file was compiled with debug info */ + if ((H.Flags & OBJ_FLAGS_DBGINFO) == 0) { + /* Print that there no line infos and bail out */ + printf (" Count:%27u\n", 0); + return; + } + + /* Read the number of line infos and print it */ + Count = ReadVar (F); + printf (" Count:%27u\n", Count); + + /* Read and print all line infos */ + for (I = 0; I < Count; ++I) { + + FilePos Pos; + + /* Read one line info */ + ReadFilePos (F, &Pos); + + /* Print the header */ + printf (" Index:%27u\n", I); + + /* Print the data */ + printf (" Line:%26lu\n", Pos.Line); + printf (" Col:%27u\n", Pos.Col); + printf (" Name:%26u\n", Pos.Name); + } +} + + + diff --git a/src/od65/dump.h b/src/od65/dump.h index d35417b9c..96a65f725 100644 --- a/src/od65/dump.h +++ b/src/od65/dump.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000 Ullrich von Bassewitz */ -/* Wacholderweg 14 */ -/* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* (C) 2000-2001 Ullrich von Bassewitz */ +/* Wacholderweg 14 */ +/* D-70597 Stuttgart */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -69,6 +69,9 @@ void DumpObjExports (FILE* F, unsigned long Offset); void DumpObjDbgSyms (FILE* F, unsigned long Offset); /* Dump the debug symbols from an object file */ +void DumpObjLineInfo (FILE* F, unsigned long Offset); +/* Dump the line infos from an object file */ + /* End of dump.h */ diff --git a/src/od65/fileio.c b/src/od65/fileio.c index 1950400e0..ee0e32372 100644 --- a/src/od65/fileio.c +++ b/src/od65/fileio.c @@ -183,7 +183,7 @@ void* ReadData (FILE* F, void* Data, unsigned Size) if (Size > 0) { if (fread (Data, 1, Size, F) != Size) { Error ("Read error (file corrupt?)"); - } + } } return Data; } @@ -209,6 +209,8 @@ void ReadObjHeader (FILE* F, ObjHeader* H) H->ExportSize = Read32 (F); H->DbgSymOffs = Read32 (F); H->DbgSymSize = Read32 (F); + H->LineInfoOffs = Read32 (F); + H->LineInfoSize = Read32 (F); } diff --git a/src/od65/global.h b/src/od65/global.h index 3f36342fe..702e5691a 100644 --- a/src/od65/global.h +++ b/src/od65/global.h @@ -51,6 +51,7 @@ #define D_IMPORTS 0x0010U /* Dump imported symbols */ #define D_EXPORTS 0x0020U /* Dump exported symbols */ #define D_DBGSYMS 0x0040U /* Dump debug symbols */ +#define D_LINEINFO 0x0080U /* Dump line infos */ #define D_ALL 0xFFFFU /* Dump anything */ diff --git a/src/od65/main.c b/src/od65/main.c index 5acb5afe2..4c194f928 100644 --- a/src/od65/main.c +++ b/src/od65/main.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 2000 Ullrich von Bassewitz */ +/* (C) 2000-2001 Ullrich von Bassewitz */ /* Wacholderweg 14 */ /* D-70597 Stuttgart */ -/* EMail: uz@musoftware.de */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -83,6 +83,7 @@ static void Usage (void) " --dump-files\t\tDump the source files\n" " --dump-header\t\tDump the object file header\n" " --dump-imports\tDump imported symbols\n" + " --dump-lineinfo\tDump line information\n" " --dump-options\tDump object file options\n" " --dump-segments\tDump the segments in the file\n" " --help\t\tHelp (this text)\n" @@ -140,6 +141,14 @@ static void OptDumpImports (const char* Opt, const char* Arg) +static void OptDumpLineInfo (const char* Opt, const char* Arg) +/* Dump the line infos */ +{ + What |= D_LINEINFO; +} + + + static void OptDumpOptions (const char* Opt, const char* Arg) /* Dump the object file options */ { @@ -227,6 +236,9 @@ static void DumpFile (const char* Name) if (What & D_DBGSYMS) { DumpObjDbgSyms (F, 0); } + if (What & D_LINEINFO) { + DumpObjLineInfo (F, 0); + } } /* Close the file */ @@ -246,6 +258,7 @@ int main (int argc, char* argv []) { "--dump-files", 0, OptDumpFiles }, { "--dump-header", 0, OptDumpHeader }, { "--dump-imports", 0, OptDumpImports }, + { "--dump-lineinfo", 0, OptDumpLineInfo }, { "--dump-options", 0, OptDumpOptions }, { "--dump-segments", 0, OptDumpSegments }, { "--help", 0, OptHelp },