Auto merge of #2306 - RalfJung:unix, r=RalfJung
make some things available for all Unixes
This commit is contained in:
commit
428245072e
@ -62,6 +62,11 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||||||
let result = this.open(args)?;
|
let result = this.open(args)?;
|
||||||
this.write_scalar(Scalar::from_i32(result), dest)?;
|
this.write_scalar(Scalar::from_i32(result), dest)?;
|
||||||
}
|
}
|
||||||
|
"close" => {
|
||||||
|
let [fd] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
|
let result = this.close(fd)?;
|
||||||
|
this.write_scalar(Scalar::from_i32(result), dest)?;
|
||||||
|
}
|
||||||
"fcntl" => {
|
"fcntl" => {
|
||||||
// `fcntl` is variadic. The argument count is checked based on the first argument
|
// `fcntl` is variadic. The argument count is checked based on the first argument
|
||||||
// in `this.fcntl()`, so we do not use `check_shim` here.
|
// in `this.fcntl()`, so we do not use `check_shim` here.
|
||||||
@ -112,17 +117,27 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||||||
let result = this.rmdir(path)?;
|
let result = this.rmdir(path)?;
|
||||||
this.write_scalar(Scalar::from_i32(result), dest)?;
|
this.write_scalar(Scalar::from_i32(result), dest)?;
|
||||||
}
|
}
|
||||||
|
"opendir" => {
|
||||||
|
let [name] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
|
let result = this.opendir(name)?;
|
||||||
|
this.write_scalar(result, dest)?;
|
||||||
|
}
|
||||||
"closedir" => {
|
"closedir" => {
|
||||||
let [dirp] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
let [dirp] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
let result = this.closedir(dirp)?;
|
let result = this.closedir(dirp)?;
|
||||||
this.write_scalar(Scalar::from_i32(result), dest)?;
|
this.write_scalar(Scalar::from_i32(result), dest)?;
|
||||||
}
|
}
|
||||||
"lseek" | "lseek64" => {
|
"lseek64" => {
|
||||||
let [fd, offset, whence] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
let [fd, offset, whence] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
let result = this.lseek64(fd, offset, whence)?;
|
let result = this.lseek64(fd, offset, whence)?;
|
||||||
// "lseek" is only used on macOS which is 64bit-only, so `i64` always works.
|
|
||||||
this.write_scalar(Scalar::from_i64(result), dest)?;
|
this.write_scalar(Scalar::from_i64(result), dest)?;
|
||||||
}
|
}
|
||||||
|
"ftruncate64" => {
|
||||||
|
let [fd, length] =
|
||||||
|
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
|
let result = this.ftruncate64(fd, length)?;
|
||||||
|
this.write_scalar(Scalar::from_i32(result), dest)?;
|
||||||
|
}
|
||||||
"fsync" => {
|
"fsync" => {
|
||||||
let [fd] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
let [fd] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
let result = this.fsync(fd)?;
|
let result = this.fsync(fd)?;
|
||||||
@ -138,6 +153,16 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||||||
let result = this.readlink(pathname, buf, bufsize)?;
|
let result = this.readlink(pathname, buf, bufsize)?;
|
||||||
this.write_scalar(Scalar::from_machine_isize(result, this), dest)?;
|
this.write_scalar(Scalar::from_machine_isize(result, this), dest)?;
|
||||||
}
|
}
|
||||||
|
"posix_fadvise" => {
|
||||||
|
let [fd, offset, len, advice] =
|
||||||
|
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
|
this.read_scalar(fd)?.to_i32()?;
|
||||||
|
this.read_scalar(offset)?.to_machine_isize(this)?;
|
||||||
|
this.read_scalar(len)?.to_machine_isize(this)?;
|
||||||
|
this.read_scalar(advice)?.to_i32()?;
|
||||||
|
// fadvise is only informational, we can ignore it.
|
||||||
|
this.write_null(dest)?;
|
||||||
|
}
|
||||||
|
|
||||||
// Time related shims
|
// Time related shims
|
||||||
"gettimeofday" => {
|
"gettimeofday" => {
|
||||||
|
@ -30,40 +30,12 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||||||
}
|
}
|
||||||
|
|
||||||
// File related shims (but also see "syscall" below for statx)
|
// File related shims (but also see "syscall" below for statx)
|
||||||
// These symbols have different names on Linux and macOS, which is the only reason they are not
|
|
||||||
// in the `posix` module.
|
|
||||||
"close" => {
|
|
||||||
let [fd] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
|
||||||
let result = this.close(fd)?;
|
|
||||||
this.write_scalar(Scalar::from_i32(result), dest)?;
|
|
||||||
}
|
|
||||||
"opendir" => {
|
|
||||||
let [name] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
|
||||||
let result = this.opendir(name)?;
|
|
||||||
this.write_scalar(result, dest)?;
|
|
||||||
}
|
|
||||||
"readdir64" => {
|
"readdir64" => {
|
||||||
let [dirp] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
let [dirp] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
let result = this.linux_readdir64(dirp)?;
|
let result = this.linux_readdir64(dirp)?;
|
||||||
this.write_scalar(result, dest)?;
|
this.write_scalar(result, dest)?;
|
||||||
}
|
}
|
||||||
"ftruncate64" => {
|
|
||||||
let [fd, length] =
|
|
||||||
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
|
||||||
let result = this.ftruncate64(fd, length)?;
|
|
||||||
this.write_scalar(Scalar::from_i32(result), dest)?;
|
|
||||||
}
|
|
||||||
// Linux-only
|
// Linux-only
|
||||||
"posix_fadvise" => {
|
|
||||||
let [fd, offset, len, advice] =
|
|
||||||
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
|
||||||
this.read_scalar(fd)?.to_i32()?;
|
|
||||||
this.read_scalar(offset)?.to_machine_isize(this)?;
|
|
||||||
this.read_scalar(len)?.to_machine_isize(this)?;
|
|
||||||
this.read_scalar(advice)?.to_i32()?;
|
|
||||||
// fadvise is only informational, we can ignore it.
|
|
||||||
this.write_null(dest)?;
|
|
||||||
}
|
|
||||||
"sync_file_range" => {
|
"sync_file_range" => {
|
||||||
let [fd, offset, nbytes, flags] =
|
let [fd, offset, nbytes, flags] =
|
||||||
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
|
@ -28,7 +28,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||||||
}
|
}
|
||||||
|
|
||||||
// File related shims
|
// File related shims
|
||||||
"close" | "close$NOCANCEL" => {
|
"close$NOCANCEL" => {
|
||||||
let [result] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
let [result] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
let result = this.close(result)?;
|
let result = this.close(result)?;
|
||||||
this.write_scalar(Scalar::from_i32(result), dest)?;
|
this.write_scalar(Scalar::from_i32(result), dest)?;
|
||||||
@ -50,7 +50,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||||||
let result = this.macos_fstat(fd, buf)?;
|
let result = this.macos_fstat(fd, buf)?;
|
||||||
this.write_scalar(Scalar::from_i32(result), dest)?;
|
this.write_scalar(Scalar::from_i32(result), dest)?;
|
||||||
}
|
}
|
||||||
"opendir" | "opendir$INODE64" => {
|
"opendir$INODE64" => {
|
||||||
let [name] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
let [name] = this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
let result = this.opendir(name)?;
|
let result = this.opendir(name)?;
|
||||||
this.write_scalar(result, dest)?;
|
this.write_scalar(result, dest)?;
|
||||||
@ -61,9 +61,17 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
|
|||||||
let result = this.macos_readdir_r(dirp, entry, result)?;
|
let result = this.macos_readdir_r(dirp, entry, result)?;
|
||||||
this.write_scalar(Scalar::from_i32(result), dest)?;
|
this.write_scalar(Scalar::from_i32(result), dest)?;
|
||||||
}
|
}
|
||||||
|
"lseek" => {
|
||||||
|
let [fd, offset, whence] =
|
||||||
|
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
|
// macOS is 64bit-only, so this is lseek64
|
||||||
|
let result = this.lseek64(fd, offset, whence)?;
|
||||||
|
this.write_scalar(Scalar::from_i64(result), dest)?;
|
||||||
|
}
|
||||||
"ftruncate" => {
|
"ftruncate" => {
|
||||||
let [fd, length] =
|
let [fd, length] =
|
||||||
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
this.check_shim(abi, Abi::C { unwind: false }, link_name, args)?;
|
||||||
|
// macOS is 64bit-only, so this is ftruncate64
|
||||||
let result = this.ftruncate64(fd, length)?;
|
let result = this.ftruncate64(fd, length)?;
|
||||||
this.write_scalar(Scalar::from_i32(result), dest)?;
|
this.write_scalar(Scalar::from_i32(result), dest)?;
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ fn test_posix_fadvise() {
|
|||||||
assert_eq!(result, 0);
|
assert_eq!(result, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
|
#[cfg(any(target_os = "linux"))]
|
||||||
fn test_sync_file_range() {
|
fn test_sync_file_range() {
|
||||||
use std::fs::{remove_file, File};
|
use std::fs::{remove_file, File};
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
@ -208,7 +208,7 @@ fn test_rwlock_libc_static_initializer() {
|
|||||||
/// Test whether the `prctl` shim correctly sets the thread name.
|
/// Test whether the `prctl` shim correctly sets the thread name.
|
||||||
///
|
///
|
||||||
/// Note: `prctl` exists only on Linux.
|
/// Note: `prctl` exists only on Linux.
|
||||||
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
|
#[cfg(any(target_os = "linux"))]
|
||||||
fn test_prctl_thread_name() {
|
fn test_prctl_thread_name() {
|
||||||
use libc::c_long;
|
use libc::c_long;
|
||||||
use std::ffi::CString;
|
use std::ffi::CString;
|
||||||
@ -259,9 +259,9 @@ fn test_prctl_thread_name() {
|
|||||||
|
|
||||||
/// Tests whether each thread has its own `__errno_location`.
|
/// Tests whether each thread has its own `__errno_location`.
|
||||||
fn test_thread_local_errno() {
|
fn test_thread_local_errno() {
|
||||||
#[cfg(not(target_os = "macos"))]
|
#[cfg(target_os = "linux")]
|
||||||
use libc::__errno_location;
|
use libc::__errno_location;
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(any(target_os = "macos", target_os = "freebsd"))]
|
||||||
use libc::__error as __errno_location;
|
use libc::__error as __errno_location;
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
@ -278,7 +278,7 @@ fn test_thread_local_errno() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Tests whether clock support exists at all
|
/// Tests whether clock support exists at all
|
||||||
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
|
#[cfg(any(target_os = "linux"))]
|
||||||
fn test_clocks() {
|
fn test_clocks() {
|
||||||
let mut tp = std::mem::MaybeUninit::<libc::timespec>::uninit();
|
let mut tp = std::mem::MaybeUninit::<libc::timespec>::uninit();
|
||||||
let is_error = unsafe { libc::clock_gettime(libc::CLOCK_REALTIME, tp.as_mut_ptr()) };
|
let is_error = unsafe { libc::clock_gettime(libc::CLOCK_REALTIME, tp.as_mut_ptr()) };
|
||||||
@ -317,7 +317,7 @@ fn main() {
|
|||||||
|
|
||||||
test_posix_gettimeofday();
|
test_posix_gettimeofday();
|
||||||
|
|
||||||
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
|
#[cfg(any(target_os = "linux"))]
|
||||||
test_sync_file_range();
|
test_sync_file_range();
|
||||||
|
|
||||||
test_mutex_libc_init_recursive();
|
test_mutex_libc_init_recursive();
|
||||||
@ -325,14 +325,14 @@ fn main() {
|
|||||||
test_mutex_libc_init_errorcheck();
|
test_mutex_libc_init_errorcheck();
|
||||||
test_rwlock_libc_static_initializer();
|
test_rwlock_libc_static_initializer();
|
||||||
|
|
||||||
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
|
#[cfg(any(target_os = "linux"))]
|
||||||
test_mutex_libc_static_initializer_recursive();
|
test_mutex_libc_static_initializer_recursive();
|
||||||
|
|
||||||
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
|
#[cfg(any(target_os = "linux"))]
|
||||||
test_prctl_thread_name();
|
test_prctl_thread_name();
|
||||||
|
|
||||||
test_thread_local_errno();
|
test_thread_local_errno();
|
||||||
|
|
||||||
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
|
#[cfg(any(target_os = "linux"))]
|
||||||
test_clocks();
|
test_clocks();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user