Skip to content

Commit d4b119a

Browse files
committed
WIP: Add PGO for apple darwin targets
1 parent 0f73f0f commit d4b119a

File tree

3 files changed

+42
-9
lines changed

3 files changed

+42
-9
lines changed

src/bootstrap/src/core/build_steps/compile.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,12 +1388,19 @@ fn rustc_llvm_env(builder: &Builder<'_>, cargo: &mut Cargo, target: TargetSelect
13881388
// found. This is to avoid the linker errors about undefined references to
13891389
// `__llvm_profile_instrument_memop` when linking `rustc_driver`.
13901390
let mut llvm_linker_flags = String::new();
1391-
if builder.config.llvm_profile_generate && target.is_msvc() {
1392-
if let Some(ref clang_cl_path) = builder.config.llvm_clang_cl {
1393-
// Add clang's runtime library directory to the search path
1394-
let clang_rt_dir = get_clang_cl_resource_dir(builder, clang_cl_path);
1395-
llvm_linker_flags.push_str(&format!("-L{}", clang_rt_dir.display()));
1391+
if builder.config.llvm_profile_generate {
1392+
if target.is_msvc() {
1393+
if let Some(ref clang_cl_path) = builder.config.llvm_clang_cl {
1394+
// Add clang's runtime library directory to the search path
1395+
let clang_rt_dir = get_clang_cl_resource_dir(builder, clang_cl_path);
1396+
llvm_linker_flags.push_str(&format!("-L{}", clang_rt_dir.display()));
1397+
}
1398+
} else {
1399+
1400+
llvm_linker_flags.push_str("-L/opt/homebrew/Cellar/llvm/20.1.2/lib/clang/20/lib/darwin/lib -lclang_rt.profile_osx");
1401+
13961402
}
1403+
13971404
}
13981405

13991406
// The config can also specify its own llvm linker flags.

src/ci/github-actions/jobs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ auto:
425425

426426
- name: dist-aarch64-apple
427427
env:
428-
SCRIPT: ./x.py dist bootstrap --include-default-paths --host=aarch64-apple-darwin --target=aarch64-apple-darwin
428+
SCRIPT: ./x.py build --set rust.debug=true opt-dist && PGO_HOST=aarch64-apple-darwin ./build/aarch64-apple-darwin/stage0-tools-bin/opt-dist mac-ci -- python3 x.py dist bootstrap --include-default-paths
429429
RUST_CONFIGURE_ARGS: >-
430430
--enable-full-tools
431431
--enable-sanitizers

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

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ enum EnvironmentCmd {
109109
#[clap(flatten)]
110110
shared: SharedArgs,
111111
},
112+
MacCi {
113+
#[clap(flatten)]
114+
shared: SharedArgs,
115+
}
112116
}
113117

114118
fn is_try_build() -> bool {
@@ -191,6 +195,26 @@ fn create_environment(args: Args) -> anyhow::Result<(Environment, Vec<String>)>
191195

192196
(env, shared.build_args)
193197
}
198+
EnvironmentCmd::MacCi { shared } => {
199+
let target_triple =
200+
std::env::var("PGO_HOST").expect("PGO_HOST environment variable missing");
201+
202+
let checkout_dir: Utf8PathBuf = std::env::current_dir()?.try_into()?;
203+
let env = EnvironmentBuilder::default()
204+
.host_tuple(target_triple)
205+
.python_binary("python3".to_string())
206+
.checkout_dir(checkout_dir.clone())
207+
.host_llvm_dir("/opt/homebrew/Cellar/llvm/20.1.2".into())
208+
.artifact_dir(checkout_dir.join("opt-artifacts"))
209+
.build_dir(checkout_dir)
210+
.shared_llvm(false)
211+
.use_bolt(false)
212+
.run_tests(false)
213+
.skipped_tests(vec![])
214+
.build()?;
215+
216+
(env, shared.build_args)
217+
}
194218
};
195219
Ok((env, args))
196220
}
@@ -250,6 +274,9 @@ fn execute_pipeline(
250274
// Here we build a PGO instrumented LLVM, reusing the previously PGO optimized rustc.
251275
// Then we use the instrumented LLVM to gather LLVM PGO profiles.
252276
let llvm_pgo_profile = timer.section("Stage 2 (LLVM PGO)", |stage| {
277+
if 1 + 1 == 2 {
278+
return Err(anyhow::anyhow!("disabled"));
279+
}
253280
// Remove the previous, uninstrumented build of LLVM.
254281
clear_llvm_files(env)?;
255282

@@ -272,7 +299,7 @@ fn execute_pipeline(
272299
clear_llvm_files(env)?;
273300

274301
Ok(profile)
275-
})?;
302+
});
276303

277304
let bolt_profiles = if env.use_bolt() {
278305
// Stage 3: Build BOLT instrumented LLVM
@@ -284,7 +311,7 @@ fn execute_pipeline(
284311
stage.section("Build PGO optimized LLVM", |stage| {
285312
Bootstrap::build(env)
286313
.with_llvm_bolt_ldflags()
287-
.llvm_pgo_optimize(&llvm_pgo_profile)
314+
.llvm_pgo_optimize(&llvm_pgo_profile?)
288315
.avoid_rustc_rebuild()
289316
.run(stage)
290317
})?;
@@ -336,7 +363,6 @@ fn execute_pipeline(
336363
};
337364

338365
let mut dist = Bootstrap::dist(env, &dist_args)
339-
.llvm_pgo_optimize(&llvm_pgo_profile)
340366
.rustc_pgo_optimize(&rustc_pgo_profile)
341367
.avoid_rustc_rebuild();
342368

0 commit comments

Comments
 (0)