Auto merge of #2215 - InfRandomness:getpid_shim, r=RalfJung
Getpid shim
This commit is contained in:
commit
c5f7a7d27a
@ -465,4 +465,31 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn getpid(&mut self) -> InterpResult<'tcx, i32> {
|
||||||
|
let this = self.eval_context_mut();
|
||||||
|
let target_os = &this.tcx.sess.target.os;
|
||||||
|
assert!(
|
||||||
|
target_os == "linux" || target_os == "macos",
|
||||||
|
"`getpid` is only available for the UNIX target family"
|
||||||
|
);
|
||||||
|
|
||||||
|
this.check_no_isolation("`getpid`")?;
|
||||||
|
|
||||||
|
// The reason we need to do this wacky of a conversion is because
|
||||||
|
// `libc::getpid` returns an i32, however, `std::process::id()` return an u32.
|
||||||
|
// So we un-do the conversion that stdlib does and turn it back into an i32.
|
||||||
|
|
||||||
|
Ok(std::process::id() as i32)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
fn GetCurrentProcessId(&mut self) -> InterpResult<'tcx, u32> {
|
||||||
|
let this = self.eval_context_mut();
|
||||||
|
this.assert_target_os("windows", "GetCurrentProcessId");
|
||||||
|
|
||||||
|
this.check_no_isolation("`GetCurrentProcessId`")?;
|
||||||
|
|
||||||
|
Ok(std::process::id())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -474,6 +474,12 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||||||
this.write_null(dest)?;
|
this.write_null(dest)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"getpid" => {
|
||||||
|
let [] = this.check_shim(abi, Abi::C { unwind: false}, link_name, args)?;
|
||||||
|
let result = this.getpid()?;
|
||||||
|
this.write_scalar(Scalar::from_i32(result), dest)?;
|
||||||
|
}
|
||||||
|
|
||||||
// Platform-specific shims
|
// Platform-specific shims
|
||||||
_ => {
|
_ => {
|
||||||
match this.tcx.sess.target.os.as_ref() {
|
match this.tcx.sess.target.os.as_ref() {
|
||||||
|
@ -419,6 +419,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||||||
let [] = this.check_shim(abi, Abi::System { unwind: false }, link_name, args)?;
|
let [] = this.check_shim(abi, Abi::System { unwind: false }, link_name, args)?;
|
||||||
this.write_scalar(Scalar::from_machine_isize(1, this), dest)?;
|
this.write_scalar(Scalar::from_machine_isize(1, this), dest)?;
|
||||||
}
|
}
|
||||||
|
"GetCurrentProcessId" if this.frame_in_std() => {
|
||||||
|
let [] = this.check_shim(abi, Abi::System { unwind: false }, link_name, args)?;
|
||||||
|
let result = this.GetCurrentProcessId()?;
|
||||||
|
this.write_scalar(Scalar::from_u32(result), dest)?;
|
||||||
|
}
|
||||||
|
|
||||||
_ => return Ok(EmulateByNameResult::NotSupported),
|
_ => return Ok(EmulateByNameResult::NotSupported),
|
||||||
}
|
}
|
||||||
|
9
tests/pass/getpid.rs
Normal file
9
tests/pass/getpid.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// compile-flags: -Zmiri-disable-isolation
|
||||||
|
|
||||||
|
fn getpid() -> u32 {
|
||||||
|
std::process::id()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
getpid();
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user