xref: /openbsd-src/gnu/llvm/compiler-rt/include/sanitizer/tsan_interface_atomic.h (revision d89ec533011f513df1010f142a111086a0785f09)
13cab2bb3Spatrick //===-- tsan_interface_atomic.h ---------------------------------*- C++ -*-===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick //
93cab2bb3Spatrick // This file is a part of ThreadSanitizer (TSan), a race detector.
103cab2bb3Spatrick //
113cab2bb3Spatrick // Public interface header for TSan atomics.
123cab2bb3Spatrick //===----------------------------------------------------------------------===//
133cab2bb3Spatrick #ifndef TSAN_INTERFACE_ATOMIC_H
143cab2bb3Spatrick #define TSAN_INTERFACE_ATOMIC_H
153cab2bb3Spatrick 
163cab2bb3Spatrick #ifdef __cplusplus
173cab2bb3Spatrick extern "C" {
183cab2bb3Spatrick #endif
193cab2bb3Spatrick 
203cab2bb3Spatrick typedef char __tsan_atomic8;
213cab2bb3Spatrick typedef short __tsan_atomic16;
223cab2bb3Spatrick typedef int __tsan_atomic32;
233cab2bb3Spatrick typedef long __tsan_atomic64;
243cab2bb3Spatrick #if defined(__SIZEOF_INT128__) \
253cab2bb3Spatrick     || (__clang_major__ * 100 + __clang_minor__ >= 302)
263cab2bb3Spatrick __extension__ typedef __int128 __tsan_atomic128;
273cab2bb3Spatrick # define __TSAN_HAS_INT128 1
283cab2bb3Spatrick #else
293cab2bb3Spatrick # define __TSAN_HAS_INT128 0
303cab2bb3Spatrick #endif
313cab2bb3Spatrick 
323cab2bb3Spatrick // Part of ABI, do not change.
33*d89ec533Spatrick // https://github.com/llvm/llvm-project/blob/main/libcxx/include/atomic
343cab2bb3Spatrick typedef enum {
353cab2bb3Spatrick   __tsan_memory_order_relaxed,
363cab2bb3Spatrick   __tsan_memory_order_consume,
373cab2bb3Spatrick   __tsan_memory_order_acquire,
383cab2bb3Spatrick   __tsan_memory_order_release,
393cab2bb3Spatrick   __tsan_memory_order_acq_rel,
403cab2bb3Spatrick   __tsan_memory_order_seq_cst
413cab2bb3Spatrick } __tsan_memory_order;
423cab2bb3Spatrick 
433cab2bb3Spatrick __tsan_atomic8 __tsan_atomic8_load(const volatile __tsan_atomic8 *a,
443cab2bb3Spatrick     __tsan_memory_order mo);
453cab2bb3Spatrick __tsan_atomic16 __tsan_atomic16_load(const volatile __tsan_atomic16 *a,
463cab2bb3Spatrick     __tsan_memory_order mo);
473cab2bb3Spatrick __tsan_atomic32 __tsan_atomic32_load(const volatile __tsan_atomic32 *a,
483cab2bb3Spatrick     __tsan_memory_order mo);
493cab2bb3Spatrick __tsan_atomic64 __tsan_atomic64_load(const volatile __tsan_atomic64 *a,
503cab2bb3Spatrick     __tsan_memory_order mo);
513cab2bb3Spatrick #if __TSAN_HAS_INT128
523cab2bb3Spatrick __tsan_atomic128 __tsan_atomic128_load(const volatile __tsan_atomic128 *a,
533cab2bb3Spatrick     __tsan_memory_order mo);
543cab2bb3Spatrick #endif
553cab2bb3Spatrick 
563cab2bb3Spatrick void __tsan_atomic8_store(volatile __tsan_atomic8 *a, __tsan_atomic8 v,
573cab2bb3Spatrick     __tsan_memory_order mo);
583cab2bb3Spatrick void __tsan_atomic16_store(volatile __tsan_atomic16 *a, __tsan_atomic16 v,
593cab2bb3Spatrick     __tsan_memory_order mo);
603cab2bb3Spatrick void __tsan_atomic32_store(volatile __tsan_atomic32 *a, __tsan_atomic32 v,
613cab2bb3Spatrick     __tsan_memory_order mo);
623cab2bb3Spatrick void __tsan_atomic64_store(volatile __tsan_atomic64 *a, __tsan_atomic64 v,
633cab2bb3Spatrick     __tsan_memory_order mo);
643cab2bb3Spatrick #if __TSAN_HAS_INT128
653cab2bb3Spatrick void __tsan_atomic128_store(volatile __tsan_atomic128 *a, __tsan_atomic128 v,
663cab2bb3Spatrick     __tsan_memory_order mo);
673cab2bb3Spatrick #endif
683cab2bb3Spatrick 
693cab2bb3Spatrick __tsan_atomic8 __tsan_atomic8_exchange(volatile __tsan_atomic8 *a,
703cab2bb3Spatrick     __tsan_atomic8 v, __tsan_memory_order mo);
713cab2bb3Spatrick __tsan_atomic16 __tsan_atomic16_exchange(volatile __tsan_atomic16 *a,
723cab2bb3Spatrick     __tsan_atomic16 v, __tsan_memory_order mo);
733cab2bb3Spatrick __tsan_atomic32 __tsan_atomic32_exchange(volatile __tsan_atomic32 *a,
743cab2bb3Spatrick     __tsan_atomic32 v, __tsan_memory_order mo);
753cab2bb3Spatrick __tsan_atomic64 __tsan_atomic64_exchange(volatile __tsan_atomic64 *a,
763cab2bb3Spatrick     __tsan_atomic64 v, __tsan_memory_order mo);
773cab2bb3Spatrick #if __TSAN_HAS_INT128
783cab2bb3Spatrick __tsan_atomic128 __tsan_atomic128_exchange(volatile __tsan_atomic128 *a,
793cab2bb3Spatrick     __tsan_atomic128 v, __tsan_memory_order mo);
803cab2bb3Spatrick #endif
813cab2bb3Spatrick 
823cab2bb3Spatrick __tsan_atomic8 __tsan_atomic8_fetch_add(volatile __tsan_atomic8 *a,
833cab2bb3Spatrick     __tsan_atomic8 v, __tsan_memory_order mo);
843cab2bb3Spatrick __tsan_atomic16 __tsan_atomic16_fetch_add(volatile __tsan_atomic16 *a,
853cab2bb3Spatrick     __tsan_atomic16 v, __tsan_memory_order mo);
863cab2bb3Spatrick __tsan_atomic32 __tsan_atomic32_fetch_add(volatile __tsan_atomic32 *a,
873cab2bb3Spatrick     __tsan_atomic32 v, __tsan_memory_order mo);
883cab2bb3Spatrick __tsan_atomic64 __tsan_atomic64_fetch_add(volatile __tsan_atomic64 *a,
893cab2bb3Spatrick     __tsan_atomic64 v, __tsan_memory_order mo);
903cab2bb3Spatrick #if __TSAN_HAS_INT128
913cab2bb3Spatrick __tsan_atomic128 __tsan_atomic128_fetch_add(volatile __tsan_atomic128 *a,
923cab2bb3Spatrick     __tsan_atomic128 v, __tsan_memory_order mo);
933cab2bb3Spatrick #endif
943cab2bb3Spatrick 
953cab2bb3Spatrick __tsan_atomic8 __tsan_atomic8_fetch_sub(volatile __tsan_atomic8 *a,
963cab2bb3Spatrick     __tsan_atomic8 v, __tsan_memory_order mo);
973cab2bb3Spatrick __tsan_atomic16 __tsan_atomic16_fetch_sub(volatile __tsan_atomic16 *a,
983cab2bb3Spatrick     __tsan_atomic16 v, __tsan_memory_order mo);
993cab2bb3Spatrick __tsan_atomic32 __tsan_atomic32_fetch_sub(volatile __tsan_atomic32 *a,
1003cab2bb3Spatrick     __tsan_atomic32 v, __tsan_memory_order mo);
1013cab2bb3Spatrick __tsan_atomic64 __tsan_atomic64_fetch_sub(volatile __tsan_atomic64 *a,
1023cab2bb3Spatrick     __tsan_atomic64 v, __tsan_memory_order mo);
1033cab2bb3Spatrick #if __TSAN_HAS_INT128
1043cab2bb3Spatrick __tsan_atomic128 __tsan_atomic128_fetch_sub(volatile __tsan_atomic128 *a,
1053cab2bb3Spatrick     __tsan_atomic128 v, __tsan_memory_order mo);
1063cab2bb3Spatrick #endif
1073cab2bb3Spatrick 
1083cab2bb3Spatrick __tsan_atomic8 __tsan_atomic8_fetch_and(volatile __tsan_atomic8 *a,
1093cab2bb3Spatrick     __tsan_atomic8 v, __tsan_memory_order mo);
1103cab2bb3Spatrick __tsan_atomic16 __tsan_atomic16_fetch_and(volatile __tsan_atomic16 *a,
1113cab2bb3Spatrick     __tsan_atomic16 v, __tsan_memory_order mo);
1123cab2bb3Spatrick __tsan_atomic32 __tsan_atomic32_fetch_and(volatile __tsan_atomic32 *a,
1133cab2bb3Spatrick     __tsan_atomic32 v, __tsan_memory_order mo);
1143cab2bb3Spatrick __tsan_atomic64 __tsan_atomic64_fetch_and(volatile __tsan_atomic64 *a,
1153cab2bb3Spatrick     __tsan_atomic64 v, __tsan_memory_order mo);
1163cab2bb3Spatrick #if __TSAN_HAS_INT128
1173cab2bb3Spatrick __tsan_atomic128 __tsan_atomic128_fetch_and(volatile __tsan_atomic128 *a,
1183cab2bb3Spatrick     __tsan_atomic128 v, __tsan_memory_order mo);
1193cab2bb3Spatrick #endif
1203cab2bb3Spatrick 
1213cab2bb3Spatrick __tsan_atomic8 __tsan_atomic8_fetch_or(volatile __tsan_atomic8 *a,
1223cab2bb3Spatrick     __tsan_atomic8 v, __tsan_memory_order mo);
1233cab2bb3Spatrick __tsan_atomic16 __tsan_atomic16_fetch_or(volatile __tsan_atomic16 *a,
1243cab2bb3Spatrick     __tsan_atomic16 v, __tsan_memory_order mo);
1253cab2bb3Spatrick __tsan_atomic32 __tsan_atomic32_fetch_or(volatile __tsan_atomic32 *a,
1263cab2bb3Spatrick     __tsan_atomic32 v, __tsan_memory_order mo);
1273cab2bb3Spatrick __tsan_atomic64 __tsan_atomic64_fetch_or(volatile __tsan_atomic64 *a,
1283cab2bb3Spatrick     __tsan_atomic64 v, __tsan_memory_order mo);
1293cab2bb3Spatrick #if __TSAN_HAS_INT128
1303cab2bb3Spatrick __tsan_atomic128 __tsan_atomic128_fetch_or(volatile __tsan_atomic128 *a,
1313cab2bb3Spatrick     __tsan_atomic128 v, __tsan_memory_order mo);
1323cab2bb3Spatrick #endif
1333cab2bb3Spatrick 
1343cab2bb3Spatrick __tsan_atomic8 __tsan_atomic8_fetch_xor(volatile __tsan_atomic8 *a,
1353cab2bb3Spatrick     __tsan_atomic8 v, __tsan_memory_order mo);
1363cab2bb3Spatrick __tsan_atomic16 __tsan_atomic16_fetch_xor(volatile __tsan_atomic16 *a,
1373cab2bb3Spatrick     __tsan_atomic16 v, __tsan_memory_order mo);
1383cab2bb3Spatrick __tsan_atomic32 __tsan_atomic32_fetch_xor(volatile __tsan_atomic32 *a,
1393cab2bb3Spatrick     __tsan_atomic32 v, __tsan_memory_order mo);
1403cab2bb3Spatrick __tsan_atomic64 __tsan_atomic64_fetch_xor(volatile __tsan_atomic64 *a,
1413cab2bb3Spatrick     __tsan_atomic64 v, __tsan_memory_order mo);
1423cab2bb3Spatrick #if __TSAN_HAS_INT128
1433cab2bb3Spatrick __tsan_atomic128 __tsan_atomic128_fetch_xor(volatile __tsan_atomic128 *a,
1443cab2bb3Spatrick     __tsan_atomic128 v, __tsan_memory_order mo);
1453cab2bb3Spatrick #endif
1463cab2bb3Spatrick 
1473cab2bb3Spatrick __tsan_atomic8 __tsan_atomic8_fetch_nand(volatile __tsan_atomic8 *a,
1483cab2bb3Spatrick     __tsan_atomic8 v, __tsan_memory_order mo);
1493cab2bb3Spatrick __tsan_atomic16 __tsan_atomic16_fetch_nand(volatile __tsan_atomic16 *a,
1503cab2bb3Spatrick     __tsan_atomic16 v, __tsan_memory_order mo);
1513cab2bb3Spatrick __tsan_atomic32 __tsan_atomic32_fetch_nand(volatile __tsan_atomic32 *a,
1523cab2bb3Spatrick     __tsan_atomic32 v, __tsan_memory_order mo);
1533cab2bb3Spatrick __tsan_atomic64 __tsan_atomic64_fetch_nand(volatile __tsan_atomic64 *a,
1543cab2bb3Spatrick     __tsan_atomic64 v, __tsan_memory_order mo);
1553cab2bb3Spatrick #if __TSAN_HAS_INT128
1563cab2bb3Spatrick __tsan_atomic128 __tsan_atomic128_fetch_nand(volatile __tsan_atomic128 *a,
1573cab2bb3Spatrick     __tsan_atomic128 v, __tsan_memory_order mo);
1583cab2bb3Spatrick #endif
1593cab2bb3Spatrick 
1603cab2bb3Spatrick int __tsan_atomic8_compare_exchange_weak(volatile __tsan_atomic8 *a,
1613cab2bb3Spatrick     __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo,
1623cab2bb3Spatrick     __tsan_memory_order fail_mo);
1633cab2bb3Spatrick int __tsan_atomic16_compare_exchange_weak(volatile __tsan_atomic16 *a,
1643cab2bb3Spatrick     __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo,
1653cab2bb3Spatrick     __tsan_memory_order fail_mo);
1663cab2bb3Spatrick int __tsan_atomic32_compare_exchange_weak(volatile __tsan_atomic32 *a,
1673cab2bb3Spatrick     __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo,
1683cab2bb3Spatrick     __tsan_memory_order fail_mo);
1693cab2bb3Spatrick int __tsan_atomic64_compare_exchange_weak(volatile __tsan_atomic64 *a,
1703cab2bb3Spatrick     __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo,
1713cab2bb3Spatrick     __tsan_memory_order fail_mo);
1723cab2bb3Spatrick #if __TSAN_HAS_INT128
1733cab2bb3Spatrick int __tsan_atomic128_compare_exchange_weak(volatile __tsan_atomic128 *a,
1743cab2bb3Spatrick     __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo,
1753cab2bb3Spatrick     __tsan_memory_order fail_mo);
1763cab2bb3Spatrick #endif
1773cab2bb3Spatrick 
1783cab2bb3Spatrick int __tsan_atomic8_compare_exchange_strong(volatile __tsan_atomic8 *a,
1793cab2bb3Spatrick     __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo,
1803cab2bb3Spatrick     __tsan_memory_order fail_mo);
1813cab2bb3Spatrick int __tsan_atomic16_compare_exchange_strong(volatile __tsan_atomic16 *a,
1823cab2bb3Spatrick     __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo,
1833cab2bb3Spatrick     __tsan_memory_order fail_mo);
1843cab2bb3Spatrick int __tsan_atomic32_compare_exchange_strong(volatile __tsan_atomic32 *a,
1853cab2bb3Spatrick     __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo,
1863cab2bb3Spatrick     __tsan_memory_order fail_mo);
1873cab2bb3Spatrick int __tsan_atomic64_compare_exchange_strong(volatile __tsan_atomic64 *a,
1883cab2bb3Spatrick     __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo,
1893cab2bb3Spatrick     __tsan_memory_order fail_mo);
1903cab2bb3Spatrick #if __TSAN_HAS_INT128
1913cab2bb3Spatrick int __tsan_atomic128_compare_exchange_strong(volatile __tsan_atomic128 *a,
1923cab2bb3Spatrick     __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo,
1933cab2bb3Spatrick     __tsan_memory_order fail_mo);
1943cab2bb3Spatrick #endif
1953cab2bb3Spatrick 
1963cab2bb3Spatrick __tsan_atomic8 __tsan_atomic8_compare_exchange_val(
1973cab2bb3Spatrick     volatile __tsan_atomic8 *a, __tsan_atomic8 c, __tsan_atomic8 v,
1983cab2bb3Spatrick     __tsan_memory_order mo, __tsan_memory_order fail_mo);
1993cab2bb3Spatrick __tsan_atomic16 __tsan_atomic16_compare_exchange_val(
2003cab2bb3Spatrick     volatile __tsan_atomic16 *a, __tsan_atomic16 c, __tsan_atomic16 v,
2013cab2bb3Spatrick     __tsan_memory_order mo, __tsan_memory_order fail_mo);
2023cab2bb3Spatrick __tsan_atomic32 __tsan_atomic32_compare_exchange_val(
2033cab2bb3Spatrick     volatile __tsan_atomic32 *a, __tsan_atomic32 c, __tsan_atomic32 v,
2043cab2bb3Spatrick     __tsan_memory_order mo, __tsan_memory_order fail_mo);
2053cab2bb3Spatrick __tsan_atomic64 __tsan_atomic64_compare_exchange_val(
2063cab2bb3Spatrick     volatile __tsan_atomic64 *a, __tsan_atomic64 c, __tsan_atomic64 v,
2073cab2bb3Spatrick     __tsan_memory_order mo, __tsan_memory_order fail_mo);
2083cab2bb3Spatrick #if __TSAN_HAS_INT128
2093cab2bb3Spatrick __tsan_atomic128 __tsan_atomic128_compare_exchange_val(
2103cab2bb3Spatrick     volatile __tsan_atomic128 *a, __tsan_atomic128 c, __tsan_atomic128 v,
2113cab2bb3Spatrick     __tsan_memory_order mo, __tsan_memory_order fail_mo);
2123cab2bb3Spatrick #endif
2133cab2bb3Spatrick 
2143cab2bb3Spatrick void __tsan_atomic_thread_fence(__tsan_memory_order mo);
2153cab2bb3Spatrick void __tsan_atomic_signal_fence(__tsan_memory_order mo);
2163cab2bb3Spatrick 
2173cab2bb3Spatrick #ifdef __cplusplus
2183cab2bb3Spatrick }  // extern "C"
2193cab2bb3Spatrick #endif
2203cab2bb3Spatrick 
2213cab2bb3Spatrick #endif  // TSAN_INTERFACE_ATOMIC_H
222