<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>