Auto merge of #111535 - RalfJung:miri, r=RalfJung
update Miri Needed to get miri-test-libstd working again
This commit is contained in:
commit
1623978dc4
@ -5123,9 +5123,9 @@ checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81"
|
||||
|
||||
[[package]]
|
||||
name = "ui_test"
|
||||
version = "0.9.0"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "95033b0e41b8018013d99a6f1486c1ae5bd080378ced60c5f797e93842423b33"
|
||||
checksum = "191a442639ea102fa62671026047e51d574bfda44b7fdf32151d7314624c1cd2"
|
||||
dependencies = [
|
||||
"bstr 1.3.0",
|
||||
"cargo-platform",
|
||||
|
@ -820,9 +820,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ui_test"
|
||||
version = "0.9.0"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "95033b0e41b8018013d99a6f1486c1ae5bd080378ced60c5f797e93842423b33"
|
||||
checksum = "191a442639ea102fa62671026047e51d574bfda44b7fdf32151d7314624c1cd2"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"cargo-platform",
|
||||
|
@ -39,7 +39,7 @@ libloading = "0.7"
|
||||
|
||||
[dev-dependencies]
|
||||
colored = "2"
|
||||
ui_test = "0.9"
|
||||
ui_test = "0.10"
|
||||
rustc_version = "0.4"
|
||||
# Features chosen to match those required by env_logger, to avoid rebuilds
|
||||
regex = { version = "1.5.5", default-features = false, features = ["perf", "std"] }
|
||||
|
@ -306,7 +306,7 @@ test|bless)
|
||||
# Only in root project as `cargo-miri` has no tests.
|
||||
$CARGO test $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml "$@"
|
||||
;;
|
||||
run)
|
||||
run|run-dep)
|
||||
# Scan for "--target" to overwrite the "MIRI_TEST_TARGET" env var so
|
||||
# that we set the MIRI_SYSROOT up the right way.
|
||||
FOUND_TARGET_OPT=0
|
||||
@ -323,11 +323,17 @@ run)
|
||||
# Make sure Miri actually uses this target.
|
||||
MIRIFLAGS="$MIRIFLAGS --target $MIRI_TEST_TARGET"
|
||||
fi
|
||||
|
||||
# First build and get a sysroot.
|
||||
$CARGO build $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml
|
||||
find_sysroot
|
||||
# Then run the actual command.
|
||||
exec $CARGO run $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml -- $MIRIFLAGS "$@"
|
||||
|
||||
if [ "$COMMAND" = "run-dep" ]; then
|
||||
exec $CARGO test --test compiletest $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml -- --miri-run-dep-mode $MIRIFLAGS "$@"
|
||||
else
|
||||
exec $CARGO run $CARGO_EXTRA_FLAGS --manifest-path "$MIRIDIR"/Cargo.toml -- $MIRIFLAGS "$@"
|
||||
fi
|
||||
;;
|
||||
fmt)
|
||||
find "$MIRIDIR" -not \( -name target -prune \) -name '*.rs' \
|
||||
|
@ -1 +1 @@
|
||||
0b795044c6f0854445f1f2bb6443e87848e150d1
|
||||
69fef92ab2f287f072b66fb7b4f62c8bb4acba43
|
||||
|
@ -83,7 +83,7 @@ pub fn retain(&mut self, tags: &FxHashSet<BorTag>) {
|
||||
self.borrows.truncate(write_idx);
|
||||
|
||||
#[cfg(not(feature = "stack-cache"))]
|
||||
drop(first_removed); // This is only needed for the stack-cache
|
||||
let _unused = first_removed; // This is only needed for the stack-cache
|
||||
|
||||
#[cfg(feature = "stack-cache")]
|
||||
if let Some(first_removed) = first_removed {
|
||||
|
@ -421,14 +421,18 @@ enum Op {
|
||||
}
|
||||
}
|
||||
#[rustfmt::skip]
|
||||
"cast" | "as" => {
|
||||
"cast" | "as" | "cast_ptr" | "expose_addr" | "from_exposed_addr" => {
|
||||
let [op] = check_arg_count(args)?;
|
||||
let (op, op_len) = this.operand_to_simd(op)?;
|
||||
let (dest, dest_len) = this.place_to_simd(dest)?;
|
||||
|
||||
assert_eq!(dest_len, op_len);
|
||||
|
||||
let unsafe_cast = intrinsic_name == "cast";
|
||||
let safe_cast = intrinsic_name == "as";
|
||||
let ptr_cast = intrinsic_name == "cast_ptr";
|
||||
let expose_cast = intrinsic_name == "expose_addr";
|
||||
let from_exposed_cast = intrinsic_name == "from_exposed_addr";
|
||||
|
||||
for i in 0..dest_len {
|
||||
let op = this.read_immediate(&this.mplace_index(&op, i)?.into())?;
|
||||
@ -436,19 +440,31 @@ enum Op {
|
||||
|
||||
let val = match (op.layout.ty.kind(), dest.layout.ty.kind()) {
|
||||
// Int-to-(int|float): always safe
|
||||
(ty::Int(_) | ty::Uint(_), ty::Int(_) | ty::Uint(_) | ty::Float(_)) =>
|
||||
(ty::Int(_) | ty::Uint(_), ty::Int(_) | ty::Uint(_) | ty::Float(_)) if safe_cast || unsafe_cast =>
|
||||
this.int_to_int_or_float(&op, dest.layout.ty)?,
|
||||
// Float-to-float: always safe
|
||||
(ty::Float(_), ty::Float(_)) =>
|
||||
(ty::Float(_), ty::Float(_)) if safe_cast || unsafe_cast =>
|
||||
this.float_to_float_or_int(&op, dest.layout.ty)?,
|
||||
// Float-to-int in safe mode
|
||||
(ty::Float(_), ty::Int(_) | ty::Uint(_)) if safe_cast =>
|
||||
this.float_to_float_or_int(&op, dest.layout.ty)?,
|
||||
// Float-to-int in unchecked mode
|
||||
(ty::Float(FloatTy::F32), ty::Int(_) | ty::Uint(_)) if !safe_cast =>
|
||||
(ty::Float(FloatTy::F32), ty::Int(_) | ty::Uint(_)) if unsafe_cast =>
|
||||
this.float_to_int_unchecked(op.to_scalar().to_f32()?, dest.layout.ty)?.into(),
|
||||
(ty::Float(FloatTy::F64), ty::Int(_) | ty::Uint(_)) if !safe_cast =>
|
||||
(ty::Float(FloatTy::F64), ty::Int(_) | ty::Uint(_)) if unsafe_cast =>
|
||||
this.float_to_int_unchecked(op.to_scalar().to_f64()?, dest.layout.ty)?.into(),
|
||||
// Ptr-to-ptr cast
|
||||
(ty::RawPtr(..), ty::RawPtr(..)) if ptr_cast => {
|
||||
this.ptr_to_ptr(&op, dest.layout.ty)?
|
||||
}
|
||||
// Ptr/Int casts
|
||||
(ty::RawPtr(..), ty::Int(_) | ty::Uint(_)) if expose_cast => {
|
||||
this.pointer_expose_address_cast(&op, dest.layout.ty)?
|
||||
}
|
||||
(ty::Int(_) | ty::Uint(_), ty::RawPtr(..)) if from_exposed_cast => {
|
||||
this.pointer_from_exposed_address_cast(&op, dest.layout.ty)?
|
||||
}
|
||||
// Error otherwise
|
||||
_ =>
|
||||
throw_unsup_format!(
|
||||
"Unsupported SIMD cast from element type {from_ty} to {to_ty}",
|
||||
|
@ -1,5 +1,6 @@
|
||||
use colored::*;
|
||||
use regex::bytes::Regex;
|
||||
use std::ffi::OsString;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::{env, process::Command};
|
||||
use ui_test::status_emitter::StatusEmitter;
|
||||
@ -45,7 +46,7 @@ fn build_so_for_c_ffi_tests() -> PathBuf {
|
||||
so_file_path
|
||||
}
|
||||
|
||||
fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> Result<()> {
|
||||
fn test_config(target: &str, path: &str, mode: Mode, with_dependencies: bool) -> Config {
|
||||
// Miri is rustc-like, so we create a default builder for rustc and modify it
|
||||
let mut program = CommandBuilder::rustc();
|
||||
program.program = miri_path();
|
||||
@ -103,6 +104,26 @@ fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> R
|
||||
..Config::default()
|
||||
};
|
||||
|
||||
let use_std = env::var_os("MIRI_NO_STD").is_none();
|
||||
|
||||
if with_dependencies && use_std {
|
||||
config.dependencies_crate_manifest_path =
|
||||
Some(Path::new("test_dependencies").join("Cargo.toml"));
|
||||
config.dependency_builder.args = vec![
|
||||
"run".into(),
|
||||
"--manifest-path".into(),
|
||||
"cargo-miri/Cargo.toml".into(),
|
||||
"--".into(),
|
||||
"miri".into(),
|
||||
"run".into(), // There is no `cargo miri build` so we just use `cargo miri run`.
|
||||
];
|
||||
}
|
||||
config
|
||||
}
|
||||
|
||||
fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> Result<()> {
|
||||
let mut config = test_config(target, path, mode, with_dependencies);
|
||||
|
||||
// Handle command-line arguments.
|
||||
let mut after_dashdash = false;
|
||||
config.path_filter.extend(std::env::args().skip(1).filter(|arg| {
|
||||
@ -126,21 +147,6 @@ fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> R
|
||||
}
|
||||
}));
|
||||
|
||||
let use_std = env::var_os("MIRI_NO_STD").is_none();
|
||||
|
||||
if with_dependencies && use_std {
|
||||
config.dependencies_crate_manifest_path =
|
||||
Some(Path::new("test_dependencies").join("Cargo.toml"));
|
||||
config.dependency_builder.args = vec![
|
||||
"run".into(),
|
||||
"--manifest-path".into(),
|
||||
"cargo-miri/Cargo.toml".into(),
|
||||
"--".into(),
|
||||
"miri".into(),
|
||||
"run".into(), // There is no `cargo miri build` so we just use `cargo miri run`.
|
||||
];
|
||||
}
|
||||
|
||||
eprintln!(" Compiler: {}", config.program.display());
|
||||
ui_test::run_tests_generic(
|
||||
config,
|
||||
@ -226,8 +232,18 @@ fn get_target() -> String {
|
||||
|
||||
fn main() -> Result<()> {
|
||||
ui_test::color_eyre::install()?;
|
||||
|
||||
let target = get_target();
|
||||
|
||||
let mut args = std::env::args_os();
|
||||
|
||||
// Skip the program name and check whether this is a `./miri run-dep` invocation
|
||||
if let Some(first) = args.nth(1) {
|
||||
if first == "--miri-run-dep-mode" {
|
||||
return run_dep_mode(target, args);
|
||||
}
|
||||
}
|
||||
|
||||
// Add a test env var to do environment communication tests.
|
||||
env::set_var("MIRI_ENV_VAR_TEST", "0");
|
||||
// Let the tests know where to store temp files (they might run for a different target, which can make this hard to find).
|
||||
@ -250,6 +266,21 @@ fn main() -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn run_dep_mode(target: String, mut args: impl Iterator<Item = OsString>) -> Result<()> {
|
||||
let path = args.next().expect("./miri run-dep must be followed by a file name");
|
||||
let mut config = test_config(&target, "", Mode::Yolo, /* with dependencies */ true);
|
||||
config.program.args.remove(0); // remove the `--error-format=json` argument
|
||||
config.program.args.push("--color".into());
|
||||
config.program.args.push("always".into());
|
||||
let mut cmd = ui_test::test_command(config, Path::new(&path))?;
|
||||
// Separate the arguments to the `cargo miri` invocation from
|
||||
// the arguments to the interpreted prog
|
||||
cmd.arg("--");
|
||||
cmd.args(args);
|
||||
println!("{cmd:?}");
|
||||
if cmd.spawn()?.wait()?.success() { Ok(()) } else { std::process::exit(1) }
|
||||
}
|
||||
|
||||
/// This is a custom renderer for `ui_test` output that does not emit github actions
|
||||
/// `group`s, while still producing regular github actions messages on test failures.
|
||||
struct TextAndGha;
|
||||
|
@ -1,7 +1,6 @@
|
||||
//@error-in-other-file: memory is uninitialized at [0x4..0x8]
|
||||
//@normalize-stderr-test: "a[0-9]+" -> "ALLOC"
|
||||
#![feature(strict_provenance)]
|
||||
|
||||
#![allow(drop_copy)]
|
||||
|
||||
// Test printing allocations that contain single-byte provenance.
|
||||
|
12
src/tools/miri/tests/pass/portable-simd-ptrs.rs
Normal file
12
src/tools/miri/tests/pass/portable-simd-ptrs.rs
Normal file
@ -0,0 +1,12 @@
|
||||
// Separate test without strict provenance
|
||||
//@compile-flags: -Zmiri-permissive-provenance
|
||||
#![feature(portable_simd, platform_intrinsics)]
|
||||
use std::ptr;
|
||||
use std::simd::*;
|
||||
|
||||
fn main() {
|
||||
// Pointer casts
|
||||
let _val: Simd<*const u8, 4> = Simd::<*const i32, 4>::splat(ptr::null()).cast_ptr();
|
||||
let addrs = Simd::<*const i32, 4>::splat(ptr::null()).expose_addr();
|
||||
let _ptrs = Simd::<*const i32, 4>::from_exposed_addr(addrs);
|
||||
}
|
Loading…
Reference in New Issue
Block a user