diff --git a/src/tools/compiletest/src/cli.rs b/src/tools/compiletest/src/cli.rs index 1325afc2adaa3..1786c68a1889c 100644 --- a/src/tools/compiletest/src/cli.rs +++ b/src/tools/compiletest/src/cli.rs @@ -385,6 +385,13 @@ pub(crate) fn parse_config(args: Vec) -> Config { let iteration_count = args.iteration_count.unwrap_or(Config::DEFAULT_ITERATION_COUNT); assert!(iteration_count > 0, "`--iteration-count` must be a positive integer"); + let gcc_supported_target_tuples = match default_codegen_backend { + CodegenBackend::Gcc => { + directives::find_gcc_supported_targets(&args.sysroot_base, &args.host) + } + CodegenBackend::Llvm | CodegenBackend::Cranelift => vec![], + }; + Config { bless: args.bless, fail_fast: args.fail_fast || env::var_os("RUSTC_TEST_FAIL_FAST").is_some(), @@ -494,6 +501,8 @@ pub(crate) fn parse_config(args: Vec) -> Config { override_codegen_backend: args.override_codegen_backend, bypass_ignore_backends: args.bypass_ignore_backends, + gcc_supported_target_tuples, + jobs: args.jobs, parallel_frontend_threads, diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs index 82bfa80b2b9c0..de5c50d234661 100644 --- a/src/tools/compiletest/src/common.rs +++ b/src/tools/compiletest/src/common.rs @@ -754,6 +754,9 @@ pub(crate) struct Config { /// Whether to ignore `//@ ignore-backends`. pub(crate) bypass_ignore_backends: bool, + /// Target tuples for which we've found libgccjit.so. + pub(crate) gcc_supported_target_tuples: Vec, + /// Number of parallel jobs configured for the build. /// /// This is forwarded from bootstrap's `jobs` configuration. diff --git a/src/tools/compiletest/src/directives.rs b/src/tools/compiletest/src/directives.rs index dc10430f038ec..3499821f7b6e0 100644 --- a/src/tools/compiletest/src/directives.rs +++ b/src/tools/compiletest/src/directives.rs @@ -851,6 +851,30 @@ pub(crate) fn extract_llvm_version_from_binary(binary_path: &str) -> Option Vec { + // E.g. `lib/rustlib/x86_64-unknown-linux-gnu/codegen-backends/lib`. + let backends_dir = + sysroot_base.join("lib").join("rustlib").join(host).join("codegen-backends").join("lib"); + + match std::fs::read_dir(&backends_dir) { + Ok(entries) => { + // Search for `aarch64-unknown-linux-gnu/libgccjit.so` et cetera. + let target_tuples: Vec<_> = entries + .filter_map(|entry| entry.ok()) + .filter(|entry| entry.path().join("libgccjit.so").exists()) + .filter_map(|entry| entry.file_name().into_string().ok()) + .collect(); + + if target_tuples.is_empty() { + panic!("did not find `libgccjit.so` for any target in {backends_dir}"); + } + + target_tuples + } + Err(e) => panic!("unable to find `libgccjit.so` for any target in {backends_dir}: {e:?}",), + } +} + /// Takes a directive of the form `" [- ]"`, returns the numeric representation /// of `` and `` as tuple: `(, )`. /// @@ -958,6 +982,7 @@ pub(crate) fn make_test_description( decision!(ignore_llvm(config, ln)); decision!(ignore_backends(config, ln)); decision!(needs_backends(config, ln)); + decision!(ignore_unsupported_backend_target(config, ln)); decision!(ignore_cdb(config, variant, ln)); decision!(ignore_gdb(config, variant, ln)); decision!(ignore_lldb(config, variant, ln)); @@ -1212,6 +1237,36 @@ fn needs_backends(config: &Config, line: &DirectiveLine<'_>) -> IgnoreDecision { IgnoreDecision::Continue } +/// When using the GCC backend, ignore tests for which we did not find a libgccjit.so. +fn ignore_unsupported_backend_target(config: &Config, line: &DirectiveLine<'_>) -> IgnoreDecision { + if config.default_codegen_backend != crate::CodegenBackend::Gcc { + return IgnoreDecision::Continue; + } + + let Some(compile_flags) = config.parse_name_value_directive(line, "compile-flags") else { + return IgnoreDecision::Continue; + }; + + // See if this line sets a `--target=...` + let Some((_, rest)) = compile_flags.split_once("--target") else { + return IgnoreDecision::Continue; + }; + let Some(target) = rest.trim_start_matches([' ', '=']).split_whitespace().next() else { + return IgnoreDecision::Continue; + }; + + if !config.gcc_supported_target_tuples.iter().any(|t| t == target) { + IgnoreDecision::Ignore { + reason: format!( + "backend `{}` cannot build for target `{target}`", + config.default_codegen_backend.as_str() + ), + } + } else { + IgnoreDecision::Continue + } +} + fn ignore_llvm(config: &Config, line: &DirectiveLine<'_>) -> IgnoreDecision { let path = line.file_path; if let Some(needed_components) = diff --git a/src/tools/compiletest/src/rustdoc_gui_test.rs b/src/tools/compiletest/src/rustdoc_gui_test.rs index 215fee768f254..7fc37a1a4371d 100644 --- a/src/tools/compiletest/src/rustdoc_gui_test.rs +++ b/src/tools/compiletest/src/rustdoc_gui_test.rs @@ -139,6 +139,7 @@ fn incomplete_config_for_rustdoc_gui_test() -> Config { default_codegen_backend: CodegenBackend::Llvm, override_codegen_backend: None, bypass_ignore_backends: Default::default(), + gcc_supported_target_tuples: vec![], jobs: Default::default(), parallel_frontend_threads: Config::DEFAULT_PARALLEL_FRONTEND_THREADS, iteration_count: Config::DEFAULT_ITERATION_COUNT, diff --git a/tests/ui/asm/naked-functions/instruction-set.rs b/tests/ui/asm/naked-functions/instruction-set.rs index 8c796ff8b262b..4d60afa57b222 100644 --- a/tests/ui/asm/naked-functions/instruction-set.rs +++ b/tests/ui/asm/naked-functions/instruction-set.rs @@ -2,7 +2,6 @@ //@ compile-flags: --target armv5te-unknown-linux-gnueabi //@ needs-llvm-components: arm //@ build-pass -//@ ignore-backends: gcc #![crate_type = "lib"] #![feature(no_core)]