# Copyright 2019 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

# Tools IREE provides for compiling, executing, and benchmarking programs, as
# well as other utilities.
#
# Only binary targets and their associated main files should go in this
# directory. Library targets and header files should be placed in the
# appropriate subtree, e.g. `compiler/src/iree/compiler/Tools/`.
#
# Programs with a dependency on the compiler are not designed to run on device
# platforms (e.g. Android), so they are tagged "hostonly".

load("//build_tools/bazel:build_defs.oss.bzl", "iree_compiler_cc_binary", "iree_runtime_cc_binary")

package(
    default_visibility = ["//visibility:public"],
    features = ["layering_check"],
    licenses = ["notice"],  # Apache 2.0
)

exports_files(["lit.cfg.py"])

iree_runtime_cc_binary(
    name = "iree-benchmark-module",
    srcs = ["iree-benchmark-module-main.cc"],
    deps = [
        "//runtime/src/iree/base",
        "//runtime/src/iree/base/internal:flags",
        "//runtime/src/iree/hal",
        "//runtime/src/iree/modules/hal:types",
        "//runtime/src/iree/tooling:context_util",
        "//runtime/src/iree/tooling:device_util",
        "//runtime/src/iree/tooling:vm_util",
        "//runtime/src/iree/vm",
        "@com_google_benchmark//:benchmark",
    ],
)

iree_runtime_cc_binary(
    name = "iree-benchmark-trace",
    srcs = ["iree-benchmark-trace-main.c"],
    deps = [
        "//runtime/src/iree/base",
        "//runtime/src/iree/base/internal:atomic_slist",
        "//runtime/src/iree/base/internal:file_io",
        "//runtime/src/iree/base/internal:flags",
        "//runtime/src/iree/base/internal:path",
        "//runtime/src/iree/hal",
        "//runtime/src/iree/testing:benchmark",
        "//runtime/src/iree/tooling:device_util",
        "//runtime/src/iree/tooling:trace_replay",
        "//runtime/src/iree/tooling:vm_util",
        "//runtime/src/iree/tooling:yaml_util",
        "//runtime/src/iree/vm",
        "@com_github_yaml_libyaml//:yaml",
    ],
)

iree_runtime_cc_binary(
    name = "iree-check-module",
    testonly = True,
    srcs = ["iree-check-module-main.cc"],
    deps = [
        "//runtime/src/iree/base",
        "//runtime/src/iree/base/internal:file_io",
        "//runtime/src/iree/base/internal:flags",
        "//runtime/src/iree/hal",
        "//runtime/src/iree/modules/check",
        "//runtime/src/iree/testing:gtest",
        "//runtime/src/iree/tooling:context_util",
        "//runtime/src/iree/tooling:device_util",
        "//runtime/src/iree/tooling:vm_util",
        "//runtime/src/iree/vm",
        "//runtime/src/iree/vm/bytecode:module",
    ],
)

iree_runtime_cc_binary(
    name = "iree-cpuinfo",
    srcs = ["iree-cpuinfo.c"],
    deps = [
        "//runtime/src/iree/base",
        "//runtime/src/iree/base/internal:cpu",
        "//runtime/src/iree/schemas:cpu_data",
    ],
)

iree_runtime_cc_binary(
    name = "iree-dump-instruments",
    srcs = ["iree-dump-instruments-main.c"],
    deps = [
        "//runtime/src/iree/base",
        "//runtime/src/iree/base/internal:file_io",
        "//runtime/src/iree/base/internal/flatcc:parsing",
        "//runtime/src/iree/schemas/instruments",
        "//runtime/src/iree/schemas/instruments:dispatch_def_c_fbs",
    ],
)

iree_runtime_cc_binary(
    name = "iree-dump-module",
    srcs = ["iree-dump-module-main.c"],
    deps = [
        "//runtime/src/iree/base",
        "//runtime/src/iree/base/internal:file_io",
        "//runtime/src/iree/base/internal:flags",
        "//runtime/src/iree/base/internal/flatcc:debugging",
        "//runtime/src/iree/base/internal/flatcc:parsing",
        "//runtime/src/iree/schemas:bytecode_module_def_c_fbs",
        "//runtime/src/iree/vm/bytecode:module",
    ],
)

