#ifndef QEMU_TSAN_H #define QEMU_TSAN_H /* * tsan.h * * This file defines macros used to give ThreadSanitizer * additional information to help suppress warnings. * This is necessary since TSan does not provide a header file * for these annotations. The standard way to include these * is via the below macros. * * Annotation examples can be found here: * https://github.com/llvm/llvm-project/tree/master/compiler-rt/test/tsan * annotate_happens_before.cpp or ignore_race.cpp are good places to start. * * The full set of annotations can be found here in tsan_interface_ann.cpp. * https://github.com/llvm/llvm-project/blob/master/compiler-rt/lib/tsan/rtl/ * * This work is licensed under the terms of the GNU GPL, version 2 or later. * See the COPYING file in the top-level directory. */ #ifdef CONFIG_TSAN /* * Informs TSan of a happens before/after relationship. */ #define QEMU_TSAN_ANNOTATE_HAPPENS_BEFORE(addr) \ AnnotateHappensBefore(__FILE__, __LINE__, (void *)(addr)) #define QEMU_TSAN_ANNOTATE_HAPPENS_AFTER(addr) \ AnnotateHappensAfter(__FILE__, __LINE__, (void *)(addr)) /* * Gives TSan more information about thread names it can report the * name of the thread in the warning report. */ #define QEMU_TSAN_ANNOTATE_THREAD_NAME(name) \ AnnotateThreadName(__FILE__, __LINE__, (void *)(name)) /* * Allows defining a region of code on which TSan will not record memory READS. * This has the effect of disabling race detection for this section of code. */ #define QEMU_TSAN_ANNOTATE_IGNORE_READS_BEGIN() \ AnnotateIgnoreReadsBegin(__FILE__, __LINE__) #define QEMU_TSAN_ANNOTATE_IGNORE_READS_END() \ AnnotateIgnoreReadsEnd(__FILE__, __LINE__) /* * Allows defining a region of code on which TSan will not record memory * WRITES. This has the effect of disabling race detection for this * section of code. */ #define QEMU_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN() \ AnnotateIgnoreWritesBegin(__FILE__, __LINE__) #define QEMU_TSAN_ANNOTATE_IGNORE_WRITES_END() \ AnnotateIgnoreWritesEnd(__FILE__, __LINE__) #else #define QEMU_TSAN_ANNOTATE_HAPPENS_BEFORE(addr) #define QEMU_TSAN_ANNOTATE_HAPPENS_AFTER(addr) #define QEMU_TSAN_ANNOTATE_THREAD_NAME(name) #define QEMU_TSAN_ANNOTATE_IGNORE_READS_BEGIN() #define QEMU_TSAN_ANNOTATE_IGNORE_READS_END() #define QEMU_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN() #define QEMU_TSAN_ANNOTATE_IGNORE_WRITES_END() #endif void AnnotateHappensBefore(const char *f, int l, void *addr); void AnnotateHappensAfter(const char *f, int l, void *addr); void AnnotateThreadName(const char *f, int l, char *name); void AnnotateIgnoreReadsBegin(const char *f, int l); void AnnotateIgnoreReadsEnd(const char *f, int l); void AnnotateIgnoreWritesBegin(const char *f, int l); void AnnotateIgnoreWritesEnd(const char *f, int l); #endif