From 299a0ed4cdcbd7dc0ddf9acaf528deb03587e5a5 Mon Sep 17 00:00:00 2001 From: uz Date: Sat, 29 Jan 2011 22:16:03 +0000 Subject: [PATCH] Pass type of line info through the object files. git-svn-id: svn://svn.cc65.org/cc65/trunk@4957 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/ca65/lineinfo.c | 12 ++++++++---- src/ca65/lineinfo.h | 19 ++++--------------- src/ca65/macro.c | 2 +- src/ld65/dbginfo.c | 21 ++++++++++++++++++++- src/ld65/lineinfo.c | 10 ++++++---- src/ld65/lineinfo.h | 1 + src/od65/dump.c | 9 ++++++++- 7 files changed, 48 insertions(+), 26 deletions(-) diff --git a/src/ca65/lineinfo.c b/src/ca65/lineinfo.c index 06d027c5a..c3808cca2 100644 --- a/src/ca65/lineinfo.c +++ b/src/ca65/lineinfo.c @@ -126,15 +126,15 @@ void InitLineInfo (void) * generated without any input file open. */ UsedSlots = 2; - CurLineInfo[LI_SLOT_ASM].Type = LI_TYPE_ASM; + CurLineInfo[LI_SLOT_ASM].Type = LI_TYPE_ASM; /* Count = 0 */ CurLineInfo[LI_SLOT_ASM].Info = NewLineInfo (LI_TYPE_ASM, &DefaultPos); - CurLineInfo[LI_SLOT_EXT].Type = LI_TYPE_EXT; + CurLineInfo[LI_SLOT_EXT].Type = LI_TYPE_EXT; /* Count = 0 */ CurLineInfo[LI_SLOT_EXT].Info = 0; } -unsigned AllocLineInfoSlot (unsigned Type) +unsigned AllocLineInfoSlot (unsigned Type, unsigned Count) /* Allocate a line info slot of the given type and return the slot index */ { /* Grow the array if necessary */ @@ -148,7 +148,7 @@ unsigned AllocLineInfoSlot (unsigned Type) } /* Array is now big enough, add the new data */ - CurLineInfo[UsedSlots].Type = Type; + CurLineInfo[UsedSlots].Type = LI_MAKE_TYPE(Type, Count); CurLineInfo[UsedSlots].Info = 0; /* Increment the count and return the index of the new slot */ @@ -349,6 +349,10 @@ void WriteLineInfos (void) for (I = 0; I < UsedLineInfoCount; ++I) { /* Get a pointer to this line info */ LineInfo* LI = CollAt (&LineInfoColl, I); + + /* Write the type and count of the line info */ + ObjWriteVar (LI->Type); + /* Write the source file position */ ObjWritePos (&LI->Pos); } diff --git a/src/ca65/lineinfo.h b/src/ca65/lineinfo.h index e47e4bb42..7aa4d1a2f 100644 --- a/src/ca65/lineinfo.h +++ b/src/ca65/lineinfo.h @@ -41,6 +41,7 @@ /* common */ #include "coll.h" #include "filepos.h" +#include "lidefs.h" @@ -59,18 +60,6 @@ enum { LI_SLOT_EXT = 1, /* Externally supplied line info */ }; -/* Types of line infos. The low byte may be used for some sort of depth - * counter. - */ -enum { - LI_MASK_COUNT = 0x00FF, /* Mask to extract the count */ - - LI_TYPE_ASM = 0x0100, /* Normal assembler source */ - LI_TYPE_EXT = 0x0200, /* Externally supplied line info */ - LI_TYPE_MACRO = 0x0300, /* Macro expansion */ - LI_MASK_TYPE = 0x7F00, /* Mask to extract the type */ -}; - /* The LineInfo structure is shared between several fragments, so we need a * reference counter. */ @@ -93,7 +82,7 @@ struct LineInfo { void InitLineInfo (void); /* Initialize the line infos */ -unsigned AllocLineInfoSlot (unsigned Type); +unsigned AllocLineInfoSlot (unsigned Type, unsigned Count); /* Allocate a line info slot of the given type and return the slot index */ void FreeLineInfoSlot (unsigned Slot); @@ -137,10 +126,10 @@ INLINE const FilePos* GetSourcePos (const LineInfo* LI) INLINE unsigned GetLineInfoType (const LineInfo* LI) /* Return the type of a line info */ { - return (LI->Type & LI_MASK_TYPE); + return LI_GET_TYPE (LI->Type); } #else -# define GetLineInfoType(LI) ((LI)->Type & LI_MASK_TYPE) +# define GetLineInfoType(LI) LI_GET_TYPE ((LI)->Type) #endif void WriteLineInfo (const Collection* LineInfos); diff --git a/src/ca65/macro.c b/src/ca65/macro.c index b98925bc8..68c200c5e 100644 --- a/src/ca65/macro.c +++ b/src/ca65/macro.c @@ -267,7 +267,7 @@ static MacExp* NewMacExp (Macro* M) for (I = 0; I < M->ParamCount; ++I) { E->Params[I] = 0; } - E->LISlot = AllocLineInfoSlot (LI_TYPE_MACRO | MacExpansions); + E->LISlot = AllocLineInfoSlot (LI_TYPE_MACRO, MacExpansions); /* One macro expansion more */ ++MacExpansions; diff --git a/src/ld65/dbginfo.c b/src/ld65/dbginfo.c index f51333986..1bd3fe408 100644 --- a/src/ld65/dbginfo.c +++ b/src/ld65/dbginfo.c @@ -33,6 +33,9 @@ +/* common */ +#include "lidefs.h" + /* ld65 */ #include "dbginfo.h" #include "fileinfo.h" @@ -67,6 +70,10 @@ void PrintDbgInfo (ObjData* O, FILE* F) /* Get this line info */ const LineInfo* LI = CollConstAt (&O->LineInfos, I); + /* Get the line info type and count */ + unsigned Type = LI_GET_TYPE (LI->Type); + unsigned Count = LI_GET_COUNT (LI->Type); + /* Get a pointer to the code ranges */ const Collection* CodeRanges = &LI->CodeRanges; @@ -78,9 +85,21 @@ void PrintDbgInfo (ObjData* O, FILE* F) /* Print it */ fprintf (F, - "line\tfile=%u,line=%lu,segment=%u,range=0x%06lX-0x%06lX\n", + "line\tfile=%u,line=%lu,segment=%u,range=0x%06lX-0x%06lX", LI->File->Id, GetSourceLine (LI), R->Seg->Id, R->Offs, R->Offs + R->Size - 1); + + /* Print type if not LI_TYPE_ASM and count if not zero */ + if (Type != LI_TYPE_ASM) { + fprintf (F, ",type=%u", Type); + } + if (Count != 0) { + fprintf (F, ",count=%u", Count); + } + + /* Terminate line */ + fputc ('\n', F); + } } } diff --git a/src/ld65/lineinfo.c b/src/ld65/lineinfo.c index 180bfdf90..243556363 100644 --- a/src/ld65/lineinfo.c +++ b/src/ld65/lineinfo.c @@ -35,6 +35,7 @@ /* common */ #include "check.h" +#include "lidefs.h" #include "xmalloc.h" /* ld65 */ @@ -78,10 +79,11 @@ static LineInfo* NewLineInfo (void) LineInfo* LI = xmalloc (sizeof (LineInfo)); /* Initialize the fields */ + LI->File = 0; + LI->Type = LI_TYPE_ASM; LI->Pos.Name = INVALID_STRING_ID; LI->Pos.Line = 0; LI->Pos.Col = 0; - LI->File = 0; LI->Fragments = EmptyCollection; LI->CodeRanges = EmptyCollection; @@ -92,7 +94,7 @@ static LineInfo* NewLineInfo (void) LineInfo* GenLineInfo (const FilePos* Pos) -/* Generate a new (internally used) line info with the given information */ +/* Generate a new (internally used) line info with the given information */ { /* Create a new LineInfo struct */ LineInfo* LI = NewLineInfo (); @@ -113,6 +115,7 @@ LineInfo* ReadLineInfo (FILE* F, ObjData* O) LineInfo* LI = NewLineInfo (); /* Read/fill the fields in the new LineInfo */ + LI->Type = ReadVar (F); LI->Pos.Line = ReadVar (F); LI->Pos.Col = ReadVar (F); LI->File = CollAt (&O->Files, ReadVar (F)); @@ -242,5 +245,4 @@ void RelocLineInfo (Segment* S) - - + diff --git a/src/ld65/lineinfo.h b/src/ld65/lineinfo.h index dd6258f6f..569ed7975 100644 --- a/src/ld65/lineinfo.h +++ b/src/ld65/lineinfo.h @@ -82,6 +82,7 @@ struct CodeRange { typedef struct LineInfo LineInfo; struct LineInfo { struct FileInfo* File; /* File struct for this line if any */ + unsigned Type; /* Type of line info */ FilePos Pos; /* Position in file */ Collection Fragments; /* Fragments for this line */ Collection CodeRanges; /* Code ranges for this line */ diff --git a/src/od65/dump.c b/src/od65/dump.c index d812358c4..b5cf4871c 100644 --- a/src/od65/dump.c +++ b/src/od65/dump.c @@ -42,6 +42,7 @@ #include "coll.h" #include "exprdefs.h" #include "filepos.h" +#include "lidefs.h" #include "objdefs.h" #include "optdefs.h" #include "segdefs.h" @@ -714,14 +715,20 @@ void DumpObjLineInfo (FILE* F, unsigned long Offset) /* Read and print all line infos */ for (I = 0; I < Count; ++I) { - /* Read one line info */ FilePos Pos; + + /* Type of line info */ + unsigned Type = ReadVar (F); + + /* File position of line info */ ReadFilePos (F, &Pos); /* Print the header */ printf (" Index:%27u\n", I); /* Print the data */ + printf (" Type:%26u\n", LI_GET_TYPE (Type)); + printf (" Count:%25u\n", LI_GET_COUNT (Type)); printf (" Line:%26lu\n", Pos.Line); printf (" Col:%27u\n", Pos.Col); printf (" Name:%26u\n", Pos.Name); -- 2.39.5