X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FStorage.h;h=c938fd8244a4b7ea41b2e6679d33809324ae0976;hb=40df40956025fdb4d7d81e89f6c27755a9df8f46;hp=12f9982c5257e4c3801b774f6ac3bfdc567d285b;hpb=fa092c29d011e70a5658e726bbf523149f4dfbe2;p=ghc-hetmet.git diff --git a/ghc/rts/Storage.h b/ghc/rts/Storage.h index 12f9982..c938fd8 100644 --- a/ghc/rts/Storage.h +++ b/ghc/rts/Storage.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Storage.h,v 1.50 2003/03/26 17:40:57 sof Exp $ + * $Id: Storage.h,v 1.52 2003/04/22 16:25:12 simonmar Exp $ * * (c) The GHC Team, 1998-2002 * @@ -163,15 +163,16 @@ recordOldToNewPtrs(StgMutClosure *p) // We zero out the slop when PROFILING is on. // #ifndef DEBUG #if !defined(DEBUG) && !defined(PROFILING) -#define updateWithIndirection(info, p1, p2) \ +#define updateWithIndirection(info, ind_info, p1, p2, and_then) \ { \ bdescr *bd; \ \ bd = Bdescr((P_)p1); \ if (bd->gen_no == 0) { \ ((StgInd *)p1)->indirectee = p2; \ - SET_INFO(p1,&stg_IND_info); \ + SET_INFO(p1,ind_info); \ TICK_UPD_NEW_IND(); \ + and_then; \ } else { \ ((StgIndOldGen *)p1)->indirectee = p2; \ if (info != &stg_BLACKHOLE_BQ_info) { \ @@ -182,6 +183,7 @@ recordOldToNewPtrs(StgMutClosure *p) } \ SET_INFO(p1,&stg_IND_OLDGEN_info); \ TICK_UPD_OLD_IND(); \ + and_then; \ } \ } #elif defined(PROFILING) @@ -195,7 +197,7 @@ recordOldToNewPtrs(StgMutClosure *p) // the invariants that every closure keeps its creation time in the profiling // field. So, we call LDV_recordCreate(). -#define updateWithIndirection(info, p1, p2) \ +#define updateWithIndirection(info, ind_info, p1, p2, and_then) \ { \ bdescr *bd; \ \ @@ -203,9 +205,10 @@ recordOldToNewPtrs(StgMutClosure *p) bd = Bdescr((P_)p1); \ if (bd->gen_no == 0) { \ ((StgInd *)p1)->indirectee = p2; \ - SET_INFO(p1,&stg_IND_info); \ + SET_INFO(p1,ind_info); \ LDV_recordCreate((p1)); \ TICK_UPD_NEW_IND(); \ + and_then; \ } else { \ ((StgIndOldGen *)p1)->indirectee = p2; \ if (info != &stg_BLACKHOLE_BQ_info) { \ @@ -216,6 +219,7 @@ recordOldToNewPtrs(StgMutClosure *p) } \ SET_INFO(p1,&stg_IND_OLDGEN_info); \ LDV_recordCreate((p1)); \ + and_then; \ } \ } @@ -229,7 +233,7 @@ recordOldToNewPtrs(StgMutClosure *p) * already have been updated (the mutable list will get messed up * otherwise). */ -#define updateWithIndirection(info, p1, p2) \ +#define updateWithIndirection(info, ind_info, p1, p2, and_then) \ { \ bdescr *bd; \ \ @@ -237,8 +241,9 @@ recordOldToNewPtrs(StgMutClosure *p) bd = Bdescr((P_)p1); \ if (bd->gen_no == 0) { \ ((StgInd *)p1)->indirectee = p2; \ - SET_INFO(p1,&stg_IND_info); \ + SET_INFO(p1,ind_info); \ TICK_UPD_NEW_IND(); \ + and_then; \ } else { \ if (info != &stg_BLACKHOLE_BQ_info) { \ { \ @@ -259,6 +264,7 @@ recordOldToNewPtrs(StgMutClosure *p) ((StgIndOldGen *)p1)->indirectee = p2; \ SET_INFO(p1,&stg_IND_OLDGEN_info); \ TICK_UPD_OLD_IND(); \ + and_then; \ } \ } #endif @@ -413,7 +419,8 @@ static inline StgWord stack_frame_sizeW( StgClosure *frame ) case RET_DYN: { StgRetDyn *dyn = (StgRetDyn *)frame; - return sizeofW(StgRetDyn) + RET_DYN_SIZE + + return sizeofW(StgRetDyn) + RET_DYN_BITMAP_SIZE + + RET_DYN_NONPTR_REGS_SIZE + GET_PTRS(dyn->liveness) + GET_NONPTRS(dyn->liveness); }