summaryrefslogtreecommitdiffstats
path: root/llvm/lib/System/Atomic.cpp
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2009-05-20 18:26:15 +0000
committerOwen Anderson <resistor@mac.com>2009-05-20 18:26:15 +0000
commite5370f409bc5f308f26e79ee5dd1595f83667c2e (patch)
tree91de1326377fc05a422274e862404ec95ddd0eb9 /llvm/lib/System/Atomic.cpp
parentf1c25029b4c60d5930330aceb08a9219277d0267 (diff)
downloadbcm5719-llvm-e5370f409bc5f308f26e79ee5dd1595f83667c2e.tar.gz
bcm5719-llvm-e5370f409bc5f308f26e79ee5dd1595f83667c2e.zip
Move atomic operations' definitions out of line. While this seems kind of silly,
all kinds of problems caused by including windows.h and/or config.h in an LLVM header. llvm-svn: 72174
Diffstat (limited to 'llvm/lib/System/Atomic.cpp')
-rw-r--r--llvm/lib/System/Atomic.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/llvm/lib/System/Atomic.cpp b/llvm/lib/System/Atomic.cpp
new file mode 100644
index 00000000000..fa8a937c07f
--- /dev/null
+++ b/llvm/lib/System/Atomic.cpp
@@ -0,0 +1,52 @@
+//===-- Atomic.cpp - Atomic Operations --------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This header file implements atomic operations.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/System/Atomic.h"
+#include "llvm/Config/config.h"
+
+using namespace llvm;
+
+#if defined(_MSC_VER)
+#include <windows.h>
+#endif
+
+void sys::MemoryFence() {
+#if LLVM_MULTITHREADED==0
+ return;
+#else
+# if defined(__GNUC__)
+ __sync_synchronize();
+# elif defined(_MSC_VER)
+ MemoryBarrier();
+# else
+# error No memory fence implementation for your platform!
+# endif
+#endif
+}
+
+sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr,
+ sys::cas_flag new_value,
+ sys::cas_flag old_value) {
+#if LLVM_MULTITHREADED==0
+ T result = *dest;
+ if (result == c)
+ *dest = exc;
+ return result;
+#elif defined(__GNUC__)
+ return __sync_val_compare_and_swap(ptr, old_value, new_value);
+#elif defined(_MSC_VER)
+ return InterlockedCompareExchange(ptr, new_value, old_value);
+#else
+# error No compare-and-swap implementation for your platform!
+#endif
+} \ No newline at end of file
OpenPOWER on IntegriCloud