summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_codegen_cranelift/build_system
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_codegen_cranelift/build_system')
-rw-r--r--compiler/rustc_codegen_cranelift/build_system/abi_cafe.rs10
-rw-r--r--compiler/rustc_codegen_cranelift/build_system/bench.rs69
-rw-r--r--compiler/rustc_codegen_cranelift/build_system/build_backend.rs18
-rw-r--r--compiler/rustc_codegen_cranelift/build_system/build_sysroot.rs41
-rw-r--r--compiler/rustc_codegen_cranelift/build_system/main.rs5
-rw-r--r--compiler/rustc_codegen_cranelift/build_system/path.rs2
-rw-r--r--compiler/rustc_codegen_cranelift/build_system/prepare.rs15
-rw-r--r--compiler/rustc_codegen_cranelift/build_system/shared_utils.rs26
-rw-r--r--compiler/rustc_codegen_cranelift/build_system/tests.rs59
-rw-r--r--compiler/rustc_codegen_cranelift/build_system/usage.txt2
-rw-r--r--compiler/rustc_codegen_cranelift/build_system/utils.rs61
11 files changed, 216 insertions, 92 deletions
diff --git a/compiler/rustc_codegen_cranelift/build_system/abi_cafe.rs b/compiler/rustc_codegen_cranelift/build_system/abi_cafe.rs
index 29c127bf5..2e7ba1b20 100644
--- a/compiler/rustc_codegen_cranelift/build_system/abi_cafe.rs
+++ b/compiler/rustc_codegen_cranelift/build_system/abi_cafe.rs
@@ -1,8 +1,8 @@
-use super::build_sysroot;
-use super::path::Dirs;
-use super::prepare::GitRepo;
-use super::utils::{spawn_and_wait, CargoProject, Compiler};
-use super::{CodegenBackend, SysrootKind};
+use crate::build_sysroot;
+use crate::path::Dirs;
+use crate::prepare::GitRepo;
+use crate::utils::{spawn_and_wait, CargoProject, Compiler};
+use crate::{CodegenBackend, SysrootKind};
static ABI_CAFE_REPO: GitRepo = GitRepo::github(
"Gankra",
diff --git a/compiler/rustc_codegen_cranelift/build_system/bench.rs b/compiler/rustc_codegen_cranelift/build_system/bench.rs
index 2bb118000..6c64faaa2 100644
--- a/compiler/rustc_codegen_cranelift/build_system/bench.rs
+++ b/compiler/rustc_codegen_cranelift/build_system/bench.rs
@@ -1,10 +1,11 @@
use std::env;
+use std::io::Write;
use std::path::Path;
-use super::path::{Dirs, RelPath};
-use super::prepare::GitRepo;
-use super::rustc_info::get_file_name;
-use super::utils::{hyperfine_command, spawn_and_wait, Compiler};
+use crate::path::{Dirs, RelPath};
+use crate::prepare::GitRepo;
+use crate::rustc_info::get_file_name;
+use crate::utils::{hyperfine_command, spawn_and_wait, Compiler};
static SIMPLE_RAYTRACER_REPO: GitRepo = GitRepo::github(
"ebobby",
@@ -30,6 +31,12 @@ fn benchmark_simple_raytracer(dirs: &Dirs, bootstrap_host_compiler: &Compiler) {
let bench_runs = env::var("BENCH_RUNS").unwrap_or_else(|_| "10".to_string()).parse().unwrap();
+ let mut gha_step_summary = if let Ok(file) = std::env::var("GITHUB_STEP_SUMMARY") {
+ Some(std::fs::OpenOptions::new().append(true).open(file).unwrap())
+ } else {
+ None
+ };
+
eprintln!("[BENCH COMPILE] ebobby/simple-raytracer");
let cargo_clif = RelPath::DIST
.to_path(dirs)
@@ -60,36 +67,64 @@ fn benchmark_simple_raytracer(dirs: &Dirs, bootstrap_host_compiler: &Compiler) {
target_dir = target_dir.display(),
);
+ let bench_compile_markdown = RelPath::DIST.to_path(dirs).join("bench_compile.md");
+
let bench_compile = hyperfine_command(
1,
bench_runs,
Some(&clean_cmd),
- &[&llvm_build_cmd, &clif_build_cmd, &clif_build_opt_cmd],
+ &[
+ ("cargo build", &llvm_build_cmd),
+ ("cargo-clif build", &clif_build_cmd),
+ ("cargo-clif build --release", &clif_build_opt_cmd),
+ ],
+ &bench_compile_markdown,
);
spawn_and_wait(bench_compile);
+ if let Some(gha_step_summary) = gha_step_summary.as_mut() {
+ gha_step_summary.write_all(b"## Compile ebobby/simple-raytracer\n\n").unwrap();
+ gha_step_summary.write_all(&std::fs::read(bench_compile_markdown).unwrap()).unwrap();
+ gha_step_summary.write_all(b"\n").unwrap();
+ }
+
eprintln!("[BENCH RUN] ebobby/simple-raytracer");
+ let bench_run_markdown = RelPath::DIST.to_path(dirs).join("bench_run.md");
+
+ let raytracer_cg_llvm = Path::new(".").join(get_file_name(
+ &bootstrap_host_compiler.rustc,
+ "raytracer_cg_llvm",
+ "bin",
+ ));
+ let raytracer_cg_clif = Path::new(".").join(get_file_name(
+ &bootstrap_host_compiler.rustc,
+ "raytracer_cg_clif",
+ "bin",
+ ));
+ let raytracer_cg_clif_opt = Path::new(".").join(get_file_name(
+ &bootstrap_host_compiler.rustc,
+ "raytracer_cg_clif_opt",
+ "bin",
+ ));
let mut bench_run = hyperfine_command(
0,
bench_runs,
None,
&[
- Path::new(".")
- .join(get_file_name(&bootstrap_host_compiler.rustc, "raytracer_cg_llvm", "bin"))
- .to_str()
- .unwrap(),
- Path::new(".")
- .join(get_file_name(&bootstrap_host_compiler.rustc, "raytracer_cg_clif", "bin"))
- .to_str()
- .unwrap(),
- Path::new(".")
- .join(get_file_name(&bootstrap_host_compiler.rustc, "raytracer_cg_clif_opt", "bin"))
- .to_str()
- .unwrap(),
+ ("", raytracer_cg_llvm.to_str().unwrap()),
+ ("", raytracer_cg_clif.to_str().unwrap()),
+ ("", raytracer_cg_clif_opt.to_str().unwrap()),
],
+ &bench_run_markdown,
);
bench_run.current_dir(RelPath::BUILD.to_path(dirs));
spawn_and_wait(bench_run);
+
+ if let Some(gha_step_summary) = gha_step_summary.as_mut() {
+ gha_step_summary.write_all(b"## Run ebobby/simple-raytracer\n\n").unwrap();
+ gha_step_summary.write_all(&std::fs::read(bench_run_markdown).unwrap()).unwrap();
+ gha_step_summary.write_all(b"\n").unwrap();
+ }
}
diff --git a/compiler/rustc_codegen_cranelift/build_system/build_backend.rs b/compiler/rustc_codegen_cranelift/build_system/build_backend.rs
index 6855c1a7f..e434c36f9 100644
--- a/compiler/rustc_codegen_cranelift/build_system/build_backend.rs
+++ b/compiler/rustc_codegen_cranelift/build_system/build_backend.rs
@@ -1,9 +1,9 @@
-use std::env;
use std::path::PathBuf;
-use super::path::{Dirs, RelPath};
-use super::rustc_info::get_file_name;
-use super::utils::{is_ci, is_ci_opt, maybe_incremental, CargoProject, Compiler};
+use crate::path::{Dirs, RelPath};
+use crate::rustc_info::get_file_name;
+use crate::shared_utils::{rustflags_from_env, rustflags_to_cmd_env};
+use crate::utils::{is_ci, is_ci_opt, maybe_incremental, CargoProject, Compiler, LogGroup};
pub(crate) static CG_CLIF: CargoProject = CargoProject::new(&RelPath::SOURCE, "cg_clif");
@@ -13,14 +13,16 @@ pub(crate) fn build_backend(
bootstrap_host_compiler: &Compiler,
use_unstable_features: bool,
) -> PathBuf {
+ let _group = LogGroup::guard("Build backend");
+
let mut cmd = CG_CLIF.build(&bootstrap_host_compiler, dirs);
maybe_incremental(&mut cmd);
- let mut rustflags = env::var("RUSTFLAGS").unwrap_or_default();
+ let mut rustflags = rustflags_from_env("RUSTFLAGS");
if is_ci() {
// Deny warnings on CI
- rustflags += " -Dwarnings";
+ rustflags.push("-Dwarnings".to_owned());
if !is_ci_opt() {
cmd.env("CARGO_PROFILE_RELEASE_DEBUG_ASSERTIONS", "true");
@@ -40,10 +42,10 @@ pub(crate) fn build_backend(
_ => unreachable!(),
}
- cmd.env("RUSTFLAGS", rustflags);
+ rustflags_to_cmd_env(&mut cmd, "RUSTFLAGS", &rustflags);
eprintln!("[BUILD] rustc_codegen_cranelift");
- super::utils::spawn_and_wait(cmd);
+ crate::utils::spawn_and_wait(cmd);
CG_CLIF
.target_dir(dirs)
diff --git a/compiler/rustc_codegen_cranelift/build_system/build_sysroot.rs b/compiler/rustc_codegen_cranelift/build_system/build_sysroot.rs
index 74bba9ed5..31a4b2098 100644
--- a/compiler/rustc_codegen_cranelift/build_system/build_sysroot.rs
+++ b/compiler/rustc_codegen_cranelift/build_system/build_sysroot.rs
@@ -2,12 +2,13 @@ use std::fs;
use std::path::{Path, PathBuf};
use std::process::Command;
-use super::path::{Dirs, RelPath};
-use super::rustc_info::get_file_name;
-use super::utils::{
+use crate::path::{Dirs, RelPath};
+use crate::rustc_info::get_file_name;
+use crate::utils::{
maybe_incremental, remove_dir_if_exists, spawn_and_wait, try_hard_link, CargoProject, Compiler,
+ LogGroup,
};
-use super::{CodegenBackend, SysrootKind};
+use crate::{config, CodegenBackend, SysrootKind};
static DIST_DIR: RelPath = RelPath::DIST;
static BIN_DIR: RelPath = RelPath::DIST.join("bin");
@@ -22,6 +23,8 @@ pub(crate) fn build_sysroot(
rustup_toolchain_name: Option<&str>,
target_triple: String,
) -> Compiler {
+ let _guard = LogGroup::guard("Build sysroot");
+
eprintln!("[BUILD] sysroot {:?}", sysroot_kind);
DIST_DIR.ensure_fresh(dirs);
@@ -125,8 +128,8 @@ pub(crate) fn build_sysroot(
cargo: bootstrap_host_compiler.cargo.clone(),
rustc: rustc_clif.clone(),
rustdoc: rustdoc_clif.clone(),
- rustflags: String::new(),
- rustdocflags: String::new(),
+ rustflags: vec![],
+ rustdocflags: vec![],
triple: target_triple,
runner: vec![],
}
@@ -182,7 +185,7 @@ fn build_sysroot_for_triple(
#[must_use]
fn build_llvm_sysroot_for_triple(compiler: Compiler) -> SysrootTarget {
- let default_sysroot = super::rustc_info::get_default_sysroot(&compiler.rustc);
+ let default_sysroot = crate::rustc_info::get_default_sysroot(&compiler.rustc);
let mut target_libs = SysrootTarget { triple: compiler.triple, libs: vec![] };
@@ -231,29 +234,32 @@ fn build_clif_sysroot_for_triple(
let build_dir = STANDARD_LIBRARY.target_dir(dirs).join(&compiler.triple).join(channel);
- if !super::config::get_bool("keep_sysroot") {
+ if !config::get_bool("keep_sysroot") {
// Cleanup the deps dir, but keep build scripts and the incremental cache for faster
// recompilation as they are not affected by changes in cg_clif.
remove_dir_if_exists(&build_dir.join("deps"));
}
// Build sysroot
- let mut rustflags = " -Zforce-unstable-if-unmarked -Cpanic=abort".to_string();
+ let mut rustflags = vec!["-Zforce-unstable-if-unmarked".to_owned(), "-Cpanic=abort".to_owned()];
match cg_clif_dylib_path {
CodegenBackend::Local(path) => {
- rustflags.push_str(&format!(" -Zcodegen-backend={}", path.to_str().unwrap()));
+ rustflags.push(format!("-Zcodegen-backend={}", path.to_str().unwrap()));
}
CodegenBackend::Builtin(name) => {
- rustflags.push_str(&format!(" -Zcodegen-backend={name}"));
+ rustflags.push(format!("-Zcodegen-backend={name}"));
}
};
// Necessary for MinGW to find rsbegin.o and rsend.o
- rustflags
- .push_str(&format!(" --sysroot {}", RTSTARTUP_SYSROOT.to_path(dirs).to_str().unwrap()));
+ rustflags.push("--sysroot".to_owned());
+ rustflags.push(RTSTARTUP_SYSROOT.to_path(dirs).to_str().unwrap().to_owned());
if channel == "release" {
- rustflags.push_str(" -Zmir-opt-level=3");
+ // Incremental compilation by default disables mir inlining. This leads to both a decent
+ // compile perf and a significant runtime perf regression. As such forcefully enable mir
+ // inlining.
+ rustflags.push("-Zinline-mir".to_owned());
}
- compiler.rustflags += &rustflags;
+ compiler.rustflags.extend(rustflags);
let mut build_cmd = STANDARD_LIBRARY.build(&compiler, dirs);
maybe_incremental(&mut build_cmd);
if channel == "release" {
@@ -283,8 +289,8 @@ fn build_clif_sysroot_for_triple(
}
fn build_rtstartup(dirs: &Dirs, compiler: &Compiler) -> Option<SysrootTarget> {
- if !super::config::get_bool("keep_sysroot") {
- super::prepare::prepare_stdlib(dirs, &compiler.rustc);
+ if !config::get_bool("keep_sysroot") {
+ crate::prepare::prepare_stdlib(dirs, &compiler.rustc);
}
if !compiler.triple.ends_with("windows-gnu") {
@@ -300,6 +306,7 @@ fn build_rtstartup(dirs: &Dirs, compiler: &Compiler) -> Option<SysrootTarget> {
let obj = RTSTARTUP_SYSROOT.to_path(dirs).join(format!("{file}.o"));
let mut build_rtstartup_cmd = Command::new(&compiler.rustc);
build_rtstartup_cmd
+ .arg("-Ainternal_features") // Missing #[allow(internal_features)]
.arg("--target")
.arg(&compiler.triple)
.arg("--emit=obj")
diff --git a/compiler/rustc_codegen_cranelift/build_system/main.rs b/compiler/rustc_codegen_cranelift/build_system/main.rs
index 3bc78d5db..798ae9dbd 100644
--- a/compiler/rustc_codegen_cranelift/build_system/main.rs
+++ b/compiler/rustc_codegen_cranelift/build_system/main.rs
@@ -16,6 +16,7 @@ mod config;
mod path;
mod prepare;
mod rustc_info;
+mod shared_utils;
mod tests;
mod utils;
@@ -169,8 +170,8 @@ fn main() {
cargo,
rustc,
rustdoc,
- rustflags: String::new(),
- rustdocflags: String::new(),
+ rustflags: vec![],
+ rustdocflags: vec![],
triple,
runner: vec![],
}
diff --git a/compiler/rustc_codegen_cranelift/build_system/path.rs b/compiler/rustc_codegen_cranelift/build_system/path.rs
index 4f86c0fd2..8572815fc 100644
--- a/compiler/rustc_codegen_cranelift/build_system/path.rs
+++ b/compiler/rustc_codegen_cranelift/build_system/path.rs
@@ -1,7 +1,7 @@
use std::fs;
use std::path::PathBuf;
-use super::utils::remove_dir_if_exists;
+use crate::utils::remove_dir_if_exists;
#[derive(Debug, Clone)]
pub(crate) struct Dirs {
diff --git a/compiler/rustc_codegen_cranelift/build_system/prepare.rs b/compiler/rustc_codegen_cranelift/build_system/prepare.rs
index e31e39a48..165296cb4 100644
--- a/compiler/rustc_codegen_cranelift/build_system/prepare.rs
+++ b/compiler/rustc_codegen_cranelift/build_system/prepare.rs
@@ -3,18 +3,18 @@ use std::fs;
use std::path::{Path, PathBuf};
use std::process::Command;
-use super::build_sysroot::STDLIB_SRC;
-use super::path::{Dirs, RelPath};
-use super::rustc_info::get_default_sysroot;
-use super::utils::{
+use crate::build_sysroot::STDLIB_SRC;
+use crate::path::{Dirs, RelPath};
+use crate::rustc_info::get_default_sysroot;
+use crate::utils::{
copy_dir_recursively, git_command, remove_dir_if_exists, retry_spawn_and_wait, spawn_and_wait,
};
pub(crate) fn prepare(dirs: &Dirs) {
RelPath::DOWNLOAD.ensure_exists(dirs);
- super::tests::RAND_REPO.fetch(dirs);
- super::tests::REGEX_REPO.fetch(dirs);
- super::tests::PORTABLE_SIMD_REPO.fetch(dirs);
+ crate::tests::RAND_REPO.fetch(dirs);
+ crate::tests::REGEX_REPO.fetch(dirs);
+ crate::tests::PORTABLE_SIMD_REPO.fetch(dirs);
}
pub(crate) fn prepare_stdlib(dirs: &Dirs, rustc: &Path) {
@@ -27,6 +27,7 @@ pub(crate) fn prepare_stdlib(dirs: &Dirs, rustc: &Path) {
STDLIB_SRC.to_path(dirs).join("Cargo.toml"),
r#"
[workspace]
+resolver = "1"
members = ["./library/sysroot"]
[patch.crates-io]
diff --git a/compiler/rustc_codegen_cranelift/build_system/shared_utils.rs b/compiler/rustc_codegen_cranelift/build_system/shared_utils.rs
new file mode 100644
index 000000000..0aea545ff
--- /dev/null
+++ b/compiler/rustc_codegen_cranelift/build_system/shared_utils.rs
@@ -0,0 +1,26 @@
+// This file is used by both the build system as well as cargo-clif.rs
+
+// Adapted from https://github.com/rust-lang/cargo/blob/6dc1deaddf62c7748c9097c7ea88e9ec77ff1a1a/src/cargo/core/compiler/build_context/target_info.rs#L750-L77
+pub(crate) fn rustflags_from_env(kind: &str) -> Vec<String> {
+ // First try CARGO_ENCODED_RUSTFLAGS from the environment.
+ // Prefer this over RUSTFLAGS since it's less prone to encoding errors.
+ if let Ok(a) = std::env::var(format!("CARGO_ENCODED_{}", kind)) {
+ if a.is_empty() {
+ return Vec::new();
+ }
+ return a.split('\x1f').map(str::to_string).collect();
+ }
+
+ // Then try RUSTFLAGS from the environment
+ if let Ok(a) = std::env::var(kind) {
+ let args = a.split(' ').map(str::trim).filter(|s| !s.is_empty()).map(str::to_string);
+ return args.collect();
+ }
+
+ // No rustflags to be collected from the environment
+ Vec::new()
+}
+
+pub(crate) fn rustflags_to_cmd_env(cmd: &mut std::process::Command, kind: &str, flags: &[String]) {
+ cmd.env(format!("CARGO_ENCODED_{}", kind), flags.join("\x1f"));
+}
diff --git a/compiler/rustc_codegen_cranelift/build_system/tests.rs b/compiler/rustc_codegen_cranelift/build_system/tests.rs
index 08d8f708c..e7bd8b127 100644
--- a/compiler/rustc_codegen_cranelift/build_system/tests.rs
+++ b/compiler/rustc_codegen_cranelift/build_system/tests.rs
@@ -1,16 +1,17 @@
-use super::build_sysroot;
-use super::config;
-use super::path::{Dirs, RelPath};
-use super::prepare::{apply_patches, GitRepo};
-use super::rustc_info::get_default_sysroot;
-use super::utils::{spawn_and_wait, spawn_and_wait_with_input, CargoProject, Compiler};
-use super::{CodegenBackend, SysrootKind};
-use std::env;
use std::ffi::OsStr;
use std::fs;
use std::path::PathBuf;
use std::process::Command;
+use crate::build_sysroot;
+use crate::config;
+use crate::path::{Dirs, RelPath};
+use crate::prepare::{apply_patches, GitRepo};
+use crate::rustc_info::get_default_sysroot;
+use crate::shared_utils::rustflags_from_env;
+use crate::utils::{spawn_and_wait, spawn_and_wait_with_input, CargoProject, Compiler, LogGroup};
+use crate::{CodegenBackend, SysrootKind};
+
static BUILD_EXAMPLE_OUT_DIR: RelPath = RelPath::BUILD.join("example");
struct TestCase {
@@ -21,6 +22,7 @@ struct TestCase {
enum TestCaseCmd {
Custom { func: &'static dyn Fn(&TestRunner<'_>) },
BuildLib { source: &'static str, crate_types: &'static str },
+ BuildBin { source: &'static str },
BuildBinAndRun { source: &'static str, args: &'static [&'static str] },
JitBin { source: &'static str, args: &'static str },
}
@@ -39,6 +41,10 @@ impl TestCase {
Self { config, cmd: TestCaseCmd::BuildLib { source, crate_types } }
}
+ const fn build_bin(config: &'static str, source: &'static str) -> Self {
+ Self { config, cmd: TestCaseCmd::BuildBin { source } }
+ }
+
const fn build_bin_and_run(
config: &'static str,
source: &'static str,
@@ -92,6 +98,7 @@ const BASE_SYSROOT_SUITE: &[TestCase] = &[
TestCase::build_bin_and_run("aot.float-minmax-pass", "example/float-minmax-pass.rs", &[]),
TestCase::build_bin_and_run("aot.mod_bench", "example/mod_bench.rs", &[]),
TestCase::build_bin_and_run("aot.issue-72793", "example/issue-72793.rs", &[]),
+ TestCase::build_bin("aot.issue-59326", "example/issue-59326.rs"),
];
// FIXME(rust-random/rand#1293): Newer rand versions fail to test on Windows. Update once this is
@@ -119,8 +126,8 @@ pub(crate) static REGEX: CargoProject = CargoProject::new(&REGEX_REPO.source_dir
pub(crate) static PORTABLE_SIMD_REPO: GitRepo = GitRepo::github(
"rust-lang",
"portable-simd",
- "ad8afa8c81273b3b49acbea38cd3bcf17a34cf2b",
- "800548f8000e31bd",
+ "7c7dbe0c505ccbc02ff30c1e37381ab1d47bf46f",
+ "5bcc9c544f6fa7bd",
"portable-simd",
);
@@ -300,7 +307,7 @@ pub(crate) fn run_tests(
);
// Rust's build system denies a couple of lints that trigger on several of the test
// projects. Changing the code to fix them is not worth it, so just silence all lints.
- target_compiler.rustflags += " --cap-lints=allow";
+ target_compiler.rustflags.push("--cap-lints=allow".to_owned());
let runner = TestRunner::new(
dirs.clone(),
@@ -344,18 +351,15 @@ impl<'a> TestRunner<'a> {
is_native: bool,
stdlib_source: PathBuf,
) -> Self {
- if let Ok(rustflags) = env::var("RUSTFLAGS") {
- target_compiler.rustflags.push(' ');
- target_compiler.rustflags.push_str(&rustflags);
- }
- if let Ok(rustdocflags) = env::var("RUSTDOCFLAGS") {
- target_compiler.rustdocflags.push(' ');
- target_compiler.rustdocflags.push_str(&rustdocflags);
- }
+ target_compiler.rustflags.extend(rustflags_from_env("RUSTFLAGS"));
+ target_compiler.rustdocflags.extend(rustflags_from_env("RUSTDOCFLAGS"));
// FIXME fix `#[linkage = "extern_weak"]` without this
if target_compiler.triple.contains("darwin") {
- target_compiler.rustflags.push_str(" -Clink-arg=-undefined -Clink-arg=dynamic_lookup");
+ target_compiler.rustflags.extend([
+ "-Clink-arg=-undefined".to_owned(),
+ "-Clink-arg=dynamic_lookup".to_owned(),
+ ]);
}
let jit_supported = use_unstable_features
@@ -380,15 +384,17 @@ impl<'a> TestRunner<'a> {
let tag = tag.to_uppercase();
let is_jit_test = tag == "JIT";
- if !config::get_bool(config)
+ let _guard = if !config::get_bool(config)
|| (is_jit_test && !self.jit_supported)
|| self.skip_tests.contains(&config)
{
eprintln!("[{tag}] {testname} (skipped)");
continue;
} else {
+ let guard = LogGroup::guard(&format!("[{tag}] {testname}"));
eprintln!("[{tag}] {testname}");
- }
+ guard
+ };
match *cmd {
TestCaseCmd::Custom { func } => func(self),
@@ -405,6 +411,13 @@ impl<'a> TestRunner<'a> {
]);
}
}
+ TestCaseCmd::BuildBin { source } => {
+ if self.use_unstable_features {
+ self.run_rustc([source]);
+ } else {
+ self.run_rustc([source, "--cfg", "no_unstable_features"]);
+ }
+ }
TestCaseCmd::BuildBinAndRun { source, args } => {
if self.use_unstable_features {
self.run_rustc([source]);
@@ -455,7 +468,7 @@ impl<'a> TestRunner<'a> {
S: AsRef<OsStr>,
{
let mut cmd = Command::new(&self.target_compiler.rustc);
- cmd.args(self.target_compiler.rustflags.split_whitespace());
+ cmd.args(&self.target_compiler.rustflags);
cmd.arg("-L");
cmd.arg(format!("crate={}", BUILD_EXAMPLE_OUT_DIR.to_path(&self.dirs).display()));
cmd.arg("--out-dir");
diff --git a/compiler/rustc_codegen_cranelift/build_system/usage.txt b/compiler/rustc_codegen_cranelift/build_system/usage.txt
index 6d3b3a13d..f65259944 100644
--- a/compiler/rustc_codegen_cranelift/build_system/usage.txt
+++ b/compiler/rustc_codegen_cranelift/build_system/usage.txt
@@ -43,7 +43,7 @@ REQUIREMENTS:
* Rustup: By default rustup is used to install the right nightly version. If you don't want to
use rustup, you can manually install the nightly version indicated by rust-toolchain.toml and
point the CARGO, RUSTC and RUSTDOC env vars to the right executables.
- * Git: `./y.sh prepare` uses git for applying patches and on Windows for downloading test repos.
+ * Git: Git is used for applying patches and on Windows for downloading test repos.
* Curl and tar (non-Windows only): Used by `./y.sh prepare` to download a single commit for
repos. Git will be used to clone the whole repo when using Windows.
* [Hyperfine](https://github.com/sharkdp/hyperfine/): Used for benchmarking with `./y.sh bench`.
diff --git a/compiler/rustc_codegen_cranelift/build_system/utils.rs b/compiler/rustc_codegen_cranelift/build_system/utils.rs
index 41fc366e2..24624cdea 100644
--- a/compiler/rustc_codegen_cranelift/build_system/utils.rs
+++ b/compiler/rustc_codegen_cranelift/build_system/utils.rs
@@ -3,16 +3,18 @@ use std::fs;
use std::io::{self, Write};
use std::path::{Path, PathBuf};
use std::process::{self, Command, Stdio};
+use std::sync::atomic::{AtomicBool, Ordering};
-use super::path::{Dirs, RelPath};
+use crate::path::{Dirs, RelPath};
+use crate::shared_utils::rustflags_to_cmd_env;
#[derive(Clone, Debug)]
pub(crate) struct Compiler {
pub(crate) cargo: PathBuf,
pub(crate) rustc: PathBuf,
pub(crate) rustdoc: PathBuf,
- pub(crate) rustflags: String,
- pub(crate) rustdocflags: String,
+ pub(crate) rustflags: Vec<String>,
+ pub(crate) rustdocflags: Vec<String>,
pub(crate) triple: String,
pub(crate) runner: Vec<String>,
}
@@ -22,8 +24,8 @@ impl Compiler {
match self.triple.as_str() {
"aarch64-unknown-linux-gnu" => {
// We are cross-compiling for aarch64. Use the correct linker and run tests in qemu.
- self.rustflags += " -Clinker=aarch64-linux-gnu-gcc";
- self.rustdocflags += " -Clinker=aarch64-linux-gnu-gcc";
+ self.rustflags.push("-Clinker=aarch64-linux-gnu-gcc".to_owned());
+ self.rustdocflags.push("-Clinker=aarch64-linux-gnu-gcc".to_owned());
self.runner = vec![
"qemu-aarch64".to_owned(),
"-L".to_owned(),
@@ -32,8 +34,8 @@ impl Compiler {
}
"s390x-unknown-linux-gnu" => {
// We are cross-compiling for s390x. Use the correct linker and run tests in qemu.
- self.rustflags += " -Clinker=s390x-linux-gnu-gcc";
- self.rustdocflags += " -Clinker=s390x-linux-gnu-gcc";
+ self.rustflags.push("-Clinker=s390x-linux-gnu-gcc".to_owned());
+ self.rustdocflags.push("-Clinker=s390x-linux-gnu-gcc".to_owned());
self.runner = vec![
"qemu-s390x".to_owned(),
"-L".to_owned(),
@@ -99,8 +101,8 @@ impl CargoProject {
cmd.env("RUSTC", &compiler.rustc);
cmd.env("RUSTDOC", &compiler.rustdoc);
- cmd.env("RUSTFLAGS", &compiler.rustflags);
- cmd.env("RUSTDOCFLAGS", &compiler.rustdocflags);
+ rustflags_to_cmd_env(&mut cmd, "RUSTFLAGS", &compiler.rustflags);
+ rustflags_to_cmd_env(&mut cmd, "RUSTDOCFLAGS", &compiler.rustdocflags);
if !compiler.runner.is_empty() {
cmd.env(
format!("CARGO_TARGET_{}_RUNNER", compiler.triple.to_uppercase().replace('-', "_")),
@@ -136,10 +138,13 @@ pub(crate) fn hyperfine_command(
warmup: u64,
runs: u64,
prepare: Option<&str>,
- cmds: &[&str],
+ cmds: &[(&str, &str)],
+ markdown_export: &Path,
) -> Command {
let mut bench = Command::new("hyperfine");
+ bench.arg("--export-markdown").arg(markdown_export);
+
if warmup != 0 {
bench.arg("--warmup").arg(warmup.to_string());
}
@@ -152,7 +157,12 @@ pub(crate) fn hyperfine_command(
bench.arg("--prepare").arg(prepare);
}
- bench.args(cmds);
+ for &(name, cmd) in cmds {
+ if name != "" {
+ bench.arg("-n").arg(name);
+ }
+ bench.arg(cmd);
+ }
bench
}
@@ -167,6 +177,8 @@ pub(crate) fn git_command<'a>(repo_dir: impl Into<Option<&'a Path>>, cmd: &str)
.arg("user.email=dummy@example.com")
.arg("-c")
.arg("core.autocrlf=false")
+ .arg("-c")
+ .arg("commit.gpgSign=false")
.arg(cmd);
if let Some(repo_dir) = repo_dir.into() {
git_cmd.current_dir(repo_dir);
@@ -259,6 +271,33 @@ pub(crate) fn is_ci_opt() -> bool {
env::var("CI_OPT").is_ok()
}
+static IN_GROUP: AtomicBool = AtomicBool::new(false);
+pub(crate) struct LogGroup {
+ is_gha: bool,
+}
+
+impl LogGroup {
+ pub(crate) fn guard(name: &str) -> LogGroup {
+ let is_gha = env::var("GITHUB_ACTIONS").is_ok();
+
+ assert!(!IN_GROUP.swap(true, Ordering::SeqCst));
+ if is_gha {
+ eprintln!("::group::{name}");
+ }
+
+ LogGroup { is_gha }
+ }
+}
+
+impl Drop for LogGroup {
+ fn drop(&mut self) {
+ if self.is_gha {
+ eprintln!("::endgroup::");
+ }
+ IN_GROUP.store(false, Ordering::SeqCst);
+ }
+}
+
pub(crate) fn maybe_incremental(cmd: &mut Command) {
if is_ci() || std::env::var("CARGO_BUILD_INCREMENTAL").map_or(false, |val| val == "false") {
// Disabling incr comp reduces cache size and incr comp doesn't save as much on CI anyway