test: Add a min-llvm-version directive

We've got tests which require a particular version of LLVM to run as they're
testing bug fixes. Our build system, however, supports multiple LLVM versions,
so we can't run these tests on all LLVM versions.

This adds a new `min-llvm-version` directive for tests so they can opt out of
being run on older versions of LLVM. This then namely applies that logic to the
`issue-36023.rs` test case and...

Closes #36138
This commit is contained in:
Alex Crichton 2016-09-01 10:52:44 -07:00
parent b2799a56a1
commit 96283fc083
7 changed files with 33 additions and 2 deletions

View File

@ -348,6 +348,7 @@ LLVM_AS_$(1)=$$(CFG_LLVM_INST_DIR_$(1))/bin/llvm-as$$(X_$(1))
LLC_$(1)=$$(CFG_LLVM_INST_DIR_$(1))/bin/llc$$(X_$(1)) LLC_$(1)=$$(CFG_LLVM_INST_DIR_$(1))/bin/llc$$(X_$(1))
LLVM_ALL_COMPONENTS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --components) LLVM_ALL_COMPONENTS_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --components)
LLVM_VERSION_$(1)=$$(shell "$$(LLVM_CONFIG_$(1))" --version)
endef endef

View File

@ -649,6 +649,7 @@ CTEST_COMMON_ARGS$(1)-T-$(2)-H-$(3) = \
--lldb-python $$(CFG_LLDB_PYTHON) \ --lldb-python $$(CFG_LLDB_PYTHON) \
--gdb-version="$(CFG_GDB_VERSION)" \ --gdb-version="$(CFG_GDB_VERSION)" \
--lldb-version="$(CFG_LLDB_VERSION)" \ --lldb-version="$(CFG_LLDB_VERSION)" \
--llvm-version="$$(LLVM_VERSION_$(3))" \
--android-cross-path=$(CFG_ARM_LINUX_ANDROIDEABI_NDK) \ --android-cross-path=$(CFG_ARM_LINUX_ANDROIDEABI_NDK) \
--adb-path=$(CFG_ADB) \ --adb-path=$(CFG_ADB) \
--adb-test-dir=$(CFG_ADB_TEST_DIR) \ --adb-test-dir=$(CFG_ADB_TEST_DIR) \

View File

@ -148,6 +148,9 @@ pub fn compiletest(build: &Build,
if let Some(ref dir) = build.lldb_python_dir { if let Some(ref dir) = build.lldb_python_dir {
cmd.arg("--lldb-python-dir").arg(dir); cmd.arg("--lldb-python-dir").arg(dir);
} }
let llvm_config = build.llvm_config(target);
let llvm_version = output(Command::new(&llvm_config).arg("--version"));
cmd.arg("--llvm-version").arg(llvm_version);
cmd.args(&build.flags.args); cmd.args(&build.flags.args);
@ -158,7 +161,6 @@ pub fn compiletest(build: &Build,
// Only pass correct values for these flags for the `run-make` suite as it // Only pass correct values for these flags for the `run-make` suite as it
// requires that a C++ compiler was configured which isn't always the case. // requires that a C++ compiler was configured which isn't always the case.
if suite == "run-make" { if suite == "run-make" {
let llvm_config = build.llvm_config(target);
let llvm_components = output(Command::new(&llvm_config).arg("--components")); let llvm_components = output(Command::new(&llvm_config).arg("--components"));
let llvm_cxxflags = output(Command::new(&llvm_config).arg("--cxxflags")); let llvm_cxxflags = output(Command::new(&llvm_config).arg("--cxxflags"));
cmd.arg("--cc").arg(build.cc(target)) cmd.arg("--cc").arg(build.cc(target))

View File

@ -8,6 +8,8 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
// min-llvm-version 3.9
use std::ops::Deref; use std::ops::Deref;
fn main() { fn main() {

View File

@ -152,6 +152,9 @@ pub struct Config {
// Version of LLDB // Version of LLDB
pub lldb_version: Option<String>, pub lldb_version: Option<String>,
// Version of LLVM
pub llvm_version: Option<String>,
// Path to the android tools // Path to the android tools
pub android_cross_path: PathBuf, pub android_cross_path: PathBuf,

View File

@ -44,7 +44,9 @@ impl EarlyProps {
(config.mode == common::Pretty && parse_name_directive(ln, "ignore-pretty")) || (config.mode == common::Pretty && parse_name_directive(ln, "ignore-pretty")) ||
(config.target != config.host && (config.target != config.host &&
parse_name_directive(ln, "ignore-cross-compile")) || parse_name_directive(ln, "ignore-cross-compile")) ||
ignore_gdb(config, ln) || ignore_lldb(config, ln); ignore_gdb(config, ln) ||
ignore_lldb(config, ln) ||
ignore_llvm(config, ln);
props.should_fail = props.should_fail || parse_name_directive(ln, "should-fail"); props.should_fail = props.should_fail || parse_name_directive(ln, "should-fail");
}); });
@ -115,6 +117,24 @@ impl EarlyProps {
false false
} }
} }
fn ignore_llvm(config: &Config, line: &str) -> bool {
if let Some(ref actual_version) = config.llvm_version {
if line.contains("min-llvm-version") {
let min_version = line.trim()
.split(' ')
.last()
.expect("Malformed llvm version directive");
// Ignore if actual version is smaller the minimum required
// version
&actual_version[..] < min_version
} else {
false
}
} else {
false
}
}
} }
} }

View File

@ -99,6 +99,7 @@ pub fn parse_config(args: Vec<String> ) -> Config {
optopt("", "host", "the host to build for", "HOST"), optopt("", "host", "the host to build for", "HOST"),
optopt("", "gdb-version", "the version of GDB used", "VERSION STRING"), optopt("", "gdb-version", "the version of GDB used", "VERSION STRING"),
optopt("", "lldb-version", "the version of LLDB used", "VERSION STRING"), optopt("", "lldb-version", "the version of LLDB used", "VERSION STRING"),
optopt("", "llvm-version", "the version of LLVM used", "VERSION STRING"),
optopt("", "android-cross-path", "Android NDK standalone path", "PATH"), optopt("", "android-cross-path", "Android NDK standalone path", "PATH"),
optopt("", "adb-path", "path to the android debugger", "PATH"), optopt("", "adb-path", "path to the android debugger", "PATH"),
optopt("", "adb-test-dir", "path to tests for the android debugger", "PATH"), optopt("", "adb-test-dir", "path to tests for the android debugger", "PATH"),
@ -170,6 +171,7 @@ pub fn parse_config(args: Vec<String> ) -> Config {
host: opt_str2(matches.opt_str("host")), host: opt_str2(matches.opt_str("host")),
gdb_version: extract_gdb_version(matches.opt_str("gdb-version")), gdb_version: extract_gdb_version(matches.opt_str("gdb-version")),
lldb_version: extract_lldb_version(matches.opt_str("lldb-version")), lldb_version: extract_lldb_version(matches.opt_str("lldb-version")),
llvm_version: matches.opt_str("llvm-version"),
android_cross_path: opt_path(matches, "android-cross-path"), android_cross_path: opt_path(matches, "android-cross-path"),
adb_path: opt_str2(matches.opt_str("adb-path")), adb_path: opt_str2(matches.opt_str("adb-path")),
adb_test_dir: format!("{}/{}", adb_test_dir: format!("{}/{}",