# Copyright 2023 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/compiler/compiler.gni")
import("//build/config/compiler/pgo/pgo.gni")

declare_args() {
  # Whether to compile support for Allocation Stack Trace Recorder.
  #
  # The recorder is initially intended as a support tool for Arm's
  # Memory Tagging Extensions. A history of the most recent allocations and
  # frees is included in the crashpad report and gives developers information
  # where the memory which was invalidly accessed was allocated or freed.
  #
  # Although it should work on other platforms as well, for the above reasons,
  # we currently enable it only for Android when compiling for Arm64.
  build_allocation_stack_trace_recorder = current_cpu == "arm64" && is_android
}

declare_args() {
  # If enabled, the recorder gathers some additional information, i.e. number of
  # collisions of slots, and prints these periodically.
  #
  # Since this might impact performance negatively, it's disabled by default.
  # Even if it's disabled we still collect some data, i.e. total number of
  # allocations. All other data will be set to a default value.
  build_allocation_trace_recorder_full_reporting = false
}

declare_args() {
  # If enabled, clang produces an extremely verbose amount of warnings about
  # places in the code where CHECKS() (typically performance-sensitive bounds
  # checks) could not be elided by the optimizer. Useful for hunting down a
  # performance-regression when moving to safer types.
  enable_check_elision_warning = false
}

assert(!(build_allocation_stack_trace_recorder && is_fuchsia),
       "Stack trace recording is not supported on Fuchsia due to missing" +
           " Crashpad!")

assert(!(build_allocation_stack_trace_recorder && is_linux),
       "WARNING: Stack trace recording is not supported on Linux due to" +
           " performance issues computing stack trace!")

assert(
    build_allocation_stack_trace_recorder ||
        !build_allocation_trace_recorder_full_reporting,
    "Report for stack trace recorder is enabled, but the recorder is disabled!")

assert(!enable_check_elision_warning || !is_debug,
       "Check elision warning requires an optimized build!")
