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