154 lines · plain
1add_custom_target(OffloadUnitTests)2set_target_properties(OffloadUnitTests PROPERTIES FOLDER "Tests/UnitTests")3 4if (CMAKE_CROSSCOMPILING)5 # TODO: It is possible that LLVM_GTEST_RUN_UNDER defines an emulator or6 # ssh remote command invocation; for this case provide an option to7 # enable unittests.8 message(STATUS "Offload unittests disabled because we are cross-compiling")9 return ()10endif ()11 12if (NOT TARGET llvm_gtest)13 message(WARNING "Offload unittests disabled due to GTest being unavailable; "14 "Try LLVM_INSTALL_GTEST=ON for the LLVM build")15 return ()16endif ()17 18set(OFFLOAD_UNITTESTS_DIR ${CMAKE_CURRENT_SOURCE_DIR})19 20function(add_offload_test_device_code test_filename test_name)21 cmake_parse_arguments(22 "OFFLOAD_TESTS" "WITH_DEVICE_MATH_LIBS" "" "" ${ARGN})23 24 set(SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${test_filename})25 set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)26 27 # Try to build with support for NVPTX devices.28 if("cuda" IN_LIST LIBOMPTARGET_PLUGINS_TO_BUILD)29 find_package(CUDAToolkit QUIET)30 if(CUDAToolkit_FOUND)31 get_filename_component(cuda_path "${CUDAToolkit_BIN_DIR}" DIRECTORY ABSOLUTE)32 endif()33 check_cxx_compiler_flag(34 "--target=nvptx64-nvidia-cuda -march=native --cuda-path=${cuda_path}" PLATFORM_HAS_NVPTX)35 36 if(OFFLOAD_TESTS_FORCE_NVPTX_ARCH)37 set(nvptx_arch "${OFFLOAD_TESTS_FORCE_NVPTX_ARCH}")38 elseif(PLATFORM_HAS_NVPTX)39 set(nvptx_arch "native")40 endif()41 42 if(nvptx_arch AND CUDAToolkit_FOUND)43 set(nvptx_compile_flags ${OFFLOAD_TESTS_UNPARSED_ARGUMENTS})44 45 if(OFFLOAD_TESTS_WITH_DEVICE_MATH_LIBS)46 file(GLOB libdevice_paths "${CUDAToolkit_LIBRARY_ROOT}/nvvm/libdevice/libdevice.*.bc")47 if(libdevice_paths)48 list(GET libdevice_paths 0 libdevice_path)49 list(APPEND nvptx_compile_flags "-Xclang" "-mlink-builtin-bitcode")50 list(APPEND nvptx_compile_flags "-Xclang" "${libdevice_path}")51 list(APPEND nvptx_compile_flags "-DCUDA_MATH_FOUND=1")52 endif()53 endif()54 55 set(output_file "${CMAKE_CURRENT_BINARY_DIR}/${test_name}.nvptx64.bin")56 add_custom_command(57 OUTPUT ${output_file}58 COMMAND ${CMAKE_CXX_COMPILER}59 -I${OFFLOAD_UNITTESTS_DIR}60 --target=nvptx64-nvidia-cuda -march=${nvptx_arch}61 -nogpulib --cuda-path=${cuda_path} -flto ${nvptx_compile_flags}62 ${SRC_PATH} -o ${output_file}63 DEPENDS ${SRC_PATH}64 )65 add_custom_target(${test_name}.nvptx64 DEPENDS ${output_file})66 endif()67 endif()68 69 # Try to build with support for AMDGPU devices.70 if("amdgpu" IN_LIST LIBOMPTARGET_PLUGINS_TO_BUILD)71 check_cxx_compiler_flag("--target=amdgcn-amd-amdhsa -mcpu=native" PLATFORM_HAS_AMDGPU)72 73 if(OFFLOAD_TESTS_FORCE_AMDGPU_ARCH)74 set(amdgpu_arch "${OFFLOAD_TESTS_FORCE_AMDGPU_ARCH}")75 elseif(PLATFORM_HAS_AMDGPU)76 set(amdgpu_arch "native")77 endif()78 79 if(amdgpu_arch)80 set(amdgpu_compile_flags ${OFFLOAD_TESTS_UNPARSED_ARGUMENTS})81 82 if(OFFLOAD_TESTS_WITH_DEVICE_MATH_LIBS)83 find_package(AMDDeviceLibs QUIET HINTS ${CMAKE_INSTALL_PREFIX} PATHS /opt/rocm)84 if(AMDDeviceLibs_FOUND)85 get_target_property(ocml_path ocml IMPORTED_LOCATION)86 list(APPEND amdgpu_compile_flags "-Xclang" "-mlink-builtin-bitcode")87 list(APPEND amdgpu_compile_flags "-Xclang" "${ocml_path}")88 list(APPEND amdgpu_compile_flags "-DHIP_MATH_FOUND=1")89 endif()90 endif()91 92 set(output_file "${CMAKE_CURRENT_BINARY_DIR}/${test_name}.amdgpu.bin")93 add_custom_command(94 OUTPUT ${output_file}95 COMMAND ${CMAKE_CXX_COMPILER}96 -I${OFFLOAD_UNITTESTS_DIR}97 --target=amdgcn-amd-amdhsa -mcpu=${amdgpu_arch}98 -nogpulib -flto ${amdgpu_compile_flags} ${SRC_PATH} -o ${output_file}99 DEPENDS ${SRC_PATH}100 )101 add_custom_target(${test_name}.amdgpu DEPENDS ${output_file})102 endif()103 endif()104 105 # Create a single dependency target for the device code.106 add_custom_target(${test_name}.bin)107 if(TARGET ${test_name}.amdgpu)108 add_dependencies(${test_name}.bin ${test_name}.amdgpu)109 endif()110 if(TARGET ${test_name}.nvptx64)111 add_dependencies(${test_name}.bin ${test_name}.nvptx64)112 endif()113endfunction()114 115function(add_offload_unittest test_dirname)116 set(target_name "${test_dirname}.unittests")117 118 list(TRANSFORM ARGN PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/" OUTPUT_VARIABLE files)119 120 add_unittest(OffloadUnitTests "${target_name}"121 ${CMAKE_CURRENT_SOURCE_DIR}/common/Environment.cpp122 ${files})123 add_dependencies(${target_name} ${PLUGINS_TEST_COMMON} offload_device_binaries)124 target_compile_definitions(${target_name} PRIVATE DEVICE_CODE_PATH="${OFFLOAD_TEST_DEVICE_CODE_PATH}")125 target_link_libraries(${target_name} PRIVATE ${PLUGINS_TEST_COMMON})126 target_include_directories(${target_name} PRIVATE ${PLUGINS_TEST_INCLUDE})127endfunction()128 129function(add_conformance_test test_name)130 set(target_name "${test_name}.conformance")131 132 list(TRANSFORM ARGN PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/" OUTPUT_VARIABLE files)133 134 add_executable(${target_name} ${files})135 add_dependencies(${target_name} conformance_device_binaries)136 target_compile_definitions(${target_name}137 PRIVATE DEVICE_BINARY_DIR="${OFFLOAD_CONFORMANCE_DEVICE_BINARY_DIR}")138 target_link_libraries(${target_name} PRIVATE ${PLUGINS_TEST_COMMON} libc)139 set_target_properties(${target_name} PROPERTIES EXCLUDE_FROM_ALL TRUE)140 141 add_custom_target(offload.conformance.${test_name}142 COMMAND $<TARGET_FILE:${target_name}>143 DEPENDS ${target_name})144 add_dependencies(offload.conformance offload.conformance.${test_name})145endfunction()146 147set(OFFLOAD_TESTS_FORCE_NVPTX_ARCH "" CACHE STRING148 "Force building of NVPTX device code for Offload unit tests with the given arch, e.g. sm_61")149set(OFFLOAD_TESTS_FORCE_AMDGPU_ARCH "" CACHE STRING150 "Force building of AMDGPU device code for Offload unit tests with the given arch, e.g. gfx1030")151 152add_subdirectory(OffloadAPI)153add_subdirectory(Conformance)154