Skip to content

Commit 9295c2f

Browse files
committed
opt-dist: make llvm builds optional
adds command line option for disabling llvm builds. it's useful in case of user having their own optimized LLVM, so they won't waste time for (at least) 3 LLVM builds. in this case PGO optimized will be already built in Stage 1, so my previous PR should be addressed for this change
1 parent d2baa49 commit 9295c2f

File tree

4 files changed

+46
-24
lines changed

4 files changed

+46
-24
lines changed

src/tools/opt-dist/src/environment.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ pub struct Environment {
2727
shared_llvm: bool,
2828
run_tests: bool,
2929
fast_try_build: bool,
30+
build_llvm: bool,
3031
}
3132

3233
impl Environment {
@@ -111,6 +112,10 @@ impl Environment {
111112
pub fn is_fast_try_build(&self) -> bool {
112113
self.fast_try_build
113114
}
115+
116+
pub fn build_llvm(&self) -> bool {
117+
self.build_llvm
118+
}
114119
}
115120

116121
/// What is the extension of binary executables on this platform?

src/tools/opt-dist/src/exec.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,10 @@ impl Bootstrap {
139139
self
140140
}
141141

142-
pub fn llvm_pgo_optimize(mut self, profile: &LlvmPGOProfile) -> Self {
143-
self.cmd = self.cmd.arg("--llvm-profile-use").arg(profile.0.as_str());
142+
pub fn llvm_pgo_optimize(mut self, profile: Option<&LlvmPGOProfile>) -> Self {
143+
if let Some(prof) = profile {
144+
self.cmd = self.cmd.arg("--llvm-profile-use").arg(prof.0.as_str());
145+
}
144146
self
145147
}
146148

src/tools/opt-dist/src/main.rs

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ enum EnvironmentCmd {
9898
/// Perform tests after final build if it's not a fast try build
9999
#[arg(long)]
100100
run_tests: bool,
101+
102+
/// Will be LLVM built during the run?
103+
#[arg(long, default_value_t = true, action(clap::ArgAction::Set))]
104+
build_llvm: bool,
101105
},
102106
/// Perform an optimized build on Linux CI, from inside Docker.
103107
LinuxCi {
@@ -133,6 +137,7 @@ fn create_environment(args: Args) -> anyhow::Result<(Environment, Vec<String>)>
133137
benchmark_cargo_config,
134138
shared,
135139
run_tests,
140+
build_llvm,
136141
} => {
137142
let env = EnvironmentBuilder::default()
138143
.host_tuple(target_triple)
@@ -148,6 +153,7 @@ fn create_environment(args: Args) -> anyhow::Result<(Environment, Vec<String>)>
148153
.benchmark_cargo_config(benchmark_cargo_config)
149154
.run_tests(run_tests)
150155
.fast_try_build(is_fast_try_build)
156+
.build_llvm(build_llvm)
151157
.build()?;
152158

153159
(env, shared.build_args)
@@ -172,6 +178,7 @@ fn create_environment(args: Args) -> anyhow::Result<(Environment, Vec<String>)>
172178
.skipped_tests(vec![])
173179
.run_tests(true)
174180
.fast_try_build(is_fast_try_build)
181+
.build_llvm(true)
175182
.build()?;
176183

177184
(env, shared.build_args)
@@ -193,6 +200,7 @@ fn create_environment(args: Args) -> anyhow::Result<(Environment, Vec<String>)>
193200
.skipped_tests(vec![])
194201
.run_tests(true)
195202
.fast_try_build(is_fast_try_build)
203+
.build_llvm(true)
196204
.build()?;
197205

198206
(env, shared.build_args)
@@ -255,32 +263,37 @@ fn execute_pipeline(
255263
// Stage 2: Gather LLVM PGO profiles
256264
// Here we build a PGO instrumented LLVM, reusing the previously PGO optimized rustc.
257265
// Then we use the instrumented LLVM to gather LLVM PGO profiles.
258-
let llvm_pgo_profile = timer.section("Stage 2 (LLVM PGO)", |stage| {
259-
// Remove the previous, uninstrumented build of LLVM.
260-
clear_llvm_files(env)?;
266+
let llvm_pgo_profile = if env.build_llvm() {
267+
timer.section("Stage 2 (LLVM PGO)", |stage| {
268+
// Remove the previous, uninstrumented build of LLVM.
269+
clear_llvm_files(env)?;
261270

262-
let llvm_profile_dir_root = env.artifact_dir().join("llvm-pgo");
271+
let llvm_profile_dir_root = env.artifact_dir().join("llvm-pgo");
263272

264-
stage.section("Build PGO instrumented LLVM", |section| {
265-
Bootstrap::build(env)
266-
.llvm_pgo_instrument(&llvm_profile_dir_root)
267-
.avoid_rustc_rebuild()
268-
.run(section)
269-
})?;
273+
stage.section("Build PGO instrumented LLVM", |section| {
274+
Bootstrap::build(env)
275+
.llvm_pgo_instrument(&llvm_profile_dir_root)
276+
.avoid_rustc_rebuild()
277+
.run(section)
278+
})?;
270279

271-
let profile = stage
272-
.section("Gather profiles", |_| gather_llvm_profiles(env, &llvm_profile_dir_root))?;
280+
let profile = stage.section("Gather profiles", |_| {
281+
gather_llvm_profiles(env, &llvm_profile_dir_root)
282+
})?;
273283

274-
print_free_disk_space()?;
284+
print_free_disk_space()?;
275285

276-
// Proactively delete the instrumented artifacts, to avoid using them by accident in
277-
// follow-up stages.
278-
clear_llvm_files(env)?;
286+
// Proactively delete the instrumented artifacts, to avoid using them by accident in
287+
// follow-up stages.
288+
clear_llvm_files(env)?;
279289

280-
Ok(profile)
281-
})?;
290+
Ok(Some(profile))
291+
})?
292+
} else {
293+
None
294+
};
282295

283-
let bolt_profiles = if env.use_bolt() {
296+
let bolt_profiles = if env.build_llvm() && env.use_bolt() {
284297
// Stage 3: Build BOLT instrumented LLVM
285298
// We build a PGO optimized LLVM in this step, then instrument it with BOLT and gather BOLT profiles.
286299
// Note that we don't remove LLVM artifacts after this step, so that they are reused in the final dist build.
@@ -290,7 +303,7 @@ fn execute_pipeline(
290303
stage.section("Build PGO optimized LLVM", |stage| {
291304
Bootstrap::build(env)
292305
.with_llvm_bolt_ldflags()
293-
.llvm_pgo_optimize(&llvm_pgo_profile)
306+
.llvm_pgo_optimize(llvm_pgo_profile.as_ref())
294307
.avoid_rustc_rebuild()
295308
.run(stage)
296309
})?;
@@ -342,7 +355,7 @@ fn execute_pipeline(
342355
};
343356

344357
let mut dist = Bootstrap::dist(env, &dist_args)
345-
.llvm_pgo_optimize(&llvm_pgo_profile)
358+
.llvm_pgo_optimize(llvm_pgo_profile.as_ref())
346359
.rustc_pgo_optimize(&rustc_pgo_profile)
347360
.avoid_rustc_rebuild();
348361

src/tools/opt-dist/src/training.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,9 @@ pub fn gather_rustc_profiles(
163163
let merged_profile = env.artifact_dir().join("rustc-pgo.profdata");
164164
log::info!("Merging Rustc PGO profiles to {merged_profile}");
165165

166-
merge_llvm_profiles(env, &merged_profile, profile_root, LlvmProfdata::Target)?;
166+
let llvm_profdata = if env.build_llvm() { LlvmProfdata::Target } else { LlvmProfdata::Host };
167+
168+
merge_llvm_profiles(env, &merged_profile, profile_root, llvm_profdata)?;
167169
log_profile_stats("Rustc", &merged_profile, profile_root)?;
168170

169171
// We don't need the individual .profraw files now that they have been merged

0 commit comments

Comments
 (0)