[project @ 2004-09-20 07:27:15 by mthomas]
[ghc-hetmet.git] / ghc / includes / InfoTables.h
index 97c3bec..a605ba2 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.33 2004/08/13 13:09:17 simonmar Exp $
  * 
  * (c) The GHC Team, 1998-2002
  *
  * 
  * (c) The GHC Team, 1998-2002
  *
@@ -85,9 +85,11 @@ typedef struct {
    Ticky info
    -------------------------------------------------------------------------- */
 
    Ticky info
    -------------------------------------------------------------------------- */
 
+#if defined(SUPPORTS_EMPTY_STRUCTS)
 typedef struct {
     /* empty */
 } StgTickyInfo;
 typedef struct {
     /* empty */
 } StgTickyInfo;
+#endif
 
 /* -----------------------------------------------------------------------------
    Debugging info
 
 /* -----------------------------------------------------------------------------
    Debugging info
@@ -101,9 +103,11 @@ typedef struct {
 
 #else /* !DEBUG_CLOSURE */
 
 
 #else /* !DEBUG_CLOSURE */
 
-typedef struct {
+# if defined(SUPPORTS_EMPTY_STRUCTS)
+typedef struct StgDebugInfo {
        /* empty */
 } StgDebugInfo;
        /* empty */
 } StgDebugInfo;
+# endif
 
 #endif /* DEBUG_CLOSURE */
 
 
 #endif /* DEBUG_CLOSURE */
 
@@ -165,6 +169,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 +191,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
    ------------------------------------------------------------------------- */
@@ -211,11 +240,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 +255,16 @@ typedef struct _StgInfoTable {
     StgProfInfo     prof;
 #endif
 #ifdef TICKY
     StgProfInfo     prof;
 #endif
 #ifdef TICKY
-    StgTickyInfo    ticky;
+    MAYBE_EMPTY_STRUCT(StgTickyInfo,ticky)
 #endif
 #ifdef DEBUG_CLOSURE
 #endif
 #ifdef DEBUG_CLOSURE
-    StgDebugInfo    debug;
+    MAYBE_EMPTY_STRUCT(StgDebugInfo,debug)
 #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 +282,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)
+typedef struct _StgFunInfoExtraRev {
     StgFun         *slow_apply; // apply to args on the stack
     StgWord        bitmap;     // arg ptr/nonptr bitmap
     StgSRT         *srt;       // pointer to the SRT table
     StgHalfWord    fun_type;    // function type
     StgHalfWord    arity;       // function arity
     StgFun         *slow_apply; // apply to args on the stack
     StgWord        bitmap;     // arg ptr/nonptr bitmap
     StgSRT         *srt;       // pointer to the SRT table
     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 +318,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)
+    StgSRT      *srt;  // pointer 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,7 +336,7 @@ 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)
 
 typedef struct _StgThunkInfoTable {
 #if !defined(TABLES_NEXT_TO_CODE)