X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FHeapStackCheck.hc;h=ad8285c728a539daf25cd8d6bc9c64e78f35d803;hb=9428b42b8e4b21493055b54f176cffa0a5b879b6;hp=8d0c46a86a73486b5d34387af4439d08fd3610a3;hpb=50027272414438955dbc41696541cbd25da55883;p=ghc-hetmet.git diff --git a/ghc/rts/HeapStackCheck.hc b/ghc/rts/HeapStackCheck.hc index 8d0c46a..ad8285c 100644 --- a/ghc/rts/HeapStackCheck.hc +++ b/ghc/rts/HeapStackCheck.hc @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: HeapStackCheck.hc,v 1.16 2001/03/23 16:36:21 simonmar Exp $ + * $Id: HeapStackCheck.hc,v 1.20 2001/12/10 17:55:40 sewardj Exp $ * * (c) The GHC Team, 1998-1999 * @@ -12,7 +12,6 @@ #include "Storage.h" /* for CurrentTSO */ #include "StgRun.h" /* for StgReturn and register saving */ #include "Schedule.h" /* for context_switch */ -#include "HeapStackCheck.h" /* Stack/Heap Check Failure * ------------------------ @@ -48,10 +47,10 @@ * ThreadRunGHC thread. */ - #define GC_GENERIC \ if (Hp > HpLim) { \ - if (ExtendNursery(Hp,HpLim)) { \ + Hp -= HpAlloc; \ + if (HpAlloc <= BLOCK_SIZE_W && ExtendNursery(Hp,HpLim)) {\ if (context_switch) { \ R1.i = ThreadYielding; \ } else { \ @@ -70,7 +69,8 @@ #define GC_ENTER \ if (Hp > HpLim) { \ - if (ExtendNursery(Hp,HpLim)) { \ + Hp -= HpAlloc; \ + if (HpAlloc <= BLOCK_SIZE_W && ExtendNursery(Hp,HpLim)) {\ if (context_switch) { \ R1.i = ThreadYielding; \ } else { \ @@ -124,7 +124,6 @@ R1.i = ThreadBlocked; \ JMP_(StgReturn); - /* ----------------------------------------------------------------------------- Heap Checks -------------------------------------------------------------------------- */ @@ -152,7 +151,7 @@ EXTFUN(stg_gc_entertop) There are canned sequences for 'n' pointer values in registers. -------------------------------------------------------------------------- */ -EXTFUN(stg_gc_enter_1) +EXTFUN(__stg_gc_enter_1) { FB_ Sp -= 1; @@ -663,11 +662,11 @@ EXTFUN(stg_gc_noregs) /*-- R1 is boxed/unpointed -------------------------------------------------- */ -INFO_TABLE_SRT_BITMAP(stg_gc_unpt_r1_info, stg_gc_unpt_r1_entry, 0/*BITMAP*/, +INFO_TABLE_SRT_BITMAP(stg_gc_unpt_r1_ret_info, stg_gc_unpt_r1_ret, 0/*BITMAP*/, 0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/, RET_SMALL,, EF_, 0, 0); -EXTFUN(stg_gc_unpt_r1_entry) +EXTFUN(stg_gc_unpt_r1_ret) { FB_ R1.w = Sp[0]; @@ -681,19 +680,19 @@ EXTFUN(stg_gc_unpt_r1) FB_ Sp -= 2; Sp[1] = R1.w; - Sp[0] = (W_)&stg_gc_unpt_r1_info; + Sp[0] = (W_)&stg_gc_unpt_r1_ret_info; GC_GENERIC FE_ } /*-- R1 is unboxed -------------------------------------------------- */ -INFO_TABLE_SRT_BITMAP(stg_gc_unbx_r1_info, stg_gc_unbx_r1_entry, 1/*BITMAP*/, +INFO_TABLE_SRT_BITMAP(stg_gc_unbx_r1_ret_info, stg_gc_unbx_r1_ret, 1/*BITMAP*/, 0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/, RET_SMALL,, EF_, 0, 0); /* the 1 is a bitmap - i.e. 1 non-pointer word on the stack. */ -EXTFUN(stg_gc_unbx_r1_entry) +EXTFUN(stg_gc_unbx_r1_ret) { FB_ R1.w = Sp[0]; @@ -707,18 +706,18 @@ EXTFUN(stg_gc_unbx_r1) FB_ Sp -= 2; Sp[1] = R1.w; - Sp[0] = (W_)&stg_gc_unbx_r1_info; + Sp[0] = (W_)&stg_gc_unbx_r1_ret; GC_GENERIC FE_ } /*-- F1 contains a float ------------------------------------------------- */ -INFO_TABLE_SRT_BITMAP(stg_gc_f1_info, stg_gc_f1_entry, 1/*BITMAP*/, +INFO_TABLE_SRT_BITMAP(stg_gc_f1_ret_info, stg_gc_f1_ret, 1/*BITMAP*/, 0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/, RET_SMALL,, EF_, 0, 0); -EXTFUN(stg_gc_f1_entry) +EXTFUN(stg_gc_f1_ret) { FB_ F1 = PK_FLT(Sp); @@ -732,7 +731,7 @@ EXTFUN(stg_gc_f1) FB_ Sp -= 2; ASSIGN_FLT(Sp+1, F1); - Sp[0] = (W_)&stg_gc_f1_info; + Sp[0] = (W_)&stg_gc_f1_ret_info; GC_GENERIC FE_ } @@ -747,11 +746,11 @@ EXTFUN(stg_gc_f1) # define DBL_BITMAP 3 #endif -INFO_TABLE_SRT_BITMAP(stg_gc_d1_info, stg_gc_d1_entry, DBL_BITMAP, +INFO_TABLE_SRT_BITMAP(stg_gc_d1_ret_info, stg_gc_d1_ret, DBL_BITMAP, 0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/, RET_SMALL,, EF_, 0, 0); -EXTFUN(stg_gc_d1_entry) +EXTFUN(stg_gc_d1_ret) { FB_ D1 = PK_DBL(Sp); @@ -765,7 +764,40 @@ EXTFUN(stg_gc_d1) FB_ Sp -= 1 + sizeofW(StgDouble); ASSIGN_DBL(Sp+1,D1); - Sp[0] = (W_)&stg_gc_d1_info; + Sp[0] = (W_)&stg_gc_d1_ret_info; + GC_GENERIC + FE_ +} + +/*-- L1 contains an int64 ------------------------------------------------- */ + +/* we support int64s of either 1 or 2 words in size */ + +#if SIZEOF_VOID_P == 8 +# define LLI_BITMAP 1 +#else +# define LLI_BITMAP 3 +#endif + +INFO_TABLE_SRT_BITMAP(stg_gc_l1_ret_info, stg_gc_l1_ret, LLI_BITMAP, + 0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/, + RET_SMALL,, EF_, 0, 0); + +EXTFUN(stg_gc_l1_ret) +{ + FB_ + L1 = PK_Int64(Sp); + Sp += sizeofW(StgWord64); + JMP_(ENTRY_CODE(Sp[0])); + FE_ +} + +EXTFUN(stg_gc_l1) +{ + FB_ + Sp -= 1 + sizeofW(StgWord64); + ASSIGN_Int64(Sp+1,L1); + Sp[0] = (W_)&stg_gc_l1_ret_info; GC_GENERIC FE_ } @@ -800,11 +832,11 @@ EXTFUN(stg_gc_d1) /*---- R1 contains a pointer: ------ */ -INFO_TABLE_SRT_BITMAP(stg_gc_ut_1_0_info, stg_gc_ut_1_0_entry, 1/*BITMAP*/, +INFO_TABLE_SRT_BITMAP(stg_gc_ut_1_0_ret_info, stg_gc_ut_1_0_ret, 1/*BITMAP*/, 0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/, RET_SMALL,, EF_, 0, 0); -EXTFUN(stg_gc_ut_1_0_entry) +EXTFUN(stg_gc_ut_1_0_ret) { FB_ R1.w = Sp[1]; @@ -819,18 +851,18 @@ EXTFUN(stg_gc_ut_1_0) Sp -= 3; Sp[2] = R1.w; Sp[1] = R2.w; - Sp[0] = (W_)&stg_gc_ut_1_0_info; + Sp[0] = (W_)&stg_gc_ut_1_0_ret_info; GC_GENERIC FE_ } /*---- R1 contains a non-pointer: ------ */ -INFO_TABLE_SRT_BITMAP(stg_gc_ut_0_1_info, stg_gc_ut_0_1_entry, 3/*BITMAP*/, +INFO_TABLE_SRT_BITMAP(stg_gc_ut_0_1_ret_info, stg_gc_ut_0_1_ret, 3/*BITMAP*/, 0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/, RET_SMALL,, EF_, 0, 0); -EXTFUN(stg_gc_ut_0_1_entry) +EXTFUN(stg_gc_ut_0_1_ret) { FB_ R1.w = Sp[1]; @@ -843,7 +875,7 @@ EXTFUN(stg_gc_ut_0_1) { FB_ Sp -= 3; - Sp[0] = (W_)&stg_gc_ut_0_1_info; + Sp[0] = (W_)&stg_gc_ut_0_1_ret_info; Sp[1] = R2.w; Sp[2] = R1.w; GC_GENERIC @@ -881,7 +913,7 @@ EXTFUN(stg_gc_ut_0_1) /*- 0 Regs -------------------------------------------------------------------*/ -EXTFUN(stg_chk_0) +EXTFUN(__stg_chk_0) { FB_ Sp -= 1; @@ -892,7 +924,7 @@ EXTFUN(stg_chk_0) /*- 1 Reg --------------------------------------------------------------------*/ -EXTFUN(stg_chk_1) +EXTFUN(__stg_chk_1) { FB_ Sp -= 2; @@ -1215,3 +1247,71 @@ FN_(stg_block_1) BLOCK_ENTER; FE_ } + +/* ----------------------------------------------------------------------------- + * takeMVar/putMVar-specific blocks + * + * Stack layout for a thread blocked in takeMVar: + * + * ret. addr + * ptr to MVar (R1) + * stg_block_takemvar_ret + * + * Stack layout for a thread blocked in putMVar: + * + * ret. addr + * ptr to Value (R2) + * ptr to MVar (R1) + * stg_block_putmvar_ret + * + * See PrimOps.hc for a description of the workings of take/putMVar. + * + * -------------------------------------------------------------------------- */ + +INFO_TABLE_SRT_BITMAP(stg_block_takemvar_ret_info, stg_block_takemvar_ret, + 0/*BITMAP*/, 0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/, + RET_SMALL,, IF_, 0, 0); + +IF_(stg_block_takemvar_ret) +{ + FB_ + R1.w = Sp[0]; + Sp++; + JMP_(takeMVarzh_fast); + FE_ +} + +FN_(stg_block_takemvar) +{ + FB_ + Sp -= 2; + Sp[1] = R1.w; + Sp[0] = (W_)&stg_block_takemvar_ret; + BLOCK_GENERIC; + FE_ +} + +INFO_TABLE_SRT_BITMAP(stg_block_putmvar_ret_info, stg_block_putmvar_ret, + 0/*BITMAP*/, 0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_LEN*/, + RET_SMALL,, IF_, 0, 0); + +IF_(stg_block_putmvar_ret) +{ + FB_ + R2.w = Sp[1]; + R1.w = Sp[0]; + Sp += 2; + JMP_(putMVarzh_fast); + FE_ +} + +FN_(stg_block_putmvar) +{ + FB_ + Sp -= 3; + Sp[2] = R2.w; + Sp[1] = R1.w; + Sp[0] = (W_)&stg_block_putmvar_ret; + BLOCK_GENERIC; + FE_ +}