* 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 */
}
/* 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 */
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);
}
/* common */
#include "coll.h"
#include "filepos.h"
+#include "lidefs.h"
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.
*/
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);
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);
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;
+/* common */
+#include "lidefs.h"
+
/* ld65 */
#include "dbginfo.h"
#include "fileinfo.h"
/* 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;
/* 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);
+
}
}
}
/* common */
#include "check.h"
+#include "lidefs.h"
#include "xmalloc.h"
/* ld65 */
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;
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 ();
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));
-
-
+
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 */
#include "coll.h"
#include "exprdefs.h"
#include "filepos.h"
+#include "lidefs.h"
#include "objdefs.h"
#include "optdefs.h"
#include "segdefs.h"
/* 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);