xref: /freebsd/contrib/llvm-project/compiler-rt/include/sanitizer/tsan_interface_atomic.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric //===-- tsan_interface_atomic.h ---------------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file is a part of ThreadSanitizer (TSan), a race detector.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric // Public interface header for TSan atomics.
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric #ifndef TSAN_INTERFACE_ATOMIC_H
140b57cec5SDimitry Andric #define TSAN_INTERFACE_ATOMIC_H
150b57cec5SDimitry Andric 
16*5f757f3fSDimitry Andric #include <sanitizer/common_interface_defs.h>
17*5f757f3fSDimitry Andric 
180b57cec5SDimitry Andric #ifdef __cplusplus
190b57cec5SDimitry Andric extern "C" {
200b57cec5SDimitry Andric #endif
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric typedef char __tsan_atomic8;
2368d75effSDimitry Andric typedef short __tsan_atomic16;
240b57cec5SDimitry Andric typedef int __tsan_atomic32;
2568d75effSDimitry Andric typedef long __tsan_atomic64;
26*5f757f3fSDimitry Andric #if defined(__SIZEOF_INT128__) ||                                              \
27*5f757f3fSDimitry Andric     (__clang_major__ * 100 + __clang_minor__ >= 302)
280b57cec5SDimitry Andric __extension__ typedef __int128 __tsan_atomic128;
290b57cec5SDimitry Andric #define __TSAN_HAS_INT128 1
300b57cec5SDimitry Andric #else
310b57cec5SDimitry Andric #define __TSAN_HAS_INT128 0
320b57cec5SDimitry Andric #endif
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric // Part of ABI, do not change.
35fe6060f1SDimitry Andric // https://github.com/llvm/llvm-project/blob/main/libcxx/include/atomic
360b57cec5SDimitry Andric typedef enum {
370b57cec5SDimitry Andric   __tsan_memory_order_relaxed,
380b57cec5SDimitry Andric   __tsan_memory_order_consume,
390b57cec5SDimitry Andric   __tsan_memory_order_acquire,
400b57cec5SDimitry Andric   __tsan_memory_order_release,
410b57cec5SDimitry Andric   __tsan_memory_order_acq_rel,
420b57cec5SDimitry Andric   __tsan_memory_order_seq_cst
430b57cec5SDimitry Andric } __tsan_memory_order;
440b57cec5SDimitry Andric 
45*5f757f3fSDimitry Andric __tsan_atomic8 SANITIZER_CDECL
46*5f757f3fSDimitry Andric __tsan_atomic8_load(const volatile __tsan_atomic8 *a, __tsan_memory_order mo);
47*5f757f3fSDimitry Andric __tsan_atomic16 SANITIZER_CDECL
48*5f757f3fSDimitry Andric __tsan_atomic16_load(const volatile __tsan_atomic16 *a, __tsan_memory_order mo);
49*5f757f3fSDimitry Andric __tsan_atomic32 SANITIZER_CDECL
50*5f757f3fSDimitry Andric __tsan_atomic32_load(const volatile __tsan_atomic32 *a, __tsan_memory_order mo);
51*5f757f3fSDimitry Andric __tsan_atomic64 SANITIZER_CDECL
52*5f757f3fSDimitry Andric __tsan_atomic64_load(const volatile __tsan_atomic64 *a, __tsan_memory_order mo);
53*5f757f3fSDimitry Andric #if __TSAN_HAS_INT128
54*5f757f3fSDimitry Andric __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_load(
55*5f757f3fSDimitry Andric     const volatile __tsan_atomic128 *a, __tsan_memory_order mo);
56*5f757f3fSDimitry Andric #endif
57*5f757f3fSDimitry Andric 
58*5f757f3fSDimitry Andric void SANITIZER_CDECL __tsan_atomic8_store(volatile __tsan_atomic8 *a,
59*5f757f3fSDimitry Andric                                           __tsan_atomic8 v,
600b57cec5SDimitry Andric                                           __tsan_memory_order mo);
61*5f757f3fSDimitry Andric void SANITIZER_CDECL __tsan_atomic16_store(volatile __tsan_atomic16 *a,
62*5f757f3fSDimitry Andric                                            __tsan_atomic16 v,
630b57cec5SDimitry Andric                                            __tsan_memory_order mo);
64*5f757f3fSDimitry Andric void SANITIZER_CDECL __tsan_atomic32_store(volatile __tsan_atomic32 *a,
65*5f757f3fSDimitry Andric                                            __tsan_atomic32 v,
660b57cec5SDimitry Andric                                            __tsan_memory_order mo);
67*5f757f3fSDimitry Andric void SANITIZER_CDECL __tsan_atomic64_store(volatile __tsan_atomic64 *a,
68*5f757f3fSDimitry Andric                                            __tsan_atomic64 v,
690b57cec5SDimitry Andric                                            __tsan_memory_order mo);
700b57cec5SDimitry Andric #if __TSAN_HAS_INT128
71*5f757f3fSDimitry Andric void SANITIZER_CDECL __tsan_atomic128_store(volatile __tsan_atomic128 *a,
72*5f757f3fSDimitry Andric                                             __tsan_atomic128 v,
730b57cec5SDimitry Andric                                             __tsan_memory_order mo);
740b57cec5SDimitry Andric #endif
750b57cec5SDimitry Andric 
76*5f757f3fSDimitry Andric __tsan_atomic8 SANITIZER_CDECL __tsan_atomic8_exchange(
77*5f757f3fSDimitry Andric     volatile __tsan_atomic8 *a, __tsan_atomic8 v, __tsan_memory_order mo);
78*5f757f3fSDimitry Andric __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_exchange(
79*5f757f3fSDimitry Andric     volatile __tsan_atomic16 *a, __tsan_atomic16 v, __tsan_memory_order mo);
80*5f757f3fSDimitry Andric __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_exchange(
81*5f757f3fSDimitry Andric     volatile __tsan_atomic32 *a, __tsan_atomic32 v, __tsan_memory_order mo);
82*5f757f3fSDimitry Andric __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_exchange(
83*5f757f3fSDimitry Andric     volatile __tsan_atomic64 *a, __tsan_atomic64 v, __tsan_memory_order mo);
840b57cec5SDimitry Andric #if __TSAN_HAS_INT128
85*5f757f3fSDimitry Andric __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_exchange(
86*5f757f3fSDimitry Andric     volatile __tsan_atomic128 *a, __tsan_atomic128 v, __tsan_memory_order mo);
870b57cec5SDimitry Andric #endif
880b57cec5SDimitry Andric 
89*5f757f3fSDimitry Andric __tsan_atomic8 SANITIZER_CDECL __tsan_atomic8_fetch_add(
90*5f757f3fSDimitry Andric     volatile __tsan_atomic8 *a, __tsan_atomic8 v, __tsan_memory_order mo);
91*5f757f3fSDimitry Andric __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_add(
92*5f757f3fSDimitry Andric     volatile __tsan_atomic16 *a, __tsan_atomic16 v, __tsan_memory_order mo);
93*5f757f3fSDimitry Andric __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_add(
94*5f757f3fSDimitry Andric     volatile __tsan_atomic32 *a, __tsan_atomic32 v, __tsan_memory_order mo);
95*5f757f3fSDimitry Andric __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_add(
96*5f757f3fSDimitry Andric     volatile __tsan_atomic64 *a, __tsan_atomic64 v, __tsan_memory_order mo);
970b57cec5SDimitry Andric #if __TSAN_HAS_INT128
98*5f757f3fSDimitry Andric __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_add(
99*5f757f3fSDimitry Andric     volatile __tsan_atomic128 *a, __tsan_atomic128 v, __tsan_memory_order mo);
1000b57cec5SDimitry Andric #endif
1010b57cec5SDimitry Andric 
102*5f757f3fSDimitry Andric __tsan_atomic8 SANITIZER_CDECL __tsan_atomic8_fetch_sub(
103*5f757f3fSDimitry Andric     volatile __tsan_atomic8 *a, __tsan_atomic8 v, __tsan_memory_order mo);
104*5f757f3fSDimitry Andric __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_sub(
105*5f757f3fSDimitry Andric     volatile __tsan_atomic16 *a, __tsan_atomic16 v, __tsan_memory_order mo);
106*5f757f3fSDimitry Andric __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_sub(
107*5f757f3fSDimitry Andric     volatile __tsan_atomic32 *a, __tsan_atomic32 v, __tsan_memory_order mo);
108*5f757f3fSDimitry Andric __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_sub(
109*5f757f3fSDimitry Andric     volatile __tsan_atomic64 *a, __tsan_atomic64 v, __tsan_memory_order mo);
1100b57cec5SDimitry Andric #if __TSAN_HAS_INT128
111*5f757f3fSDimitry Andric __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_sub(
112*5f757f3fSDimitry Andric     volatile __tsan_atomic128 *a, __tsan_atomic128 v, __tsan_memory_order mo);
1130b57cec5SDimitry Andric #endif
1140b57cec5SDimitry Andric 
115*5f757f3fSDimitry Andric __tsan_atomic8 SANITIZER_CDECL __tsan_atomic8_fetch_and(
116*5f757f3fSDimitry Andric     volatile __tsan_atomic8 *a, __tsan_atomic8 v, __tsan_memory_order mo);
117*5f757f3fSDimitry Andric __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_and(
118*5f757f3fSDimitry Andric     volatile __tsan_atomic16 *a, __tsan_atomic16 v, __tsan_memory_order mo);
119*5f757f3fSDimitry Andric __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_and(
120*5f757f3fSDimitry Andric     volatile __tsan_atomic32 *a, __tsan_atomic32 v, __tsan_memory_order mo);
121*5f757f3fSDimitry Andric __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_and(
122*5f757f3fSDimitry Andric     volatile __tsan_atomic64 *a, __tsan_atomic64 v, __tsan_memory_order mo);
1230b57cec5SDimitry Andric #if __TSAN_HAS_INT128
124*5f757f3fSDimitry Andric __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_and(
125*5f757f3fSDimitry Andric     volatile __tsan_atomic128 *a, __tsan_atomic128 v, __tsan_memory_order mo);
1260b57cec5SDimitry Andric #endif
1270b57cec5SDimitry Andric 
128*5f757f3fSDimitry Andric __tsan_atomic8 SANITIZER_CDECL __tsan_atomic8_fetch_or(
129*5f757f3fSDimitry Andric     volatile __tsan_atomic8 *a, __tsan_atomic8 v, __tsan_memory_order mo);
130*5f757f3fSDimitry Andric __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_or(
131*5f757f3fSDimitry Andric     volatile __tsan_atomic16 *a, __tsan_atomic16 v, __tsan_memory_order mo);
132*5f757f3fSDimitry Andric __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_or(
133*5f757f3fSDimitry Andric     volatile __tsan_atomic32 *a, __tsan_atomic32 v, __tsan_memory_order mo);
134*5f757f3fSDimitry Andric __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_or(
135*5f757f3fSDimitry Andric     volatile __tsan_atomic64 *a, __tsan_atomic64 v, __tsan_memory_order mo);
1360b57cec5SDimitry Andric #if __TSAN_HAS_INT128
137*5f757f3fSDimitry Andric __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_or(
138*5f757f3fSDimitry Andric     volatile __tsan_atomic128 *a, __tsan_atomic128 v, __tsan_memory_order mo);
1390b57cec5SDimitry Andric #endif
1400b57cec5SDimitry Andric 
141*5f757f3fSDimitry Andric __tsan_atomic8 SANITIZER_CDECL __tsan_atomic8_fetch_xor(
142*5f757f3fSDimitry Andric     volatile __tsan_atomic8 *a, __tsan_atomic8 v, __tsan_memory_order mo);
143*5f757f3fSDimitry Andric __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_xor(
144*5f757f3fSDimitry Andric     volatile __tsan_atomic16 *a, __tsan_atomic16 v, __tsan_memory_order mo);
145*5f757f3fSDimitry Andric __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_xor(
146*5f757f3fSDimitry Andric     volatile __tsan_atomic32 *a, __tsan_atomic32 v, __tsan_memory_order mo);
147*5f757f3fSDimitry Andric __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_xor(
148*5f757f3fSDimitry Andric     volatile __tsan_atomic64 *a, __tsan_atomic64 v, __tsan_memory_order mo);
1490b57cec5SDimitry Andric #if __TSAN_HAS_INT128
150*5f757f3fSDimitry Andric __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_xor(
151*5f757f3fSDimitry Andric     volatile __tsan_atomic128 *a, __tsan_atomic128 v, __tsan_memory_order mo);
1520b57cec5SDimitry Andric #endif
1530b57cec5SDimitry Andric 
154*5f757f3fSDimitry Andric __tsan_atomic8 SANITIZER_CDECL __tsan_atomic8_fetch_nand(
155*5f757f3fSDimitry Andric     volatile __tsan_atomic8 *a, __tsan_atomic8 v, __tsan_memory_order mo);
156*5f757f3fSDimitry Andric __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_nand(
157*5f757f3fSDimitry Andric     volatile __tsan_atomic16 *a, __tsan_atomic16 v, __tsan_memory_order mo);
158*5f757f3fSDimitry Andric __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_nand(
159*5f757f3fSDimitry Andric     volatile __tsan_atomic32 *a, __tsan_atomic32 v, __tsan_memory_order mo);
160*5f757f3fSDimitry Andric __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_nand(
161*5f757f3fSDimitry Andric     volatile __tsan_atomic64 *a, __tsan_atomic64 v, __tsan_memory_order mo);
1620b57cec5SDimitry Andric #if __TSAN_HAS_INT128
163*5f757f3fSDimitry Andric __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_nand(
164*5f757f3fSDimitry Andric     volatile __tsan_atomic128 *a, __tsan_atomic128 v, __tsan_memory_order mo);
1650b57cec5SDimitry Andric #endif
1660b57cec5SDimitry Andric 
167*5f757f3fSDimitry Andric int SANITIZER_CDECL __tsan_atomic8_compare_exchange_weak(
168*5f757f3fSDimitry Andric     volatile __tsan_atomic8 *a, __tsan_atomic8 *c, __tsan_atomic8 v,
169*5f757f3fSDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
170*5f757f3fSDimitry Andric int SANITIZER_CDECL __tsan_atomic16_compare_exchange_weak(
171*5f757f3fSDimitry Andric     volatile __tsan_atomic16 *a, __tsan_atomic16 *c, __tsan_atomic16 v,
172*5f757f3fSDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
173*5f757f3fSDimitry Andric int SANITIZER_CDECL __tsan_atomic32_compare_exchange_weak(
174*5f757f3fSDimitry Andric     volatile __tsan_atomic32 *a, __tsan_atomic32 *c, __tsan_atomic32 v,
175*5f757f3fSDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
176*5f757f3fSDimitry Andric int SANITIZER_CDECL __tsan_atomic64_compare_exchange_weak(
177*5f757f3fSDimitry Andric     volatile __tsan_atomic64 *a, __tsan_atomic64 *c, __tsan_atomic64 v,
178*5f757f3fSDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
1790b57cec5SDimitry Andric #if __TSAN_HAS_INT128
180*5f757f3fSDimitry Andric int SANITIZER_CDECL __tsan_atomic128_compare_exchange_weak(
181*5f757f3fSDimitry Andric     volatile __tsan_atomic128 *a, __tsan_atomic128 *c, __tsan_atomic128 v,
182*5f757f3fSDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
1830b57cec5SDimitry Andric #endif
1840b57cec5SDimitry Andric 
185*5f757f3fSDimitry Andric int SANITIZER_CDECL __tsan_atomic8_compare_exchange_strong(
186*5f757f3fSDimitry Andric     volatile __tsan_atomic8 *a, __tsan_atomic8 *c, __tsan_atomic8 v,
187*5f757f3fSDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
188*5f757f3fSDimitry Andric int SANITIZER_CDECL __tsan_atomic16_compare_exchange_strong(
189*5f757f3fSDimitry Andric     volatile __tsan_atomic16 *a, __tsan_atomic16 *c, __tsan_atomic16 v,
190*5f757f3fSDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
191*5f757f3fSDimitry Andric int SANITIZER_CDECL __tsan_atomic32_compare_exchange_strong(
192*5f757f3fSDimitry Andric     volatile __tsan_atomic32 *a, __tsan_atomic32 *c, __tsan_atomic32 v,
193*5f757f3fSDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
194*5f757f3fSDimitry Andric int SANITIZER_CDECL __tsan_atomic64_compare_exchange_strong(
195*5f757f3fSDimitry Andric     volatile __tsan_atomic64 *a, __tsan_atomic64 *c, __tsan_atomic64 v,
196*5f757f3fSDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
1970b57cec5SDimitry Andric #if __TSAN_HAS_INT128
198*5f757f3fSDimitry Andric int SANITIZER_CDECL __tsan_atomic128_compare_exchange_strong(
199*5f757f3fSDimitry Andric     volatile __tsan_atomic128 *a, __tsan_atomic128 *c, __tsan_atomic128 v,
200*5f757f3fSDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
2010b57cec5SDimitry Andric #endif
2020b57cec5SDimitry Andric 
203*5f757f3fSDimitry Andric __tsan_atomic8 SANITIZER_CDECL __tsan_atomic8_compare_exchange_val(
2040b57cec5SDimitry Andric     volatile __tsan_atomic8 *a, __tsan_atomic8 c, __tsan_atomic8 v,
2050b57cec5SDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
206*5f757f3fSDimitry Andric __tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_compare_exchange_val(
2070b57cec5SDimitry Andric     volatile __tsan_atomic16 *a, __tsan_atomic16 c, __tsan_atomic16 v,
2080b57cec5SDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
209*5f757f3fSDimitry Andric __tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_compare_exchange_val(
2100b57cec5SDimitry Andric     volatile __tsan_atomic32 *a, __tsan_atomic32 c, __tsan_atomic32 v,
2110b57cec5SDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
212*5f757f3fSDimitry Andric __tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_compare_exchange_val(
2130b57cec5SDimitry Andric     volatile __tsan_atomic64 *a, __tsan_atomic64 c, __tsan_atomic64 v,
2140b57cec5SDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
2150b57cec5SDimitry Andric #if __TSAN_HAS_INT128
216*5f757f3fSDimitry Andric __tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_compare_exchange_val(
2170b57cec5SDimitry Andric     volatile __tsan_atomic128 *a, __tsan_atomic128 c, __tsan_atomic128 v,
2180b57cec5SDimitry Andric     __tsan_memory_order mo, __tsan_memory_order fail_mo);
2190b57cec5SDimitry Andric #endif
2200b57cec5SDimitry Andric 
221*5f757f3fSDimitry Andric void SANITIZER_CDECL __tsan_atomic_thread_fence(__tsan_memory_order mo);
222*5f757f3fSDimitry Andric void SANITIZER_CDECL __tsan_atomic_signal_fence(__tsan_memory_order mo);
2230b57cec5SDimitry Andric 
2240b57cec5SDimitry Andric #ifdef __cplusplus
2250b57cec5SDimitry Andric } // extern "C"
2260b57cec5SDimitry Andric #endif
2270b57cec5SDimitry Andric 
2280b57cec5SDimitry Andric #endif // TSAN_INTERFACE_ATOMIC_H
229