1# A collection of helper CMake functions to detect hardware capabilities. At 2# the moment these are used when configuring MLIR integration tests. 3 4# Checks whether the specified hardware capability is supported by the host 5# Linux system. This is implemented by checking auxiliary vector feature 6# provided by the Linux kernel. 7# 8# check_hwcap( 9# hwcap_spec 10# output_var 11# ) 12# 13# hwcap_spec - HWCAP value to check - these are defined in hwcap.h in the Linux 14# kernel. 15# 16# output_var - Output variable to use to save the results (TRUE for supported, 17# FALSE for not supported). 18# 19# EXAMPLES: 20# 21# check_hwcap("HWCAP2_SME" SME_EMULATOR_REQUIRED) 22# 23function(check_hwcap hwcap_spec output) 24 set(hwcap_test_src 25 [====[ 26 #include <asm/hwcap.h> 27 #include <sys/auxv.h> 28 29 int main(void) 30 { 31 long hwcaps = getauxval(AT_<HWCAP_VEC>); 32 return (hwcaps & <HWCAP_SPEC>) != 0; 33 } 34 ]====] 35 ) 36 37 # Extract from $hwcap_spec whether this is AT_HWCAP or AT_HWCAP2 38 string(FIND ${hwcap_spec} "_" wsloc) 39 string(SUBSTRING ${hwcap_spec} 0 ${wsloc} hwcap_vec) 40 41 string(REPLACE "<HWCAP_VEC>" ${hwcap_vec} hwcap_test_src "${hwcap_test_src}") 42 string(REPLACE "<HWCAP_SPEC>" ${hwcap_spec} hwcap_test_src "${hwcap_test_src}") 43 44 set(hwcap_test_file ${CMAKE_BINARY_DIR}/temp/hwcap_check.c) 45 file(WRITE ${hwcap_test_file} "${hwcap_test_src}") 46 47 # Compile _and_ run 48 try_run( 49 test_run_result test_compile_result 50 "${CMAKE_BINARY_DIR}" 51 "${hwcap_test_file}" 52 ) 53 # Compilation will fail if hwcap_spec is not defined - this usually means 54 # that your Linux kernel is too old. 55 if(${test_compile_result} AND (DEFINED test_run_result)) 56 message(STATUS "Checking whether ${hwcap_spec} is supported by the host system: ${test_run_result}") 57 set(${output} ${test_run_result} PARENT_SCOPE) 58 else() 59 message(STATUS "Checking whether ${hwcap_spec} is supported by the host system: FALSE") 60 endif() 61endfunction(check_hwcap) 62 63# For the given group of e2e tests (defined by the `mlir_e2e_tests` flag), 64# checks whether an emulator is required. If yes, verifies that the 65# corresponding CMake var pointing to an emulator (`emulator_exec`) has been 66# set. 67# 68# check_emulator( 69# mlir_e2e_tests 70# hwcap_spec 71# emulator_exec 72# ) 73# 74# mlir_e2e_tests - MLIR CMake variables corresponding to the group of e2e tests 75# to check 76# hwcap_spec - HWCAP value to check. This should correspond to the hardware 77# capabilities required by the tests to be checked. Possible 78# values are defined in hwcap.h in the Linux kernel. 79# emulator_exec - variable the defines the emulator (ought to be set if 80# required, can be empty otherwise). 81# 82# EXAMPLES: 83# 84# check_emulator(MLIR_RUN_ARM_SVE_TESTS "HWCAP_SVE" ARM_EMULATOR_EXECUTABLE) 85# 86function(check_emulator mlir_e2e_tests hwcap_spec emulator_exec) 87 if (NOT ${mlir_e2e_tests}) 88 return() 89 endif() 90 91 check_hwcap(${hwcap_spec} emulator_not_required) 92 if (${emulator_not_required}) 93 return() 94 endif() 95 96 if (${emulator_exec} STREQUAL "") 97 message(FATAL_ERROR "${mlir_e2e_tests} requires an emulator, but ${emulator_exec} is not set") 98 endif() 99 100endfunction() 101