qemu/include/qemu/tsan.h
<<
>>
Prefs
   1#ifndef QEMU_TSAN_H
   2#define QEMU_TSAN_H
   3/*
   4 * tsan.h
   5 *
   6 * This file defines macros used to give ThreadSanitizer
   7 * additional information to help suppress warnings.
   8 * This is necessary since TSan does not provide a header file
   9 * for these annotations.  The standard way to include these
  10 * is via the below macros.
  11 *
  12 * Annotation examples can be found here:
  13 *  https://github.com/llvm/llvm-project/tree/master/compiler-rt/test/tsan
  14 * annotate_happens_before.cpp or ignore_race.cpp are good places to start.
  15 *
  16 * The full set of annotations can be found here in tsan_interface_ann.cpp.
  17 *  https://github.com/llvm/llvm-project/blob/master/compiler-rt/lib/tsan/rtl/
  18 *
  19 * This work is licensed under the terms of the GNU GPL, version 2 or later.
  20 * See the COPYING file in the top-level directory.
  21 */
  22
  23#ifdef CONFIG_TSAN
  24/*
  25 * Informs TSan of a happens before/after relationship.
  26 */
  27#define QEMU_TSAN_ANNOTATE_HAPPENS_BEFORE(addr) \
  28    AnnotateHappensBefore(__FILE__, __LINE__, (void *)(addr))
  29#define QEMU_TSAN_ANNOTATE_HAPPENS_AFTER(addr) \
  30    AnnotateHappensAfter(__FILE__, __LINE__, (void *)(addr))
  31/*
  32 * Gives TSan more information about thread names it can report the
  33 * name of the thread in the warning report.
  34 */
  35#define QEMU_TSAN_ANNOTATE_THREAD_NAME(name) \
  36    AnnotateThreadName(__FILE__, __LINE__, (void *)(name))
  37/*
  38 * Allows defining a region of code on which TSan will not record memory READS.
  39 * This has the effect of disabling race detection for this section of code.
  40 */
  41#define QEMU_TSAN_ANNOTATE_IGNORE_READS_BEGIN() \
  42    AnnotateIgnoreReadsBegin(__FILE__, __LINE__)
  43#define QEMU_TSAN_ANNOTATE_IGNORE_READS_END() \
  44    AnnotateIgnoreReadsEnd(__FILE__, __LINE__)
  45/*
  46 * Allows defining a region of code on which TSan will not record memory
  47 * WRITES.  This has the effect of disabling race detection for this
  48 * section of code.
  49 */
  50#define QEMU_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN() \
  51    AnnotateIgnoreWritesBegin(__FILE__, __LINE__)
  52#define QEMU_TSAN_ANNOTATE_IGNORE_WRITES_END() \
  53    AnnotateIgnoreWritesEnd(__FILE__, __LINE__)
  54#else
  55#define QEMU_TSAN_ANNOTATE_HAPPENS_BEFORE(addr)
  56#define QEMU_TSAN_ANNOTATE_HAPPENS_AFTER(addr)
  57#define QEMU_TSAN_ANNOTATE_THREAD_NAME(name)
  58#define QEMU_TSAN_ANNOTATE_IGNORE_READS_BEGIN()
  59#define QEMU_TSAN_ANNOTATE_IGNORE_READS_END()
  60#define QEMU_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN()
  61#define QEMU_TSAN_ANNOTATE_IGNORE_WRITES_END()
  62#endif
  63
  64void AnnotateHappensBefore(const char *f, int l, void *addr);
  65void AnnotateHappensAfter(const char *f, int l, void *addr);
  66void AnnotateThreadName(const char *f, int l, char *name);
  67void AnnotateIgnoreReadsBegin(const char *f, int l);
  68void AnnotateIgnoreReadsEnd(const char *f, int l);
  69void AnnotateIgnoreWritesBegin(const char *f, int l);
  70void AnnotateIgnoreWritesEnd(const char *f, int l);
  71#endif
  72