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