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