Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2973)

Unified Diff: build/config/compiler/pgo/BUILD.gn

Issue 2507333002: Add the possibility to build with PGO when using Clang (Closed)
Patch Set: Add the possibility to build with PGO when using Clang Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « build/config/compiler/compiler.gni ('k') | build/config/compiler/pgo/pgo.gni » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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" ]
+ }
+}
« no previous file with comments | « build/config/compiler/compiler.gni ('k') | build/config/compiler/pgo/pgo.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698