X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FStgStdThunks.hc;h=e8829b2d0c51307355940114890f0dd5d09ecaa6;hb=553e90d9a32ee1b1809430f260c401cc4169c6c7;hp=befa41456059002e53a836b0bad35ebd74ab9e7a;hpb=9ac55e08e159d7a4647ab01e7872e69dd762f275;p=ghc-hetmet.git diff --git a/ghc/rts/StgStdThunks.hc b/ghc/rts/StgStdThunks.hc index befa414..e8829b2 100644 --- a/ghc/rts/StgStdThunks.hc +++ b/ghc/rts/StgStdThunks.hc @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: StgStdThunks.hc,v 1.14 2000/12/04 12:31:21 simonmar Exp $ + * $Id: StgStdThunks.hc,v 1.22 2003/04/18 09:40:10 simonmar Exp $ * * (c) The GHC Team, 1998-2000 * @@ -7,9 +7,9 @@ * * ---------------------------------------------------------------------------*/ +#include "Stg.h" #include "Rts.h" #include "StoragePriv.h" -#include "HeapStackCheck.h" /* ----------------------------------------------------------------------------- The code for a thunk that simply extracts a field from a @@ -32,23 +32,25 @@ #define SAVE_CCCS(fs) CCS_HDR(Sp-fs)=CCCS #define GET_SAVED_CCCS RESTORE_CCCS(CCS_HDR(Sp)) #define ENTER_CCS(p) ENTER_CCS_TCL(p) -#define RET_BITMAP 1 +#define RET_BITMAP 3 +#define RET_FRAMESIZE 2 #else #define SAVE_CCCS(fs) /* empty */ #define GET_SAVED_CCCS /* empty */ #define ENTER_CCS(p) /* empty */ -#define RET_BITMAP 0 +#define RET_BITMAP 0 +#define RET_FRAMESIZE 0 #endif #define SELECTOR_CODE_UPD(offset) \ IF_(stg_sel_ret_##offset##_upd_ret); \ - INFO_TABLE_SRT_BITMAP(stg_sel_ret_##offset##_upd_info,stg_sel_ret_##offset##_upd_ret, RET_BITMAP, 0, 0, 0, RET_SMALL, static, EF_, 0, 0); \ + INFO_TABLE_RET(stg_sel_ret_##offset##_upd_info,stg_sel_ret_##offset##_upd_ret, MK_SMALL_BITMAP(RET_FRAMESIZE, RET_BITMAP), 0, 0, 0, RET_SMALL, static, EF_, 0, 0); \ EF_(stg_sel_ret_##offset##_upd_ret) { \ FB_ \ R1.p=(P_)R1.cl->payload[offset]; \ GET_SAVED_CCCS; \ Sp=Sp+sizeofW(StgHeader); \ - JMP_(ENTRY_CODE(*R1.p)); \ + ENTER(); \ FE_ \ } \ \ @@ -56,15 +58,17 @@ INFO_TABLE_SELECTOR(stg_sel_##offset##_upd_info, stg_sel_##offset##_upd_entry, offset,, EF_, "stg_sel" #offset "_upd_entry", "stg_sel" #offset "_upd_entry");\ EF_(stg_sel_##offset##_upd_entry) { \ FB_ \ - STK_CHK_NP(UPD_FRAME_SIZE,1,); \ + TICK_ENT_DYN_THK(); /* is it static or dynamic?? */ \ + STK_CHK_NP(UPD_FRAME_SIZE,); \ UPD_BH_UPDATABLE(&stg_sel_##offset##_upd_info); \ + LDV_ENTER(R1.cl); \ PUSH_UPD_FRAME(R1.p,0); \ ENTER_CCS(R1.p); \ SAVE_CCCS(UPD_FRAME_SIZE); \ Sp[-UPD_FRAME_SIZE]=(W_)&stg_sel_ret_##offset##_upd_info; \ R1.p = (P_)R1.cl->payload[0]; \ Sp=Sp-UPD_FRAME_SIZE; \ - JMP_(ENTRY_CODE(*R1.p)); \ + ENTER(); \ FE_ \ } @@ -87,7 +91,7 @@ SELECTOR_CODE_UPD(15); #define SELECTOR_CODE_NOUPD(offset) \ IF_(stg_sel_ret_##offset##_noupd_ret); \ - INFO_TABLE_SRT_BITMAP(stg_sel_ret_##offset##_noupd_info, stg_sel_ret_##offset##_noupd_ret, RET_BITMAP, 0, 0, 0, RET_SMALL, static, EF_, 0, 0); \ + INFO_TABLE_RET(stg_sel_ret_##offset##_noupd_info, stg_sel_ret_##offset##_noupd_ret, MK_SMALL_BITMAP(RET_FRAMESIZE, RET_BITMAP), 0, 0, 0, RET_SMALL, static, EF_, 0, 0); \ IF_(stg_sel_ret_##offset##_noupd_ret) { \ FB_ \ R1.p=(P_)R1.cl->payload[offset]; \ @@ -101,8 +105,11 @@ SELECTOR_CODE_UPD(15); INFO_TABLE_SELECTOR(stg_sel_##offset##_noupd_info, stg_sel_##offset##_noupd_entry, offset,, EF_, "stg_sel" #offset "_noupd_entry", "stg_sel" #offset "_noupd_entry");\ EF_(stg_sel_##offset##_noupd_entry) { \ FB_ \ - STK_CHK_NP(NOUPD_FRAME_SIZE,1,) \ + TICK_ENT_DYN_THK(); /* is it static or dynamic?? */ \ + STK_CHK_NP(NOUPD_FRAME_SIZE,) \ UPD_BH_SINGLE_ENTRY(&stg_sel_##offset##_noupd_info); \ + LDV_ENTER(R1.cl); \ + TICK_UPDF_OMITTED(); \ ENTER_CCS(R1.p); \ SAVE_CCCS(NOUPD_FRAME_SIZE); \ Sp[-NOUPD_FRAME_SIZE]=(W_)&stg_sel_ret_##offset##_noupd_info; \ @@ -158,53 +165,64 @@ FN_(stg_ap_8_upd_entry); * in the compiler that means stg_ap_1 is generated occasionally (ToDo) */ -INFO_TABLE_SRT(stg_ap_1_upd_info,stg_ap_1_upd_entry,1,0,0,0,0,THUNK,,EF_,"stg_ap_1_upd_info","stg_ap_1_upd_info"); +INFO_TABLE_THUNK(stg_ap_1_upd_info,stg_ap_1_upd_entry,1,1,0,0,0,THUNK_1_0,,EF_,"stg_ap_1_upd_info","stg_ap_1_upd_info"); FN_(stg_ap_1_upd_entry) { FB_ - STK_CHK_NP(sizeofW(StgUpdateFrame),1,); + TICK_ENT_DYN_THK(); /* is it static or dynamic?? */ + STK_CHK_NP(sizeofW(StgUpdateFrame)+1,); UPD_BH_UPDATABLE(&stg_ap_1_upd_info); + LDV_ENTER(R1.cl); ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); R1.p=(P_)(R1.cl->payload[0]); - Sp = Sp - sizeofW(StgUpdateFrame); - JMP_(ENTRY_CODE(*R1.p)); + Sp -= sizeofW(StgUpdateFrame); + Sp--; // for stg_ap_0_ret + JMP_(stg_ap_0_ret); FE_ } -INFO_TABLE_SRT(stg_ap_2_upd_info,stg_ap_2_upd_entry,2,0,0,0,0,THUNK,,EF_,"stg_ap_2_upd_info","stg_ap_2_upd_info"); +INFO_TABLE_THUNK(stg_ap_2_upd_info,stg_ap_2_upd_entry,2,0,0,0,0,THUNK_2_0,,EF_,"stg_ap_2_upd_info","stg_ap_2_upd_info"); FN_(stg_ap_2_upd_entry) { FB_ - STK_CHK_NP(sizeofW(StgUpdateFrame)+1,1,); + TICK_ENT_DYN_THK(); /* is it static or dynamic?? */ + STK_CHK_NP(sizeofW(StgUpdateFrame)+2,); UPD_BH_UPDATABLE(&stg_ap_2_upd_info); + LDV_ENTER(R1.cl); ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); Sp[-UF_SIZE-1]=(W_)(R1.cl->payload[1]); R1.p=(P_)(R1.cl->payload[0]); - Sp = Sp - (sizeofW(StgUpdateFrame)+1); - JMP_(ENTRY_CODE(*R1.p)); + Sp -= sizeofW(StgUpdateFrame)+1; + Sp--; // for stg_ap_1_ret + JMP_(stg_ap_p_ret); FE_ } -INFO_TABLE_SRT(stg_ap_3_upd_info,stg_ap_3_upd_entry,3,0,0,0,0,THUNK,,EF_,"stg_ap_3_upd_info","stg_ap_3_upd_info"); +INFO_TABLE_THUNK(stg_ap_3_upd_info,stg_ap_3_upd_entry,3,0,0,0,0,THUNK,,EF_,"stg_ap_3_upd_info","stg_ap_3_upd_info"); FN_(stg_ap_3_upd_entry) { FB_ - STK_CHK_NP(sizeofW(StgUpdateFrame)+2,1,); + TICK_ENT_DYN_THK(); /* is it static or dynamic?? */ + STK_CHK_NP(sizeofW(StgUpdateFrame)+3,); UPD_BH_UPDATABLE(&stg_ap_3_upd_info); + LDV_ENTER(R1.cl); ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); Sp[-UF_SIZE-1]=(W_)(R1.cl->payload[2]); Sp[-UF_SIZE-2]=(W_)(R1.cl->payload[1]); R1.p=(P_)(R1.cl->payload[0]); - Sp = Sp - (sizeofW(StgUpdateFrame)+2); - JMP_(ENTRY_CODE(*R1.p)); + Sp -= sizeofW(StgUpdateFrame)+2; + Sp--; // for stg_ap_pp_ret + JMP_(stg_ap_pp_ret); FE_ } -INFO_TABLE_SRT(stg_ap_4_upd_info,stg_ap_4_upd_entry,4,0,0,0,0,THUNK,,EF_,"stg_ap_4_upd_info","stg_ap_4_upd_info"); +INFO_TABLE_THUNK(stg_ap_4_upd_info,stg_ap_4_upd_entry,4,0,0,0,0,THUNK,,EF_,"stg_ap_4_upd_info","stg_ap_4_upd_info"); FN_(stg_ap_4_upd_entry) { FB_ - STK_CHK_NP(sizeofW(StgUpdateFrame)+3,1,); + TICK_ENT_DYN_THK(); /* is it static or dynamic?? */ + STK_CHK_NP(sizeofW(StgUpdateFrame)+4,); UPD_BH_UPDATABLE(&stg_ap_4_upd_info); + LDV_ENTER(R1.cl); ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); Sp[-UF_SIZE-1]=(W_)(R1.cl->payload[3]); @@ -212,15 +230,18 @@ FN_(stg_ap_4_upd_entry) { Sp[-UF_SIZE-3]=(W_)(R1.cl->payload[1]); R1.p=(P_)(R1.cl->payload[0]); Sp = Sp - (sizeofW(StgUpdateFrame)+3); - JMP_(ENTRY_CODE(*R1.p)); + Sp--; // for stg_ap_ppp_ret + JMP_(stg_ap_ppp_ret); FE_ } -INFO_TABLE_SRT(stg_ap_5_upd_info,stg_ap_5_upd_entry,5,0,0,0,0,THUNK,,EF_,"stg_ap_5_upd_info","stg_ap_5_upd_info"); +INFO_TABLE_THUNK(stg_ap_5_upd_info,stg_ap_5_upd_entry,5,0,0,0,0,THUNK,,EF_,"stg_ap_5_upd_info","stg_ap_5_upd_info"); FN_(stg_ap_5_upd_entry) { FB_ - STK_CHK_NP(sizeofW(StgUpdateFrame)+4,1,); + TICK_ENT_DYN_THK(); /* is it static or dynamic?? */ + STK_CHK_NP(sizeofW(StgUpdateFrame)+5,); UPD_BH_UPDATABLE(&stg_ap_5_upd_info); + LDV_ENTER(R1.cl); ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); Sp[-UF_SIZE-1]=(W_)(R1.cl->payload[4]); @@ -229,15 +250,18 @@ FN_(stg_ap_5_upd_entry) { Sp[-UF_SIZE-4]=(W_)(R1.cl->payload[1]); R1.p=(P_)(R1.cl->payload[0]); Sp = Sp - (sizeofW(StgUpdateFrame)+4); - JMP_(ENTRY_CODE(*R1.p)); + Sp--; // for stg_ap_pppp_ret + JMP_(stg_ap_pppp_ret); FE_ } -INFO_TABLE_SRT(stg_ap_6_upd_info,stg_ap_6_upd_entry,6,0,0,0,0,THUNK,,EF_,"stg_ap_6_upd_info","stg_ap_6_upd_info"); +INFO_TABLE_THUNK(stg_ap_6_upd_info,stg_ap_6_upd_entry,6,0,0,0,0,THUNK,,EF_,"stg_ap_6_upd_info","stg_ap_6_upd_info"); FN_(stg_ap_6_upd_entry) { FB_ - STK_CHK_NP(sizeofW(StgUpdateFrame)+5,1,); + TICK_ENT_DYN_THK(); /* is it static or dynamic?? */ + STK_CHK_NP(sizeofW(StgUpdateFrame)+6,); UPD_BH_UPDATABLE(&stg_ap_6_upd_info); + LDV_ENTER(R1.cl); ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); Sp[-UF_SIZE-1]=(W_)(R1.cl->payload[5]); @@ -247,15 +271,18 @@ FN_(stg_ap_6_upd_entry) { Sp[-UF_SIZE-5]=(W_)(R1.cl->payload[1]); R1.p=(P_)(R1.cl->payload[0]); Sp = Sp - (sizeofW(StgUpdateFrame)+5); - JMP_(ENTRY_CODE(*R1.p)); + Sp--; // for stg_ap_ppppp_ret + JMP_(stg_ap_ppppp_ret); FE_ } -INFO_TABLE_SRT(stg_ap_7_upd_info,stg_ap_7_upd_entry,7,0,0,0,0,THUNK,,EF_,"stg_ap_7_upd_info","stg_ap_7_upd_info"); +INFO_TABLE_THUNK(stg_ap_7_upd_info,stg_ap_7_upd_entry,7,0,0,0,0,THUNK,,EF_,"stg_ap_7_upd_info","stg_ap_7_upd_info"); FN_(stg_ap_7_upd_entry) { FB_ - STK_CHK_NP(sizeofW(StgUpdateFrame)+6,1,); + TICK_ENT_DYN_THK(); /* is it static or dynamic?? */ + STK_CHK_NP(sizeofW(StgUpdateFrame)+7,); UPD_BH_UPDATABLE(&stg_ap_7_upd_info); + LDV_ENTER(R1.cl); ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); Sp[-UF_SIZE-1]=(W_)(R1.cl->payload[6]); @@ -266,15 +293,18 @@ FN_(stg_ap_7_upd_entry) { Sp[-UF_SIZE-6]=(W_)(R1.cl->payload[1]); R1.p=(P_)(R1.cl->payload[0]); Sp = Sp - (sizeofW(StgUpdateFrame)+6); - JMP_(ENTRY_CODE(*R1.p)); + Sp--; // for stg_ap_pppppp_ret + JMP_(stg_ap_pppppp_ret); FE_ } -INFO_TABLE_SRT(stg_ap_8_upd_info,stg_ap_8_upd_entry,8,0,0,0,0,THUNK,,EF_,"stg_ap_8_upd_info","stg_ap_8_upd_info"); +INFO_TABLE_THUNK(stg_ap_8_upd_info,stg_ap_8_upd_entry,8,0,0,0,0,THUNK,,EF_,"stg_ap_8_upd_info","stg_ap_8_upd_info"); FN_(stg_ap_8_upd_entry) { FB_ - STK_CHK_NP(sizeofW(StgUpdateFrame)+7,1,); + TICK_ENT_DYN_THK(); /* is it static or dynamic?? */ + STK_CHK_NP(sizeofW(StgUpdateFrame)+8,); UPD_BH_UPDATABLE(&stg_ap_8_upd_info); + LDV_ENTER(R1.cl); ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); Sp[-UF_SIZE-1]=(W_)(R1.cl->payload[7]); @@ -285,7 +315,8 @@ FN_(stg_ap_8_upd_entry) { Sp[-UF_SIZE-6]=(W_)(R1.cl->payload[2]); Sp[-UF_SIZE-7]=(W_)(R1.cl->payload[1]); R1.p=(P_)(R1.cl->payload[0]); - Sp=Sp-10; - JMP_(ENTRY_CODE(*R1.p)); + Sp = Sp - (sizeofW(StgUpdateFrame)+7); + Sp--; // for stg_ap_ppppppp_ret + JMP_(stg_ap_ppppppp_ret); FE_ }