[project @ 2000-10-16 16:17:01 by simonpj]
[ghc-hetmet.git] / ghc / includes / StgMacros.h
index 1e28474..df6c82c 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: StgMacros.h,v 1.21 2000/03/08 17:48:26 simonmar Exp $
+ * $Id: StgMacros.h,v 1.34 2000/08/15 14:22:24 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
 #define EF_(f)         extern F_ f(void)
 #define EDF_(f)                extern DLLIMPORT F_ f(void)
 
+#define EXTINFO_RTS    extern DLL_IMPORT_RTS INFO_TBL_CONST StgInfoTable
 #define ED_            extern
-#define EDD_           extern DLLIMPORT 
+#define EDD_           extern DLLIMPORT
 #define ED_RO_         extern const
-#define ID_            extern
-#define ID_RO_         extern const
+#define ID_            static
+#define ID_RO_         static const
 #define EI_             extern INFO_TBL_CONST StgInfoTable
 #define EDI_            extern DLLIMPORT INFO_TBL_CONST StgInfoTable
-#define II_             extern INFO_TBL_CONST StgInfoTable
+#define II_             static INFO_TBL_CONST StgInfoTable
 #define EC_            extern StgClosure
 #define EDC_           extern DLLIMPORT StgClosure
-#define IC_            extern StgClosure
+#define IC_            static StgClosure
 #define ECP_(x)                extern const StgClosure *(x)[]
 #define EDCP_(x)       extern DLLIMPORT StgClosure *(x)[]
-#define ICP_(x)                extern const StgClosure *(x)[]
+#define ICP_(x)                static const StgClosure *(x)[]
 
 /* -----------------------------------------------------------------------------
    Stack Tagging.
@@ -293,7 +294,7 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; }
 
 #define HP_CHK_GEN(headroom,liveness,reentry,tag_assts)        \
    if ((Hp += (headroom)) > HpLim ) {                  \
-       EF_(stg_gen_chk);                               \
+       EXTFUN_RTS(stg_gen_chk);                                \
         tag_assts                                      \
        R9.w = (W_)LIVENESS_MASK(liveness);             \
         R10.w = (W_)reentry;                           \
@@ -306,7 +307,7 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; }
 
 #define STK_CHK_GEN(headroom,liveness,reentry,tag_assts)       \
    if ((Sp - (headroom)) < SpLim) {                            \
-       EF_(stg_gen_chk);                                       \
+       EXTFUN_RTS(stg_gen_chk);                                        \
         tag_assts                                              \
        R9.w = (W_)LIVENESS_MASK(liveness);                     \
         R10.w = (W_)reentry;                                   \
@@ -315,7 +316,7 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; }
 
 #define MAYBE_GC(liveness,reentry)             \
    if (doYouWantToGC()) {                      \
-       EF_(stg_gen_hp);                        \
+       EXTFUN_RTS(stg_gen_hp);                 \
        R9.w = (W_)LIVENESS_MASK(liveness);     \
         R10.w = (W_)reentry;                   \
         JMP_(stg_gen_hp);                      \
@@ -328,8 +329,8 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; }
    out to be slowing us down we can make specialised ones.
    -------------------------------------------------------------------------- */
 
