Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_atomic.h
35233 views
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-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file is a part of ThreadSanitizer/AddressSanitizer runtime.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#ifndef SANITIZER_ATOMIC_H
14
#define SANITIZER_ATOMIC_H
15
16
#include "sanitizer_internal_defs.h"
17
18
namespace __sanitizer {
19
20
enum memory_order {
21
// If the __atomic atomic builtins are supported (Clang/GCC), use the
22
// compiler provided macro values so that we can map the atomic operations
23
// to __atomic_* directly.
24
#ifdef __ATOMIC_SEQ_CST
25
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_CST
31
#else
32
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 << 5
38
#endif
39
};
40
41
struct atomic_uint8_t {
42
typedef u8 Type;
43
volatile Type val_dont_use;
44
};
45
46
struct atomic_uint16_t {
47
typedef u16 Type;
48
volatile Type val_dont_use;
49
};
50
51
struct atomic_sint32_t {
52
typedef s32 Type;
53
volatile Type val_dont_use;
54
};
55
56
struct atomic_uint32_t {
57
typedef u32 Type;
58
volatile Type val_dont_use;
59
};
60
61
struct 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
67
struct atomic_uintptr_t {
68
typedef uptr Type;
69
volatile Type val_dont_use;
70
};
71
72
} // namespace __sanitizer
73
74
#if defined(__clang__) || defined(__GNUC__)
75
# include "sanitizer_atomic_clang.h"
76
#elif defined(_MSC_VER)
77
# include "sanitizer_atomic_msvc.h"
78
#else
79
# error "Unsupported compiler"
80
#endif
81
82
namespace __sanitizer {
83
84
// Clutter-reducing helpers.
85
86
template<typename T>
87
inline typename T::Type atomic_load_relaxed(const volatile T *a) {
88
return atomic_load(a, memory_order_relaxed);
89
}
90
91
template<typename T>
92
inline void atomic_store_relaxed(volatile T *a, typename T::Type v) {
93
atomic_store(a, v, memory_order_relaxed);
94
}
95
96
} // namespace __sanitizer
97
98
#endif // SANITIZER_ATOMIC_H
99
100