# A collection of helper CMake functions to detect hardware capabilities. At # the moment these are used when configuring MLIR integration tests. # Checks whether the specified hardware capability is supported by the host # Linux system. This is implemented by checking auxiliary vector feature # provided by the Linux kernel. # # check_hwcap( # hwcap_spec # output_var # ) # # hwcap_spec - HWCAP value to check - these are defined in hwcap.h in the Linux # kernel. # # output_var - Output variable to use to save the results (TRUE for supported, # FALSE for not supported). # # EXAMPLES: # # check_hwcap("HWCAP2_SME" SME_EMULATOR_REQUIRED) # function(check_hwcap hwcap_spec output) set(hwcap_test_src [====[ #include #include int main(void) { long hwcaps = getauxval(AT_); return (hwcaps & ) != 0; } ]====] ) # Extract from $hwcap_spec whether this is AT_HWCAP or AT_HWCAP2 string(FIND ${hwcap_spec} "_" wsloc) string(SUBSTRING ${hwcap_spec} 0 ${wsloc} hwcap_vec) string(REPLACE "" ${hwcap_vec} hwcap_test_src "${hwcap_test_src}") string(REPLACE "" ${hwcap_spec} hwcap_test_src "${hwcap_test_src}") set(hwcap_test_file ${CMAKE_BINARY_DIR}/temp/hwcap_check.c) file(WRITE ${hwcap_test_file} "${hwcap_test_src}") # Compile _and_ run try_run( test_run_result test_compile_result "${CMAKE_BINARY_DIR}" "${hwcap_test_file}" ) # Compilation will fail if hwcap_spec is not defined - this usually means # that your Linux kernel is too old. if(${test_compile_result} AND (DEFINED test_run_result)) message(STATUS "Checking whether ${hwcap_spec} is supported by the host system: ${test_run_result}") set(${output} ${test_run_result} PARENT_SCOPE) else() message(STATUS "Checking whether ${hwcap_spec} is supported by the host system: FALSE") endif() endfunction(check_hwcap) # For the given group of e2e tests (defined by the `mlir_e2e_tests` flag), # checks whether an emulator is required. If yes, verifies that the # corresponding CMake var pointing to an emulator (`emulator_exec`) has been # set. # # check_emulator( # mlir_e2e_tests # hwcap_spec # emulator_exec # ) # # mlir_e2e_tests - MLIR CMake variables corresponding to the group of e2e tests # to check # hwcap_spec - HWCAP value to check. This should correspond to the hardware # capabilities required by the tests to be checked. Possible # values are defined in hwcap.h in the Linux kernel. # emulator_exec - variable the defines the emulator (ought to be set if # required, can be empty otherwise). # # EXAMPLES: # # check_emulator(MLIR_RUN_ARM_SVE_TESTS "HWCAP_SVE" ARM_EMULATOR_EXECUTABLE) # function(check_emulator mlir_e2e_tests hwcap_spec emulator_exec) if (NOT ${mlir_e2e_tests}) return() endif() check_hwcap(${hwcap_spec} emulator_not_required) if (${emulator_not_required}) return() endif() if (${emulator_exec} STREQUAL "") message(FATAL_ERROR "${mlir_e2e_tests} requires an emulator, but ${emulator_exec} is not set") endif() endfunction()