/*
 *  Copyright 2017 The Abseil Authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/* This file defines dynamic annotations for use with dynamic analysis
   tool such as valgrind, PIN, etc.

   Dynamic annotation is a source code annotation that affects
   the generated code (that is, the annotation is not a comment).
   Each such annotation is attached to a particular
   instruction and/or to a particular object (address) in the program.

   The annotations that should be used by users are macros in all upper-case
   (e.g., ABSL_ANNOTATE_THREAD_NAME).

   Actual implementation of these macros may differ depending on the
   dynamic analysis tool being used.

   This file supports the following configurations:
   - Dynamic Annotations enabled (with static thread-safety warnings disabled).
     In this case, macros expand to functions implemented by Thread Sanitizer,
     when building with TSan. When not provided an external implementation,
     dynamic_annotations.cc provides no-op implementations.

   - Static Clang thread-safety warnings enabled.
     When building with a Clang compiler that supports thread-safety warnings,
     a subset of annotations can be statically-checked at compile-time. We
     expand these macros to static-inline functions that can be analyzed for
     thread-safety, but afterwards elided when building the final binary.

   - All annotations are disabled.
     If neither Dynamic Annotations nor Clang thread-safety warnings are
     enabled, then all annotation-macros expand to empty. */

#ifndef ABSL_BASE_DYNAMIC_ANNOTATIONS_H_
#define ABSL_BASE_DYNAMIC_ANNOTATIONS_H_

#ifndef ABSL_DYNAMIC_ANNOTATIONS_ENABLED
# define ABSL_DYNAMIC_ANNOTATIONS_ENABLED 0
#endif

#if ABSL_DYNAMIC_ANNOTATIONS_ENABLED != 0

  /* -------------------------------------------------------------
     Annotations that suppress errors.  It is usually better to express the
     program's synchronization using the other annotations, but these can
     be used when all else fails. */

  /* Report that we may have a benign race at "pointer", with size
     "sizeof(*(pointer))". "pointer" must be a non-void* pointer.  Insert at the
     point where "pointer" has been allocated, preferably close to the point
     where the race happens.  See also ABSL_ANNOTATE_BENIGN_RACE_STATIC. */
  #define ABSL_ANNOTATE_BENIGN_RACE(pointer, description) \
    AbslAnnotateBenignRaceSized(__FILE__, __LINE__, pointer, \
                            sizeof(*(pointer)), description)

  /* Same as ABSL_ANNOTATE_BENIGN_RACE(address, description), but applies to
     the memory range [address, address+size). */
  #define ABSL_ANNOTATE_BENIGN_RACE_SIZED(address, size, description) \
    AbslAnnotateBenignRaceSized(__FILE__, __LINE__, address, size, description)

  /* Enable (enable!=0) or disable (enable==0) race detection for all threads.
     This annotation could be useful if you want to skip expensive race analysis
     during some period of program execution, e.g. during initialization. */
  #define ABSL_ANNOTATE_ENABLE_RACE_DETECTION(enable) \
    AbslAnnotateEnableRaceDetection(__FILE__, __LINE__, enable)

  /* -------------------------------------------------------------
     Annotations useful for debugging. */

  /* Report the current thread name to a race detector. */
  #define ABSL_ANNOTATE_THREAD_NAME(name) \
    AbslAnnotateThreadName(__FILE__, __LINE__, name)

  /* -------------------------------------------------------------
     Annotations useful when implementing locks.  They are not
     normally needed by modules that merely use locks.
     The "lock" argument is a pointer to the lock object. */

  /* Report that a lock has been created at address "lock". */
  #define ABSL_ANNOTATE_RWLOCK_CREATE(lock) \
    AbslAnnotateRWLockCreate(__FILE__, __LINE__, lock)

  /* Report that a linker initialized lock has been created at address "lock".
   */
#ifdef THREAD_SANITIZER
  #define ABSL_ANNOTATE_RWLOCK_CREATE_STATIC(lock) \
    AbslAnnotateRWLockCreateStatic(__FILE__, __LINE__, lock)
#else
  #define ABSL_ANNOTATE_RWLOCK_CREATE_STATIC(lock) ABSL_ANNOTATE_RWLOCK_CREATE(lock)
#endif

  /* Report that the lock at address "lock" is about to be destroyed. */
  #define ABSL_ANNOTATE_RWLOCK_DESTROY(lock) \
    AbslAnnotateRWLockDestroy(__FILE__, __LINE__, lock)

  /* Report that the lock at address "lock" has been acquired.
     is_w=1 for writer lock, is_w=0 for reader lock. */
  #define ABSL_ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) \
    AbslAnnotateRWLockAcquired(__FILE__, __LINE__, lock, is_w)

  /* Report that the lock at address "lock" is about to be released. */
  #define ABSL_ANNOTATE_RWLOCK_RELEASED(lock, is_w) \
    AbslAnnotateRWLockReleased(__FILE__, __LINE__, lock, is_w)

