1*7c3d14c8STreehugger Robot //===-- tsan_interface.h ----------------------------------------*- C++ -*-===// 2*7c3d14c8STreehugger Robot // 3*7c3d14c8STreehugger Robot // The LLVM Compiler Infrastructure 4*7c3d14c8STreehugger Robot // 5*7c3d14c8STreehugger Robot // This file is distributed under the University of Illinois Open Source 6*7c3d14c8STreehugger Robot // License. See LICENSE.TXT for details. 7*7c3d14c8STreehugger Robot // 8*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===// 9*7c3d14c8STreehugger Robot // 10*7c3d14c8STreehugger Robot // This file is a part of ThreadSanitizer (TSan), a race detector. 11*7c3d14c8STreehugger Robot // 12*7c3d14c8STreehugger Robot // The functions declared in this header will be inserted by the instrumentation 13*7c3d14c8STreehugger Robot // module. 14*7c3d14c8STreehugger Robot // This header can be included by the instrumented program or by TSan tests. 15*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===// 16*7c3d14c8STreehugger Robot #ifndef TSAN_INTERFACE_H 17*7c3d14c8STreehugger Robot #define TSAN_INTERFACE_H 18*7c3d14c8STreehugger Robot 19*7c3d14c8STreehugger Robot #include <sanitizer_common/sanitizer_internal_defs.h> 20*7c3d14c8STreehugger Robot 21*7c3d14c8STreehugger Robot // This header should NOT include any other headers. 22*7c3d14c8STreehugger Robot // All functions in this header are extern "C" and start with __tsan_. 23*7c3d14c8STreehugger Robot 24*7c3d14c8STreehugger Robot #ifdef __cplusplus 25*7c3d14c8STreehugger Robot extern "C" { 26*7c3d14c8STreehugger Robot #endif 27*7c3d14c8STreehugger Robot 28*7c3d14c8STreehugger Robot #ifndef SANITIZER_GO 29*7c3d14c8STreehugger Robot 30*7c3d14c8STreehugger Robot // This function should be called at the very beginning of the process, 31*7c3d14c8STreehugger Robot // before any instrumented code is executed and before any call to malloc. 32*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_init(); 33*7c3d14c8STreehugger Robot 34*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read1(void *addr); 35*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read2(void *addr); 36*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read4(void *addr); 37*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read8(void *addr); 38*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read16(void *addr); 39*7c3d14c8STreehugger Robot 40*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write1(void *addr); 41*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write2(void *addr); 42*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write4(void *addr); 43*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write8(void *addr); 44*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write16(void *addr); 45*7c3d14c8STreehugger Robot 46*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read2(const void *addr); 47*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read4(const void *addr); 48*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read8(const void *addr); 49*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read16(const void *addr); 50*7c3d14c8STreehugger Robot 51*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write2(void *addr); 52*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write4(void *addr); 53*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write8(void *addr); 54*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write16(void *addr); 55*7c3d14c8STreehugger Robot 56*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read1_pc(void *addr, void *pc); 57*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read2_pc(void *addr, void *pc); 58*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read4_pc(void *addr, void *pc); 59*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read8_pc(void *addr, void *pc); 60*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read16_pc(void *addr, void *pc); 61*7c3d14c8STreehugger Robot 62*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write1_pc(void *addr, void *pc); 63*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write2_pc(void *addr, void *pc); 64*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write4_pc(void *addr, void *pc); 65*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write8_pc(void *addr, void *pc); 66*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write16_pc(void *addr, void *pc); 67*7c3d14c8STreehugger Robot 68*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_vptr_read(void **vptr_p); 69*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 70*7c3d14c8STreehugger Robot void __tsan_vptr_update(void **vptr_p, void *new_val); 71*7c3d14c8STreehugger Robot 72*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_func_entry(void *call_pc); 73*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE void __tsan_func_exit(); 74*7c3d14c8STreehugger Robot 75*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 76*7c3d14c8STreehugger Robot void __tsan_read_range(void *addr, unsigned long size); // NOLINT 77*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 78*7c3d14c8STreehugger Robot void __tsan_write_range(void *addr, unsigned long size); // NOLINT 79*7c3d14c8STreehugger Robot 80*7c3d14c8STreehugger Robot // User may provide function that would be called right when TSan detects 81*7c3d14c8STreehugger Robot // an error. The argument 'report' is an opaque pointer that can be used to 82*7c3d14c8STreehugger Robot // gather additional information using other TSan report API functions. 83*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 84*7c3d14c8STreehugger Robot void __tsan_on_report(void *report); 85*7c3d14c8STreehugger Robot 86*7c3d14c8STreehugger Robot // If TSan is currently reporting a detected issue on the current thread, 87*7c3d14c8STreehugger Robot // returns an opaque pointer to the current report. Otherwise returns NULL. 88*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 89*7c3d14c8STreehugger Robot void *__tsan_get_current_report(); 90*7c3d14c8STreehugger Robot 91*7c3d14c8STreehugger Robot // Returns a report's description (issue type), number of duplicate issues 92*7c3d14c8STreehugger Robot // found, counts of array data (stack traces, memory operations, locations, 93*7c3d14c8STreehugger Robot // mutexes, threads, unique thread IDs) and a stack trace of a sleep() call (if 94*7c3d14c8STreehugger Robot // one was involved in the issue). 95*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 96*7c3d14c8STreehugger Robot int __tsan_get_report_data(void *report, const char **description, int *count, 97*7c3d14c8STreehugger Robot int *stack_count, int *mop_count, int *loc_count, 98*7c3d14c8STreehugger Robot int *mutex_count, int *thread_count, 99*7c3d14c8STreehugger Robot int *unique_tid_count, void **sleep_trace, 100*7c3d14c8STreehugger Robot uptr trace_size); 101*7c3d14c8STreehugger Robot 102*7c3d14c8STreehugger Robot // Returns information about stack traces included in the report. 103*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 104*7c3d14c8STreehugger Robot int __tsan_get_report_stack(void *report, uptr idx, void **trace, 105*7c3d14c8STreehugger Robot uptr trace_size); 106*7c3d14c8STreehugger Robot 107*7c3d14c8STreehugger Robot // Returns information about memory operations included in the report. 108*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 109*7c3d14c8STreehugger Robot int __tsan_get_report_mop(void *report, uptr idx, int *tid, void **addr, 110*7c3d14c8STreehugger Robot int *size, int *write, int *atomic, void **trace, 111*7c3d14c8STreehugger Robot uptr trace_size); 112*7c3d14c8STreehugger Robot 113*7c3d14c8STreehugger Robot // Returns information about locations included in the report. 114*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 115*7c3d14c8STreehugger Robot int __tsan_get_report_loc(void *report, uptr idx, const char **type, 116*7c3d14c8STreehugger Robot void **addr, uptr *start, uptr *size, int *tid, 117*7c3d14c8STreehugger Robot int *fd, int *suppressable, void **trace, 118*7c3d14c8STreehugger Robot uptr trace_size); 119*7c3d14c8STreehugger Robot 120*7c3d14c8STreehugger Robot // Returns information about mutexes included in the report. 121*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 122*7c3d14c8STreehugger Robot int __tsan_get_report_mutex(void *report, uptr idx, uptr *mutex_id, void **addr, 123*7c3d14c8STreehugger Robot int *destroyed, void **trace, uptr trace_size); 124*7c3d14c8STreehugger Robot 125*7c3d14c8STreehugger Robot // Returns information about threads included in the report. 126*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 127*7c3d14c8STreehugger Robot int __tsan_get_report_thread(void *report, uptr idx, int *tid, uptr *os_id, 128*7c3d14c8STreehugger Robot int *running, const char **name, int *parent_tid, 129*7c3d14c8STreehugger Robot void **trace, uptr trace_size); 130*7c3d14c8STreehugger Robot 131*7c3d14c8STreehugger Robot // Returns information about unique thread IDs included in the report. 132*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 133*7c3d14c8STreehugger Robot int __tsan_get_report_unique_tid(void *report, uptr idx, int *tid); 134*7c3d14c8STreehugger Robot 135*7c3d14c8STreehugger Robot #endif // SANITIZER_GO 136*7c3d14c8STreehugger Robot 137*7c3d14c8STreehugger Robot #ifdef __cplusplus 138*7c3d14c8STreehugger Robot } // extern "C" 139*7c3d14c8STreehugger Robot #endif 140*7c3d14c8STreehugger Robot 141*7c3d14c8STreehugger Robot namespace __tsan { 142*7c3d14c8STreehugger Robot 143*7c3d14c8STreehugger Robot // These should match declarations from public tsan_interface_atomic.h header. 144*7c3d14c8STreehugger Robot typedef unsigned char a8; 145*7c3d14c8STreehugger Robot typedef unsigned short a16; // NOLINT 146*7c3d14c8STreehugger Robot typedef unsigned int a32; 147*7c3d14c8STreehugger Robot typedef unsigned long long a64; // NOLINT 148*7c3d14c8STreehugger Robot #if !defined(SANITIZER_GO) && (defined(__SIZEOF_INT128__) \ 149*7c3d14c8STreehugger Robot || (__clang_major__ * 100 + __clang_minor__ >= 302)) && !defined(__mips64) 150*7c3d14c8STreehugger Robot __extension__ typedef __int128 a128; 151*7c3d14c8STreehugger Robot # define __TSAN_HAS_INT128 1 152*7c3d14c8STreehugger Robot #else 153*7c3d14c8STreehugger Robot # define __TSAN_HAS_INT128 0 154*7c3d14c8STreehugger Robot #endif 155*7c3d14c8STreehugger Robot 156*7c3d14c8STreehugger Robot // Part of ABI, do not change. 157*7c3d14c8STreehugger Robot // http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/atomic?view=markup 158*7c3d14c8STreehugger Robot typedef enum { 159*7c3d14c8STreehugger Robot mo_relaxed, 160*7c3d14c8STreehugger Robot mo_consume, 161*7c3d14c8STreehugger Robot mo_acquire, 162*7c3d14c8STreehugger Robot mo_release, 163*7c3d14c8STreehugger Robot mo_acq_rel, 164*7c3d14c8STreehugger Robot mo_seq_cst 165*7c3d14c8STreehugger Robot } morder; 166*7c3d14c8STreehugger Robot 167*7c3d14c8STreehugger Robot struct ThreadState; 168*7c3d14c8STreehugger Robot 169*7c3d14c8STreehugger Robot extern "C" { 170*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 171*7c3d14c8STreehugger Robot a8 __tsan_atomic8_load(const volatile a8 *a, morder mo); 172*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 173*7c3d14c8STreehugger Robot a16 __tsan_atomic16_load(const volatile a16 *a, morder mo); 174*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 175*7c3d14c8STreehugger Robot a32 __tsan_atomic32_load(const volatile a32 *a, morder mo); 176*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 177*7c3d14c8STreehugger Robot a64 __tsan_atomic64_load(const volatile a64 *a, morder mo); 178*7c3d14c8STreehugger Robot #if __TSAN_HAS_INT128 179*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 180*7c3d14c8STreehugger Robot a128 __tsan_atomic128_load(const volatile a128 *a, morder mo); 181*7c3d14c8STreehugger Robot #endif 182*7c3d14c8STreehugger Robot 183*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 184*7c3d14c8STreehugger Robot void __tsan_atomic8_store(volatile a8 *a, a8 v, morder mo); 185*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 186*7c3d14c8STreehugger Robot void __tsan_atomic16_store(volatile a16 *a, a16 v, morder mo); 187*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 188*7c3d14c8STreehugger Robot void __tsan_atomic32_store(volatile a32 *a, a32 v, morder mo); 189*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 190*7c3d14c8STreehugger Robot void __tsan_atomic64_store(volatile a64 *a, a64 v, morder mo); 191*7c3d14c8STreehugger Robot #if __TSAN_HAS_INT128 192*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 193*7c3d14c8STreehugger Robot void __tsan_atomic128_store(volatile a128 *a, a128 v, morder mo); 194*7c3d14c8STreehugger Robot #endif 195*7c3d14c8STreehugger Robot 196*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 197*7c3d14c8STreehugger Robot a8 __tsan_atomic8_exchange(volatile a8 *a, a8 v, morder mo); 198*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 199*7c3d14c8STreehugger Robot a16 __tsan_atomic16_exchange(volatile a16 *a, a16 v, morder mo); 200*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 201*7c3d14c8STreehugger Robot a32 __tsan_atomic32_exchange(volatile a32 *a, a32 v, morder mo); 202*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 203*7c3d14c8STreehugger Robot a64 __tsan_atomic64_exchange(volatile a64 *a, a64 v, morder mo); 204*7c3d14c8STreehugger Robot #if __TSAN_HAS_INT128 205*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 206*7c3d14c8STreehugger Robot a128 __tsan_atomic128_exchange(volatile a128 *a, a128 v, morder mo); 207*7c3d14c8STreehugger Robot #endif 208*7c3d14c8STreehugger Robot 209*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 210*7c3d14c8STreehugger Robot a8 __tsan_atomic8_fetch_add(volatile a8 *a, a8 v, morder mo); 211*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 212*7c3d14c8STreehugger Robot a16 __tsan_atomic16_fetch_add(volatile a16 *a, a16 v, morder mo); 213*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 214*7c3d14c8STreehugger Robot a32 __tsan_atomic32_fetch_add(volatile a32 *a, a32 v, morder mo); 215*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 216*7c3d14c8STreehugger Robot a64 __tsan_atomic64_fetch_add(volatile a64 *a, a64 v, morder mo); 217*7c3d14c8STreehugger Robot #if __TSAN_HAS_INT128 218*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 219*7c3d14c8STreehugger Robot a128 __tsan_atomic128_fetch_add(volatile a128 *a, a128 v, morder mo); 220*7c3d14c8STreehugger Robot #endif 221*7c3d14c8STreehugger Robot 222*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 223*7c3d14c8STreehugger Robot a8 __tsan_atomic8_fetch_sub(volatile a8 *a, a8 v, morder mo); 224*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 225*7c3d14c8STreehugger Robot a16 __tsan_atomic16_fetch_sub(volatile a16 *a, a16 v, morder mo); 226*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 227*7c3d14c8STreehugger Robot a32 __tsan_atomic32_fetch_sub(volatile a32 *a, a32 v, morder mo); 228*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 229*7c3d14c8STreehugger Robot a64 __tsan_atomic64_fetch_sub(volatile a64 *a, a64 v, morder mo); 230*7c3d14c8STreehugger Robot #if __TSAN_HAS_INT128 231*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 232*7c3d14c8STreehugger Robot a128 __tsan_atomic128_fetch_sub(volatile a128 *a, a128 v, morder mo); 233*7c3d14c8STreehugger Robot #endif 234*7c3d14c8STreehugger Robot 235*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 236*7c3d14c8STreehugger Robot a8 __tsan_atomic8_fetch_and(volatile a8 *a, a8 v, morder mo); 237*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 238*7c3d14c8STreehugger Robot a16 __tsan_atomic16_fetch_and(volatile a16 *a, a16 v, morder mo); 239*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 240*7c3d14c8STreehugger Robot a32 __tsan_atomic32_fetch_and(volatile a32 *a, a32 v, morder mo); 241*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 242*7c3d14c8STreehugger Robot a64 __tsan_atomic64_fetch_and(volatile a64 *a, a64 v, morder mo); 243*7c3d14c8STreehugger Robot #if __TSAN_HAS_INT128 244*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 245*7c3d14c8STreehugger Robot a128 __tsan_atomic128_fetch_and(volatile a128 *a, a128 v, morder mo); 246*7c3d14c8STreehugger Robot #endif 247*7c3d14c8STreehugger Robot 248*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 249*7c3d14c8STreehugger Robot a8 __tsan_atomic8_fetch_or(volatile a8 *a, a8 v, morder mo); 250*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 251*7c3d14c8STreehugger Robot a16 __tsan_atomic16_fetch_or(volatile a16 *a, a16 v, morder mo); 252*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 253*7c3d14c8STreehugger Robot a32 __tsan_atomic32_fetch_or(volatile a32 *a, a32 v, morder mo); 254*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 255*7c3d14c8STreehugger Robot a64 __tsan_atomic64_fetch_or(volatile a64 *a, a64 v, morder mo); 256*7c3d14c8STreehugger Robot #if __TSAN_HAS_INT128 257*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 258*7c3d14c8STreehugger Robot a128 __tsan_atomic128_fetch_or(volatile a128 *a, a128 v, morder mo); 259*7c3d14c8STreehugger Robot #endif 260*7c3d14c8STreehugger Robot 261*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 262*7c3d14c8STreehugger Robot a8 __tsan_atomic8_fetch_xor(volatile a8 *a, a8 v, morder mo); 263*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 264*7c3d14c8STreehugger Robot a16 __tsan_atomic16_fetch_xor(volatile a16 *a, a16 v, morder mo); 265*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 266*7c3d14c8STreehugger Robot a32 __tsan_atomic32_fetch_xor(volatile a32 *a, a32 v, morder mo); 267*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 268*7c3d14c8STreehugger Robot a64 __tsan_atomic64_fetch_xor(volatile a64 *a, a64 v, morder mo); 269*7c3d14c8STreehugger Robot #if __TSAN_HAS_INT128 270*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 271*7c3d14c8STreehugger Robot a128 __tsan_atomic128_fetch_xor(volatile a128 *a, a128 v, morder mo); 272*7c3d14c8STreehugger Robot #endif 273*7c3d14c8STreehugger Robot 274*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 275*7c3d14c8STreehugger Robot a8 __tsan_atomic8_fetch_nand(volatile a8 *a, a8 v, morder mo); 276*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 277*7c3d14c8STreehugger Robot a16 __tsan_atomic16_fetch_nand(volatile a16 *a, a16 v, morder mo); 278*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 279*7c3d14c8STreehugger Robot a32 __tsan_atomic32_fetch_nand(volatile a32 *a, a32 v, morder mo); 280*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 281*7c3d14c8STreehugger Robot a64 __tsan_atomic64_fetch_nand(volatile a64 *a, a64 v, morder mo); 282*7c3d14c8STreehugger Robot #if __TSAN_HAS_INT128 283*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 284*7c3d14c8STreehugger Robot a128 __tsan_atomic128_fetch_nand(volatile a128 *a, a128 v, morder mo); 285*7c3d14c8STreehugger Robot #endif 286*7c3d14c8STreehugger Robot 287*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 288*7c3d14c8STreehugger Robot int __tsan_atomic8_compare_exchange_strong(volatile a8 *a, a8 *c, a8 v, 289*7c3d14c8STreehugger Robot morder mo, morder fmo); 290*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 291*7c3d14c8STreehugger Robot int __tsan_atomic16_compare_exchange_strong(volatile a16 *a, a16 *c, a16 v, 292*7c3d14c8STreehugger Robot morder mo, morder fmo); 293*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 294*7c3d14c8STreehugger Robot int __tsan_atomic32_compare_exchange_strong(volatile a32 *a, a32 *c, a32 v, 295*7c3d14c8STreehugger Robot morder mo, morder fmo); 296*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 297*7c3d14c8STreehugger Robot int __tsan_atomic64_compare_exchange_strong(volatile a64 *a, a64 *c, a64 v, 298*7c3d14c8STreehugger Robot morder mo, morder fmo); 299*7c3d14c8STreehugger Robot #if __TSAN_HAS_INT128 300*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 301*7c3d14c8STreehugger Robot int __tsan_atomic128_compare_exchange_strong(volatile a128 *a, a128 *c, a128 v, 302*7c3d14c8STreehugger Robot morder mo, morder fmo); 303*7c3d14c8STreehugger Robot #endif 304*7c3d14c8STreehugger Robot 305*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 306*7c3d14c8STreehugger Robot int __tsan_atomic8_compare_exchange_weak(volatile a8 *a, a8 *c, a8 v, morder mo, 307*7c3d14c8STreehugger Robot morder fmo); 308*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 309*7c3d14c8STreehugger Robot int __tsan_atomic16_compare_exchange_weak(volatile a16 *a, a16 *c, a16 v, 310*7c3d14c8STreehugger Robot morder mo, morder fmo); 311*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 312*7c3d14c8STreehugger Robot int __tsan_atomic32_compare_exchange_weak(volatile a32 *a, a32 *c, a32 v, 313*7c3d14c8STreehugger Robot morder mo, morder fmo); 314*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 315*7c3d14c8STreehugger Robot int __tsan_atomic64_compare_exchange_weak(volatile a64 *a, a64 *c, a64 v, 316*7c3d14c8STreehugger Robot morder mo, morder fmo); 317*7c3d14c8STreehugger Robot #if __TSAN_HAS_INT128 318*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 319*7c3d14c8STreehugger Robot int __tsan_atomic128_compare_exchange_weak(volatile a128 *a, a128 *c, a128 v, 320*7c3d14c8STreehugger Robot morder mo, morder fmo); 321*7c3d14c8STreehugger Robot #endif 322*7c3d14c8STreehugger Robot 323*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 324*7c3d14c8STreehugger Robot a8 __tsan_atomic8_compare_exchange_val(volatile a8 *a, a8 c, a8 v, morder mo, 325*7c3d14c8STreehugger Robot morder fmo); 326*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 327*7c3d14c8STreehugger Robot a16 __tsan_atomic16_compare_exchange_val(volatile a16 *a, a16 c, a16 v, 328*7c3d14c8STreehugger Robot morder mo, morder fmo); 329*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 330*7c3d14c8STreehugger Robot a32 __tsan_atomic32_compare_exchange_val(volatile a32 *a, a32 c, a32 v, 331*7c3d14c8STreehugger Robot morder mo, morder fmo); 332*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 333*7c3d14c8STreehugger Robot a64 __tsan_atomic64_compare_exchange_val(volatile a64 *a, a64 c, a64 v, 334*7c3d14c8STreehugger Robot morder mo, morder fmo); 335*7c3d14c8STreehugger Robot #if __TSAN_HAS_INT128 336*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 337*7c3d14c8STreehugger Robot a128 __tsan_atomic128_compare_exchange_val(volatile a128 *a, a128 c, a128 v, 338*7c3d14c8STreehugger Robot morder mo, morder fmo); 339*7c3d14c8STreehugger Robot #endif 340*7c3d14c8STreehugger Robot 341*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 342*7c3d14c8STreehugger Robot void __tsan_atomic_thread_fence(morder mo); 343*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 344*7c3d14c8STreehugger Robot void __tsan_atomic_signal_fence(morder mo); 345*7c3d14c8STreehugger Robot 346*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 347*7c3d14c8STreehugger Robot void __tsan_go_atomic32_load(ThreadState *thr, uptr cpc, uptr pc, u8 *a); 348*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 349*7c3d14c8STreehugger Robot void __tsan_go_atomic64_load(ThreadState *thr, uptr cpc, uptr pc, u8 *a); 350*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 351*7c3d14c8STreehugger Robot void __tsan_go_atomic32_store(ThreadState *thr, uptr cpc, uptr pc, u8 *a); 352*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 353*7c3d14c8STreehugger Robot void __tsan_go_atomic64_store(ThreadState *thr, uptr cpc, uptr pc, u8 *a); 354*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 355*7c3d14c8STreehugger Robot void __tsan_go_atomic32_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a); 356*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 357*7c3d14c8STreehugger Robot void __tsan_go_atomic64_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a); 358*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 359*7c3d14c8STreehugger Robot void __tsan_go_atomic32_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a); 360*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 361*7c3d14c8STreehugger Robot void __tsan_go_atomic64_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a); 362*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 363*7c3d14c8STreehugger Robot void __tsan_go_atomic32_compare_exchange(ThreadState *thr, uptr cpc, uptr pc, 364*7c3d14c8STreehugger Robot u8 *a); 365*7c3d14c8STreehugger Robot SANITIZER_INTERFACE_ATTRIBUTE 366*7c3d14c8STreehugger Robot void __tsan_go_atomic64_compare_exchange(ThreadState *thr, uptr cpc, uptr pc, 367*7c3d14c8STreehugger Robot u8 *a); 368*7c3d14c8STreehugger Robot } // extern "C" 369*7c3d14c8STreehugger Robot 370*7c3d14c8STreehugger Robot } // namespace __tsan 371*7c3d14c8STreehugger Robot 372*7c3d14c8STreehugger Robot #endif // TSAN_INTERFACE_H 373