set -euxo pipefail
+# Compile several crates to gather execution PGO profiles.
+# Arg0 => builds (Debug, Opt)
+# Arg1 => runs (Full, IncrFull, All)
+# Arg2 => crates (syn, cargo, ...)
+gather_profiles () {
+ cd /checkout/obj
+
+ # Compile libcore, both in opt-level=0 and opt-level=3
+ RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc \
+ --edition=2021 --crate-type=lib ../library/core/src/lib.rs
+ RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc \
+ --edition=2021 --crate-type=lib -Copt-level=3 ../library/core/src/lib.rs
+
+ cd rustc-perf
+
+ # Run rustc-perf benchmarks
+ # Benchmark using profile_local with eprintln, which essentially just means
+ # don't actually benchmark -- just make sure we run rustc a bunch of times.
+ RUST_LOG=collector=debug \
+ RUSTC=/checkout/obj/build/$PGO_HOST/stage0/bin/rustc \
+ RUSTC_BOOTSTRAP=1 \
+ /checkout/obj/build/$PGO_HOST/stage0/bin/cargo run -p collector --bin collector -- \
+ profile_local \
+ eprintln \
+ /checkout/obj/build/$PGO_HOST/stage2/bin/rustc \
+ Test \
+ --builds $1 \
+ --cargo /checkout/obj/build/$PGO_HOST/stage0/bin/cargo \
+ --runs $2 \
+ --include $3
+
+ cd /checkout/obj
+}
+
rm -rf /tmp/rustc-pgo
# We collect LLVM profiling information and rustc profiling information in
RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc \
--edition=2021 --crate-type=lib -Copt-level=3 ../library/core/src/lib.rs
+# Compile rustc perf
+cp -r /tmp/rustc-perf ./
+chown -R $(whoami): ./rustc-perf
+cd rustc-perf
+
+# Build the collector ahead of time, which is needed to make sure the rustc-fake
+# binary used by the collector is present.
+RUSTC=/checkout/obj/build/$PGO_HOST/stage0/bin/rustc \
+RUSTC_BOOTSTRAP=1 \
+/checkout/obj/build/$PGO_HOST/stage0/bin/cargo build -p collector
+
+gather_profiles "Debug,Opt" "Full" "syn,cargo,serde,ripgrep,regex,clap-rs,hyper-2"
+
# Merge the profile data we gathered for LLVM
# Note that this uses the profdata from the clang we used to build LLVM,
# which likely has a different version than our in-tree clang.
--stage 2 library/std \
--rust-profile-generate=/tmp/rustc-pgo
-# Profile libcore compilation in opt-level=0 and opt-level=3
-RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc \
- --edition=2021 --crate-type=lib ../library/core/src/lib.rs
-RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc \
- --edition=2021 --crate-type=lib -Copt-level=3 ../library/core/src/lib.rs
-
-cp -r /tmp/rustc-perf ./
-chown -R $(whoami): ./rustc-perf
-cd rustc-perf
-
-# Build the collector ahead of time, which is needed to make sure the rustc-fake
-# binary used by the collector is present.
-RUSTC=/checkout/obj/build/$PGO_HOST/stage0/bin/rustc \
-RUSTC_BOOTSTRAP=1 \
-/checkout/obj/build/$PGO_HOST/stage0/bin/cargo build -p collector
-
-# benchmark using profile_local with eprintln, which essentially just means
-# don't actually benchmark -- just make sure we run rustc a bunch of times.
-RUST_LOG=collector=debug \
-RUSTC=/checkout/obj/build/$PGO_HOST/stage0/bin/rustc \
-RUSTC_BOOTSTRAP=1 \
-/checkout/obj/build/$PGO_HOST/stage0/bin/cargo run -p collector --bin collector -- \
- profile_local \
- eprintln \
- /checkout/obj/build/$PGO_HOST/stage2/bin/rustc \
- Test \
- --builds Check,Debug,Opt \
- --cargo /checkout/obj/build/$PGO_HOST/stage0/bin/cargo \
- --runs All \
- --include externs,ctfe-stress-4,inflate,cargo,token-stream-stress,match-stress-enum
-
-cd /checkout/obj
+gather_profiles "Check,Debug,Opt" "All" \
+ "externs,ctfe-stress-4,inflate,cargo,token-stream-stress,match-stress-enum"
# Merge the profile data we gathered
./build/$PGO_HOST/llvm/bin/llvm-profdata \