Omit definitions of cas() and xchg() in .hc code
authorSimon Marlow <marlowsd@gmail.com>
Fri, 14 Nov 2008 09:57:38 +0000 (09:57 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 14 Nov 2008 09:57:38 +0000 (09:57 +0000)
They cause compilation errors (correctly) with newer gccs
Shows up compiling the RTS via C, which happens on Windows

includes/SMP.h

index eaac770..e3b4cd5 100644 (file)
    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.