xref: /llvm-project/compiler-rt/include/sanitizer/tsan_interface_atomic.h (revision 17d956588a2cc508acf98574f913eaef6d0e1af3)
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, int mo);
47 __tsan_atomic16 SANITIZER_CDECL
48 __tsan_atomic16_load(const volatile __tsan_atomic16 *a, int mo);
49 __tsan_atomic32 SANITIZER_CDECL
50 __tsan_atomic32_load(const volatile __tsan_atomic32 *a, int mo);
51 __tsan_atomic64 SANITIZER_CDECL
52 __tsan_atomic64_load(const volatile __tsan_atomic64 *a, int mo);
53 #if __TSAN_HAS_INT128
54 __tsan_atomic128 SANITIZER_CDECL
55 __tsan_atomic128_load(const volatile __tsan_atomic128 *a, int mo);
56 #endif
57 
58 void SANITIZER_CDECL __tsan_atomic8_store(volatile __tsan_atomic8 *a,
59                                           __tsan_atomic8 v, int mo);
60 void SANITIZER_CDECL __tsan_atomic16_store(volatile __tsan_atomic16 *a,
61                                            __tsan_atomic16 v, int mo);
62 void SANITIZER_CDECL __tsan_atomic32_store(volatile __tsan_atomic32 *a,
63                                            __tsan_atomic32 v, int mo);
64 void SANITIZER_CDECL __tsan_atomic64_store(volatile __tsan_atomic64 *a,
65                                            __tsan_atomic64 v, int mo);
66 #if __TSAN_HAS_INT128
67 void SANITIZER_CDECL __tsan_atomic128_store(volatile __tsan_atomic128 *a,
68                                             __tsan_atomic128 v, int mo);
69 #endif
70 
71 __tsan_atomic8 SANITIZER_CDECL
72 __tsan_atomic8_exchange(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);
73 __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_exchange(
74     volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);
75 __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_exchange(
76     volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);
77 __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_exchange(
78     volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);
79 #if __TSAN_HAS_INT128
80 __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_exchange(
81     volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);
82 #endif
83 
84 __tsan_atomic8 SANITIZER_CDECL
85 __tsan_atomic8_fetch_add(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);
86 __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_add(
87     volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);
88 __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_add(
89     volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);
90 __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_add(
91     volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);
92 #if __TSAN_HAS_INT128
93 __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_add(
94     volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);
95 #endif
96 
97 __tsan_atomic8 SANITIZER_CDECL
98 __tsan_atomic8_fetch_sub(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);
99 __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_sub(
100     volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);
101 __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_sub(
102     volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);
103 __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_sub(
104     volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);
105 #if __TSAN_HAS_INT128
106 __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_sub(
107     volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);
108 #endif
109 
110 __tsan_atomic8 SANITIZER_CDECL
111 __tsan_atomic8_fetch_and(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);
112 __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_and(
113     volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);
114 __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_and(
115     volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);
116 __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_and(
117     volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);
118 #if __TSAN_HAS_INT128
119 __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_and(
120     volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);
121 #endif
122 
123 __tsan_atomic8 SANITIZER_CDECL
124 __tsan_atomic8_fetch_or(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);
125 __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_or(
126     volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);
127 __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_or(
128     volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);
129 __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_or(
130     volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);
131 #if __TSAN_HAS_INT128
132 __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_or(
133     volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);
134 #endif
135 
136 __tsan_atomic8 SANITIZER_CDECL
137 __tsan_atomic8_fetch_xor(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);
138 __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_xor(
139     volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);
140 __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_xor(
141     volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);
142 __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_xor(
143     volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);
144 #if __TSAN_HAS_INT128
145 __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_xor(
146     volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);
147 #endif
148 
149 __tsan_atomic8 SANITIZER_CDECL
150 __tsan_atomic8_fetch_nand(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);
151 __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_nand(
152     volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);
153 __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_nand(
154     volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);
155 __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_nand(
156     volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);
157 #if __TSAN_HAS_INT128
158 __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_nand(
159     volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);
160 #endif
161 
162 int SANITIZER_CDECL __tsan_atomic8_compare_exchange_weak(
163     volatile __tsan_atomic8 *a, __tsan_atomic8 *c, __tsan_atomic8 v, int mo,
164     int fail_mo);
165 int SANITIZER_CDECL __tsan_atomic16_compare_exchange_weak(
166     volatile __tsan_atomic16 *a, __tsan_atomic16 *c, __tsan_atomic16 v, int mo,
167     int fail_mo);
168 int SANITIZER_CDECL __tsan_atomic32_compare_exchange_weak(
169     volatile __tsan_atomic32 *a, __tsan_atomic32 *c, __tsan_atomic32 v, int mo,
170     int fail_mo);
171 int SANITIZER_CDECL __tsan_atomic64_compare_exchange_weak(
172     volatile __tsan_atomic64 *a, __tsan_atomic64 *c, __tsan_atomic64 v, int mo,
173     int fail_mo);
174 #if __TSAN_HAS_INT128
175 int SANITIZER_CDECL __tsan_atomic128_compare_exchange_weak(
176     volatile __tsan_atomic128 *a, __tsan_atomic128 *c, __tsan_atomic128 v,
177     int mo, int fail_mo);
178 #endif
179 
180 int SANITIZER_CDECL __tsan_atomic8_compare_exchange_strong(
181     volatile __tsan_atomic8 *a, __tsan_atomic8 *c, __tsan_atomic8 v, int mo,
182     int fail_mo);
183 int SANITIZER_CDECL __tsan_atomic16_compare_exchange_strong(
184     volatile __tsan_atomic16 *a, __tsan_atomic16 *c, __tsan_atomic16 v, int mo,
185     int fail_mo);
186 int SANITIZER_CDECL __tsan_atomic32_compare_exchange_strong(
187     volatile __tsan_atomic32 *a, __tsan_atomic32 *c, __tsan_atomic32 v, int mo,
188     int fail_mo);
189 int SANITIZER_CDECL __tsan_atomic64_compare_exchange_strong(
190     volatile __tsan_atomic64 *a, __tsan_atomic64 *c, __tsan_atomic64 v, int mo,
191     int fail_mo);
192 #if __TSAN_HAS_INT128
193 int SANITIZER_CDECL __tsan_atomic128_compare_exchange_strong(
194     volatile __tsan_atomic128 *a, __tsan_atomic128 *c, __tsan_atomic128 v,
195     int mo, int fail_mo);
196 #endif
197 
198 __tsan_atomic8 SANITIZER_CDECL __tsan_atomic8_compare_exchange_val(
199     volatile __tsan_atomic8 *a, __tsan_atomic8 c, __tsan_atomic8 v, int mo,
200     int fail_mo);
201 __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_compare_exchange_val(
202     volatile __tsan_atomic16 *a, __tsan_atomic16 c, __tsan_atomic16 v, int mo,
203     int fail_mo);
204 __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_compare_exchange_val(
205     volatile __tsan_atomic32 *a, __tsan_atomic32 c, __tsan_atomic32 v, int mo,
206     int fail_mo);
207 __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_compare_exchange_val(
208     volatile __tsan_atomic64 *a, __tsan_atomic64 c, __tsan_atomic64 v, int mo,
209     int fail_mo);
210 #if __TSAN_HAS_INT128
211 __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_compare_exchange_val(
212     volatile __tsan_atomic128 *a, __tsan_atomic128 c, __tsan_atomic128 v,
213     int mo, int fail_mo);
214 #endif
215 
216 void SANITIZER_CDECL __tsan_atomic_thread_fence(int mo);
217 void SANITIZER_CDECL __tsan_atomic_signal_fence(int mo);
218 
219 #ifdef __cplusplus
220 } // extern "C"
221 #endif
222 
223 #endif // TSAN_INTERFACE_ATOMIC_H
224