diff --git a/rust-version b/rust-version index 25ee0983ab..2064258add 100644 --- a/rust-version +++ b/rust-version @@ -1 +1 @@ -dc1eee2f256efbd1d3b50b6b090232f81cac6d72 +9a9477fada5baf69d693e717d6df902e411a73d6 diff --git a/src/shims/windows/dlsym.rs b/src/shims/windows/dlsym.rs index 415299c51f..c88a164611 100644 --- a/src/shims/windows/dlsym.rs +++ b/src/shims/windows/dlsym.rs @@ -27,7 +27,6 @@ impl Dlsym { "AcquireSRWLockShared" => Some(Dlsym::AcquireSRWLockShared), "ReleaseSRWLockShared" => Some(Dlsym::ReleaseSRWLockShared), "TryAcquireSRWLockShared" => Some(Dlsym::TryAcquireSRWLockShared), - "SetThreadStackGuarantee" => None, "GetSystemTimePreciseAsFileTime" => None, _ => throw_unsup_format!("unsupported Windows dlsym: {}", name), }) diff --git a/src/shims/windows/foreign_items.rs b/src/shims/windows/foreign_items.rs index 12b714880b..17d566d18e 100644 --- a/src/shims/windows/foreign_items.rs +++ b/src/shims/windows/foreign_items.rs @@ -5,6 +5,7 @@ use rustc_target::abi::Size; use crate::*; use helpers::check_arg_count; +use shims::windows::sync::EvalContextExt as _; impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriEvalContext<'mir, 'tcx> {} pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx> { @@ -207,6 +208,34 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx this.write_scalar(Scalar::from_i32(result), dest)?; } + // Synchronization primitives + "AcquireSRWLockExclusive" => { + let &[ptr] = check_arg_count(args)?; + this.AcquireSRWLockExclusive(ptr)?; + } + "ReleaseSRWLockExclusive" => { + let &[ptr] = check_arg_count(args)?; + this.ReleaseSRWLockExclusive(ptr)?; + } + "TryAcquireSRWLockExclusive" => { + let &[ptr] = check_arg_count(args)?; + let ret = this.TryAcquireSRWLockExclusive(ptr)?; + this.write_scalar(Scalar::from_u8(ret), dest)?; + } + "AcquireSRWLockShared" => { + let &[ptr] = check_arg_count(args)?; + this.AcquireSRWLockShared(ptr)?; + } + "ReleaseSRWLockShared" => { + let &[ptr] = check_arg_count(args)?; + this.ReleaseSRWLockShared(ptr)?; + } + "TryAcquireSRWLockShared" => { + let &[ptr] = check_arg_count(args)?; + let ret = this.TryAcquireSRWLockShared(ptr)?; + this.write_scalar(Scalar::from_u8(ret), dest)?; + } + // Dynamic symbol loading "GetProcAddress" => { #[allow(non_snake_case)] @@ -285,6 +314,12 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx // Any non zero value works for the stdlib. This is just used for stack overflows anyway. this.write_scalar(Scalar::from_machine_usize(1, this), dest)?; } + "SetThreadStackGuarantee" if this.frame().instance.to_string().starts_with("std::sys::windows::") => { + #[allow(non_snake_case)] + let &[_StackSizeInBytes] = check_arg_count(args)?; + // Any non zero value works for the stdlib. This is just used for stack overflows anyway. + this.write_scalar(Scalar::from_u32(1), dest)?; + } | "InitializeCriticalSection" | "EnterCriticalSection" | "LeaveCriticalSection"