blob: ddf01f599b3dbec5d1a38c24d16bfdfbb0f02fd6 [file] [log] [blame]
sewardjaf44c822007-11-25 14:01:38 +00001/*
bart86562bd2009-02-16 19:43:56 +00002 This file is part of drd, a thread error detector.
sewardjaf44c822007-11-25 14:01:38 +00003
Elliott Hughesed398002017-06-21 14:41:24 -07004 Copyright (C) 2006-2017 Bart Van Assche <bvanassche@acm.org>.
sewardjaf44c822007-11-25 14:01:38 +00005
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
bart99edb292009-02-15 15:59:20 +000025/*
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 */
sewardjaf44c822007-11-25 14:01:38 +000030
31
bart33e56c92008-03-24 06:41:30 +000032#ifndef __PUB_DRD_BITMAP_H
33#define __PUB_DRD_BITMAP_H
sewardjaf44c822007-11-25 14:01:38 +000034
35
bart8f822af2009-06-08 18:20:42 +000036#include "drd_basics.h" /* DRD_() */
sewardjaf44c822007-11-25 14:01:38 +000037#include "pub_tool_basics.h" /* Addr, SizeT */
bart8f822af2009-06-08 18:20:42 +000038#include "pub_tool_oset.h" /* struct _OSet */
sewardjaf44c822007-11-25 14:01:38 +000039
40
bart99edb292009-02-15 15:59:20 +000041/* Defines. */
sewardjaf44c822007-11-25 14:01:38 +000042
43#define LHS_R (1<<0)
44#define LHS_W (1<<1)
45#define RHS_R (1<<2)
46#define RHS_W (1<<3)
bartbedfd232009-03-26 19:07:15 +000047#define HAS_RACE(a) ((((a) & RHS_W) && ((a) & (LHS_R | LHS_W))) \
48 || (((a) & LHS_W) && ((a) & (RHS_R | RHS_W))))
sewardjaf44c822007-11-25 14:01:38 +000049
50
bart99edb292009-02-15 15:59:20 +000051/* Forward declarations. */
52
sewardjaf44c822007-11-25 14:01:38 +000053struct bitmap;
54
55
bart99edb292009-02-15 15:59:20 +000056/* Datatype definitions. */
57
bart5e234ac2008-03-16 08:39:54 +000058typedef enum { eLoad, eStore, eStart, eEnd } BmAccessTypeT;
sewardjaf44c822007-11-25 14:01:38 +000059
bart8f822af2009-06-08 18:20:42 +000060struct 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
sewardjaf44c822007-11-25 14:01:38 +000075
bart99edb292009-02-15 15:59:20 +000076/* Function declarations. */
bart588d90f2008-04-06 13:05:58 +000077
barte44bccc2012-01-18 09:46:57 +000078void DRD_(bm_module_init)(void);
79void DRD_(bm_module_cleanup)(void);
bart99edb292009-02-15 15:59:20 +000080struct bitmap* DRD_(bm_new)(void);
81void DRD_(bm_delete)(struct bitmap* const bm);
bart8f822af2009-06-08 18:20:42 +000082void DRD_(bm_init)(struct bitmap* const bm);
83void DRD_(bm_cleanup)(struct bitmap* const bm);
bart99edb292009-02-15 15:59:20 +000084void 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);
bart59d93d72011-12-12 19:02:34 +0000102Bool DRD_(bm_has_any_load_g)(struct bitmap* const bm);
bart99edb292009-02-15 15:59:20 +0000103Bool 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);
bart8f822af2009-06-08 18:20:42 +0000136void 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);
bart99edb292009-02-15 15:59:20 +0000143int 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);
bart99edb292009-02-15 15:59:20 +0000150ULong DRD_(bm_get_bitmap2_creation_count)(void);
bart7b706b32009-05-10 06:55:39 +0000151ULong DRD_(bm_get_bitmap2_merge_count)(void);
sewardjaf44c822007-11-25 14:01:38 +0000152
bart33e56c92008-03-24 06:41:30 +0000153#endif /* __PUB_DRD_BITMAP_H */