/* */
/* lineinfo.h */
/* */
-/* Source file line info structure */
+/* Source file line info management */
/* */
/* */
/* */
-/* (C) 2001 Ullrich von Bassewitz */
-/* Wacholderweg 14 */
-/* D-70597 Stuttgart */
-/* EMail: uz@cc65.org */
+/* (C) 2001-2011, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* 70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
-/* Note: The line infos kept here are additional line infos supplied by the
- * ".dbg line" command. The native line infos are always kept in the fragments
- * itself (because one fragment always originates from one line). The
- * additional line infos (which may not exist if none are supplied in the
- * source) may have several fragments attached (as is the case with sources
- * generated by the C compiler).
- */
-
-
-
#ifndef LINEINFO_H
#define LINEINFO_H
/* common */
#include "coll.h"
#include "filepos.h"
-
-/* ca65 */
-#include "global.h"
+#include "lidefs.h"
/*****************************************************************************/
-/* Data */
+/* Data */
/*****************************************************************************/
+/* Predefined line info slots. These are allocated when initializing the
+ * module. Beware: Some code relies on the fact that slot zero is the basic
+ * standard line info. It is assumed to be always there.
+ */
+enum {
+ LI_SLOT_ASM = 0, /* Normal assembler source */
+ LI_SLOT_EXT = 1, /* Externally supplied line info */
+};
+
/* The LineInfo structure is shared between several fragments, so we need a
* reference counter.
*/
typedef struct LineInfo LineInfo;
struct LineInfo {
- unsigned Usage; /* Usage counter */
- unsigned Index; /* Index */
- FilePos Pos; /* File position */
+ unsigned Usage; /* Usage counter */
+ unsigned Type; /* Type of line info */
+ unsigned Index; /* Index */
+ FilePos Pos; /* File position */
};
-/* Collection containing all line infos */
-extern Collection LineInfoColl;
-extern unsigned LineInfoValid; /* Valid, that is, used entries */
-
-/* Global pointer to last line info or NULL if not active */
-extern LineInfo* CurLineInfo;
-
/*****************************************************************************/
+void InitLineInfo (void);
+/* Initialize the line infos */
+
+unsigned AllocLineInfoSlot (unsigned Type, unsigned Count);
+/* Allocate a line info slot of the given type and return the slot index */
+
+void FreeLineInfoSlot (unsigned Slot);
+/* Free the line info in the given slot. Note: Alloc/Free must be used in
+ * FIFO order.
+ */
+
+void GenLineInfo (unsigned Slot, const FilePos* Pos);
+/* Generate a new line info in the given slot */
+
+void ClearLineInfo (unsigned Slot);
+/* Clear the line info in the given slot */
+
+void GetFullLineInfo (Collection* LineInfos, unsigned IncUsage);
+/* Return full line infos, that is line infos for all slots in LineInfos. The
+ * function will clear LineInfos before usage and will increment the usage
+ * counter by IncUsage for all line infos returned.
+ */
+
LineInfo* UseLineInfo (LineInfo* LI);
/* Increase the reference count of the given line info and return it. The
* function will gracefully accept NULL pointers and do nothing in this case.
*/
-void GenLineInfo (unsigned FileIndex, unsigned long LineNum);
-/* Generate a new line info */
+LineInfo* ReleaseLineInfo (LineInfo* LI);
+/* Decrease the reference count of the given line info and return it. The
+ * function will gracefully accept NULL pointers and do nothing in this case.
+ */
-void ClearLineInfo (void);
-/* Clear the current line info */
+#if defined(HAVE_INLINE)
+INLINE const FilePos* GetSourcePos (const LineInfo* LI)
+/* Return the source file position from the given line info */
+{
+ return &LI->Pos;
+}
+#else
+# define GetSourcePos(LI) (&(LI)->Pos)
+#endif
-void MakeLineInfoIndex (void);
-/* Walk over the line info list and make an index of all entries ignoring
- * those with a usage count of zero.
+#if defined(HAVE_INLINE)
+INLINE unsigned GetLineInfoType (const LineInfo* LI)
+/* Return the type of a line info */
+{
+ return LI_GET_TYPE (LI->Type);
+}
+#else
+# define GetLineInfoType(LI) LI_GET_TYPE ((LI)->Type)
+#endif
+
+void WriteLineInfo (const Collection* LineInfos);
+/* Write a list of line infos to the object file. MakeLineInfoIndex has to
+ * be called before!
*/
-void WriteLineInfo (void);
+void MakeLineInfoIndex (void);
+/* Index the line infos */
+
+void WriteLineInfos (void);
/* Write a list of all line infos to the object file. */