# 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 targetting
  # 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
}
