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