<div dir="ltr">This also lead me to discover <a href="http://llvm.org/PR19043">http://llvm.org/PR19043</a>.  Be aware that re-adding <atomic> includes will break the clang-cl self-host until that's fixed.  The self-host is still broken for other C++11-related reasons at the moment.</div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Mar 3, 2014 at 10:02 AM, Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@googlemail.com" target="_blank">benny.kra@googlemail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: d0k<br>
Date: Mon Mar  3 12:02:34 2014<br>
New Revision: 202731<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=202731&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=202731&view=rev</a><br>
Log:<br>
Revert "[C++11] Replace LLVM atomics with std::atomic."<br>
<br>
Breaks the MSVC build.<br>
DataStream.cpp(44): error C2552: 'llvm::Statistic::Value' : non-aggregates cannot be initialized with initializer list<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/ADT/Statistic.h<br>
    llvm/trunk/include/llvm/PassSupport.h<br>
    llvm/trunk/include/llvm/Support/ManagedStatic.h<br>
    llvm/trunk/lib/IR/Attributes.cpp<br>
    llvm/trunk/lib/IR/DiagnosticInfo.cpp<br>
    llvm/trunk/lib/Support/ManagedStatic.cpp<br>
    llvm/trunk/lib/Support/Statistic.cpp<br>
    llvm/trunk/lib/Support/Threading.cpp<br>
    llvm/trunk/lib/Support/Timer.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/ADT/Statistic.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/Statistic.h?rev=202731&r1=202730&r2=202731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/Statistic.h?rev=202731&r1=202730&r2=202731&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/include/llvm/ADT/Statistic.h (original)<br>
+++ llvm/trunk/include/llvm/ADT/Statistic.h Mon Mar  3 12:02:34 2014<br>
@@ -26,8 +26,8 @@<br>
 #ifndef LLVM_ADT_STATISTIC_H<br>
 #define LLVM_ADT_STATISTIC_H<br>
<br>
+#include "llvm/Support/Atomic.h"<br>
 #include "llvm/Support/Valgrind.h"<br>
