diff --git a/src/bootstrap/src/core/build_steps/test.rs b/src/bootstrap/src/core/build_steps/test.rs index 25b9d74417bba..f73d498026deb 100644 --- a/src/bootstrap/src/core/build_steps/test.rs +++ b/src/bootstrap/src/core/build_steps/test.rs @@ -957,6 +957,103 @@ impl Step for StdarchVerify { } } +/// Runs stdarch's intrinsic-test binary crate to verify that Rust's `core::arch` +/// SIMD intrinsics produce the same results as their C counterparts. +/// +/// First runs the `intrinsic-test` binary, which generates C wrapper programs +/// and a Rust Cargo workspace. Then runs `cargo test` on that workspace +/// which compiles both versions and compares their outputs on random inputs. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct IntrinsicTest { + host: TargetSelection, +} + +impl Step for IntrinsicTest { + type Output = (); + const IS_HOST: bool = true; + + fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { + run.path("library/stdarch/crates/intrinsic-test") + } + + fn make_run(run: RunConfig<'_>) { + let target = run.target; + if !target.contains("aarch64-unknown-linux") && !target.contains("x86_64-unknown-linux") { + return; + } + run.builder.ensure(IntrinsicTest { host: target }); + } + + fn run(self, builder: &Builder<'_>) { + let host = self.host; + + let (input_file, skip_file, cflags, sde_runner) = if host.contains("x86_64-unknown-linux") { + let cpuid_def = + builder.src.join("library/stdarch/ci/docker/x86_64-unknown-linux-gnu/cpuid.def"); + let sde_runner = format!( + "/intel-sde/sde64 -cpuid-in {} -rtm-mode full -tsx --", + cpuid_def.display() + ); + ( + builder.src.join("library/stdarch/intrinsics_data/x86-intel.xml"), + builder.src.join("library/stdarch/crates/intrinsic-test/missing_x86.txt"), + "-I/usr/include/x86_64-linux-gnu/", + Some(sde_runner), + ) + } else if host.contains("aarch64-unknown-linux") { + ( + builder.src.join("library/stdarch/intrinsics_data/arm_intrinsics.json"), + builder.src.join("library/stdarch/crates/intrinsic-test/missing_aarch64.txt"), + "-I/usr/aarch64-linux-gnu/include/", + None, + ) + } else { + panic!("intrinsic-test only supports aarch64/x86_64 Linux, got {host}"); + }; + + let out_dir = builder.out.join(host).join("intrinsic-test"); + t!(fs::create_dir_all(&out_dir)); + + let crates_link = out_dir.join("crates"); + if !crates_link.exists() { + t!( + helpers::symlink_dir( + &builder.config, + &builder.src.join("library/stdarch/crates"), + &crates_link + ), + format!("failed to symlink stdarch crates into {}", crates_link.display()) + ); + } + + let mut cmd = builder.tool_cmd(Tool::IntrinsicTest); + cmd.current_dir(&out_dir); + cmd.arg(&input_file); + cmd.arg("--target").arg(&*host.triple); + cmd.arg("--skip").arg(&skip_file); + cmd.arg("--sample-percentage").arg("10"); + cmd.env("CC", builder.cc(host)); + cmd.env("CFLAGS", cflags); + cmd.run(builder); + + let manifest = out_dir.join("rust_programs/Cargo.toml"); + let mut cargo = command(&builder.initial_cargo); + cargo.arg("test"); + cargo.arg("--tests"); + cargo.arg("--manifest-path").arg(&manifest); + cargo.arg("--target").arg(&*host.triple); + cargo.arg("--profile").arg("release"); + cargo.env("CC", builder.cc(host)); + cargo.env("CFLAGS", cflags); + cargo.env("RUSTC", &builder.initial_rustc); + cargo.env("RUSTC_BOOTSTRAP", "1"); + if let Some(runner) = sde_runner { + cargo.env("CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUNNER", runner); + } + cargo.run(builder); + } +} + #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Clippy { compilers: RustcPrivateCompilers, diff --git a/src/bootstrap/src/core/build_steps/tool.rs b/src/bootstrap/src/core/build_steps/tool.rs index a75d5e4db8998..7b62e31ab4084 100644 --- a/src/bootstrap/src/core/build_steps/tool.rs +++ b/src/bootstrap/src/core/build_steps/tool.rs @@ -508,6 +508,7 @@ bootstrap_tool!( FeaturesStatusDump, "src/tools/features-status-dump", "features-status-dump"; OptimizedDist, "src/tools/opt-dist", "opt-dist", submodules = &["src/tools/rustc-perf"]; RunMakeSupport, "src/tools/run-make-support", "run_make_support", artifact_kind = ToolArtifactKind::Library; + IntrinsicTest, "library/stdarch/crates/intrinsic-test", "intrinsic-test"; ); /// These are the submodules that are required for rustbook to work due to diff --git a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_library.snap b/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_library.snap index f97bb839c1e73..ba1f6b3c940c3 100644 --- a/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_library.snap +++ b/src/bootstrap/src/core/builder/cli_paths/snapshots/x_test_library.snap @@ -21,3 +21,6 @@ expression: test library [Test] test::StdarchVerify targets: [x86_64-unknown-linux-gnu] - Set({test::library/stdarch/crates/stdarch-verify}) +[Test] test::IntrinsicTest + targets: [x86_64-unknown-linux-gnu] + - Set({test::library/stdarch/crates/intrinsic-test}) diff --git a/src/bootstrap/src/core/builder/mod.rs b/src/bootstrap/src/core/builder/mod.rs index 2e640220efd8e..048fcc5c80145 100644 --- a/src/bootstrap/src/core/builder/mod.rs +++ b/src/bootstrap/src/core/builder/mod.rs @@ -911,6 +911,7 @@ impl<'a> Builder<'a> { test::Clippy, test::CompiletestTest, test::StdarchVerify, + test::IntrinsicTest, test::CrateRunMakeSupport, test::CrateBuildHelper, test::RustdocJSStd, diff --git a/src/ci/docker/host-aarch64/aarch64-gnu-llvm-21/Dockerfile b/src/ci/docker/host-aarch64/aarch64-gnu-llvm-21/Dockerfile index c364ac27aaa52..397fca9131b03 100644 --- a/src/ci/docker/host-aarch64/aarch64-gnu-llvm-21/Dockerfile +++ b/src/ci/docker/host-aarch64/aarch64-gnu-llvm-21/Dockerfile @@ -17,6 +17,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ gdb \ llvm-21-tools \ llvm-21-dev \ + clang \ libedit-dev \ libssl-dev \ pkg-config \ diff --git a/src/ci/docker/host-aarch64/aarch64-gnu/Dockerfile b/src/ci/docker/host-aarch64/aarch64-gnu/Dockerfile index 87bfc0766fbd9..8fc2a79cbf71b 100644 --- a/src/ci/docker/host-aarch64/aarch64-gnu/Dockerfile +++ b/src/ci/docker/host-aarch64/aarch64-gnu/Dockerfile @@ -16,8 +16,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libssl-dev \ pkg-config \ xz-utils \ + clang \ && rm -rf /var/lib/apt/lists/* - + + COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh diff --git a/src/ci/docker/host-x86_64/x86_64-gnu-llvm-21/Dockerfile b/src/ci/docker/host-x86_64/x86_64-gnu-llvm-21/Dockerfile index fc96735521077..29a70b368e00e 100644 --- a/src/ci/docker/host-x86_64/x86_64-gnu-llvm-21/Dockerfile +++ b/src/ci/docker/host-x86_64/x86_64-gnu-llvm-21/Dockerfile @@ -18,6 +18,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ gdb \ llvm-21-tools \ llvm-21-dev \ + clang \ libedit-dev \ libssl-dev \ pkg-config \ diff --git a/src/ci/docker/host-x86_64/x86_64-gnu-llvm-22/Dockerfile b/src/ci/docker/host-x86_64/x86_64-gnu-llvm-22/Dockerfile index a22e8de90804f..773f809c9e650 100644 --- a/src/ci/docker/host-x86_64/x86_64-gnu-llvm-22/Dockerfile +++ b/src/ci/docker/host-x86_64/x86_64-gnu-llvm-22/Dockerfile @@ -18,6 +18,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ gdb \ llvm-22-tools \ llvm-22-dev \ + clang \ libedit-dev \ libssl-dev \ pkg-config \ diff --git a/src/ci/docker/host-x86_64/x86_64-gnu/Dockerfile b/src/ci/docker/host-x86_64/x86_64-gnu/Dockerfile index 7ca2dbb7d9f36..522000846714d 100644 --- a/src/ci/docker/host-x86_64/x86_64-gnu/Dockerfile +++ b/src/ci/docker/host-x86_64/x86_64-gnu/Dockerfile @@ -19,8 +19,15 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ mingw-w64 \ zlib1g-dev \ libzstd-dev \ + clang \ && rm -rf /var/lib/apt/lists/* +# Install Intel SDE for AVX-512 emulation +RUN curl -L http://ci-mirrors.rust-lang.org/sde-external-10.8.0-2026-03-15-lin.tar.xz -o /tmp/sde.tar.xz \ + && mkdir -p /intel-sde \ + && tar -xJf /tmp/sde.tar.xz --strip-components=1 -C /intel-sde \ + && rm /tmp/sde.tar.xz + COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh