/*! \file */ /* * tsan_annotations.h -- ThreadSanitizer annotations to support data * race detection in OpenMP programs. */ //===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.txt for details. // //===----------------------------------------------------------------------===// #ifndef TSAN_ANNOTATIONS_H #define TSAN_ANNOTATIONS_H #include "kmp_config.h" /* types as used in tsan/rtl/tsan_interface_ann.cc */ typedef unsigned long uptr; typedef signed long sptr; #ifdef __cplusplus extern "C" { #endif /* Declaration of all annotation functions in tsan/rtl/tsan_interface_ann.cc */ void AnnotateHappensBefore(const char *f, int l, uptr addr); void AnnotateHappensAfter(const char *f, int l, uptr addr); void AnnotateCondVarSignal(const char *f, int l, uptr cv); void AnnotateCondVarSignalAll(const char *f, int l, uptr cv); void AnnotateMutexIsNotPHB(const char *f, int l, uptr mu); void AnnotateCondVarWait(const char *f, int l, uptr cv, uptr lock); void AnnotateRWLockCreate(const char *f, int l, uptr m); void AnnotateRWLockCreateStatic(const char *f, int l, uptr m); void AnnotateRWLockDestroy(const char *f, int l, uptr m); void AnnotateRWLockAcquired(const char *f, int l, uptr m, uptr is_w); void AnnotateRWLockReleased(const char *f, int l, uptr m, uptr is_w); void AnnotateTraceMemory(const char *f, int l, uptr mem); void AnnotateFlushState(const char *f, int l); void AnnotateNewMemory(const char *f, int l, uptr mem, uptr size); void AnnotateNoOp(const char *f, int l, uptr mem); void AnnotateFlushExpectedRaces(const char *f, int l); void AnnotateEnableRaceDetection(const char *f, int l, int enable); void AnnotateMutexIsUsedAsCondVar(const char *f, int l, uptr mu); void AnnotatePCQGet(const char *f, int l, uptr pcq); void AnnotatePCQPut(const char *f, int l, uptr pcq); void AnnotatePCQDestroy(const char *f, int l, uptr pcq); void AnnotatePCQCreate(const char *f, int l, uptr pcq); void AnnotateExpectRace(const char *f, int l, uptr mem, char *desc); void AnnotateBenignRaceSized(const char *f, int l, uptr mem, uptr size, char *desc); void AnnotateBenignRace(const char *f, int l, uptr mem, char *desc); 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); void AnnotateIgnoreSyncBegin(const char *f, int l); void AnnotateIgnoreSyncEnd(const char *f, int l); void AnnotatePublishMemoryRange(const char *f, int l, uptr addr, uptr size); void AnnotateUnpublishMemoryRange(const char *f, int l, uptr addr, uptr size); void AnnotateThreadName(const char *f, int l, char *name); void WTFAnnotateHappensBefore(const char *f, int l, uptr addr); void WTFAnnotateHappensAfter(const char *f, int l, uptr addr); void WTFAnnotateBenignRaceSized(const char *f, int l, uptr mem, uptr sz, char *desc); int RunningOnValgrind(); double ValgrindSlowdown(void); const char *ThreadSanitizerQuery(const char *query); void AnnotateMemoryIsInitialized(const char *f, int l, uptr mem, uptr sz); #ifdef __cplusplus } #endif #ifdef TSAN_SUPPORT #define ANNOTATE_HAPPENS_AFTER(addr) \ AnnotateHappensAfter(__FILE__, __LINE__, (uptr)addr) #define ANNOTATE_HAPPENS_BEFORE(addr) \ AnnotateHappensBefore(__FILE__, __LINE__, (uptr)addr) #define ANNOTATE_IGNORE_WRITES_BEGIN() \ AnnotateIgnoreWritesBegin(__FILE__, __LINE__) #define ANNOTATE_IGNORE_WRITES_END() AnnotateIgnoreWritesEnd(__FILE__, __LINE__) #define ANNOTATE_RWLOCK_CREATE(lck) \ AnnotateRWLockCreate(__FILE__, __LINE__, (uptr)lck) #define ANNOTATE_RWLOCK_RELEASED(lck) \ AnnotateRWLockAcquired(__FILE__, __LINE__, (uptr)lck, 1) #define ANNOTATE_RWLOCK_ACQUIRED(lck) \ AnnotateRWLockReleased(__FILE__, __LINE__, (uptr)lck, 1) #define ANNOTATE_BARRIER_BEGIN(addr) \ AnnotateHappensBefore(__FILE__, __LINE__, (uptr)addr) #define ANNOTATE_BARRIER_END(addr) \ AnnotateHappensAfter(__FILE__, __LINE__, (uptr)addr) #define ANNOTATE_REDUCE_AFTER(addr) \ AnnotateHappensAfter(__FILE__, __LINE__, (uptr)addr) #define ANNOTATE_REDUCE_BEFORE(addr) \ AnnotateHappensBefore(__FILE__, __LINE__, (uptr)addr) #else #define ANNOTATE_HAPPENS_AFTER(addr) #define ANNOTATE_HAPPENS_BEFORE(addr) #define ANNOTATE_IGNORE_WRITES_BEGIN() #define ANNOTATE_IGNORE_WRITES_END() #define ANNOTATE_RWLOCK_CREATE(lck) #define ANNOTATE_RWLOCK_RELEASED(lck) #define ANNOTATE_RWLOCK_ACQUIRED(lck) #define ANNOTATE_BARRIER_BEGIN(addr) #define ANNOTATE_BARRIER_END(addr) #define ANNOTATE_REDUCE_AFTER(addr) #define ANNOTATE_REDUCE_BEFORE(addr) #endif #define ANNOTATE_QUEUING #define ANNOTATE_TICKET #define ANNOTATE_FUTEX #define ANNOTATE_TAS #define ANNOTATE_DRDPA #ifdef ANNOTATE_QUEUING #define ANNOTATE_QUEUING_CREATE(lck) #define ANNOTATE_QUEUING_RELEASED(lck) ANNOTATE_HAPPENS_BEFORE(lck) #define ANNOTATE_QUEUING_ACQUIRED(lck) ANNOTATE_HAPPENS_AFTER(lck) #else #define ANNOTATE_QUEUING_CREATE(lck) #define ANNOTATE_QUEUING_RELEASED(lck) #define ANNOTATE_QUEUING_ACQUIRED(lck) #endif #ifdef ANNOTATE_TICKET #define ANNOTATE_TICKET_CREATE(lck) #define ANNOTATE_TICKET_RELEASED(lck) ANNOTATE_HAPPENS_BEFORE(lck) #define ANNOTATE_TICKET_ACQUIRED(lck) ANNOTATE_HAPPENS_AFTER(lck) #else #define ANNOTATE_TICKET_CREATE(lck) #define ANNOTATE_TICKET_RELEASED(lck) #define ANNOTATE_TICKET_ACQUIRED(lck) #endif #ifdef ANNOTATE_FUTEX #define ANNOTATE_FUTEX_CREATE(lck) #define ANNOTATE_FUTEX_RELEASED(lck) ANNOTATE_HAPPENS_BEFORE(lck) #define ANNOTATE_FUTEX_ACQUIRED(lck) ANNOTATE_HAPPENS_AFTER(lck) #else #define ANNOTATE_FUTEX_CREATE(lck) #define ANNOTATE_FUTEX_RELEASED(lck) #define ANNOTATE_FUTEX_ACQUIRED(lck) #endif #ifdef ANNOTATE_TAS #define ANNOTATE_TAS_CREATE(lck) #define ANNOTATE_TAS_RELEASED(lck) ANNOTATE_HAPPENS_BEFORE(lck) #define ANNOTATE_TAS_ACQUIRED(lck) ANNOTATE_HAPPENS_AFTER(lck) #else #define ANNOTATE_TAS_CREATE(lck) #define ANNOTATE_TAS_RELEASED(lck) #define ANNOTATE_TAS_ACQUIRED(lck) #endif #ifdef ANNOTATE_DRDPA #define ANNOTATE_DRDPA_CREATE(lck) #define ANNOTATE_DRDPA_RELEASED(lck) ANNOTATE_HAPPENS_BEFORE(lck) #define ANNOTATE_DRDPA_ACQUIRED(lck) ANNOTATE_HAPPENS_AFTER(lck) #else #define ANNOTATE_DRDPA_CREATE(lck) #define ANNOTATE_DRDPA_RELEASED(lck) #define ANNOTATE_DRDPA_ACQUIRED(lck) #endif #endif