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