-EF_(stg_gen_yield);
-EF_(stg_gen_block);
+EXTFUN_RTS(stg_gen_yield);
+EXTFUN_RTS(stg_gen_block);
 
 #define YIELD(liveness,reentry)                        \
   {                                            \
@@ -347,7 +348,7 @@ EF_(stg_gen_block);
 
 #define BLOCK_NP(ptrs)                         \
   {                                            \
-    EF_(stg_block_##ptrs);                     \
+    EXTFUN_RTS(stg_block_##ptrs);                      \
     JMP_(stg_block_##ptrs);                    \
   }
 
@@ -365,7 +366,7 @@ EF_(stg_gen_block);
 
 #define THREAD_RETURN(ptrs)                      \
   ASSERT(ptrs==1);                               \
-  CurrentTSO->whatNext = ThreadEnterGHC;         \
+  CurrentTSO->what_next = ThreadEnterGHC;        \
   R1.i = ThreadBlocked;                          \
   JMP_(StgReturn);                               
 #endif
@@ -377,11 +378,8 @@ EF_(stg_gen_block);
    We use a RET_DYN frame the same as for a dynamic heap check.
    ------------------------------------------------------------------------- */
 
-#if COMPILING_RTS
-EI_(stg_gen_chk_info);
-#else
-EDI_(stg_gen_chk_info);
-#endif
+EXTINFO_RTS(stg_gen_chk_info);
+
 /* -----------------------------------------------------------------------------
    Vectored Returns
 
@@ -452,7 +450,7 @@ EDI_(stg_gen_chk_info);
 #  define UPD_BH_SINGLE_ENTRY(thunk) /* nothing */
 #endif /* EAGER_BLACKHOLING */
 
-#define UPD_FRAME_UPDATEE(p)  (((StgUpdateFrame *)(p))->updatee)
+#define UPD_FRAME_UPDATEE(p)  ((P_)(((StgUpdateFrame *)(p))->updatee))
 #define UPDATE_SU_FROM_UPD_FRAME(p) (Su=((StgUpdateFrame *)(p))->link)
 
 /* -----------------------------------------------------------------------------
@@ -645,9 +643,9 @@ extern DLL_IMPORT_DATA const StgPolyInfoTable seq_frame_info;
    -------------------------------------------------------------------------- */
 
 #if defined(USE_SPLIT_MARKERS)
-#define __STG_SPLIT_MARKER(n) FN_(__stg_split_marker##n) { }
+#define __STG_SPLIT_MARKER __asm__("\n__stg_split_marker:");
 #else
-#define __STG_SPLIT_MARKER(n) /* nothing */
+#define __STG_SPLIT_MARKER /* nothing */
 #endif
 
 /* -----------------------------------------------------------------------------
@@ -679,15 +677,17 @@ extern DLL_IMPORT_DATA const StgPolyInfoTable seq_frame_info;
 static __inline__ void
 SaveThreadState(void)
 {
+  StgTSO *tso;
+
   /* Don't need to save REG_Base, it won't have changed. */
 
-  CurrentTSO->sp       = Sp;
-  CurrentTSO->su       = Su;
-  CurrentTSO->splim    = SpLim;
+  tso = CurrentTSO;
+  tso->sp       = Sp;
+  tso->su       = Su;
   CloseNursery(Hp);
 
 #ifdef REG_CurrentTSO
-  SAVE_CurrentTSO = CurrentTSO;
+  SAVE_CurrentTSO = tso;
 #endif
 #ifdef REG_CurrentNursery
   SAVE_CurrentNursery = CurrentNursery;
@@ -700,14 +700,18 @@ SaveThreadState(void)
 static __inline__ void 
 LoadThreadState (void)
 {
-  Sp    = CurrentTSO->sp;
-  Su    = CurrentTSO->su;
-  SpLim = CurrentTSO->splim;
-  OpenNursery(Hp,HpLim);
+  StgTSO *tso;
 
 #ifdef REG_CurrentTSO
   CurrentTSO = SAVE_CurrentTSO;
 #endif
+
+  tso = CurrentTSO;
+  Sp    = tso->sp;
+  Su    = tso->su;
+  SpLim = (P_)&(tso->stack) + RESERVED_STACK_WORDS;
+  OpenNursery(Hp,HpLim);
+
 #ifdef REG_CurrentNursery
   CurrentNursery = SAVE_CurrentNursery;
 #endif
@@ -722,13 +726,11 @@ LoadThreadState (void)
    Module initialisation
    -------------------------------------------------------------------------- */
 
-extern F_ *init_stack;
-
 #define PUSH_INIT_STACK(reg_function)          \
-       *(init_stack++) = (F_)reg_function
+       *(Sp++) = (W_)reg_function
 
 #define POP_INIT_STACK()                       \
-       *(--init_stack)
+       *(--Sp)
 
 #define START_MOD_INIT(reg_mod_name)           \
        static int _module_registered = 0;      \
@@ -743,10 +745,8 @@ extern F_ *init_stack;
         STGCALL1(getStablePtr,reg_fe_binder)
        
 #define REGISTER_IMPORT(reg_mod_name)          \
-       do { EF_(reg_mod_name);                 \
-         PUSH_INIT_STACK(reg_mod_name) ;       \
-       } while (0)
-       
+        PUSH_INIT_STACK(reg_mod_name)
+
 #define END_MOD_INIT()                         \
         }};                                    \
        JMP_(POP_INIT_STACK());                 \