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