Skip to content

Commit 6ae4cfb

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 Fixes rust-lang#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`
2 parents c58a5da + 12c19a2 commit 6ae4cfb

File tree

9 files changed

+804
-8
lines changed

9 files changed

+804
-8
lines changed

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

-7
This file was deleted.

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub fn target() -> Target {
1111
Target {
1212
llvm_target: "powerpc64-unknown-linux-musl".into(),
1313
pointer_width: 64,
14-
data_layout: "E-m:e-Fi64-i64:64-n32:64-S128-v256:256:256-v512:512:512".into(),
14+
data_layout: "E-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512".into(),
1515
arch: "powerpc64".into(),
1616
options: TargetOptions { endian: Endian::Big, mcount: "_mcount".into(), ..base },
1717
}

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

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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+
const EXCEPTIONS: &[&str] = &[
12+
// FIXME: disabled since it fails on CI saying the csky component is missing
13+
"csky_unknown_linux_gnuabiv2",
14+
"csky_unknown_linux_gnuabiv2hf",
15+
];
16+
17+
pub fn check(root_path: &Path, bad: &mut bool) {
18+
let mut targets_to_find = HashSet::new();
19+
20+
let definitions_path = root_path.join(TARGET_DEFINITIONS_PATH);
21+
for defn in ignore::WalkBuilder::new(&definitions_path)
22+
.max_depth(Some(1))
23+
.filter_entry(|e| !filter_not_rust(e.path()))
24+
.build()
25+
{
26+
let defn = defn.unwrap();
27+
// Skip directory itself.
28+
if defn.path() == definitions_path {
29+
continue;
30+
}
31+
32+
let path = defn.path();
33+
let target_name = path.file_stem().unwrap().to_string_lossy().into_owned();
34+
let _ = targets_to_find.insert(target_name);
35+
}
36+
37+
walk(&root_path.join(ASSEMBLY_TEST_PATH), |_, _| false, &mut |_, contents| {
38+
for line in contents.lines() {
39+
let Some(_) = line.find(REVISION_LINE_START) else {
40+
continue;
41+
};
42+
let (_, target_name) = line.split_at(REVISION_LINE_START.len());
43+
targets_to_find.remove(target_name);
44+
}
45+
});
46+
47+
for target in targets_to_find {
48+
if !EXCEPTIONS.contains(&target.as_str()) {
49+
tidy_error!(bad, "{ASSEMBLY_TEST_PATH}: missing assembly test for {target}")
50+
}
51+
}
52+
}

tests/assembly/targets/targets-elf.rs

+633
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)