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