X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FClosures.h;h=d5467928ed48a5bf8ee8e4a03bf352c5f6419d86;hb=423d477bfecd490de1449c59325c8776f91d7aac;hp=93fadd2122bce820040bd7e49c42895f2bd9e6cf;hpb=6a02dd25682e76484d2505ec7139948e6a32b9ee;p=ghc-hetmet.git diff --git a/ghc/includes/Closures.h b/ghc/includes/Closures.h index 93fadd2..d546792 100644 --- a/ghc/includes/Closures.h +++ b/ghc/includes/Closures.h @@ -1,7 +1,6 @@ /* ---------------------------------------------------------------------------- - * $Id: Closures.h,v 1.34 2003/11/14 09:27:00 stolz Exp $ * - * (c) The GHC Team, 1998-1999 + * (c) The GHC Team, 1998-2004 * * Closures * @@ -22,8 +21,8 @@ typedef struct { CostCentreStack *ccs; union { - struct _RetainerSet *rs; /* Retainer Set */ - StgWord ldvw; /* Lag/Drag/Void Word */ + struct _RetainerSet *rs; // Retainer Set + StgWord ldvw; // Lag/Drag/Void Word } hp; } StgProfHeader; @@ -52,8 +51,6 @@ typedef struct { #endif } StgHeader; -#define FIXED_HS (sizeof(StgHeader)) - /* ----------------------------------------------------------------------------- Closure Types @@ -95,14 +92,14 @@ typedef struct { StgClosure *payload[FLEXIBLE_ARRAY]; } StgPAP; -/* AP closures have the same layout, for convenience */ +// AP closures have the same layout, for convenience typedef StgPAP StgAP; typedef struct { StgHeader header; - StgWord size; /* number of words in payload */ + StgWord size; // number of words in payload StgClosure *fun; - StgClosure *payload[FLEXIBLE_ARRAY]; /* contains a chunk of *stack* */ + StgClosure *payload[FLEXIBLE_ARRAY]; // contains a chunk of *stack* } StgAP_STACK; typedef struct { @@ -218,13 +215,13 @@ typedef struct _StgDeadWeak { /* Weak v */ 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 */ - StgHalfWord arity; /* arity of this BCO */ - StgHalfWord size; /* size of this BCO (in words) */ - StgWord bitmap[FLEXIBLE_ARRAY]; /* an StgLargeBitmap */ + 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 + StgHalfWord arity; // arity of this BCO + StgHalfWord size; // size of this BCO (in words) + StgWord bitmap[FLEXIBLE_ARRAY]; // an StgLargeBitmap } StgBCO; #define BCO_BITMAP(bco) ((StgLargeBitmap *)((StgBCO *)(bco))->bitmap) @@ -233,11 +230,53 @@ typedef struct { #define BCO_BITMAP_SIZEW(bco) ((BCO_BITMAP_SIZE(bco) + BITS_IN(StgWord) - 1) \ / BITS_IN(StgWord)) -/* Dynamic stack frames - these have a liveness mask in the object - * itself, rather than in the info table. Useful for generic heap - * check code. See StgMacros.h, HEAP_CHK_GEN(). - */ - +/* ----------------------------------------------------------------------------- + Dynamic stack frames for generic heap checks. + + These generic heap checks are slow, but have the advantage of being + usable in a variety of situations. + + The one restriction is that any relevant SRTs must already be pointed + to from the stack. The return address doesn't need to have an info + table attached: hence it can be any old code pointer. + + The liveness mask contains a 1 at bit n, if register Rn contains a + non-pointer. The contents of all 8 vanilla registers are always saved + on the stack; the liveness mask tells the GC which ones contain + pointers. + + Good places to use a generic heap check: + + - case alternatives (the return address with an SRT is already + on the stack). + + - primitives (no SRT required). + + The stack frame layout for a RET_DYN is like this: + + some pointers |-- RET_DYN_PTRS(liveness) words + some nonpointers |-- RET_DYN_NONPTRS(liveness) words + + L1 \ + D1-2 |-- RET_DYN_NONPTR_REGS_SIZE words + F1-4 / + + R1-8 |-- RET_DYN_BITMAP_SIZE words + + return address \ + liveness mask |-- StgRetDyn structure + stg_gen_chk_info / + + we assume that the size of a double is always 2 pointers (wasting a + word when it is only one pointer, but avoiding lots of #ifdefs). + + See Liveness.h for the macros (RET_DYN_PTRS() etc.). + + NOTE: if you change the layout of RET_DYN stack frames, then you + might also need to adjust the value of RESERVED_STACK_WORDS in + Constants.h. + -------------------------------------------------------------------------- */ + typedef struct { const struct _StgInfoTable* info; StgWord liveness;