224 lines · c
1//===-- tsan_interface_atomic.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-exception6//7//===----------------------------------------------------------------------===//8//9// This file is a part of ThreadSanitizer (TSan), a race detector.10//11// Public interface header for TSan atomics.12//===----------------------------------------------------------------------===//13#ifndef TSAN_INTERFACE_ATOMIC_H14#define TSAN_INTERFACE_ATOMIC_H15 16#include <sanitizer/common_interface_defs.h>17 18#ifdef __cplusplus19extern "C" {20#endif21 22typedef char __tsan_atomic8;23typedef short __tsan_atomic16;24typedef int __tsan_atomic32;25typedef long __tsan_atomic64;26#if defined(__SIZEOF_INT128__) || \27 (__clang_major__ * 100 + __clang_minor__ >= 302)28__extension__ typedef __int128 __tsan_atomic128;29#define __TSAN_HAS_INT128 130#else31#define __TSAN_HAS_INT128 032#endif33 34// Part of ABI, do not change.35// https://github.com/llvm/llvm-project/blob/main/libcxx/include/atomic36typedef enum {37 __tsan_memory_order_relaxed,38 __tsan_memory_order_consume,39 __tsan_memory_order_acquire,40 __tsan_memory_order_release,41 __tsan_memory_order_acq_rel,42 __tsan_memory_order_seq_cst43} __tsan_memory_order;44 45__tsan_atomic8 SANITIZER_CDECL46__tsan_atomic8_load(const volatile __tsan_atomic8 *a, int mo);47__tsan_atomic16 SANITIZER_CDECL48__tsan_atomic16_load(const volatile __tsan_atomic16 *a, int mo);49__tsan_atomic32 SANITIZER_CDECL50__tsan_atomic32_load(const volatile __tsan_atomic32 *a, int mo);51__tsan_atomic64 SANITIZER_CDECL52__tsan_atomic64_load(const volatile __tsan_atomic64 *a, int mo);53#if __TSAN_HAS_INT12854__tsan_atomic128 SANITIZER_CDECL55__tsan_atomic128_load(const volatile __tsan_atomic128 *a, int mo);56#endif57 58void SANITIZER_CDECL __tsan_atomic8_store(volatile __tsan_atomic8 *a,59 __tsan_atomic8 v, int mo);60void SANITIZER_CDECL __tsan_atomic16_store(volatile __tsan_atomic16 *a,61 __tsan_atomic16 v, int mo);62void SANITIZER_CDECL __tsan_atomic32_store(volatile __tsan_atomic32 *a,63 __tsan_atomic32 v, int mo);64void SANITIZER_CDECL __tsan_atomic64_store(volatile __tsan_atomic64 *a,65 __tsan_atomic64 v, int mo);66#if __TSAN_HAS_INT12867void SANITIZER_CDECL __tsan_atomic128_store(volatile __tsan_atomic128 *a,68 __tsan_atomic128 v, int mo);69#endif70 71__tsan_atomic8 SANITIZER_CDECL72__tsan_atomic8_exchange(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);73__tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_exchange(74 volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);75__tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_exchange(76 volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);77__tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_exchange(78 volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);79#if __TSAN_HAS_INT12880__tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_exchange(81 volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);82#endif83 84__tsan_atomic8 SANITIZER_CDECL85__tsan_atomic8_fetch_add(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);86__tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_add(87 volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);88__tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_add(89 volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);90__tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_add(91 volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);92#if __TSAN_HAS_INT12893__tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_add(94 volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);95#endif96 97__tsan_atomic8 SANITIZER_CDECL98__tsan_atomic8_fetch_sub(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);99__tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_sub(100 volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);101__tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_sub(102 volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);103__tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_sub(104 volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);105#if __TSAN_HAS_INT128106__tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_sub(107 volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);108#endif109 110__tsan_atomic8 SANITIZER_CDECL111__tsan_atomic8_fetch_and(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);112__tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_and(113 volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);114__tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_and(115 volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);116__tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_and(117 volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);118#if __TSAN_HAS_INT128119__tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_and(120 volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);121#endif122 123__tsan_atomic8 SANITIZER_CDECL124__tsan_atomic8_fetch_or(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);125__tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_or(126 volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);127__tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_or(128 volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);129__tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_or(130 volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);131#if __TSAN_HAS_INT128132__tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_or(133 volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);134#endif135 136__tsan_atomic8 SANITIZER_CDECL137__tsan_atomic8_fetch_xor(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);138__tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_xor(139 volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);140__tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_xor(141 volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);142__tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_xor(143 volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);144#if __TSAN_HAS_INT128145__tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_xor(146 volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);147#endif148 149__tsan_atomic8 SANITIZER_CDECL150__tsan_atomic8_fetch_nand(volatile __tsan_atomic8 *a, __tsan_atomic8 v, int mo);151__tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_fetch_nand(152 volatile __tsan_atomic16 *a, __tsan_atomic16 v, int mo);153__tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_fetch_nand(154 volatile __tsan_atomic32 *a, __tsan_atomic32 v, int mo);155__tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_fetch_nand(156 volatile __tsan_atomic64 *a, __tsan_atomic64 v, int mo);157#if __TSAN_HAS_INT128158__tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_fetch_nand(159 volatile __tsan_atomic128 *a, __tsan_atomic128 v, int mo);160#endif161 162int SANITIZER_CDECL __tsan_atomic8_compare_exchange_weak(163 volatile __tsan_atomic8 *a, __tsan_atomic8 *c, __tsan_atomic8 v, int mo,164 int fail_mo);165int SANITIZER_CDECL __tsan_atomic16_compare_exchange_weak(166 volatile __tsan_atomic16 *a, __tsan_atomic16 *c, __tsan_atomic16 v, int mo,167 int fail_mo);168int SANITIZER_CDECL __tsan_atomic32_compare_exchange_weak(169 volatile __tsan_atomic32 *a, __tsan_atomic32 *c, __tsan_atomic32 v, int mo,170 int fail_mo);171int SANITIZER_CDECL __tsan_atomic64_compare_exchange_weak(172 volatile __tsan_atomic64 *a, __tsan_atomic64 *c, __tsan_atomic64 v, int mo,173 int fail_mo);174#if __TSAN_HAS_INT128175int SANITIZER_CDECL __tsan_atomic128_compare_exchange_weak(176 volatile __tsan_atomic128 *a, __tsan_atomic128 *c, __tsan_atomic128 v,177 int mo, int fail_mo);178#endif179 180int SANITIZER_CDECL __tsan_atomic8_compare_exchange_strong(181 volatile __tsan_atomic8 *a, __tsan_atomic8 *c, __tsan_atomic8 v, int mo,182 int fail_mo);183int SANITIZER_CDECL __tsan_atomic16_compare_exchange_strong(184 volatile __tsan_atomic16 *a, __tsan_atomic16 *c, __tsan_atomic16 v, int mo,185 int fail_mo);186int SANITIZER_CDECL __tsan_atomic32_compare_exchange_strong(187 volatile __tsan_atomic32 *a, __tsan_atomic32 *c, __tsan_atomic32 v, int mo,188 int fail_mo);189int SANITIZER_CDECL __tsan_atomic64_compare_exchange_strong(190 volatile __tsan_atomic64 *a, __tsan_atomic64 *c, __tsan_atomic64 v, int mo,191 int fail_mo);192#if __TSAN_HAS_INT128193int SANITIZER_CDECL __tsan_atomic128_compare_exchange_strong(194 volatile __tsan_atomic128 *a, __tsan_atomic128 *c, __tsan_atomic128 v,195 int mo, int fail_mo);196#endif197 198__tsan_atomic8 SANITIZER_CDECL __tsan_atomic8_compare_exchange_val(199 volatile __tsan_atomic8 *a, __tsan_atomic8 c, __tsan_atomic8 v, int mo,200 int fail_mo);201__tsan_atomic16 SANITIZER_CDECL __tsan_atomic16_compare_exchange_val(202 volatile __tsan_atomic16 *a, __tsan_atomic16 c, __tsan_atomic16 v, int mo,203 int fail_mo);204__tsan_atomic32 SANITIZER_CDECL __tsan_atomic32_compare_exchange_val(205 volatile __tsan_atomic32 *a, __tsan_atomic32 c, __tsan_atomic32 v, int mo,206 int fail_mo);207__tsan_atomic64 SANITIZER_CDECL __tsan_atomic64_compare_exchange_val(208 volatile __tsan_atomic64 *a, __tsan_atomic64 c, __tsan_atomic64 v, int mo,209 int fail_mo);210#if __TSAN_HAS_INT128211__tsan_atomic128 SANITIZER_CDECL __tsan_atomic128_compare_exchange_val(212 volatile __tsan_atomic128 *a, __tsan_atomic128 c, __tsan_atomic128 v,213 int mo, int fail_mo);214#endif215 216void SANITIZER_CDECL __tsan_atomic_thread_fence(int mo);217void SANITIZER_CDECL __tsan_atomic_signal_fence(int mo);218 219#ifdef __cplusplus220} // extern "C"221#endif222 223#endif // TSAN_INTERFACE_ATOMIC_H224