# 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 = [
    # TODO(dartbug.com/36342): enable bytecode for core libraries when performance of bytecode
    # pipeline is on par with default pipeline and continuously tracked.
    # "--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(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 (!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
}
