| # Copyright 2020 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 | 
 |  | 
 | """Macros for defining tests that run a module using iree-check-module.""" | 
 |  | 
 | load("//build_tools/bazel:iree_bytecode_module.bzl", "iree_bytecode_module") | 
 | load("//build_tools/bazel:native_binary.bzl", "native_test") | 
 |  | 
 | DEFAULT_TARGET_BACKENDS_AND_DRIVERS = [ | 
 |     ("vmvx", "local-task"), | 
 |     ("vulkan-spirv", "vulkan"), | 
 |     ("llvm-cpu", "local-task"), | 
 | ] | 
 |  | 
 | def iree_check_test( | 
 |         name, | 
 |         src, | 
 |         target_backend, | 
 |         driver = None, | 
 |         compiler_flags = [], | 
 |         input_type = None, | 
 |         runner_args = [], | 
 |         tags = [], | 
 |         timeout = None, | 
 |         **kwargs): | 
 |     """Creates an iree-check-module test for the specified source file. | 
 |  | 
 |     Args: | 
 |       name: name of the generated test. | 
 |       src: source mlir file containing the module. | 
 |       target_backend: target backend to compile for. | 
 |       driver: driver to run the module with. This can be omitted to test only | 
 |           compilation, but consider omiting the driver as a hacky abuse of the | 
 |           rule since compilation on its own not use iree-check-module. | 
 |       compiler_flags: additional flags to pass to the compiler. Bytecode output | 
 |           format and backend flags are passed automatically. | 
 |       input_type: Value to pass to --iree-input-type. | 
 |       runner_args: additional runner_args to pass to iree-check-module. The | 
 |           driver and input file are passed automatically. | 
 |       tags: additional tags to apply to the generated test. Tag | 
 |           "driver=DRIVER" and "target=TARGET" are added automatically. | 
 |       timeout: timeout for the generated tests. | 
 |       **kwargs: any additional attributes to pass to the underlying native_test. | 
 |     """ | 
 |  | 
 |     input_type_flags = [] | 
 |     if input_type: | 
 |         input_type_flags = ["--iree-input-type=%s" % input_type] | 
 |     flags = [ | 
 |         "--iree-hal-target-backends=%s" % target_backend, | 
 |     ] + compiler_flags + input_type_flags | 
 |     bytecode_module_name = name + "_bytecode_module" | 
 |     iree_bytecode_module( | 
 |         name = bytecode_module_name, | 
 |         src = src, | 
 |         flags = flags, | 
 |         tags = ["target=%s" % target_backend], | 
 |         visibility = ["//visibility:private"], | 
 |     ) | 
 |  | 
 |     if not driver: | 
 |         return | 
 |  | 
 |     native_test( | 
 |         name = name, | 
 |         args = [ | 
 |             "--device=%s" % driver, | 
 |             "--module=$(location :%s)" % bytecode_module_name, | 
 |         ] + runner_args, | 
 |         data = [":%s" % bytecode_module_name], | 
 |         src = "//tools:iree-check-module", | 
 |         tags = tags + ["driver=%s" % driver, "target=%s" % target_backend], | 
 |         timeout = timeout, | 
 |         **kwargs | 
 |     ) | 
 |  | 
 | def iree_check_single_backend_test_suite( | 
 |         name, | 
 |         srcs, | 
 |         target_backend, | 
 |         driver = None, | 
 |         compiler_flags = [], | 
 |         input_type = None, | 
 |         runner_args = [], | 
 |         tags = [], | 
 |         timeout = None, | 
 |         **kwargs): | 
 |     """Creates a test suite of iree-check-module tests for a single backend/driver pair. | 
 |  | 
 |     One test is generated per source file. | 
 |  | 
 |     Args: | 
 |       name: name of the generated test suite. | 
 |       srcs: source mlir files containing the module. | 
 |       target_backend: target backend to compile for. | 
 |       driver: driver to run the module with. This can be omitted to test only | 
 |           compilation, but consider omiting the driver as a hacky abuse of the | 
 |           rule since compilation on its own not use iree-check-module. | 
 |       compiler_flags: additional flags to pass to the compiler. Bytecode output | 
 |           format and backend flags are passed automatically. | 
 |       input_type: Value to pass to --iree-input-type. | 
 |       runner_args: additional runner_args to pass to the underlying | 
 |           iree-check-module tests. The driver and input file are passed | 
 |           automatically. To use different runner_args per test, create a | 
 |           separate suite or iree_check_test. | 
 |       tags: tags to apply to the generated tests. Note that as in standard test | 
 |           suites, manual is treated specially and will also apply to the test | 
 |           suite itself. | 
 |       timeout: timeout for the generated tests. | 
 |       **kwargs: any additional attributes to pass to the underlying tests and | 
 |           test suite. | 
 |     """ | 
 |  | 
 |     # Metal backend/driver not supported by Bazel build. | 
 |     if target_backend == "metal-spirv" or driver == "metal": | 
 |         return | 
 |  | 
 |     # ROCm/HIP backend/driver not supported by Bazel build. | 
 |     if target_backend == "rocm" or driver == "hip": | 
 |         return | 
 |  | 
 |     tests = [] | 
 |     for src in srcs: | 
 |         test_name = "_".join([name, src]) | 
 |         iree_check_test( | 
 |             name = test_name, | 
 |             src = src, | 
 |             target_backend = target_backend, | 
 |             driver = driver, | 
 |             compiler_flags = compiler_flags, | 
 |             input_type = input_type, | 
 |             runner_args = runner_args, | 
 |             tags = tags, | 
 |             timeout = timeout, | 
 |             **kwargs | 
 |         ) | 
 |         tests.append(test_name) | 
 |  | 
 |     if not driver: | 
 |         return | 
 |  | 
 |     native.test_suite( | 
 |         name = name, | 
 |         tests = tests, | 
 |         tags = tags + ["driver=%s" % driver, "target=%s" % target_backend], | 
 |         # If there are kwargs that need to be passed here which only apply to | 
 |         # the generated tests and not to test_suite, they should be extracted | 
 |         # into separate named arguments. | 
 |         **kwargs | 
 |     ) | 
 |  | 
 | def iree_check_test_suite( | 
 |         name, | 
 |         srcs, | 
 |         target_backends_and_drivers = DEFAULT_TARGET_BACKENDS_AND_DRIVERS, | 
 |         compiler_flags = [], | 
 |         input_type = None, | 
 |         runner_args = [], | 
 |         tags = [], | 
 |         target_cpu_features_variants = [], | 
 |         **kwargs): | 
 |     """Creates a test suite of iree-check-module tests. | 
 |  | 
 |     One test is generated per source file and backend/driver. | 
 |  | 
 |     Args: | 
 |       name: name of the generated test suite. | 
 |       srcs: source mlir files containing the module. | 
 |       target_backends_and_drivers: backend/driver pairs to compile and run the | 
 |           module, respectively. | 
 |       compiler_flags: additional flags to pass to the compiler. Bytecode output | 
 |           format and backend flags are passed automatically. | 
 |       input_type: Value to pass to --iree-input-type. | 
 |       runner_args: additional runner_args to pass to the underlying | 
 |           iree-check-module tests. The driver and input file are passed | 
 |           automatically. To use different runner_args per test, create a | 
 |           separate suite or iree_check_test. | 
 |       tags: tags to apply to the generated tests. Note that as in standard test | 
 |           suites, manual is treated specially and will also apply to the test | 
 |           suite itself. | 
 |       target_cpu_features_variants: ignored, assumed to be ["generic"] in this | 
 |           Bazel implementation. See the CMake implementation for what this does | 
 |           in general. | 
 |       **kwargs: any additional attributes to pass to the underlying tests and | 
 |           test suite. | 
 |     """ | 
 |  | 
 |     # Like CMake, default to "generic". Unlike CMake, do not honor other values. | 
 |     generic_flags = compiler_flags + ["--iree-llvmcpu-target-cpu=generic"] | 
 |  | 
 |     # We could have complicated argument override logic for runner_args and such, or... the client | 
 |     # could just create a test suite. The latter seems simpler and more readable. | 
 |     tests = [] | 
 |     for backend, driver in target_backends_and_drivers: | 
 |         suite_name = "_".join([name, backend, driver]) | 
 |         iree_check_single_backend_test_suite( | 
 |             name = suite_name, | 
 |             srcs = srcs, | 
 |             driver = driver, | 
 |             target_backend = backend, | 
 |             compiler_flags = generic_flags, | 
 |             input_type = input_type, | 
 |             runner_args = runner_args, | 
 |             tags = tags, | 
 |             **kwargs | 
 |         ) | 
 |         tests.append(suite_name) | 
 |     native.test_suite( | 
 |         name = name, | 
 |         tests = tests, | 
 |         # Note that only the manual tag really has any effect here. Others are | 
 |         # used for test suite filtering, but all tests are passed the same tags. | 
 |         tags = tags, | 
 |         # If there are kwargs that need to be passed here which only apply to | 
 |         # the generated tests and not to test_suite, they should be extracted | 
 |         # into separate named arguments. | 
 |         **kwargs | 
 |     ) |