@@ -49,6 +49,7 @@ void MiriGenmcShim::handle_assume_block(ThreadId thread_id) {
4949 const auto type = AType::Unsigned;
5050 const auto ret = handle_load_reset_if_none<EventLabel::EventLabelKind::Read>(
5151 thread_id,
52+ GenmcScalarExt::try_to_sval (old_val),
5253 ord,
5354 SAddr (address),
5455 ASize (size),
@@ -74,6 +75,7 @@ void MiriGenmcShim::handle_assume_block(ThreadId thread_id) {
7475 const auto pos = inc_pos (thread_id);
7576 const auto ret = GenMCDriver::handleStore<EventLabel::EventLabelKind::Write>(
7677 pos,
78+ GenmcScalarExt::try_to_sval (old_val),
7779 ord,
7880 SAddr (address),
7981 ASize (size),
@@ -84,15 +86,13 @@ void MiriGenmcShim::handle_assume_block(ThreadId thread_id) {
8486
8587 if (const auto * err = std::get_if<VerificationError>(&ret))
8688 return StoreResultExt::from_error (format_error (*err));
87- if (!std::holds_alternative<std::monostate>(ret))
88- ERROR (" store returned unexpected result" );
8989
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."
9594 );
95+ return StoreResultExt::ok (*is_coherence_order_maximal_write);
9696}
9797
9898void MiriGenmcShim::handle_fence (ThreadId thread_id, MemOrdering ord) {
@@ -117,6 +117,7 @@ void MiriGenmcShim::handle_fence(ThreadId thread_id, MemOrdering ord) {
117117 // `FaiRead` and `FaiWrite`.
118118 const auto load_ret = handle_load_reset_if_none<EventLabel::EventLabelKind::FaiRead>(
119119 thread_id,
120+ GenmcScalarExt::try_to_sval (old_val),
120121 ordering,
121122 SAddr (address),
122123 ASize (size),
@@ -139,6 +140,7 @@ void MiriGenmcShim::handle_fence(ThreadId thread_id, MemOrdering ord) {
139140 const auto storePos = inc_pos (thread_id);
140141 const auto store_ret = GenMCDriver::handleStore<EventLabel::EventLabelKind::FaiWrite>(
141142 storePos,
143+ GenmcScalarExt::try_to_sval (old_val),
142144 ordering,
143145 SAddr (address),
144146 ASize (size),
@@ -148,16 +150,15 @@ void MiriGenmcShim::handle_fence(ThreadId thread_id, MemOrdering ord) {
148150 if (const auto * err = std::get_if<VerificationError>(&store_ret))
149151 return ReadModifyWriteResultExt::from_error (format_error (*err));
150152
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+ );
157158 return ReadModifyWriteResultExt::ok (
158159 /* old_value: */ read_old_val,
159160 new_value,
160- /* is_coherence_order_maximal_write */ g. co_max ( SAddr (address))-> getPos () == storePos
161+ * is_coherence_order_maximal_write
161162 );
162163}
163164
@@ -183,6 +184,7 @@ void MiriGenmcShim::handle_fence(ThreadId thread_id, MemOrdering ord) {
183184
184185 const auto load_ret = handle_load_reset_if_none<EventLabel::EventLabelKind::CasRead>(
185186 thread_id,
187+ GenmcScalarExt::try_to_sval (old_val),
186188 success_ordering,
187189 SAddr (address),
188190 ASize (size),
@@ -203,6 +205,7 @@ void MiriGenmcShim::handle_fence(ThreadId thread_id, MemOrdering ord) {
203205 const auto storePos = inc_pos (thread_id);
204206 const auto store_ret = GenMCDriver::handleStore<EventLabel::EventLabelKind::CasWrite>(
205207 storePos,
208+ GenmcScalarExt::try_to_sval (old_val),
206209 success_ordering,
207210 SAddr (address),
208211 ASize (size),
@@ -211,19 +214,12 @@ void MiriGenmcShim::handle_fence(ThreadId thread_id, MemOrdering ord) {
211214 );
212215 if (const auto * err = std::get_if<VerificationError>(&store_ret))
213216 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);
215218 ERROR_ON (
216- nullptr == store_ret_val ,
219+ nullptr == is_coherence_order_maximal_write ,
217220 " Unimplemented: compare-exchange store returned unexpected result."
218221 );
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);
227223}
228224
229225/* *** Memory (de)allocation ****/
0 commit comments