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