brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 257c457 Raw
99 lines · c
1//===-- sanitizer_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/AddressSanitizer runtime.10//11//===----------------------------------------------------------------------===//12 13#ifndef SANITIZER_ATOMIC_H14#define SANITIZER_ATOMIC_H15 16#include "sanitizer_internal_defs.h"17 18namespace __sanitizer {19 20enum memory_order {21// If the __atomic atomic builtins are supported (Clang/GCC), use the22// compiler provided macro values so that we can map the atomic operations23// to __atomic_* directly.24#ifdef __ATOMIC_SEQ_CST25  memory_order_relaxed = __ATOMIC_RELAXED,26  memory_order_consume = __ATOMIC_CONSUME,27  memory_order_acquire = __ATOMIC_ACQUIRE,28  memory_order_release = __ATOMIC_RELEASE,29  memory_order_acq_rel = __ATOMIC_ACQ_REL,30  memory_order_seq_cst = __ATOMIC_SEQ_CST31#else32  memory_order_relaxed = 1 << 0,33  memory_order_consume = 1 << 1,34  memory_order_acquire = 1 << 2,35  memory_order_release = 1 << 3,36  memory_order_acq_rel = 1 << 4,37  memory_order_seq_cst = 1 << 538#endif39};40 41struct atomic_uint8_t {42  typedef u8 Type;43  volatile Type val_dont_use;44};45 46struct atomic_uint16_t {47  typedef u16 Type;48  volatile Type val_dont_use;49};50 51struct atomic_sint32_t {52  typedef s32 Type;53  volatile Type val_dont_use;54};55 56struct atomic_uint32_t {57  typedef u32 Type;58  volatile Type val_dont_use;59};60 61struct atomic_uint64_t {62  typedef u64 Type;63  // On 32-bit platforms u64 is not necessary aligned on 8 bytes.64  alignas(8) volatile Type val_dont_use;65};66 67struct atomic_uintptr_t {68  typedef uptr Type;69  volatile Type val_dont_use;70};71 72}  // namespace __sanitizer73 74#if defined(__clang__) || defined(__GNUC__)75# include "sanitizer_atomic_clang.h"76#elif defined(_MSC_VER)77# include "sanitizer_atomic_msvc.h"78#else79# error "Unsupported compiler"80#endif81 82namespace __sanitizer {83 84// Clutter-reducing helpers.85 86template<typename T>87inline typename T::Type atomic_load_relaxed(const volatile T *a) {88  return atomic_load(a, memory_order_relaxed);89}90 91template<typename T>92inline void atomic_store_relaxed(volatile T *a, typename T::Type v) {93  atomic_store(a, v, memory_order_relaxed);94}95 96}  // namespace __sanitizer97 98#endif  // SANITIZER_ATOMIC_H99