From 73566e25d75588185b0581722406da5c48965c51 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 29 Jun 2006 13:47:26 +0000 Subject: [PATCH] Replace inline C functions with C-- macros in .cmm code So that we can build the RTS with the NCG. --- includes/Cmm.h | 28 ++++++++++++++++++++++++++++ includes/STM.h | 4 ---- includes/TSO.h | 4 ---- includes/mkDerivedConstants.c | 1 + rts/PrimOps.cmm | 10 +++++----- rts/Updates.h | 4 +--- 6 files changed, 35 insertions(+), 16 deletions(-) diff --git a/includes/Cmm.h b/includes/Cmm.h index d95002c..e494b60 100644 --- a/includes/Cmm.h +++ b/includes/Cmm.h @@ -514,4 +514,32 @@ #define TICK_MILLISECS (1000/TICK_FREQUENCY) /* ms per tick */ +#define NO_TREC stg_NO_TREC_closure +#define END_TSO_QUEUE stg_END_TSO_QUEUE_closure + +#define dirtyTSO(tso) \ + StgTSO_flags(tso) = StgTSO_flags(tso) | TSO_DIRTY::I32; + +#define recordMutableCap(p, gen, regs) \ + W_ __bd; \ + W_ mut_list; \ + mut_list = Capability_mut_lists(MyCapability()) + WDS(gen); \ + __bd = W_[mut_list]; \ + if (bdescr_free(__bd) >= bdescr_start(__bd) + BLOCK_SIZE) { \ + W_ __new_bd; \ + "ptr" __new_bd = foreign "C" allocBlock_lock() [regs]; \ + bdescr_link(__new_bd) = __bd; \ + __bd = __new_bd; \ + W_[mut_list] = __bd; \ + } \ + W_ free; \ + free = bdescr_free(__bd); \ + W_[free] = p; \ + bdescr_free(__bd) = free + WDS(1); + +#define recordMutable(p, regs) \ + W_ __p; \ + __p = p; \ + recordMutableCap(__p, TO_W_(bdescr_gen_no(Bdescr(__p))), regs) + #endif /* CMM_H */ diff --git a/includes/STM.h b/includes/STM.h index 4c2b109..ebbf193 100644 --- a/includes/STM.h +++ b/includes/STM.h @@ -221,11 +221,7 @@ extern void stmWriteTVar(Capability *cap, #define END_STM_WAIT_QUEUE ((StgTVarWaitQueue *)(void *)&stg_END_STM_WAIT_QUEUE_closure) #define END_STM_CHUNK_LIST ((StgTRecChunk *)(void *)&stg_END_STM_CHUNK_LIST_closure) -#if IN_STG_CODE -#define NO_TREC (stg_NO_TREC_closure) -#else #define NO_TREC ((StgTRecHeader *)(void *)&stg_NO_TREC_closure) -#endif /*----------------------------------------------------------------------*/ diff --git a/includes/TSO.h b/includes/TSO.h index 0c3e4ee..4621d4a 100644 --- a/includes/TSO.h +++ b/includes/TSO.h @@ -248,11 +248,7 @@ extern StgTSO dummy_tso; /* this is the NIL ptr for a TSO queue (e.g. runnable queue) */ -#if IN_STG_CODE -#define END_TSO_QUEUE (stg_END_TSO_QUEUE_closure) -#else #define END_TSO_QUEUE ((StgTSO *)(void*)&stg_END_TSO_QUEUE_closure) -#endif #if defined(PAR) || defined(GRAN) /* this is the NIL ptr for a blocking queue */ diff --git a/includes/mkDerivedConstants.c b/includes/mkDerivedConstants.c index 689851e..efb6c4a 100644 --- a/includes/mkDerivedConstants.c +++ b/includes/mkDerivedConstants.c @@ -229,6 +229,7 @@ main(int argc, char *argv[]) field_offset(Capability, r); field_offset(Capability, lock); + struct_field(Capability, mut_lists); struct_field(bdescr, start); struct_field(bdescr, free); diff --git a/rts/PrimOps.cmm b/rts/PrimOps.cmm index 274e3a6..153baaa 100644 --- a/rts/PrimOps.cmm +++ b/rts/PrimOps.cmm @@ -138,7 +138,7 @@ unsafeThawArrayzh_fast // if (StgHeader_info(R1) != stg_MUT_ARR_PTRS_FROZEN0_info) { SET_INFO(R1,stg_MUT_ARR_PTRS_DIRTY_info); - foreign "C" recordMutableLock(R1 "ptr") [R1]; + recordMutable(R1, R1); // must be done after SET_INFO, because it ASSERTs closure_MUTABLE() RET_P(R1); } else { @@ -1522,7 +1522,7 @@ takeMVarzh_fast /* actually perform the putMVar for the thread that we just woke up */ tso = StgMVar_head(mvar); PerformPut(tso,StgMVar_value(mvar)); - foreign "C" dirtyTSO(tso "ptr") []; + dirtyTSO(tso); #if defined(GRAN) || defined(PAR) /* ToDo: check 2nd arg (mvar) is right */ @@ -1596,7 +1596,7 @@ tryTakeMVarzh_fast /* actually perform the putMVar for the thread that we just woke up */ tso = StgMVar_head(mvar); PerformPut(tso,StgMVar_value(mvar)); - foreign "C" dirtyTSO(tso "ptr") []; + dirtyTSO(tso); #if defined(GRAN) || defined(PAR) /* ToDo: check 2nd arg (mvar) is right */ @@ -1666,7 +1666,7 @@ putMVarzh_fast /* actually perform the takeMVar */ tso = StgMVar_head(mvar); PerformTake(tso, R2); - foreign "C" dirtyTSO(tso "ptr") []; + dirtyTSO(tso); #if defined(GRAN) || defined(PAR) /* ToDo: check 2nd arg (mvar) is right */ @@ -1732,7 +1732,7 @@ tryPutMVarzh_fast /* actually perform the takeMVar */ tso = StgMVar_head(mvar); PerformTake(tso, R2); - foreign "C" dirtyTSO(tso "ptr") []; + dirtyTSO(tso); #if defined(GRAN) || defined(PAR) /* ToDo: check 2nd arg (mvar) is right */ diff --git a/rts/Updates.h b/rts/Updates.h index c8c75b1..2456f12 100644 --- a/rts/Updates.h +++ b/rts/Updates.h @@ -280,9 +280,7 @@ FILL_SLOP(StgClosure *p) prim %write_barrier() []; \ bd = Bdescr(p1); \ if (bdescr_gen_no(bd) != 0 :: CInt) { \ - foreign "C" recordMutableCap(p1 "ptr", \ - MyCapability() "ptr", \ - bdescr_gen_no(bd)) [R1]; \ + recordMutableCap(p1, TO_W_(bdescr_gen_no(bd)), R1); \ SET_INFO(p1, stg_IND_OLDGEN_info); \ LDV_RECORD_CREATE(p1); \ TICK_UPD_OLD_IND(); \ -- 1.7.10.4