[project @ 2005-03-02 09:57:41 by simonmar]
[ghc-hetmet.git] / ghc / includes / InfoTables.h
index 97c3bec..8677e90 100644 (file)
@@ -1,5 +1,5 @@
 /* ----------------------------------------------------------------------------
 /* ----------------------------------------------------------------------------
- * $Id: InfoTables.h,v 1.28 2002/12/11 15:36:37 simonmar Exp $
+ * $Id: InfoTables.h,v 1.35 2004/11/08 12:26:55 simonmar Exp $
  * 
  * (c) The GHC Team, 1998-2002
  *
  * 
  * (c) The GHC Team, 1998-2002
  *
@@ -83,11 +83,9 @@ typedef struct {
 
 /* -----------------------------------------------------------------------------
    Ticky info
 
 /* -----------------------------------------------------------------------------
    Ticky info
-   -------------------------------------------------------------------------- */
 
 
-typedef struct {
-    /* empty */
-} StgTickyInfo;
+   There is no ticky-specific stuff in an info table at this time.
+   -------------------------------------------------------------------------- */
 
 /* -----------------------------------------------------------------------------
    Debugging info
 
 /* -----------------------------------------------------------------------------
    Debugging info
@@ -101,9 +99,7 @@ typedef struct {
 
 #else /* !DEBUG_CLOSURE */
 
 
 #else /* !DEBUG_CLOSURE */
 
-typedef struct {
-       /* empty */
-} StgDebugInfo;
+// There is no DEBUG-specific stuff in an info table at this time.
 
 #endif /* DEBUG_CLOSURE */
 
 
 #endif /* DEBUG_CLOSURE */
 
@@ -165,6 +161,8 @@ extern StgWord16 closure_flags[];
    (usually on the stack) to the garbage collector.  The two primary
    uses are for stack frames, and functions (where we need to describe
    the layout of a PAP to the GC).
    (usually on the stack) to the garbage collector.  The two primary
    uses are for stack frames, and functions (where we need to describe
    the layout of a PAP to the GC).
+
+   In these bitmaps: 0 == ptr, 1 == non-ptr.
    -------------------------------------------------------------------------- */
 
 //
    -------------------------------------------------------------------------- */
 
 //
@@ -185,6 +183,29 @@ typedef struct {
   StgWord bitmap[FLEXIBLE_ARRAY];
 } StgLargeBitmap;
 
   StgWord bitmap[FLEXIBLE_ARRAY];
 } StgLargeBitmap;
 
+/* -----------------------------------------------------------------------------
+   SRTs  (Static Reference Tables)
+
+   These tables are used to keep track of the static objects referred
+   to by the code for a closure or stack frame, so that we can follow
+   static data references from code and thus accurately
+   garbage-collect CAFs.
+   -------------------------------------------------------------------------- */
+
+// An SRT is just an array of closure pointers:
+typedef StgClosure* StgSRT[];
+
+// Each info table refers to some subset of the closure pointers in an
+// SRT.  It does this using a pair of an StgSRT pointer and a
+// half-word bitmap.  If the half-word bitmap isn't large enough, then
+// we fall back to a large SRT, including an unbounded bitmap.  If the
+// half-word bitmap is set to all ones (0xffff), then the StgSRT
+// pointer instead points to an StgLargeSRT:
+typedef struct StgLargeSRT_ {
+    StgSRT *srt;
+    StgLargeBitmap l;
+} StgLargeSRT;
+
 /* ----------------------------------------------------------------------------
    Info Tables
    ------------------------------------------------------------------------- */
 /* ----------------------------------------------------------------------------
    Info Tables
    ------------------------------------------------------------------------- */
