/* ----------------------------------------------------------------------------
- * $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
*
Ticky info
-------------------------------------------------------------------------- */
+#if defined(SUPPORTS_EMPTY_STRUCTS)
typedef struct {
/* empty */
} StgTickyInfo;
+#endif
/* -----------------------------------------------------------------------------
Debugging info
#else /* !DEBUG_CLOSURE */
-typedef struct {
+# if defined(SUPPORTS_EMPTY_STRUCTS)
+typedef struct StgDebugInfo {
/* empty */
} StgDebugInfo;
+# endif
#endif /* DEBUG_CLOSURE */
(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.
-------------------------------------------------------------------------- */
//
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
------------------------------------------------------------------------- */
//
-// An SRT.
-//
-typedef StgClosure* StgSRT[];
-
-//
// The "standard" part of an info table. Every info table has this bit.
//
typedef struct _StgInfoTable {
StgProfInfo prof;
#endif
#ifdef TICKY
- StgTickyInfo ticky;
+ MAYBE_EMPTY_STRUCT(StgTickyInfo,ticky)
#endif
#ifdef DEBUG_CLOSURE
- StgDebugInfo debug;
+ MAYBE_EMPTY_STRUCT(StgDebugInfo,debug)
#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];
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.
-------------------------------------------------------------------------- */
-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
- 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
+} StgFunInfoExtraFwd;
+
+typedef struct {
+#if defined(TABLES_NEXT_TO_CODE)
+ StgFunInfoExtraRev f;
+ StgInfoTable i;
+#else
+ StgInfoTable i;
+ StgFunInfoExtraFwd f;
#endif
} StgFunInfoTable;
-------------------------------------------------------------------------- */
// 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)
+ StgSRT *srt; // pointer to the SRT table
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;
-------------------------------------------------------------------------- */
// 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)