X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FStgMacros.h;h=9a0130961b13dbc998fc91e15346bb1261465149;hb=c51b55b80eb58319287ba54f10e1c0bf6d024fe4;hp=bc269ad1993291a01b7d0cd373e1e6531e67725f;hpb=49072b751363dadd25e0f05f0468075b37f93206;p=ghc-hetmet.git diff --git a/ghc/includes/StgMacros.h b/ghc/includes/StgMacros.h index bc269ad..9a01309 100644 --- a/ghc/includes/StgMacros.h +++ b/ghc/includes/StgMacros.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: StgMacros.h,v 1.19 1999/11/22 16:44:30 sewardj Exp $ + * $Id: StgMacros.h,v 1.38 2001/07/24 06:31:35 ken Exp $ * * (c) The GHC Team, 1998-1999 * @@ -47,20 +47,21 @@ #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. @@ -138,6 +139,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); \ tag_assts \ @@ -146,6 +148,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); \ tag_assts \ @@ -165,6 +168,10 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; } functions. In all these cases, node points to a closure that we can just enter to restart the heap check (the NP stands for 'node points'). + In the NP case GranSim absolutely has to check whether the current node + resides on the current processor. Otherwise a FETCH event has to be + scheduled. All that is done in GranSimFetch. -- HWL + HpLim points to the LAST WORD of valid allocation space. -------------------------------------------------------------------------- */ @@ -176,6 +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); \ tag_assts \ @@ -183,6 +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); \ tag_assts \ @@ -190,6 +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); \ tag_assts \ @@ -200,6 +210,7 @@ static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; } /* Heap checks for branches of a primitive case / unboxed tuple return */ #define GEN_HP_CHK_ALT(headroom,lbl,tag_assts) \ + DO_GRAN_ALLOCATE(headroom) \ if ((Hp += (headroom)) > HpLim) { \ EXTFUN_RTS(lbl); \ tag_assts \ @@ -283,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; \ @@ -296,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; \ @@ -305,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); \ @@ -318,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) \ { \ @@ -337,10 +348,29 @@ EF_(stg_gen_block); #define BLOCK_NP(ptrs) \ { \ - EF_(stg_block_##ptrs); \ + EXTFUN_RTS(stg_block_##ptrs); \ JMP_(stg_block_##ptrs); \ } +#if defined(PAR) +/* + Similar to BLOCK_NP but separates the saving of the thread state from the + actual jump via an StgReturn +*/ + +#define SAVE_THREAD_STATE(ptrs) \ + ASSERT(ptrs==1); \ + Sp -= 1; \ + Sp[0] = R1.w; \ + SaveThreadState(); + +#define THREAD_RETURN(ptrs) \ + ASSERT(ptrs==1); \ + CurrentTSO->what_next = ThreadEnterGHC; \ + R1.i = ThreadBlocked; \ + JMP_(StgReturn); +#endif + /* ----------------------------------------------------------------------------- CCall_GC needs to push a dummy stack frame containing the contents of volatile registers and variables. @@ -348,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 @@ -395,7 +422,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(); \ { \ @@ -409,21 +436,21 @@ 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 */ # 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) /* ----------------------------------------------------------------------------- @@ -584,13 +611,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 @@ -599,14 +649,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; \ } @@ -616,9 +666,13 @@ extern DLL_IMPORT_DATA const StgPolyInfoTable seq_frame_info; -------------------------------------------------------------------------- */ #if defined(USE_SPLIT_MARKERS) -#define __STG_SPLIT_MARKER(n) FN_(__stg_split_marker##n) { } +#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(n) /* nothing */ +#define __STG_SPLIT_MARKER /* nothing */ #endif /* ----------------------------------------------------------------------------- @@ -650,15 +704,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; @@ -671,14 +727,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 @@ -690,6 +750,36 @@ LoadThreadState (void) #endif /* ----------------------------------------------------------------------------- + Module initialisation + -------------------------------------------------------------------------- */ + +#define PUSH_INIT_STACK(reg_function) \ + *(Sp++) = (W_)reg_function + +#define POP_INIT_STACK() \ + *(--Sp) + +#define START_MOD_INIT(reg_mod_name) \ + static int _module_registered = 0; \ + FN_(reg_mod_name) { \ + FB_; \ + if (! _module_registered) { \ + _module_registered = 1; \ + { + /* extern decls go here, followed by init code */ + +#define REGISTER_FOREIGN_EXPORT(reg_fe_binder) \ + STGCALL1(getStablePtr,reg_fe_binder) + +#define REGISTER_IMPORT(reg_mod_name) \ + PUSH_INIT_STACK(reg_mod_name) + +#define END_MOD_INIT() \ + }}; \ + JMP_(POP_INIT_STACK()); \ + FE_ } + +/* ----------------------------------------------------------------------------- Support for _ccall_GC_ and _casm_GC. -------------------------------------------------------------------------- */