@@ -4,9 +4,13 @@ set -euxo pipefail
44
55rm -rf /tmp/rustc-pgo
66
7+ # We collect LLVM profiling information and rustc profiling information in
8+ # separate phases. This increases build time -- though not by a huge amount --
9+ # but prevents any problems from arising due to different profiling runtimes
10+ # being simultaneously linked in.
11+
712python3 ../x.py build --target=$PGO_HOST --host=$PGO_HOST \
813 --stage 2 library/std \
9- --rust-profile-generate=/tmp/rustc-pgo \
1014 --llvm-profile-generate
1115
1216# Profile libcore compilation in opt-level=0 and opt-level=3
@@ -15,6 +19,29 @@ RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc --edition=2018 \
1519RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST /stage2/bin/rustc --edition=2018 \
1620 --crate-type=lib -Copt-level=3 ../library/core/src/lib.rs
1721
22+ # Merge the profile data we gathered for LLVM
23+ # Note that this uses the profdata from the clang we used to build LLVM,
24+ # which likely has a different version than our in-tree clang.
25+ /rustroot/bin/llvm-profdata \
26+ merge -o /tmp/llvm-pgo.profdata ./build/$PGO_HOST /llvm/build/profiles
27+
28+ # Rustbuild currently doesn't support rebuilding LLVM when PGO options
29+ # change (or any other llvm-related options); so just clear out the relevant
30+ # directories ourselves.
31+ rm -r ./build/$PGO_HOST /llvm ./build/$PGO_HOST /lld
32+
33+ # Okay, LLVM profiling is done, switch to rustc PGO.
34+
35+ python3 ../x.py build --target=$PGO_HOST --host=$PGO_HOST \
36+ --stage 2 library/std \
37+ --rust-profile-generate=/tmp/rustc-pgo
38+
39+ # Profile libcore compilation in opt-level=0 and opt-level=3
40+ RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST /stage2/bin/rustc --edition=2018 \
41+ --crate-type=lib ../library/core/src/lib.rs
42+ RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST /stage2/bin/rustc --edition=2018 \
43+ --crate-type=lib -Copt-level=3 ../library/core/src/lib.rs
44+
1845cp -r /tmp/rustc-perf ./
1946chown -R $( whoami) : ./rustc-perf
2047cd rustc-perf
@@ -46,18 +73,13 @@ cd /checkout/obj
4673./build/$PGO_HOST /llvm/bin/llvm-profdata \
4774 merge -o /tmp/rustc-pgo.profdata /tmp/rustc-pgo
4875
49- # Merge the profile data we gathered for LLVM
50- # Note that this uses the profdata from the clang we used to build LLVM,
51- # which likely has a different version than our in-tree clang.
52- /rustroot/bin/llvm-profdata \
53- merge -o /tmp/llvm-pgo.profdata ./build/$PGO_HOST /llvm/build/profiles
54-
5576# Rustbuild currently doesn't support rebuilding LLVM when PGO options
5677# change (or any other llvm-related options); so just clear out the relevant
5778# directories ourselves.
5879rm -r ./build/$PGO_HOST /llvm ./build/$PGO_HOST /lld
5980
60- # This produces the actual final set of artifacts.
81+ # This produces the actual final set of artifacts, using both the LLVM and rustc
82+ # collected profiling data.
6183$@ \
6284 --rust-profile-use=/tmp/rustc-pgo.profdata \
6385 --llvm-profile-use=/tmp/llvm-pgo.profdata
0 commit comments