[llvm] d299c03 - [gn build] Make it possible to do PGO-optimized builds
Nico Weber via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 11 15:39:52 PDT 2022
Author: Nico Weber
Date: 2022-08-11T18:39:46-04:00
New Revision: d299c033e6b9c404a6fa8a8d194cecbfb2b77266
URL: https://github.com/llvm/llvm-project/commit/d299c033e6b9c404a6fa8a8d194cecbfb2b77266
DIFF: https://github.com/llvm/llvm-project/commit/d299c033e6b9c404a6fa8a8d194cecbfb2b77266.diff
LOG: [gn build] Make it possible to do PGO-optimized builds
This is fairly manual for now.
Differential Revision: https://reviews.llvm.org/D131710
Added:
Modified:
llvm/utils/gn/build/BUILD.gn
Removed:
################################################################################
diff --git a/llvm/utils/gn/build/BUILD.gn b/llvm/utils/gn/build/BUILD.gn
index ee8a83c946a3e..522f54f734da5 100644
--- a/llvm/utils/gn/build/BUILD.gn
+++ b/llvm/utils/gn/build/BUILD.gn
@@ -5,7 +5,7 @@ import("//llvm/utils/gn/build/toolchain/compiler.gni")
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 @@ declare_args() {
# 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 *.profraw`
+ # 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 @@ declare_args() {
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 @@ config("compiler_defaults") {
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
More information about the llvm-commits
mailing list