@@ -49,6 +49,7 @@ void MiriGenmcShim::handle_assume_block(ThreadId thread_id) {
49
49
const auto type = AType::Unsigned;
50
50
const auto ret = handle_load_reset_if_none<EventLabel::EventLabelKind::Read>(
51
51
thread_id,
52
+ GenmcScalarExt::try_to_sval (old_val),
52
53
ord,
53
54
SAddr (address),
54
55
ASize (size),
@@ -74,6 +75,7 @@ void MiriGenmcShim::handle_assume_block(ThreadId thread_id) {
74
75
const auto pos = inc_pos (thread_id);
75
76
const auto ret = GenMCDriver::handleStore<EventLabel::EventLabelKind::Write>(
76
77
pos,
78
+ GenmcScalarExt::try_to_sval (old_val),
77
79
ord,
78
80
SAddr (address),
79
81
ASize (size),
@@ -84,15 +86,13 @@ void MiriGenmcShim::handle_assume_block(ThreadId thread_id) {
84
86
85
87
if (const auto * err = std::get_if<VerificationError>(&ret))
86
88
return StoreResultExt::from_error (format_error (*err));
87
- if (!std::holds_alternative<std::monostate>(ret))
88
- ERROR (" store returned unexpected result" );
89
89
90
- // FIXME(genmc,mixed-accesses): Use the value that GenMC returns from handleStore (once
91
- // available).
92
- const auto & g = getExec ().getGraph ();
93
- return StoreResultExt::ok (
94
- /* is_coherence_order_maximal_write */ g.co_max (SAddr (address))->getPos () == pos
90
+ const bool * is_coherence_order_maximal_write = std::get_if<bool >(&ret);
91
+ ERROR_ON (
92
+ nullptr == is_coherence_order_maximal_write,
93
+ " Unimplemented: Store returned unexpected result."
95
94
);
95
+ return StoreResultExt::ok (*is_coherence_order_maximal_write);
96
96
}
97
97
98
98
void MiriGenmcShim::handle_fence (ThreadId thread_id, MemOrdering ord) {
@@ -117,6 +117,7 @@ void MiriGenmcShim::handle_fence(ThreadId thread_id, MemOrdering ord) {
117
117
// `FaiRead` and `FaiWrite`.
118
118
const auto load_ret = handle_load_reset_if_none<EventLabel::EventLabelKind::FaiRead>(
119
119
thread_id,
120
+ GenmcScalarExt::try_to_sval (old_val),
120
121
ordering,
121
122
SAddr (address),
122
123
ASize (size),
@@ -139,6 +140,7 @@ void MiriGenmcShim::handle_fence(ThreadId thread_id, MemOrdering ord) {
139
140
const auto storePos = inc_pos (thread_id);
140
141
const auto store_ret = GenMCDriver::handleStore<EventLabel::EventLabelKind::FaiWrite>(
141
142
storePos,
143
+ GenmcScalarExt::try_to_sval (old_val),
142
144
ordering,
143
145
SAddr (address),
144
146
ASize (size),
@@ -148,16 +150,15 @@ void MiriGenmcShim::handle_fence(ThreadId thread_id, MemOrdering ord) {
148
150
if (const auto * err = std::get_if<VerificationError>(&store_ret))
149
151
return ReadModifyWriteResultExt::from_error (format_error (*err));
150
152
151
- const auto * store_ret_val = std::get_if<std::monostate>(&store_ret);
152
- ERROR_ON (nullptr == store_ret_val, " Unimplemented: RMW store returned unexpected result." );
153
-
154
- // FIXME(genmc,mixed-accesses): Use the value that GenMC returns from handleStore (once
155
- // available).
156
- const auto & g = getExec ().getGraph ();
153
+ const bool * is_coherence_order_maximal_write = std::get_if<bool >(&store_ret);
154
+ ERROR_ON (
155
+ nullptr == is_coherence_order_maximal_write,
156
+ " Unimplemented: RMW store returned unexpected result."
157
+ );
157
158
return ReadModifyWriteResultExt::ok (
158
159
/* old_value: */ read_old_val,
159
160
new_value,
160
- /* is_coherence_order_maximal_write */ g. co_max ( SAddr (address))-> getPos () == storePos
161
+ * is_coherence_order_maximal_write
161
162
);
162
163
}
163
164
@@ -183,6 +184,7 @@ void MiriGenmcShim::handle_fence(ThreadId thread_id, MemOrdering ord) {
183
184
184
185
const auto load_ret = handle_load_reset_if_none<EventLabel::EventLabelKind::CasRead>(
185
186
thread_id,
187
+ GenmcScalarExt::try_to_sval (old_val),
186
188
success_ordering,
187
189
SAddr (address),
188
190
ASize (size),
@@ -203,6 +205,7 @@ void MiriGenmcShim::handle_fence(ThreadId thread_id, MemOrdering ord) {
203
205
const auto storePos = inc_pos (thread_id);
204
206
const auto store_ret = GenMCDriver::handleStore<EventLabel::EventLabelKind::CasWrite>(
205
207
storePos,
208
+ GenmcScalarExt::try_to_sval (old_val),
206
209
success_ordering,
207
210
SAddr (address),
208
211
ASize (size),
@@ -211,19 +214,12 @@ void MiriGenmcShim::handle_fence(ThreadId thread_id, MemOrdering ord) {
211
214
);
212
215
if (const auto * err = std::get_if<VerificationError>(&store_ret))
213
216
return CompareExchangeResultExt::from_error (format_error (*err));
214
- const auto * store_ret_val = std::get_if<std::monostate >(&store_ret);
217
+ const bool * is_coherence_order_maximal_write = std::get_if<bool >(&store_ret);
215
218
ERROR_ON (
216
- nullptr == store_ret_val ,
219
+ nullptr == is_coherence_order_maximal_write ,
217
220
" Unimplemented: compare-exchange store returned unexpected result."
218
221
);
219
-
220
- // FIXME(genmc,mixed-accesses): Use the value that GenMC returns from handleStore (once
221
- // available).
222
- const auto & g = getExec ().getGraph ();
223
- return CompareExchangeResultExt::success (
224
- read_old_val,
225
- /* is_coherence_order_maximal_write */ g.co_max (SAddr (address))->getPos () == storePos
226
- );
222
+ return CompareExchangeResultExt::success (read_old_val, *is_coherence_order_maximal_write);
227
223
}
228
224
229
225
/* *** Memory (de)allocation ****/
0 commit comments