tsan_interface.h 18 KB

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