Rollup merge of #143898 - ognevny:opt-dist-rustc-rebuild, r=Kobzol

opt-dist: rebuild rustc when doing static LLVM builds

when building LLVM it's obvious that in case of shared build rustc doesn't need to be recompiled, but with static builds it would be better to compile rustc again to ensure we linked proper library.
maybe I didn't understand the pipeline correctly, but it was strange for me to see that in Stage 5 LLVM is built while rustc is not

r? ```@Kobzol```

try-job: dist-x86_64-msvc
try-job: dist-x86_64-linux
This commit is contained in:
Samuel Tardieu 2025-08-23 22:22:14 +02:00 committed by GitHub
commit f5210f2ba0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 14 additions and 2 deletions

View file

@ -189,6 +189,12 @@ impl Bootstrap {
self
}
/// Rebuild rustc in case of statically linked LLVM
pub fn rustc_rebuild(mut self) -> Self {
self.cmd = self.cmd.arg("--keep-stage").arg("0");
self
}
pub fn run(self, timer: &mut TimerSection) -> anyhow::Result<()> {
self.cmd.run()?;
let metrics = load_metrics(&self.metrics_path)?;

View file

@ -375,8 +375,14 @@ fn execute_pipeline(
let mut dist = Bootstrap::dist(env, &dist_args)
.llvm_pgo_optimize(llvm_pgo_profile.as_ref())
.rustc_pgo_optimize(&rustc_pgo_profile)
.avoid_rustc_rebuild();
.rustc_pgo_optimize(&rustc_pgo_profile);
// if LLVM is not built we'll have PGO optimized rustc
dist = if env.supports_shared_llvm() || !env.build_llvm() {
dist.avoid_rustc_rebuild()
} else {
dist.rustc_rebuild()
};
for bolt_profile in bolt_profiles {
dist = dist.with_bolt_profile(bolt_profile);