]> git.sur5r.net Git - cc65/blobdiff - src/ca65/lineinfo.h
More lineinfo usage.
[cc65] / src / ca65 / lineinfo.h
index f00843b82cc4a0ad48a156d3af487fb05ead4c1a..282ad1b79d9c87add76f7a169b725a5f92214db3 100644 (file)
@@ -2,14 +2,14 @@
 /*                                                                           */
 /*                               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"
 
 
 
 /*****************************************************************************/
-/*                                  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 */
+};
+
+/* 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_EXT         = 0x0100,       /* Externally supplied line info */
+    LI_TYPE_ASM         = 0x0200,       /* Normal assembler source */
+    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.
  */
 typedef struct LineInfo LineInfo;
 struct LineInfo {
-    LineInfo*       Next;                 /* Pointer to next info in list */
-    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 */
 };
 
-/* Linked list of all line infos */
-extern LineInfo* LineInfoRoot;
-extern LineInfo* LineInfoLast;
-extern unsigned  LineInfoCount;
-extern unsigned  LineInfoValid;           /* Valid, that is, used entries */
-
-/* Global pointer to last line info or NULL if not active */
-extern LineInfo* CurLineInfo;
-
 
 
 /*****************************************************************************/
@@ -87,13 +90,51 @@ extern LineInfo* CurLineInfo;
 
 
 
+void InitLineInfo (void);
+/* Initialize the line infos */
+
+unsigned AllocLineInfoSlot (unsigned Type);
+/* 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 */
+
+LineInfo* GetLineInfo (unsigned Slot);
+/* Get the line info from the given slot */
+
+void GetFullLineInfo (Collection* LineInfos);
+/* Return full line infos, that is line infos for all slots in LineInfos. The
+ * function does also increase the usage counter 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 WriteLineInfo (const Collection* LineInfos);
+/* Write a list of line infos to the object file. MakeLineInfoIndex has to
+ * be called before!
+ */
+
+void MakeLineInfoIndex (void);
+/* Index the line infos */
+
+void WriteLineInfos (void);
+/* Write a list of all line infos to the object file. */