summaryrefslogtreecommitdiffstats
path: root/include/llvm/System
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2009-05-15 11:04:52 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2009-05-15 11:04:52 +0000
commitb2e82d07a75af9b66b88941a421ba56694a0328f (patch)
treee7cebc0472aad6bb27856d69b724eb17ac7efb72 /include/llvm/System
parent2c34f320eadea0e45d8b907941649551c796a504 (diff)
downloadexternal_llvm-b2e82d07a75af9b66b88941a421ba56694a0328f.zip
external_llvm-b2e82d07a75af9b66b88941a421ba56694a0328f.tar.gz
external_llvm-b2e82d07a75af9b66b88941a421ba56694a0328f.tar.bz2
Unbreak mingw build
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71856 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/System')
-rw-r--r--include/llvm/System/Atomic.h27
1 files changed, 17 insertions, 10 deletions
diff --git a/include/llvm/System/Atomic.h b/include/llvm/System/Atomic.h
index 03af143..b975462 100644
--- a/include/llvm/System/Atomic.h
+++ b/include/llvm/System/Atomic.h
@@ -27,12 +27,12 @@
namespace llvm {
namespace sys {
-
+
#if !defined(ENABLE_THREADS) || ENABLE_THREADS == 0
inline void MemoryFence() {
return;
}
-
+
typedef uint32_t cas_flag;
inline cas_flag CompareAndSwap(cas_flag* dest, cas_flag exc, cas_flag c) {
cas_flag result = *dest;
@@ -40,22 +40,22 @@ namespace llvm {
*dest = exc;
return result;
}
-
+
#elif __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
inline void MemoryFence() {
__sync_synchronize();
}
-
+
typedef volatile uint32_t cas_flag;
inline cas_flag CompareAndSwap(cas_flag* dest, cas_flag exc, cas_flag c) {
return __sync_val_compare_and_swap(dest, exc, c);
}
-
+
#elif defined(__APPLE__)
inline void MemoryFence() {
OSMemoryBarrier();
}
-
+
typedef volatile int32_t cas_flag;
inline cas_flag CompareAndSwap(cas_flag* dest, cas_flag exc, cas_flag c) {
cas_flag old = *dest;
@@ -63,11 +63,18 @@ namespace llvm {
return old;
}
#elif defined(LLVM_ON_WIN32)
-#warning Memory fence implementation requires Windows 2003 or later.
inline void MemoryFence() {
+#ifdef _MSC_VER
MemoryBarrier();
+#elif 0
+ // FIXME: Requires SSE2 support
+ __asm__ __volatile__("mfence":::"memory");
+#else
+ // FIXME: just temporary workaround. We need to emit some fence...
+ __asm__ __volatile__("":::"memory");
+#endif
}
-
+
typedef volatile long cas_flag;
inline cas_flag CompareAndSwap(cas_flag* dest, cas_flag exc, cas_flag c) {
return InterlockedCompareExchange(dest, exc, c);
@@ -75,8 +82,8 @@ namespace llvm {
#else
#error No memory atomics implementation for your platform!
#endif
-
+
}
}
-#endif \ No newline at end of file
+#endif