-#include <atomic><br>
<br>
 namespace llvm {<br>
 class raw_ostream;<br>
@@ -36,10 +36,10 @@ class Statistic {<br>
 public:<br>
   const char *Name;<br>
   const char *Desc;<br>
-  std::atomic<unsigned> Value;<br>
+  volatile llvm::sys::cas_flag Value;<br>
   bool Initialized;<br>
<br>
-  unsigned getValue() const { return Value; }<br>
+  llvm::sys::cas_flag getValue() const { return Value; }<br>
   const char *getName() const { return Name; }<br>
   const char *getDesc() const { return Desc; }<br>
<br>
@@ -63,54 +63,48 @@ public:<br>
     // atomic operation to update the value safely in the presence of<br>
     // concurrent accesses, but not to read the return value, so the<br>
     // return value is not thread safe.<br>
-    ++Value;<br>
+    sys::AtomicIncrement(&Value);<br>
     return init();<br>
   }<br>
<br>
   unsigned operator++(int) {<br>
     init();<br>
-    unsigned OldValue = Value++;<br>
+    unsigned OldValue = Value;<br>
+    sys::AtomicIncrement(&Value);<br>
     return OldValue;<br>
   }<br>
<br>
   const Statistic &operator--() {<br>
-    --Value;<br>
+    sys::AtomicDecrement(&Value);<br>
     return init();<br>
   }<br>
<br>
   unsigned operator--(int) {<br>
     init();<br>
-    unsigned OldValue = Value--;<br>
+    unsigned OldValue = Value;<br>
+    sys::AtomicDecrement(&Value);<br>
     return OldValue;<br>
   }<br>
<br>
   const Statistic &operator+=(const unsigned &V) {<br>
     if (!V) return *this;<br>
-    Value += V;<br>
+    sys::AtomicAdd(&Value, V);<br>
     return init();<br>
   }<br>
<br>
   const Statistic &operator-=(const unsigned &V) {<br>
     if (!V) return *this;<br>
-    Value -= V;<br>
+    sys::AtomicAdd(&Value, -V);<br>
     return init();<br>
   }<br>
<br>
   const Statistic &operator*=(const unsigned &V) {<br>
-    unsigned Original, Result;<br>
-    do {<br>
-      Original = Value;<br>
-      Result = Original * V;<br>
-    } while (!Value.compare_exchange_strong(Original, Result));<br>
+    sys::AtomicMul(&Value, V);<br>
     return init();<br>
   }<br>
<br>
   const Statistic &operator/=(const unsigned &V) {<br>
-    unsigned Original, Result;<br>
-    do {<br>
-      Original = Value;<br>
-      Result = Original / V;<br>
-    } while (!Value.compare_exchange_strong(Original, Result));<br>
+    sys::AtomicDiv(&Value, V);<br>
     return init();<br>
   }<br>
<br>
@@ -157,7 +151,7 @@ public:<br>
 protected:<br>
   Statistic &init() {<br>
     bool tmp = Initialized;<br>
-    std::atomic_thread_fence(std::memory_order_seq_cst);<br>
+    sys::MemoryFence();<br>
     if (!tmp) RegisterStatistic();<br>
     TsanHappensAfter(this);<br>
     return *this;<br>
@@ -168,7 +162,7 @@ protected:<br>
 // STATISTIC - A macro to make definition of statistics really simple.  This<br>
 // automatically passes the DEBUG_TYPE of the file into the statistic.<br>
 #define STATISTIC(VARNAME, DESC) \<br>
-  static llvm::Statistic VARNAME = { DEBUG_TYPE, DESC, {}, 0 }<br>
+  static llvm::Statistic VARNAME = { DEBUG_TYPE, DESC, 0, 0 }<br>
<br>
 /// \brief Enable the collection and printing of statistics.<br>
 void EnableStatistics();<br>
<br>
Modified: llvm/trunk/include/llvm/PassSupport.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassSupport.h?rev=202731&r1=202730&r2=202731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/PassSupport.h?rev=202731&r1=202730&r2=202731&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/include/llvm/PassSupport.h (original)<br>
+++ llvm/trunk/include/llvm/PassSupport.h Mon Mar  3 12:02:34 2014<br>
@@ -24,8 +24,8 @@<br>
 #include "Pass.h"<br>
 #include "llvm/InitializePasses.h"<br>
 #include "llvm/PassRegistry.h"<br>
+#include "llvm/Support/Atomic.h"<br>
 #include "llvm/Support/Valgrind.h"<br>
-#include <atomic><br>
 #include <vector><br>
<br>
 namespace llvm {<br>
@@ -147,21 +147,21 @@ private:<br>
 };<br>
<br>
 #define CALL_ONCE_INITIALIZATION(function) \<br>
-  static std::atomic<int> initialized; \<br>
-  int old_val = 0; \<br>
-  if (initialized.compare_exchange_strong(old_val, 1)) { \<br>
+  static volatile sys::cas_flag initialized = 0; \<br>
+  sys::cas_flag old_val = sys::CompareAndSwap(&initialized, 1, 0); \<br>
+  if (old_val == 0) { \<br>
     function(Registry); \<br>
-    std::atomic_thread_fence(std::memory_order_seq_cst); \<br>
+    sys::MemoryFence(); \<br>
     TsanIgnoreWritesBegin(); \<br>
     TsanHappensBefore(&initialized); \<br>
     initialized = 2; \<br>
     TsanIgnoreWritesEnd(); \<br>
   } else { \<br>
-    int tmp = initialized.load(); \<br>
-    std::atomic_thread_fence(std::memory_order_seq_cst); \<br>
+    sys::cas_flag tmp = initialized; \<br>
+    sys::MemoryFence(); \<br>
     while (tmp != 2) { \<br>
-      tmp = initialized.load(); \<br>
-      std::atomic_thread_fence(std::memory_order_seq_cst); \<br>
+      tmp = initialized; \<br>
+      sys::MemoryFence(); \<br>
     } \<br>
   } \<br>
   TsanHappensAfter(&initialized);<br>
<br>
Modified: llvm/trunk/include/llvm/Support/ManagedStatic.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ManagedStatic.h?rev=202731&r1=202730&r2=202731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ManagedStatic.h?rev=202731&r1=202730&r2=202731&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/include/llvm/Support/ManagedStatic.h (original)<br>
+++ llvm/trunk/include/llvm/Support/ManagedStatic.h Mon Mar  3 12:02:34 2014<br>
@@ -14,9 +14,9 @@<br>
 #ifndef LLVM_SUPPORT_MANAGED_STATIC_H<br>
 #define LLVM_SUPPORT_MANAGED_STATIC_H<br>
<br>
+#include "llvm/Support/Atomic.h"<br>
 #include "llvm/Support/Threading.h"<br>
 #include "llvm/Support/Valgrind.h"<br>
-#include <atomic><br>
<br>
 namespace llvm {<br>
<br>
@@ -64,8 +64,7 @@ public:<br>
   // Accessors.<br>
   C &operator*() {<br>
     void* tmp = Ptr;<br>
-    if (llvm_is_multithreaded())<br>
-      std::atomic_thread_fence(std::memory_order_seq_cst);<br>
+    if (llvm_is_multithreaded()) sys::MemoryFence();<br>
     if (!tmp) RegisterManagedStatic(object_creator<C>, object_deleter<C>::call);<br>
     TsanHappensAfter(this);<br>
<br>
@@ -73,8 +72,7 @@ public:<br>
   }<br>
   C *operator->() {<br>
     void* tmp = Ptr;<br>
-    if (llvm_is_multithreaded())<br>
-      std::atomic_thread_fence(std::memory_order_seq_cst);<br>
+    if (llvm_is_multithreaded()) sys::MemoryFence();<br>
     if (!tmp) RegisterManagedStatic(object_creator<C>, object_deleter<C>::call);<br>
     TsanHappensAfter(this);<br>
<br>
@@ -82,8 +80,7 @@ public:<br>
   }<br>
   const C &operator*() const {<br>
     void* tmp = Ptr;<br>
-    if (llvm_is_multithreaded())<br>
-      std::atomic_thread_fence(std::memory_order_seq_cst);<br>
+    if (llvm_is_multithreaded()) sys::MemoryFence();<br>
     if (!tmp) RegisterManagedStatic(object_creator<C>, object_deleter<C>::call);<br>
     TsanHappensAfter(this);<br>
<br>
@@ -91,8 +88,7 @@ public:<br>
   }<br>
   const C *operator->() const {<br>
     void* tmp = Ptr;<br>
-    if (llvm_is_multithreaded())<br>
-      std::atomic_thread_fence(std::memory_order_seq_cst);<br>
+    if (llvm_is_multithreaded()) sys::MemoryFence();<br>
     if (!tmp) RegisterManagedStatic(object_creator<C>, object_deleter<C>::call);<br>
     TsanHappensAfter(this);<br>
<br>
<br>
Modified: llvm/trunk/lib/IR/Attributes.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Attributes.cpp?rev=202731&r1=202730&r2=202731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Attributes.cpp?rev=202731&r1=202730&r2=202731&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/IR/Attributes.cpp (original)<br>
+++ llvm/trunk/lib/IR/Attributes.cpp Mon Mar  3 12:02:34 2014<br>
@@ -18,6 +18,7 @@<br>
 #include "LLVMContextImpl.h"<br>
 #include "llvm/ADT/StringExtras.h"<br>
 #include "llvm/IR/Type.h"<br>
+#include "llvm/Support/Atomic.h"<br>
 #include "llvm/Support/Debug.h"<br>
 #include "llvm/Support/ManagedStatic.h"<br>
 #include "llvm/Support/Mutex.h"<br>
<br>
Modified: llvm/trunk/lib/IR/DiagnosticInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DiagnosticInfo.cpp?rev=202731&r1=202730&r2=202731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DiagnosticInfo.cpp?rev=202731&r1=202730&r2=202731&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/IR/DiagnosticInfo.cpp (original)<br>
+++ llvm/trunk/lib/IR/DiagnosticInfo.cpp Mon Mar  3 12:02:34 2014<br>
@@ -19,14 +19,14 @@<br>
 #include "llvm/IR/Function.h"<br>
 #include "llvm/IR/Instruction.h"<br>
 #include "llvm/IR/Metadata.h"<br>
-#include <atomic><br>
+#include "llvm/Support/Atomic.h"<br>
 #include <string><br>
<br>
 using namespace llvm;<br>
<br>
 int llvm::getNextAvailablePluginDiagnosticKind() {<br>
-  static std::atomic<int> PluginKindID(DK_FirstPluginKind);<br>
-  return ++PluginKindID;<br>
+  static sys::cas_flag PluginKindID = DK_FirstPluginKind;<br>
+  return (int)sys::AtomicIncrement(&PluginKindID);<br>
 }<br>
<br>
 DiagnosticInfoInlineAsm::DiagnosticInfoInlineAsm(const Instruction &I,<br>
<br>
Modified: llvm/trunk/lib/Support/ManagedStatic.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ManagedStatic.cpp?rev=202731&r1=202730&r2=202731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/ManagedStatic.cpp?rev=202731&r1=202730&r2=202731&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Support/ManagedStatic.cpp (original)<br>
+++ llvm/trunk/lib/Support/ManagedStatic.cpp Mon Mar  3 12:02:34 2014<br>
@@ -13,6 +13,7 @@<br>
<br>
 #include "llvm/Support/ManagedStatic.h"<br>
 #include "llvm/Config/config.h"<br>
+#include "llvm/Support/Atomic.h"<br>
 #include <cassert><br>
 using namespace llvm;<br>
<br>
@@ -27,7 +28,7 @@ void ManagedStaticBase::RegisterManagedS<br>
       void* tmp = Creator ? Creator() : 0;<br>
<br>
       TsanHappensBefore(this);<br>
-      std::atomic_thread_fence(std::memory_order_seq_cst);<br>
+      sys::MemoryFence();<br>
<br>
       // This write is racy against the first read in the ManagedStatic<br>
       // accessors. The race is benign because it does a second read after a<br>
<br>
Modified: llvm/trunk/lib/Support/Statistic.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Statistic.cpp?rev=202731&r1=202730&r2=202731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Statistic.cpp?rev=202731&r1=202730&r2=202731&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Support/Statistic.cpp (original)<br>
+++ llvm/trunk/lib/Support/Statistic.cpp Mon Mar  3 12:02:34 2014<br>
@@ -76,7 +76,7 @@ void Statistic::RegisterStatistic() {<br>
       StatInfo->addStatistic(this);<br>
<br>
     TsanHappensBefore(this);<br>
-    std::atomic_thread_fence(std::memory_order_seq_cst);<br>
+    sys::MemoryFence();<br>
     // Remember we have been registered.<br>
     TsanIgnoreWritesBegin();<br>
     Initialized = true;<br>
<br>
Modified: llvm/trunk/lib/Support/Threading.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Threading.cpp?rev=202731&r1=202730&r2=202731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Threading.cpp?rev=202731&r1=202730&r2=202731&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Support/Threading.cpp (original)<br>
+++ llvm/trunk/lib/Support/Threading.cpp Mon Mar  3 12:02:34 2014<br>
@@ -13,8 +13,8 @@<br>
<br>
 #include "llvm/Support/Threading.h"<br>
 #include "llvm/Config/config.h"<br>
+#include "llvm/Support/Atomic.h"<br>
 #include "llvm/Support/Mutex.h"<br>
-#include <atomic><br>
 #include <cassert><br>
<br>
 using namespace llvm;<br>
@@ -31,7 +31,7 @@ bool llvm::llvm_start_multithreaded() {<br>
<br>
   // We fence here to ensure that all initialization is complete BEFORE we<br>
   // return from llvm_start_multithreaded().<br>
-  std::atomic_thread_fence(std::memory_order_seq_cst);<br>
+  sys::MemoryFence();<br>
   return true;<br>
 #else<br>
   return false;<br>
@@ -44,7 +44,7 @@ void llvm::llvm_stop_multithreaded() {<br>
<br>
   // We fence here to insure that all threaded operations are complete BEFORE we<br>
   // return from llvm_stop_multithreaded().<br>
-  std::atomic_thread_fence(std::memory_order_seq_cst);<br>
+  sys::MemoryFence();<br>
<br>
   multithreaded_mode = false;<br>
   delete global_lock;<br>
<br>
Modified: llvm/trunk/lib/Support/Timer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Timer.cpp?rev=202731&r1=202730&r2=202731&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Timer.cpp?rev=202731&r1=202730&r2=202731&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Support/Timer.cpp (original)<br>
+++ llvm/trunk/lib/Support/Timer.cpp Mon Mar  3 12:02:34 2014<br>
@@ -81,14 +81,14 @@ raw_ostream *llvm::CreateInfoOutputFile(<br>
 static TimerGroup *DefaultTimerGroup = 0;<br>
 static TimerGroup *getDefaultTimerGroup() {<br>
   TimerGroup *tmp = DefaultTimerGroup;<br>
-  std::atomic_thread_fence(std::memory_order_seq_cst);<br>
+  sys::MemoryFence();<br>
   if (tmp) return tmp;<br>
<br>
   llvm_acquire_global_lock();<br>
   tmp = DefaultTimerGroup;<br>
   if (!tmp) {<br>
     tmp = new TimerGroup("Miscellaneous Ungrouped Timers");<br>
-    std::atomic_thread_fence(std::memory_order_seq_cst);<br>
+    sys::MemoryFence();<br>
     DefaultTimerGroup = tmp;<br>
   }<br>
   llvm_release_global_lock();<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>