17ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//===-- tsan_interface_atomic.h ---------------------------------*- C++ -*-===//
27ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
37ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//                     The LLVM Compiler Infrastructure
47ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
57ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// This file is distributed under the University of Illinois Open Source
67ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// License. See LICENSE.TXT for details.
77ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
87ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//===----------------------------------------------------------------------===//
97ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
107ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany// This file is a part of ThreadSanitizer (TSan), a race detector.
117ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Public interface header for TSan atomics.
137ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany//===----------------------------------------------------------------------===//
147ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#ifndef TSAN_INTERFACE_ATOMIC_H
157ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#define TSAN_INTERFACE_ATOMIC_H
167ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
177ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#ifdef __cplusplus
187ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyextern "C" {
197ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#endif
207ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
2163da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukovtypedef char     __tsan_atomic8;
2263da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukovtypedef short    __tsan_atomic16;  // NOLINT
2363da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukovtypedef int      __tsan_atomic32;
2463da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukovtypedef long     __tsan_atomic64;  // NOLINT
2562470003b9a51ec8235724d6cee3d5b1488a5a2eDmitry Vyukov#if defined(__SIZEOF_INT128__) \
2662470003b9a51ec8235724d6cee3d5b1488a5a2eDmitry Vyukov    || (__clang_major__ * 100 + __clang_minor__ >= 302)
279af645316cdb5e75033a7894e85009791ded7e4bDmitry Vyukov__extension__ typedef __int128 __tsan_atomic128;
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define __TSAN_HAS_INT128 1
29c11e1e0f1401a95d0803317c4cdb83be3938146aDmitry Vyukov#else
302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# define __TSAN_HAS_INT128 0
31c11e1e0f1401a95d0803317c4cdb83be3938146aDmitry Vyukov#endif
327ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
337ba89e5c1f7bd91a3c03d449b073c99c12f554ebDmitry Vyukov// Part of ABI, do not change.
347ba89e5c1f7bd91a3c03d449b073c99c12f554ebDmitry Vyukov// http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/atomic?view=markup
357ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanytypedef enum {
36c43f2721a8cdad652b188d0e40f9f091ce35a48fDmitry Vyukov  __tsan_memory_order_relaxed,
37c43f2721a8cdad652b188d0e40f9f091ce35a48fDmitry Vyukov  __tsan_memory_order_consume,
38c43f2721a8cdad652b188d0e40f9f091ce35a48fDmitry Vyukov  __tsan_memory_order_acquire,
39c43f2721a8cdad652b188d0e40f9f091ce35a48fDmitry Vyukov  __tsan_memory_order_release,
40c43f2721a8cdad652b188d0e40f9f091ce35a48fDmitry Vyukov  __tsan_memory_order_acq_rel,
41c43f2721a8cdad652b188d0e40f9f091ce35a48fDmitry Vyukov  __tsan_memory_order_seq_cst
427ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany} __tsan_memory_order;
437ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
447ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany__tsan_atomic8 __tsan_atomic8_load(const volatile __tsan_atomic8 *a,
452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo);
467ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany__tsan_atomic16 __tsan_atomic16_load(const volatile __tsan_atomic16 *a,
472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo);
487ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany__tsan_atomic32 __tsan_atomic32_load(const volatile __tsan_atomic32 *a,
492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo);
507ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany__tsan_atomic64 __tsan_atomic64_load(const volatile __tsan_atomic64 *a,
512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo);
522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __TSAN_HAS_INT128
5363da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukov__tsan_atomic128 __tsan_atomic128_load(const volatile __tsan_atomic128 *a,
542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo);
552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
567ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
577ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyvoid __tsan_atomic8_store(volatile __tsan_atomic8 *a, __tsan_atomic8 v,
582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo);
597ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyvoid __tsan_atomic16_store(volatile __tsan_atomic16 *a, __tsan_atomic16 v,
602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo);
617ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyvoid __tsan_atomic32_store(volatile __tsan_atomic32 *a, __tsan_atomic32 v,
622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo);
637ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyvoid __tsan_atomic64_store(volatile __tsan_atomic64 *a, __tsan_atomic64 v,
642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo);
652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __TSAN_HAS_INT128
6663da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukovvoid __tsan_atomic128_store(volatile __tsan_atomic128 *a, __tsan_atomic128 v,
672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo);
682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
697ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
70cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic8 __tsan_atomic8_exchange(volatile __tsan_atomic8 *a,
712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic8 v, __tsan_memory_order mo);
72cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic16 __tsan_atomic16_exchange(volatile __tsan_atomic16 *a,
732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic16 v, __tsan_memory_order mo);
747ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany__tsan_atomic32 __tsan_atomic32_exchange(volatile __tsan_atomic32 *a,
752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic32 v, __tsan_memory_order mo);
767ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany__tsan_atomic64 __tsan_atomic64_exchange(volatile __tsan_atomic64 *a,
772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic64 v, __tsan_memory_order mo);
782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __TSAN_HAS_INT128
7963da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukov__tsan_atomic128 __tsan_atomic128_exchange(volatile __tsan_atomic128 *a,
802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic128 v, __tsan_memory_order mo);
812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
827ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
83cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic8 __tsan_atomic8_fetch_add(volatile __tsan_atomic8 *a,
842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic8 v, __tsan_memory_order mo);
85cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic16 __tsan_atomic16_fetch_add(volatile __tsan_atomic16 *a,
862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic16 v, __tsan_memory_order mo);
877ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany__tsan_atomic32 __tsan_atomic32_fetch_add(volatile __tsan_atomic32 *a,
882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic32 v, __tsan_memory_order mo);
897ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany__tsan_atomic64 __tsan_atomic64_fetch_add(volatile __tsan_atomic64 *a,
902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic64 v, __tsan_memory_order mo);
912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __TSAN_HAS_INT128
9263da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukov__tsan_atomic128 __tsan_atomic128_fetch_add(volatile __tsan_atomic128 *a,
932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic128 v, __tsan_memory_order mo);
942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
957ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
96529cfa05a7dd0cdbe97172045430243181e43522Dmitry Vyukov__tsan_atomic8 __tsan_atomic8_fetch_sub(volatile __tsan_atomic8 *a,
972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic8 v, __tsan_memory_order mo);
98529cfa05a7dd0cdbe97172045430243181e43522Dmitry Vyukov__tsan_atomic16 __tsan_atomic16_fetch_sub(volatile __tsan_atomic16 *a,
992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic16 v, __tsan_memory_order mo);
100529cfa05a7dd0cdbe97172045430243181e43522Dmitry Vyukov__tsan_atomic32 __tsan_atomic32_fetch_sub(volatile __tsan_atomic32 *a,
1012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic32 v, __tsan_memory_order mo);
102529cfa05a7dd0cdbe97172045430243181e43522Dmitry Vyukov__tsan_atomic64 __tsan_atomic64_fetch_sub(volatile __tsan_atomic64 *a,
1032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic64 v, __tsan_memory_order mo);
1042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __TSAN_HAS_INT128
10563da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukov__tsan_atomic128 __tsan_atomic128_fetch_sub(volatile __tsan_atomic128 *a,
1062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic128 v, __tsan_memory_order mo);
1072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
108529cfa05a7dd0cdbe97172045430243181e43522Dmitry Vyukov
109cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic8 __tsan_atomic8_fetch_and(volatile __tsan_atomic8 *a,
1102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic8 v, __tsan_memory_order mo);
111cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic16 __tsan_atomic16_fetch_and(volatile __tsan_atomic16 *a,
1122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic16 v, __tsan_memory_order mo);
113cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic32 __tsan_atomic32_fetch_and(volatile __tsan_atomic32 *a,
1142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic32 v, __tsan_memory_order mo);
115cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic64 __tsan_atomic64_fetch_and(volatile __tsan_atomic64 *a,
1162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic64 v, __tsan_memory_order mo);
1172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __TSAN_HAS_INT128
11863da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukov__tsan_atomic128 __tsan_atomic128_fetch_and(volatile __tsan_atomic128 *a,
1192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic128 v, __tsan_memory_order mo);
1202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
121cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov
122cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic8 __tsan_atomic8_fetch_or(volatile __tsan_atomic8 *a,
1232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic8 v, __tsan_memory_order mo);
124cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic16 __tsan_atomic16_fetch_or(volatile __tsan_atomic16 *a,
1252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic16 v, __tsan_memory_order mo);
126cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic32 __tsan_atomic32_fetch_or(volatile __tsan_atomic32 *a,
1272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic32 v, __tsan_memory_order mo);
128cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic64 __tsan_atomic64_fetch_or(volatile __tsan_atomic64 *a,
1292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic64 v, __tsan_memory_order mo);
1302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __TSAN_HAS_INT128
13163da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukov__tsan_atomic128 __tsan_atomic128_fetch_or(volatile __tsan_atomic128 *a,
1322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic128 v, __tsan_memory_order mo);
1332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
134cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov
135cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic8 __tsan_atomic8_fetch_xor(volatile __tsan_atomic8 *a,
1362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic8 v, __tsan_memory_order mo);
137cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic16 __tsan_atomic16_fetch_xor(volatile __tsan_atomic16 *a,
1382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic16 v, __tsan_memory_order mo);
139cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic32 __tsan_atomic32_fetch_xor(volatile __tsan_atomic32 *a,
1402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic32 v, __tsan_memory_order mo);
141cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov__tsan_atomic64 __tsan_atomic64_fetch_xor(volatile __tsan_atomic64 *a,
1422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic64 v, __tsan_memory_order mo);
1432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __TSAN_HAS_INT128
14463da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukov__tsan_atomic128 __tsan_atomic128_fetch_xor(volatile __tsan_atomic128 *a,
1452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic128 v, __tsan_memory_order mo);
1462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
147cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov
14802b45d2aec154cb392cd6eb85e8dd16ed255351fDmitry Vyukov__tsan_atomic8 __tsan_atomic8_fetch_nand(volatile __tsan_atomic8 *a,
1492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic8 v, __tsan_memory_order mo);
15002b45d2aec154cb392cd6eb85e8dd16ed255351fDmitry Vyukov__tsan_atomic16 __tsan_atomic16_fetch_nand(volatile __tsan_atomic16 *a,
1512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic16 v, __tsan_memory_order mo);
15202b45d2aec154cb392cd6eb85e8dd16ed255351fDmitry Vyukov__tsan_atomic32 __tsan_atomic32_fetch_nand(volatile __tsan_atomic32 *a,
1532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic32 v, __tsan_memory_order mo);
15402b45d2aec154cb392cd6eb85e8dd16ed255351fDmitry Vyukov__tsan_atomic64 __tsan_atomic64_fetch_nand(volatile __tsan_atomic64 *a,
1552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic64 v, __tsan_memory_order mo);
1562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __TSAN_HAS_INT128
15763da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukov__tsan_atomic128 __tsan_atomic128_fetch_nand(volatile __tsan_atomic128 *a,
1582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_atomic128 v, __tsan_memory_order mo);
1592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
16002b45d2aec154cb392cd6eb85e8dd16ed255351fDmitry Vyukov
161cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukovint __tsan_atomic8_compare_exchange_weak(volatile __tsan_atomic8 *a,
162fc575e52636c803262fc24bacf63a95f731b1314Dmitry Vyukov    __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo,
1632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order fail_mo);
164cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukovint __tsan_atomic16_compare_exchange_weak(volatile __tsan_atomic16 *a,
165fc575e52636c803262fc24bacf63a95f731b1314Dmitry Vyukov    __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo,
1662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order fail_mo);
167cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukovint __tsan_atomic32_compare_exchange_weak(volatile __tsan_atomic32 *a,
168fc575e52636c803262fc24bacf63a95f731b1314Dmitry Vyukov    __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo,
1692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order fail_mo);
170cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukovint __tsan_atomic64_compare_exchange_weak(volatile __tsan_atomic64 *a,
171fc575e52636c803262fc24bacf63a95f731b1314Dmitry Vyukov    __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo,
1722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order fail_mo);
1732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __TSAN_HAS_INT128
17463da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukovint __tsan_atomic128_compare_exchange_weak(volatile __tsan_atomic128 *a,
17563da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukov    __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo,
1762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order fail_mo);
1772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
178cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukov
179cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukovint __tsan_atomic8_compare_exchange_strong(volatile __tsan_atomic8 *a,
180fc575e52636c803262fc24bacf63a95f731b1314Dmitry Vyukov    __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo,
1812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order fail_mo);
182cdfb33a69a0c96c6912036ad85224972db3a7e7dDmitry Vyukovint __tsan_atomic16_compare_exchange_strong(volatile __tsan_atomic16 *a,
183fc575e52636c803262fc24bacf63a95f731b1314Dmitry Vyukov    __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo,
1842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order fail_mo);
1857ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyint __tsan_atomic32_compare_exchange_strong(volatile __tsan_atomic32 *a,
186fc575e52636c803262fc24bacf63a95f731b1314Dmitry Vyukov    __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo,
1872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order fail_mo);
1887ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryanyint __tsan_atomic64_compare_exchange_strong(volatile __tsan_atomic64 *a,
189fc575e52636c803262fc24bacf63a95f731b1314Dmitry Vyukov    __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo,
1902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order fail_mo);
1912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __TSAN_HAS_INT128
19263da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukovint __tsan_atomic128_compare_exchange_strong(volatile __tsan_atomic128 *a,
19363da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukov    __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo,
1942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order fail_mo);
1952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
1967ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
197e337bf303dde9258bc7e2c87722a270fed96460bDmitry Vyukov__tsan_atomic8 __tsan_atomic8_compare_exchange_val(
198e337bf303dde9258bc7e2c87722a270fed96460bDmitry Vyukov    volatile __tsan_atomic8 *a, __tsan_atomic8 c, __tsan_atomic8 v,
1992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo, __tsan_memory_order fail_mo);
200e337bf303dde9258bc7e2c87722a270fed96460bDmitry Vyukov__tsan_atomic16 __tsan_atomic16_compare_exchange_val(
201e337bf303dde9258bc7e2c87722a270fed96460bDmitry Vyukov    volatile __tsan_atomic16 *a, __tsan_atomic16 c, __tsan_atomic16 v,
2022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo, __tsan_memory_order fail_mo);
203e337bf303dde9258bc7e2c87722a270fed96460bDmitry Vyukov__tsan_atomic32 __tsan_atomic32_compare_exchange_val(
204e337bf303dde9258bc7e2c87722a270fed96460bDmitry Vyukov    volatile __tsan_atomic32 *a, __tsan_atomic32 c, __tsan_atomic32 v,
2052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo, __tsan_memory_order fail_mo);
206e337bf303dde9258bc7e2c87722a270fed96460bDmitry Vyukov__tsan_atomic64 __tsan_atomic64_compare_exchange_val(
207e337bf303dde9258bc7e2c87722a270fed96460bDmitry Vyukov    volatile __tsan_atomic64 *a, __tsan_atomic64 c, __tsan_atomic64 v,
2082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo, __tsan_memory_order fail_mo);
2092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if __TSAN_HAS_INT128
21063da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukov__tsan_atomic128 __tsan_atomic128_compare_exchange_val(
21163da509a995a3cac9bf5495b5cb94c527ff96ce1Dmitry Vyukov    volatile __tsan_atomic128 *a, __tsan_atomic128 c, __tsan_atomic128 v,
2122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    __tsan_memory_order mo, __tsan_memory_order fail_mo);
2132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif
214e337bf303dde9258bc7e2c87722a270fed96460bDmitry Vyukov
2152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __tsan_atomic_thread_fence(__tsan_memory_order mo);
2162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesvoid __tsan_atomic_signal_fence(__tsan_memory_order mo);
2177ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
2187ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#ifdef __cplusplus
2197ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany}  // extern "C"
2207ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany#endif
2217ac41484ea322e0ea5774df681660269f5dc321eKostya Serebryany
2222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif  // TSAN_INTERFACE_ATOMIC_H
223