Warning, file /include/absl/base/dynamic_annotations.h was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 #ifndef ABSL_BASE_DYNAMIC_ANNOTATIONS_H_
0046 #define ABSL_BASE_DYNAMIC_ANNOTATIONS_H_
0047
0048 #include <stddef.h>
0049 #include <stdint.h>
0050
0051 #include "absl/base/attributes.h"
0052 #include "absl/base/config.h"
0053 #ifdef __cplusplus
0054 #include "absl/base/macros.h"
0055 #endif
0056
0057 #ifdef ABSL_HAVE_HWADDRESS_SANITIZER
0058 #include <sanitizer/hwasan_interface.h>
0059 #endif
0060
0061
0062 #include "absl/base/internal/dynamic_annotations.h" // IWYU pragma: export
0063
0064
0065
0066
0067 #ifdef ABSL_HAVE_THREAD_SANITIZER
0068
0069 #define ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED 1
0070 #define ABSL_INTERNAL_READS_ANNOTATIONS_ENABLED 1
0071 #define ABSL_INTERNAL_WRITES_ANNOTATIONS_ENABLED 1
0072 #define ABSL_INTERNAL_ANNOTALYSIS_ENABLED 0
0073 #define ABSL_INTERNAL_READS_WRITES_ANNOTATIONS_ENABLED 1
0074
0075 #else
0076
0077 #define ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED 0
0078 #define ABSL_INTERNAL_READS_ANNOTATIONS_ENABLED 0
0079 #define ABSL_INTERNAL_WRITES_ANNOTATIONS_ENABLED 0
0080
0081
0082
0083
0084
0085
0086
0087 #if defined(__clang__)
0088 #define ABSL_INTERNAL_ANNOTALYSIS_ENABLED 1
0089 #if !defined(SWIG)
0090 #define ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED 1
0091 #endif
0092 #else
0093 #define ABSL_INTERNAL_ANNOTALYSIS_ENABLED 0
0094 #endif
0095
0096
0097 #define ABSL_INTERNAL_READS_WRITES_ANNOTATIONS_ENABLED \
0098 ABSL_INTERNAL_ANNOTALYSIS_ENABLED
0099
0100 #endif
0101
0102 #ifdef __cplusplus
0103 #define ABSL_INTERNAL_BEGIN_EXTERN_C extern "C" {
0104 #define ABSL_INTERNAL_END_EXTERN_C }
0105 #define ABSL_INTERNAL_GLOBAL_SCOPED(F) ::F
0106 #define ABSL_INTERNAL_STATIC_INLINE inline
0107 #else
0108 #define ABSL_INTERNAL_BEGIN_EXTERN_C
0109 #define ABSL_INTERNAL_END_EXTERN_C
0110 #define ABSL_INTERNAL_GLOBAL_SCOPED(F) F
0111 #define ABSL_INTERNAL_STATIC_INLINE static inline
0112 #endif
0113
0114
0115
0116
0117 #if ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED == 1
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131 #define ABSL_ANNOTATE_BENIGN_RACE(pointer, description) \
0132 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateBenignRaceSized) \
0133 (__FILE__, __LINE__, pointer, sizeof(*(pointer)), description)
0134
0135
0136
0137 #define ABSL_ANNOTATE_BENIGN_RACE_SIZED(address, size, description) \
0138 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateBenignRaceSized) \
0139 (__FILE__, __LINE__, address, size, description)
0140
0141
0142
0143
0144 #define ABSL_ANNOTATE_ENABLE_RACE_DETECTION(enable) \
0145 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateEnableRaceDetection) \
0146 (__FILE__, __LINE__, enable)
0147
0148
0149
0150
0151
0152 #define ABSL_ANNOTATE_THREAD_NAME(name) \
0153 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateThreadName)(__FILE__, __LINE__, name)
0154
0155
0156
0157
0158
0159
0160
0161 #define ABSL_ANNOTATE_RWLOCK_CREATE(lock) \
0162 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockCreate)(__FILE__, __LINE__, lock)
0163
0164
0165 #ifdef ABSL_HAVE_THREAD_SANITIZER
0166 #define ABSL_ANNOTATE_RWLOCK_CREATE_STATIC(lock) \
0167 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockCreateStatic) \
0168 (__FILE__, __LINE__, lock)
0169 #else
0170 #define ABSL_ANNOTATE_RWLOCK_CREATE_STATIC(lock) \
0171 ABSL_ANNOTATE_RWLOCK_CREATE(lock)
0172 #endif
0173
0174
0175 #define ABSL_ANNOTATE_RWLOCK_DESTROY(lock) \
0176 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockDestroy)(__FILE__, __LINE__, lock)
0177
0178
0179
0180 #define ABSL_ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) \
0181 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockAcquired) \
0182 (__FILE__, __LINE__, lock, is_w)
0183
0184
0185
0186 #define ABSL_ANNOTATE_RWLOCK_RELEASED(lock, is_w) \
0187 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateRWLockReleased) \
0188 (__FILE__, __LINE__, lock, is_w)
0189
0190
0191 #define ABSL_ANNOTATE_BENIGN_RACE_STATIC(static_var, description) \
0192 namespace { \
0193 class static_var##_annotator { \
0194 public: \
0195 static_var##_annotator() { \
0196 ABSL_ANNOTATE_BENIGN_RACE_SIZED(&static_var, sizeof(static_var), \
0197 #static_var ": " description); \
0198 } \
0199 }; \
0200 static static_var##_annotator the##static_var##_annotator; \
0201 }
0202
0203
0204
0205 ABSL_INTERNAL_BEGIN_EXTERN_C
0206 void AnnotateRWLockCreate(const char* file, int line,
0207 const volatile void* lock);
0208 void AnnotateRWLockCreateStatic(const char* file, int line,
0209 const volatile void* lock);
0210 void AnnotateRWLockDestroy(const char* file, int line,
0211 const volatile void* lock);
0212 void AnnotateRWLockAcquired(const char* file, int line,
0213 const volatile void* lock, long is_w);
0214 void AnnotateRWLockReleased(const char* file, int line,
0215 const volatile void* lock, long is_w);
0216 void AnnotateBenignRace(const char* file, int line,
0217 const volatile void* address, const char* description);
0218 void AnnotateBenignRaceSized(const char* file, int line,
0219 const volatile void* address, size_t size,
0220 const char* description);
0221 void AnnotateThreadName(const char* file, int line, const char* name);
0222 void AnnotateEnableRaceDetection(const char* file, int line, int enable);
0223 ABSL_INTERNAL_END_EXTERN_C
0224
0225 #else
0226
0227 #define ABSL_ANNOTATE_RWLOCK_CREATE(lock)
0228 #define ABSL_ANNOTATE_RWLOCK_CREATE_STATIC(lock)
0229 #define ABSL_ANNOTATE_RWLOCK_DESTROY(lock)
0230 #define ABSL_ANNOTATE_RWLOCK_ACQUIRED(lock, is_w)
0231 #define ABSL_ANNOTATE_RWLOCK_RELEASED(lock, is_w)
0232 #define ABSL_ANNOTATE_BENIGN_RACE(address, description)
0233 #define ABSL_ANNOTATE_BENIGN_RACE_SIZED(address, size, description)
0234 #define ABSL_ANNOTATE_THREAD_NAME(name)
0235 #define ABSL_ANNOTATE_ENABLE_RACE_DETECTION(enable)
0236 #define ABSL_ANNOTATE_BENIGN_RACE_STATIC(static_var, description)
0237
0238 #endif
0239
0240
0241
0242
0243 #ifdef ABSL_HAVE_MEMORY_SANITIZER
0244
0245 #include <sanitizer/msan_interface.h>
0246
0247 #define ABSL_ANNOTATE_MEMORY_IS_INITIALIZED(address, size) \
0248 __msan_unpoison(address, size)
0249
0250 #define ABSL_ANNOTATE_MEMORY_IS_UNINITIALIZED(address, size) \
0251 __msan_allocated_memory(address, size)
0252
0253 #else
0254
0255 #define ABSL_ANNOTATE_MEMORY_IS_INITIALIZED(address, size)
0256 #define ABSL_ANNOTATE_MEMORY_IS_UNINITIALIZED(address, size)
0257
0258 #endif
0259
0260
0261
0262
0263 #if defined(ABSL_INTERNAL_IGNORE_READS_ATTRIBUTE_ENABLED)
0264
0265 #define ABSL_INTERNAL_IGNORE_READS_BEGIN_ATTRIBUTE \
0266 __attribute((exclusive_lock_function("*")))
0267 #define ABSL_INTERNAL_IGNORE_READS_END_ATTRIBUTE \
0268 __attribute((unlock_function("*")))
0269
0270 #else
0271
0272 #define ABSL_INTERNAL_IGNORE_READS_BEGIN_ATTRIBUTE
0273 #define ABSL_INTERNAL_IGNORE_READS_END_ATTRIBUTE
0274
0275 #endif
0276
0277
0278
0279
0280 #if ABSL_INTERNAL_READS_ANNOTATIONS_ENABLED == 1
0281
0282
0283
0284
0285
0286
0287
0288
0289 #define ABSL_ANNOTATE_IGNORE_READS_BEGIN() \
0290 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateIgnoreReadsBegin) \
0291 (__FILE__, __LINE__)
0292
0293
0294 #define ABSL_ANNOTATE_IGNORE_READS_END() \
0295 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateIgnoreReadsEnd) \
0296 (__FILE__, __LINE__)
0297
0298
0299
0300 ABSL_INTERNAL_BEGIN_EXTERN_C
0301 void AnnotateIgnoreReadsBegin(const char* file, int line)
0302 ABSL_INTERNAL_IGNORE_READS_BEGIN_ATTRIBUTE;
0303 void AnnotateIgnoreReadsEnd(const char* file,
0304 int line) ABSL_INTERNAL_IGNORE_READS_END_ATTRIBUTE;
0305 ABSL_INTERNAL_END_EXTERN_C
0306
0307 #elif defined(ABSL_INTERNAL_ANNOTALYSIS_ENABLED)
0308
0309
0310
0311
0312
0313
0314
0315
0316 #define ABSL_ANNOTATE_IGNORE_READS_BEGIN() \
0317 ABSL_INTERNAL_GLOBAL_SCOPED( \
0318 ABSL_INTERNAL_C_SYMBOL(AbslInternalAnnotateIgnoreReadsBegin)) \
0319 ()
0320
0321 #define ABSL_ANNOTATE_IGNORE_READS_END() \
0322 ABSL_INTERNAL_GLOBAL_SCOPED( \
0323 ABSL_INTERNAL_C_SYMBOL(AbslInternalAnnotateIgnoreReadsEnd)) \
0324 ()
0325
0326 ABSL_INTERNAL_STATIC_INLINE void ABSL_INTERNAL_C_SYMBOL(
0327 AbslInternalAnnotateIgnoreReadsBegin)()
0328 ABSL_INTERNAL_IGNORE_READS_BEGIN_ATTRIBUTE {}
0329
0330 ABSL_INTERNAL_STATIC_INLINE void ABSL_INTERNAL_C_SYMBOL(
0331 AbslInternalAnnotateIgnoreReadsEnd)()
0332 ABSL_INTERNAL_IGNORE_READS_END_ATTRIBUTE {}
0333
0334 #else
0335
0336 #define ABSL_ANNOTATE_IGNORE_READS_BEGIN()
0337 #define ABSL_ANNOTATE_IGNORE_READS_END()
0338
0339 #endif
0340
0341
0342
0343
0344 #if ABSL_INTERNAL_WRITES_ANNOTATIONS_ENABLED == 1
0345
0346
0347 #define ABSL_ANNOTATE_IGNORE_WRITES_BEGIN() \
0348 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateIgnoreWritesBegin)(__FILE__, __LINE__)
0349
0350
0351 #define ABSL_ANNOTATE_IGNORE_WRITES_END() \
0352 ABSL_INTERNAL_GLOBAL_SCOPED(AnnotateIgnoreWritesEnd)(__FILE__, __LINE__)
0353
0354
0355
0356 ABSL_INTERNAL_BEGIN_EXTERN_C
0357 void AnnotateIgnoreWritesBegin(const char* file, int line);
0358 void AnnotateIgnoreWritesEnd(const char* file, int line);
0359 ABSL_INTERNAL_END_EXTERN_C
0360
0361 #else
0362
0363 #define ABSL_ANNOTATE_IGNORE_WRITES_BEGIN()
0364 #define ABSL_ANNOTATE_IGNORE_WRITES_END()
0365
0366 #endif
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379 #if defined(ABSL_INTERNAL_READS_WRITES_ANNOTATIONS_ENABLED)
0380
0381
0382 #define ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \
0383 do { \
0384 ABSL_ANNOTATE_IGNORE_READS_BEGIN(); \
0385 ABSL_ANNOTATE_IGNORE_WRITES_BEGIN(); \
0386 } while (0)
0387
0388
0389 #define ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END() \
0390 do { \
0391 ABSL_ANNOTATE_IGNORE_WRITES_END(); \
0392 ABSL_ANNOTATE_IGNORE_READS_END(); \
0393 } while (0)
0394
0395 #ifdef __cplusplus
0396
0397 #define ABSL_ANNOTATE_UNPROTECTED_READ(x) \
0398 absl::base_internal::AnnotateUnprotectedRead(x)
0399
0400 namespace absl {
0401 ABSL_NAMESPACE_BEGIN
0402 namespace base_internal {
0403
0404 template <typename T>
0405 inline T AnnotateUnprotectedRead(const volatile T& x) {
0406 ABSL_ANNOTATE_IGNORE_READS_BEGIN();
0407 T res = x;
0408 ABSL_ANNOTATE_IGNORE_READS_END();
0409 return res;
0410 }
0411
0412 }
0413 ABSL_NAMESPACE_END
0414 }
0415 #endif
0416
0417 #else
0418
0419 #define ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN()
0420 #define ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END()
0421 #define ABSL_ANNOTATE_UNPROTECTED_READ(x) (x)
0422
0423 #endif
0424
0425
0426
0427
0428 #ifdef ABSL_HAVE_ADDRESS_SANITIZER
0429
0430
0431
0432 #include <sanitizer/common_interface_defs.h>
0433
0434 #define ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(beg, end, old_mid, new_mid) \
0435 __sanitizer_annotate_contiguous_container(beg, end, old_mid, new_mid)
0436 #define ABSL_ADDRESS_SANITIZER_REDZONE(name) \
0437 struct { \
0438 alignas(8) char x[8]; \
0439 } name
0440
0441 #else
0442
0443 #define ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(beg, end, old_mid, new_mid)
0444 #define ABSL_ADDRESS_SANITIZER_REDZONE(name) static_assert(true, "")
0445
0446 #endif
0447
0448
0449
0450
0451 #ifdef __cplusplus
0452 namespace absl {
0453 #ifdef ABSL_HAVE_HWADDRESS_SANITIZER
0454
0455 template <typename T>
0456 T* HwasanTagPointer(T* ptr, uintptr_t tag) {
0457 return reinterpret_cast<T*>(__hwasan_tag_pointer(ptr, tag));
0458 }
0459 #else
0460 template <typename T>
0461 T* HwasanTagPointer(T* ptr, uintptr_t) {
0462 return ptr;
0463 }
0464 #endif
0465 }
0466 #endif
0467
0468
0469
0470
0471 #undef ABSL_INTERNAL_RACE_ANNOTATIONS_ENABLED
0472 #undef ABSL_INTERNAL_READS_ANNOTATIONS_ENABLED
0473 #undef ABSL_INTERNAL_WRITES_ANNOTATIONS_ENABLED
0474 #undef ABSL_INTERNAL_ANNOTALYSIS_ENABLED
0475 #undef ABSL_INTERNAL_READS_WRITES_ANNOTATIONS_ENABLED
0476 #undef ABSL_INTERNAL_BEGIN_EXTERN_C
0477 #undef ABSL_INTERNAL_END_EXTERN_C
0478 #undef ABSL_INTERNAL_STATIC_INLINE
0479
0480 #endif