5dafc6ffcbb33a5893310f117822738202fd2fa9
[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
10 void store_8(void *addr, uint8_t val)
11 {
12         DEBUG("addr = %p, val = %" PRIu8 "\n", addr, val);
13         thread_id_t tid = thread_current()->get_id();
14         raceCheckWrite(tid, addr);
15         (*(uint8_t *)addr) = val;
16 }
17
18 void store_16(void *addr, uint16_t val)
19 {
20         DEBUG("addr = %p, val = %" PRIu16 "\n", addr, val);
21         thread_id_t tid = thread_current()->get_id();
22         raceCheckWrite(tid, addr);
23         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
24         (*(uint16_t *)addr) = val;
25 }
26
27 void store_32(void *addr, uint32_t val)
28 {
29         DEBUG("addr = %p, val = %" PRIu32 "\n", addr, val);
30         thread_id_t tid = thread_current()->get_id();
31         raceCheckWrite(tid, addr);
32         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
33         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
34         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
35         (*(uint32_t *)addr) = val;
36 }
37
38 void store_64(void *addr, uint64_t val)
39 {
40         DEBUG("addr = %p, val = %" PRIu64 "\n", addr, val);
41         thread_id_t tid = thread_current()->get_id();
42         raceCheckWrite(tid, addr);
43         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
44         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
45         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
46         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 4));
47         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 5));
48         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 6));
49         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 7));
50         (*(uint64_t *)addr) = val;
51 }
52
53 uint8_t load_8(const void *addr)
54 {
55         DEBUG("addr = %p\n", addr);
56         thread_id_t tid = thread_current()->get_id();
57         raceCheckRead(tid, addr);
58         return *((uint8_t *)addr);
59 }
60
61 uint16_t load_16(const void *addr)
62 {
63         DEBUG("addr = %p\n", addr);
64         thread_id_t tid = thread_current()->get_id();
65         raceCheckRead(tid, addr);
66         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
67         return *((uint16_t *)addr);
68 }
69
70 uint32_t load_32(const void *addr)
71 {
72         DEBUG("addr = %p\n", addr);
73         thread_id_t tid = thread_current()->get_id();
74         raceCheckRead(tid, addr);
75         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
76         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 2));
77         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 3));
78         return *((uint32_t *)addr);
79 }
80
81 uint64_t load_64(const void *addr)
82 {
83         DEBUG("addr = %p\n", addr);
84         thread_id_t tid = thread_current()->get_id();
85         raceCheckRead(tid, addr);
86         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
87         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 2));
88         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 3));
89         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 4));
90         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 5));
91         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 6));
92         raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 7));
93         return *((uint64_t *)addr);
94 }
95
96 // helper functions used by CdsPass
97 // The CdsPass implementation does not replace normal load/stores with cds load/stores,
98 // but inserts cds load/stores to check dataraces. Thus, the cds load/stores do not
99 // return anything. 
100
101 void cds_store8(void *addr)
102 {
103         DEBUG("addr = %p, val = %" PRIu8 "\n", addr, val);
104         thread_id_t tid = thread_current()->get_id();
105         raceCheckWrite(tid, addr);
106 }
107
108 void cds_store16(void *addr)
109 {
110         DEBUG("addr = %p, val = %" PRIu16 "\n", addr, val);
111         thread_id_t tid = thread_current()->get_id();
112         raceCheckWrite(tid, addr);
113         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
114 }
115
116 void cds_store32(void *addr)
117 {
118         DEBUG("addr = %p, val = %" PRIu32 "\n", addr, val);
119         thread_id_t tid = thread_current()->get_id();
120         raceCheckWrite(tid, addr);
121         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
122         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
123         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
124 }
125
126 void cds_store64(void *addr)
127 {
128         DEBUG("addr = %p, val = %" PRIu64 "\n", addr, val);
129         thread_id_t tid = thread_current()->get_id();
130         raceCheckWrite(tid, addr);
131         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
132         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
133         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
134         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 4));
135         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 5));
136         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 6));
137         raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 7));
138 }
139
140 void cds_load8(const void *addr) { load_8(addr); }
141 void cds_load16(const void *addr) { load_16(addr); }
142 void cds_load32(const void *addr) { load_32(addr); }
143 void cds_load64(const void *addr) { load_64(addr); }