Skip to content

Commit 44ce0a2

Browse files
committed
Remove compare_exchange support.
1 parent feadc29 commit 44ce0a2

File tree

11 files changed

+19
-301
lines changed

11 files changed

+19
-301
lines changed

genmc-sys/src/lib.rs

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,6 @@ mod ffi {
7777
UMin = 10,
7878
}
7979

80-
// TODO GENMC: do these have to be shared with the Rust side?
81-
#[derive(Debug)]
82-
enum StoreEventType {
83-
Normal,
84-
CompareExchange,
85-
}
86-
8780
#[derive(Debug, Clone, Copy)]
8881
struct GenmcScalar {
8982
value: u64,
@@ -92,15 +85,6 @@ mod ffi {
9285

9386
/**** \/ Result & Error types \/ ****/
9487

95-
#[must_use]
96-
#[derive(Debug)]
97-
struct CompareExchangeResult {
98-
old_value: GenmcScalar, // TODO GENMC: handle bigger values
99-
is_success: bool,
100-
isCoMaxWrite: bool,
101-
error: UniquePtr<CxxString>, // TODO GENMC: pass more error info here
102-
}
103-
10488
#[must_use]
10589
#[derive(Debug)]
10690
struct LoadResult {
@@ -158,15 +142,13 @@ mod ffi {
158142

159143
type MemOrdering;
160144
type RMWBinOp;
161-
type StoreEventType;
162145

163146
// Types for Scheduling queries:
164147
type ActionKind;
165148

166149
// Result / Error types:
167150
type LoadResult;
168151
type StoreResult;
169-
type CompareExchangeResult;
170152
type VerificationError;
171153

172154
type GenmcScalar;
@@ -188,19 +170,6 @@ mod ffi {
188170
memory_ordering: MemOrdering,
189171
old_value: GenmcScalar,
190172
) -> LoadResult;
191-
fn handleCompareExchange(
192-
self: Pin<&mut MiriGenMCShim>,
193-
thread_id: i32,
194-
address: u64,
195-
size: u64,
196-
expected_value: GenmcScalar,
197-
new_value: GenmcScalar,
198-
old_value: GenmcScalar,
199-
success_load_ordering: MemOrdering,
200-
success_store_ordering: MemOrdering,
201-
fail_load_ordering: MemOrdering,
202-
can_fail_spuriously: bool,
203-
) -> CompareExchangeResult;
204173
fn handleStore(
205174
self: Pin<&mut MiriGenMCShim>,
206175
thread_id: i32,
@@ -209,7 +178,6 @@ mod ffi {
209178
value: GenmcScalar,
210179
old_value: GenmcScalar,
211180
memory_ordering: MemOrdering,
212-
store_event_type: StoreEventType,
213181
) -> StoreResult;
214182

215183
fn handleMalloc(

genmc-sys/src_cpp/MiriInterface.cpp

Lines changed: 3 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ void MiriGenMCShim::handleThreadFinish(ThreadId thread_id, uint64_t ret_val)
218218
MemOrdering ord, GenmcScalar old_val) -> LoadResult
219219
{
220220
auto pos = incPos(thread_id);
221-
221+
222222
auto loc = SAddr(address);
223223
auto aSize = ASize(size);
224224
auto type = AType::Unsigned; // TODO GENMC: get correct type from Miri
@@ -231,49 +231,9 @@ void MiriGenMCShim::handleThreadFinish(ThreadId thread_id, uint64_t ret_val)
231231
return result;
232232
}
233233

234-
[[nodiscard]] auto MiriGenMCShim::handleCompareExchange(
235-
ThreadId thread_id, uint64_t address, uint64_t size, GenmcScalar expected_value,
236-
GenmcScalar new_value, GenmcScalar old_val, MemOrdering success_load_ordering,
237-
MemOrdering success_store_ordering, MemOrdering fail_load_ordering,
238-
bool can_fail_spuriously) -> CompareExchangeResult
239-
{
240-
auto pos = incPos(thread_id);
241-
242-
auto loc = SAddr(address);
243-
auto aSize = ASize(size);
244-
auto type = AType::Unsigned;
245-
246-
auto expectedVal = expected_value.toSVal();
247-
auto newVal = new_value.toSVal();
248-
249-
// FIXME(GenMC): properly handle failure memory ordering.
250-
251-
auto newLab = std::make_unique<CasReadLabel>(pos, success_load_ordering, loc, aSize, type,
252-
expectedVal, newVal);
253-
254-
auto oldValSetter = [this, old_val](SAddr loc)
255-
{ this->handleOldVal(loc, old_val); };
256-
auto result = GenMCDriver::handleLoad(std::move(newLab), oldValSetter);
257-
if (const auto *error = result.error.get())
258-
{
259-
return CompareExchangeResult::fromError(*error);
260-
}
261-
262-
auto oldVal = result.scalar.toSVal();
263-
if (oldVal != expectedVal)
264-
return CompareExchangeResult::failure(oldVal);
265-
266-
auto store_result = handleStore(thread_id, address, size, GenmcScalar(newVal), old_val,
267-
success_store_ordering, StoreEventType::CompareExchange);
268-
269-
if (store_result.is_error())
270-
return CompareExchangeResult::fromError(*store_result.error);
271-
return CompareExchangeResult::success(oldVal, store_result.isCoMaxWrite);
272-
}
273-
274234
[[nodiscard]] auto MiriGenMCShim::handleStore(ThreadId thread_id, uint64_t address, uint64_t size,
275235
GenmcScalar value, GenmcScalar old_val,
276-
MemOrdering ord, StoreEventType store_event_type)
236+
MemOrdering ord)
277237
-> StoreResult
278238
{
279239
auto pos = incPos(thread_id);
@@ -282,21 +242,9 @@ void MiriGenMCShim::handleThreadFinish(ThreadId thread_id, uint64_t ret_val)
282242
auto aSize = ASize(size);
283243
auto type = AType::Unsigned; // TODO GENMC: get from Miri
284244

285-
// TODO GENMC: u128 support
286245
auto val = value.toSVal();
287246

288-
std::unique_ptr<WriteLabel> wLab;
289-
switch (store_event_type)
290-
{
291-
case StoreEventType::Normal:
292-
wLab = std::make_unique<WriteLabel>(pos, ord, loc, aSize, type, val);
293-
break;
294-
case StoreEventType::CompareExchange:
295-
wLab = std::make_unique<CasWriteLabel>(pos, ord, loc, aSize, type, val);
296-
break;
297-
default:
298-
ERROR("Unsupported Store Event Type");
299-
}
247+
std::unique_ptr<WriteLabel> wLab = std::make_unique<WriteLabel>(pos, ord, loc, aSize, type, val);
300248

301249
auto oldValSetter = [this, old_val](SAddr loc)
302250
{

genmc-sys/src_cpp/MiriInterface.hpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,9 @@ struct MiriGenMCShim : private GenMCDriver
5555
///////////////////
5656
[[nodiscard]] LoadResult handleLoad(ThreadId thread_id, uint64_t address, uint64_t size,
5757
MemOrdering ord, GenmcScalar old_val);
58-
[[nodiscard]] CompareExchangeResult
59-
handleCompareExchange(ThreadId thread_id, uint64_t address, uint64_t size,
60-
GenmcScalar expected_value, GenmcScalar new_value,
61-
GenmcScalar old_val, MemOrdering success_load_ordering,
62-
MemOrdering success_store_ordering, MemOrdering fail_load_ordering,
63-
bool can_fail_spuriously);
6458
[[nodiscard]] StoreResult handleStore(ThreadId thread_id, uint64_t address, uint64_t size,
6559
GenmcScalar value, GenmcScalar old_val,
66-
MemOrdering ord, StoreEventType store_event_type);
60+
MemOrdering ord);
6761

6862
/**** Memory (de)allocation ****/
6963

src/concurrency/genmc/mapping.rs

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use genmc_sys::MemOrdering;
22

3-
use crate::{AtomicReadOrd, AtomicRwOrd, AtomicWriteOrd};
3+
use crate::{AtomicReadOrd, AtomicWriteOrd};
44

55
impl AtomicReadOrd {
66
pub(super) fn convert(self) -> MemOrdering {
@@ -21,18 +21,3 @@ impl AtomicWriteOrd {
2121
}
2222
}
2323
}
24-
25-
impl AtomicRwOrd {
26-
/// Split up the atomic success ordering of a read-modify-write operation into GenMC's representation.
27-
/// Note that both returned orderings are currently identical, because this is what GenMC expects.
28-
pub(super) fn to_genmc_memory_orderings(self) -> (MemOrdering, MemOrdering) {
29-
match self {
30-
AtomicRwOrd::Relaxed => (MemOrdering::Relaxed, MemOrdering::Relaxed),
31-
AtomicRwOrd::Acquire => (MemOrdering::Acquire, MemOrdering::Acquire),
32-
AtomicRwOrd::Release => (MemOrdering::Release, MemOrdering::Release),
33-
AtomicRwOrd::AcqRel => (MemOrdering::AcquireRelease, MemOrdering::AcquireRelease),
34-
AtomicRwOrd::SeqCst =>
35-
(MemOrdering::SequentiallyConsistent, MemOrdering::SequentiallyConsistent),
36-
}
37-
}
38-
}

src/concurrency/genmc/mod.rs

Lines changed: 14 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,15 @@ use std::sync::Arc;
33

44
use genmc_sys::{
55
ActionKind, GENMC_GLOBAL_ADDRESSES_MASK, GenmcScalar, GenmcThreadId, MemOrdering,
6-
MiriGenMCShim, StoreEventType, UniquePtr, createGenmcHandle,
6+
MiriGenMCShim, UniquePtr, createGenmcHandle,
77
};
88
use rustc_abi::{Align, Size};
99
use rustc_const_eval::interpret::{AllocId, InterpCx, InterpResult, interp_ok};
1010
use rustc_middle::{mir, throw_machine_stop, throw_ub_format, throw_unsup_format};
1111
use tracing::info;
1212

1313
use self::global_allocations::{EvalContextExtPriv as _, GlobalAllocationHandler};
14-
use self::helper::{
15-
genmc_scalar_to_scalar, option_scalar_to_genmc_scalar,
16-
scalar_to_genmc_scalar,
17-
};
14+
use self::helper::{genmc_scalar_to_scalar, option_scalar_to_genmc_scalar, scalar_to_genmc_scalar};
1815
use self::thread_info_manager::ThreadInfoManager;
1916
use crate::concurrency::genmc::helper::split_access;
2017
use crate::{
@@ -214,7 +211,7 @@ impl GenmcCtx {
214211
_old_value: Scalar,
215212
) -> InterpResult<'tcx, (Scalar, Option<Scalar>)> {
216213
assert!(!self.allow_data_races.get());
217-
throw_unsup_format!("FIXME(genmc): Add support for atomic min/max.")
214+
throw_unsup_format!("FIXME(genmc): Add support for atomic RMW.")
218215
}
219216

220217
/// Inform GenMC about an atomic `min` or `max` operation.
@@ -253,69 +250,19 @@ impl GenmcCtx {
253250

254251
pub(crate) fn atomic_compare_exchange<'tcx>(
255252
&self,
256-
ecx: &InterpCx<'tcx, MiriMachine<'tcx>>,
257-
address: Size,
258-
size: Size,
259-
expected_old_value: Scalar,
260-
new_value: Scalar,
261-
success: AtomicRwOrd,
262-
fail: AtomicReadOrd,
263-
can_fail_spuriously: bool,
253+
_ecx: &InterpCx<'tcx, MiriMachine<'tcx>>,
254+
_address: Size,
255+
_size: Size,
256+
_expected_old_value: Scalar,
257+
_new_value: Scalar,
258+
_success: AtomicRwOrd,
259+
_fail: AtomicReadOrd,
260+
_can_fail_spuriously: bool,
264261
// The value that we would get, if we were to do a non-atomic load here.
265-
old_value: Scalar,
262+
_old_value: Scalar,
266263
) -> InterpResult<'tcx, (Scalar, bool, bool)> {
267-
assert!(!self.allow_data_races.get()); // TODO GENMC: handle this properly
268-
269-
let machine = &ecx.machine;
270-
let (success_load_ordering, success_store_ordering) = success.to_genmc_memory_orderings();
271-
let fail_load_ordering = fail.convert();
272-
273-
info!(
274-
"GenMC: atomic_compare_exchange, address: {address:?}, size: {size:?} (expect: {expected_old_value:?}, new: {new_value:?}, old_value: {old_value:?}, {success:?}, {fail:?}), can fail spuriously: {can_fail_spuriously}"
275-
);
276-
info!(
277-
"GenMC: atomic_compare_exchange orderings: success: ({success_load_ordering:?}, {success_store_ordering:?}), failure load ordering: {fail_load_ordering:?}"
278-
);
279-
280-
let thread_infos = self.thread_infos.borrow();
281-
let curr_thread = machine.threads.active_thread();
282-
let genmc_tid = thread_infos.get_info(curr_thread).genmc_tid;
283-
284-
let genmc_address = address.bytes();
285-
let genmc_size = size.bytes();
286-
287-
let genmc_expected_value = scalar_to_genmc_scalar(ecx, expected_old_value)?;
288-
let genmc_new_value = scalar_to_genmc_scalar(ecx, new_value)?;
289-
let genmc_old_value = scalar_to_genmc_scalar(ecx, old_value)?;
290-
291-
let mut mc = self.handle.borrow_mut();
292-
let pinned_mc = mc.as_mut().unwrap();
293-
let cas_result = pinned_mc.handleCompareExchange(
294-
genmc_tid.0,
295-
genmc_address,
296-
genmc_size,
297-
genmc_expected_value,
298-
genmc_new_value,
299-
genmc_old_value,
300-
success_load_ordering,
301-
success_store_ordering,
302-
fail_load_ordering,
303-
can_fail_spuriously,
304-
);
305-
306-
if let Some(error) = cas_result.error.as_ref() {
307-
let msg = error.to_string_lossy().to_string();
308-
info!("GenMC: RMW operation returned an error: \"{msg}\"");
309-
throw_ub_format!("{}", msg); // TODO GENMC: proper error handling: find correct error here
310-
}
311-
312-
let return_scalar = genmc_scalar_to_scalar(ecx, cas_result.old_value, size)?;
313-
info!(
314-
"GenMC: atomic_compare_exchange: result: {cas_result:?}, returning scalar: {return_scalar:?}"
315-
);
316-
// The write can only be a co-maximal write if the CAS succeeded.
317-
assert!(cas_result.is_success || !cas_result.isCoMaxWrite);
318-
interp_ok((return_scalar, cas_result.isCoMaxWrite, cas_result.is_success))
264+
assert!(!self.allow_data_races.get());
265+
throw_unsup_format!("FIXME(genmc): Add support for atomic compare_exchange.")
319266
}
320267

321268
/// Inform GenMC about a non-atomic memory load
@@ -671,7 +618,6 @@ impl GenmcCtx {
671618
genmc_value,
672619
genmc_old_value,
673620
memory_ordering,
674-
StoreEventType::Normal,
675621
);
676622

677623
if let Some(error) = store_result.error.as_ref() {

tests/genmc/pass/litmus/casdep/casdep.rs

Lines changed: 0 additions & 34 deletions
This file was deleted.

tests/genmc/pass/litmus/casdep/casdep.stderr

Lines changed: 0 additions & 3 deletions
This file was deleted.

tests/genmc/pass/litmus/ccr/ccr.rs

Lines changed: 0 additions & 33 deletions
This file was deleted.

tests/genmc/pass/litmus/ccr/ccr.stderr

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)