# Copyright 2018 The Fuchsia 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/dart/dart_tool.gni")
import("//third_party/dart/utils/compile_platform.gni")

compile_platform("kernel_platform_files") {
  single_root_scheme = "org-dartlang-sdk"
  single_root_base = rebase_path("../../../../")

  libraries_specification_uri =
      "org-dartlang-sdk:///topaz/runtime/dart_runner/kernel/libraries.json"

  outputs = [
    "$root_out_dir/dart_runner_patched_sdk/platform_strong.dill",
    "$root_out_dir/dart_runner_patched_sdk/vm_outline_strong.dill",
  ]

  args = [
    "--bytecode",
    "--target=dart_runner",
    "dart:core",
  ]
}

template("create_kernel_core_snapshot") {
  assert(defined(invoker.product), "The parameter 'product' must be defined")
  product_suffix = ""
  if (invoker.product) {
    product_suffix = "_product"
  }
  action(target_name) {
    deps = gen_snapshot_deps + [ ":kernel_platform_files" ]

    platform_dill = "$root_out_dir/dart_runner_patched_sdk/platform_strong.dill"
    compilation_trace = "//topaz/runtime/flutter_runner/compilation_trace.txt"
    inputs = [
      platform_dill,
      compilation_trace,
    ]

    vm_snapshot_data = "$target_gen_dir/vm_data${product_suffix}.bin"
    vm_snapshot_instructions =
        "$target_gen_dir/vm_instructions${product_suffix}.bin"
    isolate_snapshot_data = "$target_gen_dir/isolate_data${product_suffix}.bin"
    isolate_snapshot_instructions =
        "$target_gen_dir/isolate_instructions${product_suffix}.bin"
    snapshot_profile =
        "$target_gen_dir/snapshot_profile${product_suffix}.json"
    outputs = [
      vm_snapshot_data,
      vm_snapshot_instructions,
      isolate_snapshot_data,
      isolate_snapshot_instructions,
      snapshot_profile,
    ]

    if (invoker.product) {
      script = gen_snapshot_product
    } else {
      script = gen_snapshot
    }

    args = [
      # TODO(zra): remove this when the interpreter supports field guards.
      "--no_use_field_guards",
      # TODO(FL-117): Re-enable causal async stack traces when this issue is
      # addressed.
      "--no_causal_async_stacks",
      "--use_bytecode_compiler",
      "--enable_mirrors=false",
      "--deterministic",
      "--snapshot_kind=core-jit",
      "--load_compilation_trace=" +
          rebase_path(compilation_trace, root_build_dir),
      "--vm_snapshot_data=" + rebase_path(vm_snapshot_data, root_build_dir),
      "--vm_snapshot_instructions=" +
          rebase_path(vm_snapshot_instructions, root_build_dir),
      "--isolate_snapshot_data=" +
          rebase_path(isolate_snapshot_data, root_build_dir),
      "--isolate_snapshot_instructions=" +
          rebase_path(isolate_snapshot_instructions, root_build_dir),
      "--write_v8_snapshot_profile_to=" +
          rebase_path(snapshot_profile, root_build_dir),
    ]
    if (is_debug && !invoker.product) {
      args += [ "--enable_asserts" ]
    }
    args += [ rebase_path(platform_dill) ]
  }
}

create_kernel_core_snapshot("kernel_core_snapshot") {
  product = false
}

create_kernel_core_snapshot("kernel_core_snapshot_product") {
  product = true
}
