X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FStgMacros.h;h=da3a42548b90f0238b282200e5c2cb5e25e6ef3b;hb=57d15e1c1b85a8ec417e843827e5c8d271f7b1da;hp=0063630a8e5f142b2bf61977e1cdce6b451baade;hpb=6571e8fbae6f5888384fa643a88fcc26b5113ec7;p=ghc-hetmet.git diff --git a/ghc/includes/StgMacros.h b/ghc/includes/StgMacros.h index 0063630..da3a425 100644 --- a/ghc/includes/StgMacros.h +++ b/ghc/includes/StgMacros.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: StgMacros.h,v 1.30 2000/07/21 09:31:46 rrt Exp $ + * $Id: StgMacros.h,v 1.41 2001/11/08 16:37:54 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -41,15 +41,15 @@ #define STGFUN(f) StgFunPtr f(void) #define EXTFUN(f) extern StgFunPtr f(void) #define EXTFUN_RTS(f) extern DLL_IMPORT_RTS StgFunPtr f(void) -#define EXTINFO_RTS(f) extern DLL_IMPORT_RTS INFO_TBL_CONST StgInfoTable #define FN_(f) F_ f(void) #define IFN_(f) static F_ f(void) #define IF_(f) static F_ f(void) #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_ static #define ID_RO_ static const @@ -132,7 +132,6 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; } #define STK_CHK(headroom,ret,r,layout,tag_assts) \ if (Sp - headroom < SpLim) { \ - EXTFUN_RTS(stg_chk_##layout); \ tag_assts \ (r) = (P_)ret; \ JMP_(stg_chk_##layout); \ @@ -141,7 +140,7 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; } #define HP_CHK(headroom,ret,r,layout,tag_assts) \ DO_GRAN_ALLOCATE(headroom) \ if ((Hp += headroom) > HpLim) { \ - EXTFUN_RTS(stg_chk_##layout); \ + HpAlloc = (headroom); \ tag_assts \ (r) = (P_)ret; \ JMP_(stg_chk_##layout); \ @@ -150,7 +149,7 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; } #define HP_STK_CHK(stk_headroom,hp_headroom,ret,r,layout,tag_assts) \ DO_GRAN_ALLOCATE(hp_headroom) \ if (Sp - stk_headroom < SpLim || (Hp += hp_headroom) > HpLim) { \ - EXTFUN_RTS(stg_chk_##layout); \ + HpAlloc = (hp_headroom); \ tag_assts \ (r) = (P_)ret; \ JMP_(stg_chk_##layout); \ @@ -177,7 +176,6 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; } #define STK_CHK_NP(headroom,ptrs,tag_assts) \ if ((Sp - (headroom)) < SpLim) { \ - EXTFUN_RTS(stg_gc_enter_##ptrs); \ tag_assts \ JMP_(stg_gc_enter_##ptrs); \ } @@ -185,7 +183,7 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; } #define HP_CHK_NP(headroom,ptrs,tag_assts) \ DO_GRAN_ALLOCATE(headroom) \ if ((Hp += (headroom)) > HpLim) { \ - EXTFUN_RTS(stg_gc_enter_##ptrs); \ + HpAlloc = (headroom); \ tag_assts \ JMP_(stg_gc_enter_##ptrs); \ } @@ -193,7 +191,7 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; } #define HP_CHK_SEQ_NP(headroom,ptrs,tag_assts) \ DO_GRAN_ALLOCATE(headroom) \ if ((Hp += (headroom)) > HpLim) { \ - EXTFUN_RTS(stg_gc_seq_##ptrs); \ + HpAlloc = (headroom); \ tag_assts \ JMP_(stg_gc_seq_##ptrs); \ } @@ -201,7 +199,7 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; } #define HP_STK_CHK_NP(stk_headroom, hp_headroom, ptrs, tag_assts) \ DO_GRAN_ALLOCATE(hp_headroom) \ if ((Sp - (stk_headroom)) < SpLim || (Hp += (hp_headroom)) > HpLim) { \ - EXTFUN_RTS(stg_gc_enter_##ptrs); \ + HpAlloc = (hp_headroom); \ tag_assts \ JMP_(stg_gc_enter_##ptrs); \ } @@ -213,6 +211,7 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; } DO_GRAN_ALLOCATE(headroom) \ if ((Hp += (headroom)) > HpLim) { \ EXTFUN_RTS(lbl); \ + HpAlloc = (headroom); \ tag_assts \ JMP_(lbl); \ } @@ -294,7 +293,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 ) { \ - EXTFUN_RTS(stg_gen_chk); \ + HpAlloc = (headroom); \ tag_assts \ R9.w = (W_)LIVENESS_MASK(liveness); \ R10.w = (W_)reentry; \ @@ -307,7 +306,6 @@ 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) { \ - EXTFUN_RTS(stg_gen_chk); \ tag_assts \ R9.w = (W_)LIVENESS_MASK(liveness); \ R10.w = (W_)reentry; \ @@ -316,7 +314,6 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; } #define MAYBE_GC(liveness,reentry) \ if (doYouWantToGC()) { \ - EXTFUN_RTS(stg_gen_hp); \ R9.w = (W_)LIVENESS_MASK(liveness); \ R10.w = (W_)reentry; \ JMP_(stg_gen_hp); \ @@ -378,11 +375,8 @@ EXTFUN_RTS(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 @@ -425,7 +419,7 @@ EDI_(stg_gen_chk_info); } \ } \ } \ - SET_INFO(R1.cl,&BLACKHOLE_info) + SET_INFO(R1.cl,&stg_BLACKHOLE_info) # define UPD_BH_SINGLE_ENTRY(info) \ TICK_UPD_BH_SINGLE_ENTRY(); \ { \ @@ -439,14 +433,14 @@ EDI_(stg_gen_chk_info); } \ } \ } \ - SET_INFO(R1.cl,&BLACKHOLE_info) + SET_INFO(R1.cl,&stg_BLACKHOLE_info) # else # define UPD_BH_UPDATABLE(info) \ TICK_UPD_BH_UPDATABLE(); \ - SET_INFO(R1.cl,&BLACKHOLE_info) + SET_INFO(R1.cl,&stg_BLACKHOLE_info) # define UPD_BH_SINGLE_ENTRY(info) \ TICK_UPD_BH_SINGLE_ENTRY(); \ - SET_INFO(R1.cl,&SE_BLACKHOLE_info) + SET_INFO(R1.cl,&stg_SE_BLACKHOLE_info) # endif #else /* !EAGER_BLACKHOLING */ # define UPD_BH_UPDATABLE(thunk) /* nothing */ @@ -614,13 +608,36 @@ static inline StgInt64 PK_Int64(W_ p_src[]) y.iu.dlo = p_src[1]; return(y.i); } + +#elif SIZEOF_VOID_P == 8 + +static inline void ASSIGN_Word64(W_ p_dest[], StgWord64 src) +{ + p_dest[0] = src; +} + +static inline StgWord64 PK_Word64(W_ p_src[]) +{ + return p_src[0]; +} + +static inline void ASSIGN_Int64(W_ p_dest[], StgInt64 src) +{ + p_dest[0] = src; +} + +static inline StgInt64 PK_Int64(W_ p_src[]) +{ + return p_src[0]; +} + #endif /* ----------------------------------------------------------------------------- Catch frames -------------------------------------------------------------------------- */ -extern DLL_IMPORT_DATA const StgPolyInfoTable catch_frame_info; +extern DLL_IMPORT_RTS const StgPolyInfoTable stg_catch_frame_info; /* ----------------------------------------------------------------------------- Seq frames @@ -629,14 +646,14 @@ extern DLL_IMPORT_DATA const StgPolyInfoTable catch_frame_info; an update... -------------------------------------------------------------------------- */ -extern DLL_IMPORT_DATA const StgPolyInfoTable seq_frame_info; +extern DLL_IMPORT_RTS const StgPolyInfoTable stg_seq_frame_info; #define PUSH_SEQ_FRAME(sp) \ { \ StgSeqFrame *__frame; \ TICK_SEQF_PUSHED(); \ __frame = (StgSeqFrame *)(sp); \ - SET_HDR_(__frame,&seq_frame_info,CCCS); \ + SET_HDR_(__frame,&stg_seq_frame_info,CCCS); \ __frame->link = Su; \ Su = (StgUpdateFrame *)__frame; \ } @@ -646,7 +663,11 @@ extern DLL_IMPORT_DATA const StgPolyInfoTable seq_frame_info; -------------------------------------------------------------------------- */ #if defined(USE_SPLIT_MARKERS) +#if defined(cygwin32_TARGET_OS) || defined(mingw32_TARGET_OS) +#define __STG_SPLIT_MARKER __asm__("\n___stg_split_marker:"); +#else #define __STG_SPLIT_MARKER __asm__("\n__stg_split_marker:"); +#endif #else #define __STG_SPLIT_MARKER /* nothing */ #endif @@ -687,7 +708,6 @@ SaveThreadState(void) tso = CurrentTSO; tso->sp = Sp; tso->su = Su; - tso->splim = SpLim; CloseNursery(Hp); #ifdef REG_CurrentTSO @@ -713,7 +733,7 @@ LoadThreadState (void) tso = CurrentTSO; Sp = tso->sp; Su = tso->su; - SpLim = tso->splim; + SpLim = (P_)&(tso->stack) + RESERVED_STACK_WORDS; OpenNursery(Hp,HpLim); #ifdef REG_CurrentNursery @@ -749,10 +769,8 @@ LoadThreadState (void) STGCALL1(getStablePtr,reg_fe_binder) #define REGISTER_IMPORT(reg_mod_name) \ - do { EXTFUN_RTS(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()); \ @@ -766,7 +784,7 @@ LoadThreadState (void) * Suspending/resuming threads for doing external C-calls (_ccall_GC). * These functions are defined in rts/Schedule.c. */ -StgInt suspendThread ( StgRegTable *cap ); +StgInt suspendThread ( StgRegTable * ); StgRegTable * resumeThread ( StgInt ); #define SUSPEND_THREAD(token) \ @@ -774,9 +792,9 @@ StgRegTable * resumeThread ( StgInt ); token = suspendThread(BaseReg); #ifdef SMP -#define RESUME_THREAD(token) \ - BaseReg = resumeThread(token); \ - LoadThreadState(); +#define RESUME_THREAD(token) \ + BaseReg = resumeThread(token); \ + LoadThreadState(); #else #define RESUME_THREAD(token) \ (void)resumeThread(token); \