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