blob: 5352d56679f7744e7fccc62b37c02a5d585133a5 [file] [log] [blame]
Kostya Serebryany4ad375f2012-05-10 13:48:04 +00001//===-- tsan_interface_atomic.h ---------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file is a part of ThreadSanitizer (TSan), a race detector.
11//
12//===----------------------------------------------------------------------===//
13#ifndef TSAN_INTERFACE_ATOMIC_H
14#define TSAN_INTERFACE_ATOMIC_H
15
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000016#ifndef INTERFACE_ATTRIBUTE
17# define INTERFACE_ATTRIBUTE __attribute__((visibility("default")))
18#endif
19
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000020#ifdef __cplusplus
21extern "C" {
22#endif
23
Dmitry Vyukov59d58662012-11-27 07:41:27 +000024typedef char __tsan_atomic8;
25typedef short __tsan_atomic16; // NOLINT
26typedef int __tsan_atomic32;
27typedef long __tsan_atomic64; // NOLINT
Dmitry Vyukov69a071d2012-11-27 09:35:44 +000028
Dmitry Vyukovec8da992012-11-27 12:51:16 +000029#if defined(__SIZEOF_INT128__) \
30 || (__clang_major__ * 100 + __clang_minor__ >= 302)
Dmitry Vyukov12ae8892012-12-13 15:26:04 +000031__extension__ typedef __int128 __tsan_atomic128;
Dmitry Vyukov69a071d2012-11-27 09:35:44 +000032#define __TSAN_HAS_INT128 1
33#else
34typedef char __tsan_atomic128;
35#define __TSAN_HAS_INT128 0
36#endif
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000037
Dmitry Vyukovbe687832012-10-03 13:00:13 +000038// Part of ABI, do not change.
39// http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/atomic?view=markup
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000040typedef enum {
Dmitry Vyukov805006b2012-11-09 14:11:51 +000041 __tsan_memory_order_relaxed,
42 __tsan_memory_order_consume,
43 __tsan_memory_order_acquire,
44 __tsan_memory_order_release,
45 __tsan_memory_order_acq_rel,
46 __tsan_memory_order_seq_cst
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000047} __tsan_memory_order;
48
49__tsan_atomic8 __tsan_atomic8_load(const volatile __tsan_atomic8 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000050 __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000051__tsan_atomic16 __tsan_atomic16_load(const volatile __tsan_atomic16 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000052 __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000053__tsan_atomic32 __tsan_atomic32_load(const volatile __tsan_atomic32 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000054 __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000055__tsan_atomic64 __tsan_atomic64_load(const volatile __tsan_atomic64 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000056 __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov59d58662012-11-27 07:41:27 +000057__tsan_atomic128 __tsan_atomic128_load(const volatile __tsan_atomic128 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000058 __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000059
60void __tsan_atomic8_store(volatile __tsan_atomic8 *a, __tsan_atomic8 v,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000061 __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000062void __tsan_atomic16_store(volatile __tsan_atomic16 *a, __tsan_atomic16 v,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000063 __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000064void __tsan_atomic32_store(volatile __tsan_atomic32 *a, __tsan_atomic32 v,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000065 __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000066void __tsan_atomic64_store(volatile __tsan_atomic64 *a, __tsan_atomic64 v,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000067 __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov59d58662012-11-27 07:41:27 +000068void __tsan_atomic128_store(volatile __tsan_atomic128 *a, __tsan_atomic128 v,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000069 __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000070
Dmitry Vyukov572c5b22012-05-14 15:33:00 +000071__tsan_atomic8 __tsan_atomic8_exchange(volatile __tsan_atomic8 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000072 __tsan_atomic8 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +000073__tsan_atomic16 __tsan_atomic16_exchange(volatile __tsan_atomic16 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000074 __tsan_atomic16 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000075__tsan_atomic32 __tsan_atomic32_exchange(volatile __tsan_atomic32 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000076 __tsan_atomic32 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000077__tsan_atomic64 __tsan_atomic64_exchange(volatile __tsan_atomic64 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000078 __tsan_atomic64 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov59d58662012-11-27 07:41:27 +000079__tsan_atomic128 __tsan_atomic128_exchange(volatile __tsan_atomic128 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000080 __tsan_atomic128 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000081
Dmitry Vyukov572c5b22012-05-14 15:33:00 +000082__tsan_atomic8 __tsan_atomic8_fetch_add(volatile __tsan_atomic8 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000083 __tsan_atomic8 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +000084__tsan_atomic16 __tsan_atomic16_fetch_add(volatile __tsan_atomic16 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000085 __tsan_atomic16 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000086__tsan_atomic32 __tsan_atomic32_fetch_add(volatile __tsan_atomic32 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000087 __tsan_atomic32 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000088__tsan_atomic64 __tsan_atomic64_fetch_add(volatile __tsan_atomic64 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000089 __tsan_atomic64 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov59d58662012-11-27 07:41:27 +000090__tsan_atomic128 __tsan_atomic128_fetch_add(volatile __tsan_atomic128 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000091 __tsan_atomic128 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +000092
Dmitry Vyukovb96a7b52012-10-04 10:08:23 +000093__tsan_atomic8 __tsan_atomic8_fetch_sub(volatile __tsan_atomic8 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000094 __tsan_atomic8 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukovb96a7b52012-10-04 10:08:23 +000095__tsan_atomic16 __tsan_atomic16_fetch_sub(volatile __tsan_atomic16 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000096 __tsan_atomic16 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukovb96a7b52012-10-04 10:08:23 +000097__tsan_atomic32 __tsan_atomic32_fetch_sub(volatile __tsan_atomic32 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +000098 __tsan_atomic32 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukovb96a7b52012-10-04 10:08:23 +000099__tsan_atomic64 __tsan_atomic64_fetch_sub(volatile __tsan_atomic64 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000100 __tsan_atomic64 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov59d58662012-11-27 07:41:27 +0000101__tsan_atomic128 __tsan_atomic128_fetch_sub(volatile __tsan_atomic128 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000102 __tsan_atomic128 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukovb96a7b52012-10-04 10:08:23 +0000103
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000104__tsan_atomic8 __tsan_atomic8_fetch_and(volatile __tsan_atomic8 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000105 __tsan_atomic8 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000106__tsan_atomic16 __tsan_atomic16_fetch_and(volatile __tsan_atomic16 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000107 __tsan_atomic16 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000108__tsan_atomic32 __tsan_atomic32_fetch_and(volatile __tsan_atomic32 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000109 __tsan_atomic32 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000110__tsan_atomic64 __tsan_atomic64_fetch_and(volatile __tsan_atomic64 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000111 __tsan_atomic64 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov59d58662012-11-27 07:41:27 +0000112__tsan_atomic128 __tsan_atomic128_fetch_and(volatile __tsan_atomic128 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000113 __tsan_atomic128 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000114
115__tsan_atomic8 __tsan_atomic8_fetch_or(volatile __tsan_atomic8 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000116 __tsan_atomic8 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000117__tsan_atomic16 __tsan_atomic16_fetch_or(volatile __tsan_atomic16 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000118 __tsan_atomic16 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000119__tsan_atomic32 __tsan_atomic32_fetch_or(volatile __tsan_atomic32 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000120 __tsan_atomic32 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000121__tsan_atomic64 __tsan_atomic64_fetch_or(volatile __tsan_atomic64 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000122 __tsan_atomic64 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov59d58662012-11-27 07:41:27 +0000123__tsan_atomic128 __tsan_atomic128_fetch_or(volatile __tsan_atomic128 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000124 __tsan_atomic128 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000125
126__tsan_atomic8 __tsan_atomic8_fetch_xor(volatile __tsan_atomic8 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000127 __tsan_atomic8 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000128__tsan_atomic16 __tsan_atomic16_fetch_xor(volatile __tsan_atomic16 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000129 __tsan_atomic16 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000130__tsan_atomic32 __tsan_atomic32_fetch_xor(volatile __tsan_atomic32 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000131 __tsan_atomic32 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000132__tsan_atomic64 __tsan_atomic64_fetch_xor(volatile __tsan_atomic64 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000133 __tsan_atomic64 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov59d58662012-11-27 07:41:27 +0000134__tsan_atomic128 __tsan_atomic128_fetch_xor(volatile __tsan_atomic128 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000135 __tsan_atomic128 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000136
Dmitry Vyukov3b450122012-11-26 09:42:56 +0000137__tsan_atomic8 __tsan_atomic8_fetch_nand(volatile __tsan_atomic8 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000138 __tsan_atomic8 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov3b450122012-11-26 09:42:56 +0000139__tsan_atomic16 __tsan_atomic16_fetch_nand(volatile __tsan_atomic16 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000140 __tsan_atomic16 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov3b450122012-11-26 09:42:56 +0000141__tsan_atomic32 __tsan_atomic32_fetch_nand(volatile __tsan_atomic32 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000142 __tsan_atomic32 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov3b450122012-11-26 09:42:56 +0000143__tsan_atomic64 __tsan_atomic64_fetch_nand(volatile __tsan_atomic64 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000144 __tsan_atomic64 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov59d58662012-11-27 07:41:27 +0000145__tsan_atomic128 __tsan_atomic128_fetch_nand(volatile __tsan_atomic128 *a,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000146 __tsan_atomic128 v, __tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov3b450122012-11-26 09:42:56 +0000147
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000148int __tsan_atomic8_compare_exchange_weak(volatile __tsan_atomic8 *a,
Dmitry Vyukov195eda92012-11-23 15:51:45 +0000149 __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000150 __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000151int __tsan_atomic16_compare_exchange_weak(volatile __tsan_atomic16 *a,
Dmitry Vyukov195eda92012-11-23 15:51:45 +0000152 __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000153 __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000154int __tsan_atomic32_compare_exchange_weak(volatile __tsan_atomic32 *a,
Dmitry Vyukov195eda92012-11-23 15:51:45 +0000155 __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000156 __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000157int __tsan_atomic64_compare_exchange_weak(volatile __tsan_atomic64 *a,
Dmitry Vyukov195eda92012-11-23 15:51:45 +0000158 __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000159 __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov59d58662012-11-27 07:41:27 +0000160int __tsan_atomic128_compare_exchange_weak(volatile __tsan_atomic128 *a,
161 __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000162 __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000163
164int __tsan_atomic8_compare_exchange_strong(volatile __tsan_atomic8 *a,
Dmitry Vyukov195eda92012-11-23 15:51:45 +0000165 __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000166 __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov572c5b22012-05-14 15:33:00 +0000167int __tsan_atomic16_compare_exchange_strong(volatile __tsan_atomic16 *a,
Dmitry Vyukov195eda92012-11-23 15:51:45 +0000168 __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000169 __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000170int __tsan_atomic32_compare_exchange_strong(volatile __tsan_atomic32 *a,
Dmitry Vyukov195eda92012-11-23 15:51:45 +0000171 __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000172 __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000173int __tsan_atomic64_compare_exchange_strong(volatile __tsan_atomic64 *a,
Dmitry Vyukov195eda92012-11-23 15:51:45 +0000174 __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000175 __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov59d58662012-11-27 07:41:27 +0000176int __tsan_atomic128_compare_exchange_strong(volatile __tsan_atomic128 *a,
177 __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000178 __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000179
Dmitry Vyukov4e5f72d2012-11-09 12:54:37 +0000180__tsan_atomic8 __tsan_atomic8_compare_exchange_val(
181 volatile __tsan_atomic8 *a, __tsan_atomic8 c, __tsan_atomic8 v,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000182 __tsan_memory_order mo, __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov4e5f72d2012-11-09 12:54:37 +0000183__tsan_atomic16 __tsan_atomic16_compare_exchange_val(
184 volatile __tsan_atomic16 *a, __tsan_atomic16 c, __tsan_atomic16 v,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000185 __tsan_memory_order mo, __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov4e5f72d2012-11-09 12:54:37 +0000186__tsan_atomic32 __tsan_atomic32_compare_exchange_val(
187 volatile __tsan_atomic32 *a, __tsan_atomic32 c, __tsan_atomic32 v,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000188 __tsan_memory_order mo, __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov4e5f72d2012-11-09 12:54:37 +0000189__tsan_atomic64 __tsan_atomic64_compare_exchange_val(
190 volatile __tsan_atomic64 *a, __tsan_atomic64 c, __tsan_atomic64 v,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000191 __tsan_memory_order mo, __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov59d58662012-11-27 07:41:27 +0000192__tsan_atomic128 __tsan_atomic128_compare_exchange_val(
193 volatile __tsan_atomic128 *a, __tsan_atomic128 c, __tsan_atomic128 v,
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000194 __tsan_memory_order mo, __tsan_memory_order fail_mo) INTERFACE_ATTRIBUTE;
Dmitry Vyukov4e5f72d2012-11-09 12:54:37 +0000195
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000196void __tsan_atomic_thread_fence(__tsan_memory_order mo) INTERFACE_ATTRIBUTE;
197void __tsan_atomic_signal_fence(__tsan_memory_order mo) INTERFACE_ATTRIBUTE;
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000198
199#ifdef __cplusplus
200} // extern "C"
201#endif
202
Dmitry Vyukov01ea6532012-12-04 14:01:21 +0000203#undef INTERFACE_ATTRIBUTE
204
Kostya Serebryany4ad375f2012-05-10 13:48:04 +0000205#endif // #ifndef TSAN_INTERFACE_ATOMIC_H