201 lines
8.8 KiB
Diff
201 lines
8.8 KiB
Diff
|
From 56942ed6d13d330facddbd71470a3c115a3fe0d1 Mon Sep 17 00:00:00 2001
|
||
|
From: Josh Stone <jistone@redhat.com>
|
||
|
Date: Fri, 5 Apr 2024 15:07:58 -0700
|
||
|
Subject: [PATCH] bootstrap: move all of rustc's flags to `rustc_cargo`
|
||
|
|
||
|
This ensures that `RUSTFLAGS` will be consistent between all modes of
|
||
|
building the compiler, so they won't trigger a rebuild by cargo. This
|
||
|
kind of fix was started in #119414 just for LTO flags, but it's
|
||
|
applicable to all kinds of flags that might be configured.
|
||
|
|
||
|
(cherry picked from commit e8fb8c36ca0de817b3d30f603d6d6b3c56e8b0be)
|
||
|
---
|
||
|
src/bootstrap/src/core/build_steps/check.rs | 2 +-
|
||
|
src/bootstrap/src/core/build_steps/compile.rs | 107 +++++++++---------
|
||
|
src/bootstrap/src/core/build_steps/doc.rs | 2 +-
|
||
|
src/bootstrap/src/core/build_steps/test.rs | 2 +-
|
||
|
4 files changed, 59 insertions(+), 54 deletions(-)
|
||
|
|
||
|
diff --git a/src/bootstrap/src/core/build_steps/check.rs b/src/bootstrap/src/core/build_steps/check.rs
|
||
|
index 5f0afdb1b36c..dd866c2eb0f3 100644
|
||
|
--- a/src/bootstrap/src/core/build_steps/check.rs
|
||
|
+++ b/src/bootstrap/src/core/build_steps/check.rs
|
||
|
@@ -263,7 +263,7 @@ fn run(self, builder: &Builder<'_>) {
|
||
|
target,
|
||
|
cargo_subcommand(builder.kind),
|
||
|
);
|
||
|
- rustc_cargo(builder, &mut cargo, target, compiler.stage);
|
||
|
+ rustc_cargo(builder, &mut cargo, target, &compiler);
|
||
|
|
||
|
// For ./x.py clippy, don't run with --all-targets because
|
||
|
// linting tests and benchmarks can produce very noisy results
|
||
|
diff --git a/src/bootstrap/src/core/build_steps/compile.rs b/src/bootstrap/src/core/build_steps/compile.rs
|
||
|
index ddbe18ab8388..607a658617b5 100644
|
||
|
--- a/src/bootstrap/src/core/build_steps/compile.rs
|
||
|
+++ b/src/bootstrap/src/core/build_steps/compile.rs
|
||
|
@@ -898,55 +898,10 @@ fn run(self, builder: &Builder<'_>) -> u32 {
|
||
|
));
|
||
|
|
||
|
let mut cargo = builder.cargo(compiler, Mode::Rustc, SourceType::InTree, target, "build");
|
||
|
- rustc_cargo(builder, &mut cargo, target, compiler.stage);
|
||
|
+ rustc_cargo(builder, &mut cargo, target, &compiler);
|
||
|
|
||
|
- if builder.config.rust_profile_use.is_some()
|
||
|
- && builder.config.rust_profile_generate.is_some()
|
||
|
- {
|
||
|
- panic!("Cannot use and generate PGO profiles at the same time");
|
||
|
- }
|
||
|
-
|
||
|
- // With LLD, we can use ICF (identical code folding) to reduce the executable size
|
||
|
- // of librustc_driver/rustc and to improve i-cache utilization.
|
||
|
- //
|
||
|
- // -Wl,[link options] doesn't work on MSVC. However, /OPT:ICF (technically /OPT:REF,ICF)
|
||
|
- // is already on by default in MSVC optimized builds, which is interpreted as --icf=all:
|
||
|
- // https://github.com/llvm/llvm-project/blob/3329cec2f79185bafd678f310fafadba2a8c76d2/lld/COFF/Driver.cpp#L1746
|
||
|
- // https://github.com/rust-lang/rust/blob/f22819bcce4abaff7d1246a56eec493418f9f4ee/compiler/rustc_codegen_ssa/src/back/linker.rs#L827
|
||
|
- if builder.config.lld_mode.is_used() && !compiler.host.is_msvc() {
|
||
|
- cargo.rustflag("-Clink-args=-Wl,--icf=all");
|
||
|
- }
|
||
|
-
|
||
|
- let is_collecting = if let Some(path) = &builder.config.rust_profile_generate {
|
||
|
- if compiler.stage == 1 {
|
||
|
- cargo.rustflag(&format!("-Cprofile-generate={path}"));
|
||
|
- // Apparently necessary to avoid overflowing the counters during
|
||
|
- // a Cargo build profile
|
||
|
- cargo.rustflag("-Cllvm-args=-vp-counters-per-site=4");
|
||
|
- true
|
||
|
- } else {
|
||
|
- false
|
||
|
- }
|
||
|
- } else if let Some(path) = &builder.config.rust_profile_use {
|
||
|
- if compiler.stage == 1 {
|
||
|
- cargo.rustflag(&format!("-Cprofile-use={path}"));
|
||
|
- if builder.is_verbose() {
|
||
|
- cargo.rustflag("-Cllvm-args=-pgo-warn-missing-function");
|
||
|
- }
|
||
|
- true
|
||
|
- } else {
|
||
|
- false
|
||
|
- }
|
||
|
- } else {
|
||
|
- false
|
||
|
- };
|
||
|
- if is_collecting {
|
||
|
- // Ensure paths to Rust sources are relative, not absolute.
|
||
|
- cargo.rustflag(&format!(
|
||
|
- "-Cllvm-args=-static-func-strip-dirname-prefix={}",
|
||
|
- builder.config.src.components().count()
|
||
|
- ));
|
||
|
- }
|
||
|
+ // NB: all RUSTFLAGS should be added to `rustc_cargo()` so they will be
|
||
|
+ // consistently applied by check/doc/test modes too.
|
||
|
|
||
|
for krate in &*self.crates {
|
||
|
cargo.arg("-p").arg(krate);
|
||
|
@@ -997,7 +952,12 @@ fn run(self, builder: &Builder<'_>) -> u32 {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
-pub fn rustc_cargo(builder: &Builder<'_>, cargo: &mut Cargo, target: TargetSelection, stage: u32) {
|
||
|
+pub fn rustc_cargo(
|
||
|
+ builder: &Builder<'_>,
|
||
|
+ cargo: &mut Cargo,
|
||
|
+ target: TargetSelection,
|
||
|
+ compiler: &Compiler,
|
||
|
+) {
|
||
|
cargo
|
||
|
.arg("--features")
|
||
|
.arg(builder.rustc_features(builder.kind))
|
||
|
@@ -1008,7 +968,7 @@ pub fn rustc_cargo(builder: &Builder<'_>, cargo: &mut Cargo, target: TargetSelec
|
||
|
|
||
|
// We currently don't support cross-crate LTO in stage0. This also isn't hugely necessary
|
||
|
// and may just be a time sink.
|
||
|
- if stage != 0 {
|
||
|
+ if compiler.stage != 0 {
|
||
|
match builder.config.rust_lto {
|
||
|
RustcLto::Thin | RustcLto::Fat => {
|
||
|
// Since using LTO for optimizing dylibs is currently experimental,
|
||
|
@@ -1034,7 +994,52 @@ pub fn rustc_cargo(builder: &Builder<'_>, cargo: &mut Cargo, target: TargetSelec
|
||
|
cargo.rustflag("-Clto=off");
|
||
|
}
|
||
|
|
||
|
- rustc_cargo_env(builder, cargo, target, stage);
|
||
|
+ // With LLD, we can use ICF (identical code folding) to reduce the executable size
|
||
|
+ // of librustc_driver/rustc and to improve i-cache utilization.
|
||
|
+ //
|
||
|
+ // -Wl,[link options] doesn't work on MSVC. However, /OPT:ICF (technically /OPT:REF,ICF)
|
||
|
+ // is already on by default in MSVC optimized builds, which is interpreted as --icf=all:
|
||
|
+ // https://github.com/llvm/llvm-project/blob/3329cec2f79185bafd678f310fafadba2a8c76d2/lld/COFF/Driver.cpp#L1746
|
||
|
+ // https://github.com/rust-lang/rust/blob/f22819bcce4abaff7d1246a56eec493418f9f4ee/compiler/rustc_codegen_ssa/src/back/linker.rs#L827
|
||
|
+ if builder.config.lld_mode.is_used() && !compiler.host.is_msvc() {
|
||
|
+ cargo.rustflag("-Clink-args=-Wl,--icf=all");
|
||
|
+ }
|
||
|
+
|
||
|
+ if builder.config.rust_profile_use.is_some() && builder.config.rust_profile_generate.is_some() {
|
||
|
+ panic!("Cannot use and generate PGO profiles at the same time");
|
||
|
+ }
|
||
|
+ let is_collecting = if let Some(path) = &builder.config.rust_profile_generate {
|
||
|
+ if compiler.stage == 1 {
|
||
|
+ cargo.rustflag(&format!("-Cprofile-generate={path}"));
|
||
|
+ // Apparently necessary to avoid overflowing the counters during
|
||
|
+ // a Cargo build profile
|
||
|
+ cargo.rustflag("-Cllvm-args=-vp-counters-per-site=4");
|
||
|
+ true
|
||
|
+ } else {
|
||
|
+ false
|
||
|
+ }
|
||
|
+ } else if let Some(path) = &builder.config.rust_profile_use {
|
||
|
+ if compiler.stage == 1 {
|
||
|
+ cargo.rustflag(&format!("-Cprofile-use={path}"));
|
||
|
+ if builder.is_verbose() {
|
||
|
+ cargo.rustflag("-Cllvm-args=-pgo-warn-missing-function");
|
||
|
+ }
|
||
|
+ true
|
||
|
+ } else {
|
||
|
+ false
|
||
|
+ }
|
||
|
+ } else {
|
||
|
+ false
|
||
|
+ };
|
||
|
+ if is_collecting {
|
||
|
+ // Ensure paths to Rust sources are relative, not absolute.
|
||
|
+ cargo.rustflag(&format!(
|
||
|
+ "-Cllvm-args=-static-func-strip-dirname-prefix={}",
|
||
|
+ builder.config.src.components().count()
|
||
|
+ ));
|
||
|
+ }
|
||
|
+
|
||
|
+ rustc_cargo_env(builder, cargo, target, compiler.stage);
|
||
|
}
|
||
|
|
||
|
pub fn rustc_cargo_env(
|
||
|
diff --git a/src/bootstrap/src/core/build_steps/doc.rs b/src/bootstrap/src/core/build_steps/doc.rs
|
||
|
index 57e63927c95e..e10035f07c05 100644
|
||
|
--- a/src/bootstrap/src/core/build_steps/doc.rs
|
||
|
+++ b/src/bootstrap/src/core/build_steps/doc.rs
|
||
|
@@ -794,7 +794,7 @@ fn run(self, builder: &Builder<'_>) {
|
||
|
cargo.rustdocflag("-Znormalize-docs");
|
||
|
cargo.rustdocflag("--show-type-layout");
|
||
|
cargo.rustdocflag("--generate-link-to-definition");
|
||
|
- compile::rustc_cargo(builder, &mut cargo, target, compiler.stage);
|
||
|
+ compile::rustc_cargo(builder, &mut cargo, target, &compiler);
|
||
|
cargo.arg("-Zunstable-options");
|
||
|
cargo.arg("-Zskip-rustdoc-fingerprint");
|
||
|
|
||
|
diff --git a/src/bootstrap/src/core/build_steps/test.rs b/src/bootstrap/src/core/build_steps/test.rs
|
||
|
index 04728e2e00dc..c4fdda0a2606 100644
|
||
|
--- a/src/bootstrap/src/core/build_steps/test.rs
|
||
|
+++ b/src/bootstrap/src/core/build_steps/test.rs
|
||
|
@@ -2558,7 +2558,7 @@ fn run(self, builder: &Builder<'_>) {
|
||
|
}
|
||
|
}
|
||
|
Mode::Rustc => {
|
||
|
- compile::rustc_cargo(builder, &mut cargo, target, compiler.stage);
|
||
|
+ compile::rustc_cargo(builder, &mut cargo, target, &compiler);
|
||
|
}
|
||
|
_ => panic!("can only test libraries"),
|
||
|
};
|
||
|
--
|
||
|
2.44.0
|
||
|
|