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_ */
65