diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2009-05-15 11:04:52 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2009-05-15 11:04:52 +0000 |
commit | b2e82d07a75af9b66b88941a421ba56694a0328f (patch) | |
tree | e7cebc0472aad6bb27856d69b724eb17ac7efb72 /include/llvm/System | |
parent | 2c34f320eadea0e45d8b907941649551c796a504 (diff) | |
download | external_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.h | 27 |
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 |