Index: build/config/compiler/pgo/BUILD.gn |
diff --git a/build/config/compiler/pgo/BUILD.gn b/build/config/compiler/pgo/BUILD.gn |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bb147a6eccab0c55a4da321ec39fb2cceff6ab25 |
--- /dev/null |
+++ b/build/config/compiler/pgo/BUILD.gn |
@@ -0,0 +1,101 @@ |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import("//build/config/clang/clang.gni") |
+import("//build/config/compiler/compiler.gni") |
+import("//build/config/compiler/pgo/pgo.gni") |
+ |
+# Configuration that enables PGO instrumentation. |
+config("pgo_instrumentation_flags") { |
+ visibility = [ ":default_pgo_flags" ] |
+ cflags = [] |
+ ldflags = [] |
+ |
+ # Only add flags when chrome_pgo_phase == 1, so that variables we would use |
+ # are not required to be defined when we're not actually using PGO. |
+ if (chrome_pgo_phase == 1) { |
+ if (is_clang) { |
+ cflags = [ "-fprofile-instr-generate" ] |
+ if (is_win) { |
+ # Normally, we pass -fprofile-instr-generate to the compiler and it |
+ # automatically passes the right flags to the linker. |
+ # However, on Windows, we call the linker directly, without going |
+ # through the compiler driver. This means we need to pass the right |
+ # flags ourselves. |
+ _clang_rt_base_path = |
+ "$clang_base_path/lib/clang/$clang_version/lib/windows" |
+ if (target_cpu == "x86") { |
+ _clang_rt_suffix = "-i386.lib" |
+ } else if (target_cpu == "x64") { |
+ _clang_rt_suffix = "-x86_64.lib" |
+ } |
+ assert(_clang_rt_suffix != "", "target CPU $target_cpu not supported") |
+ ldflags += [ "$_clang_rt_base_path/clang_rt.profile$_clang_rt_suffix" ] |
+ } else { |
+ ldflags += [ "-fprofile-instr-generate" ] |
+ } |
+ } else if (is_win) { |
+ ldflags = [ |
+ # In MSVC, we must use /LTCG when using PGO. |
+ "/LTCG", |
+ |
+ # Make sure that enough memory gets allocated for the PGO profiling |
+ # buffers and also cap this memory. Usually a PGI instrumented build |
+ # of chrome_child.dll requires ~55MB of memory for storing its counter |
+ # etc, normally the linker should automatically choose an appropriate |
+ # amount of memory but it doesn't always do a good estimate and |
+ # sometime allocates too little or too much (and so the instrumented |
+ # image fails to start). Making sure that the buffer has a size in the |
+ # [128 MB, 512 MB] range should prevent this from happening. |
+ "/GENPROFILE:MEMMIN=134217728", |
+ "/GENPROFILE:MEMMAX=536870912", |
+ "/PogoSafeMode", |
+ ] |
+ } |
+ } |
+} |
+ |
+# Configuration that enables optimization using profile data. |
+config("pgo_optimization_flags") { |
+ visibility = [ ":default_pgo_flags" ] |
+ cflags = [] |
+ ldflags = [] |
+ |
+ # Only add flags when chrome_pgo_phase == 2, so that variables we would use |
+ # are not required to be defined when we're not actually using PGO. |
+ if (chrome_pgo_phase == 2) { |
+ if (is_clang) { |
+ assert(pgo_data_path != "", |
+ "Please set pgo_data_path to point at the profile data") |
+ cflags += [ |
+ "-fprofile-instr-use=$pgo_data_path", |
+ |
+ # It's possible to have some profile data legitimately missing, |
+ # and at least some profile data always ends up being considered |
+ # out of date, so make sure we don't error for those cases. |
+ "-Wno-profile-instr-unprofiled", |
+ "-Wno-error=profile-instr-out-of-date", |
+ ] |
+ } else if (is_win) { |
+ ldflags += [ |
+ # In MSVC, we must use /LTCG when using PGO. |
+ "/LTCG", |
+ "/USEPROFILE", |
+ ] |
+ } |
+ } |
+} |
+ |
+# Applies flags necessary when profile-guided optimization is used. |
+# Flags are only added if PGO is enabled, so that this config is safe to |
+# include by default. |
+config("default_pgo_flags") { |
+ if (chrome_pgo_phase == 0) { |
+ # Nothing. This config should be a no-op when chrome_pgo_phase == 0. |
+ } else if (chrome_pgo_phase == 1) { |
+ configs = [ ":pgo_instrumentation_flags" ] |
+ } else if (chrome_pgo_phase == 2) { |
+ configs = [ ":pgo_optimization_flags" ] |
+ } |
+} |