compiletest: Support ignoring tests requiring missing LLVM components

This commit is contained in:
Vadim Petrochenkov 2020-08-02 18:23:49 +03:00
parent e8876ae2c1
commit d3277b927a
15 changed files with 45 additions and 17 deletions

View File

@ -1158,13 +1158,19 @@ impl Step for Compiletest {
cmd.arg("--quiet");
}
let mut llvm_components_passed = false;
let mut copts_passed = false;
if builder.config.llvm_enabled() {
let llvm_config = builder.ensure(native::Llvm { target: builder.config.build });
if !builder.config.dry_run {
let llvm_version = output(Command::new(&llvm_config).arg("--version"));
let llvm_components = output(Command::new(&llvm_config).arg("--components"));
// Remove trailing newline from llvm-config output.
let llvm_version = llvm_version.trim_end();
cmd.arg("--llvm-version").arg(llvm_version);
cmd.arg("--llvm-version")
.arg(llvm_version.trim())
.arg("--llvm-components")
.arg(llvm_components.trim());
llvm_components_passed = true;
}
if !builder.is_rust_llvm(target) {
cmd.arg("--system-llvm");
@ -1182,15 +1188,13 @@ impl Step for Compiletest {
// 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.
if !builder.config.dry_run && suite == "run-make-fulldeps" {
let llvm_components = output(Command::new(&llvm_config).arg("--components"));
cmd.arg("--cc")
.arg(builder.cc(target))
.arg("--cxx")
.arg(builder.cxx(target).unwrap())
.arg("--cflags")
.arg(builder.cflags(target, GitRepo::Rustc).join(" "))
.arg("--llvm-components")
.arg(llvm_components.trim());
.arg(builder.cflags(target, GitRepo::Rustc).join(" "));
copts_passed = true;
if let Some(ar) = builder.ar(target) {
cmd.arg("--ar").arg(ar);
}
@ -1220,15 +1224,11 @@ impl Step for Compiletest {
}
}
if suite != "run-make-fulldeps" {
cmd.arg("--cc")
.arg("")
.arg("--cxx")
.arg("")
.arg("--cflags")
.arg("")
.arg("--llvm-components")
.arg("");
if !llvm_components_passed {
cmd.arg("--llvm-components").arg("");
}
if !copts_passed {
cmd.arg("--cc").arg("").arg("--cxx").arg("").arg("--cflags").arg("");
}
if builder.remote_tested(target) {

View File

@ -2,6 +2,7 @@
// assembly-output: emit-asm
// compile-flags: -O
// compile-flags: --target aarch64-unknown-linux-gnu
// needs-llvm-components: aarch64
#![feature(no_core, lang_items, rustc_attrs)]
#![crate_type = "rlib"]

View File

@ -1,6 +1,7 @@
// no-system-llvm
// assembly-output: emit-asm
// compile-flags: --target aarch64-unknown-linux-gnu
// needs-llvm-components: aarch64
#![feature(no_core, lang_items, rustc_attrs, repr_simd)]
#![crate_type = "rlib"]

View File

@ -3,6 +3,7 @@
// compile-flags: -O
// compile-flags: --target armv7-unknown-linux-gnueabihf
// compile-flags: -C target-feature=+neon
// needs-llvm-components: arm
#![feature(no_core, lang_items, rustc_attrs, repr_simd)]
#![crate_type = "rlib"]

View File

@ -2,6 +2,7 @@
// assembly-output: emit-asm
// compile-flags: --target armv7-unknown-linux-gnueabihf
// compile-flags: -C target-feature=+neon
// needs-llvm-components: arm
#![feature(no_core, lang_items, rustc_attrs, repr_simd)]
#![crate_type = "rlib"]

View File

@ -1,6 +1,7 @@
// no-system-llvm
// assembly-output: emit-asm
// compile-flags: --target hexagon-unknown-linux-musl
// needs-llvm-components: hexagon
#![feature(no_core, lang_items, rustc_attrs, repr_simd)]
#![crate_type = "rlib"]

View File

@ -2,6 +2,7 @@
// assembly-output: emit-asm
// compile-flags: --target nvptx64-nvidia-cuda
// compile-flags: --crate-type cdylib
// needs-llvm-components: nvptx
#![feature(no_core, lang_items, rustc_attrs)]
#![no_core]

View File

@ -3,6 +3,7 @@
// compile-flags: -O
// compile-flags: --target riscv64gc-unknown-linux-gnu
// compile-flags: -C target-feature=+f
// needs-llvm-components: riscv
#![feature(no_core, lang_items, rustc_attrs)]
#![crate_type = "rlib"]

View File

@ -4,6 +4,7 @@
//[riscv64] compile-flags: --target riscv64imac-unknown-none-elf
//[riscv32] compile-flags: --target riscv32imac-unknown-none-elf
// compile-flags: -C target-feature=+d
// needs-llvm-components: riscv
#![feature(no_core, lang_items, rustc_attrs)]
#![crate_type = "rlib"]

View File

@ -1,12 +1,14 @@
// Checks if the correct annotation for the efiapi ABI is passed to llvm.
// revisions:x86_64 i686 arm
// revisions:x86_64 i686 aarch64 arm riscv
// min-llvm-version: 9.0
// needs-llvm-components: aarch64 arm riscv
//[x86_64] compile-flags: --target x86_64-unknown-uefi
//[i686] compile-flags: --target i686-unknown-linux-musl
//[aarch64] compile-flags: --target aarch64-unknown-none
//[arm] compile-flags: --target armv7r-none-eabi
//[riscv] compile-flags: --target riscv64gc-unknown-none-elf
// compile-flags: -C no-prepopulate-passes
#![crate_type = "lib"]
@ -22,6 +24,8 @@ trait Copy { }
//x86_64: define win64cc void @has_efiapi
//i686: define void @has_efiapi
//aarch64: define void @has_efiapi
//arm: define void @has_efiapi
//riscv: define void @has_efiapi
#[no_mangle]
pub extern "efiapi" fn has_efiapi() {}

View File

@ -1,4 +1,5 @@
// compile-flags: -O --target=avr-unknown-unknown --crate-type=rlib
// needs-llvm-components: avr
// This test validates that function pointers can be stored in global variables
// and called upon. It ensures that Rust emits function pointers in the correct

View File

@ -3,6 +3,7 @@
// compile-flags: --target=thumbv6m-none-eabi
// ignore-arm
// needs-llvm-components: arm
// error-pattern:target may not be installed
fn main() { }

View File

@ -1,6 +1,7 @@
//~ ERROR 1:1: 1:1: can't find crate for `core` [E0463]
// compile-flags: --target thumbv7em-none-eabihf
// needs-llvm-components: arm
#![deny(unsafe_code)]
#![deny(warnings)]
#![no_std]

View File

@ -1,4 +1,5 @@
// compile-flags: --crate-type dylib --target thumbv7em-none-eabihf
// needs-llvm-components: arm
// build-pass
// error-pattern: dropping unsupported crate type `dylib` for target `thumbv7em-none-eabihf`

View File

@ -1,3 +1,4 @@
use std::collections::HashSet;
use std::env;
use std::fs::File;
use std::io::prelude::*;
@ -186,6 +187,17 @@ impl EarlyProps {
if config.system_llvm && line.starts_with("no-system-llvm") {
return true;
}
if let Some(needed_components) =
config.parse_name_value_directive(line, "needs-llvm-components")
{
let components: HashSet<_> = config.llvm_components.split_whitespace().collect();
if !needed_components
.split_whitespace()
.all(|needed_component| components.contains(needed_component))
{
return true;
}
}
if let Some(actual_version) = config.llvm_version {
if let Some(rest) = line.strip_prefix("min-llvm-version:").map(str::trim) {
let min_version = extract_llvm_version(rest).unwrap();