iree_runtime_cc_binary(
    name = "iree-fatelf",
    srcs = ["iree-fatelf.c"],
    deps = [
        "//runtime/src/iree/base",
        "//runtime/src/iree/base/internal:file_io",
        "//runtime/src/iree/base/internal:path",
        "//runtime/src/iree/hal/local/elf:elf_module",
    ],
)

iree_compiler_cc_binary(
    name = "iree-opt",
    srcs = ["iree-opt-main.cc"],
    tags = ["hostonly"],
    deps = [
        "//compiler/bindings/c:headers",
        "//compiler/src/iree/compiler/API:Impl",
    ],
)

iree_compiler_cc_binary(
    name = "iree-mlir-lsp-server",
    srcs = ["iree-mlir-lsp-server.cc"],
    deps = [
        "//compiler/bindings/c:headers",
        "//compiler/src/iree/compiler/API:Impl",
    ],
)

# The only place we cross the streams between compiler and runtime. This
# includes a JIT compiler step and uses neither of the iree_*_cc_binary rules,
# but rather directly depends on both the compiler and runtime include rules.
cc_binary(
    name = "iree-run-mlir",
    srcs = ["iree-run-mlir-main.cc"],
    tags = ["hostonly"],
    deps = [
        "//compiler/bindings/c:headers",
        "//compiler/src:defs",
        "//compiler/src/iree/compiler/API:Impl",
        "//runtime/src:runtime_defines",
        "//runtime/src/iree/base",
        "//runtime/src/iree/base/internal:flags",
        "//runtime/src/iree/hal",
        "//runtime/src/iree/tooling:context_util",
        "//runtime/src/iree/tooling:device_util",
        "//runtime/src/iree/tooling:run_module",
        "//runtime/src/iree/vm",
    ],
)

iree_runtime_cc_binary(
    name = "iree-run-module",
    srcs = ["iree-run-module-main.c"],
    deps = [
        "//runtime/src/iree/base",
        "//runtime/src/iree/base/internal:flags",
        "//runtime/src/iree/hal",
        "//runtime/src/iree/tooling:context_util",
        "//runtime/src/iree/tooling:run_module",
        "//runtime/src/iree/vm",
    ],
)

iree_runtime_cc_binary(
    name = "iree-run-trace",
    srcs = ["iree-run-trace-main.c"],
    deps = [
        "//runtime/src/iree/base",
        "//runtime/src/iree/base/internal:flags",
        "//runtime/src/iree/base/internal:path",
        "//runtime/src/iree/hal",
        "//runtime/src/iree/tooling:device_util",
        "//runtime/src/iree/tooling:trace_replay",
        "//runtime/src/iree/tooling:vm_util",
        "//runtime/src/iree/tooling:yaml_util",
        "//runtime/src/iree/vm",
        "@com_github_yaml_libyaml//:yaml",
    ],
)

iree_runtime_cc_binary(
    name = "iree-e2e-matmul-test",
    srcs = ["iree-e2e-matmul-test.c"],
    deps = [
        "//runtime/src/iree/base",
        "//runtime/src/iree/base/internal",
        "//runtime/src/iree/base/internal:cpu",
        "//runtime/src/iree/base/internal:flags",
        "//runtime/src/iree/base/internal:path",
        "//runtime/src/iree/hal",
        "//runtime/src/iree/modules/hal",
        "//runtime/src/iree/tooling:device_util",
        "//runtime/src/iree/tooling:trace_replay",
        "//runtime/src/iree/tooling:yaml_util",
        "//runtime/src/iree/vm",
        "@com_github_yaml_libyaml//:yaml",
    ],
)

iree_compiler_cc_binary(
    name = "iree-tblgen",
    srcs = [
        "iree-tblgen.cpp",
        "//compiler/src/iree/compiler/Dialect/VM/Tools:GenSrcs",
    ],
    tags = ["hostonly"],
    deps = [
        "//build_tools:default_linkopts",
        "@llvm-project//llvm:Support",
        "@llvm-project//llvm:TableGen",
        "@llvm-project//mlir:MlirTableGenMain",
        "@llvm-project//mlir:Support",
        "@llvm-project//mlir:TableGen",
    ],
)

iree_compiler_cc_binary(
    name = "iree-compile",
    srcs = ["iree-compile-main.cc"],
    tags = ["hostonly"],
    deps = [
        "//compiler/bindings/c:headers",
        "//compiler/src/iree/compiler/API:Impl",
    ],
)
