/* ----------------------------------------------------------------------------
- * $Id: InfoTables.h,v 1.5 1999/01/18 15:21:42 simonm Exp $
+ * $Id: InfoTables.h,v 1.16 1999/06/25 09:13:37 simonmar Exp $
*
+ * (c) The GHC Team, 1998-1999
+ *
* Info Tables
*
* -------------------------------------------------------------------------- */
#endif /* DEBUG_CLOSURE */
-/* -----------------------------------------------------------------------------
- Closure Types
-
- If you add or delete any closure types, don't forget to update
- ClosureTypes.h for the native code generator. This is a temporary
- measure (I hope).
- -------------------------------------------------------------------------- */
-
-typedef enum {
-
- INVALID_OBJECT /* Object tag 0 raises an internal error */
- , CONSTR
- /* CONSTR_p_np */
- , CONSTR_INTLIKE
- , CONSTR_CHARLIKE
- , CONSTR_STATIC
- , CONSTR_NOCAF_STATIC
-
- , FUN
- , FUN_STATIC
-
- , THUNK
- /* THUNK_p_np */
- , THUNK_STATIC
- , THUNK_SELECTOR
-
- , BCO
- , AP_UPD
-
- , PAP /* should be called AP_NUPD */
-
- , IND
- , IND_OLDGEN
- , IND_PERM
- , IND_OLDGEN_PERM
- , IND_STATIC
-
- , CAF_UNENTERED
- , CAF_ENTERED
- , CAF_BLACKHOLE
-
- , RET_BCO
- , RET_SMALL
- , RET_VEC_SMALL
- , RET_BIG
- , RET_VEC_BIG
- , RET_DYN
- , UPDATE_FRAME
- , CATCH_FRAME
- , STOP_FRAME
- , SEQ_FRAME
-
- , BLACKHOLE
- , BLACKHOLE_BQ
-
- , MVAR
-
- , ARR_WORDS
- , MUT_ARR_WORDS
-
- , MUT_ARR_PTRS
- , MUT_ARR_PTRS_FROZEN
-
- , MUT_VAR
-
- , WEAK
- , FOREIGN
-
- , TSO
-
- , BLOCKED_FETCH
- , FETCH_ME
-
- , EVACUATED
-
- , N_CLOSURE_TYPES /* number of distinct closure types */
-
-} StgClosureType;
-
/* The type flags provide quick access to certain properties of a closure. */
#define _HNF (1<<0) /* head normal form? */
#define _UPT (1<<6) /* unpointed? */
#define _SRT (1<<7) /* has an SRT? */
-#define isSTATIC(flags) ((flags)&_STA)
-#define isMUTABLE(flags) ((flags) &_MUT)
-
-#define closure_STATIC(closure) ( get_itbl(closure)->flags & _STA)
-#define closure_SHOULD_SPARK(closure) (!(get_itbl(closure)->flags & _NS))
-#define closure_MUTABLE(closure) ( get_itbl(closure)->flags & _MUT)
-#define closure_UNPOINTED(closure) ( get_itbl(closure)->flags & _UPT)
-
-/* HNF BTM NS STA THU MUT UPT SRT */
-
-#define FLAGS_CONSTR (_HNF| _NS )
-#define FLAGS_CONSTR_STATIC (_HNF| _NS|_STA )
-#define FLAGS_CONSTR_NOCAF_STATIC (_HNF| _NS|_STA )
-#define FLAGS_FUN (_HNF| _NS| _SRT )
-#define FLAGS_FUN_STATIC (_HNF| _NS|_STA| _SRT )
-#define FLAGS_THUNK ( _BTM| _THU| _SRT )
-#define FLAGS_THUNK_STATIC ( _BTM| _STA|_THU| _SRT )
-#define FLAGS_THUNK_SELECTOR ( _BTM| _THU| _SRT )
-#define FLAGS_BCO (_HNF| _NS )
-#define FLAGS_CAF_UNENTERED 0 /* Do we still use these? */
-#define FLAGS_CAF_ENTERED 0
-#define FLAGS_CAF_BLACKHOLE ( _BTM|_NS| _UPT )
-#define FLAGS_AP_UPD ( _BTM| _THU )
-#define FLAGS_PAP (_HNF| _NS )
-#define FLAGS_IND 0
-#define FLAGS_IND_OLDGEN 0
-#define FLAGS_IND_PERM 0
-#define FLAGS_IND_OLDGEN_PERM 0
-#define FLAGS_IND_STATIC ( _STA )
-#define FLAGS_EVACUATED 0
-#define FLAGS_ARR_WORDS (_HNF| _NS| _UPT )
-#define FLAGS_MUT_ARR_WORDS (_HNF| _NS| _MUT|_UPT )
-#define FLAGS_MUT_ARR_PTRS (_HNF| _NS| _MUT|_UPT )
-#define FLAGS_MUT_ARR_PTRS_FROZEN (_HNF| _NS| _MUT|_UPT )
-#define FLAGS_MUT_VAR (_HNF| _NS| _MUT|_UPT )
-#define FLAGS_FOREIGN (_HNF| _NS| _UPT )
-#define FLAGS_WEAK (_HNF| _NS| _UPT )
-#define FLAGS_BLACKHOLE ( _NS| _UPT )
-#define FLAGS_BLACKHOLE_BQ ( _NS| _MUT|_UPT )
-#define FLAGS_MVAR (_HNF| _NS| _MUT|_UPT )
-#define FLAGS_FETCH_ME (_HNF| _NS )
-#define FLAGS_TSO (_HNF| _NS| _MUT|_UPT )
-#define FLAGS_RET_BCO ( _BTM )
-#define FLAGS_RET_SMALL ( _BTM| _SRT)
-#define FLAGS_RET_VEC_SMALL ( _BTM| _SRT)
-#define FLAGS_RET_BIG ( _SRT)
-#define FLAGS_RET_VEC_BIG ( _SRT)
-#define FLAGS_RET_DYN ( _SRT)
-#define FLAGS_CATCH_FRAME ( _BTM )
-#define FLAGS_STOP_FRAME ( _BTM )
-#define FLAGS_SEQ_FRAME ( _BTM )
-#define FLAGS_UPDATE_FRAME ( _BTM )
+#define isSTATIC(flags) ((flags) &_STA)
+#define isMUTABLE(flags) ((flags) &_MUT)
+#define isBITMAP(flags) ((flags) &_BTM)
+#define isTHUNK(flags) ((flags) &_THU)
+#define isUNPOINTED(flags) ((flags) &_UPT)
+#define hasSRT(flags) ((flags) &_SRT)
+
+extern StgWord16 closure_flags[];
+
+#define closureFlags(c) (closure_flags[get_itbl(c)->type])
+
+#define closure_STATIC(c) ( closureFlags(c) & _STA)
+#define closure_SHOULD_SPARK(c) (!(closureFlags(c) & _NS))
+#define closure_MUTABLE(c) ( closureFlags(c) & _MUT)
+#define closure_UNPOINTED(c) ( closureFlags(c) & _UPT)
+
/* -----------------------------------------------------------------------------
Info Tables
*/
typedef union {
-
- StgWord bitmap; /* bit pattern, 1 = pointer, 0 = non-pointer */
- StgWord selector_offset; /* used in THUNK_SELECTORs */
- StgLargeBitmap* large_bitmap; /* pointer to large bitmap structure */
-
#if SIZEOF_VOID_P == 8
struct {
- StgNat32 ptrs; /* number of pointers */
- StgNat32 nptrs; /* number of non-pointers */
+ StgWord32 ptrs; /* number of pointers */
+ StgWord32 nptrs; /* number of non-pointers */
} payload;
#else
struct {
- StgNat16 ptrs; /* number of pointers */
- StgNat16 nptrs; /* number of non-pointers */
+ StgWord16 ptrs; /* number of pointers */
+ StgWord16 nptrs; /* number of non-pointers */
} payload;
+
+ StgWord bitmap; /* bit pattern, 1 = pointer, 0 = non-pointer */
+ StgWord selector_offset; /* used in THUNK_SELECTORs */
+ StgLargeBitmap* large_bitmap; /* pointer to large bitmap structure */
+
#endif
} StgClosureInfo;
typedef struct _StgInfoTable {
StgSRT *srt; /* pointer to the SRT table */
+#ifdef PAR
StgParInfo par;
- StgProfInfo prof;
+#endif
+#ifdef PROFILING
+ /* StgProfInfo prof; */
+#endif
+#ifdef DEBUG_CLOSURE
StgDebugInfo debug;
+#endif
StgClosureInfo layout; /* closure layout info (pointer-sized) */
#if SIZEOF_VOID_P == 8
- StgNat16 flags; /* } */
- StgClosureType type : 16; /* } These 4 elements fit into 64 bits */
- StgNat32 srt_len; /* } */
+ StgWord32 type; /* } These 2 elements fit into 64 bits */
+ StgWord32 srt_len; /* } */
#else
- StgNat8 flags; /* } */
- StgClosureType type : 8; /* } These 4 elements fit into 32 bits */
- StgNat16 srt_len; /* } */
+ StgWord type : 16; /* } These 2 elements fit into 32 bits */
+ StgWord srt_len : 16; /* } */
#endif
-#if USE_MINIINTERPRETER
- StgFunPtr (*vector)[];
- StgFunPtr entry;
-#else
+#ifdef TABLES_NEXT_TO_CODE
StgCode code[0];
+#else
+ StgFunPtr entry;
+ StgFunPtr vector[0];
#endif
} StgInfoTable;
+/* Info tables are read-only, therefore we uniformly declare them with
+ * C's const attribute. This isn't just a nice thing to do: it's
+ * necessary because the garbage collector has to distinguish between
+ * closure pointers and info table pointers when traversing the
+ * stack. We distinguish the two by checking whether the pointer is
+ * into text-space or not.
+ */
+
+#define INFO_TBL_CONST const
+
#endif /* INFOTABLES_H */