about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMaksim Bondarenkov <maksapple2306@gmail.com>2025-07-19 14:19:54 +0300
committerMaksim Bondarenkov <maksapple2306@gmail.com>2025-07-19 14:19:54 +0300
commit6e002317cec5fa0c55a88307f839f2b5fb31922c (patch)
tree38fc4086b58830eee39426bece7096e8b098f6dd
parent1079c5edb2bd837e5c4cf8c7db2892db359a3862 (diff)
downloadrust-6e002317cec5fa0c55a88307f839f2b5fb31922c.tar.gz
rust-6e002317cec5fa0c55a88307f839f2b5fb31922c.zip
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
-rw-r--r--src/tools/opt-dist/src/exec.rs6
-rw-r--r--src/tools/opt-dist/src/main.rs10
2 files changed, 14 insertions, 2 deletions
diff --git a/src/tools/opt-dist/src/exec.rs b/src/tools/opt-dist/src/exec.rs
index 56eff2ca2a7..e5a037dc4e9 100644
--- a/src/tools/opt-dist/src/exec.rs
+++ b/src/tools/opt-dist/src/exec.rs
@@ -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)?;
diff --git a/src/tools/opt-dist/src/main.rs b/src/tools/opt-dist/src/main.rs
index 7857f196626..8dc77883612 100644
--- a/src/tools/opt-dist/src/main.rs
+++ b/src/tools/opt-dist/src/main.rs
@@ -363,8 +363,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);