summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2008-11-14 09:57:38 +0000
committerSimon Marlow <marlowsd@gmail.com>2008-11-14 09:57:38 +0000
commitfa4e32f81bcfbba98ba7e9d5cb96a74b75b052da (patch)
treea15f3b456a7a00383b6207dd540ff4798db6efc8 /includes
parent0b60725b6817a819b0d3c5ad940aef3eda008b88 (diff)
downloadhaskell-fa4e32f81bcfbba98ba7e9d5cb96a74b75b052da.tar.gz
Omit definitions of cas() and xchg() in .hc code
They cause compilation errors (correctly) with newer gccs Shows up compiling the RTS via C, which happens on Windows
Diffstat (limited to 'includes')
-rw-r--r--includes/SMP.h13
1 files changed, 13 insertions, 0 deletions
diff --git a/includes/SMP.h b/includes/SMP.h
index eaac770107..e3b4cd54a2 100644
--- a/includes/SMP.h
+++ b/includes/SMP.h
@@ -34,6 +34,12 @@
Atomic operations
------------------------------------------------------------------------- */
+#if !IN_STG_CODE
+// We only want write_barrier() declared in .hc files. Defining the
+// other inline functions here causes type mismatch errors from gcc,
+// because the generated C code is assuming that there are no
+// prototypes in scope.
+
/*
* The atomic exchange operation: xchg(p,w) exchanges the value
* pointed to by p with the value w, returning the old value.
@@ -54,6 +60,8 @@ EXTERN_INLINE StgWord xchg(StgPtr p, StgWord w);
*/
EXTERN_INLINE StgWord cas(StgVolatilePtr p, StgWord o, StgWord n);
+#endif // !IN_STG_CODE
+
/*
* Prevents write operations from moving across this call in either
* direction.
@@ -63,6 +71,9 @@ EXTERN_INLINE void write_barrier(void);
/* ----------------------------------------------------------------------------
Implementations
------------------------------------------------------------------------- */
+
+#if !IN_STG_CODE
+
/*
* NB: the xchg instruction is implicitly locked, so we do not need
* a lock prefix here.
@@ -149,6 +160,8 @@ cas(StgVolatilePtr p, StgWord o, StgWord n)
#endif
}
+#endif // !IN_STG_CODE
+
/*
* Write barrier - ensure that all preceding writes have happened
* before all following writes.