#else  /* ABSL_DYNAMIC_ANNOTATIONS_ENABLED == 0 */

  #define ABSL_ANNOTATE_RWLOCK_CREATE(lock) /* empty */
  #define ABSL_ANNOTATE_RWLOCK_CREATE_STATIC(lock) /* empty */
  #define ABSL_ANNOTATE_RWLOCK_DESTROY(lock) /* empty */
  #define ABSL_ANNOTATE_RWLOCK_ACQUIRED(lock, is_w) /* empty */
  #define ABSL_ANNOTATE_RWLOCK_RELEASED(lock, is_w) /* empty */
  #define ABSL_ANNOTATE_BENIGN_RACE(address, description) /* empty */
  #define ABSL_ANNOTATE_BENIGN_RACE_SIZED(address, size, description) /* empty */
  #define ABSL_ANNOTATE_THREAD_NAME(name) /* empty */
  #define ABSL_ANNOTATE_ENABLE_RACE_DETECTION(enable) /* empty */

#endif  /* ABSL_DYNAMIC_ANNOTATIONS_ENABLED */

/* These annotations are also made available to LLVM's Memory Sanitizer */
#if ABSL_DYNAMIC_ANNOTATIONS_ENABLED == 1 || defined(MEMORY_SANITIZER)
  #define ABSL_ANNOTATE_MEMORY_IS_INITIALIZED(address, size) \
    AbslAnnotateMemoryIsInitialized(__FILE__, __LINE__, address, size)

  #define ABSL_ANNOTATE_MEMORY_IS_UNINITIALIZED(address, size) \
    AbslAnnotateMemoryIsUninitialized(__FILE__, __LINE__, address, size)
#else
  #define ABSL_ANNOTATE_MEMORY_IS_INITIALIZED(address, size) /* empty */
  #define ABSL_ANNOTATE_MEMORY_IS_UNINITIALIZED(address, size) /* empty */
#endif  /* ABSL_DYNAMIC_ANNOTATIONS_ENABLED || MEMORY_SANITIZER */
/* TODO(delesley) -- Replace __CLANG_SUPPORT_DYN_ANNOTATION__ with the
   appropriate feature ID. */
#if defined(__clang__) && (!defined(SWIG)) \
    && defined(__CLANG_SUPPORT_DYN_ANNOTATION__)

  #if ABSL_DYNAMIC_ANNOTATIONS_ENABLED == 0
    #define ABSL_ANNOTALYSIS_ENABLED
  #endif

  /* When running in opt-mode, GCC will issue a warning, if these attributes are
     compiled. Only include them when compiling using Clang. */
  #define ABSL_ATTRIBUTE_IGNORE_READS_BEGIN \
      __attribute((exclusive_lock_function("*")))
  #define ABSL_ATTRIBUTE_IGNORE_READS_END \
      __attribute((unlock_function("*")))
#else
  #define ABSL_ATTRIBUTE_IGNORE_READS_BEGIN  /* empty */
  #define ABSL_ATTRIBUTE_IGNORE_READS_END  /* empty */
#endif  /* defined(__clang__) && ... */

#if (ABSL_DYNAMIC_ANNOTATIONS_ENABLED != 0) || defined(ABSL_ANNOTALYSIS_ENABLED)
  #define ABSL_ANNOTATIONS_ENABLED
#endif

#if (ABSL_DYNAMIC_ANNOTATIONS_ENABLED != 0)

  /* Request the analysis tool to ignore all reads in the current thread
     until ABSL_ANNOTATE_IGNORE_READS_END is called.
     Useful to ignore intentional racey reads, while still checking
     other reads and all writes.
     See also ABSL_ANNOTATE_UNPROTECTED_READ. */
  #define ABSL_ANNOTATE_IGNORE_READS_BEGIN() \
    AbslAnnotateIgnoreReadsBegin(__FILE__, __LINE__)

  /* Stop ignoring reads. */
  #define ABSL_ANNOTATE_IGNORE_READS_END() \
    AbslAnnotateIgnoreReadsEnd(__FILE__, __LINE__)

  /* Similar to ABSL_ANNOTATE_IGNORE_READS_BEGIN, but ignore writes instead. */
  #define ABSL_ANNOTATE_IGNORE_WRITES_BEGIN() \
    AbslAnnotateIgnoreWritesBegin(__FILE__, __LINE__)

  /* Stop ignoring writes. */
  #define ABSL_ANNOTATE_IGNORE_WRITES_END() \
    AbslAnnotateIgnoreWritesEnd(__FILE__, __LINE__)

/* Clang provides limited support for static thread-safety analysis
   through a feature called Annotalysis. We configure macro-definitions
   according to whether Annotalysis support is available. */
