1276789Sdim//===-- tsan_interface_atomic.h ---------------------------------*- C++ -*-===//
2276789Sdim//
3276789Sdim//                     The LLVM Compiler Infrastructure
4276789Sdim//
5276789Sdim// This file is distributed under the University of Illinois Open Source
6276789Sdim// License. See LICENSE.TXT for details.
7276789Sdim//
8276789Sdim//===----------------------------------------------------------------------===//
9276789Sdim//
10276789Sdim// This file is a part of ThreadSanitizer (TSan), a race detector.
11276789Sdim//
12276789Sdim// Public interface header for TSan atomics.
13276789Sdim//===----------------------------------------------------------------------===//
14276789Sdim#ifndef TSAN_INTERFACE_ATOMIC_H
15276789Sdim#define TSAN_INTERFACE_ATOMIC_H
16276789Sdim
17276789Sdim#ifdef __cplusplus
18276789Sdimextern "C" {
19276789Sdim#endif
20276789Sdim
21276789Sdimtypedef char     __tsan_atomic8;
22276789Sdimtypedef short    __tsan_atomic16;  // NOLINT
23276789Sdimtypedef int      __tsan_atomic32;
24276789Sdimtypedef long     __tsan_atomic64;  // NOLINT
25276789Sdim#if defined(__SIZEOF_INT128__) \
26276789Sdim    || (__clang_major__ * 100 + __clang_minor__ >= 302)
27276789Sdim__extension__ typedef __int128 __tsan_atomic128;
28276789Sdim# define __TSAN_HAS_INT128 1
29276789Sdim#else
30276789Sdim# define __TSAN_HAS_INT128 0
31276789Sdim#endif
32276789Sdim
33276789Sdim// Part of ABI, do not change.
34276789Sdim// http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/atomic?view=markup
35276789Sdimtypedef enum {
36276789Sdim  __tsan_memory_order_relaxed,
37276789Sdim  __tsan_memory_order_consume,
38276789Sdim  __tsan_memory_order_acquire,
39276789Sdim  __tsan_memory_order_release,
40276789Sdim  __tsan_memory_order_acq_rel,
41276789Sdim  __tsan_memory_order_seq_cst
42276789Sdim} __tsan_memory_order;
43276789Sdim
44276789Sdim__tsan_atomic8 __tsan_atomic8_load(const volatile __tsan_atomic8 *a,
45276789Sdim    __tsan_memory_order mo);
46276789Sdim__tsan_atomic16 __tsan_atomic16_load(const volatile __tsan_atomic16 *a,
47276789Sdim    __tsan_memory_order mo);
48276789Sdim__tsan_atomic32 __tsan_atomic32_load(const volatile __tsan_atomic32 *a,
49276789Sdim    __tsan_memory_order mo);
50276789Sdim__tsan_atomic64 __tsan_atomic64_load(const volatile __tsan_atomic64 *a,
51276789Sdim    __tsan_memory_order mo);
52276789Sdim#if __TSAN_HAS_INT128
53276789Sdim__tsan_atomic128 __tsan_atomic128_load(const volatile __tsan_atomic128 *a,
54276789Sdim    __tsan_memory_order mo);
55276789Sdim#endif
56276789Sdim
57276789Sdimvoid __tsan_atomic8_store(volatile __tsan_atomic8 *a, __tsan_atomic8 v,
58276789Sdim    __tsan_memory_order mo);
59276789Sdimvoid __tsan_atomic16_store(volatile __tsan_atomic16 *a, __tsan_atomic16 v,
60276789Sdim    __tsan_memory_order mo);
61276789Sdimvoid __tsan_atomic32_store(volatile __tsan_atomic32 *a, __tsan_atomic32 v,
62276789Sdim    __tsan_memory_order mo);
63276789Sdimvoid __tsan_atomic64_store(volatile __tsan_atomic64 *a, __tsan_atomic64 v,
64276789Sdim    __tsan_memory_order mo);
65276789Sdim#if __TSAN_HAS_INT128
66276789Sdimvoid __tsan_atomic128_store(volatile __tsan_atomic128 *a, __tsan_atomic128 v,
67276789Sdim    __tsan_memory_order mo);
68276789Sdim#endif
69276789Sdim
70276789Sdim__tsan_atomic8 __tsan_atomic8_exchange(volatile __tsan_atomic8 *a,
71276789Sdim    __tsan_atomic8 v, __tsan_memory_order mo);
72276789Sdim__tsan_atomic16 __tsan_atomic16_exchange(volatile __tsan_atomic16 *a,
73276789Sdim    __tsan_atomic16 v, __tsan_memory_order mo);
74276789Sdim__tsan_atomic32 __tsan_atomic32_exchange(volatile __tsan_atomic32 *a,
75276789Sdim    __tsan_atomic32 v, __tsan_memory_order mo);
76276789Sdim__tsan_atomic64 __tsan_atomic64_exchange(volatile __tsan_atomic64 *a,
77276789Sdim    __tsan_atomic64 v, __tsan_memory_order mo);
78276789Sdim#if __TSAN_HAS_INT128
79276789Sdim__tsan_atomic128 __tsan_atomic128_exchange(volatile __tsan_atomic128 *a,
80276789Sdim    __tsan_atomic128 v, __tsan_memory_order mo);
81276789Sdim#endif
82276789Sdim
83276789Sdim__tsan_atomic8 __tsan_atomic8_fetch_add(volatile __tsan_atomic8 *a,
84276789Sdim    __tsan_atomic8 v, __tsan_memory_order mo);
85276789Sdim__tsan_atomic16 __tsan_atomic16_fetch_add(volatile __tsan_atomic16 *a,
86276789Sdim    __tsan_atomic16 v, __tsan_memory_order mo);
87276789Sdim__tsan_atomic32 __tsan_atomic32_fetch_add(volatile __tsan_atomic32 *a,
88276789Sdim    __tsan_atomic32 v, __tsan_memory_order mo);
89276789Sdim__tsan_atomic64 __tsan_atomic64_fetch_add(volatile __tsan_atomic64 *a,
90276789Sdim    __tsan_atomic64 v, __tsan_memory_order mo);
91276789Sdim#if __TSAN_HAS_INT128
92276789Sdim__tsan_atomic128 __tsan_atomic128_fetch_add(volatile __tsan_atomic128 *a,
93276789Sdim    __tsan_atomic128 v, __tsan_memory_order mo);
94276789Sdim#endif
95276789Sdim
96276789Sdim__tsan_atomic8 __tsan_atomic8_fetch_sub(volatile __tsan_atomic8 *a,
97276789Sdim    __tsan_atomic8 v, __tsan_memory_order mo);
98276789Sdim__tsan_atomic16 __tsan_atomic16_fetch_sub(volatile __tsan_atomic16 *a,
99276789Sdim    __tsan_atomic16 v, __tsan_memory_order mo);
100276789Sdim__tsan_atomic32 __tsan_atomic32_fetch_sub(volatile __tsan_atomic32 *a,
101276789Sdim    __tsan_atomic32 v, __tsan_memory_order mo);
102276789Sdim__tsan_atomic64 __tsan_atomic64_fetch_sub(volatile __tsan_atomic64 *a,
103276789Sdim    __tsan_atomic64 v, __tsan_memory_order mo);
104276789Sdim#if __TSAN_HAS_INT128
105276789Sdim__tsan_atomic128 __tsan_atomic128_fetch_sub(volatile __tsan_atomic128 *a,
106276789Sdim    __tsan_atomic128 v, __tsan_memory_order mo);
107276789Sdim#endif
108276789Sdim
109276789Sdim__tsan_atomic8 __tsan_atomic8_fetch_and(volatile __tsan_atomic8 *a,
110276789Sdim    __tsan_atomic8 v, __tsan_memory_order mo);
111276789Sdim__tsan_atomic16 __tsan_atomic16_fetch_and(volatile __tsan_atomic16 *a,
112276789Sdim    __tsan_atomic16 v, __tsan_memory_order mo);
113276789Sdim__tsan_atomic32 __tsan_atomic32_fetch_and(volatile __tsan_atomic32 *a,
114276789Sdim    __tsan_atomic32 v, __tsan_memory_order mo);
115276789Sdim__tsan_atomic64 __tsan_atomic64_fetch_and(volatile __tsan_atomic64 *a,
116276789Sdim    __tsan_atomic64 v, __tsan_memory_order mo);
117276789Sdim#if __TSAN_HAS_INT128
118276789Sdim__tsan_atomic128 __tsan_atomic128_fetch_and(volatile __tsan_atomic128 *a,
119276789Sdim    __tsan_atomic128 v, __tsan_memory_order mo);
120276789Sdim#endif
121276789Sdim
122276789Sdim__tsan_atomic8 __tsan_atomic8_fetch_or(volatile __tsan_atomic8 *a,
123276789Sdim    __tsan_atomic8 v, __tsan_memory_order mo);
124276789Sdim__tsan_atomic16 __tsan_atomic16_fetch_or(volatile __tsan_atomic16 *a,
125276789Sdim    __tsan_atomic16 v, __tsan_memory_order mo);
126276789Sdim__tsan_atomic32 __tsan_atomic32_fetch_or(volatile __tsan_atomic32 *a,
127276789Sdim    __tsan_atomic32 v, __tsan_memory_order mo);
128276789Sdim__tsan_atomic64 __tsan_atomic64_fetch_or(volatile __tsan_atomic64 *a,
129276789Sdim    __tsan_atomic64 v, __tsan_memory_order mo);
130276789Sdim#if __TSAN_HAS_INT128
131276789Sdim__tsan_atomic128 __tsan_atomic128_fetch_or(volatile __tsan_atomic128 *a,
132276789Sdim    __tsan_atomic128 v, __tsan_memory_order mo);
133276789Sdim#endif
134276789Sdim
135276789Sdim__tsan_atomic8 __tsan_atomic8_fetch_xor(volatile __tsan_atomic8 *a,
136276789Sdim    __tsan_atomic8 v, __tsan_memory_order mo);
137276789Sdim__tsan_atomic16 __tsan_atomic16_fetch_xor(volatile __tsan_atomic16 *a,
138276789Sdim    __tsan_atomic16 v, __tsan_memory_order mo);
139276789Sdim__tsan_atomic32 __tsan_atomic32_fetch_xor(volatile __tsan_atomic32 *a,
140276789Sdim    __tsan_atomic32 v, __tsan_memory_order mo);
141276789Sdim__tsan_atomic64 __tsan_atomic64_fetch_xor(volatile __tsan_atomic64 *a,
142276789Sdim    __tsan_atomic64 v, __tsan_memory_order mo);
143276789Sdim#if __TSAN_HAS_INT128
144276789Sdim__tsan_atomic128 __tsan_atomic128_fetch_xor(volatile __tsan_atomic128 *a,
145276789Sdim    __tsan_atomic128 v, __tsan_memory_order mo);
146276789Sdim#endif
147276789Sdim
148276789Sdim__tsan_atomic8 __tsan_atomic8_fetch_nand(volatile __tsan_atomic8 *a,
149276789Sdim    __tsan_atomic8 v, __tsan_memory_order mo);
150276789Sdim__tsan_atomic16 __tsan_atomic16_fetch_nand(volatile __tsan_atomic16 *a,
151276789Sdim    __tsan_atomic16 v, __tsan_memory_order mo);
152276789Sdim__tsan_atomic32 __tsan_atomic32_fetch_nand(volatile __tsan_atomic32 *a,
153276789Sdim    __tsan_atomic32 v, __tsan_memory_order mo);
154276789Sdim__tsan_atomic64 __tsan_atomic64_fetch_nand(volatile __tsan_atomic64 *a,
155276789Sdim    __tsan_atomic64 v, __tsan_memory_order mo);
156276789Sdim#if __TSAN_HAS_INT128
157276789Sdim__tsan_atomic128 __tsan_atomic128_fetch_nand(volatile __tsan_atomic128 *a,
158276789Sdim    __tsan_atomic128 v, __tsan_memory_order mo);
159276789Sdim#endif
160276789Sdim
161276789Sdimint __tsan_atomic8_compare_exchange_weak(volatile __tsan_atomic8 *a,
162276789Sdim    __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo,
163276789Sdim    __tsan_memory_order fail_mo);
164276789Sdimint __tsan_atomic16_compare_exchange_weak(volatile __tsan_atomic16 *a,
165276789Sdim    __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo,
166276789Sdim    __tsan_memory_order fail_mo);
167276789Sdimint __tsan_atomic32_compare_exchange_weak(volatile __tsan_atomic32 *a,
168276789Sdim    __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo,
169276789Sdim    __tsan_memory_order fail_mo);
170276789Sdimint __tsan_atomic64_compare_exchange_weak(volatile __tsan_atomic64 *a,
171276789Sdim    __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo,
172276789Sdim    __tsan_memory_order fail_mo);
173276789Sdim#if __TSAN_HAS_INT128
174276789Sdimint __tsan_atomic128_compare_exchange_weak(volatile __tsan_atomic128 *a,
175276789Sdim    __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo,
176276789Sdim    __tsan_memory_order fail_mo);
177276789Sdim#endif
178276789Sdim
179276789Sdimint __tsan_atomic8_compare_exchange_strong(volatile __tsan_atomic8 *a,
180276789Sdim    __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo,
181276789Sdim    __tsan_memory_order fail_mo);
182276789Sdimint __tsan_atomic16_compare_exchange_strong(volatile __tsan_atomic16 *a,
183276789Sdim    __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo,
184276789Sdim    __tsan_memory_order fail_mo);
185276789Sdimint __tsan_atomic32_compare_exchange_strong(volatile __tsan_atomic32 *a,
186276789Sdim    __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo,
187276789Sdim    __tsan_memory_order fail_mo);
188276789Sdimint __tsan_atomic64_compare_exchange_strong(volatile __tsan_atomic64 *a,
189276789Sdim    __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo,
190276789Sdim    __tsan_memory_order fail_mo);
191276789Sdim#if __TSAN_HAS_INT128
192276789Sdimint __tsan_atomic128_compare_exchange_strong(volatile __tsan_atomic128 *a,
193276789Sdim    __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo,
194276789Sdim    __tsan_memory_order fail_mo);
195276789Sdim#endif
196276789Sdim
197276789Sdim__tsan_atomic8 __tsan_atomic8_compare_exchange_val(
198276789Sdim    volatile __tsan_atomic8 *a, __tsan_atomic8 c, __tsan_atomic8 v,
199276789Sdim    __tsan_memory_order mo, __tsan_memory_order fail_mo);
200276789Sdim__tsan_atomic16 __tsan_atomic16_compare_exchange_val(
201276789Sdim    volatile __tsan_atomic16 *a, __tsan_atomic16 c, __tsan_atomic16 v,
202276789Sdim    __tsan_memory_order mo, __tsan_memory_order fail_mo);
203276789Sdim__tsan_atomic32 __tsan_atomic32_compare_exchange_val(
204276789Sdim    volatile __tsan_atomic32 *a, __tsan_atomic32 c, __tsan_atomic32 v,
205276789Sdim    __tsan_memory_order mo, __tsan_memory_order fail_mo);
206276789Sdim__tsan_atomic64 __tsan_atomic64_compare_exchange_val(
207276789Sdim    volatile __tsan_atomic64 *a, __tsan_atomic64 c, __tsan_atomic64 v,
208276789Sdim    __tsan_memory_order mo, __tsan_memory_order fail_mo);
209276789Sdim#if __TSAN_HAS_INT128
210276789Sdim__tsan_atomic128 __tsan_atomic128_compare_exchange_val(
211276789Sdim    volatile __tsan_atomic128 *a, __tsan_atomic128 c, __tsan_atomic128 v,
212276789Sdim    __tsan_memory_order mo, __tsan_memory_order fail_mo);
213276789Sdim#endif
214276789Sdim
215276789Sdimvoid __tsan_atomic_thread_fence(__tsan_memory_order mo);
216276789Sdimvoid __tsan_atomic_signal_fence(__tsan_memory_order mo);
217276789Sdim
218276789Sdim#ifdef __cplusplus
219276789Sdim}  // extern "C"
220276789Sdim#endif
221276789Sdim
222276789Sdim#endif  // TSAN_INTERFACE_ATOMIC_H
223