1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors. 2*9356374aSAndroid Build Coastguard Worker // 3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*9356374aSAndroid Build Coastguard Worker // 7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*9356374aSAndroid Build Coastguard Worker // 9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*9356374aSAndroid Build Coastguard Worker // limitations under the License. 14*9356374aSAndroid Build Coastguard Worker 15*9356374aSAndroid Build Coastguard Worker // This file defines dynamic annotations for use with dynamic analysis tool 16*9356374aSAndroid Build Coastguard Worker // such as valgrind, PIN, etc. 17*9356374aSAndroid Build Coastguard Worker // 18*9356374aSAndroid Build Coastguard Worker // Dynamic annotation is a source code annotation that affects the generated 19*9356374aSAndroid Build Coastguard Worker // code (that is, the annotation is not a comment). Each such annotation is 20*9356374aSAndroid Build Coastguard Worker // attached to a particular instruction and/or to a particular object (address) 21*9356374aSAndroid Build Coastguard Worker // in the program. 22*9356374aSAndroid Build Coastguard Worker // 23*9356374aSAndroid Build Coastguard Worker // The annotations that should be used by users are macros in all upper-case 24*9356374aSAndroid Build Coastguard Worker // (e.g., ANNOTATE_THREAD_NAME). 25*9356374aSAndroid Build Coastguard Worker // 26*9356374aSAndroid Build Coastguard Worker // Actual implementation of these macros may differ depending on the dynamic 27*9356374aSAndroid Build Coastguard Worker // analysis tool being used. 28*9356374aSAndroid Build Coastguard Worker // 29*9356374aSAndroid Build Coastguard Worker // This file supports the following configurations: 30*9356374aSAndroid Build Coastguard Worker // - Dynamic Annotations enabled (with static thread-safety warnings disabled). 31*9356374aSAndroid Build Coastguard Worker // In this case, macros expand to functions implemented by Thread Sanitizer, 32*9356374aSAndroid Build Coastguard Worker // when building with TSan. When not provided an external implementation, 33*9356374aSAndroid Build Coastguard Worker // dynamic_annotations.cc provides no-op implementations. 34*9356374aSAndroid Build Coastguard Worker // 35*9356374aSAndroid Build Coastguard Worker // - Static Clang thread-safety warnings enabled. 36*9356374aSAndroid Build Coastguard Worker // When building with a Clang compiler that supports thread-safety warnings, 37*9356374aSAndroid Build Coastguard Worker // a subset of annotations can be statically-checked at compile-time. We 38*9356374aSAndroid Build Coastguard Worker // expand these macros to static-inline functions that can be analyzed for 39*9356374aSAndroid Build Coastguard Worker // thread-safety, but afterwards elided when building the final binary. 40*9356374aSAndroid Build Coastguard Worker // 41*9356374aSAndroid Build Coastguard Worker // - All annotations are disabled. 42*9356374aSAndroid Build Coastguard Worker // If neither Dynamic Annotations nor Clang thread-safety warnings are 43*9356374aSAndroid Build Coastguard Worker // enabled, then all annotation-macros expand to empty. 44*9356374aSAndroid Build Coastguard Worker 45*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_BASE_INTERNAL_DYNAMIC_ANNOTATIONS_H_ 46*9356374aSAndroid Build Coastguard Worker #define ABSL_BASE_INTERNAL_DYNAMIC_ANNOTATIONS_H_ 47*9356374aSAndroid Build Coastguard Worker 48*9356374aSAndroid Build Coastguard Worker #include <stddef.h> 49*9356374aSAndroid Build Coastguard Worker 50*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h" 51*9356374aSAndroid Build Coastguard Worker 52*9356374aSAndroid Build Coastguard Worker // ------------------------------------------------------------------------- 53*9356374aSAndroid Build Coastguard Worker // Decide which features are enabled 54*9356374aSAndroid Build Coastguard Worker 55*9356374aSAndroid Build Coastguard Worker #ifndef DYNAMIC_ANNOTATIONS_ENABLED 56*9356374aSAndroid Build Coastguard Worker #define DYNAMIC_ANNOTATIONS_ENABLED 0 57*9356374aSAndroid Build Coastguard Worker #endif 58*9356374aSAndroid Build Coastguard Worker 59*9356374aSAndroid Build Coastguard Worker #if defined(__clang__) && !defined(SWIG) 60*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED 1 61*9356374aSAndroid Build Coastguard Worker #endif 62*9356374aSAndroid Build Coastguard Worker 63*9356374aSAndroid Build Coastguard Worker #if DYNAMIC_ANNOTATIONS_ENABLED != 0 64*9356374aSAndroid Build Coastguard Worker 65*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED 1 66*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_READS_ANNOTATIONS_ENABLED 1 67*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_WRITES_ANNOTATIONS_ENABLED 1 68*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_ANNOTALYSIS_ENABLED 0 69*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_READS_WRITES_ANNOTATIONS_ENABLED 1 70*9356374aSAndroid Build Coastguard Worker 71*9356374aSAndroid Build Coastguard Worker #else 72*9356374aSAndroid Build Coastguard Worker 73*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED 0 74*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_READS_ANNOTATIONS_ENABLED 0 75*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_WRITES_ANNOTATIONS_ENABLED 0 76*9356374aSAndroid Build Coastguard Worker 77*9356374aSAndroid Build Coastguard Worker // Clang provides limited support for static thread-safety analysis through a 78*9356374aSAndroid Build Coastguard Worker // feature called Annotalysis. We configure macro-definitions according to 79*9356374aSAndroid Build Coastguard Worker // whether Annotalysis support is available. When running in opt-mode, GCC 80*9356374aSAndroid Build Coastguard Worker // will issue a warning, if these attributes are compiled. Only include them 81*9356374aSAndroid Build Coastguard Worker // when compiling using Clang. 82*9356374aSAndroid Build Coastguard Worker 83*9356374aSAndroid Build Coastguard Worker // ANNOTALYSIS_ENABLED == 1 when IGNORE_READ_ATTRIBUTE_ENABLED == 1 84*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_ANNOTALYSIS_ENABLED \ 85*9356374aSAndroid Build Coastguard Worker defined(ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED) 86*9356374aSAndroid Build Coastguard Worker // Read/write annotations are enabled in Annotalysis mode; disabled otherwise. 87*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_READS_WRITES_ANNOTATIONS_ENABLED \ 88*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_ANNOTALYSIS_ENABLED 89*9356374aSAndroid Build Coastguard Worker #endif 90*9356374aSAndroid Build Coastguard Worker 91*9356374aSAndroid Build Coastguard Worker // Memory annotations are also made available to LLVM's Memory Sanitizer 92*9356374aSAndroid Build Coastguard Worker #if defined(ABSL_HAVE_MEMORY_SANITIZER) && !defined(__native_client__) 93*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED 1 94*9356374aSAndroid Build Coastguard Worker #endif 95*9356374aSAndroid Build Coastguard Worker 96*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED 97*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED 0 98*9356374aSAndroid Build Coastguard Worker #endif 99*9356374aSAndroid Build Coastguard Worker 100*9356374aSAndroid Build Coastguard Worker #ifdef __cplusplus 101*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_BEGIN_EXTERN_C extern "C" { 102*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_END_EXTERN_C } // extern "C" 103*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_GLOBAL_SCOPED(F) ::F 104*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_STATIC_INLINE inline 105*9356374aSAndroid Build Coastguard Worker #else 106*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_BEGIN_EXTERN_C // empty 107*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_END_EXTERN_C // empty 108*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_GLOBAL_SCOPED(F) F 109*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_STATIC_INLINE static inline 110*9356374aSAndroid Build Coastguard Worker #endif 111*9356374aSAndroid Build Coastguard Worker 112*9356374aSAndroid Build Coastguard Worker // ------------------------------------------------------------------------- 113*9356374aSAndroid Build Coastguard Worker // Define race annotations. 114*9356374aSAndroid Build Coastguard Worker 115*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED == 1 116*9356374aSAndroid Build Coastguard Worker 117*9356374aSAndroid Build Coastguard Worker // ------------------------------------------------------------- 118*9356374aSAndroid Build Coastguard Worker // Annotations that suppress errors. It is usually better to express the 119*9356374aSAndroid Build Coastguard Worker // program's synchronization using the other annotations, but these can be used 120*9356374aSAndroid Build Coastguard Worker // when all else fails. 121*9356374aSAndroid Build Coastguard Worker 122*9356374aSAndroid Build Coastguard Worker // Report that we may have a benign race at `pointer`, with size 123*9356374aSAndroid Build Coastguard Worker // "sizeof(*(pointer))". `pointer` must be a non-void* pointer. Insert at the 124*9356374aSAndroid Build Coastguard Worker // point where `pointer` has been allocated, preferably close to the point 125*9356374aSAndroid Build Coastguard Worker // where the race happens. See also ANNOTATE_BENIGN_RACE_STATIC. 126*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_BENIGN_RACE(pointer, description) \ 127*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateBenignRaceSized) \ 128*9356374aSAndroid Build Coastguard Worker (__FILE__, __LINE__, pointer, sizeof(*(pointer)), description) 129*9356374aSAndroid Build Coastguard Worker 130*9356374aSAndroid Build Coastguard Worker // Same as ANNOTATE_BENIGN_RACE(`address`, `description`), but applies to 131*9356374aSAndroid Build Coastguard Worker // the memory range [`address`, `address`+`size`). 132*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_BENIGN_RACE_SIZED(address, size, description) \ 133*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateBenignRaceSized) \ 134*9356374aSAndroid Build Coastguard Worker (__FILE__, __LINE__, address, size, description) 135*9356374aSAndroid Build Coastguard Worker 136*9356374aSAndroid Build Coastguard Worker // Enable (`enable`!=0) or disable (`enable`==0) race detection for all threads. 137*9356374aSAndroid Build Coastguard Worker // This annotation could be useful if you want to skip expensive race analysis 138*9356374aSAndroid Build Coastguard Worker // during some period of program execution, e.g. during initialization. 139*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_ENABLE_RACE_DETECTION(enable) \ 140*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateEnableRaceDetection) \ 141*9356374aSAndroid Build Coastguard Worker (__FILE__, __LINE__, enable) 142*9356374aSAndroid Build Coastguard Worker 143*9356374aSAndroid Build Coastguard Worker // ------------------------------------------------------------- 144*9356374aSAndroid Build Coastguard Worker // Annotations useful for debugging. 145*9356374aSAndroid Build Coastguard Worker 146*9356374aSAndroid Build Coastguard Worker // Report the current thread `name` to a race detector. 147*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_THREAD_NAME(name) \ 148*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateThreadName)(__FILE__, __LINE__, name) 149*9356374aSAndroid Build Coastguard Worker 150*9356374aSAndroid Build Coastguard Worker // ------------------------------------------------------------- 151*9356374aSAndroid Build Coastguard Worker // Annotations useful when implementing locks. They are not normally needed by 152*9356374aSAndroid Build Coastguard Worker // modules that merely use locks. The `lock` argument is a pointer to the lock 153*9356374aSAndroid Build Coastguard Worker // object. 154*9356374aSAndroid Build Coastguard Worker 155*9356374aSAndroid Build Coastguard Worker // Report that a lock has been created at address `lock`. 156*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_RWLOCK_CREATE(lock) \ 157*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockCreate)(__FILE__, __LINE__, lock) 158*9356374aSAndroid Build Coastguard Worker 159*9356374aSAndroid Build Coastguard Worker // Report that a linker initialized lock has been created at address `lock`. 160*9356374aSAndroid Build Coastguard Worker #ifdef ABSL_HAVE_THREAD_SANITIZER 161*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_RWLOCK_CREATE_STATIC(lock) \ 162*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockCreateStatic) \ 163*9356374aSAndroid Build Coastguard Worker (__FILE__, __LINE__, lock) 164*9356374aSAndroid Build Coastguard Worker #else 165*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_RWLOCK_CREATE_STATIC(lock) ANNOTATE_RWLOCK_CREATE(lock) 166*9356374aSAndroid Build Coastguard Worker #endif 167*9356374aSAndroid Build Coastguard Worker 168*9356374aSAndroid Build Coastguard Worker // Report that the lock at address `lock` is about to be destroyed. 169*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_RWLOCK_DESTROY(lock) \ 170*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockDestroy)(__FILE__, __LINE__, lock) 171*9356374aSAndroid Build Coastguard Worker 172*9356374aSAndroid Build Coastguard Worker // Report that the lock at address `lock` has been acquired. 173*9356374aSAndroid Build Coastguard Worker // `is_w`=1 for writer lock, `is_w`=0 for reader lock. 174*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) \ 175*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockAcquired) \ 176*9356374aSAndroid Build Coastguard Worker (__FILE__, __LINE__, lock, is_w) 177*9356374aSAndroid Build Coastguard Worker 178*9356374aSAndroid Build Coastguard Worker // Report that the lock at address `lock` is about to be released. 179*9356374aSAndroid Build Coastguard Worker // `is_w`=1 for writer lock, `is_w`=0 for reader lock. 180*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_RWLOCK_RELEASED(lock, is_w) \ 181*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockReleased) \ 182*9356374aSAndroid Build Coastguard Worker (__FILE__, __LINE__, lock, is_w) 183*9356374aSAndroid Build Coastguard Worker 184*9356374aSAndroid Build Coastguard Worker // Apply ANNOTATE_BENIGN_RACE_SIZED to a static variable `static_var`. 185*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_BENIGN_RACE_STATIC(static_var, description) \ 186*9356374aSAndroid Build Coastguard Worker namespace { \ 187*9356374aSAndroid Build Coastguard Worker class static_var##_annotator { \ 188*9356374aSAndroid Build Coastguard Worker public: \ 189*9356374aSAndroid Build Coastguard Worker static_var##_annotator() { \ 190*9356374aSAndroid Build Coastguard Worker ANNOTATE_BENIGN_RACE_SIZED(&static_var, sizeof(static_var), \ 191*9356374aSAndroid Build Coastguard Worker #static_var ": " description); \ 192*9356374aSAndroid Build Coastguard Worker } \ 193*9356374aSAndroid Build Coastguard Worker }; \ 194*9356374aSAndroid Build Coastguard Worker static static_var##_annotator the##static_var##_annotator; \ 195*9356374aSAndroid Build Coastguard Worker } // namespace 196*9356374aSAndroid Build Coastguard Worker 197*9356374aSAndroid Build Coastguard Worker #else // ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED == 0 198*9356374aSAndroid Build Coastguard Worker 199*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_RWLOCK_CREATE(lock) // empty 200*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_RWLOCK_CREATE_STATIC(lock) // empty 201*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_RWLOCK_DESTROY(lock) // empty 202*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) // empty 203*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_RWLOCK_RELEASED(lock, is_w) // empty 204*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_BENIGN_RACE(address, description) // empty 205*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_BENIGN_RACE_SIZED(address, size, description) // empty 206*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_THREAD_NAME(name) // empty 207*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_ENABLE_RACE_DETECTION(enable) // empty 208*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_BENIGN_RACE_STATIC(static_var, description) // empty 209*9356374aSAndroid Build Coastguard Worker 210*9356374aSAndroid Build Coastguard Worker #endif // ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED 211*9356374aSAndroid Build Coastguard Worker 212*9356374aSAndroid Build Coastguard Worker // ------------------------------------------------------------------------- 213*9356374aSAndroid Build Coastguard Worker // Define memory annotations. 214*9356374aSAndroid Build Coastguard Worker 215*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED == 1 216*9356374aSAndroid Build Coastguard Worker 217*9356374aSAndroid Build Coastguard Worker #include <sanitizer/msan_interface.h> 218*9356374aSAndroid Build Coastguard Worker 219*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_MEMORY_IS_INITIALIZED(address, size) \ 220*9356374aSAndroid Build Coastguard Worker __msan_unpoison(address, size) 221*9356374aSAndroid Build Coastguard Worker 222*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_MEMORY_IS_UNINITIALIZED(address, size) \ 223*9356374aSAndroid Build Coastguard Worker __msan_allocated_memory(address, size) 224*9356374aSAndroid Build Coastguard Worker 225*9356374aSAndroid Build Coastguard Worker #else // ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED == 0 226*9356374aSAndroid Build Coastguard Worker 227*9356374aSAndroid Build Coastguard Worker #if DYNAMIC_ANNOTATIONS_ENABLED == 1 228*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_MEMORY_IS_INITIALIZED(address, size) \ 229*9356374aSAndroid Build Coastguard Worker do { \ 230*9356374aSAndroid Build Coastguard Worker (void)(address); \ 231*9356374aSAndroid Build Coastguard Worker (void)(size); \ 232*9356374aSAndroid Build Coastguard Worker } while (0) 233*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_MEMORY_IS_UNINITIALIZED(address, size) \ 234*9356374aSAndroid Build Coastguard Worker do { \ 235*9356374aSAndroid Build Coastguard Worker (void)(address); \ 236*9356374aSAndroid Build Coastguard Worker (void)(size); \ 237*9356374aSAndroid Build Coastguard Worker } while (0) 238*9356374aSAndroid Build Coastguard Worker #else 239*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_MEMORY_IS_INITIALIZED(address, size) // empty 240*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_MEMORY_IS_UNINITIALIZED(address, size) // empty 241*9356374aSAndroid Build Coastguard Worker #endif 242*9356374aSAndroid Build Coastguard Worker 243*9356374aSAndroid Build Coastguard Worker #endif // ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED 244*9356374aSAndroid Build Coastguard Worker 245*9356374aSAndroid Build Coastguard Worker // ------------------------------------------------------------------------- 246*9356374aSAndroid Build Coastguard Worker // Define IGNORE_READS_BEGIN/_END attributes. 247*9356374aSAndroid Build Coastguard Worker 248*9356374aSAndroid Build Coastguard Worker #if defined(ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED) 249*9356374aSAndroid Build Coastguard Worker 250*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_IGNORE_READS_BEGIN_ATTRIBUTE \ 251*9356374aSAndroid Build Coastguard Worker __attribute((exclusive_lock_function("*"))) 252*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_IGNORE_READS_END_ATTRIBUTE \ 253*9356374aSAndroid Build Coastguard Worker __attribute((unlock_function("*"))) 254*9356374aSAndroid Build Coastguard Worker 255*9356374aSAndroid Build Coastguard Worker #else // !defined(ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED) 256*9356374aSAndroid Build Coastguard Worker 257*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_IGNORE_READS_BEGIN_ATTRIBUTE // empty 258*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_IGNORE_READS_END_ATTRIBUTE // empty 259*9356374aSAndroid Build Coastguard Worker 260*9356374aSAndroid Build Coastguard Worker #endif // defined(ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED) 261*9356374aSAndroid Build Coastguard Worker 262*9356374aSAndroid Build Coastguard Worker // ------------------------------------------------------------------------- 263*9356374aSAndroid Build Coastguard Worker // Define IGNORE_READS_BEGIN/_END annotations. 264*9356374aSAndroid Build Coastguard Worker 265*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_READS_ANNOTATIONS_ENABLED == 1 266*9356374aSAndroid Build Coastguard Worker 267*9356374aSAndroid Build Coastguard Worker // Request the analysis tool to ignore all reads in the current thread until 268*9356374aSAndroid Build Coastguard Worker // ANNOTATE_IGNORE_READS_END is called. Useful to ignore intentional racey 269*9356374aSAndroid Build Coastguard Worker // reads, while still checking other reads and all writes. 270*9356374aSAndroid Build Coastguard Worker // See also ANNOTATE_UNPROTECTED_READ. 271*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_READS_BEGIN() \ 272*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateIgnoreReadsBegin)(__FILE__, __LINE__) 273*9356374aSAndroid Build Coastguard Worker 274*9356374aSAndroid Build Coastguard Worker // Stop ignoring reads. 275*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_READS_END() \ 276*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateIgnoreReadsEnd)(__FILE__, __LINE__) 277*9356374aSAndroid Build Coastguard Worker 278*9356374aSAndroid Build Coastguard Worker #elif defined(ABSL_INTERNAL_ANNOTALYSIS_ENABLED) 279*9356374aSAndroid Build Coastguard Worker 280*9356374aSAndroid Build Coastguard Worker // When Annotalysis is enabled without Dynamic Annotations, the use of 281*9356374aSAndroid Build Coastguard Worker // static-inline functions allows the annotations to be read at compile-time, 282*9356374aSAndroid Build Coastguard Worker // while still letting the compiler elide the functions from the final build. 283*9356374aSAndroid Build Coastguard Worker // 284*9356374aSAndroid Build Coastguard Worker // TODO(delesley) -- The exclusive lock here ignores writes as well, but 285*9356374aSAndroid Build Coastguard Worker // allows IGNORE_READS_AND_WRITES to work properly. 286*9356374aSAndroid Build Coastguard Worker 287*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_READS_BEGIN() \ 288*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AbslInternalAnnotateIgnoreReadsBegin)() 289*9356374aSAndroid Build Coastguard Worker 290*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_READS_END() \ 291*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AbslInternalAnnotateIgnoreReadsEnd)() 292*9356374aSAndroid Build Coastguard Worker 293*9356374aSAndroid Build Coastguard Worker #else 294*9356374aSAndroid Build Coastguard Worker 295*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_READS_BEGIN() // empty 296*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_READS_END() // empty 297*9356374aSAndroid Build Coastguard Worker 298*9356374aSAndroid Build Coastguard Worker #endif 299*9356374aSAndroid Build Coastguard Worker 300*9356374aSAndroid Build Coastguard Worker // ------------------------------------------------------------------------- 301*9356374aSAndroid Build Coastguard Worker // Define IGNORE_WRITES_BEGIN/_END annotations. 302*9356374aSAndroid Build Coastguard Worker 303*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_WRITES_ANNOTATIONS_ENABLED == 1 304*9356374aSAndroid Build Coastguard Worker 305*9356374aSAndroid Build Coastguard Worker // Similar to ANNOTATE_IGNORE_READS_BEGIN, but ignore writes instead. 306*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_WRITES_BEGIN() \ 307*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateIgnoreWritesBegin)(__FILE__, __LINE__) 308*9356374aSAndroid Build Coastguard Worker 309*9356374aSAndroid Build Coastguard Worker // Stop ignoring writes. 310*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_WRITES_END() \ 311*9356374aSAndroid Build Coastguard Worker ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateIgnoreWritesEnd)(__FILE__, __LINE__) 312*9356374aSAndroid Build Coastguard Worker 313*9356374aSAndroid Build Coastguard Worker #else 314*9356374aSAndroid Build Coastguard Worker 315*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_WRITES_BEGIN() // empty 316*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_WRITES_END() // empty 317*9356374aSAndroid Build Coastguard Worker 318*9356374aSAndroid Build Coastguard Worker #endif 319*9356374aSAndroid Build Coastguard Worker 320*9356374aSAndroid Build Coastguard Worker // ------------------------------------------------------------------------- 321*9356374aSAndroid Build Coastguard Worker // Define the ANNOTATE_IGNORE_READS_AND_WRITES_* annotations using the more 322*9356374aSAndroid Build Coastguard Worker // primitive annotations defined above. 323*9356374aSAndroid Build Coastguard Worker // 324*9356374aSAndroid Build Coastguard Worker // Instead of doing 325*9356374aSAndroid Build Coastguard Worker // ANNOTATE_IGNORE_READS_BEGIN(); 326*9356374aSAndroid Build Coastguard Worker // ... = x; 327*9356374aSAndroid Build Coastguard Worker // ANNOTATE_IGNORE_READS_END(); 328*9356374aSAndroid Build Coastguard Worker // one can use 329*9356374aSAndroid Build Coastguard Worker // ... = ANNOTATE_UNPROTECTED_READ(x); 330*9356374aSAndroid Build Coastguard Worker 331*9356374aSAndroid Build Coastguard Worker #if defined(ABSL_INTERNAL_READS_WRITES_ANNOTATIONS_ENABLED) 332*9356374aSAndroid Build Coastguard Worker 333*9356374aSAndroid Build Coastguard Worker // Start ignoring all memory accesses (both reads and writes). 334*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \ 335*9356374aSAndroid Build Coastguard Worker do { \ 336*9356374aSAndroid Build Coastguard Worker ANNOTATE_IGNORE_READS_BEGIN(); \ 337*9356374aSAndroid Build Coastguard Worker ANNOTATE_IGNORE_WRITES_BEGIN(); \ 338*9356374aSAndroid Build Coastguard Worker } while (0) 339*9356374aSAndroid Build Coastguard Worker 340*9356374aSAndroid Build Coastguard Worker // Stop ignoring both reads and writes. 341*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_READS_AND_WRITES_END() \ 342*9356374aSAndroid Build Coastguard Worker do { \ 343*9356374aSAndroid Build Coastguard Worker ANNOTATE_IGNORE_WRITES_END(); \ 344*9356374aSAndroid Build Coastguard Worker ANNOTATE_IGNORE_READS_END(); \ 345*9356374aSAndroid Build Coastguard Worker } while (0) 346*9356374aSAndroid Build Coastguard Worker 347*9356374aSAndroid Build Coastguard Worker #ifdef __cplusplus 348*9356374aSAndroid Build Coastguard Worker // ANNOTATE_UNPROTECTED_READ is the preferred way to annotate racey reads. 349*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_UNPROTECTED_READ(x) \ 350*9356374aSAndroid Build Coastguard Worker absl::base_internal::AnnotateUnprotectedRead(x) 351*9356374aSAndroid Build Coastguard Worker 352*9356374aSAndroid Build Coastguard Worker #endif 353*9356374aSAndroid Build Coastguard Worker 354*9356374aSAndroid Build Coastguard Worker #else 355*9356374aSAndroid Build Coastguard Worker 356*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() // empty 357*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_IGNORE_READS_AND_WRITES_END() // empty 358*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_UNPROTECTED_READ(x) (x) 359*9356374aSAndroid Build Coastguard Worker 360*9356374aSAndroid Build Coastguard Worker #endif 361*9356374aSAndroid Build Coastguard Worker 362*9356374aSAndroid Build Coastguard Worker // ------------------------------------------------------------------------- 363*9356374aSAndroid Build Coastguard Worker // Address sanitizer annotations 364*9356374aSAndroid Build Coastguard Worker 365*9356374aSAndroid Build Coastguard Worker #ifdef ABSL_HAVE_ADDRESS_SANITIZER 366*9356374aSAndroid Build Coastguard Worker // Describe the current state of a contiguous container such as e.g. 367*9356374aSAndroid Build Coastguard Worker // std::vector or std::string. For more details see 368*9356374aSAndroid Build Coastguard Worker // sanitizer/common_interface_defs.h, which is provided by the compiler. 369*9356374aSAndroid Build Coastguard Worker #include <sanitizer/common_interface_defs.h> 370*9356374aSAndroid Build Coastguard Worker 371*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_CONTIGUOUS_CONTAINER(beg, end, old_mid, new_mid) \ 372*9356374aSAndroid Build Coastguard Worker __sanitizer_annotate_contiguous_container(beg, end, old_mid, new_mid) 373*9356374aSAndroid Build Coastguard Worker #define ADDRESS_SANITIZER_REDZONE(name) \ 374*9356374aSAndroid Build Coastguard Worker struct { \ 375*9356374aSAndroid Build Coastguard Worker char x[8] __attribute__((aligned(8))); \ 376*9356374aSAndroid Build Coastguard Worker } name 377*9356374aSAndroid Build Coastguard Worker 378*9356374aSAndroid Build Coastguard Worker #else 379*9356374aSAndroid Build Coastguard Worker 380*9356374aSAndroid Build Coastguard Worker #define ANNOTATE_CONTIGUOUS_CONTAINER(beg, end, old_mid, new_mid) 381*9356374aSAndroid Build Coastguard Worker #define ADDRESS_SANITIZER_REDZONE(name) static_assert(true, "") 382*9356374aSAndroid Build Coastguard Worker 383*9356374aSAndroid Build Coastguard Worker #endif // ABSL_HAVE_ADDRESS_SANITIZER 384*9356374aSAndroid Build Coastguard Worker 385*9356374aSAndroid Build Coastguard Worker // ------------------------------------------------------------------------- 386*9356374aSAndroid Build Coastguard Worker // Undefine the macros intended only for this file. 387*9356374aSAndroid Build Coastguard Worker 388*9356374aSAndroid Build Coastguard Worker #undef ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED 389*9356374aSAndroid Build Coastguard Worker #undef ABSL_INTERNAL_MEMORY_ANNOTATIONS_ENABLED 390*9356374aSAndroid Build Coastguard Worker #undef ABSL_INTERNAL_READS_ANNOTATIONS_ENABLED 391*9356374aSAndroid Build Coastguard Worker #undef ABSL_INTERNAL_WRITES_ANNOTATIONS_ENABLED 392*9356374aSAndroid Build Coastguard Worker #undef ABSL_INTERNAL_ANNOTALYSIS_ENABLED 393*9356374aSAndroid Build Coastguard Worker #undef ABSL_INTERNAL_READS_WRITES_ANNOTATIONS_ENABLED 394*9356374aSAndroid Build Coastguard Worker #undef ABSL_INTERNAL_BEGIN_EXTERN_C 395*9356374aSAndroid Build Coastguard Worker #undef ABSL_INTERNAL_END_EXTERN_C 396*9356374aSAndroid Build Coastguard Worker #undef ABSL_INTERNAL_STATIC_INLINE 397*9356374aSAndroid Build Coastguard Worker 398*9356374aSAndroid Build Coastguard Worker #endif // ABSL_BASE_INTERNAL_DYNAMIC_ANNOTATIONS_H_ 399