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