# 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/sanitizers/sanitizers.gni")

declare_args() {
  # This arg is used when we want to tell the JIT-generating v8 code
  # that we want to have it generate for an architecture that is different
  # than the architecture that v8 will actually run on; we then run the
  # code under an emulator. For example, we might run v8 on x86, but
  # generate arm code and run that under emulation.
  #
  # This arg is defined here rather than in the v8 project because we want
  # some of the common architecture-specific args (like arm_float_abi or
  # mips_arch_variant) to be set to their defaults either if the current_cpu
  # applies *or* if the v8_current_cpu applies.
  #
  # As described below, you can also specify the v8_target_cpu to use
  # indirectly by specifying a `custom_toolchain` that contains v8_$cpu in the
  # name after the normal toolchain.
  #
  # For example, `gn gen --args="custom_toolchain=...:clang_x64_v8_arm64"`
  # is equivalent to setting --args=`v8_target_cpu="arm64"`. Setting
  # `custom_toolchain` is more verbose but makes the toolchain that is
  # (effectively) being used explicit.
  #
  # v8_target_cpu can only be used to target one architecture in a build,
  # so if you wish to build multiple copies of v8 that are targeting
  # different architectures, you will need to do something more
  # complicated involving multiple toolchains along the lines of
  # custom_toolchain, above.
  v8_target_cpu = ""
}

if (v8_target_cpu == "") {
  if (current_toolchain == "//build/toolchain/linux:clang_x64_v8_arm64") {
    v8_target_cpu = "arm64"
  } else if (current_toolchain == "//build/toolchain/linux:clang_x86_v8_arm") {
    v8_target_cpu = "arm"
  } else if (current_toolchain ==
             "//build/toolchain/linux:clang_x86_v8_mips64el") {
    v8_target_cpu = "mips64el"
  } else if (current_toolchain ==
             "//build/toolchain/linux:clang_x86_v8_mipsel") {
    v8_target_cpu = "mipsel"
  } else if (is_msan) {
    # If we're running under a sanitizer, if we configure v8 to generate
    # code that will be run under a simulator, then the generated code
    # also gets the benefits of the sanitizer.
    v8_target_cpu = "arm64"
  } else {
    v8_target_cpu = target_cpu
  }
}

declare_args() {
  # This argument is declared here so that it can be overridden in toolchains.
  # It should never be explicitly set by the user.
  v8_current_cpu = v8_target_cpu
}
