diff --git a/include/sbi/sbi_visibility.h b/include/sbi/sbi_visibility.h index f900c445..993561ef 100644 --- a/include/sbi/sbi_visibility.h +++ b/include/sbi/sbi_visibility.h @@ -15,4 +15,21 @@ #pragma GCC visibility push(hidden) #endif +/* Thread Safety Analysis (TSA) annotations for use with clang -Wthread-safety */ +#if defined(__clang__) && __clang_major__ >= 19 +#define TSA_ATTR(x) __attribute__((x)) +#else +#define TSA_ATTR(x) +#endif + +#define CAPABILITY(x) TSA_ATTR(capability(x)) +#define GUARDED_BY(x) TSA_ATTR(guarded_by(x)) +#define PT_GUARDED_BY(x) TSA_ATTR(pt_guarded_by(x)) +#define ACQUIRE(...) TSA_ATTR(acquire_capability(__VA_ARGS__)) +#define RELEASE(...) TSA_ATTR(release_capability(__VA_ARGS__)) +#define MUST_HOLD(...) TSA_ATTR(requires_capability(__VA_ARGS__)) +#define MUST_NOT_HOLD(...) TSA_ATTR(locks_excluded(__VA_ARGS__)) +#define TRY_ACQUIRE(b, ...) TSA_ATTR(try_acquire_capability(b, __VA_ARGS__)) +#define NO_THREAD_SAFETY_ANALYSIS TSA_ATTR(no_thread_safety_analysis) + #endif