about summary refs log tree commit diff
path: root/src/tools
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-01-17 16:18:28 +0000
committerbors <bors@rust-lang.org>2024-01-17 16:18:28 +0000
commit6ae4cfbbb080cafea7f6be48ce47678ee057352c (patch)
treec1b72b8d2ce9f38afe4221ff118e9e6fabb8f1a2 /src/tools
parentc58a5da7d48ff3887afe4c618dc04defdee3dab5 (diff)
parent12c19a2bb777a87c10afe1a7ea7fbee00def730d (diff)
downloadrust-6ae4cfbbb080cafea7f6be48ce47678ee057352c.tar.gz
rust-6ae4cfbbb080cafea7f6be48ce47678ee057352c.zip
Auto merge of #118708 - davidtwco:target-tier-assembly-test, r=Mark-Simulacrum
tests: add sanity-check assembly test for every target

Fixes #119910.

Adds a basic assembly test checking that each target can produce assembly and update the target tier policy to require this.

cc rust-lang/compiler-team#655
r? `@wesleywiser`
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/tidy/src/lib.rs1
-rw-r--r--src/tools/tidy/src/main.rs1
-rw-r--r--src/tools/tidy/src/target_policy.rs52
3 files changed, 54 insertions, 0 deletions
diff --git a/src/tools/tidy/src/lib.rs b/src/tools/tidy/src/lib.rs
index eb0a2fda290..95149987033 100644
--- a/src/tools/tidy/src/lib.rs
+++ b/src/tools/tidy/src/lib.rs
@@ -70,6 +70,7 @@ pub mod pal;
 pub mod rustdoc_css_themes;
 pub mod rustdoc_gui_tests;
 pub mod style;
+pub mod target_policy;
 pub mod target_specific_tests;
 pub mod tests_placement;
 pub mod ui_tests;
diff --git a/src/tools/tidy/src/main.rs b/src/tools/tidy/src/main.rs
index 9f92b8995b7..a9340c40f44 100644
--- a/src/tools/tidy/src/main.rs
+++ b/src/tools/tidy/src/main.rs
@@ -109,6 +109,7 @@ fn main() {
         // Checks that only make sense for the compiler.
         check!(error_codes, &root_path, &[&compiler_path, &librustdoc_path], verbose);
         check!(fluent_alphabetical, &compiler_path, bless);
+        check!(target_policy, &root_path);
 
         // Checks that only make sense for the std libs.
         check!(pal, &library_path);
diff --git a/src/tools/tidy/src/target_policy.rs b/src/tools/tidy/src/target_policy.rs
new file mode 100644
index 00000000000..ca6590d1502
--- /dev/null
+++ b/src/tools/tidy/src/target_policy.rs
@@ -0,0 +1,52 @@
+//! Tests for target tier policy compliance.
+//!
+//! As of writing, only checks that sanity-check assembly test for targets doesn't miss any targets.
+
+use crate::walk::{filter_not_rust, walk};
+use std::{collections::HashSet, path::Path};
+
+const TARGET_DEFINITIONS_PATH: &str = "compiler/rustc_target/src/spec/targets/";
+const ASSEMBLY_TEST_PATH: &str = "tests/assembly/targets/";
+const REVISION_LINE_START: &str = "// revisions: ";
+const EXCEPTIONS: &[&str] = &[
+    // FIXME: disabled since it fails on CI saying the csky component is missing
+    "csky_unknown_linux_gnuabiv2",
+    "csky_unknown_linux_gnuabiv2hf",
+];
+
+pub fn check(root_path: &Path, bad: &mut bool) {
+    let mut targets_to_find = HashSet::new();
+
+    let definitions_path = root_path.join(TARGET_DEFINITIONS_PATH);
+    for defn in ignore::WalkBuilder::new(&definitions_path)
+        .max_depth(Some(1))
+        .filter_entry(|e| !filter_not_rust(e.path()))
+        .build()
+    {
+        let defn = defn.unwrap();
+        // Skip directory itself.
+        if defn.path() == definitions_path {
+            continue;
+        }
+
+        let path = defn.path();
+        let target_name = path.file_stem().unwrap().to_string_lossy().into_owned();
+        let _ = targets_to_find.insert(target_name);
+    }
+
+    walk(&root_path.join(ASSEMBLY_TEST_PATH), |_, _| false, &mut |_, contents| {
+        for line in contents.lines() {
+            let Some(_) = line.find(REVISION_LINE_START) else {
+                continue;
+            };
+            let (_, target_name) = line.split_at(REVISION_LINE_START.len());
+            targets_to_find.remove(target_name);
+        }
+    });
+
+    for target in targets_to_find {
+        if !EXCEPTIONS.contains(&target.as_str()) {
+            tidy_error!(bad, "{ASSEMBLY_TEST_PATH}: missing assembly test for {target}")
+        }
+    }
+}