/* ----------------------------------------------------------------------------
- * $Id: Closures.h,v 1.26 2001/02/11 17:51:08 simonmar Exp $
+ * $Id: Closures.h,v 1.31 2002/01/29 16:52:46 simonmar Exp $
*
* (c) The GHC Team, 1998-1999
*
The profiling header
-------------------------------------------------------------------------- */
-#ifdef PROFILING
-
typedef struct {
- CostCentreStack *ccs;
+ CostCentreStack *ccs;
+ union {
+ struct _RetainerSet *rs; // Retainer Set
+ StgWord ldvw; // Lag/Drag/Void Word
+ } hp;
} StgProfHeader;
-#else /* !PROFILING */
-
-typedef struct {
- /* empty */
-} StgProfHeader;
-
-#endif /* PROFILING */
-
-/* -----------------------------------------------------------------------------
- The parallel header
- -------------------------------------------------------------------------- */
-
-#ifdef PAR
-
-typedef struct {
- /* StgWord ga; */ /* nope! global addresses are managed via a hash table */
-} StgParHeader;
-
-#else /* !PAR */
-
-typedef struct {
- /* empty */
-} StgParHeader;
-
-#endif /* PAR */
-
/* -----------------------------------------------------------------------------
The GranSim header
-------------------------------------------------------------------------- */
-#if defined(GRAN)
-
typedef struct {
StgWord procs; /* bitmask indicating on which PEs this closure resides */
} StgGranHeader;
-#else /* !GRAN */
-
-typedef struct {
- /* empty */
-} StgGranHeader;
-
-#endif /* GRAN */
-
-/* -----------------------------------------------------------------------------
- The ticky-ticky header
-
- Comment from old Ticky.h:
-
- This is used to record if a closure has been updated but not yet
- entered. It is set when the closure is updated and cleared when
- subsequently entered.
-
- NB: It is {\em not} an ``entry count'', it is an
- ``entries-after-update count.''
-
- The commoning up of @CONST@, @CHARLIKE@ and @INTLIKE@ closures is
- turned off(?) if this is required. This has only been done for 2s
- collection. It is done using a nasty hack which defines the
- @_Evacuate@ and @_Scavenge@ code for @CONST@, @CHARLIKE@ and @INTLIKE@
- info tables to be @_Evacuate_1@ and @_Scavenge_1_0@.
- -------------------------------------------------------------------------- */
-
-#ifdef TICKY_TICKY
-
-typedef struct {
- /* old: W_ updated; */
-} StgTickyHeader;
-
-#else /* !TICKY_TICKY */
-
-typedef struct {
- /* empty */
-} StgTickyHeader;
-
-#endif /* TICKY_TICKY */
-
/* -----------------------------------------------------------------------------
The full fixed-size closure header
#ifdef PROFILING
StgProfHeader prof;
#endif
-#ifdef PAR
- StgParHeader par;
-#endif
#ifdef GRAN
StgGranHeader gran;
#endif
-#ifdef TICKY_TICKY
- StgTickyHeader ticky;
-#endif
} StgHeader;
#define FIXED_HS (sizeof(StgHeader))
struct StgClosure_ {
StgHeader header;
- struct StgClosure_ *payload[0];
+ struct StgClosure_ *payload[FLEXIBLE_ARRAY];
};
/* What a stroke of luck - all our mutable closures follow the same
StgHeader header;
StgWord padding;
struct StgMutClosure_ *mut_link;
- struct StgClosure_ *payload[0];
+ struct StgClosure_ *payload[FLEXIBLE_ARRAY];
} StgMutClosure;
typedef struct {
StgHeader header;
StgWord n_args;
StgClosure *fun;
- StgClosure *payload[0];
+ StgClosure *payload[FLEXIBLE_ARRAY];
} StgPAP;
typedef struct {
StgHeader header;
StgWord n_args;
StgClosure *fun;
- StgClosure *payload[0];
+ StgClosure *payload[FLEXIBLE_ARRAY];
} StgAP_UPD;
typedef struct {
typedef struct {
StgHeader header;
StgWord words;
- StgWord payload[0];
+ StgWord payload[FLEXIBLE_ARRAY];
} StgArrWords;
typedef struct {
StgHeader header;
StgWord ptrs;
StgMutClosure *mut_link; /* mutable list */
- StgClosure *payload[0];
+ StgClosure *payload[FLEXIBLE_ARRAY];
} StgMutArrPtrs;
typedef struct {
const struct _StgInfoTable* info;
StgWord liveness;
StgWord ret_addr;
- StgWord payload[0];
+ StgWord payload[FLEXIBLE_ARRAY];
} StgRetDyn;
/* Concurrent communication objects */
StgHeader header;
struct StgBlockingQueueElement_ *link; /* next elem in BQ */
StgMutClosure *mut_link; /* next elem in mutable list */
- struct StgClosure_ *payload[0];/* contents of the closure */
+ struct StgClosure_ *payload[FLEXIBLE_ARRAY];/* contents of the closure */
} StgBlockingQueueElement;
/* only difference to std code is type of the elem in the BQ */
/* this closure is hanging at the end of a blocking queue in (see RBH.c) */
typedef struct StgRBHSave_ {
StgHeader header;
- StgClosure *payload[0]; /* 2 words ripped out of the guts of the */
+ StgClosure *payload[FLEXIBLE_ARRAY]; /* 2 words ripped out of the guts of the */
} StgRBHSave; /* closure holding the blocking queue */
typedef struct StgRBH_ {