Add test for -Znew-llvm-pass-manager -Clto=thin -Zsanitizer=...

Additionally verify that the current implementation of LLVM version
check (which uses lexicographic ordering) is good enough to exclude
versions before LLVM 9, where the new LLVM pass manager is unsupported.
This commit is contained in:
Tomasz Miąsko 2020-03-03 00:00:00 +00:00
parent a61e13423e
commit 52c5f2a577
2 changed files with 45 additions and 0 deletions

View File

@ -0,0 +1,27 @@
// Regression test for sanitizer function instrumentation passes not
// being run when compiling with new LLVM pass manager and ThinLTO.
// Note: The issue occured only on non-zero opt-level.
//
// min-llvm-version 9.0
// needs-sanitizer-support
// only-x86_64
//
// no-prefer-dynamic
// revisions: opt0 opt1
// compile-flags: -Znew-llvm-pass-manager=yes -Zsanitizer=address -Clto=thin
//[opt0]compile-flags: -Copt-level=0
//[opt1]compile-flags: -Copt-level=1
// run-fail
// error-pattern: ERROR: AddressSanitizer: stack-use-after-scope
static mut P: *mut usize = std::ptr::null_mut();
fn main() {
unsafe {
{
let mut x = 0;
P = &mut x;
}
std::ptr::write_volatile(P, 123);
}
}

View File

@ -109,6 +109,24 @@ fn no_system_llvm() {
assert!(parse_rs(&config, "// no-system-llvm").ignore);
}
#[test]
fn llvm_version() {
let mut config = config();
config.llvm_version = Some("8.1.2-rust".to_owned());
assert!(parse_rs(&config, "// min-llvm-version 9.0").ignore);
config.llvm_version = Some("9.0.1-rust-1.43.0-dev".to_owned());
assert!(parse_rs(&config, "// min-llvm-version 9.2").ignore);
config.llvm_version = Some("9.3.1-rust-1.43.0-dev".to_owned());
assert!(!parse_rs(&config, "// min-llvm-version 9.2").ignore);
// FIXME.
// config.llvm_version = Some("10.0.0-rust".to_owned());
// assert!(!parse_rs(&config, "// min-llvm-version 9.0").ignore);
}
#[test]
fn ignore_target() {
let mut config = config();