X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FStgStdThunks.hc;h=9bc1a21ee8e9e254062cba9ba6b0743cf0c9c92d;hb=50027272414438955dbc41696541cbd25da55883;hp=79793a15810e82195d3580a874544832fb8b0714;hpb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;p=ghc-hetmet.git diff --git a/ghc/rts/StgStdThunks.hc b/ghc/rts/StgStdThunks.hc index 79793a1..9bc1a21 100644 --- a/ghc/rts/StgStdThunks.hc +++ b/ghc/rts/StgStdThunks.hc @@ -1,11 +1,16 @@ /* ----------------------------------------------------------------------------- - * $Id: StgStdThunks.hc,v 1.2 1998/12/02 13:28:56 simonm Exp $ + * $Id: StgStdThunks.hc,v 1.15 2001/03/23 16:36:21 simonmar Exp $ + * + * (c) The GHC Team, 1998-2000 * * Canned "Standard Form" Thunks * * ---------------------------------------------------------------------------*/ #include "Stg.h" +#include "Rts.h" +#include "StoragePriv.h" +#include "HeapStackCheck.h" /* ----------------------------------------------------------------------------- The code for a thunk that simply extracts a field from a @@ -27,17 +32,19 @@ #ifdef PROFILING #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 #else #define SAVE_CCCS(fs) /* empty */ #define GET_SAVED_CCCS /* empty */ +#define ENTER_CCS(p) /* empty */ #define RET_BITMAP 0 #endif #define SELECTOR_CODE_UPD(offset) \ - IF_(__sel_ret_##offset##_upd_ret); \ - INFO_TABLE_SRT_BITMAP(__sel_ret_##offset##_upd_info,__sel_ret_##offset##_upd_ret, RET_BITMAP, 0, 0, 0, RET_SMALL, static const, IF_, 0, 0); \ - IF_(__sel_ret_##offset##_upd_ret) { \ + 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); \ + EF_(stg_sel_ret_##offset##_upd_ret) { \ FB_ \ R1.p=(P_)R1.cl->payload[offset]; \ GET_SAVED_CCCS; \ @@ -46,15 +53,16 @@ FE_ \ } \ \ - EF_(__sel_##offset##_upd_entry); \ - INFO_TABLE_SELECTOR(__sel_##offset##_upd_info, __sel_##offset##_upd_entry, offset, const, EF_, 0,0);\ - EF_(__sel_##offset##_upd_entry) { \ + EF_(stg_sel_##offset##_upd_entry); \ + 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,); \ - UPD_BH_UPDATABLE(R1.p); \ + UPD_BH_UPDATABLE(&stg_sel_##offset##_upd_info); \ PUSH_UPD_FRAME(R1.p,0); \ + ENTER_CCS(R1.p); \ SAVE_CCCS(UPD_FRAME_SIZE); \ - Sp[-UPD_FRAME_SIZE]=(W_)__sel_ret_##offset##_upd_ret; \ + 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)); \ @@ -79,9 +87,9 @@ SELECTOR_CODE_UPD(14); SELECTOR_CODE_UPD(15); #define SELECTOR_CODE_NOUPD(offset) \ - IF_(__sel_ret_##offset##_noupd_ret); \ - INFO_TABLE_SRT_BITMAP(__sel_ret_##offset##_noupd_info, __sel_ret_##offset##_noupd_ret, RET_BITMAP, 0, 0, 0, RET_SMALL, static const, IF_, 0, 0); \ - IF_(__sel_ret_##offset##_noupd_ret) { \ + 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); \ + IF_(stg_sel_ret_##offset##_noupd_ret) { \ FB_ \ R1.p=(P_)R1.cl->payload[offset]; \ GET_SAVED_CCCS; \ @@ -90,13 +98,15 @@ SELECTOR_CODE_UPD(15); FE_ \ } \ \ - EF_(__sel_##offset##_noupd_entry); \ - INFO_TABLE_SELECTOR(__sel_##offset##_noupd_info, __sel_##offset##_noupd_entry, offset, const, EF_, 0,0);\ - EF_(__sel_##offset##_noupd_entry) { \ + EF_(stg_sel_##offset##_noupd_entry); \ + 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,) \ + UPD_BH_SINGLE_ENTRY(&stg_sel_##offset##_noupd_info); \ + ENTER_CCS(R1.p); \ SAVE_CCCS(NOUPD_FRAME_SIZE); \ - Sp[-NOUPD_FRAME_SIZE]=(W_)__sel_ret_##offset##_noupd_ret; \ + Sp[-NOUPD_FRAME_SIZE]=(W_)&stg_sel_ret_##offset##_noupd_info; \ R1.p = (P_)R1.cl->payload[0]; \ Sp=Sp-NOUPD_FRAME_SIZE; \ JMP_(ENTRY_CODE(*R1.p)); \ @@ -134,24 +144,27 @@ SELECTOR_CODE_NOUPD(15); works when profiling etc. -------------------------------------------------------------------------- */ -FN_(__ap_1_upd_entry); -FN_(__ap_2_upd_entry); -FN_(__ap_3_upd_entry); -FN_(__ap_4_upd_entry); -FN_(__ap_5_upd_entry); -FN_(__ap_6_upd_entry); -FN_(__ap_7_upd_entry); -FN_(__ap_8_upd_entry); +FN_(stg_ap_1_upd_entry); +FN_(stg_ap_2_upd_entry); +FN_(stg_ap_3_upd_entry); +FN_(stg_ap_4_upd_entry); +FN_(stg_ap_5_upd_entry); +FN_(stg_ap_6_upd_entry); +FN_(stg_ap_7_upd_entry); +FN_(stg_ap_8_upd_entry); + +#define UF_SIZE (sizeofW(StgUpdateFrame)) -/* __ap_1_upd_info is a bit redundant, but there appears to be a bug - * in the compiler that means __ap_1 is generated occasionally (ToDo) +/* stg_ap_1_upd_info is a bit redundant, but there appears to be a bug + * in the compiler that means stg_ap_1 is generated occasionally (ToDo) */ -INFO_TABLE_SRT(__ap_1_upd_info,__ap_1_upd_entry,1,0,0,0,0,THUNK, const,EF_,0,0); -FN_(__ap_1_upd_entry) { +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"); +FN_(stg_ap_1_upd_entry) { FB_ STK_CHK_NP(sizeofW(StgUpdateFrame),1,); - UPD_BH_UPDATABLE(R1.p); + UPD_BH_UPDATABLE(&stg_ap_1_upd_info); + ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); R1.p=(P_)(R1.cl->payload[0]); Sp = Sp - sizeofW(StgUpdateFrame); @@ -159,11 +172,12 @@ FN_(__ap_1_upd_entry) { FE_ } -INFO_TABLE_SRT(__ap_2_upd_info,__ap_2_upd_entry,2,0,0,0,0,THUNK, const,EF_,0,0); -FN_(__ap_2_upd_entry) { +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"); +FN_(stg_ap_2_upd_entry) { FB_ STK_CHK_NP(sizeofW(StgUpdateFrame)+1,1,); - UPD_BH_UPDATABLE(R1.p); + UPD_BH_UPDATABLE(&stg_ap_2_upd_info); + 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]); @@ -172,11 +186,12 @@ FN_(__ap_2_upd_entry) { FE_ } -INFO_TABLE_SRT(__ap_3_upd_info,__ap_3_upd_entry,3,0,0,0,0,THUNK, const,EF_,0,0); -FN_(__ap_3_upd_entry) { +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"); +FN_(stg_ap_3_upd_entry) { FB_ STK_CHK_NP(sizeofW(StgUpdateFrame)+2,1,); - UPD_BH_UPDATABLE(R1.p); + UPD_BH_UPDATABLE(&stg_ap_3_upd_info); + 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]); @@ -186,11 +201,12 @@ FN_(__ap_3_upd_entry) { FE_ } -INFO_TABLE_SRT(__ap_4_upd_info,__ap_4_upd_entry,4,0,0,0,0,THUNK, const,EF_,0,0); -FN_(__ap_4_upd_entry) { +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"); +FN_(stg_ap_4_upd_entry) { FB_ STK_CHK_NP(sizeofW(StgUpdateFrame)+3,1,); - UPD_BH_UPDATABLE(R1.p); + UPD_BH_UPDATABLE(&stg_ap_4_upd_info); + ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); Sp[-UF_SIZE-1]=(W_)(R1.cl->payload[3]); Sp[-UF_SIZE-2]=(W_)(R1.cl->payload[2]); @@ -201,11 +217,12 @@ FN_(__ap_4_upd_entry) { FE_ } -INFO_TABLE_SRT(__ap_5_upd_info,__ap_5_upd_entry,5,0,0,0,0,THUNK, const,EF_,0,0); -FN_(__ap_5_upd_entry) { +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"); +FN_(stg_ap_5_upd_entry) { FB_ STK_CHK_NP(sizeofW(StgUpdateFrame)+4,1,); - UPD_BH_UPDATABLE(R1.p); + UPD_BH_UPDATABLE(&stg_ap_5_upd_info); + ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); Sp[-UF_SIZE-1]=(W_)(R1.cl->payload[4]); Sp[-UF_SIZE-2]=(W_)(R1.cl->payload[3]); @@ -217,11 +234,12 @@ FN_(__ap_5_upd_entry) { FE_ } -INFO_TABLE_SRT(__ap_6_upd_info,__ap_6_upd_entry,6,0,0,0,0,THUNK, const,EF_,0,0); -FN_(__ap_6_upd_entry) { +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"); +FN_(stg_ap_6_upd_entry) { FB_ STK_CHK_NP(sizeofW(StgUpdateFrame)+5,1,); - UPD_BH_UPDATABLE(R1.p); + UPD_BH_UPDATABLE(&stg_ap_6_upd_info); + ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); Sp[-UF_SIZE-1]=(W_)(R1.cl->payload[5]); Sp[-UF_SIZE-2]=(W_)(R1.cl->payload[4]); @@ -234,11 +252,12 @@ FN_(__ap_6_upd_entry) { FE_ } -INFO_TABLE_SRT(__ap_7_upd_info,__ap_7_upd_entry,7,0,0,0,0,THUNK, const,EF_,0,0); -FN_(__ap_7_upd_entry) { +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"); +FN_(stg_ap_7_upd_entry) { FB_ STK_CHK_NP(sizeofW(StgUpdateFrame)+6,1,); - UPD_BH_UPDATABLE(R1.p); + UPD_BH_UPDATABLE(&stg_ap_7_upd_info); + ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); Sp[-UF_SIZE-1]=(W_)(R1.cl->payload[6]); Sp[-UF_SIZE-2]=(W_)(R1.cl->payload[5]); @@ -252,11 +271,12 @@ FN_(__ap_7_upd_entry) { FE_ } -INFO_TABLE_SRT(__ap_8_upd_info,__ap_8_upd_entry,8,0,0,0,0,THUNK, const,EF_,0,0); -FN_(__ap_8_upd_entry) { +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"); +FN_(stg_ap_8_upd_entry) { FB_ STK_CHK_NP(sizeofW(StgUpdateFrame)+7,1,); - UPD_BH_UPDATABLE(R1.p); + UPD_BH_UPDATABLE(&stg_ap_8_upd_info); + ENTER_CCS(R1.p); PUSH_UPD_FRAME(R1.p,0); Sp[-UF_SIZE-1]=(W_)(R1.cl->payload[7]); Sp[-UF_SIZE-2]=(W_)(R1.cl->payload[6]);