#elif defined(ABSL_ANNOTALYSIS_ENABLED)

  #define ABSL_ANNOTATE_IGNORE_READS_BEGIN() \
    AbslStaticAnnotateIgnoreReadsBegin(__FILE__, __LINE__)

  #define ABSL_ANNOTATE_IGNORE_READS_END() \
    AbslStaticAnnotateIgnoreReadsEnd(__FILE__, __LINE__)

  #define ABSL_ANNOTATE_IGNORE_WRITES_BEGIN() \
    AbslStaticAnnotateIgnoreWritesBegin(__FILE__, __LINE__)

  #define ABSL_ANNOTATE_IGNORE_WRITES_END() \
    AbslStaticAnnotateIgnoreWritesEnd(__FILE__, __LINE__)

#else
  #define ABSL_ANNOTATE_IGNORE_READS_BEGIN()  /* empty */
  #define ABSL_ANNOTATE_IGNORE_READS_END()  /* empty */
  #define ABSL_ANNOTATE_IGNORE_WRITES_BEGIN()  /* empty */
  #define ABSL_ANNOTATE_IGNORE_WRITES_END()  /* empty */
#endif

/* Implement the ANNOTATE_IGNORE_READS_AND_WRITES_* annotations using the more
   primitive annotations defined above. */
#if defined(ABSL_ANNOTATIONS_ENABLED)

  /* Start ignoring all memory accesses (both reads and writes). */
  #define ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN() \
    do {                                           \
      ABSL_ANNOTATE_IGNORE_READS_BEGIN();               \
      ABSL_ANNOTATE_IGNORE_WRITES_BEGIN();              \
    }while (0)

  /* Stop ignoring both reads and writes. */
  #define ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END()   \
    do {                                           \
      ABSL_ANNOTATE_IGNORE_WRITES_END();                \
      ABSL_ANNOTATE_IGNORE_READS_END();                 \
    }while (0)

#else
  #define ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN()  /* empty */
  #define ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END()  /* empty */
#endif

/* Use the macros above rather than using these functions directly. */
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
void AbslAnnotateRWLockCreate(const char *file, int line,
                          const volatile void *lock);
void AbslAnnotateRWLockCreateStatic(const char *file, int line,
                          const volatile void *lock);
void AbslAnnotateRWLockDestroy(const char *file, int line,
                           const volatile void *lock);
void AbslAnnotateRWLockAcquired(const char *file, int line,
                            const volatile void *lock, long is_w);  /* NOLINT */
void AbslAnnotateRWLockReleased(const char *file, int line,
                            const volatile void *lock, long is_w);  /* NOLINT */
void AbslAnnotateBenignRace(const char *file, int line,
                        const volatile void *address,
                        const char *description);
void AbslAnnotateBenignRaceSized(const char *file, int line,
                        const volatile void *address,
                        size_t size,
                        const char *description);
void AbslAnnotateThreadName(const char *file, int line,
                        const char *name);
void AbslAnnotateEnableRaceDetection(const char *file, int line, int enable);
void AbslAnnotateMemoryIsInitialized(const char *file, int line,
                                 const volatile void *mem, size_t size);
void AbslAnnotateMemoryIsUninitialized(const char *file, int line,
                                   const volatile void *mem, size_t size);

/* Annotations expand to these functions, when Dynamic Annotations are enabled.
   These functions are either implemented as no-op calls, if no Sanitizer is
   attached, or provided with externally-linked implementations by a library
   like ThreadSanitizer. */
void AbslAnnotateIgnoreReadsBegin(const char *file, int line)
    ABSL_ATTRIBUTE_IGNORE_READS_BEGIN;
void AbslAnnotateIgnoreReadsEnd(const char *file, int line)
    ABSL_ATTRIBUTE_IGNORE_READS_END;
void AbslAnnotateIgnoreWritesBegin(const char *file, int line);
void AbslAnnotateIgnoreWritesEnd(const char *file, int line);

#if defined(ABSL_ANNOTALYSIS_ENABLED)
/* When Annotalysis is enabled without Dynamic Annotations, the use of
   static-inline functions allows the annotations to be read at compile-time,
   while still letting the compiler elide the functions from the final build.

   TODO(delesley) -- The exclusive lock here ignores writes as well, but
   allows IGNORE_READS_AND_WRITES to work properly. */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
static inline void AbslStaticAnnotateIgnoreReadsBegin(const char *file, int line)
    ABSL_ATTRIBUTE_IGNORE_READS_BEGIN { (void)file; (void)line; }
static inline void AbslStaticAnnotateIgnoreReadsEnd(const char *file, int line)
    ABSL_ATTRIBUTE_IGNORE_READS_END { (void)file; (void)line; }
