| # Copyright 2021 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 |
| |
| include(CMakeParseArguments) |
| |
| # iree_hal_cts_test_suite() |
| # |
| # Creates a set of tests for a provided Hardware Abstraction Layer (HAL) driver, |
| # with one generated test for each test in the Conformance Test Suite (CTS). |
| # |
| # Parameters: |
| # DRIVER_NAME: The name of the driver to test. Used for both target names and |
| # for `iree_hal_driver_registry_try_create()` within test code. |
| # VARIANT_SUFFIX: Suffix to add to the test names, separate from the driver |
| # name. Useful when specifying multiple configurations using `ARGS` or |
| # other parameters. |
| # DRIVER_REGISTRATION_HDR: The C #include path for `DRIVER_REGISTRATION_FN`. |
| # DRIVER_REGISTRATION_FN: The C function which registers `DRIVER_NAME`. |
| # COMPILER_TARGET_BACKEND: Optional target backend name to pass to the |
| # `-iree-hal-target-backends` option of `iree-compile` to use for |
| # executable generation. If this is omitted, or the associated compiler |
| # target is not enabled, tests which use executables will be disabled. |
| # COMPILER_FLAGS: Additional compiler flags. |
| # Example: "--iree-llvmcpu-target-float-abi=hard --iree-llvmcpu-loop-unrolling" |
| # EXECUTABLE_FORMAT: Executable format identifier. Will be interpreted |
| # literally in C++ and may include macros like IREE_ARCH as needed. |
| # Examples: |
| # "\"vmvx-bytecode-fb\"" -> "vmvx-bytecode-fb" |
| # "\"embedded-elf-\" IREE_ARCH" -> "embedded-elf-x86_64" |
| # ARGS: List of command line arguments to pass to test binaries. |
| # DEPS: List of other libraries to link in to the binary targets (typically |
| # the dependency for `DRIVER_REGISTRATION_HDR`). |
| # INCLUDED_TESTS: List of test names to include from the test suite. |
| # Defaults to `IREE_ALL_CTS_TESTS`. |
| # EXCLUDED_TESTS: List of test names to exclude from the test suite for this |
| # driver. Generally set either this _or_ `INCLUDED_TESTS`. |
| # LABELS: Additional labels to forward to `iree_cc_test`. The package path |
| # and "driver=${DRIVER}" are added automatically. |
| function(iree_hal_cts_test_suite) |
| if(NOT IREE_BUILD_TESTS) |
| return() |
| endif() |
| |
| cmake_parse_arguments( |
| _RULE |
| "" |
| "DRIVER_NAME;VARIANT_SUFFIX;DRIVER_REGISTRATION_HDR;DRIVER_REGISTRATION_FN;COMPILER_TARGET_BACKEND;EXECUTABLE_FORMAT" |
| "DEPS;ARGS;COMPILER_FLAGS;INCLUDED_TESTS;EXCLUDED_TESTS;LABELS;" |
| ${ARGN} |
| ) |
| |
| list(APPEND _RULE_LABELS "driver=${_RULE_DRIVER_NAME}") |
| |
| # Enable executable tests if a compiler target backend capable of producing |
| # executables compatible with the driver is provided and enabled. |
| set(_ENABLE_EXECUTABLE_TESTS OFF) |
| if(DEFINED _RULE_COMPILER_TARGET_BACKEND) |
| string(TOUPPER ${_RULE_COMPILER_TARGET_BACKEND} _UPPERCASE_TARGET_BACKEND) |
| string(REPLACE "-" "_" _NORMALIZED_TARGET_BACKEND ${_UPPERCASE_TARGET_BACKEND}) |
| if(NOT DEFINED IREE_TARGET_BACKEND_${_NORMALIZED_TARGET_BACKEND}) |
| message(SEND_ERROR "Unknown backend '${_RULE_COMPILER_TARGET_BACKEND}'. Check IREE_TARGET_BACKEND_* options.") |
| endif() |
| if(IREE_HOST_BIN_DIR) |
| # If we're not building the host tools from source under this configuration, |
| # such as when cross compiling, then we can't easily check for which |
| # compiler target backends are enabled. Just assume all are enabled and only |
| # rely on the runtime HAL driver check above for filtering. |
| set(_ENABLE_EXECUTABLE_TESTS ON) |
| else() |
| # We are building the host tools, so check enabled compiler target backends. |
| if(IREE_TARGET_BACKEND_${_NORMALIZED_TARGET_BACKEND}) |
| set(_ENABLE_EXECUTABLE_TESTS ON) |
| endif() |
| endif() |
| endif() |
| |
| # Generate testdata if executable tests are enabled. |
| set(_EXECUTABLE_DEPS "") |
| if(_ENABLE_EXECUTABLE_TESTS) |
| set(_EXECUTABLES_TESTDATA_NAME "${_RULE_COMPILER_TARGET_BACKEND}_executables") |
| |
| set(_TRANSLATE_FLAGS |
| "--compile-mode=hal-executable" |
| "--iree-hal-target-backends=${_RULE_COMPILER_TARGET_BACKEND}" |
| ${_RULE_COMPILER_FLAGS} |
| ) |
| |
| # Skip if already created (multiple suites using the same compiler setting). |
| iree_package_name(_PACKAGE_NAME) |
| if(NOT TARGET ${_PACKAGE_NAME}_${_EXECUTABLES_TESTDATA_NAME}_c) |
| set(_EMBED_DATA_SOURCES "") |
| foreach(_FILE_NAME ${IREE_ALL_CTS_EXECUTABLE_SOURCES}) |
| # Note: this is an abuse of naming. We are not building a bytecode |
| # module, but this CMake rule already wraps iree-compile |
| # We should add a new function like `iree_hal_executable()`. |
| iree_bytecode_module( |
| NAME |
| ${_RULE_COMPILER_TARGET_BACKEND}_${_FILE_NAME}_module |
| MODULE_FILE_NAME |
| "${_RULE_COMPILER_TARGET_BACKEND}_${_FILE_NAME}.bin" |
| SRC |
| "${IREE_ROOT_DIR}/runtime/src/iree/hal/cts/testdata/${_FILE_NAME}.mlir" |
| FLAGS |
| ${_TRANSLATE_FLAGS} |
| PUBLIC |
| TESTONLY |
| ) |
| list(APPEND _EMBED_DATA_SOURCES "${_RULE_COMPILER_TARGET_BACKEND}_${_FILE_NAME}.bin") |
| endforeach() |
| |
| iree_c_embed_data( |
| NAME |
| ${_EXECUTABLES_TESTDATA_NAME}_c |
| SRCS |
| ${_EMBED_DATA_SOURCES} |
| C_FILE_OUTPUT |
| "${_EXECUTABLES_TESTDATA_NAME}_c.c" |
| H_FILE_OUTPUT |
| "${_EXECUTABLES_TESTDATA_NAME}_c.h" |
| IDENTIFIER |
| "iree_cts_testdata_executables" |
| STRIP_PREFIX |
| "${_RULE_COMPILER_TARGET_BACKEND}_" |
| FLATTEN |
| PUBLIC |
| TESTONLY |
| ) |
| |
| endif() |
| |
| list(APPEND _EXECUTABLE_DEPS |
| ::${_EXECUTABLES_TESTDATA_NAME}_c |
| ) |
| endif() |
| |
| if(_RULE_INCLUDED_TESTS) |
| set(_INCLUDED_TESTS ${_RULE_INCLUDED_TESTS}) |
| else() |
| set(_INCLUDED_TESTS ${IREE_ALL_CTS_TESTS}) |
| endif() |
| |
| foreach(_TEST_NAME ${_INCLUDED_TESTS}) |
| if("${_TEST_NAME}" IN_LIST _RULE_EXCLUDED_TESTS) |
| continue() |
| endif() |
| |
| # Set vars (and possibly skip) based on if this test uses executables. |
| if("${_TEST_NAME}" IN_LIST IREE_EXECUTABLE_CTS_TESTS) |
| if(NOT _ENABLE_EXECUTABLE_TESTS) |
| continue() |
| endif() |
| |
| set(_TEST_DEPS |
| "${_RULE_DEPS}" |
| "${_EXECUTABLE_DEPS}" |
| ) |
| set(IREE_CTS_EXECUTABLE_FORMAT "${_RULE_EXECUTABLE_FORMAT}") |
| set(IREE_CTS_EXECUTABLES_TESTDATA_HDR "${_EXECUTABLES_TESTDATA_NAME}_c.h") |
| else() |
| set(_TEST_DEPS "${_RULE_DEPS}" ) |
| set(IREE_CTS_EXECUTABLE_FORMAT "") |
| set(IREE_CTS_EXECUTABLES_TESTDATA_HDR "") |
| endif() |
| |
| # Note: driver names may contain dashes and other special characters. We |
| # could sanitize for file and target names, but passing through directly |
| # may be more intuitive. |
| if(DEFINED _RULE_VARIANT_SUFFIX) |
| set(_TEST_TARGET_NAME "${_RULE_DRIVER_NAME}_${_RULE_VARIANT_SUFFIX}_${_TEST_NAME}_test") |
| else() |
| set(_TEST_TARGET_NAME "${_RULE_DRIVER_NAME}_${_TEST_NAME}_test") |
| endif() |
| set(_TEST_SOURCE_NAME "${_TEST_TARGET_NAME}.cc") |
| set(_TEST_LIBRARY_DEP "iree::hal::cts::${_TEST_NAME}_test_library") |
| |
| # Generate the source file for this [test x driver] pair. |
| # TODO(scotttodd): Move to build time instead of configure time? |
| set(IREE_CTS_TEST_FILE_PATH "runtime/src/iree/hal/cts/${_TEST_NAME}_test.h") |
| set(IREE_CTS_DRIVER_REGISTRATION_HDR "${_RULE_DRIVER_REGISTRATION_HDR}") |
| set(IREE_CTS_DRIVER_REGISTRATION_FN "${_RULE_DRIVER_REGISTRATION_FN}") |
| set(IREE_CTS_DRIVER_NAME "${_RULE_DRIVER_NAME}") |
| set(IREE_CTS_TARGET_BACKEND "${_RULE_COMPILER_TARGET_BACKEND}") |
| |
| configure_file( |
| "${IREE_ROOT_DIR}/runtime/src/iree/hal/cts/cts_test_template.cc.in" |
| ${_TEST_SOURCE_NAME} |
| ) |
| |
| iree_cc_test( |
| NAME |
| ${_TEST_TARGET_NAME} |
| ARGS |
| ${_RULE_ARGS} |
| SRCS |
| "${CMAKE_CURRENT_BINARY_DIR}/${_TEST_SOURCE_NAME}" |
| DEPS |
| ${_TEST_DEPS} |
| ${_TEST_LIBRARY_DEP} |
| iree::base |
| iree::hal |
| iree::hal::cts::cts_test_base |
| iree::testing::gtest_main |
| LABELS |
| ${_RULE_LABELS} |
| ) |
| endforeach() |
| endfunction() |