1 //===-- tsan_interface_atomic.h ---------------------------------*- C++ -*-===//
2 //
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
5 //
6 //===----------------------------------------------------------------------===//
7 //
8 // This file is a part of ThreadSanitizer (TSan), a race detector.
9 //
10 // Public interface header for TSan atomics.
11 //===----------------------------------------------------------------------===//
12 #ifndef TSAN_INTERFACE_ATOMIC_H
13 #define TSAN_INTERFACE_ATOMIC_H
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 typedef char     __tsan_atomic8;
20 typedef short    __tsan_atomic16;  // NOLINT
21 typedef int      __tsan_atomic32;
22 typedef long     __tsan_atomic64;  // NOLINT
23 #if defined(__SIZEOF_INT128__) \
24     || (__clang_major__ * 100 + __clang_minor__ >= 302)
25 __extension__ typedef __int128 __tsan_atomic128;
26 # define __TSAN_HAS_INT128 1
27 #else
28 # define __TSAN_HAS_INT128 0
29 #endif
30 
31 // Part of ABI, do not change.
32 // http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/atomic?view=markup
33 typedef enum {
34   __tsan_memory_order_relaxed,
35   __tsan_memory_order_consume,
36   __tsan_memory_order_acquire,
37   __tsan_memory_order_release,
38   __tsan_memory_order_acq_rel,
39   __tsan_memory_order_seq_cst
40 } __tsan_memory_order;
41 
42 __tsan_atomic8 __tsan_atomic8_load(const volatile __tsan_atomic8 *a,
43     __tsan_memory_order mo);
44 __tsan_atomic16 __tsan_atomic16_load(const volatile __tsan_atomic16 *a,
45     __tsan_memory_order mo);
46 __tsan_atomic32 __tsan_atomic32_load(const volatile __tsan_atomic32 *a,
47     __tsan_memory_order mo);
48 __tsan_atomic64 __tsan_atomic64_load(const volatile __tsan_atomic64 *a,
49     __tsan_memory_order mo);
50 #if __TSAN_HAS_INT128
51 __tsan_atomic128 __tsan_atomic128_load(const volatile __tsan_atomic128 *a,
52     __tsan_memory_order mo);
53 #endif
54 
55 void __tsan_atomic8_store(volatile __tsan_atomic8 *a, __tsan_atomic8 v,
56     __tsan_memory_order mo);
57 void __tsan_atomic16_store(volatile __tsan_atomic16 *a, __tsan_atomic16 v,
58     __tsan_memory_order mo);
59 void __tsan_atomic32_store(volatile __tsan_atomic32 *a, __tsan_atomic32 v,
60     __tsan_memory_order mo);
61 void __tsan_atomic64_store(volatile __tsan_atomic64 *a, __tsan_atomic64 v,
62     __tsan_memory_order mo);
63 #if __TSAN_HAS_INT128
64 void __tsan_atomic128_store(volatile __tsan_atomic128 *a, __tsan_atomic128 v,
65     __tsan_memory_order mo);
66 #endif
67 
68 __tsan_atomic8 __tsan_atomic8_exchange(volatile __tsan_atomic8 *a,
69     __tsan_atomic8 v, __tsan_memory_order mo);
70 __tsan_atomic16 __tsan_atomic16_exchange(volatile __tsan_atomic16 *a,
71     __tsan_atomic16 v, __tsan_memory_order mo);
72 __tsan_atomic32 __tsan_atomic32_exchange(volatile __tsan_atomic32 *a,
73     __tsan_atomic32 v, __tsan_memory_order mo);
74 __tsan_atomic64 __tsan_atomic64_exchange(volatile __tsan_atomic64 *a,
75     __tsan_atomic64 v, __tsan_memory_order mo);
76 #if __TSAN_HAS_INT128
77 __tsan_atomic128 __tsan_atomic128_exchange(volatile __tsan_atomic128 *a,
78     __tsan_atomic128 v, __tsan_memory_order mo);
79 #endif
80 
81 __tsan_atomic8 __tsan_atomic8_fetch_add(volatile __tsan_atomic8 *a,
82     __tsan_atomic8 v, __tsan_memory_order mo);
83 __tsan_atomic16 __tsan_atomic16_fetch_add(volatile __tsan_atomic16 *a,
84     __tsan_atomic16 v, __tsan_memory_order mo);
85 __tsan_atomic32 __tsan_atomic32_fetch_add(volatile __tsan_atomic32 *a,
86     __tsan_atomic32 v, __tsan_memory_order mo);
87 __tsan_atomic64 __tsan_atomic64_fetch_add(volatile __tsan_atomic64 *a,
88     __tsan_atomic64 v, __tsan_memory_order mo);
89 #if __TSAN_HAS_INT128
90 __tsan_atomic128 __tsan_atomic128_fetch_add(volatile __tsan_atomic128 *a,
91     __tsan_atomic128 v, __tsan_memory_order mo);
92 #endif
93 
94 __tsan_atomic8 __tsan_atomic8_fetch_sub(volatile __tsan_atomic8 *a,
95     __tsan_atomic8 v, __tsan_memory_order mo);
96 __tsan_atomic16 __tsan_atomic16_fetch_sub(volatile __tsan_atomic16 *a,
97     __tsan_atomic16 v, __tsan_memory_order mo);
98 __tsan_atomic32 __tsan_atomic32_fetch_sub(volatile __tsan_atomic32 *a,
99     __tsan_atomic32 v, __tsan_memory_order mo);
100 __tsan_atomic64 __tsan_atomic64_fetch_sub(volatile __tsan_atomic64 *a,
101     __tsan_atomic64 v, __tsan_memory_order mo);
102 #if __TSAN_HAS_INT128
103 __tsan_atomic128 __tsan_atomic128_fetch_sub(volatile __tsan_atomic128 *a,
104     __tsan_atomic128 v, __tsan_memory_order mo);
105 #endif
106 
107 __tsan_atomic8 __tsan_atomic8_fetch_and(volatile __tsan_atomic8 *a,
108     __tsan_atomic8 v, __tsan_memory_order mo);
109 __tsan_atomic16 __tsan_atomic16_fetch_and(volatile __tsan_atomic16 *a,
110     __tsan_atomic16 v, __tsan_memory_order mo);
111 __tsan_atomic32 __tsan_atomic32_fetch_and(volatile __tsan_atomic32 *a,
112     __tsan_atomic32 v, __tsan_memory_order mo);
113 __tsan_atomic64 __tsan_atomic64_fetch_and(volatile __tsan_atomic64 *a,
114     __tsan_atomic64 v, __tsan_memory_order mo);
115 #if __TSAN_HAS_INT128
116 __tsan_atomic128 __tsan_atomic128_fetch_and(volatile __tsan_atomic128 *a,
117     __tsan_atomic128 v, __tsan_memory_order mo);
118 #endif
119 
120 __tsan_atomic8 __tsan_atomic8_fetch_or(volatile __tsan_atomic8 *a,
121     __tsan_atomic8 v, __tsan_memory_order mo);
122 __tsan_atomic16 __tsan_atomic16_fetch_or(volatile __tsan_atomic16 *a,
123     __tsan_atomic16 v, __tsan_memory_order mo);
124 __tsan_atomic32 __tsan_atomic32_fetch_or(volatile __tsan_atomic32 *a,
125     __tsan_atomic32 v, __tsan_memory_order mo);
126 __tsan_atomic64 __tsan_atomic64_fetch_or(volatile __tsan_atomic64 *a,
127     __tsan_atomic64 v, __tsan_memory_order mo);
128 #if __TSAN_HAS_INT128
129 __tsan_atomic128 __tsan_atomic128_fetch_or(volatile __tsan_atomic128 *a,
130     __tsan_atomic128 v, __tsan_memory_order mo);
131 #endif
132 
133 __tsan_atomic8 __tsan_atomic8_fetch_xor(volatile __tsan_atomic8 *a,
134     __tsan_atomic8 v, __tsan_memory_order mo);
135 __tsan_atomic16 __tsan_atomic16_fetch_xor(volatile __tsan_atomic16 *a,
136     __tsan_atomic16 v, __tsan_memory_order mo);
137 __tsan_atomic32 __tsan_atomic32_fetch_xor(volatile __tsan_atomic32 *a,
138     __tsan_atomic32 v, __tsan_memory_order mo);
139 __tsan_atomic64 __tsan_atomic64_fetch_xor(volatile __tsan_atomic64 *a,
140     __tsan_atomic64 v, __tsan_memory_order mo);
141 #if __TSAN_HAS_INT128
142 __tsan_atomic128 __tsan_atomic128_fetch_xor(volatile __tsan_atomic128 *a,
143     __tsan_atomic128 v, __tsan_memory_order mo);
144 #endif
145 
146 __tsan_atomic8 __tsan_atomic8_fetch_nand(volatile __tsan_atomic8 *a,
147     __tsan_atomic8 v, __tsan_memory_order mo);
148 __tsan_atomic16 __tsan_atomic16_fetch_nand(volatile __tsan_atomic16 *a,
149     __tsan_atomic16 v, __tsan_memory_order mo);
150 __tsan_atomic32 __tsan_atomic32_fetch_nand(volatile __tsan_atomic32 *a,
151     __tsan_atomic32 v, __tsan_memory_order mo);
152 __tsan_atomic64 __tsan_atomic64_fetch_nand(volatile __tsan_atomic64 *a,
153     __tsan_atomic64 v, __tsan_memory_order mo);
154 #if __TSAN_HAS_INT128
155 __tsan_atomic128 __tsan_atomic128_fetch_nand(volatile __tsan_atomic128 *a,
156     __tsan_atomic128 v, __tsan_memory_order mo);
157 #endif
158 
159 int __tsan_atomic8_compare_exchange_weak(volatile __tsan_atomic8 *a,
160     __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo,
161     __tsan_memory_order fail_mo);
162 int __tsan_atomic16_compare_exchange_weak(volatile __tsan_atomic16 *a,
163     __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo,
164     __tsan_memory_order fail_mo);
165 int __tsan_atomic32_compare_exchange_weak(volatile __tsan_atomic32 *a,
166     __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo,
167     __tsan_memory_order fail_mo);
168 int __tsan_atomic64_compare_exchange_weak(volatile __tsan_atomic64 *a,
169     __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo,
170     __tsan_memory_order fail_mo);
171 #if __TSAN_HAS_INT128
172 int __tsan_atomic128_compare_exchange_weak(volatile __tsan_atomic128 *a,
173     __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo,
174     __tsan_memory_order fail_mo);
175 #endif
176 
177 int __tsan_atomic8_compare_exchange_strong(volatile __tsan_atomic8 *a,
178     __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo,
179     __tsan_memory_order fail_mo);
180 int __tsan_atomic16_compare_exchange_strong(volatile __tsan_atomic16 *a,
181     __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo,
182     __tsan_memory_order fail_mo);
183 int __tsan_atomic32_compare_exchange_strong(volatile __tsan_atomic32 *a,
184     __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo,
185     __tsan_memory_order fail_mo);
186 int __tsan_atomic64_compare_exchange_strong(volatile __tsan_atomic64 *a,
187     __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo,
188     __tsan_memory_order fail_mo);
189 #if __TSAN_HAS_INT128
190 int __tsan_atomic128_compare_exchange_strong(volatile __tsan_atomic128 *a,
191     __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo,
192     __tsan_memory_order fail_mo);
193 #endif
194 
195 __tsan_atomic8 __tsan_atomic8_compare_exchange_val(
196     volatile __tsan_atomic8 *a, __tsan_atomic8 c, __tsan_atomic8 v,
197     __tsan_memory_order mo, __tsan_memory_order fail_mo);
198 __tsan_atomic16 __tsan_atomic16_compare_exchange_val(
199     volatile __tsan_atomic16 *a, __tsan_atomic16 c, __tsan_atomic16 v,
200     __tsan_memory_order mo, __tsan_memory_order fail_mo);
201 __tsan_atomic32 __tsan_atomic32_compare_exchange_val(
202     volatile __tsan_atomic32 *a, __tsan_atomic32 c, __tsan_atomic32 v,
203     __tsan_memory_order mo, __tsan_memory_order fail_mo);
204 __tsan_atomic64 __tsan_atomic64_compare_exchange_val(
205     volatile __tsan_atomic64 *a, __tsan_atomic64 c, __tsan_atomic64 v,
206     __tsan_memory_order mo, __tsan_memory_order fail_mo);
207 #if __TSAN_HAS_INT128
208 __tsan_atomic128 __tsan_atomic128_compare_exchange_val(
209     volatile __tsan_atomic128 *a, __tsan_atomic128 c, __tsan_atomic128 v,
210     __tsan_memory_order mo, __tsan_memory_order fail_mo);
211 #endif
212 
213 void __tsan_atomic_thread_fence(__tsan_memory_order mo);
214 void __tsan_atomic_signal_fence(__tsan_memory_order mo);
215 
216 #ifdef __cplusplus
217 }  // extern "C"
218 #endif
219 
220 #endif  // TSAN_INTERFACE_ATOMIC_H
221