/* ----------------------------------------------------------------------------
- * $Id: Closures.h,v 1.22 2000/12/15 10:37:51 sewardj Exp $
+ * $Id: Closures.h,v 1.28 2001/10/03 13:57:42 simonmar Exp $
*
* (c) The GHC Team, 1998-1999
*
The profiling header
-------------------------------------------------------------------------- */
-#ifdef PROFILING
-
typedef struct {
CostCentreStack *ccs;
} 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
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
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 {
StgHeader header;
- StgClosure *literals; /* a pointer to an ArrWords */
- StgClosure *instrs; /* a pointer to an ArrWords */
- StgClosure *ptrs; /* a pointer to a MutArrPtrs */
- StgClosure *itbls; /* a pointer to an ArrWords */
-} StgBCO;
-
-typedef struct {
- StgHeader header;
StgClosure *indirectee;
} StgInd;
} StgIndOldGen;
typedef struct {
- StgHeader header;
- StgClosure *indirectee;
- StgClosure *static_link;
-} StgIndStatic;
-
-typedef struct StgCAF_ {
StgHeader header;
- StgClosure *body;
- StgMutClosure *mut_link;
- StgClosure *value;
- struct StgCAF_ *link;
-} StgCAF;
+ StgClosure *indirectee;
+ StgClosure *static_link;
+ struct _StgInfoTable *saved_info;
+} StgIndStatic;
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 {
StgMutClosure *mut_link;
} StgMutVar;
+typedef struct {
+ StgHeader header;
+ StgArrWords *instrs; /* a pointer to an ArrWords */
+ StgArrWords *literals; /* a pointer to an ArrWords */
+ StgMutArrPtrs *ptrs; /* a pointer to a MutArrPtrs */
+ StgArrWords *itbls; /* a pointer to an ArrWords */
+} StgBCO;
+
/*
A collective typedef for all linkable stack frames i.e.
StgUpdateFrame, StgSeqFrame, StgCatchFrame
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_ {