[PATCH] D131710: [gn build] Make it possible to do PGO-optimized builds
Nico Weber via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 11 12:11:21 PDT 2022
thakis created this revision.
thakis added a reviewer: aeubanks.
Herald added a subscriber: wenlei.
Herald added a project: All.
thakis requested review of this revision.
Herald added a project: LLVM.
This is fairly manual for now.
https://reviews.llvm.org/D131710
Files:
llvm/utils/gn/build/BUILD.gn
Index: llvm/utils/gn/build/BUILD.gn
===================================================================
--- llvm/utils/gn/build/BUILD.gn
+++ llvm/utils/gn/build/BUILD.gn
@@ -5,7 +5,7 @@
import("//llvm/utils/gn/build/toolchain/target_flags.gni")
declare_args() {
- # Whether to build everything with coverage information.
+ # Whether to build everything with test coverage information.
# After building with this, run tests and then run
# llvm/utils/prepare-code-coverage-artifact.py \
# --compilation-dir=out/gn \
@@ -14,6 +14,20 @@
# to generate a HTML report for the binaries passed in the last line.
llvm_build_instrumented_coverage = false
+ # Whether to build everything with instrumentation for PGO
+ # After building with this:
+ # 1. Remove old profile data with `rm *.profdata`
+ # 2. Run the built instrumented binaries.
+ # This will produce *.profraw files in the current working directory.
+ # 3. Run `llvm-profdata merge *.profraw -o llvm.profdata` to merge them.
+ # 4. Then build again, with this set to false, and with
+ # `llvm_pgo_use = "//llvm.profdata"` set to use the created profile.
+ llvm_pgo_instrument = false
+
+ # If non-empty, path to merged profiling data used for optimization
+ # See documentation for llvm_pgo_instrument for how to create profile data.
+ llvm_pgo_use = ""
+
# If set, puts relative paths in debug info.
# Makes the build output independent of the build directory, but makes
# most debuggers harder to use. See "Getting to local determinism" and
@@ -28,6 +42,12 @@
assert(!llvm_build_instrumented_coverage || is_clang,
"llvm_build_instrumented_coverage requires clang as host compiler")
+assert(!llvm_pgo_instrument || is_clang,
+ "llvm_pgo_instrument requires clang as host compiler")
+assert(llvm_pgo_use == "" || is_clang,
+ "llvm_pgo_use requires clang as host compiler")
+assert(!llvm_pgo_instrument || llvm_pgo_use == "",
+ "set at most one of llvm_pgo_instrument and llvm_pgo_use")
config("compiler_defaults") {
defines = []
@@ -272,6 +292,23 @@
ldflags += [ "-fprofile-instr-generate" ]
}
}
+ if (llvm_pgo_instrument) {
+ cflags += [ "-fprofile-generate" ]
+ if (current_os != "win") {
+ ldflags += [ "-fprofile-generate" ]
+ }
+ }
+ if (llvm_pgo_use != "") {
+ cflags += [
+ "-fprofile-use=" + rebase_path(llvm_pgo_use, root_build_dir),
+
+ # There are always quite a few diags like
+ # warning: foo.cpp: Function control flow change detected
+ # (hash mismatch) [-Wbackend-plugin]
+ # in a PGO build. Since they're not unexpected, silence them.
+ "-Wno-backend-plugin",
+ ]
+ }
# Deterministic build setup, see
# http://blog.llvm.org/2019/11/deterministic-builds-with-clang-and-lld.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D131710.451944.patch
Type: text/x-patch
Size: 2836 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220811/12cade99/attachment.bin>
More information about the llvm-commits
mailing list