1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef _UNIFIED_ANNOTATIONS_H_ 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define _UNIFIED_ANNOTATIONS_H_ 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "../../drd/drd.h" 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Define annotation macros such that these can be intercepted by DRD, Helgrind 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * and ThreadSanitizer. See also 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * http://code.google.com/p/data-race-test/source/browse/trunk/dynamic_annotations/dynamic_annotations.h 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define U_ANNOTATE_NEW_MEMORY(addr, size) ANNOTATE_NEW_MEMORY(addr, size) 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define U_ANNOTATE_HAPPENS_BEFORE(addr) U_AnnotateHappensBefore(addr) 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define U_ANNOTATE_HAPPENS_AFTER(addr) U_AnnotateHappensAfter(addr) 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define U_ANNOTATE_HAPPENS_DONE(addr) \ 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown do { \ 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ANNOTATE_HAPPENS_DONE(addr); \ 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } while(0) 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __cplusplus 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern "C" { 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid __attribute__((weak,noinline)) 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownAnnotateCondVarSignal(const char *file, int line, const volatile void *cv) 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown asm(""); 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid __attribute__((weak,noinline)) 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownAnnotateCondVarWait(const char *file, int line, const volatile void *cv, 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const volatile void *lock) 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown asm(""); 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic __inline__ void U_AnnotateHappensBefore(void* addr) 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ANNOTATE_HAPPENS_BEFORE(addr); 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown AnnotateCondVarSignal(__FILE__, __LINE__, addr); 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstatic __inline__ void U_AnnotateHappensAfter(void *addr) 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ANNOTATE_HAPPENS_AFTER(addr); 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown AnnotateCondVarWait(__FILE__, __LINE__, addr, NULL); 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#if 0 57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{ 58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __cplusplus 60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* _UNIFIED_ANNOTATIONS_H_ */ 65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Local variables: 68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * c-basic-offset: 2 69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * End: 70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 71