5
5
// CXX.rs generated headers:
6
6
#include " genmc-sys/src/lib.rs.h"
7
7
8
+ #define MUTEX_UNLOCKED SVal (0 )
9
+ #define MUTEX_LOCKED SVal (1 )
10
+
8
11
auto MiriGenmcShim::handle_mutex_lock(ThreadId thread_id, uint64_t address, uint64_t size)
9
12
-> MutexLockResult {
10
13
// FIXME(genmc,multithreading): ensure this annotation id is unique even if Miri runs GenMC mode
@@ -17,17 +20,18 @@ auto MiriGenmcShim::handle_mutex_lock(ThreadId thread_id, uint64_t address, uint
17
20
} else {
18
21
annot_id = it->second ;
19
22
}
23
+ const auto size_bits = size * 8 ;
20
24
const auto annot = std::move (Annotation (
21
25
AssumeType::Spinloop,
22
26
Annotation::ExprVP (NeExpr<AnnotID>::create (
23
- RegisterExpr<AnnotID>::create (ASize (size). getBits () , annot_id),
24
- ConcreteExpr<AnnotID>::create (ASize (size). getBits (), SVal ( 1 ) )
27
+ RegisterExpr<AnnotID>::create (size_bits , annot_id),
28
+ ConcreteExpr<AnnotID>::create (size_bits, MUTEX_LOCKED )
25
29
)
26
30
.release ())
27
31
));
28
32
29
33
// Mutex starts out unlocked, so we always say the previous value is "unlocked".
30
- const auto old_val = SVal ( 0 ) ;
34
+ const auto old_val = MUTEX_UNLOCKED ;
31
35
const auto load_ret = handle_load_reset_if_none<EventLabel::EventLabelKind::LockCasRead>(
32
36
thread_id,
33
37
old_val,
@@ -47,8 +51,11 @@ auto MiriGenmcShim::handle_mutex_lock(ThreadId thread_id, uint64_t address, uint
47
51
48
52
const auto * ret_val = std::get_if<SVal>(&load_ret);
49
53
ERROR_ON (!ret_val, " Unimplemented: mutex lock returned unexpected result." );
50
- ERROR_ON (*ret_val != SVal (0 ) && *ret_val != SVal (1 ), " Mutex read value was neither 0 nor 1" );
51
- const bool is_lock_acquired = *ret_val == SVal (0 );
54
+ ERROR_ON (
55
+ *ret_val != MUTEX_UNLOCKED && *ret_val != MUTEX_LOCKED,
56
+ " Mutex read value was neither 0 nor 1"
57
+ );
58
+ const bool is_lock_acquired = *ret_val == MUTEX_UNLOCKED;
52
59
if (is_lock_acquired) {
53
60
const auto store_ret = GenMCDriver::handleStore<EventLabel::EventLabelKind::LockCasWrite>(
54
61
inc_pos (thread_id),
@@ -79,7 +86,7 @@ auto MiriGenmcShim::handle_mutex_try_lock(ThreadId thread_id, uint64_t address,
79
86
-> MutexLockResult {
80
87
auto & currPos = threads_action_[thread_id].event ;
81
88
// Mutex starts out unlocked, so we always say the previous value is "unlocked".
82
- const auto old_val = SVal ( 0 ) ;
89
+ const auto old_val = MUTEX_UNLOCKED ;
83
90
const auto load_ret = GenMCDriver::handleLoad<EventLabel::EventLabelKind::TrylockCasRead>(
84
91
++currPos,
85
92
old_val,
@@ -93,8 +100,11 @@ auto MiriGenmcShim::handle_mutex_try_lock(ThreadId thread_id, uint64_t address,
93
100
ERROR (" Unimplemented: mutex trylock load returned unexpected result." );
94
101
}
95
102
96
- ERROR_ON (*ret_val != SVal (0 ) && *ret_val != SVal (1 ), " Mutex read value was neither 0 nor 1" );
97
- const bool is_lock_acquired = *ret_val == SVal (0 );
103
+ ERROR_ON (
104
+ *ret_val != MUTEX_UNLOCKED && *ret_val != MUTEX_LOCKED,
105
+ " Mutex read value was neither 0 nor 1"
106
+ );
107
+ const bool is_lock_acquired = *ret_val == MUTEX_UNLOCKED;
98
108
if (!is_lock_acquired) {
99
109
return MutexLockResultExt::ok (false ); /* Lock already held. */
100
110
}
@@ -123,12 +133,12 @@ auto MiriGenmcShim::handle_mutex_unlock(ThreadId thread_id, uint64_t address, ui
123
133
const auto ret = GenMCDriver::handleStore<EventLabel::EventLabelKind::UnlockWrite>(
124
134
pos,
125
135
// Mutex starts out unlocked, so we always say the previous value is "unlocked".
126
- /* old_val */ SVal ( 0 ) ,
136
+ /* old_val */ MUTEX_UNLOCKED ,
127
137
MemOrdering::Release,
128
138
SAddr (address),
129
139
ASize (size),
130
140
AType::Signed,
131
- SVal ( 0 ) ,
141
+ /* store_value */ MUTEX_UNLOCKED ,
132
142
EventDeps ()
133
143
);
134
144
if (const auto * err = std::get_if<VerificationError>(&ret))
0 commit comments