tsan_interface.h 18 KB

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