1d89ec533Spatrick //===-- sanitizer_thread_safety.h -------------------------------*- C++ -*-===// 2d89ec533Spatrick // 3d89ec533Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4d89ec533Spatrick // See https://llvm.org/LICENSE.txt for license information. 5d89ec533Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d89ec533Spatrick // 7d89ec533Spatrick //===----------------------------------------------------------------------===// 8d89ec533Spatrick // 9d89ec533Spatrick // This file is shared between sanitizer tools. 10d89ec533Spatrick // 11d89ec533Spatrick // Wrappers around thread safety annotations. 12d89ec533Spatrick // https://clang.llvm.org/docs/ThreadSafetyAnalysis.html 13d89ec533Spatrick //===----------------------------------------------------------------------===// 14d89ec533Spatrick 15d89ec533Spatrick #ifndef SANITIZER_THREAD_SAFETY_H 16d89ec533Spatrick #define SANITIZER_THREAD_SAFETY_H 17d89ec533Spatrick 18d89ec533Spatrick #if defined(__clang__) 19*810390e3Srobert # define SANITIZER_THREAD_ANNOTATION(x) __attribute__((x)) 20d89ec533Spatrick #else 21*810390e3Srobert # define SANITIZER_THREAD_ANNOTATION(x) 22d89ec533Spatrick #endif 23d89ec533Spatrick 24*810390e3Srobert #define SANITIZER_MUTEX SANITIZER_THREAD_ANNOTATION(capability("mutex")) 25*810390e3Srobert #define SANITIZER_SCOPED_LOCK SANITIZER_THREAD_ANNOTATION(scoped_lockable) 26*810390e3Srobert #define SANITIZER_GUARDED_BY(x) SANITIZER_THREAD_ANNOTATION(guarded_by(x)) 27*810390e3Srobert #define SANITIZER_PT_GUARDED_BY(x) SANITIZER_THREAD_ANNOTATION(pt_guarded_by(x)) 28*810390e3Srobert #define SANITIZER_REQUIRES(...) \ 29*810390e3Srobert SANITIZER_THREAD_ANNOTATION(requires_capability(__VA_ARGS__)) 30*810390e3Srobert #define SANITIZER_REQUIRES_SHARED(...) \ 31*810390e3Srobert SANITIZER_THREAD_ANNOTATION(requires_shared_capability(__VA_ARGS__)) 32*810390e3Srobert #define SANITIZER_ACQUIRE(...) \ 33*810390e3Srobert SANITIZER_THREAD_ANNOTATION(acquire_capability(__VA_ARGS__)) 34*810390e3Srobert #define SANITIZER_ACQUIRE_SHARED(...) \ 35*810390e3Srobert SANITIZER_THREAD_ANNOTATION(acquire_shared_capability(__VA_ARGS__)) 36*810390e3Srobert #define SANITIZER_TRY_ACQUIRE(...) \ 37*810390e3Srobert SANITIZER_THREAD_ANNOTATION(try_acquire_capability(__VA_ARGS__)) 38*810390e3Srobert #define SANITIZER_RELEASE(...) \ 39*810390e3Srobert SANITIZER_THREAD_ANNOTATION(release_capability(__VA_ARGS__)) 40*810390e3Srobert #define SANITIZER_RELEASE_SHARED(...) \ 41*810390e3Srobert SANITIZER_THREAD_ANNOTATION(release_shared_capability(__VA_ARGS__)) 42*810390e3Srobert #define SANITIZER_EXCLUDES(...) \ 43*810390e3Srobert SANITIZER_THREAD_ANNOTATION(locks_excluded(__VA_ARGS__)) 44*810390e3Srobert #define SANITIZER_CHECK_LOCKED(...) \ 45*810390e3Srobert SANITIZER_THREAD_ANNOTATION(assert_capability(__VA_ARGS__)) 46*810390e3Srobert #define SANITIZER_NO_THREAD_SAFETY_ANALYSIS \ 47*810390e3Srobert SANITIZER_THREAD_ANNOTATION(no_thread_safety_analysis) 48d89ec533Spatrick 49d89ec533Spatrick #endif 50