summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Marlow <simonmar@microsoft.com>2006-06-29 13:47:26 +0000
committerSimon Marlow <simonmar@microsoft.com>2006-06-29 13:47:26 +0000
commit73566e25d75588185b0581722406da5c48965c51 (patch)
tree5b44477006e139b0b5331c3c94af62afa8b53bc0
parent6bf790bab31b9bb8791e2adc46c8ff511392419f (diff)
downloadhaskell-73566e25d75588185b0581722406da5c48965c51.tar.gz
Replace inline C functions with C-- macros in .cmm code
So that we can build the RTS with the NCG.
-rw-r--r--includes/Cmm.h28
-rw-r--r--includes/STM.h4
-rw-r--r--includes/TSO.h4
-rw-r--r--includes/mkDerivedConstants.c1
-rw-r--r--rts/PrimOps.cmm10
-rw-r--r--rts/Updates.h4
6 files changed, 35 insertions, 16 deletions
diff --git a/includes/Cmm.h b/includes/Cmm.h
index d95002c5af..e494b60102 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 4c2b109f73..ebbf193b0b 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 0c3e4eec38..4621d4ad69 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 689851e4e3..efb6c4aed7 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 274e3a6613..153baaaae5 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 c8c75b130e..2456f12b58 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(); \