static inline void AbslStaticAnnotateIgnoreWritesBegin(
    const char *file, int line) { (void)file; (void)line; }
static inline void AbslStaticAnnotateIgnoreWritesEnd(
    const char *file, int line) { (void)file; (void)line; }
#pragma GCC diagnostic pop
#endif

/* Return non-zero value if running under valgrind.

  If "valgrind.h" is included into dynamic_annotations.cc,
  the regular valgrind mechanism will be used.
  See http://valgrind.org/docs/manual/manual-core-adv.html about
  RUNNING_ON_VALGRIND and other valgrind "client requests".
  The file "valgrind.h" may be obtained by doing
     svn co svn://svn.valgrind.org/valgrind/trunk/include

  If for some reason you can't use "valgrind.h" or want to fake valgrind,
  there are two ways to make this function return non-zero:
    - Use environment variable: export RUNNING_ON_VALGRIND=1
    - Make your tool intercept the function AbslRunningOnValgrind() and
      change its return value.
 */
int AbslRunningOnValgrind(void);

/* AbslValgrindSlowdown returns:
    * 1.0, if (AbslRunningOnValgrind() == 0)
    * 50.0, if (AbslRunningOnValgrind() != 0 && getenv("VALGRIND_SLOWDOWN") == NULL)
    * atof(getenv("VALGRIND_SLOWDOWN")) otherwise
   This function can be used to scale timeout values:
   EXAMPLE:
   for (;;) {
     DoExpensiveBackgroundTask();
     SleepForSeconds(5 * AbslValgrindSlowdown());
   }
 */
double AbslValgrindSlowdown(void);

#ifdef __cplusplus
}
#endif

/* ABSL_ANNOTATE_UNPROTECTED_READ is the preferred way to annotate racey reads.

     Instead of doing
        ABSL_ANNOTATE_IGNORE_READS_BEGIN();
        ... = x;
        ABSL_ANNOTATE_IGNORE_READS_END();
     one can use
        ... = ABSL_ANNOTATE_UNPROTECTED_READ(x); */
#if defined(__cplusplus) && defined(ABSL_ANNOTATIONS_ENABLED)
template <typename T>
inline T ABSL_ANNOTATE_UNPROTECTED_READ(const volatile T &x) { /* NOLINT */
  ABSL_ANNOTATE_IGNORE_READS_BEGIN();
  T res = x;
  ABSL_ANNOTATE_IGNORE_READS_END();
  return res;
  }
#else
  #define ABSL_ANNOTATE_UNPROTECTED_READ(x) (x)
#endif

#if ABSL_DYNAMIC_ANNOTATIONS_ENABLED != 0 && defined(__cplusplus)
  /* Apply ABSL_ANNOTATE_BENIGN_RACE_SIZED to a static variable. */
  #define ABSL_ANNOTATE_BENIGN_RACE_STATIC(static_var, description)        \
    namespace {                                                       \
      class static_var ## _annotator {                                \
       public:                                                        \
        static_var ## _annotator() {                                  \
          ABSL_ANNOTATE_BENIGN_RACE_SIZED(&static_var,                     \
                                      sizeof(static_var),             \
            # static_var ": " description);                           \
        }                                                             \
      };                                                              \
      static static_var ## _annotator the ## static_var ## _annotator;\
    }  // namespace
#else /* ABSL_DYNAMIC_ANNOTATIONS_ENABLED == 0 */
  #define ABSL_ANNOTATE_BENIGN_RACE_STATIC(static_var, description)  /* empty */
#endif /* ABSL_DYNAMIC_ANNOTATIONS_ENABLED */

#ifdef ADDRESS_SANITIZER
/* Describe the current state of a contiguous container such as e.g.
 * std::vector or std::string. For more details see
 * sanitizer/common_interface_defs.h, which is provided by the compiler. */
#include <sanitizer/common_interface_defs.h>
#define ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(beg, end, old_mid, new_mid) \
  __sanitizer_annotate_contiguous_container(beg, end, old_mid, new_mid)
#define ABSL_ADDRESS_SANITIZER_REDZONE(name)         \
  struct { char x[8] __attribute__ ((aligned (8))); } name
#else
#define ABSL_ANNOTATE_CONTIGUOUS_CONTAINER(beg, end, old_mid, new_mid)
#define ABSL_ADDRESS_SANITIZER_REDZONE(name)
#endif  // ADDRESS_SANITIZER

/* Undefine the macros intended only in this file. */
#undef ABSL_ANNOTALYSIS_ENABLED
#undef ABSL_ANNOTATIONS_ENABLED
#undef ABSL_ATTRIBUTE_IGNORE_READS_BEGIN
#undef ABSL_ATTRIBUTE_IGNORE_READS_END

#endif  /* ABSL_BASE_DYNAMIC_ANNOTATIONS_H_ */
