Skip to content

Commit e721a1a

Browse files
committed
Auto merge of rust-lang#118708 - davidtwco:target-tier-assembly-test, r=Mark-Simulacrum
tests: add sanity-check assembly test for every target 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`
2 parents 062e7c6 + 0f9e973 commit e721a1a

File tree

8 files changed

+793
-7
lines changed

8 files changed

+793
-7
lines changed

compiler/rustc_target/src/spec/targets/asmjs_unknown_emscripten.rs

-7
This file was deleted.

src/doc/rustc/src/target-tier-policy.md

+2
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,8 @@ approved by the appropriate team for that shared code before acceptance.
246246
introducing unconditional uses of features that another variation of the
247247
target may not have; use conditional compilation or runtime detection, as
248248
appropriate, to let each target run code supported by that target.
249+
- Tier 3 targets must be able to produce assembly using at least one of
250+
rustc's supported backends from any host target.
249251

250252
If a tier 3 target stops meeting these requirements, or the target maintainers
251253
no longer have interest or time, or the target shows no signs of activity and

src/tools/tidy/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ pub mod pal;
7070
pub mod rustdoc_css_themes;
7171
pub mod rustdoc_gui_tests;
7272
pub mod style;
73+
pub mod target_policy;
7374
pub mod target_specific_tests;
7475
pub mod tests_placement;
7576
pub mod ui_tests;

src/tools/tidy/src/main.rs

+1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ fn main() {
109109
// Checks that only make sense for the compiler.
110110
check!(error_codes, &root_path, &[&compiler_path, &librustdoc_path], verbose);
111111
check!(fluent_alphabetical, &compiler_path, bless);
112+
check!(target_policy, &root_path);
112113

113114
// Checks that only make sense for the std libs.
114115
check!(pal, &library_path);

src/tools/tidy/src/target_policy.rs

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//! Tests for target tier policy compliance.
2+
//!
3+
//! As of writing, only checks that sanity-check assembly test for targets doesn't miss any targets.
4+
5+
use crate::walk::{filter_not_rust, walk};
6+
use std::{collections::HashSet, path::Path};
7+
8+
const TARGET_DEFINITIONS_PATH: &str = "compiler/rustc_target/src/spec/targets/";
9+
const ASSEMBLY_TEST_PATH: &str = "tests/assembly/targets/";
10+
const REVISION_LINE_START: &str = "// revisions: ";
11+
12+
pub fn check(root_path: &Path, bad: &mut bool) {
13+
let mut targets_to_find = HashSet::new();
14+
15+
let definitions_path = root_path.join(TARGET_DEFINITIONS_PATH);
16+
for defn in ignore::WalkBuilder::new(&definitions_path)
17+
.max_depth(Some(1))
18+
.filter_entry(|e| !filter_not_rust(e.path()))
19+
.build()
20+
{
21+
let defn = defn.unwrap();
22+
// Skip directory itself.
23+
if defn.path() == definitions_path {
24+
continue;
25+
}
26+
27+
let path = defn.path();
28+
let target_name = path.file_stem().unwrap().to_string_lossy().into_owned();
29+
let _ = targets_to_find.insert(target_name);
30+
}
31+
32+
walk(&root_path.join(ASSEMBLY_TEST_PATH), |_, _| false, &mut |_, contents| {
33+
for line in contents.lines() {
34+
let Some(_) = line.find(REVISION_LINE_START) else {
35+
continue;
36+
};
37+
let (_, target_name) = line.split_at(REVISION_LINE_START.len());
38+
targets_to_find.remove(target_name);
39+
}
40+
});
41+
42+
for target in targets_to_find {
43+
tidy_error!(bad, "{ASSEMBLY_TEST_PATH}: missing assembly test for {target}")
44+
}
45+
}

tests/assembly/targets/targets-elf.rs

+630
Large diffs are not rendered by default.
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// assembly-output: emit-asm
2+
// ignore-tidy-linelength
3+
// revisions: nvptx64_nvidia_cuda
4+
// [nvptx64_nvidia_cuda] compile-flags: --target nvptx64-nvidia-cuda
5+
// [nvptx64_nvidia_cuda] needs-llvm-components: nvptx
6+
7+
// Sanity-check that each target can produce assembly code.
8+
9+
#![feature(no_core, lang_items)]
10+
#![no_std]
11+
#![no_core]
12+
#![crate_type = "lib"]
13+
14+
#[lang = "sized"]
15+
trait Sized {}
16+
17+
pub fn test() -> u8 {
18+
42
19+
}
20+
21+
// CHECK: .version

tests/assembly/targets/targets-pe.rs

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// assembly-output: emit-asm
2+
// ignore-tidy-linelength
3+
// revisions: aarch64_pc_windows_msvc
4+
// [aarch64_pc_windows_msvc] compile-flags: --target aarch64-pc-windows-msvc
5+
// [aarch64_pc_windows_msvc] needs-llvm-components: aarch64
6+
// revisions: aarch64_pc_windows_gnullvm
7+
// [aarch64_pc_windows_gnullvm] compile-flags: --target aarch64-pc-windows-gnullvm
8+
// [aarch64_pc_windows_gnullvm] needs-llvm-components: aarch64
9+
// revisions: aarch64_unknown_uefi
10+
// [aarch64_unknown_uefi] compile-flags: --target aarch64-unknown-uefi
11+
// [aarch64_unknown_uefi] needs-llvm-components: aarch64
12+
// revisions: aarch64_uwp_windows_msvc
13+
// [aarch64_uwp_windows_msvc] compile-flags: --target aarch64-uwp-windows-msvc
14+
// [aarch64_uwp_windows_msvc] needs-llvm-components: aarch64
15+
// revisions: avr_unknown_gnu_atmega328
16+
// [avr_unknown_gnu_atmega328] compile-flags: --target avr-unknown-gnu-atmega328
17+
// [avr_unknown_gnu_atmega328] needs-llvm-components: avr
18+
// revisions: bpfeb_unknown_none
19+
// [bpfeb_unknown_none] compile-flags: --target bpfeb-unknown-none
20+
// [bpfeb_unknown_none] needs-llvm-components: bpf
21+
// revisions: bpfel_unknown_none
22+
// [bpfel_unknown_none] compile-flags: --target bpfel-unknown-none
23+
// [bpfel_unknown_none] needs-llvm-components: bpf
24+
// revisions: i586_pc_windows_msvc
25+
// [i586_pc_windows_msvc] compile-flags: --target i586-pc-windows-msvc
26+
// [i586_pc_windows_msvc] needs-llvm-components: x86
27+
// revisions: i686_pc_windows_gnu
28+
// [i686_pc_windows_gnu] compile-flags: --target i686-pc-windows-gnu
29+
// [i686_pc_windows_gnu] needs-llvm-components: x86
30+
// revisions: i686_pc_windows_msvc
31+
// [i686_pc_windows_msvc] compile-flags: --target i686-pc-windows-msvc
32+
// [i686_pc_windows_msvc] needs-llvm-components: x86
33+
// revisions: i686_pc_windows_gnullvm
34+
// [i686_pc_windows_gnullvm] compile-flags: --target i686-pc-windows-gnullvm
35+
// [i686_pc_windows_gnullvm] needs-llvm-components: x86
36+
// revisions: i686_uwp_windows_gnu
37+
// [i686_uwp_windows_gnu] compile-flags: --target i686-uwp-windows-gnu
38+
// [i686_uwp_windows_gnu] needs-llvm-components: x86
39+
// revisions: i686_unknown_uefi
40+
// [i686_unknown_uefi] compile-flags: --target i686-unknown-uefi
41+
// [i686_unknown_uefi] needs-llvm-components: x86
42+
// revisions: i686_uwp_windows_msvc
43+
// [i686_uwp_windows_msvc] compile-flags: --target i686-uwp-windows-msvc
44+
// [i686_uwp_windows_msvc] needs-llvm-components: x86
45+
// revisions: i686_win7_windows_msvc
46+
// [i686_win7_windows_msvc] compile-flags: --target i686-win7-windows-msvc
47+
// [i686_win7_windows_msvc] needs-llvm-components: x86
48+
// revisions: powerpc64_ibm_aix
49+
// [powerpc64_ibm_aix] compile-flags: --target powerpc64-ibm-aix
50+
// [powerpc64_ibm_aix] needs-llvm-components: powerpc
51+
// revisions: thumbv7a_uwp_windows_msvc
52+
// [thumbv7a_uwp_windows_msvc] compile-flags: --target thumbv7a-uwp-windows-msvc
53+
// [thumbv7a_uwp_windows_msvc] needs-llvm-components: arm
54+
// revisions: thumbv7a_pc_windows_msvc
55+
// [thumbv7a_pc_windows_msvc] compile-flags: --target thumbv7a-pc-windows-msvc
56+
// [thumbv7a_pc_windows_msvc] needs-llvm-components: arm
57+
// revisions: x86_64_pc_windows_gnu
58+
// [x86_64_pc_windows_gnu] compile-flags: --target x86_64-pc-windows-gnu
59+
// [x86_64_pc_windows_gnu] needs-llvm-components: x86
60+
// revisions: x86_64_pc_windows_gnullvm
61+
// [x86_64_pc_windows_gnullvm] compile-flags: --target x86_64-pc-windows-gnullvm
62+
// [x86_64_pc_windows_gnullvm] needs-llvm-components: x86
63+
// revisions: x86_64_pc_windows_msvc
64+
// [x86_64_pc_windows_msvc] compile-flags: --target x86_64-pc-windows-msvc
65+
// [x86_64_pc_windows_msvc] needs-llvm-components: x86
66+
// revisions: x86_64_unknown_uefi
67+
// [x86_64_unknown_uefi] compile-flags: --target x86_64-unknown-uefi
68+
// [x86_64_unknown_uefi] needs-llvm-components: x86
69+
// revisions: x86_64_uwp_windows_gnu
70+
// [x86_64_uwp_windows_gnu] compile-flags: --target x86_64-uwp-windows-gnu
71+
// [x86_64_uwp_windows_gnu] needs-llvm-components: x86
72+
// revisions: x86_64_uwp_windows_msvc
73+
// [x86_64_uwp_windows_msvc] compile-flags: --target x86_64-uwp-windows-msvc
74+
// [x86_64_uwp_windows_msvc] needs-llvm-components: x86
75+
// revisions: x86_64_win7_windows_msvc
76+
// [x86_64_win7_windows_msvc] compile-flags: --target x86_64-win7-windows-msvc
77+
// [x86_64_win7_windows_msvc] needs-llvm-components: x86
78+
79+
// Sanity-check that each target can produce assembly code.
80+
81+
#![feature(no_core, lang_items)]
82+
#![no_std]
83+
#![no_core]
84+
#![crate_type = "lib"]
85+
86+
#[lang = "sized"]
87+
trait Sized {}
88+
89+
pub fn test() -> u8 {
90+
42
91+
}
92+
93+
// CHECK: .file

0 commit comments

Comments
 (0)