/*! \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