From 82dc95c3ad79697acd68df09684e9d22b731ad63 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Wed, 15 Jun 2016 13:18:35 +0200 Subject: [PATCH 01/11] create a miri-pass test that allows us to run miri for arbitrary targets --- .travis.yml | 7 ++-- Cargo.lock | 10 ++++-- Cargo.toml | 2 +- src/bin/miri.rs | 4 ++- tests/compiletest.rs | 78 ++++++++++++++++++++++++++++++-------------- 5 files changed, 70 insertions(+), 31 deletions(-) diff --git a/.travis.yml b/.travis.yml index d56ca04817..8f88f66365 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,9 +9,10 @@ before_script: pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH script: -- | - travis-cargo build && - env RUST_SYSROOT=$HOME/rust travis-cargo test +- set -e +- travis-cargo build +- RUST_SYSROOT=$HOME/rust +- travis-cargo test notifications: email: on_success: never diff --git a/Cargo.lock b/Cargo.lock index 240a214480..d0b785a061 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,7 +3,7 @@ name = "miri" version = "0.1.0" dependencies = [ "byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "compiletest_rs 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "compiletest_rs 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "log_settings 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -24,10 +24,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "compiletest_rs" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -96,6 +97,11 @@ name = "regex-syntax" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "rustc-serialize" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "thread-id" version = "2.0.0" diff --git a/Cargo.toml b/Cargo.toml index 5a8211230f..fea568e244 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,4 +21,4 @@ log = "0.3.6" log_settings = "0.1.1" [dev-dependencies] -compiletest_rs = "0.1.1" +compiletest_rs = "0.2" diff --git a/src/bin/miri.rs b/src/bin/miri.rs index 8ec691dbbb..ac5bf495f4 100644 --- a/src/bin/miri.rs +++ b/src/bin/miri.rs @@ -17,7 +17,7 @@ use miri::{ Frame, }; use rustc::session::Session; -use rustc_driver::{driver, CompilerCalls}; +use rustc_driver::{driver, CompilerCalls, Compilation}; use rustc::ty::{TyCtxt, subst}; use rustc::hir::def_id::DefId; @@ -31,6 +31,7 @@ impl<'a> CompilerCalls<'a> for MiriCompilerCalls { ) -> driver::CompileController<'a> { let mut control = driver::CompileController::basic(); + control.after_analysis.stop = Compilation::Stop; control.after_analysis.callback = Box::new(|state| { state.session.abort_if_errors(); @@ -70,6 +71,7 @@ impl<'a> CompilerCalls<'a> for MiriCompilerCalls { } } } + state.session.abort_if_errors(); }); control diff --git a/tests/compiletest.rs b/tests/compiletest.rs index 7ce9636fc0..01cc8ccdb0 100644 --- a/tests/compiletest.rs +++ b/tests/compiletest.rs @@ -1,43 +1,73 @@ extern crate compiletest_rs as compiletest; -use std::path::PathBuf; +use std::path::{PathBuf, Path}; +use std::io::Write; -fn run_mode(mode: &'static str) { +fn run_mode(dir: &'static str, mode: &'static str, sysroot: &str) { // Disable rustc's new error fomatting. It breaks these tests. std::env::remove_var("RUST_NEW_ERROR_FORMAT"); - - // Taken from https://github.com/Manishearth/rust-clippy/pull/911. - let home = option_env!("RUSTUP_HOME").or(option_env!("MULTIRUST_HOME")); - let toolchain = option_env!("RUSTUP_TOOLCHAIN").or(option_env!("MULTIRUST_TOOLCHAIN")); - let sysroot = match (home, toolchain) { - (Some(home), Some(toolchain)) => format!("{}/toolchains/{}", home, toolchain), - _ => option_env!("RUST_SYSROOT") - .expect("need to specify RUST_SYSROOT env var or use rustup or multirust") - .to_owned(), - }; let flags = format!("--sysroot {} -Dwarnings", sysroot); - - // FIXME: read directories in sysroot/lib/rustlib and generate the test targets from that - let targets = &["x86_64-unknown-linux-gnu", "i686-unknown-linux-gnu"]; - - for &target in targets { - use std::io::Write; - let stderr = std::io::stderr(); - write!(stderr.lock(), "running tests for target {}", target).unwrap(); + for_all_targets(sysroot, |target| { let mut config = compiletest::default_config(); config.host_rustcflags = Some(flags.clone()); config.mode = mode.parse().expect("Invalid mode"); - config.run_lib_path = format!("{}/lib/rustlib/{}/lib", sysroot, target); + config.run_lib_path = Path::new(sysroot).join("lib").join("rustlib").join(&target).join("lib"); config.rustc_path = "target/debug/miri".into(); - config.src_base = PathBuf::from(format!("tests/{}", mode)); + config.src_base = PathBuf::from(format!("tests/{}", dir)); config.target = target.to_owned(); config.target_rustcflags = Some(flags.clone()); compiletest::run_tests(&config); + }); +} + +fn for_all_targets(sysroot: &str, f: F) { + for target in std::fs::read_dir(format!("{}/lib/rustlib/", sysroot)).unwrap() { + let target = target.unwrap(); + if !target.metadata().unwrap().is_dir() { + continue; + } + let target = target.path().iter().rev().next().unwrap().to_str().unwrap().to_owned(); + if target == "etc" { + continue; + } + let stderr = std::io::stderr(); + writeln!(stderr.lock(), "running tests for target {}", target).unwrap(); + f(target); } } #[test] fn compile_test() { - run_mode("compile-fail"); - run_mode("run-pass"); + // Taken from https://github.com/Manishearth/rust-clippy/pull/911. + let home = option_env!("RUSTUP_HOME").or(option_env!("MULTIRUST_HOME")); + let toolchain = option_env!("RUSTUP_TOOLCHAIN").or(option_env!("MULTIRUST_TOOLCHAIN")); + let sysroot = match (home, toolchain) { + (Some(home), Some(toolchain)) => format!("{}/toolchains/{}", home, toolchain), + _ => option_env!("RUST_SYSROOT") + .expect("need to specify RUST_SYSROOT env var or use rustup or multirust") + .to_owned(), + }; + run_mode("compile-fail", "compile-fail", &sysroot); + for_all_targets(&sysroot, |target| { + for file in std::fs::read_dir("tests/run-pass").unwrap() { + let file = file.unwrap(); + if !file.metadata().unwrap().is_file() { + continue; + } + let file = file.path(); + let stderr = std::io::stderr(); + writeln!(stderr.lock(), "test [miri-pass] {}", file.to_str().unwrap()).unwrap(); + let mut cmd = std::process::Command::new("target/debug/miri"); + cmd.arg(file); + cmd.arg(format!("--sysroot={}", sysroot)); + cmd.arg("-Dwarnings"); + cmd.arg(format!("-target={}", target)); + let libs = Path::new(&sysroot).join("lib"); + let sysroot = libs.join("rustlib").join(&target).join("lib"); + let paths = std::env::join_paths(&[libs, sysroot]).unwrap(); + cmd.env(compiletest::procsrv::dylib_env_var(), paths); + } + let stderr = std::io::stderr(); + writeln!(stderr.lock(), "").unwrap(); + }) } From 506f2deaf9e718a947f0b4107036bce22b843721 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 16 Jun 2016 10:30:47 +0200 Subject: [PATCH 02/11] actually execute miri-pass tests --- tests/compiletest.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/compiletest.rs b/tests/compiletest.rs index 01cc8ccdb0..8c319977d8 100644 --- a/tests/compiletest.rs +++ b/tests/compiletest.rs @@ -56,16 +56,25 @@ fn compile_test() { } let file = file.path(); let stderr = std::io::stderr(); - writeln!(stderr.lock(), "test [miri-pass] {}", file.to_str().unwrap()).unwrap(); + write!(stderr.lock(), "test [miri-pass] {} ", file.to_str().unwrap()).unwrap(); let mut cmd = std::process::Command::new("target/debug/miri"); cmd.arg(file); cmd.arg(format!("--sysroot={}", sysroot)); cmd.arg("-Dwarnings"); - cmd.arg(format!("-target={}", target)); + cmd.arg(format!("--target={}", target)); let libs = Path::new(&sysroot).join("lib"); let sysroot = libs.join("rustlib").join(&target).join("lib"); let paths = std::env::join_paths(&[libs, sysroot]).unwrap(); cmd.env(compiletest::procsrv::dylib_env_var(), paths); + match cmd.output() { + Ok(ref output) if output.status.success() => writeln!(stderr.lock(), "ok").unwrap(), + Ok(output) => { + writeln!(stderr.lock(), "FAILED with exit code {}", output.status.code().unwrap_or(0)).unwrap(); + writeln!(stderr.lock(), "stdout: \n {}", std::str::from_utf8(&output.stdout).unwrap()).unwrap(); + writeln!(stderr.lock(), "stderr: \n {}", std::str::from_utf8(&output.stderr).unwrap()).unwrap(); + } + Err(e) => writeln!(stderr.lock(), "FAILED: {}", e).unwrap(), + } } let stderr = std::io::stderr(); writeln!(stderr.lock(), "").unwrap(); From 9cceef06630b9346831b4f85f6b7a6077a119dad Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 16 Jun 2016 10:34:05 +0200 Subject: [PATCH 03/11] simplify target name extraction --- tests/compiletest.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/compiletest.rs b/tests/compiletest.rs index 8c319977d8..bdb7acf56b 100644 --- a/tests/compiletest.rs +++ b/tests/compiletest.rs @@ -26,7 +26,7 @@ fn for_all_targets(sysroot: &str, f: F) { if !target.metadata().unwrap().is_dir() { continue; } - let target = target.path().iter().rev().next().unwrap().to_str().unwrap().to_owned(); + let target = target.file_name().into_string().unwrap(); if target == "etc" { continue; } From 06d1780b852479d90b8b813bfc27bcf6431f999d Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 16 Jun 2016 10:42:04 +0200 Subject: [PATCH 04/11] fix travis --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8f88f66365..df0da0f433 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,8 +11,7 @@ before_script: script: - set -e - travis-cargo build -- RUST_SYSROOT=$HOME/rust -- travis-cargo test +- env RUST_SYSROOT=$HOME/rust travis-cargo test notifications: email: on_success: never From 6a5f7378c3d4145f56e757ca76aff4bb4fa4b5f0 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 16 Jun 2016 10:44:59 +0200 Subject: [PATCH 05/11] travis didn't fail when compiling miri on nightly --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index df0da0f433..177a8ac72d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,6 @@ language: rust rust: - nightly -matrix: - allow_failures: - - rust: nightly before_script: - | pip install 'travis-cargo<0.2' --user && From af36ec959ad8382be7d4a7dae6c56ef2af2bb9f6 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 16 Jun 2016 10:46:43 +0200 Subject: [PATCH 06/11] undo all travis script changes --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 177a8ac72d..cd9f665d1b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,9 +6,9 @@ before_script: pip install 'travis-cargo<0.2' --user && export PATH=$HOME/.local/bin:$PATH script: -- set -e -- travis-cargo build -- env RUST_SYSROOT=$HOME/rust travis-cargo test +- | + travis-cargo build && + env RUST_SYSROOT=$HOME/rust travis-cargo test notifications: email: on_success: never From b6fca7355c4acf59d177eb2029ba4a3834d078ba Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 16 Jun 2016 10:50:23 +0200 Subject: [PATCH 07/11] error out if a run-pass test fails --- tests/compiletest.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/compiletest.rs b/tests/compiletest.rs index bdb7acf56b..0cf945059c 100644 --- a/tests/compiletest.rs +++ b/tests/compiletest.rs @@ -38,6 +38,7 @@ fn for_all_targets(sysroot: &str, f: F) { #[test] fn compile_test() { + let mut failed = false; // Taken from https://github.com/Manishearth/rust-clippy/pull/911. let home = option_env!("RUSTUP_HOME").or(option_env!("MULTIRUST_HOME")); let toolchain = option_env!("RUSTUP_TOOLCHAIN").or(option_env!("MULTIRUST_TOOLCHAIN")); @@ -69,14 +70,21 @@ fn compile_test() { match cmd.output() { Ok(ref output) if output.status.success() => writeln!(stderr.lock(), "ok").unwrap(), Ok(output) => { + failed = true; writeln!(stderr.lock(), "FAILED with exit code {}", output.status.code().unwrap_or(0)).unwrap(); writeln!(stderr.lock(), "stdout: \n {}", std::str::from_utf8(&output.stdout).unwrap()).unwrap(); writeln!(stderr.lock(), "stderr: \n {}", std::str::from_utf8(&output.stderr).unwrap()).unwrap(); } - Err(e) => writeln!(stderr.lock(), "FAILED: {}", e).unwrap(), + Err(e) => { + failed = true; + writeln!(stderr.lock(), "FAILED: {}", e).unwrap(); + }, } } let stderr = std::io::stderr(); writeln!(stderr.lock(), "").unwrap(); }) + if failed { + panic!("some tests failed"); + } } From 453a22a1e014dca717df5a4c355ab9c8d255604f Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 16 Jun 2016 10:52:23 +0200 Subject: [PATCH 08/11] forward `RUST_SYSROOT` to miri test calls --- tests/compiletest.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/compiletest.rs b/tests/compiletest.rs index 0cf945059c..fd86f40637 100644 --- a/tests/compiletest.rs +++ b/tests/compiletest.rs @@ -63,6 +63,7 @@ fn compile_test() { cmd.arg(format!("--sysroot={}", sysroot)); cmd.arg("-Dwarnings"); cmd.arg(format!("--target={}", target)); + cmd.env("RUST_SYSROOT", sysroot); let libs = Path::new(&sysroot).join("lib"); let sysroot = libs.join("rustlib").join(&target).join("lib"); let paths = std::env::join_paths(&[libs, sysroot]).unwrap(); From 2ed6f1c90a1b890e8caae2707f32ea9d0c4b07fc Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 16 Jun 2016 10:54:10 +0200 Subject: [PATCH 09/11] caught by travis --- tests/compiletest.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/compiletest.rs b/tests/compiletest.rs index fd86f40637..7a7de52992 100644 --- a/tests/compiletest.rs +++ b/tests/compiletest.rs @@ -20,7 +20,7 @@ fn run_mode(dir: &'static str, mode: &'static str, sysroot: &str) { }); } -fn for_all_targets(sysroot: &str, f: F) { +fn for_all_targets(sysroot: &str, mut f: F) { for target in std::fs::read_dir(format!("{}/lib/rustlib/", sysroot)).unwrap() { let target = target.unwrap(); if !target.metadata().unwrap().is_dir() { @@ -63,7 +63,7 @@ fn compile_test() { cmd.arg(format!("--sysroot={}", sysroot)); cmd.arg("-Dwarnings"); cmd.arg(format!("--target={}", target)); - cmd.env("RUST_SYSROOT", sysroot); + cmd.env("RUST_SYSROOT", &sysroot); let libs = Path::new(&sysroot).join("lib"); let sysroot = libs.join("rustlib").join(&target).join("lib"); let paths = std::env::join_paths(&[libs, sysroot]).unwrap(); @@ -84,7 +84,7 @@ fn compile_test() { } let stderr = std::io::stderr(); writeln!(stderr.lock(), "").unwrap(); - }) + }); if failed { panic!("some tests failed"); } From f01be9199719ece8f643347627d8b549b375009d Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 16 Jun 2016 11:00:46 +0200 Subject: [PATCH 10/11] miri needs to be *built* with RUST_SYSROOT, not *run* --- .travis.yml | 2 +- tests/compiletest.rs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index cd9f665d1b..e76a2f86cf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ before_script: export PATH=$HOME/.local/bin:$PATH script: - | - travis-cargo build && + env RUST_SYSROOT=$HOME/rust travis-cargo build && env RUST_SYSROOT=$HOME/rust travis-cargo test notifications: email: diff --git a/tests/compiletest.rs b/tests/compiletest.rs index 7a7de52992..d5ea91f015 100644 --- a/tests/compiletest.rs +++ b/tests/compiletest.rs @@ -63,7 +63,6 @@ fn compile_test() { cmd.arg(format!("--sysroot={}", sysroot)); cmd.arg("-Dwarnings"); cmd.arg(format!("--target={}", target)); - cmd.env("RUST_SYSROOT", &sysroot); let libs = Path::new(&sysroot).join("lib"); let sysroot = libs.join("rustlib").join(&target).join("lib"); let paths = std::env::join_paths(&[libs, sysroot]).unwrap(); From 60f2bb9c70b89eccf432864e9bd3b448b1363086 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 16 Jun 2016 11:05:10 +0200 Subject: [PATCH 11/11] miri knows about `--sysroot` --- tests/compiletest.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/compiletest.rs b/tests/compiletest.rs index d5ea91f015..66b94ad88d 100644 --- a/tests/compiletest.rs +++ b/tests/compiletest.rs @@ -60,7 +60,6 @@ fn compile_test() { write!(stderr.lock(), "test [miri-pass] {} ", file.to_str().unwrap()).unwrap(); let mut cmd = std::process::Command::new("target/debug/miri"); cmd.arg(file); - cmd.arg(format!("--sysroot={}", sysroot)); cmd.arg("-Dwarnings"); cmd.arg(format!("--target={}", target)); let libs = Path::new(&sysroot).join("lib");