1d1ebbfc49338b06e6a9980ecd08faf08c35e615
[c11tester.git] / librace.cc
1 #define __STDC_FORMAT_MACROS
2 #include <inttypes.h>
3
4 #include "librace.h"
5 #include "common.h"
6 #include "datarace.h"
7 #include "model.h"
8 #include "threads-model.h"
9 #include "snapshot-interface.h"
10
11 void store_8(void *addr, uint8_t val)
12 {
13         DEBUG("addr = %p, val = %" PRIu8 "\n", addr, val);
14         thread_id_t tid = thread_current()->get_id();
15         raceCheckWrite(tid, addr);
16         (*(uint8_t *)addr) = val;
17 }
18
19 void store_16(void *addr, uint16_t val)
20 {
21         DEBUG("addr = %p, val = %" PRIu16 "\n", addr, val);
22         thread_id_t tid = thread_current()->get_id();
23         raceCheckWrite(tid, addr);
24         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
25         (*(uint16_t *)addr) = val;
26 }
27
28 void store_32(void *addr, uint32_t val)
29 {
30         DEBUG("addr = %p, val = %" PRIu32 "\n", addr, val);
31         thread_id_t tid = thread_current()->get_id();
32         raceCheckWrite(tid, addr);
33         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
34         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
35         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
36         (*(uint32_t *)addr) = val;
37 }
38
39 void store_64(void *addr, uint64_t val)
40 {
41         DEBUG("addr = %p, val = %" PRIu64 "\n", addr, val);
42         thread_id_t tid = thread_current()->get_id();
43         raceCheckWrite(tid, addr);
44         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
45         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
46         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
47         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 4));
48         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 5));
49         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 6));
50         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 7));
51         (*(uint64_t *)addr) = val;
52 }
53
54 uint8_t load_8(const void *addr)
55 {
56         DEBUG("addr = %p\n", addr);
57         thread_id_t tid = thread_current()->get_id();
58         raceCheckRead(tid, addr);
59         return *((uint8_t *)addr);
60 }
61
62 uint16_t load_16(const void *addr)
63 {
64         DEBUG("addr = %p\n", addr);
65         thread_id_t tid = thread_current()->get_id();
66         raceCheckRead(tid, addr);
67         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
68         return *((uint16_t *)addr);
69 }
70
71 uint32_t load_32(const void *addr)
72 {
73         DEBUG("addr = %p\n", addr);
74         thread_id_t tid = thread_current()->get_id();
75         raceCheckRead(tid, addr);
76         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
77         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 2));
78         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 3));
79         return *((uint32_t *)addr);
80 }
81
82 uint64_t load_64(const void *addr)
83 {
84         DEBUG("addr = %p\n", addr);
85         thread_id_t tid = thread_current()->get_id();
86         raceCheckRead(tid, addr);
87         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
88         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 2));
89         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 3));
90         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 4));
91         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 5));
92         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 6));
93         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 7));
94         return *((uint64_t *)addr);
95 }
96
97 /**
98  * Helper functions used by CDSPass
99  * The CDSPass implementation does not replace normal load/stores with cds load/stores,
100  * but inserts cds load/stores to check dataraces. Thus, the cds load/stores do not
101  * return anything.
102  */
103
104 void cds_store8(void *addr)
105 {
106         //DEBUG("addr = %p, val = %" PRIu8 "\n", addr, val);
107         if (!model)
108                 return;
109         thread_id_t tid = thread_current()->get_id();
110         raceCheckWrite8(tid, addr);
111
112 //      raceCheckWrite(tid, addr);
113 }
114
115 void cds_store16(void *addr)
116 {
117         //DEBUG("addr = %p, val = %" PRIu16 "\n", addr, val);
118         if (!model)
119                 return;
120         thread_id_t tid = thread_current()->get_id();
121         raceCheckWrite16(tid, addr);
122
123 //      raceCheckWrite(tid, addr);
124 //      raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
125 }
126
127 void cds_store32(void *addr)
128 {
129         //DEBUG("addr = %p, val = %" PRIu32 "\n", addr, val);
130         if (!model)
131                 return;
132         thread_id_t tid = thread_current()->get_id();
133         raceCheckWrite32(tid, addr);
134
135 /*
136         raceCheckWrite(tid, addr);
137         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
138         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
139         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
140 */
141 }
142
143 void cds_store64(void *addr)
144 {
145         //DEBUG("addr = %p, val = %" PRIu64 "\n", addr, val);
146         if (!model)
147                 return;
148         thread_id_t tid = thread_current()->get_id();
149         raceCheckWrite64(tid, addr);
150
151 /*
152         raceCheckWrite(tid, addr);
153         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
154         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
155         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
156         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 4));
157         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 5));
158         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 6));
159         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 7));
160 */
161 }
162
163 void cds_load8(const void *addr) {
164         if (!model)
165                 return;
166         thread_id_t tid = thread_current()->get_id();
167
168         raceCheckRead8(tid, addr);
169
170 //      raceCheckRead(tid, addr);
171 }
172
173 void cds_load16(const void *addr) {
174         if (!model)
175                 return;
176         thread_id_t tid = thread_current()->get_id();
177
178         raceCheckRead16(tid, addr);
179 //      raceCheckRead(tid, addr);
180 //      raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
181 }
182
183 void cds_load32(const void *addr) {
184         if (!model)
185                 return;
186         thread_id_t tid = thread_current()->get_id();
187
188         raceCheckRead32(tid, addr);
189 /*
190         raceCheckRead(tid, addr);
191         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
192         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 2));
193         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 3));
194 */
195 }
196
197 void cds_load64(const void *addr) {
198         if (!model)
199                 return;
200         thread_id_t tid = thread_current()->get_id();
201
202         raceCheckRead64(tid, addr);
203 /*
204         raceCheckRead(tid, addr);
205         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
206         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 2));
207         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 3));
208         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 4));
209         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 5));
210         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 6));
211         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 7));
212 */
213 }