What compiler is used on windows?<br><br><div class="gmail_quote">On Fri, Jun 29, 2012 at 9:18 PM, Timur Iskhodzhanov <span dir="ltr"><<a href="mailto:timurrrr@google.com" target="_blank">timurrrr@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">__asm__ has just broken the Windows build of ASan RTL.<br>
Please fix or revert<br>
<br>
On Fri, Jun 29, 2012 at 9:58 AM, Dmitry Vyukov <<a href="mailto:dvyukov@google.com">dvyukov@google.com</a>> wrote:<br>
> Author: dvyukov<br>
> Date: Fri Jun 29 11:58:33 2012<br>
> New Revision: 159437<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=159437&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=159437&view=rev</a><br>
> Log:<br>
> tsan/asan: unify atomics (move atomics from tsan to sanitizer_common)<br>
><br>
> Added:<br>
>    compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic.h<br>
> Removed:<br>
>    compiler-rt/trunk/lib/tsan/rtl/tsan_atomic.h<br>
> Modified:<br>
>    compiler-rt/trunk/lib/asan/asan_allocator.cc<br>
>    compiler-rt/trunk/lib/asan/asan_rtl.cc<br>
>    compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h<br>
>    compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h<br>
>    compiler-rt/trunk/lib/tsan/rtl/tsan_defs.h<br>
>    compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc<br>
>    compiler-rt/trunk/lib/tsan/rtl/tsan_mutex.h<br>
>    compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc<br>
>    compiler-rt/trunk/lib/tsan/rtl/tsan_sync.h<br>
>    compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mutex.cc<br>
>    compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util_linux.cc<br>
>    compiler-rt/trunk/lib/tsan/unit_tests/tsan_mutex_test.cc<br>
><br>
> Modified: compiler-rt/trunk/lib/asan/asan_allocator.cc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_allocator.cc?rev=159437&r1=159436&r2=159437&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_allocator.cc?rev=159437&r1=159436&r2=159437&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/asan/asan_allocator.cc (original)<br>
> +++ compiler-rt/trunk/lib/asan/asan_allocator.cc Fri Jun 29 11:58:33 2012<br>
> @@ -34,6 +34,7 @@<br>
>  #include "asan_stats.h"<br>
>  #include "asan_thread.h"<br>
>  #include "asan_thread_registry.h"<br>
> +#include "sanitizer_common/sanitizer_atomic.h"<br>
><br>
>  #if defined(_WIN32) && !defined(__clang__)<br>
>  #include <intrin.h><br>
> @@ -159,8 +160,8 @@<br>
>  struct ChunkBase {<br>
>   // First 8 bytes.<br>
>   uptr  chunk_state : 8;<br>
> -  uptr  size_class  : 8;<br>
>   uptr  alloc_tid   : 24;<br>
> +  uptr  size_class  : 8;<br>
>   uptr  free_tid    : 24;<br>
><br>
>   // Second 8 bytes.<br>
> @@ -420,7 +421,7 @@<br>
><br>
>  private:<br>
>   PageGroup *FindPageGroupUnlocked(uptr addr) {<br>
> -    int n = n_page_groups_;<br>
> +    int n = atomic_load(&n_page_groups_, memory_order_relaxed);<br>
>     // If the page groups are not sorted yet, sort them.<br>
>     if (n_sorted_page_groups_ < n) {<br>
>       SortArray((uptr*)page_groups_, n);<br>
> @@ -562,9 +563,9 @@<br>
>     pg->end = pg->beg + mmap_size;<br>
>     pg->size_of_chunk = size;<br>
>     pg->last_chunk = (uptr)(mem + size * (n_chunks - 1));<br>
> -    int page_group_idx = AtomicInc(&n_page_groups_) - 1;<br>
> -    CHECK(page_group_idx < (int)ASAN_ARRAY_SIZE(page_groups_));<br>
> -    page_groups_[page_group_idx] = pg;<br>
> +    int idx = atomic_fetch_add(&n_page_groups_, 1, memory_order_relaxed);<br>
> +    CHECK(idx < (int)ASAN_ARRAY_SIZE(page_groups_));<br>
> +    page_groups_[idx] = pg;<br>
>     return res;<br>
>   }<br>
><br>
> @@ -573,7 +574,7 @@<br>
>   AsanLock mu_;<br>
><br>
>   PageGroup *page_groups_[kMaxAvailableRam / kMinMmapSize];<br>
> -  int n_page_groups_;  // atomic<br>
> +  atomic_uint32_t n_page_groups_;<br>
>   int n_sorted_page_groups_;<br>
>  };<br>
><br>
> @@ -721,7 +722,8 @@<br>
>   AsanChunk *m = PtrToChunk((uptr)ptr);<br>
><br>
>   // Flip the chunk_state atomically to avoid race on double-free.<br>
> -  u8 old_chunk_state = AtomicExchange((u8*)m, CHUNK_QUARANTINE);<br>
> +  u8 old_chunk_state = atomic_exchange((atomic_uint8_t*)m, CHUNK_QUARANTINE,<br>
> +                                       memory_order_acq_rel);<br>
><br>
>   if (old_chunk_state == CHUNK_QUARANTINE) {<br>
>     AsanReport("ERROR: AddressSanitizer attempting double-free on %p:\n", ptr);<br>
><br>
> Modified: compiler-rt/trunk/lib/asan/asan_rtl.cc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=159437&r1=159436&r2=159437&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=159437&r1=159436&r2=159437&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)<br>
> +++ compiler-rt/trunk/lib/asan/asan_rtl.cc Fri Jun 29 11:58:33 2012<br>
> @@ -21,14 +21,15 @@<br>
>  #include "asan_stats.h"<br>
>  #include "asan_thread.h"<br>
>  #include "asan_thread_registry.h"<br>
> +#include "sanitizer_common/sanitizer_atomic.h"<br>
>  #include "sanitizer_common/sanitizer_libc.h"<br>
><br>
>  namespace __sanitizer {<br>
>  using namespace __asan;<br>
><br>
>  void Die() {<br>
> -  static int num_calls = 0;<br>
> -  if (AtomicInc(&num_calls) > 1) {<br>
> +  static atomic_uint32_t num_calls;<br>
> +  if (atomic_fetch_add(&num_calls, 1, memory_order_relaxed) != 0) {<br>
>     // Don't die twice - run a busy loop.<br>
>     while (1) { }<br>
>   }<br>
> @@ -343,8 +344,8 @@<br>
>  void __asan_report_error(uptr pc, uptr bp, uptr sp,<br>
>                          uptr addr, bool is_write, uptr access_size) {<br>
>   // Do not print more than one report, otherwise they will mix up.<br>
> -  static int num_calls = 0;<br>
> -  if (AtomicInc(&num_calls) > 1) return;<br>
> +  static atomic_uint32_t num_calls;<br>
> +  if (atomic_fetch_add(&num_calls, 1, memory_order_relaxed) != 0) return;<br>
><br>
>   AsanPrintf("===================================================="<br>
>              "=============\n");<br>
><br>
> Added: compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic.h?rev=159437&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic.h?rev=159437&view=auto</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic.h (added)<br>
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_atomic.h Fri Jun 29 11:58:33 2012<br>
> @@ -0,0 +1,153 @@<br>
> +//===-- sanitizer_atomic.h --------------------------------------*- C++ -*-===//<br>
> +//<br>
> +//                     The LLVM Compiler Infrastructure<br>
> +//<br>
> +// This file is distributed under the University of Illinois Open Source<br>
> +// License. See LICENSE.TXT for details.<br>
> +//<br>
> +//===----------------------------------------------------------------------===//<br>
> +<br>
> +#ifndef SANITIZER_ATOMIC_H<br>
> +#define SANITIZER_ATOMIC_H<br>
> +<br>
> +#include "sanitizer_internal_defs.h"<br>
> +<br>
> +namespace __sanitizer {<br>
> +<br>
> +enum memory_order {<br>
> +  memory_order_relaxed = 1 << 0,<br>
> +  memory_order_consume = 1 << 1,<br>
> +  memory_order_acquire = 1 << 2,<br>
> +  memory_order_release = 1 << 3,<br>
> +  memory_order_acq_rel = 1 << 4,<br>
> +  memory_order_seq_cst = 1 << 5,<br>
> +};<br>
> +<br>
> +struct atomic_uint8_t {<br>
> +  typedef u8 Type;<br>
> +  volatile Type val_dont_use;<br>
> +};<br>
> +<br>
> +struct atomic_uint16_t {<br>
> +  typedef u16 Type;<br>
> +  volatile Type val_dont_use;<br>
> +};<br>
> +<br>
> +struct atomic_uint32_t {<br>
> +  typedef u32 Type;<br>
> +  volatile Type val_dont_use;<br>
> +};<br>
> +<br>
> +struct atomic_uint64_t {<br>
> +  typedef u64 Type;<br>
> +  volatile Type val_dont_use;<br>
> +};<br>
> +<br>
> +struct atomic_uintptr_t {<br>
> +  typedef uptr Type;<br>
> +  volatile Type val_dont_use;<br>
> +};<br>
> +<br>
> +INLINE void atomic_signal_fence(memory_order) {<br>
> +  __asm__ __volatile__("" ::: "memory");<br>
> +}<br>
> +<br>
> +INLINE void atomic_thread_fence(memory_order) {<br>
> +  __sync_synchronize();<br>
> +}<br>
> +<br>
> +INLINE void proc_yield(int cnt) {<br>
> +  __asm__ __volatile__("" ::: "memory");<br>
> +#if defined(__i386__) || defined(__x86_64__)<br>
> +  for (int i = 0; i < cnt; i++)<br>
> +    __asm__ __volatile__("pause");<br>
> +#endif<br>
> +  __asm__ __volatile__("" ::: "memory");<br>
> +}<br>
> +<br>
> +template<typename T><br>
> +INLINE typename T::Type atomic_load(<br>
> +    const volatile T *a, memory_order mo) {<br>
> +  DCHECK(mo & (memory_order_relaxed | memory_order_consume<br>
> +      | memory_order_acquire | memory_order_seq_cst));<br>
> +  DCHECK(!((uptr)a % sizeof(*a)));<br>
> +  typename T::Type v;<br>
> +  if (mo == memory_order_relaxed) {<br>
> +    v = a->val_dont_use;<br>
> +  } else {<br>
> +    atomic_signal_fence(memory_order_seq_cst);<br>
> +    v = a->val_dont_use;<br>
> +    atomic_signal_fence(memory_order_seq_cst);<br>
> +  }<br>
> +  return v;<br>
> +}<br>
> +<br>
> +template<typename T><br>
> +INLINE void atomic_store(volatile T *a, typename T::Type v, memory_order mo) {<br>
> +  DCHECK(mo & (memory_order_relaxed | memory_order_release<br>
> +      | memory_order_seq_cst));<br>
> +  DCHECK(!((uptr)a % sizeof(*a)));<br>
> +  if (mo == memory_order_relaxed) {<br>
> +    a->val_dont_use = v;<br>
> +  } else {<br>
> +    atomic_signal_fence(memory_order_seq_cst);<br>
> +    a->val_dont_use = v;<br>
> +    atomic_signal_fence(memory_order_seq_cst);<br>
> +  }<br>
> +  if (mo == memory_order_seq_cst)<br>
> +    atomic_thread_fence(memory_order_seq_cst);<br>
> +}<br>
> +<br>
> +template<typename T><br>
> +INLINE typename T::Type atomic_fetch_add(volatile T *a,<br>
> +    typename T::Type v, memory_order mo) {<br>
> +  (void)mo;<br>
> +  DCHECK(!((uptr)a % sizeof(*a)));<br>
> +  return __sync_fetch_and_add(&a->val_dont_use, v);<br>
> +}<br>
> +<br>
> +template<typename T><br>
> +INLINE typename T::Type atomic_fetch_sub(volatile T *a,<br>
> +    typename T::Type v, memory_order mo) {<br>
> +  (void)mo;<br>
> +  DCHECK(!((uptr)a % sizeof(*a)));<br>
> +  return __sync_fetch_and_add(&a->val_dont_use, -v);<br>
> +}<br>
> +<br>
> +template<typename T><br>
> +INLINE typename T::Type atomic_exchange(volatile T *a,<br>
> +    typename T::Type v, memory_order mo) {<br>
> +  DCHECK(!((uptr)a % sizeof(*a)));<br>
> +  if (mo & (memory_order_release | memory_order_acq_rel | memory_order_seq_cst))<br>
> +    __sync_synchronize();<br>
> +  v = __sync_lock_test_and_set(&a->val_dont_use, v);<br>
> +  if (mo == memory_order_seq_cst)<br>
> +    __sync_synchronize();<br>
> +  return v;<br>
> +}<br>
> +<br>
> +template<typename T><br>
> +INLINE bool atomic_compare_exchange_strong(volatile T *a,<br>
> +                                           typename T::Type *cmp,<br>
> +                                           typename T::Type xchg,<br>
> +                                           memory_order mo) {<br>
> +  typedef typename T::Type Type;<br>
> +  Type cmpv = *cmp;<br>
> +  Type prev = __sync_val_compare_and_swap(&a->val_dont_use, cmpv, xchg);<br>
> +  if (prev == cmpv)<br>
> +    return true;<br>
> +  *cmp = prev;<br>
> +  return false;<br>
> +}<br>
> +<br>
> +template<typename T><br>
> +INLINE bool atomic_compare_exchange_weak(volatile T *a,<br>
> +                                           typename T::Type *cmp,<br>
> +                                           typename T::Type xchg,<br>
> +                                           memory_order mo) {<br>
> +  return atomic_compare_exchange_strong(a, cmp, xchg, mo);<br>
> +}<br>
> +<br>
> +}  // namespace __sanitizer<br>
> +<br>
> +#endif  // SANITIZER_ATOMIC_H<br>
><br>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=159437&r1=159436&r2=159437&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h?rev=159437&r1=159436&r2=159437&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h (original)<br>
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common.h Fri Jun 29 11:58:33 2012<br>
> @@ -77,11 +77,6 @@<br>
>  int Atexit(void (*function)(void));<br>
>  void SortArray(uptr *array, uptr size);<br>
><br>
> -// Atomics<br>
> -int AtomicInc(int *a);<br>
> -u16 AtomicExchange(u16 *a, u16 new_val);<br>
> -u8 AtomicExchange(u8 *a, u8 new_val);<br>
> -<br>
>  // Math<br>
>  inline bool IsPowerOfTwo(uptr x) {<br>
>   return (x & (x - 1)) == 0;<br>
><br>
> Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h?rev=159437&r1=159436&r2=159437&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h?rev=159437&r1=159436&r2=159437&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h (original)<br>
> +++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_internal_defs.h Fri Jun 29 11:58:33 2012<br>
> @@ -112,6 +112,24 @@<br>
>  #define CHECK_GT(a, b) CHECK_IMPL((a), >,  (b))<br>
>  #define CHECK_GE(a, b) CHECK_IMPL((a), >=, (b))<br>
><br>
> +#if TSAN_DEBUG<br>
> +#define DCHECK(a)       CHECK(a)<br>
> +#define DCHECK_EQ(a, b) CHECK_EQ(a, b)<br>
> +#define DCHECK_NE(a, b) CHECK_NE(a, b)<br>
> +#define DCHECK_LT(a, b) CHECK_LT(a, b)<br>
> +#define DCHECK_LE(a, b) CHECK_LE(a, b)<br>
> +#define DCHECK_GT(a, b) CHECK_GT(a, b)<br>
> +#define DCHECK_GE(a, b) CHECK_GE(a, b)<br>
> +#else<br>
> +#define DCHECK(a)<br>
> +#define DCHECK_EQ(a, b)<br>
> +#define DCHECK_NE(a, b)<br>
> +#define DCHECK_LT(a, b)<br>
> +#define DCHECK_LE(a, b)<br>
> +#define DCHECK_GT(a, b)<br>
> +#define DCHECK_GE(a, b)<br>
> +#endif<br>
> +<br>
>  #define UNIMPLEMENTED() CHECK("unimplemented" && 0)<br>
><br>
>  #define COMPILER_CHECK(pred) IMPL_COMPILER_ASSERT(pred, __LINE__)<br>
><br>
> Removed: compiler-rt/trunk/lib/tsan/rtl/tsan_atomic.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_atomic.h?rev=159436&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_atomic.h?rev=159436&view=auto</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_atomic.h (original)<br>
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_atomic.h (removed)<br>
> @@ -1,140 +0,0 @@<br>
> -//===-- tsan_rtl.h ----------------------------------------------*- C++ -*-===//<br>
> -//<br>
> -//                     The LLVM Compiler Infrastructure<br>
> -//<br>
> -// This file is distributed under the University of Illinois Open Source<br>
> -// License. See LICENSE.TXT for details.<br>
> -//<br>
> -//===----------------------------------------------------------------------===//<br>
> -//<br>
> -// This file is a part of ThreadSanitizer (TSan), a race detector.<br>
> -//<br>
> -// Atomic operations. For now implies IA-32/Intel64.<br>
> -//===----------------------------------------------------------------------===//<br>
> -<br>
> -#ifndef TSAN_ATOMIC_H<br>
> -#define TSAN_ATOMIC_H<br>
> -<br>
> -#include "tsan_defs.h"<br>
> -<br>
> -namespace __tsan {<br>
> -<br>
> -const int kCacheLineSize = 64;<br>
> -<br>
> -enum memory_order {<br>
> -  memory_order_relaxed = 1 << 0,<br>
> -  memory_order_consume = 1 << 1,<br>
> -  memory_order_acquire = 1 << 2,<br>
> -  memory_order_release = 1 << 3,<br>
> -  memory_order_acq_rel = 1 << 4,<br>
> -  memory_order_seq_cst = 1 << 5,<br>
> -};<br>
> -<br>
> -struct atomic_uint32_t {<br>
> -  typedef u32 Type;<br>
> -  volatile Type val_dont_use;<br>
> -};<br>
> -<br>
> -struct atomic_uint64_t {<br>
> -  typedef u64 Type;<br>
> -  volatile Type val_dont_use;<br>
> -};<br>
> -<br>
> -struct atomic_uintptr_t {<br>
> -  typedef uptr Type;<br>
> -  volatile Type val_dont_use;<br>
> -};<br>
> -<br>
> -INLINE void atomic_signal_fence(memory_order) {<br>
> -  __asm__ __volatile__("" ::: "memory");<br>
> -}<br>
> -<br>
> -INLINE void atomic_thread_fence(memory_order) {<br>
> -  __asm__ __volatile__("mfence" ::: "memory");<br>
> -}<br>
> -<br>
> -INLINE void proc_yield(int cnt) {<br>
> -  __asm__ __volatile__("" ::: "memory");<br>
> -  for (int i = 0; i < cnt; i++)<br>
> -    __asm__ __volatile__("pause");<br>
> -  __asm__ __volatile__("" ::: "memory");<br>
> -}<br>
> -<br>
> -template<typename T><br>
> -INLINE typename T::Type atomic_load(<br>
> -    const volatile T *a, memory_order mo) {<br>
> -  DCHECK(mo & (memory_order_relaxed | memory_order_consume<br>
> -      | memory_order_acquire | memory_order_seq_cst));<br>
> -  DCHECK(!((uptr)a % sizeof(*a)));<br>
> -  typename T::Type v;<br>
> -  if (mo == memory_order_relaxed) {<br>
> -    v = a->val_dont_use;<br>
> -  } else {<br>
> -    atomic_signal_fence(memory_order_seq_cst);<br>
> -    v = a->val_dont_use;<br>
> -    atomic_signal_fence(memory_order_seq_cst);<br>
> -  }<br>
> -  return v;<br>
> -}<br>
> -<br>
> -template<typename T><br>
> -INLINE void atomic_store(volatile T *a, typename T::Type v, memory_order mo) {<br>
> -  DCHECK(mo & (memory_order_relaxed | memory_order_release<br>
> -      | memory_order_seq_cst));<br>
> -  DCHECK(!((uptr)a % sizeof(*a)));<br>
> -  if (mo == memory_order_relaxed) {<br>
> -    a->val_dont_use = v;<br>
> -  } else {<br>
> -    atomic_signal_fence(memory_order_seq_cst);<br>
> -    a->val_dont_use = v;<br>
> -    atomic_signal_fence(memory_order_seq_cst);<br>
> -  }<br>
> -  if (mo == memory_order_seq_cst)<br>
> -    atomic_thread_fence(memory_order_seq_cst);<br>
> -}<br>
> -<br>
> -template<typename T><br>
> -INLINE typename T::Type atomic_fetch_add(volatile T *a,<br>
> -    typename T::Type v, memory_order mo) {<br>
> -  (void)mo;<br>
> -  DCHECK(!((uptr)a % sizeof(*a)));<br>
> -  return __sync_fetch_and_add(&a->val_dont_use, v);<br>
> -}<br>
> -<br>
> -template<typename T><br>
> -INLINE typename T::Type atomic_fetch_sub(volatile T *a,<br>
> -    typename T::Type v, memory_order mo) {<br>
> -  (void)mo;<br>
> -  DCHECK(!((uptr)a % sizeof(*a)));<br>
> -  return __sync_fetch_and_add(&a->val_dont_use, -v);<br>
> -}<br>
> -<br>
> -INLINE uptr atomic_exchange(volatile atomic_uintptr_t *a, uptr v,<br>
> -                            memory_order mo) {<br>
> -  __asm__ __volatile__("xchg %1, %0" : "+r"(v), "+m"(*a) : : "memory", "cc");<br>
> -  return v;<br>
> -}<br>
> -<br>
> -template<typename T><br>
> -INLINE bool atomic_compare_exchange_strong(volatile T *a,<br>
> -                                           typename T::Type *cmp,<br>
> -                                           typename T::Type xchg,<br>
> -                                           memory_order mo) {<br>
> -  typedef typename T::Type Type;<br>
> -  Type cmpv = *cmp;<br>
> -  Type prev = __sync_val_compare_and_swap(&a->val_dont_use, cmpv, xchg);<br>
> -  if (prev == cmpv)<br>
> -    return true;<br>
> -  *cmp = prev;<br>
> -  return false;<br>
> -}<br>
> -<br>
> -INLINE bool atomic_compare_exchange_weak(volatile atomic_uintptr_t *a,<br>
> -                                         uptr *cmp, uptr xchg,<br>
> -                                         memory_order mo) {<br>
> -  return atomic_compare_exchange_strong(a, cmp, xchg, mo);<br>
> -}<br>
> -<br>
> -}  // namespace __tsan<br>
> -<br>
> -#endif  // TSAN_ATOMIC_H<br>
><br>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_defs.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_defs.h?rev=159437&r1=159436&r2=159437&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_defs.h?rev=159437&r1=159436&r2=159437&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_defs.h (original)<br>
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_defs.h Fri Jun 29 11:58:33 2012<br>
> @@ -54,24 +54,6 @@<br>
>  const bool kCollectStats = false;<br>
>  #endif<br>
><br>
> -#if TSAN_DEBUG<br>
> -#define DCHECK(a)       CHECK(a)<br>
> -#define DCHECK_EQ(a, b) CHECK_EQ(a, b)<br>
> -#define DCHECK_NE(a, b) CHECK_NE(a, b)<br>
> -#define DCHECK_LT(a, b) CHECK_LT(a, b)<br>
> -#define DCHECK_LE(a, b) CHECK_LE(a, b)<br>
> -#define DCHECK_GT(a, b) CHECK_GT(a, b)<br>
> -#define DCHECK_GE(a, b) CHECK_GE(a, b)<br>
> -#else<br>
> -#define DCHECK(a)<br>
> -#define DCHECK_EQ(a, b)<br>
> -#define DCHECK_NE(a, b)<br>
> -#define DCHECK_LT(a, b)<br>
> -#define DCHECK_LE(a, b)<br>
> -#define DCHECK_GT(a, b)<br>
> -#define DCHECK_GE(a, b)<br>
> -#endif<br>
> -<br>
>  // The following "build consistency" machinery ensures that all source files<br>
>  // are built in the same configuration. Inconsistent builds lead to<br>
>  // hard to debug crashes.<br>
><br>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=159437&r1=159436&r2=159437&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=159437&r1=159436&r2=159437&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)<br>
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Fri Jun 29 11:58:33 2012<br>
> @@ -12,11 +12,11 @@<br>
>  //===----------------------------------------------------------------------===//<br>
><br>
>  #include "interception/interception.h"<br>
> +#include "sanitizer_common/sanitizer_atomic.h"<br>
>  #include "sanitizer_common/sanitizer_libc.h"<br>
>  #include "sanitizer_common/sanitizer_placement_new.h"<br>
>  #include "tsan_rtl.h"<br>
>  #include "tsan_interface.h"<br>
> -#include "tsan_atomic.h"<br>
>  #include "tsan_platform.h"<br>
>  #include "tsan_mman.h"<br>
><br>
><br>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_mutex.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_mutex.h?rev=159437&r1=159436&r2=159437&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_mutex.h?rev=159437&r1=159436&r2=159437&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_mutex.h (original)<br>
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_mutex.h Fri Jun 29 11:58:33 2012<br>
> @@ -13,7 +13,7 @@<br>
>  #ifndef TSAN_MUTEX_H<br>
>  #define TSAN_MUTEX_H<br>
><br>
> -#include "tsan_atomic.h"<br>
> +#include "sanitizer_common/sanitizer_atomic.h"<br>
>  #include "tsan_defs.h"<br>
><br>
>  namespace __tsan {<br>
><br>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc?rev=159437&r1=159436&r2=159437&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc?rev=159437&r1=159436&r2=159437&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc (original)<br>
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_rtl.cc Fri Jun 29 11:58:33 2012<br>
> @@ -12,6 +12,7 @@<br>
>  // Main file (entry points) for the TSan run-time.<br>
>  //===----------------------------------------------------------------------===//<br>
><br>
> +#include "sanitizer_common/sanitizer_atomic.h"<br>
>  #include "sanitizer_common/sanitizer_common.h"<br>
>  #include "sanitizer_common/sanitizer_libc.h"<br>
>  #include "sanitizer_common/sanitizer_placement_new.h"<br>
> @@ -19,7 +20,6 @@<br>
>  #include "tsan_platform.h"<br>
>  #include "tsan_rtl.h"<br>
>  #include "tsan_interface.h"<br>
> -#include "tsan_atomic.h"<br>
>  #include "tsan_mman.h"<br>
>  #include "tsan_suppressions.h"<br>
><br>
><br>
> Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_sync.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_sync.h?rev=159437&r1=159436&r2=159437&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_sync.h?rev=159437&r1=159436&r2=159437&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/tsan/rtl/tsan_sync.h (original)<br>
> +++ compiler-rt/trunk/lib/tsan/rtl/tsan_sync.h Fri Jun 29 11:58:33 2012<br>
> @@ -13,7 +13,8 @@<br>
>  #ifndef TSAN_SYNC_H<br>
>  #define TSAN_SYNC_H<br>
><br>
> -#include "tsan_atomic.h"<br>
> +#include "sanitizer_common/sanitizer_atomic.h"<br>
> +#include "sanitizer_common/sanitizer_common.h"<br>
>  #include "tsan_clock.h"<br>
>  #include "tsan_defs.h"<br>
>  #include "tsan_mutex.h"<br>
><br>
> Modified: compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mutex.cc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mutex.cc?rev=159437&r1=159436&r2=159437&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mutex.cc?rev=159437&r1=159436&r2=159437&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mutex.cc (original)<br>
> +++ compiler-rt/trunk/lib/tsan/rtl_tests/tsan_mutex.cc Fri Jun 29 11:58:33 2012<br>
> @@ -10,7 +10,7 @@<br>
>  // This file is a part of ThreadSanitizer (TSan), a race detector.<br>
>  //<br>
>  //===----------------------------------------------------------------------===//<br>
> -#include "tsan_atomic.h"<br>
> +#include "sanitizer_common/sanitizer_atomic.h"<br>
>  #include "tsan_interface.h"<br>
>  #include "tsan_interface_ann.h"<br>
>  #include "tsan_test_util.h"<br>
><br>
> Modified: compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util_linux.cc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util_linux.cc?rev=159437&r1=159436&r2=159437&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util_linux.cc?rev=159437&r1=159436&r2=159437&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util_linux.cc (original)<br>
> +++ compiler-rt/trunk/lib/tsan/rtl_tests/tsan_test_util_linux.cc Fri Jun 29 11:58:33 2012<br>
> @@ -1,3 +1,4 @@<br>
> +<br>
>  //===-- tsan_test_util_linux.cc -------------------------------------------===//<br>
>  //<br>
>  //                     The LLVM Compiler Infrastructure<br>
> @@ -12,9 +13,9 @@<br>
>  // Test utils, linux implementation.<br>
>  //===----------------------------------------------------------------------===//<br>
><br>
> +#include "sanitizer_common/sanitizer_atomic.h"<br>
>  #include "tsan_interface.h"<br>
>  #include "tsan_test_util.h"<br>
> -#include "tsan_atomic.h"<br>
>  #include "tsan_report.h"<br>
><br>
>  #include "gtest/gtest.h"<br>
><br>
> Modified: compiler-rt/trunk/lib/tsan/unit_tests/tsan_mutex_test.cc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_mutex_test.cc?rev=159437&r1=159436&r2=159437&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/unit_tests/tsan_mutex_test.cc?rev=159437&r1=159436&r2=159437&view=diff</a><br>

> ==============================================================================<br>
> --- compiler-rt/trunk/lib/tsan/unit_tests/tsan_mutex_test.cc (original)<br>
> +++ compiler-rt/trunk/lib/tsan/unit_tests/tsan_mutex_test.cc Fri Jun 29 11:58:33 2012<br>
> @@ -11,7 +11,8 @@<br>
>  //<br>
>  //===----------------------------------------------------------------------===//<br>
>  #include "sanitizer_common/sanitizer_internal_defs.h"<br>
> -#include "tsan_atomic.h"<br>
> +#include "sanitizer_common/sanitizer_atomic.h"<br>
> +#include "sanitizer_common/sanitizer_common.h"<br>
>  #include "tsan_mutex.h"<br>
>  #include "gtest/gtest.h"<br>
><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>