15530f5f35830ab84a42a69e01f7762666813b75dbart#ifndef _UNIFIED_ANNOTATIONS_H_
25530f5f35830ab84a42a69e01f7762666813b75dbart#define _UNIFIED_ANNOTATIONS_H_
35530f5f35830ab84a42a69e01f7762666813b75dbart
45530f5f35830ab84a42a69e01f7762666813b75dbart
55530f5f35830ab84a42a69e01f7762666813b75dbart#include "../../drd/drd.h"
65530f5f35830ab84a42a69e01f7762666813b75dbart
75530f5f35830ab84a42a69e01f7762666813b75dbart
85530f5f35830ab84a42a69e01f7762666813b75dbart/*
9a7103ba0cf607f349bd6f2ba5becce83e9633fc8bart * Define annotation macros such that these can be intercepted by DRD, Helgrind
10a7103ba0cf607f349bd6f2ba5becce83e9633fc8bart * and ThreadSanitizer. See also
115530f5f35830ab84a42a69e01f7762666813b75dbart * http://code.google.com/p/data-race-test/source/browse/trunk/dynamic_annotations/dynamic_annotations.h
125530f5f35830ab84a42a69e01f7762666813b75dbart */
13a7103ba0cf607f349bd6f2ba5becce83e9633fc8bart#define U_ANNOTATE_NEW_MEMORY(addr, size) ANNOTATE_NEW_MEMORY(addr, size)
14e059791b6122a37ed3d780735f298d438e6a0d55bart#define U_ANNOTATE_HAPPENS_BEFORE(addr) U_AnnotateHappensBefore(addr)
15e059791b6122a37ed3d780735f298d438e6a0d55bart#define U_ANNOTATE_HAPPENS_AFTER(addr) U_AnnotateHappensAfter(addr)
16a7103ba0cf607f349bd6f2ba5becce83e9633fc8bart#define U_ANNOTATE_HAPPENS_DONE(addr)		\
175530f5f35830ab84a42a69e01f7762666813b75dbart  do {						\
18a7103ba0cf607f349bd6f2ba5becce83e9633fc8bart    ANNOTATE_HAPPENS_DONE(addr);		\
195530f5f35830ab84a42a69e01f7762666813b75dbart  } while(0)
205530f5f35830ab84a42a69e01f7762666813b75dbart
215530f5f35830ab84a42a69e01f7762666813b75dbart
225530f5f35830ab84a42a69e01f7762666813b75dbart#ifdef __cplusplus
235530f5f35830ab84a42a69e01f7762666813b75dbartextern "C" {
245530f5f35830ab84a42a69e01f7762666813b75dbart#endif
255530f5f35830ab84a42a69e01f7762666813b75dbart#if 0
265530f5f35830ab84a42a69e01f7762666813b75dbart}
275530f5f35830ab84a42a69e01f7762666813b75dbart#endif
285530f5f35830ab84a42a69e01f7762666813b75dbart
295530f5f35830ab84a42a69e01f7762666813b75dbart
305530f5f35830ab84a42a69e01f7762666813b75dbartvoid  __attribute__((weak,noinline))
315530f5f35830ab84a42a69e01f7762666813b75dbartAnnotateCondVarSignal(const char *file, int line, const volatile void *cv)
325530f5f35830ab84a42a69e01f7762666813b75dbart{
335530f5f35830ab84a42a69e01f7762666813b75dbart  asm("");
345530f5f35830ab84a42a69e01f7762666813b75dbart}
355530f5f35830ab84a42a69e01f7762666813b75dbart
365530f5f35830ab84a42a69e01f7762666813b75dbartvoid  __attribute__((weak,noinline))
375530f5f35830ab84a42a69e01f7762666813b75dbartAnnotateCondVarWait(const char *file, int line, const volatile void *cv,
385530f5f35830ab84a42a69e01f7762666813b75dbart		    const volatile void *lock)
395530f5f35830ab84a42a69e01f7762666813b75dbart{
405530f5f35830ab84a42a69e01f7762666813b75dbart  asm("");
415530f5f35830ab84a42a69e01f7762666813b75dbart}
425530f5f35830ab84a42a69e01f7762666813b75dbart
43e059791b6122a37ed3d780735f298d438e6a0d55bartstatic __inline__ void U_AnnotateHappensBefore(void* addr)
44e059791b6122a37ed3d780735f298d438e6a0d55bart{
45e059791b6122a37ed3d780735f298d438e6a0d55bart  ANNOTATE_HAPPENS_BEFORE(addr);
46e059791b6122a37ed3d780735f298d438e6a0d55bart  AnnotateCondVarSignal(__FILE__, __LINE__, addr);
47e059791b6122a37ed3d780735f298d438e6a0d55bart}
48e059791b6122a37ed3d780735f298d438e6a0d55bart
49e059791b6122a37ed3d780735f298d438e6a0d55bartstatic __inline__ void U_AnnotateHappensAfter(void *addr)
50e059791b6122a37ed3d780735f298d438e6a0d55bart{
51e059791b6122a37ed3d780735f298d438e6a0d55bart  ANNOTATE_HAPPENS_AFTER(addr);
52e059791b6122a37ed3d780735f298d438e6a0d55bart  AnnotateCondVarWait(__FILE__, __LINE__, addr, NULL);
53e059791b6122a37ed3d780735f298d438e6a0d55bart}
54e059791b6122a37ed3d780735f298d438e6a0d55bart
555530f5f35830ab84a42a69e01f7762666813b75dbart
565530f5f35830ab84a42a69e01f7762666813b75dbart#if 0
575530f5f35830ab84a42a69e01f7762666813b75dbart{
585530f5f35830ab84a42a69e01f7762666813b75dbart#endif
595530f5f35830ab84a42a69e01f7762666813b75dbart#ifdef __cplusplus
605530f5f35830ab84a42a69e01f7762666813b75dbart}
615530f5f35830ab84a42a69e01f7762666813b75dbart#endif
625530f5f35830ab84a42a69e01f7762666813b75dbart
635530f5f35830ab84a42a69e01f7762666813b75dbart
645530f5f35830ab84a42a69e01f7762666813b75dbart#endif /* _UNIFIED_ANNOTATIONS_H_ */
65