create a miri-pass test that allows us to run miri for arbitrary targets
This commit is contained in:
parent
b24edd6a23
commit
82dc95c3ad
5 changed files with 72 additions and 33 deletions
|
|
@ -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
|
||||
|
|
|
|||
10
Cargo.lock
generated
10
Cargo.lock
generated
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -21,4 +21,4 @@ log = "0.3.6"
|
|||
log_settings = "0.1.1"
|
||||
|
||||
[dev-dependencies]
|
||||
compiletest_rs = "0.1.1"
|
||||
compiletest_rs = "0.2"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,11 +1,43 @@
|
|||
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");
|
||||
let flags = format!("--sysroot {} -Dwarnings", sysroot);
|
||||
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 = 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/{}", dir));
|
||||
config.target = target.to_owned();
|
||||
config.target_rustcflags = Some(flags.clone());
|
||||
compiletest::run_tests(&config);
|
||||
});
|
||||
}
|
||||
|
||||
fn for_all_targets<F: Fn(String)>(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() {
|
||||
// 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"));
|
||||
|
|
@ -15,29 +47,27 @@ fn run_mode(mode: &'static str) {
|
|||
.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;
|
||||
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();
|
||||
write!(stderr.lock(), "running tests for target {}", target).unwrap();
|
||||
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.rustc_path = "target/debug/miri".into();
|
||||
config.src_base = PathBuf::from(format!("tests/{}", mode));
|
||||
config.target = target.to_owned();
|
||||
config.target_rustcflags = Some(flags.clone());
|
||||
compiletest::run_tests(&config);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn compile_test() {
|
||||
run_mode("compile-fail");
|
||||
run_mode("run-pass");
|
||||
writeln!(stderr.lock(), "").unwrap();
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue