# Copyright 2023 The Dawn & Tint Authors
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
#    list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions and the following disclaimer in the documentation
#    and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
#    contributors may be used to endorse or promote products derived from
#    this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

################################################################################
# File generated by 'tools/src/cmd/gen' using the template:
#   tools/src/cmd/gen/build/BUILD.gn.tmpl
#
# To regenerate run: './tools/run gen'
#
#                       Do not modify this file directly
################################################################################

import("../../../../../scripts/tint_overrides_with_defaults.gni")

import("${tint_src_dir}/tint.gni")

if (tint_build_unittests || tint_build_benchmarks) {
  import("//testing/test.gni")
}

libtint_source_set("ir") {
  sources = [
    "access.cc",
    "access.h",
    "binary.cc",
    "binary.h",
    "bitcast.cc",
    "bitcast.h",
    "block.cc",
    "block.h",
    "block_param.cc",
    "block_param.h",
    "break_if.cc",
    "break_if.h",
    "builder.cc",
    "builder.h",
    "builtin_call.cc",
    "builtin_call.h",
    "call.cc",
    "call.h",
    "clone_context.cc",
    "clone_context.h",
    "constant.cc",
    "constant.h",
    "construct.cc",
    "construct.h",
    "continue.cc",
    "continue.h",
    "control_instruction.cc",
    "control_instruction.h",
    "convert.cc",
    "convert.h",
    "core_builtin_call.cc",
    "core_builtin_call.h",
    "disassembler.cc",
    "disassembler.h",
    "discard.cc",
    "discard.h",
    "exit.cc",
    "exit.h",
    "exit_if.cc",
    "exit_if.h",
    "exit_loop.cc",
    "exit_loop.h",
    "exit_switch.cc",
    "exit_switch.h",
    "function.cc",
    "function.h",
    "function_param.cc",
    "function_param.h",
    "ice.h",
    "if.cc",
    "if.h",
    "instruction.cc",
    "instruction.h",
    "instruction_result.cc",
    "instruction_result.h",
    "let.cc",
    "let.h",
    "load.cc",
    "load.h",
    "load_vector_element.cc",
    "load_vector_element.h",
    "location.h",
    "loop.cc",
    "loop.h",
    "module.cc",
    "module.h",
    "multi_in_block.cc",
    "multi_in_block.h",
    "next_iteration.cc",
    "next_iteration.h",
    "operand_instruction.cc",
    "operand_instruction.h",
    "return.cc",
    "return.h",
    "store.cc",
    "store.h",
    "store_vector_element.cc",
    "store_vector_element.h",
    "switch.cc",
    "switch.h",
    "swizzle.cc",
    "swizzle.h",
    "terminate_invocation.cc",
    "terminate_invocation.h",
    "terminator.cc",
    "terminator.h",
    "traverse.h",
    "unary.cc",
    "unary.h",
    "unreachable.cc",
    "unreachable.h",
    "user_call.cc",
    "user_call.h",
    "validator.cc",
    "validator.h",
    "value.cc",
    "value.h",
    "var.cc",
    "var.h",
  ]
  deps = [
    "${tint_src_dir}/api/common",
    "${tint_src_dir}/lang/core",
    "${tint_src_dir}/lang/core/constant",
    "${tint_src_dir}/lang/core/intrinsic",
    "${tint_src_dir}/lang/core/type",
    "${tint_src_dir}/utils/containers",
    "${tint_src_dir}/utils/diagnostic",
    "${tint_src_dir}/utils/ice",
    "${tint_src_dir}/utils/id",
    "${tint_src_dir}/utils/macros",
    "${tint_src_dir}/utils/math",
    "${tint_src_dir}/utils/memory",
    "${tint_src_dir}/utils/reflection",
    "${tint_src_dir}/utils/result",
    "${tint_src_dir}/utils/rtti",
    "${tint_src_dir}/utils/symbol",
    "${tint_src_dir}/utils/text",
    "${tint_src_dir}/utils/traits",
  ]
}
if (tint_build_unittests) {
  tint_unittests_source_set("unittests") {
    sources = [
      "access_test.cc",
      "binary_test.cc",
      "bitcast_test.cc",
      "block_param_test.cc",
      "block_test.cc",
      "break_if_test.cc",
      "constant_test.cc",
      "construct_test.cc",
      "continue_test.cc",
      "convert_test.cc",
      "core_builtin_call_test.cc",
      "discard_test.cc",
      "exit_if_test.cc",
      "exit_loop_test.cc",
      "exit_switch_test.cc",
      "function_param_test.cc",
      "function_test.cc",
      "if_test.cc",
      "instruction_result_test.cc",
      "instruction_test.cc",
      "ir_helper_test.h",
      "let_test.cc",
      "load_test.cc",
      "load_vector_element_test.cc",
      "loop_test.cc",
      "module_test.cc",
      "multi_in_block_test.cc",
      "next_iteration_test.cc",
      "operand_instruction_test.cc",
      "return_test.cc",
      "store_test.cc",
      "store_vector_element_test.cc",
      "switch_test.cc",
      "swizzle_test.cc",
      "terminate_invocation_test.cc",
      "traverse_test.cc",
      "unary_test.cc",
      "unreachable_test.cc",
      "user_call_test.cc",
      "validator_test.cc",
      "value_test.cc",
      "var_test.cc",
    ]
    deps = [
      "${tint_src_dir}:gmock_and_gtest",
      "${tint_src_dir}/api/common",
      "${tint_src_dir}/lang/core",
      "${tint_src_dir}/lang/core/constant",
      "${tint_src_dir}/lang/core/intrinsic",
      "${tint_src_dir}/lang/core/ir",
      "${tint_src_dir}/lang/core/type",
      "${tint_src_dir}/utils/containers",
      "${tint_src_dir}/utils/diagnostic",
      "${tint_src_dir}/utils/ice",
      "${tint_src_dir}/utils/id",
      "${tint_src_dir}/utils/macros",
      "${tint_src_dir}/utils/math",
      "${tint_src_dir}/utils/memory",
      "${tint_src_dir}/utils/reflection",
      "${tint_src_dir}/utils/result",
      "${tint_src_dir}/utils/rtti",
      "${tint_src_dir}/utils/symbol",
      "${tint_src_dir}/utils/text",
      "${tint_src_dir}/utils/traits",
    ]
  }
}
