1 | //===-- tsan_interface.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 | // The functions declared in this header will be inserted by the instrumentation |
12 | // module. |
13 | // This header can be included by the instrumented program or by TSan tests. |
14 | //===----------------------------------------------------------------------===// |
15 | #ifndef TSAN_INTERFACE_H |
16 | #define TSAN_INTERFACE_H |
17 | |
18 | #include <sanitizer_common/sanitizer_internal_defs.h> |
19 | using __sanitizer::uptr; |
20 | using __sanitizer::tid_t; |
21 | |
22 | // This header should NOT include any other headers. |
23 | // All functions in this header are extern "C" and start with __tsan_. |
24 | |
25 | #ifdef __cplusplus |
26 | extern "C" { |
27 | #endif |
28 | |
29 | #if !SANITIZER_GO |
30 | |
31 | // This function should be called at the very beginning of the process, |
32 | // before any instrumented code is executed and before any call to malloc. |
33 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_init(); |
34 | |
35 | SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE const char * |
36 | __tsan_default_options(); |
37 | |
38 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_flush_memory(); |
39 | |
40 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read1(void *addr); |
41 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read2(void *addr); |
42 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read4(void *addr); |
43 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read8(void *addr); |
44 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read16(void *addr); |
45 | |
46 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write1(void *addr); |
47 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write2(void *addr); |
48 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write4(void *addr); |
49 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write8(void *addr); |
50 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write16(void *addr); |
51 | |
52 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read2(const void *addr); |
53 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read4(const void *addr); |
54 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read8(const void *addr); |
55 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_read16(const void *addr); |
56 | |
57 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write2(void *addr); |
58 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write4(void *addr); |
59 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write8(void *addr); |
60 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_unaligned_write16(void *addr); |
61 | |
62 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read1_pc(void *addr, void *pc); |
63 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read2_pc(void *addr, void *pc); |
64 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read4_pc(void *addr, void *pc); |
65 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read8_pc(void *addr, void *pc); |
66 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read16_pc(void *addr, void *pc); |
67 | |
68 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write1_pc(void *addr, void *pc); |
69 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write2_pc(void *addr, void *pc); |
70 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write4_pc(void *addr, void *pc); |
71 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write8_pc(void *addr, void *pc); |
72 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write16_pc(void *addr, void *pc); |
73 | |
74 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_vptr_read(void **vptr_p); |
75 | SANITIZER_INTERFACE_ATTRIBUTE |
76 | void __tsan_vptr_update(void **vptr_p, void *new_val); |
77 | |
78 | SANITIZER_INTERFACE_ATTRIBUTE |
79 | void *__tsan_memcpy(void *dest, const void *src, uptr count); |
80 | SANITIZER_INTERFACE_ATTRIBUTE |
81 | void *__tsan_memset(void *dest, int ch, uptr count); |
82 | SANITIZER_INTERFACE_ATTRIBUTE |
83 | void *__tsan_memmove(void *dest, const void *src, uptr count); |
84 | |
85 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_func_entry(void *call_pc); |
86 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_func_exit(); |
87 | |
88 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_ignore_thread_begin(); |
89 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_ignore_thread_end(); |
90 | |
91 | SANITIZER_INTERFACE_ATTRIBUTE void __tsan_on_thread_idle(); |
92 | |
93 | SANITIZER_INTERFACE_ATTRIBUTE |
94 | void *__tsan_external_register_tag(const char *object_type); |
95 | SANITIZER_INTERFACE_ATTRIBUTE |
96 | void (void *tag, const char *); |
97 | SANITIZER_INTERFACE_ATTRIBUTE |
98 | void __tsan_external_assign_tag(void *addr, void *tag); |
99 | SANITIZER_INTERFACE_ATTRIBUTE |
100 | void __tsan_external_read(void *addr, void *caller_pc, void *tag); |
101 | SANITIZER_INTERFACE_ATTRIBUTE |
102 | void __tsan_external_write(void *addr, void *caller_pc, void *tag); |
103 | |
104 | SANITIZER_INTERFACE_ATTRIBUTE |
105 | void __tsan_read_range(void *addr, unsigned long size); |
106 | SANITIZER_INTERFACE_ATTRIBUTE |
107 | void __tsan_write_range(void *addr, unsigned long size); |
108 | |
109 | SANITIZER_INTERFACE_ATTRIBUTE |
110 | void __tsan_read_range_pc(void *addr, unsigned long size, void *pc); |
111 | SANITIZER_INTERFACE_ATTRIBUTE |
112 | void __tsan_write_range_pc(void *addr, unsigned long size, void *pc); |
113 | |
114 | // User may provide function that would be called right when TSan detects |
115 | // an error. The argument 'report' is an opaque pointer that can be used to |
116 | // gather additional information using other TSan report API functions. |
117 | SANITIZER_INTERFACE_ATTRIBUTE |
118 | void __tsan_on_report(void *report); |
119 | |
120 | // If TSan is currently reporting a detected issue on the current thread, |
121 | // returns an opaque pointer to the current report. Otherwise returns NULL. |
122 | SANITIZER_INTERFACE_ATTRIBUTE |
123 | void *__tsan_get_current_report(); |
124 | |
125 | // Returns a report's description (issue type), number of duplicate issues |
126 | // found, counts of array data (stack traces, memory operations, locations, |
127 | // mutexes, threads, unique thread IDs) and a stack trace of a sleep() call (if |
128 | // one was involved in the issue). |
129 | SANITIZER_INTERFACE_ATTRIBUTE |
130 | int __tsan_get_report_data(void *report, const char **description, int *count, |
131 | int *stack_count, int *mop_count, int *loc_count, |
132 | int *mutex_count, int *thread_count, |
133 | int *unique_tid_count, void **sleep_trace, |
134 | uptr trace_size); |
135 | |
136 | /// Retrieves the "tag" from a report (for external-race report types). External |
137 | /// races can be associated with a tag which give them more meaning. For example |
138 | /// tag value '1' means "Swift access race". Tag value '0' indicated a plain |
139 | /// external race. |
140 | /// |
141 | /// \param report opaque pointer to the current report (obtained as argument in |
142 | /// __tsan_on_report, or from __tsan_get_current_report) |
143 | /// \param [out] tag points to storage that will be filled with the tag value |
144 | /// |
145 | /// \returns non-zero value on success, zero on failure |
146 | SANITIZER_INTERFACE_ATTRIBUTE |
147 | int __tsan_get_report_tag(void *report, uptr *tag); |
148 | |
149 | // Returns information about stack traces included in the report. |
150 | SANITIZER_INTERFACE_ATTRIBUTE |
151 | int __tsan_get_report_stack(void *report, uptr idx, void **trace, |
152 | uptr trace_size); |
153 | |
154 | // Returns information about memory operations included in the report. |
155 | SANITIZER_INTERFACE_ATTRIBUTE |
156 | int __tsan_get_report_mop(void *report, uptr idx, int *tid, void **addr, |
157 | int *size, int *write, int *atomic, void **trace, |
158 | uptr trace_size); |
159 | |
160 | // Returns information about locations included in the report. |
161 | SANITIZER_INTERFACE_ATTRIBUTE |
162 | int __tsan_get_report_loc(void *report, uptr idx, const char **type, |
163 | void **addr, uptr *start, uptr *size, int *tid, |
164 | int *fd, int *suppressable, void **trace, |
165 | uptr trace_size); |
166 | |
167 | SANITIZER_INTERFACE_ATTRIBUTE |
168 | int __tsan_get_report_loc_object_type(void *report, uptr idx, |
169 | const char **object_type); |
170 | |
171 | // Returns information about mutexes included in the report. |
172 | SANITIZER_INTERFACE_ATTRIBUTE |
173 | int __tsan_get_report_mutex(void *report, uptr idx, uptr *mutex_id, void **addr, |
174 | int *destroyed, void **trace, uptr trace_size); |
175 | |
176 | // Returns information about threads included in the report. |
177 | SANITIZER_INTERFACE_ATTRIBUTE |
178 | int __tsan_get_report_thread(void *report, uptr idx, int *tid, tid_t *os_id, |
179 | int *running, const char **name, int *parent_tid, |
180 | void **trace, uptr trace_size); |
181 | |
182 | // Returns information about unique thread IDs included in the report. |
183 | SANITIZER_INTERFACE_ATTRIBUTE |
184 | int __tsan_get_report_unique_tid(void *report, uptr idx, int *tid); |
185 | |
186 | // Returns the type of the pointer (heap, stack, global, ...) and if possible |
187 | // also the starting address (e.g. of a heap allocation) and size. |
188 | SANITIZER_INTERFACE_ATTRIBUTE |
189 | const char *__tsan_locate_address(uptr addr, char *name, uptr name_size, |
190 | uptr *region_address, uptr *region_size); |
191 | |
192 | // Returns the allocation stack for a heap pointer. |
193 | SANITIZER_INTERFACE_ATTRIBUTE |
194 | int __tsan_get_alloc_stack(uptr addr, uptr *trace, uptr size, int *thread_id, |
195 | tid_t *os_id); |
196 | |
197 | #endif // SANITIZER_GO |
198 | |
199 | #ifdef __cplusplus |
200 | } // extern "C" |
201 | #endif |
202 | |
203 | namespace __tsan { |
204 | |
205 | // These should match declarations from public tsan_interface_atomic.h header. |
206 | typedef unsigned char a8; |
207 | typedef unsigned short a16; |
208 | typedef unsigned int a32; |
209 | typedef unsigned long long a64; |
210 | #if !SANITIZER_GO && (defined(__SIZEOF_INT128__) \ |
211 | || (__clang_major__ * 100 + __clang_minor__ >= 302)) && \ |
212 | !defined(__mips64) && !defined(__s390x__) |
213 | __extension__ typedef __int128 a128; |
214 | # define __TSAN_HAS_INT128 1 |
215 | #else |
216 | # define __TSAN_HAS_INT128 0 |
217 | #endif |
218 | |
219 | // Part of ABI, do not change. |
220 | // https://github.com/llvm/llvm-project/blob/main/libcxx/include/atomic |
221 | typedef enum { |
222 | mo_relaxed, |
223 | mo_consume, |
224 | mo_acquire, |
225 | mo_release, |
226 | mo_acq_rel, |
227 | mo_seq_cst |
228 | } morder; |
229 | |
230 | struct ThreadState; |
231 | |
232 | extern "C" { |
233 | SANITIZER_INTERFACE_ATTRIBUTE |
234 | a8 __tsan_atomic8_load(const volatile a8 *a, morder mo); |
235 | SANITIZER_INTERFACE_ATTRIBUTE |
236 | a16 __tsan_atomic16_load(const volatile a16 *a, morder mo); |
237 | SANITIZER_INTERFACE_ATTRIBUTE |
238 | a32 __tsan_atomic32_load(const volatile a32 *a, morder mo); |
239 | SANITIZER_INTERFACE_ATTRIBUTE |
240 | a64 __tsan_atomic64_load(const volatile a64 *a, morder mo); |
241 | #if __TSAN_HAS_INT128 |
242 | SANITIZER_INTERFACE_ATTRIBUTE |
243 | a128 __tsan_atomic128_load(const volatile a128 *a, morder mo); |
244 | #endif |
245 | |
246 | SANITIZER_INTERFACE_ATTRIBUTE |
247 | void __tsan_atomic8_store(volatile a8 *a, a8 v, morder mo); |
248 | SANITIZER_INTERFACE_ATTRIBUTE |
249 | void __tsan_atomic16_store(volatile a16 *a, a16 v, morder mo); |
250 | SANITIZER_INTERFACE_ATTRIBUTE |
251 | void __tsan_atomic32_store(volatile a32 *a, a32 v, morder mo); |
252 | SANITIZER_INTERFACE_ATTRIBUTE |
253 | void __tsan_atomic64_store(volatile a64 *a, a64 v, morder mo); |
254 | #if __TSAN_HAS_INT128 |
255 | SANITIZER_INTERFACE_ATTRIBUTE |
256 | void __tsan_atomic128_store(volatile a128 *a, a128 v, morder mo); |
257 | #endif |
258 | |
259 | SANITIZER_INTERFACE_ATTRIBUTE |
260 | a8 __tsan_atomic8_exchange(volatile a8 *a, a8 v, morder mo); |
261 | SANITIZER_INTERFACE_ATTRIBUTE |
262 | a16 __tsan_atomic16_exchange(volatile a16 *a, a16 v, morder mo); |
263 | SANITIZER_INTERFACE_ATTRIBUTE |
264 | a32 __tsan_atomic32_exchange(volatile a32 *a, a32 v, morder mo); |
265 | SANITIZER_INTERFACE_ATTRIBUTE |
266 | a64 __tsan_atomic64_exchange(volatile a64 *a, a64 v, morder mo); |
267 | #if __TSAN_HAS_INT128 |
268 | SANITIZER_INTERFACE_ATTRIBUTE |
269 | a128 __tsan_atomic128_exchange(volatile a128 *a, a128 v, morder mo); |
270 | #endif |
271 | |
272 | SANITIZER_INTERFACE_ATTRIBUTE |
273 | a8 __tsan_atomic8_fetch_add(volatile a8 *a, a8 v, morder mo); |
274 | SANITIZER_INTERFACE_ATTRIBUTE |
275 | a16 __tsan_atomic16_fetch_add(volatile a16 *a, a16 v, morder mo); |
276 | SANITIZER_INTERFACE_ATTRIBUTE |
277 | a32 __tsan_atomic32_fetch_add(volatile a32 *a, a32 v, morder mo); |
278 | SANITIZER_INTERFACE_ATTRIBUTE |
279 | a64 __tsan_atomic64_fetch_add(volatile a64 *a, a64 v, morder mo); |
280 | #if __TSAN_HAS_INT128 |
281 | SANITIZER_INTERFACE_ATTRIBUTE |
282 | a128 __tsan_atomic128_fetch_add(volatile a128 *a, a128 v, morder mo); |
283 | #endif |
284 | |
285 | SANITIZER_INTERFACE_ATTRIBUTE |
286 | a8 __tsan_atomic8_fetch_sub(volatile a8 *a, a8 v, morder mo); |
287 | SANITIZER_INTERFACE_ATTRIBUTE |
288 | a16 __tsan_atomic16_fetch_sub(volatile a16 *a, a16 v, morder mo); |
289 | SANITIZER_INTERFACE_ATTRIBUTE |
290 | a32 __tsan_atomic32_fetch_sub(volatile a32 *a, a32 v, morder mo); |
291 | SANITIZER_INTERFACE_ATTRIBUTE |
292 | a64 __tsan_atomic64_fetch_sub(volatile a64 *a, a64 v, morder mo); |
293 | #if __TSAN_HAS_INT128 |
294 | SANITIZER_INTERFACE_ATTRIBUTE |
295 | a128 __tsan_atomic128_fetch_sub(volatile a128 *a, a128 v, morder mo); |
296 | #endif |
297 | |
298 | SANITIZER_INTERFACE_ATTRIBUTE |
299 | a8 __tsan_atomic8_fetch_and(volatile a8 *a, a8 v, morder mo); |
300 | SANITIZER_INTERFACE_ATTRIBUTE |
301 | a16 __tsan_atomic16_fetch_and(volatile a16 *a, a16 v, morder mo); |
302 | SANITIZER_INTERFACE_ATTRIBUTE |
303 | a32 __tsan_atomic32_fetch_and(volatile a32 *a, a32 v, morder mo); |
304 | SANITIZER_INTERFACE_ATTRIBUTE |
305 | a64 __tsan_atomic64_fetch_and(volatile a64 *a, a64 v, morder mo); |
306 | #if __TSAN_HAS_INT128 |
307 | SANITIZER_INTERFACE_ATTRIBUTE |
308 | a128 __tsan_atomic128_fetch_and(volatile a128 *a, a128 v, morder mo); |
309 | #endif |
310 | |
311 | SANITIZER_INTERFACE_ATTRIBUTE |
312 | a8 __tsan_atomic8_fetch_or(volatile a8 *a, a8 v, morder mo); |
313 | SANITIZER_INTERFACE_ATTRIBUTE |
314 | a16 __tsan_atomic16_fetch_or(volatile a16 *a, a16 v, morder mo); |
315 | SANITIZER_INTERFACE_ATTRIBUTE |
316 | a32 __tsan_atomic32_fetch_or(volatile a32 *a, a32 v, morder mo); |
317 | SANITIZER_INTERFACE_ATTRIBUTE |
318 | a64 __tsan_atomic64_fetch_or(volatile a64 *a, a64 v, morder mo); |
319 | #if __TSAN_HAS_INT128 |
320 | SANITIZER_INTERFACE_ATTRIBUTE |
321 | a128 __tsan_atomic128_fetch_or(volatile a128 *a, a128 v, morder mo); |
322 | #endif |
323 | |
324 | SANITIZER_INTERFACE_ATTRIBUTE |
325 | a8 __tsan_atomic8_fetch_xor(volatile a8 *a, a8 v, morder mo); |
326 | SANITIZER_INTERFACE_ATTRIBUTE |
327 | a16 __tsan_atomic16_fetch_xor(volatile a16 *a, a16 v, morder mo); |
328 | SANITIZER_INTERFACE_ATTRIBUTE |
329 | a32 __tsan_atomic32_fetch_xor(volatile a32 *a, a32 v, morder mo); |
330 | SANITIZER_INTERFACE_ATTRIBUTE |
331 | a64 __tsan_atomic64_fetch_xor(volatile a64 *a, a64 v, morder mo); |
332 | #if __TSAN_HAS_INT128 |
333 | SANITIZER_INTERFACE_ATTRIBUTE |
334 | a128 __tsan_atomic128_fetch_xor(volatile a128 *a, a128 v, morder mo); |
335 | #endif |
336 | |
337 | SANITIZER_INTERFACE_ATTRIBUTE |
338 | a8 __tsan_atomic8_fetch_nand(volatile a8 *a, a8 v, morder mo); |
339 | SANITIZER_INTERFACE_ATTRIBUTE |
340 | a16 __tsan_atomic16_fetch_nand(volatile a16 *a, a16 v, morder mo); |
341 | SANITIZER_INTERFACE_ATTRIBUTE |
342 | a32 __tsan_atomic32_fetch_nand(volatile a32 *a, a32 v, morder mo); |
343 | SANITIZER_INTERFACE_ATTRIBUTE |
344 | a64 __tsan_atomic64_fetch_nand(volatile a64 *a, a64 v, morder mo); |
345 | #if __TSAN_HAS_INT128 |
346 | SANITIZER_INTERFACE_ATTRIBUTE |
347 | a128 __tsan_atomic128_fetch_nand(volatile a128 *a, a128 v, morder mo); |
348 | #endif |
349 | |
350 | SANITIZER_INTERFACE_ATTRIBUTE |
351 | int __tsan_atomic8_compare_exchange_strong(volatile a8 *a, a8 *c, a8 v, |
352 | morder mo, morder fmo); |
353 | SANITIZER_INTERFACE_ATTRIBUTE |
354 | int __tsan_atomic16_compare_exchange_strong(volatile a16 *a, a16 *c, a16 v, |
355 | morder mo, morder fmo); |
356 | SANITIZER_INTERFACE_ATTRIBUTE |
357 | int __tsan_atomic32_compare_exchange_strong(volatile a32 *a, a32 *c, a32 v, |
358 | morder mo, morder fmo); |
359 | SANITIZER_INTERFACE_ATTRIBUTE |
360 | int __tsan_atomic64_compare_exchange_strong(volatile a64 *a, a64 *c, a64 v, |
361 | morder mo, morder fmo); |
362 | #if __TSAN_HAS_INT128 |
363 | SANITIZER_INTERFACE_ATTRIBUTE |
364 | int __tsan_atomic128_compare_exchange_strong(volatile a128 *a, a128 *c, a128 v, |
365 | morder mo, morder fmo); |
366 | #endif |
367 | |
368 | SANITIZER_INTERFACE_ATTRIBUTE |
369 | int __tsan_atomic8_compare_exchange_weak(volatile a8 *a, a8 *c, a8 v, morder mo, |
370 | morder fmo); |
371 | SANITIZER_INTERFACE_ATTRIBUTE |
372 | int __tsan_atomic16_compare_exchange_weak(volatile a16 *a, a16 *c, a16 v, |
373 | morder mo, morder fmo); |
374 | SANITIZER_INTERFACE_ATTRIBUTE |
375 | int __tsan_atomic32_compare_exchange_weak(volatile a32 *a, a32 *c, a32 v, |
376 | morder mo, morder fmo); |
377 | SANITIZER_INTERFACE_ATTRIBUTE |
378 | int __tsan_atomic64_compare_exchange_weak(volatile a64 *a, a64 *c, a64 v, |
379 | morder mo, morder fmo); |
380 | #if __TSAN_HAS_INT128 |
381 | SANITIZER_INTERFACE_ATTRIBUTE |
382 | int __tsan_atomic128_compare_exchange_weak(volatile a128 *a, a128 *c, a128 v, |
383 | morder mo, morder fmo); |
384 | #endif |
385 | |
386 | SANITIZER_INTERFACE_ATTRIBUTE |
387 | a8 __tsan_atomic8_compare_exchange_val(volatile a8 *a, a8 c, a8 v, morder mo, |
388 | morder fmo); |
389 | SANITIZER_INTERFACE_ATTRIBUTE |
390 | a16 __tsan_atomic16_compare_exchange_val(volatile a16 *a, a16 c, a16 v, |
391 | morder mo, morder fmo); |
392 | SANITIZER_INTERFACE_ATTRIBUTE |
393 | a32 __tsan_atomic32_compare_exchange_val(volatile a32 *a, a32 c, a32 v, |
394 | morder mo, morder fmo); |
395 | SANITIZER_INTERFACE_ATTRIBUTE |
396 | a64 __tsan_atomic64_compare_exchange_val(volatile a64 *a, a64 c, a64 v, |
397 | morder mo, morder fmo); |
398 | #if __TSAN_HAS_INT128 |
399 | SANITIZER_INTERFACE_ATTRIBUTE |
400 | a128 __tsan_atomic128_compare_exchange_val(volatile a128 *a, a128 c, a128 v, |
401 | morder mo, morder fmo); |
402 | #endif |
403 | |
404 | SANITIZER_INTERFACE_ATTRIBUTE |
405 | void __tsan_atomic_thread_fence(morder mo); |
406 | SANITIZER_INTERFACE_ATTRIBUTE |
407 | void __tsan_atomic_signal_fence(morder mo); |
408 | |
409 | SANITIZER_INTERFACE_ATTRIBUTE |
410 | void __tsan_go_atomic32_load(ThreadState *thr, uptr cpc, uptr pc, u8 *a); |
411 | SANITIZER_INTERFACE_ATTRIBUTE |
412 | void __tsan_go_atomic64_load(ThreadState *thr, uptr cpc, uptr pc, u8 *a); |
413 | SANITIZER_INTERFACE_ATTRIBUTE |
414 | void __tsan_go_atomic32_store(ThreadState *thr, uptr cpc, uptr pc, u8 *a); |
415 | SANITIZER_INTERFACE_ATTRIBUTE |
416 | void __tsan_go_atomic64_store(ThreadState *thr, uptr cpc, uptr pc, u8 *a); |
417 | SANITIZER_INTERFACE_ATTRIBUTE |
418 | void __tsan_go_atomic32_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a); |
419 | SANITIZER_INTERFACE_ATTRIBUTE |
420 | void __tsan_go_atomic64_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a); |
421 | SANITIZER_INTERFACE_ATTRIBUTE |
422 | void __tsan_go_atomic32_fetch_and(ThreadState *thr, uptr cpc, uptr pc, u8 *a); |
423 | SANITIZER_INTERFACE_ATTRIBUTE |
424 | void __tsan_go_atomic64_fetch_and(ThreadState *thr, uptr cpc, uptr pc, u8 *a); |
425 | SANITIZER_INTERFACE_ATTRIBUTE |
426 | void __tsan_go_atomic32_fetch_or(ThreadState *thr, uptr cpc, uptr pc, u8 *a); |
427 | SANITIZER_INTERFACE_ATTRIBUTE |
428 | void __tsan_go_atomic64_fetch_or(ThreadState *thr, uptr cpc, uptr pc, u8 *a); |
429 | SANITIZER_INTERFACE_ATTRIBUTE |
430 | void __tsan_go_atomic32_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a); |
431 | SANITIZER_INTERFACE_ATTRIBUTE |
432 | void __tsan_go_atomic64_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a); |
433 | SANITIZER_INTERFACE_ATTRIBUTE |
434 | void __tsan_go_atomic32_compare_exchange(ThreadState *thr, uptr cpc, uptr pc, |
435 | u8 *a); |
436 | SANITIZER_INTERFACE_ATTRIBUTE |
437 | void __tsan_go_atomic64_compare_exchange(ThreadState *thr, uptr cpc, uptr pc, |
438 | u8 *a); |
439 | |
440 | } // extern "C" |
441 | |
442 | } // namespace __tsan |
443 | |
444 | #endif // TSAN_INTERFACE_H |
445 | |