1//===-- thread_annotations.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#ifndef SCUDO_THREAD_ANNOTATIONS_
10#define SCUDO_THREAD_ANNOTATIONS_
11
12// Enable thread safety attributes only with clang.
13// The attributes can be safely ignored when compiling with other compilers.
14#if defined(__clang__)
15#define THREAD_ANNOTATION_ATTRIBUTE_(x) __attribute__((x))
16#else
17#define THREAD_ANNOTATION_ATTRIBUTE_(x) // no-op
18#endif
19
20#define CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE_(capability(x))
21
22#define SCOPED_CAPABILITY THREAD_ANNOTATION_ATTRIBUTE_(scoped_lockable)
23
24#define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE_(guarded_by(x))
25
26#define PT_GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE_(pt_guarded_by(x))
27
28#define ACQUIRED_BEFORE(...) \
29 THREAD_ANNOTATION_ATTRIBUTE_(acquired_before(__VA_ARGS__))
30
31#define ACQUIRED_AFTER(...) \
32 THREAD_ANNOTATION_ATTRIBUTE_(acquired_after(__VA_ARGS__))
33
34#define REQUIRES(...) \
35 THREAD_ANNOTATION_ATTRIBUTE_(requires_capability(__VA_ARGS__))
36
37#define REQUIRES_SHARED(...) \
38 THREAD_ANNOTATION_ATTRIBUTE_(requires_shared_capability(__VA_ARGS__))
39
40#define ACQUIRE(...) \
41 THREAD_ANNOTATION_ATTRIBUTE_(acquire_capability(__VA_ARGS__))
42
43#define ACQUIRE_SHARED(...) \
44 THREAD_ANNOTATION_ATTRIBUTE_(acquire_shared_capability(__VA_ARGS__))
45
46#define RELEASE(...) \
47 THREAD_ANNOTATION_ATTRIBUTE_(release_capability(__VA_ARGS__))
48
49#define RELEASE_SHARED(...) \
50 THREAD_ANNOTATION_ATTRIBUTE_(release_shared_capability(__VA_ARGS__))
51
52#define TRY_ACQUIRE(...) \
53 THREAD_ANNOTATION_ATTRIBUTE_(try_acquire_capability(__VA_ARGS__))
54
55#define TRY_ACQUIRE_SHARED(...) \
56 THREAD_ANNOTATION_ATTRIBUTE_(try_acquire_shared_capability(__VA_ARGS__))
57
58#define EXCLUDES(...) THREAD_ANNOTATION_ATTRIBUTE_(locks_excluded(__VA_ARGS__))
59
60#define ASSERT_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE_(assert_capability(x))
61
62#define ASSERT_SHARED_CAPABILITY(x) \
63 THREAD_ANNOTATION_ATTRIBUTE_(assert_shared_capability(x))
64
65#define RETURN_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE_(lock_returned(x))
66
67#define NO_THREAD_SAFETY_ANALYSIS \
68 THREAD_ANNOTATION_ATTRIBUTE_(no_thread_safety_analysis)
69
70#endif // SCUDO_THREAD_ANNOTATIONS_
71