6 use helpers::check_arg_count;
7 use shims::windows::sync::EvalContextExt as _;
9 #[derive(Debug, Copy, Clone)]
11 AcquireSRWLockExclusive,
12 ReleaseSRWLockExclusive,
13 TryAcquireSRWLockExclusive,
16 TryAcquireSRWLockShared,
20 // Returns an error for unsupported symbols, and None if this symbol
21 // should become a NULL pointer (pretend it does not exist).
22 pub fn from_str(name: &str) -> InterpResult<'static, Option<Dlsym>> {
24 "AcquireSRWLockExclusive" => Some(Dlsym::AcquireSRWLockExclusive),
25 "ReleaseSRWLockExclusive" => Some(Dlsym::ReleaseSRWLockExclusive),
26 "TryAcquireSRWLockExclusive" => Some(Dlsym::TryAcquireSRWLockExclusive),
27 "AcquireSRWLockShared" => Some(Dlsym::AcquireSRWLockShared),
28 "ReleaseSRWLockShared" => Some(Dlsym::ReleaseSRWLockShared),
29 "TryAcquireSRWLockShared" => Some(Dlsym::TryAcquireSRWLockShared),
30 "GetSystemTimePreciseAsFileTime" => None,
31 _ => throw_unsup_format!("unsupported Windows dlsym: {}", name),
36 impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriEvalContext<'mir, 'tcx> {}
37 pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx> {
41 args: &[OpTy<'tcx, Tag>],
42 ret: Option<(PlaceTy<'tcx, Tag>, mir::BasicBlock)>,
43 ) -> InterpResult<'tcx> {
44 let this = self.eval_context_mut();
45 let (dest, ret) = ret.expect("we don't support any diverging dlsym");
46 assert!(this.tcx.sess.target.os == "windows");
49 Dlsym::AcquireSRWLockExclusive => {
50 let &[ptr] = check_arg_count(args)?;
51 this.AcquireSRWLockExclusive(ptr)?;
53 Dlsym::ReleaseSRWLockExclusive => {
54 let &[ptr] = check_arg_count(args)?;
55 this.ReleaseSRWLockExclusive(ptr)?;
57 Dlsym::TryAcquireSRWLockExclusive => {
58 let &[ptr] = check_arg_count(args)?;
59 let ret = this.TryAcquireSRWLockExclusive(ptr)?;
60 this.write_scalar(Scalar::from_u8(ret), dest)?;
62 Dlsym::AcquireSRWLockShared => {
63 let &[ptr] = check_arg_count(args)?;
64 this.AcquireSRWLockShared(ptr)?;
66 Dlsym::ReleaseSRWLockShared => {
67 let &[ptr] = check_arg_count(args)?;
68 this.ReleaseSRWLockShared(ptr)?;
70 Dlsym::TryAcquireSRWLockShared => {
71 let &[ptr] = check_arg_count(args)?;
72 let ret = this.TryAcquireSRWLockShared(ptr)?;
73 this.write_scalar(Scalar::from_u8(ret), dest)?;
77 trace!("{:?}", this.dump_place(*dest));
78 this.go_to_block(ret);