|  | # 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" ] | 
|  | } | 
|  | } |