1fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
5fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
6fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// This file is an internal atomic implementation for compiler-based
7fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// ThreadSanitizer. Use base/atomicops.h instead.
8fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
91e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#ifndef V8_BASE_ATOMICOPS_INTERNALS_TSAN_H_
101e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#define V8_BASE_ATOMICOPS_INTERNALS_TSAN_H_
11fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
12594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgnamespace v8 {
131e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgnamespace base {
14594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
15594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#ifndef TSAN_INTERFACE_ATOMIC_H
16594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org#define TSAN_INTERFACE_ATOMIC_H
17594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
18fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
19fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgextern "C" {
20fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgtypedef char  __tsan_atomic8;
21fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgtypedef short __tsan_atomic16;  // NOLINT
22fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgtypedef int   __tsan_atomic32;
23fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgtypedef long  __tsan_atomic64;  // NOLINT
24fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#if defined(__SIZEOF_INT128__) \
261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    || (__clang_major__ * 100 + __clang_minor__ >= 302)
271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgtypedef __int128 __tsan_atomic128;
281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define __TSAN_HAS_INT128 1
291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#else
301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgtypedef char     __tsan_atomic128;
311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#define __TSAN_HAS_INT128 0
321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org#endif
331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
34fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgtypedef enum {
351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  __tsan_memory_order_relaxed,
361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  __tsan_memory_order_consume,
371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  __tsan_memory_order_acquire,
381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  __tsan_memory_order_release,
391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  __tsan_memory_order_acq_rel,
401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  __tsan_memory_order_seq_cst,
41fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org} __tsan_memory_order;
42fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
43ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic8 __tsan_atomic8_load(const volatile __tsan_atomic8* a,
441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order mo);
45ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic16 __tsan_atomic16_load(const volatile __tsan_atomic16* a,
46fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_memory_order mo);
47ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic32 __tsan_atomic32_load(const volatile __tsan_atomic32* a,
48fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_memory_order mo);
49ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic64 __tsan_atomic64_load(const volatile __tsan_atomic64* a,
50fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_memory_order mo);
51ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic128 __tsan_atomic128_load(const volatile __tsan_atomic128* a,
52fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_memory_order mo);
53fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
54ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgvoid __tsan_atomic8_store(volatile __tsan_atomic8* a, __tsan_atomic8 v,
55fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_memory_order mo);
56ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgvoid __tsan_atomic16_store(volatile __tsan_atomic16* a, __tsan_atomic16 v,
57fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_memory_order mo);
58ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgvoid __tsan_atomic32_store(volatile __tsan_atomic32* a, __tsan_atomic32 v,
59fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_memory_order mo);
60ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgvoid __tsan_atomic64_store(volatile __tsan_atomic64* a, __tsan_atomic64 v,
61fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_memory_order mo);
62ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgvoid __tsan_atomic128_store(volatile __tsan_atomic128* a, __tsan_atomic128 v,
631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order mo);
641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
65ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic8 __tsan_atomic8_exchange(volatile __tsan_atomic8* a,
661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_atomic8 v, __tsan_memory_order mo);
67ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic16 __tsan_atomic16_exchange(volatile __tsan_atomic16* a,
681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_atomic16 v, __tsan_memory_order mo);
69ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic32 __tsan_atomic32_exchange(volatile __tsan_atomic32* a,
701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_atomic32 v, __tsan_memory_order mo);
71ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic64 __tsan_atomic64_exchange(volatile __tsan_atomic64* a,
721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_atomic64 v, __tsan_memory_order mo);
73ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic128 __tsan_atomic128_exchange(volatile __tsan_atomic128* a,
741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_atomic128 v, __tsan_memory_order mo);
75fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
76ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic8 __tsan_atomic8_fetch_add(volatile __tsan_atomic8* a,
77fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic8 v, __tsan_memory_order mo);
78ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic16 __tsan_atomic16_fetch_add(volatile __tsan_atomic16* a,
79fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic16 v, __tsan_memory_order mo);
80ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic32 __tsan_atomic32_fetch_add(volatile __tsan_atomic32* a,
81fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic32 v, __tsan_memory_order mo);
82ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic64 __tsan_atomic64_fetch_add(volatile __tsan_atomic64* a,
83fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic64 v, __tsan_memory_order mo);
84ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic128 __tsan_atomic128_fetch_add(volatile __tsan_atomic128* a,
851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_atomic128 v, __tsan_memory_order mo);
86fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
87ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic8 __tsan_atomic8_fetch_and(volatile __tsan_atomic8* a,
88fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic8 v, __tsan_memory_order mo);
89ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic16 __tsan_atomic16_fetch_and(volatile __tsan_atomic16* a,
90fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic16 v, __tsan_memory_order mo);
91ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic32 __tsan_atomic32_fetch_and(volatile __tsan_atomic32* a,
92fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic32 v, __tsan_memory_order mo);
93ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic64 __tsan_atomic64_fetch_and(volatile __tsan_atomic64* a,
94fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic64 v, __tsan_memory_order mo);
95ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic128 __tsan_atomic128_fetch_and(volatile __tsan_atomic128* a,
961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_atomic128 v, __tsan_memory_order mo);
97fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
98ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic8 __tsan_atomic8_fetch_or(volatile __tsan_atomic8* a,
99fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic8 v, __tsan_memory_order mo);
100ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic16 __tsan_atomic16_fetch_or(volatile __tsan_atomic16* a,
101fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic16 v, __tsan_memory_order mo);
102ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic32 __tsan_atomic32_fetch_or(volatile __tsan_atomic32* a,
103fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic32 v, __tsan_memory_order mo);
104ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic64 __tsan_atomic64_fetch_or(volatile __tsan_atomic64* a,
105fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic64 v, __tsan_memory_order mo);
106ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic128 __tsan_atomic128_fetch_or(volatile __tsan_atomic128* a,
1071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_atomic128 v, __tsan_memory_order mo);
108fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
109ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic8 __tsan_atomic8_fetch_xor(volatile __tsan_atomic8* a,
110fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic8 v, __tsan_memory_order mo);
111ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic16 __tsan_atomic16_fetch_xor(volatile __tsan_atomic16* a,
112fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic16 v, __tsan_memory_order mo);
113ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic32 __tsan_atomic32_fetch_xor(volatile __tsan_atomic32* a,
114fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic32 v, __tsan_memory_order mo);
115ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic64 __tsan_atomic64_fetch_xor(volatile __tsan_atomic64* a,
116fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic64 v, __tsan_memory_order mo);
117ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic128 __tsan_atomic128_fetch_xor(volatile __tsan_atomic128* a,
1181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_atomic128 v, __tsan_memory_order mo);
119fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
120ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic8 __tsan_atomic8_fetch_nand(volatile __tsan_atomic8* a,
121fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic8 v, __tsan_memory_order mo);
122ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic16 __tsan_atomic16_fetch_nand(volatile __tsan_atomic16* a,
123fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic16 v, __tsan_memory_order mo);
124ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic32 __tsan_atomic32_fetch_nand(volatile __tsan_atomic32* a,
125fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic32 v, __tsan_memory_order mo);
126ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic64 __tsan_atomic64_fetch_nand(volatile __tsan_atomic64* a,
127fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    __tsan_atomic64 v, __tsan_memory_order mo);
128ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org__tsan_atomic128 __tsan_atomic128_fetch_nand(volatile __tsan_atomic128* a,
129ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    __tsan_atomic128 v, __tsan_memory_order mo);
130fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
131ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgint __tsan_atomic8_compare_exchange_weak(volatile __tsan_atomic8* a,
132ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    __tsan_atomic8* c, __tsan_atomic8 v, __tsan_memory_order mo,
1331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order fail_mo);
134ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgint __tsan_atomic16_compare_exchange_weak(volatile __tsan_atomic16* a,
135ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    __tsan_atomic16* c, __tsan_atomic16 v, __tsan_memory_order mo,
1361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order fail_mo);
137ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgint __tsan_atomic32_compare_exchange_weak(volatile __tsan_atomic32* a,
138ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    __tsan_atomic32* c, __tsan_atomic32 v, __tsan_memory_order mo,
1391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order fail_mo);
140ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgint __tsan_atomic64_compare_exchange_weak(volatile __tsan_atomic64* a,
141ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    __tsan_atomic64* c, __tsan_atomic64 v, __tsan_memory_order mo,
1421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order fail_mo);
143ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgint __tsan_atomic128_compare_exchange_weak(volatile __tsan_atomic128* a,
144ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    __tsan_atomic128* c, __tsan_atomic128 v, __tsan_memory_order mo,
1451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order fail_mo);
1461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
147ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgint __tsan_atomic8_compare_exchange_strong(volatile __tsan_atomic8* a,
148ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    __tsan_atomic8* c, __tsan_atomic8 v, __tsan_memory_order mo,
1491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order fail_mo);
150ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgint __tsan_atomic16_compare_exchange_strong(volatile __tsan_atomic16* a,
151ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    __tsan_atomic16* c, __tsan_atomic16 v, __tsan_memory_order mo,
1521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order fail_mo);
153ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgint __tsan_atomic32_compare_exchange_strong(volatile __tsan_atomic32* a,
154ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    __tsan_atomic32* c, __tsan_atomic32 v, __tsan_memory_order mo,
1551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order fail_mo);
156ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgint __tsan_atomic64_compare_exchange_strong(volatile __tsan_atomic64* a,
157ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    __tsan_atomic64* c, __tsan_atomic64 v, __tsan_memory_order mo,
1581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order fail_mo);
159ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgint __tsan_atomic128_compare_exchange_strong(volatile __tsan_atomic128* a,
160ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    __tsan_atomic128* c, __tsan_atomic128 v, __tsan_memory_order mo,
1611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order fail_mo);
1621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
1631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org__tsan_atomic8 __tsan_atomic8_compare_exchange_val(
164ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    volatile __tsan_atomic8* a, __tsan_atomic8 c, __tsan_atomic8 v,
1651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order mo, __tsan_memory_order fail_mo);
1661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org__tsan_atomic16 __tsan_atomic16_compare_exchange_val(
167ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    volatile __tsan_atomic16* a, __tsan_atomic16 c, __tsan_atomic16 v,
1681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order mo, __tsan_memory_order fail_mo);
1691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org__tsan_atomic32 __tsan_atomic32_compare_exchange_val(
170ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    volatile __tsan_atomic32* a, __tsan_atomic32 c, __tsan_atomic32 v,
1711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order mo, __tsan_memory_order fail_mo);
1721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org__tsan_atomic64 __tsan_atomic64_compare_exchange_val(
173ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    volatile __tsan_atomic64* a, __tsan_atomic64 c, __tsan_atomic64 v,
1741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order mo, __tsan_memory_order fail_mo);
1751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org__tsan_atomic128 __tsan_atomic128_compare_exchange_val(
176ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    volatile __tsan_atomic128* a, __tsan_atomic128 c, __tsan_atomic128 v,
1771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    __tsan_memory_order mo, __tsan_memory_order fail_mo);
178fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
179fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgvoid __tsan_atomic_thread_fence(__tsan_memory_order mo);
1801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid __tsan_atomic_signal_fence(__tsan_memory_order mo);
181fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}  // extern "C"
182fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
183fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org#endif  // #ifndef TSAN_INTERFACE_ATOMIC_H
184fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
185ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
186fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                         Atomic32 old_value,
187fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                         Atomic32 new_value) {
188fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Atomic32 cmp = old_value;
189fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value,
1901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_relaxed, __tsan_memory_order_relaxed);
191fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return cmp;
192fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
193fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
194ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
195fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                         Atomic32 new_value) {
196fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return __tsan_atomic32_exchange(ptr, new_value,
1971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_relaxed);
198fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
199fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
200ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic32 Acquire_AtomicExchange(volatile Atomic32* ptr,
201fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                       Atomic32 new_value) {
202fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return __tsan_atomic32_exchange(ptr, new_value,
2031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_acquire);
204fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
205fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
206ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic32 Release_AtomicExchange(volatile Atomic32* ptr,
207fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                       Atomic32 new_value) {
208fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return __tsan_atomic32_exchange(ptr, new_value,
2091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_release);
210fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
211fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
212ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
213fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                          Atomic32 increment) {
214fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return increment + __tsan_atomic32_fetch_add(ptr, increment,
2151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_relaxed);
216fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
217fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
218ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
219fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                        Atomic32 increment) {
220fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return increment + __tsan_atomic32_fetch_add(ptr, increment,
2211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_acq_rel);
222fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
223fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
224ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
225fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                       Atomic32 old_value,
226fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                       Atomic32 new_value) {
227fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Atomic32 cmp = old_value;
228fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value,
2291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_acquire, __tsan_memory_order_acquire);
230fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return cmp;
231fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
232fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
233ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
234fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                       Atomic32 old_value,
235fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                       Atomic32 new_value) {
236fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Atomic32 cmp = old_value;
237fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value,
2381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_release, __tsan_memory_order_relaxed);
239fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return cmp;
240fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
241fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
2425b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orginline void NoBarrier_Store(volatile Atomic8* ptr, Atomic8 value) {
2435b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  __tsan_atomic8_store(ptr, value, __tsan_memory_order_relaxed);
2445b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org}
2455b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
246ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
247fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic32_store(ptr, value, __tsan_memory_order_relaxed);
248fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
249fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
250ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
251fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic32_store(ptr, value, __tsan_memory_order_relaxed);
252fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
253fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
254fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
255ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
256fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic32_store(ptr, value, __tsan_memory_order_release);
257fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
258fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
2595b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.orginline Atomic8 NoBarrier_Load(volatile const Atomic8* ptr) {
2605b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org  return __tsan_atomic8_load(ptr, __tsan_memory_order_relaxed);
2615b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org}
2625b080567cf135f6dbaf23973ba6b6fa1d6af83b3machenbach@chromium.org
263ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
264fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return __tsan_atomic32_load(ptr, __tsan_memory_order_relaxed);
265fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
266fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
267ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
268fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return __tsan_atomic32_load(ptr, __tsan_memory_order_acquire);
269fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
270fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
271ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic32 Release_Load(volatile const Atomic32* ptr) {
272fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
273fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return __tsan_atomic32_load(ptr, __tsan_memory_order_relaxed);
274fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
275fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
276ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
277fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                         Atomic64 old_value,
278fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                         Atomic64 new_value) {
279fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Atomic64 cmp = old_value;
280fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value,
2811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_relaxed, __tsan_memory_order_relaxed);
282fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return cmp;
283fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
284fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
285ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
286fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                         Atomic64 new_value) {
287fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_relaxed);
288fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
289fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
290ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic64 Acquire_AtomicExchange(volatile Atomic64* ptr,
291fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                       Atomic64 new_value) {
292fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_acquire);
293fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
294fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
295ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic64 Release_AtomicExchange(volatile Atomic64* ptr,
296fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                       Atomic64 new_value) {
297fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_release);
298fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
299fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
300ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
301fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                          Atomic64 increment) {
302fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return increment + __tsan_atomic64_fetch_add(ptr, increment,
3031510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_relaxed);
304fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
305fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
306ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
307fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                        Atomic64 increment) {
308fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return increment + __tsan_atomic64_fetch_add(ptr, increment,
3091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_acq_rel);
310fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
311fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
312ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
313fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic64_store(ptr, value, __tsan_memory_order_relaxed);
314fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
315fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
316ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
317fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic64_store(ptr, value, __tsan_memory_order_relaxed);
318fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
319fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
320fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
321ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
322fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic64_store(ptr, value, __tsan_memory_order_release);
323fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
324fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
325ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
326fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return __tsan_atomic64_load(ptr, __tsan_memory_order_relaxed);
327fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
328fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
329ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
330fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return __tsan_atomic64_load(ptr, __tsan_memory_order_acquire);
331fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
332fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
333ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic64 Release_Load(volatile const Atomic64* ptr) {
334fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
335fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return __tsan_atomic64_load(ptr, __tsan_memory_order_relaxed);
336fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
337fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
338ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
339fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                       Atomic64 old_value,
340fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                       Atomic64 new_value) {
341fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Atomic64 cmp = old_value;
342fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value,
3431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_acquire, __tsan_memory_order_acquire);
344fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return cmp;
345fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
346fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
347ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
348fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                       Atomic64 old_value,
349fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                       Atomic64 new_value) {
350fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Atomic64 cmp = old_value;
351fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value,
3521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      __tsan_memory_order_release, __tsan_memory_order_relaxed);
353fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return cmp;
354fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
355fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
356fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orginline void MemoryBarrier() {
357fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
358fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
359fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
3601e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}  // namespace base
361fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}  // namespace v8
362fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
3631e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#endif  // V8_BASE_ATOMICOPS_INTERNALS_TSAN_H_
364