xref: /freebsd-src/contrib/llvm-project/compiler-rt/lib/scudo/standalone/thread_annotations.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1*06c3fb27SDimitry Andric //===-- thread_annotations.h ------------------------------------*- C++ -*-===//
2*06c3fb27SDimitry Andric //
3*06c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*06c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*06c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*06c3fb27SDimitry Andric //
7*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
8*06c3fb27SDimitry Andric 
9*06c3fb27SDimitry Andric #ifndef SCUDO_THREAD_ANNOTATIONS_
10*06c3fb27SDimitry Andric #define SCUDO_THREAD_ANNOTATIONS_
11*06c3fb27SDimitry Andric 
12*06c3fb27SDimitry Andric // Enable thread safety attributes only with clang.
13*06c3fb27SDimitry Andric // The attributes can be safely ignored when compiling with other compilers.
14*06c3fb27SDimitry Andric #if defined(__clang__)
15*06c3fb27SDimitry Andric #define THREAD_ANNOTATION_ATTRIBUTE_(x) __attribute__((x))
16*06c3fb27SDimitry Andric #else
17*06c3fb27SDimitry Andric #define THREAD_ANNOTATION_ATTRIBUTE_(x) // no-op
18*06c3fb27SDimitry Andric #endif
19*06c3fb27SDimitry Andric 
20*06c3fb27SDimitry Andric #define CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE_(capability(x))
21*06c3fb27SDimitry Andric 
22*06c3fb27SDimitry Andric #define SCOPED_CAPABILITY THREAD_ANNOTATION_ATTRIBUTE_(scoped_lockable)
23*06c3fb27SDimitry Andric 
24*06c3fb27SDimitry Andric #define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE_(guarded_by(x))
25*06c3fb27SDimitry Andric 
26*06c3fb27SDimitry Andric #define PT_GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE_(pt_guarded_by(x))
27*06c3fb27SDimitry Andric 
28*06c3fb27SDimitry Andric #define ACQUIRED_BEFORE(...)                                                   \
29*06c3fb27SDimitry Andric   THREAD_ANNOTATION_ATTRIBUTE_(acquired_before(__VA_ARGS__))
30*06c3fb27SDimitry Andric 
31*06c3fb27SDimitry Andric #define ACQUIRED_AFTER(...)                                                    \
32*06c3fb27SDimitry Andric   THREAD_ANNOTATION_ATTRIBUTE_(acquired_after(__VA_ARGS__))
33*06c3fb27SDimitry Andric 
34*06c3fb27SDimitry Andric #define REQUIRES(...)                                                          \
35*06c3fb27SDimitry Andric   THREAD_ANNOTATION_ATTRIBUTE_(requires_capability(__VA_ARGS__))
36*06c3fb27SDimitry Andric 
37*06c3fb27SDimitry Andric #define REQUIRES_SHARED(...)                                                   \
38*06c3fb27SDimitry Andric   THREAD_ANNOTATION_ATTRIBUTE_(requires_shared_capability(__VA_ARGS__))
39*06c3fb27SDimitry Andric 
40*06c3fb27SDimitry Andric #define ACQUIRE(...)                                                           \
41*06c3fb27SDimitry Andric   THREAD_ANNOTATION_ATTRIBUTE_(acquire_capability(__VA_ARGS__))
42*06c3fb27SDimitry Andric 
43*06c3fb27SDimitry Andric #define ACQUIRE_SHARED(...)                                                    \
44*06c3fb27SDimitry Andric   THREAD_ANNOTATION_ATTRIBUTE_(acquire_shared_capability(__VA_ARGS__))
45*06c3fb27SDimitry Andric 
46*06c3fb27SDimitry Andric #define RELEASE(...)                                                           \
47*06c3fb27SDimitry Andric   THREAD_ANNOTATION_ATTRIBUTE_(release_capability(__VA_ARGS__))
48*06c3fb27SDimitry Andric 
49*06c3fb27SDimitry Andric #define RELEASE_SHARED(...)                                                    \
50*06c3fb27SDimitry Andric   THREAD_ANNOTATION_ATTRIBUTE_(release_shared_capability(__VA_ARGS__))
51*06c3fb27SDimitry Andric 
52*06c3fb27SDimitry Andric #define TRY_ACQUIRE(...)                                                       \
53*06c3fb27SDimitry Andric   THREAD_ANNOTATION_ATTRIBUTE_(try_acquire_capability(__VA_ARGS__))
54*06c3fb27SDimitry Andric 
55*06c3fb27SDimitry Andric #define TRY_ACQUIRE_SHARED(...)                                                \
56*06c3fb27SDimitry Andric   THREAD_ANNOTATION_ATTRIBUTE_(try_acquire_shared_capability(__VA_ARGS__))
57*06c3fb27SDimitry Andric 
58*06c3fb27SDimitry Andric #define EXCLUDES(...) THREAD_ANNOTATION_ATTRIBUTE_(locks_excluded(__VA_ARGS__))
59*06c3fb27SDimitry Andric 
60*06c3fb27SDimitry Andric #define ASSERT_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE_(assert_capability(x))
61*06c3fb27SDimitry Andric 
62*06c3fb27SDimitry Andric #define ASSERT_SHARED_CAPABILITY(x)                                            \
63*06c3fb27SDimitry Andric   THREAD_ANNOTATION_ATTRIBUTE_(assert_shared_capability(x))
64*06c3fb27SDimitry Andric 
65*06c3fb27SDimitry Andric #define RETURN_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE_(lock_returned(x))
66*06c3fb27SDimitry Andric 
67*06c3fb27SDimitry Andric #define NO_THREAD_SAFETY_ANALYSIS                                              \
68*06c3fb27SDimitry Andric   THREAD_ANNOTATION_ATTRIBUTE_(no_thread_safety_analysis)
69*06c3fb27SDimitry Andric 
70*06c3fb27SDimitry Andric #endif // SCUDO_THREAD_ANNOTATIONS_
71