@@ -203,7 +224,11 @@ typedef union {
     StgWord bitmap;              // word-sized bit pattern describing
                                  //  a stack frame: see below
 
     StgWord bitmap;              // word-sized bit pattern describing
                                  //  a stack frame: see below
 
+#ifndef TABLES_NEXT_TO_CODE
     StgLargeBitmap* large_bitmap; // pointer to large bitmap structure
     StgLargeBitmap* large_bitmap; // pointer to large bitmap structure
+#else
+    StgWord large_bitmap_offset;  // offset from info table to large bitmap structure
+#endif
     
     StgWord selector_offset;     // used in THUNK_SELECTORs
 
     
     StgWord selector_offset;     // used in THUNK_SELECTORs
 
@@ -211,11 +236,6 @@ typedef union {
 
 
 //
 
 
 //
-// An SRT.
-//
-typedef StgClosure* StgSRT[];
-
-//
 // The "standard" part of an info table.  Every info table has this bit.
 //
 typedef struct _StgInfoTable {
 // The "standard" part of an info table.  Every info table has this bit.
 //
 typedef struct _StgInfoTable {
@@ -231,16 +251,16 @@ typedef struct _StgInfoTable {
     StgProfInfo     prof;
 #endif
 #ifdef TICKY
     StgProfInfo     prof;
 #endif
 #ifdef TICKY
-    StgTickyInfo    ticky;
+    // Ticky-specific stuff would go here.
 #endif
 #ifdef DEBUG_CLOSURE
 #endif
 #ifdef DEBUG_CLOSURE
-    StgDebugInfo    debug;
+    // Debug-specific stuff would go here.
 #endif
 
     StgClosureInfo  layout;    // closure layout info (one word)
 
     StgHalfWord     type;      // closure type
 #endif
 
     StgClosureInfo  layout;    // closure layout info (one word)
 
     StgHalfWord     type;      // closure type
-    StgHalfWord     srt_len;    // number of entries in SRT (or constructor tag)
+    StgHalfWord     srt_bitmap;    // number of entries in SRT (or constructor tag)
 
 #ifdef TABLES_NEXT_TO_CODE
     StgCode         code[FLEXIBLE_ARRAY];
 
 #ifdef TABLES_NEXT_TO_CODE
     StgCode         code[FLEXIBLE_ARRAY];
@@ -258,26 +278,34 @@ typedef struct _StgInfoTable {
       and bitmap fields may be left out (they are at the end, so omitting
       them doesn't affect the layout).
       
       and bitmap fields may be left out (they are at the end, so omitting
       them doesn't affect the layout).
       
-   -  If srt_len (in the std info table part) is zero, then the srt
+   -  If srt_bitmap (in the std info table part) is zero, then the srt
       field may be omitted.  This only applies if the slow_apply and
       bitmap fields have also been omitted.
    -------------------------------------------------------------------------- */
 
       field may be omitted.  This only applies if the slow_apply and
       bitmap fields have also been omitted.
    -------------------------------------------------------------------------- */
 
-typedef struct _StgFunInfoTable {
-#if defined(TABLES_NEXT_TO_CODE)
-    StgFun         *slow_apply; // apply to args on the stack
+typedef struct _StgFunInfoExtraRev {
+    StgWord        slow_apply_offset; // apply to args on the stack
     StgWord        bitmap;     // arg ptr/nonptr bitmap
     StgWord        bitmap;     // arg ptr/nonptr bitmap
-    StgSRT         *srt;       // pointer to the SRT table
+    StgWord        srt_offset; // pointer to the SRT table
     StgHalfWord    fun_type;    // function type
     StgHalfWord    arity;       // function arity
     StgHalfWord    fun_type;    // function type
     StgHalfWord    arity;       // function arity
-    StgInfoTable i;
-#else
-    StgInfoTable i;
+} StgFunInfoExtraRev;
+
+typedef struct _StgFunInfoExtraFwd {
     StgHalfWord    fun_type;    // function type
     StgHalfWord    arity;       // function arity
     StgSRT         *srt;       // pointer to the SRT table
     StgWord        bitmap;     // arg ptr/nonptr bitmap
     StgFun         *slow_apply; // apply to args on the stack
     StgHalfWord    fun_type;    // function type
     StgHalfWord    arity;       // function arity
     StgSRT         *srt;       // pointer to the SRT table
     StgWord        bitmap;     // arg ptr/nonptr bitmap
     StgFun         *slow_apply; // apply to args on the stack
+} StgFunInfoExtraFwd;
+
+typedef struct {
+#if defined(TABLES_NEXT_TO_CODE)
+    StgFunInfoExtraRev f;
+    StgInfoTable i;
+#else
+    StgInfoTable i;
+    StgFunInfoExtraFwd f;
 #endif
 } StgFunInfoTable;
 
 #endif
 } StgFunInfoTable;
 
@@ -286,17 +314,15 @@ typedef struct _StgFunInfoTable {
    -------------------------------------------------------------------------- */
 
 // When info tables are laid out backwards, we can omit the SRT
    -------------------------------------------------------------------------- */
 
 // When info tables are laid out backwards, we can omit the SRT
-// pointer iff srt_len is zero.
+// pointer iff srt_bitmap is zero.
 
 
-typedef struct _StgRetInfoTable {
-#if !defined(TABLES_NEXT_TO_CODE)
-    StgInfoTable i;
-#endif
-    StgSRT         *srt;       // pointer to the SRT table
+typedef struct {
 #if defined(TABLES_NEXT_TO_CODE)
 #if defined(TABLES_NEXT_TO_CODE)
+    StgWord      srt_offset;   // offset to the SRT table
     StgInfoTable i;
     StgInfoTable i;
-#endif
-#if !defined(TABLES_NEXT_TO_CODE)
+#else
+    StgInfoTable i;
+    StgSRT      *srt;  // pointer to the SRT table
     StgFunPtr vector[FLEXIBLE_ARRAY];
 #endif
 } StgRetInfoTable;
     StgFunPtr vector[FLEXIBLE_ARRAY];
 #endif
 } StgRetInfoTable;
@@ -306,16 +332,56 @@ typedef struct _StgRetInfoTable {
    -------------------------------------------------------------------------- */
 
 // When info tables are laid out backwards, we can omit the SRT
    -------------------------------------------------------------------------- */
 
 // When info tables are laid out backwards, we can omit the SRT
-// pointer iff srt_len is zero.
+// pointer iff srt_bitmap is zero.
 
 typedef struct _StgThunkInfoTable {
 #if !defined(TABLES_NEXT_TO_CODE)
     StgInfoTable i;
 #endif
 
 typedef struct _StgThunkInfoTable {
 #if !defined(TABLES_NEXT_TO_CODE)
     StgInfoTable i;
 #endif
+#if defined(TABLES_NEXT_TO_CODE)
+    StgWord        srt_offset; // offset to the SRT table
+#else
     StgSRT         *srt;       // pointer to the SRT table
     StgSRT         *srt;       // pointer to the SRT table
+#endif
 #if defined(TABLES_NEXT_TO_CODE)
     StgInfoTable i;
 #endif
 } StgThunkInfoTable;
 
 #if defined(TABLES_NEXT_TO_CODE)
     StgInfoTable i;
 #endif
 } StgThunkInfoTable;
 
+
+/* -----------------------------------------------------------------------------
+   Accessor macros for fields that might be offsets (C version)
+   -------------------------------------------------------------------------- */
+
+// GET_SRT(info)
+// info must be a Stg[Ret|Thunk]InfoTable* (an info table that has a SRT)
+#ifdef TABLES_NEXT_TO_CODE
+#define GET_SRT(info) ((StgSRT*) (((StgWord) ((info)+1)) + (info)->srt_offset))
+#else
+#define GET_SRT(info) ((info)->srt)
+#endif
+
+// GET_FUN_SRT(info)
+// info must be a StgFunInfoTable*
+#ifdef TABLES_NEXT_TO_CODE
+#define GET_FUN_SRT(info) ((StgSRT*) (((StgWord) ((info)+1)) + (info)->f.srt_offset))
+#else
+#define GET_FUN_SRT(info) ((info)->f.srt)
+#endif
+
+#ifdef TABLES_NEXT_TO_CODE
+#define GET_LARGE_BITMAP(info) ((StgLargeBitmap*) (((StgWord) ((info)+1)) \
+                                        + (info)->layout.large_bitmap_offset))
+#else
+#define GET_LARGE_BITMAP(info) ((info)->layout.large_bitmap)
+#endif
+
+#ifdef TABLES_NEXT_TO_CODE
+#define GET_FUN_LARGE_BITMAP(info) ((StgLargeBitmap*) (((StgWord) ((info)+1)) \
+                                        + (info)->f.bitmap))
+#else
+#define GET_FUN_LARGE_BITMAP(info) ((StgLargeBitmap*) ((info)->f.bitmap))
+#endif
+
+
 #endif /* INFOTABLES_H */
 #endif /* INFOTABLES_H */