diff options
| author | Denys Zariaiev <denys.zariaiev@gmail.com> | 2019-02-27 23:31:30 +0100 |
|---|---|---|
| committer | Denys Zariaiev <denys.zariaiev@gmail.com> | 2019-02-27 23:33:05 +0100 |
| commit | 5c7ec6c421af26666d3ec1c5fe022d099133951c (patch) | |
| tree | 2900141d5fa4d8a81ef05be66704dbac6972d6b9 /src/tools/compiletest | |
| parent | b57fe74a27590289fd657614b8ad1f3eac8a7ad2 (diff) | |
| download | rust-5c7ec6c421af26666d3ec1c5fe022d099133951c.tar.gz rust-5c7ec6c421af26666d3ec1c5fe022d099133951c.zip | |
Introduce assembly tests
Diffstat (limited to 'src/tools/compiletest')
| -rw-r--r-- | src/tools/compiletest/src/common.rs | 3 | ||||
| -rw-r--r-- | src/tools/compiletest/src/header.rs | 12 | ||||
| -rw-r--r-- | src/tools/compiletest/src/runtest.rs | 58 | ||||
| -rw-r--r-- | src/tools/compiletest/src/util.rs | 4 |
4 files changed, 68 insertions, 9 deletions
diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs index 6b3117a1f74..fea000738df 100644 --- a/src/tools/compiletest/src/common.rs +++ b/src/tools/compiletest/src/common.rs @@ -25,6 +25,7 @@ pub enum Mode { RunMake, Ui, MirOpt, + Assembly, } impl Mode { @@ -60,6 +61,7 @@ impl FromStr for Mode { "run-make" => Ok(RunMake), "ui" => Ok(Ui), "mir-opt" => Ok(MirOpt), + "assembly" => Ok(Assembly), _ => Err(()), } } @@ -83,6 +85,7 @@ impl fmt::Display for Mode { RunMake => "run-make", Ui => "ui", MirOpt => "mir-opt", + Assembly => "assembly", }; fmt::Display::fmt(s, f) } diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs index c2c4a6b69cc..7bf56707478 100644 --- a/src/tools/compiletest/src/header.rs +++ b/src/tools/compiletest/src/header.rs @@ -335,6 +335,7 @@ pub struct TestProps { pub failure_status: i32, pub run_rustfix: bool, pub rustfix_only_machine_applicable: bool, + pub assembly_output: Option<String>, } impl TestProps { @@ -370,6 +371,7 @@ impl TestProps { failure_status: -1, run_rustfix: false, rustfix_only_machine_applicable: false, + assembly_output: None, } } @@ -517,6 +519,10 @@ impl TestProps { self.rustfix_only_machine_applicable = config.parse_rustfix_only_machine_applicable(ln); } + + if self.assembly_output.is_none() { + self.assembly_output = config.parse_assembly_output(ln); + } }); if self.failure_status == -1 { @@ -594,6 +600,7 @@ impl Config { fn parse_aux_build(&self, line: &str) -> Option<String> { self.parse_name_value_directive(line, "aux-build") + .map(|r| r.trim().to_string()) } fn parse_compile_flags(&self, line: &str) -> Option<String> { @@ -676,6 +683,11 @@ impl Config { self.parse_name_directive(line, "skip-codegen") } + fn parse_assembly_output(&self, line: &str) -> Option<String> { + self.parse_name_value_directive(line, "assembly-output") + .map(|r| r.trim().to_string()) + } + fn parse_env(&self, line: &str, name: &str) -> Option<(String, String)> { self.parse_name_value_directive(line, name).map(|nv| { // nv is either FOO or FOO=BAR diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index bac41a7c579..85b700393a5 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -4,7 +4,7 @@ use crate::common::{output_base_dir, output_base_name, output_testname_unique}; use crate::common::{Codegen, CodegenUnits, DebugInfoBoth, DebugInfoGdb, DebugInfoLldb, Rustdoc}; use crate::common::{CompileFail, Pretty, RunFail, RunPass, RunPassValgrind}; use crate::common::{Config, TestPaths}; -use crate::common::{Incremental, MirOpt, RunMake, Ui}; +use crate::common::{Incremental, MirOpt, RunMake, Ui, Assembly}; use diff; use crate::errors::{self, Error, ErrorKind}; use filetime::FileTime; @@ -275,6 +275,7 @@ impl<'test> TestCx<'test> { RunMake => self.run_rmake_test(), RunPass | Ui => self.run_ui_test(), MirOpt => self.run_mir_opt_test(), + Assembly => self.run_assembly_test(), } } @@ -1604,6 +1605,7 @@ impl<'test> TestCx<'test> { || self.config.target.contains("emscripten") || (self.config.target.contains("musl") && !aux_props.force_host) || self.config.target.contains("wasm32") + || self.config.target.contains("nvptx") { // We primarily compile all auxiliary libraries as dynamic libraries // to avoid code size bloat and large binaries as much as possible @@ -1802,7 +1804,7 @@ impl<'test> TestCx<'test> { rustc.arg(dir_opt); } RunFail | RunPassValgrind | Pretty | DebugInfoBoth | DebugInfoGdb | DebugInfoLldb - | Codegen | Rustdoc | RunMake | CodegenUnits => { + | Codegen | Rustdoc | RunMake | CodegenUnits | Assembly => { // do not use JSON output } } @@ -2097,12 +2099,37 @@ impl<'test> TestCx<'test> { self.compose_and_run_compiler(rustc, None) } - fn check_ir_with_filecheck(&self) -> ProcRes { - let irfile = self.output_base_name().with_extension("ll"); + fn compile_test_and_save_assembly(&self) -> (ProcRes, PathBuf) { + // This works with both `--emit asm` (as default output name for the assembly) + // and `ptx-linker` because the latter can write output at requested location. + let output_path = self.output_base_name().with_extension("s"); + + let output_file = TargetLocation::ThisFile(output_path.clone()); + let mut rustc = self.make_compile_args(&self.testpaths.file, output_file); + + rustc.arg("-L").arg(self.aux_output_dir_name()); + + match self.props.assembly_output.as_ref().map(AsRef::as_ref) { + Some("emit-asm") => { + rustc.arg("--emit=asm"); + } + + Some("ptx-linker") => { + // No extra flags needed. + } + + Some(_) => self.fatal("unknown 'assembly-output' header"), + None => self.fatal("missing 'assembly-output' header"), + } + + (self.compose_and_run_compiler(rustc, None), output_path) + } + + fn verify_with_filecheck(&self, output: &Path) -> ProcRes { let mut filecheck = Command::new(self.config.llvm_filecheck.as_ref().unwrap()); filecheck .arg("--input-file") - .arg(irfile) + .arg(output) .arg(&self.testpaths.file); // It would be more appropriate to make most of the arguments configurable through // a comment-attribute similar to `compile-flags`. For example, --check-prefixes is a very @@ -2121,12 +2148,29 @@ impl<'test> TestCx<'test> { self.fatal("missing --llvm-filecheck"); } - let mut proc_res = self.compile_test_and_save_ir(); + let proc_res = self.compile_test_and_save_ir(); + if !proc_res.status.success() { + self.fatal_proc_rec("compilation failed!", &proc_res); + } + + let output_path = self.output_base_name().with_extension("ll"); + let proc_res = self.verify_with_filecheck(&output_path); + if !proc_res.status.success() { + self.fatal_proc_rec("verification with 'FileCheck' failed", &proc_res); + } + } + + fn run_assembly_test(&self) { + if self.config.llvm_filecheck.is_none() { + self.fatal("missing --llvm-filecheck"); + } + + let (proc_res, output_path) = self.compile_test_and_save_assembly(); if !proc_res.status.success() { self.fatal_proc_rec("compilation failed!", &proc_res); } - proc_res = self.check_ir_with_filecheck(); + let proc_res = self.verify_with_filecheck(&output_path); if !proc_res.status.success() { self.fatal_proc_rec("verification with 'FileCheck' failed", &proc_res); } diff --git a/src/tools/compiletest/src/util.rs b/src/tools/compiletest/src/util.rs index 240287fa248..c54035cdec5 100644 --- a/src/tools/compiletest/src/util.rs +++ b/src/tools/compiletest/src/util.rs @@ -41,7 +41,6 @@ const ARCH_TABLE: &'static [(&'static str, &'static str)] = &[ ("armv7", "arm"), ("armv7s", "arm"), ("asmjs", "asmjs"), - ("cuda", "cuda"), ("hexagon", "hexagon"), ("i386", "x86"), ("i586", "x86"), @@ -51,6 +50,7 @@ const ARCH_TABLE: &'static [(&'static str, &'static str)] = &[ ("mips64el", "mips64"), ("mipsel", "mips"), ("msp430", "msp430"), + ("nvptx64", "nvptx64"), ("powerpc", "powerpc"), ("powerpc64", "powerpc64"), ("powerpc64le", "powerpc64"), @@ -158,7 +158,7 @@ fn test_get_arch_failure() { fn test_get_arch() { assert_eq!("x86_64", get_arch("x86_64-unknown-linux-gnu")); assert_eq!("x86_64", get_arch("amd64")); - assert_eq!("cuda", get_arch("nvptx64-nvidia-cuda")); + assert_eq!("nvptx64", get_arch("nvptx64-nvidia-cuda")); } #[test] |
