1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This file is part of drd, a thread error detector.
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  Copyright (C) 2006-2013 Bart Van Assche <bvanassche@acm.org>.
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This program is free software; you can redistribute it and/or
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  modify it under the terms of the GNU General Public License as
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  published by the Free Software Foundation; either version 2 of the
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  License, or (at your option) any later version.
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  This program is distributed in the hope that it will be useful, but
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  WITHOUT ANY WARRANTY; without even the implied warranty of
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  General Public License for more details.
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  You should have received a copy of the GNU General Public License
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  along with this program; if not, write to the Free Software
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  02111-1307, USA.
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  The GNU General Public License is contained in the file COPYING.
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * A bitmap is a data structure that contains information about which
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * addresses have been accessed for reading or writing within a given
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * segment.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __PUB_DRD_BITMAP_H
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __PUB_DRD_BITMAP_H
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "drd_basics.h"      /* DRD_() */
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_basics.h" /* Addr, SizeT */
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_oset.h"   /* struct _OSet */
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Defines. */
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define LHS_R (1<<0)
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define LHS_W (1<<1)
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define RHS_R (1<<2)
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define RHS_W (1<<3)
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define HAS_RACE(a) ((((a) & RHS_W) && ((a) & (LHS_R | LHS_W)))         \
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                     || (((a) & LHS_W) && ((a) & (RHS_R | RHS_W))))
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Forward declarations. */
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct bitmap;
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Datatype definitions. */
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef enum { eLoad, eStore, eStart, eEnd } BmAccessTypeT;
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct bm_cache_elem
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Addr            a1;
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct bitmap2* bm2;
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define DRD_BITMAP_N_CACHE_ELEM 4
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Complete bitmap. */
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct bitmap
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   struct bm_cache_elem cache[DRD_BITMAP_N_CACHE_ELEM];
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   OSet*                oset;
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Function declarations. */
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid DRD_(bm_module_init)(void);
79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid DRD_(bm_module_cleanup)(void);
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct bitmap* DRD_(bm_new)(void);
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_delete)(struct bitmap* const bm);
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_init)(struct bitmap* const bm);
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_cleanup)(struct bitmap* const bm);
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_access_range)(struct bitmap* const bm,
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           const Addr a1, const Addr a2,
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           const BmAccessTypeT access_type);
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_access_range_load)(struct bitmap* const bm,
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                const Addr a1, const Addr a2);
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_access_load_1)(struct bitmap* const bm, const Addr a1);
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_access_load_2)(struct bitmap* const bm, const Addr a1);
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_access_load_4)(struct bitmap* const bm, const Addr a1);
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_access_load_8)(struct bitmap* const bm, const Addr a1);
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_access_range_store)(struct bitmap* const bm,
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                 const Addr a1, const Addr a2);
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_access_store_1)(struct bitmap* const bm, const Addr a1);
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_access_store_2)(struct bitmap* const bm, const Addr a1);
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_access_store_4)(struct bitmap* const bm, const Addr a1);
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_access_store_8)(struct bitmap* const bm, const Addr a1);
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_has)(struct bitmap* const bm,
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  const Addr a1, const Addr a2,
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                  const BmAccessTypeT access_type);
102663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengBool DRD_(bm_has_any_load_g)(struct bitmap* const bm);
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_has_any_load)(struct bitmap* const bm,
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           const Addr a1, const Addr a2);
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_has_any_store)(struct bitmap* const bm,
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            const Addr a1, const Addr a2);
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_has_any_access)(struct bitmap* const bm,
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             const Addr a1, const Addr a2);
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_has_1)(struct bitmap* const bm,
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    const Addr address, const BmAccessTypeT access_type);
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_clear)(struct bitmap* const bm,
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                    const Addr a1, const Addr a2);
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_clear_load)(struct bitmap* const bm,
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                         const Addr a1, const Addr a2);
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_clear_store)(struct bitmap* const bm,
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                          const Addr a1, const Addr a2);
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_test_and_clear)(struct bitmap* const bm,
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                             const Addr a1, const Addr a2);
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_has_conflict_with)(struct bitmap* const bm,
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                const Addr a1, const Addr a2,
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                const BmAccessTypeT access_type);
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_load_1_has_conflict_with)(struct bitmap* const bm, const Addr a1);
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_load_2_has_conflict_with)(struct bitmap* const bm, const Addr a1);
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_load_4_has_conflict_with)(struct bitmap* const bm, const Addr a1);
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_load_8_has_conflict_with)(struct bitmap* const bm, const Addr a1);
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_load_has_conflict_with)(struct bitmap* const bm,
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                     const Addr a1, const Addr a2);
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_store_1_has_conflict_with)(struct bitmap* const bm,const Addr a1);
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_store_2_has_conflict_with)(struct bitmap* const bm,const Addr a1);
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_store_4_has_conflict_with)(struct bitmap* const bm,const Addr a1);
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_store_8_has_conflict_with)(struct bitmap* const bm,const Addr a1);
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_store_has_conflict_with)(struct bitmap* const bm,
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                                      const Addr a1, const Addr a2);
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_equal)(struct bitmap* const lhs, struct bitmap* const rhs);
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_swap)(struct bitmap* const bm1, struct bitmap* const bm2);
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_merge2)(struct bitmap* const lhs, struct bitmap* const rhs);
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_unmark)(struct bitmap* bm);
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool DRD_(bm_is_marked)(struct bitmap* bm, const Addr a);
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_mark)(struct bitmap* bm1, struct bitmap* bm2);
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_clear_marked)(struct bitmap* bm);
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_merge2_marked)(struct bitmap* const lhs, struct bitmap* const rhs);
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_remove_cleared_marked)(struct bitmap* bm);
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint DRD_(bm_has_races)(struct bitmap* const bm1,
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                       struct bitmap* const bm2);
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_report_races)(ThreadId const tid1, ThreadId const tid2,
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           struct bitmap* const bm1,
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                           struct bitmap* const bm2);
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid DRD_(bm_print)(struct bitmap* bm);
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong DRD_(bm_get_bitmap_creation_count)(void);
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong DRD_(bm_get_bitmap2_creation_count)(void);
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong DRD_(bm_get_bitmap2_merge_count)(void);
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* __PUB_DRD_BITMAP_H */
154