xref: /aosp_15_r20/external/compiler-rt/lib/tsan/rtl/tsan_interface.h (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
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