X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FStgMacros.h;h=bb1fcf69d0c2ba580e3776bd3e88f528b3b90907;hb=98744cef7b82e7eefbb1c6f1d8b9e28c415939c4;hp=b7e2fc547c1f4a5b3ee4457870066f3b691fa94d;hpb=0bffc410964e1688ad80d277d53400659e697ab5;p=ghc-hetmet.git diff --git a/ghc/includes/StgMacros.h b/ghc/includes/StgMacros.h index b7e2fc5..bb1fcf6 100644 --- a/ghc/includes/StgMacros.h +++ b/ghc/includes/StgMacros.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: StgMacros.h,v 1.50 2002/12/11 15:36:39 simonmar Exp $ + * $Id: StgMacros.h,v 1.57 2003/11/12 17:27:04 sof Exp $ * * (c) The GHC Team, 1998-1999 * @@ -230,25 +230,41 @@ typedef StgWord StgWordArray[]; The stack frame layout for a RET_DYN is like this: - some pointers - some nonpointers - DblReg1-2 - FltReg1-4 - R1-8 - return address - liveness mask - stg_gen_chk_info + some pointers |-- GET_PTRS(liveness) words + some nonpointers |-- GET_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). + 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. -------------------------------------------------------------------------- */ // VERY MAGIC CONSTANTS! -// must agree with code in HeapStackCheck.c, stg_gen_chk +// must agree with code in HeapStackCheck.c, stg_gen_chk, and +// RESERVED_STACK_WORDS in Constants.h. // -#define ALL_NON_PTRS 0xffff -#define RET_DYN_SIZE 16 +#define RET_DYN_BITMAP_SIZE 8 +#define RET_DYN_NONPTR_REGS_SIZE 10 +#define ALL_NON_PTRS 0xff + +// Sanity check that RESERVED_STACK_WORDS is reasonable. We can't +// just derive RESERVED_STACK_WORDS because it's used in Haskell code +// too. +#if RESERVED_STACK_WORDS != (3 + RET_DYN_BITMAP_SIZE + RET_DYN_NONPTR_REGS_SIZE) +#error RESERVED_STACK_WORDS may be wrong! +#endif #define LIVENESS_MASK(ptr_regs) (ALL_NON_PTRS ^ (ptr_regs)) @@ -429,6 +445,14 @@ EXTFUN_RTS(stg_gen_block); # else // An object is replaced by a blackhole, so we fill the slop with zeros. // +// This looks like it can't work - we're overwriting the contents of +// the THUNK with slop! Perhaps this never worked??? --SDM +// The problem is that with eager-black-holing we currently perform +// the black-holing operation at the *beginning* of the basic block, +// when we still need the contents of the thunk. +// Perhaps the thing to do is to overwrite it at the *end* of the +// basic block, when we've already sucked out the thunk's contents? -- SLPJ +// // Todo: maybe use SET_HDR() and remove LDV_recordCreate()? // # define UPD_BH_UPDATABLE(info) \ @@ -448,8 +472,6 @@ EXTFUN_RTS(stg_gen_block); # define UPD_BH_SINGLE_ENTRY(thunk) /* nothing */ #endif /* EAGER_BLACKHOLING */ -#define UPD_FRAME_UPDATEE(p) ((P_)(((StgUpdateFrame *)(p))->updatee)) - /* ----------------------------------------------------------------------------- Moving Floats and Doubles @@ -461,24 +483,24 @@ EXTFUN_RTS(stg_gen_block); guaranteed to be StgWord aligned. -------------------------------------------------------------------------- */ -static inline void ASSIGN_FLT (W_ [], StgFloat); -static inline StgFloat PK_FLT (W_ []); +INLINE_HEADER void ASSIGN_FLT (W_ [], StgFloat); +INLINE_HEADER StgFloat PK_FLT (W_ []); #if ALIGNMENT_FLOAT <= ALIGNMENT_LONG -static inline void ASSIGN_FLT(W_ p_dest[], StgFloat src) { *(StgFloat *)p_dest = src; } -static inline StgFloat PK_FLT (W_ p_src[]) { return *(StgFloat *)p_src; } +INLINE_HEADER void ASSIGN_FLT(W_ p_dest[], StgFloat src) { *(StgFloat *)p_dest = src; } +INLINE_HEADER StgFloat PK_FLT (W_ p_src[]) { return *(StgFloat *)p_src; } #else /* ALIGNMENT_FLOAT > ALIGNMENT_UNSIGNED_INT */ -static inline void ASSIGN_FLT(W_ p_dest[], StgFloat src) +INLINE_HEADER void ASSIGN_FLT(W_ p_dest[], StgFloat src) { float_thing y; y.f = src; *p_dest = y.fu; } -static inline StgFloat PK_FLT(W_ p_src[]) +INLINE_HEADER StgFloat PK_FLT(W_ p_src[]) { float_thing y; y.fu = *p_src; @@ -489,11 +511,11 @@ static inline StgFloat PK_FLT(W_ p_src[]) #if ALIGNMENT_DOUBLE <= ALIGNMENT_LONG -static inline void ASSIGN_DBL (W_ [], StgDouble); -static inline StgDouble PK_DBL (W_ []); +INLINE_HEADER void ASSIGN_DBL (W_ [], StgDouble); +INLINE_HEADER StgDouble PK_DBL (W_ []); -static inline void ASSIGN_DBL(W_ p_dest[], StgDouble src) { *(StgDouble *)p_dest = src; } -static inline StgDouble PK_DBL (W_ p_src[]) { return *(StgDouble *)p_src; } +INLINE_HEADER void ASSIGN_DBL(W_ p_dest[], StgDouble src) { *(StgDouble *)p_dest = src; } +INLINE_HEADER StgDouble PK_DBL (W_ p_src[]) { return *(StgDouble *)p_src; } #else /* ALIGNMENT_DOUBLE > ALIGNMENT_LONG */ @@ -519,8 +541,8 @@ static inline StgDouble PK_DBL (W_ p_src[]) { return *(StgDou #else /* ! sparc_TARGET_ARCH */ -static inline void ASSIGN_DBL (W_ [], StgDouble); -static inline StgDouble PK_DBL (W_ []); +INLINE_HEADER void ASSIGN_DBL (W_ [], StgDouble); +INLINE_HEADER StgDouble PK_DBL (W_ []); typedef struct { StgWord dhi; @@ -532,7 +554,7 @@ typedef union unpacked_double du; } double_thing; -static inline void ASSIGN_DBL(W_ p_dest[], StgDouble src) +INLINE_HEADER void ASSIGN_DBL(W_ p_dest[], StgDouble src) { double_thing y; y.d = src; @@ -548,7 +570,7 @@ static inline void ASSIGN_DBL(W_ p_dest[], StgDouble src) *(p_dest+1) = ((double_thing) src).du.dlo \ */ -static inline StgDouble PK_DBL(W_ p_src[]) +INLINE_HEADER StgDouble PK_DBL(W_ p_src[]) { double_thing y; y.du.dhi = p_src[0]; @@ -577,7 +599,7 @@ typedef union unpacked_double_word wu; } word64_thing; -static inline void ASSIGN_Word64(W_ p_dest[], StgWord64 src) +INLINE_HEADER void ASSIGN_Word64(W_ p_dest[], StgWord64 src) { word64_thing y; y.w = src; @@ -585,7 +607,7 @@ static inline void ASSIGN_Word64(W_ p_dest[], StgWord64 src) p_dest[1] = y.wu.dlo; } -static inline StgWord64 PK_Word64(W_ p_src[]) +INLINE_HEADER StgWord64 PK_Word64(W_ p_src[]) { word64_thing y; y.wu.dhi = p_src[0]; @@ -593,7 +615,7 @@ static inline StgWord64 PK_Word64(W_ p_src[]) return(y.w); } -static inline void ASSIGN_Int64(W_ p_dest[], StgInt64 src) +INLINE_HEADER void ASSIGN_Int64(W_ p_dest[], StgInt64 src) { int64_thing y; y.i = src; @@ -601,7 +623,7 @@ static inline void ASSIGN_Int64(W_ p_dest[], StgInt64 src) p_dest[1] = y.iu.dlo; } -static inline StgInt64 PK_Int64(W_ p_src[]) +INLINE_HEADER StgInt64 PK_Int64(W_ p_src[]) { int64_thing y; y.iu.dhi = p_src[0]; @@ -611,22 +633,22 @@ static inline StgInt64 PK_Int64(W_ p_src[]) #elif SIZEOF_VOID_P == 8 -static inline void ASSIGN_Word64(W_ p_dest[], StgWord64 src) +INLINE_HEADER void ASSIGN_Word64(W_ p_dest[], StgWord64 src) { p_dest[0] = src; } -static inline StgWord64 PK_Word64(W_ p_src[]) +INLINE_HEADER StgWord64 PK_Word64(W_ p_src[]) { return p_src[0]; } -static inline void ASSIGN_Int64(W_ p_dest[], StgInt64 src) +INLINE_HEADER void ASSIGN_Int64(W_ p_dest[], StgInt64 src) { p_dest[0] = src; } -static inline StgInt64 PK_Int64(W_ p_src[]) +INLINE_HEADER StgInt64 PK_Int64(W_ p_src[]) { return p_src[0]; } @@ -688,7 +710,7 @@ extern DLL_IMPORT_RTS const StgPolyInfoTable stg_catch_frame_info; #if IN_STG_CODE -static __inline__ void +INLINE_HEADER void SaveThreadState(void) { StgTSO *tso; @@ -710,7 +732,7 @@ SaveThreadState(void) #endif } -static __inline__ void +INLINE_HEADER void LoadThreadState (void) { StgTSO *tso;