[project @ 2004-08-13 10:45:16 by simonmar]
[ghc-hetmet.git] / ghc / rts / StgStdThunks.hc
index 239b816..e8829b2 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: StgStdThunks.hc,v 1.11 2000/04/19 10:53:11 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
 #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) \
-  EF_(__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, EF_, 0, 0);                        \
-  EF_(__sel_ret_##offset##_upd_ret) {                                  \
+  IF_(stg_sel_ret_##offset##_upd_ret);                                 \
+  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_                                                                        \
   }                                                                    \
                                                                        \
-  EF_(__sel_##offset##_upd_entry);                                     \
-  INFO_TABLE_SELECTOR(__sel_##offset##_upd_info, __sel_##offset##_upd_entry, offset,, EF_, "__sel" #offset "_upd_entry", "__sel" #offset "_upd_entry");\
-  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(&__sel_##offset##_upd_info);                    \
+      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_)&__sel_ret_##offset##_upd_info;          \
+      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_                                                                        \
   }
 
@@ -86,8 +90,9 @@ SELECTOR_CODE_UPD(14);
 SELECTOR_CODE_UPD(15);
 
 #define SELECTOR_CODE_NOUPD(offset) \
-  INFO_TABLE_SRT_BITMAP(__sel_ret_##offset##_noupd_info, __sel_ret_##offset##_noupd_ret, RET_BITMAP, 0, 0, 0, RET_SMALL, static, EF_, 0, 0);   \
-  EF_(__sel_ret_##offset##_noupd_ret) {                                        \
+  IF_(stg_sel_ret_##offset##_noupd_ret); \
+  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];                                 \
       GET_SAVED_CCCS;                                                  \
@@ -96,15 +101,18 @@ SELECTOR_CODE_UPD(15);
     FE_                                                                        \
   }                                                                    \
                                                                        \
-  EF_(__sel_##offset##_noupd_entry);                                   \
-  INFO_TABLE_SELECTOR(__sel_##offset##_noupd_info, __sel_##offset##_noupd_entry, offset,, EF_, "__sel" #offset "_noupd_entry", "__sel" #offset "_noupd_entry");\
-  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(&__sel_##offset##_noupd_info);               \
+      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_)&__sel_ret_##offset##_noupd_info;      \
+      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));                                         \
@@ -142,68 +150,79 @@ 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,,EF_,"__ap_1_upd_info","__ap_1_upd_info");
-FN_(__ap_1_upd_entry) {
+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,);
-  UPD_BH_UPDATABLE(&__ap_1_upd_info);
+  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(__ap_2_upd_info,__ap_2_upd_entry,2,0,0,0,0,THUNK,,EF_,"__ap_2_upd_info","__ap_2_upd_info");
-FN_(__ap_2_upd_entry) {
+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,);
-  UPD_BH_UPDATABLE(&__ap_2_upd_info);
+  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(__ap_3_upd_info,__ap_3_upd_entry,3,0,0,0,0,THUNK,,EF_,"__ap_3_upd_info","__ap_3_upd_info");
-FN_(__ap_3_upd_entry) {
+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,);
-  UPD_BH_UPDATABLE(&__ap_3_upd_info);
+  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(__ap_4_upd_info,__ap_4_upd_entry,4,0,0,0,0,THUNK,,EF_,"__ap_4_upd_info","__ap_4_upd_info");
-FN_(__ap_4_upd_entry) {
+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,);
-  UPD_BH_UPDATABLE(&__ap_4_upd_info);
+  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]);
@@ -211,15 +230,18 @@ FN_(__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(__ap_5_upd_info,__ap_5_upd_entry,5,0,0,0,0,THUNK,,EF_,"__ap_5_upd_info","__ap_5_upd_info");
-FN_(__ap_5_upd_entry) {
+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,);
-  UPD_BH_UPDATABLE(&__ap_5_upd_info);
+  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]);
@@ -228,15 +250,18 @@ FN_(__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(__ap_6_upd_info,__ap_6_upd_entry,6,0,0,0,0,THUNK,,EF_,"__ap_6_upd_info","__ap_6_upd_info");
-FN_(__ap_6_upd_entry) {
+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,);
-  UPD_BH_UPDATABLE(&__ap_6_upd_info);
+  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]);
@@ -246,15 +271,18 @@ FN_(__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(__ap_7_upd_info,__ap_7_upd_entry,7,0,0,0,0,THUNK,,EF_,"__ap_7_upd_info","__ap_7_upd_info");
-FN_(__ap_7_upd_entry) {
+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,);
-  UPD_BH_UPDATABLE(&__ap_7_upd_info);
+  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]);
@@ -265,15 +293,18 @@ FN_(__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(__ap_8_upd_info,__ap_8_upd_entry,8,0,0,0,0,THUNK,,EF_,"__ap_8_upd_info","__ap_8_upd_info");
-FN_(__ap_8_upd_entry) {
+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,);
-  UPD_BH_UPDATABLE(&__ap_8_upd_info);
+  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]);
@@ -284,7 +315,8 @@ FN_(__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_
 }