@@ -4,9 +4,13 @@ set -euxo pipefail
4
4
5
5
rm -rf /tmp/rustc-pgo
6
6
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
+
7
12
python3 ../x.py build --target=$PGO_HOST --host=$PGO_HOST \
8
13
--stage 2 library/std \
9
- --rust-profile-generate=/tmp/rustc-pgo \
10
14
--llvm-profile-generate
11
15
12
16
# 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 \
15
19
RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST /stage2/bin/rustc --edition=2018 \
16
20
--crate-type=lib -Copt-level=3 ../library/core/src/lib.rs
17
21
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
+
18
45
cp -r /tmp/rustc-perf ./
19
46
chown -R $( whoami) : ./rustc-perf
20
47
cd rustc-perf
@@ -46,18 +73,13 @@ cd /checkout/obj
46
73
./build/$PGO_HOST /llvm/bin/llvm-profdata \
47
74
merge -o /tmp/rustc-pgo.profdata /tmp/rustc-pgo
48
75
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
-
55
76
# Rustbuild currently doesn't support rebuilding LLVM when PGO options
56
77
# change (or any other llvm-related options); so just clear out the relevant
57
78
# directories ourselves.
58
79
rm -r ./build/$PGO_HOST /llvm ./build/$PGO_HOST /lld
59
80
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.
61
83
$@ \
62
84
--rust-profile-use=/tmp/rustc-pgo.profdata \
63
85
--llvm-profile-use=/tmp/llvm-pgo.profdata
0 commit comments