237 lines · plain
1add_mlir_library(MLIRTargetLLVM2 ModuleToObject.cpp3 4 ADDITIONAL_HEADER_DIRS5 ${MLIR_MAIN_INCLUDE_DIR}/mlir/Target/LLVM6 7 DEPENDS8 intrinsics_gen9 10 LINK_COMPONENTS11 BitWriter12 Core13 IPO14 IRReader15 Linker16 MC17 Passes18 Support19 Target20 LINK_LIBS PUBLIC21 MLIRExecutionEngineUtils22 MLIRTargetLLVMIRExport23)24 25if ("NVPTX" IN_LIST LLVM_TARGETS_TO_BUILD)26 set(NVPTX_LIBS27 NVPTXCodeGen28 NVPTXDesc29 NVPTXInfo30 )31endif()32 33add_mlir_dialect_library(MLIRNVVMTarget34 NVVM/Target.cpp35 36 OBJECT37 38 ADDITIONAL_HEADER_DIRS39 ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR40 41 LINK_COMPONENTS42 ${NVPTX_LIBS}43 44 LINK_LIBS PUBLIC45 MLIRIR46 MLIRExecutionEngineUtils47 MLIRSupport48 MLIRGPUDialect49 MLIRTargetLLVM50 MLIRNVVMToLLVMIRTranslation51 )52 53if ("NVPTX" IN_LIST LLVM_TARGETS_TO_BUILD)54 # Find the CUDA toolkit.55 find_package(CUDAToolkit)56 57 if(CUDAToolkit_FOUND)58 # Get the CUDA toolkit path. The path is needed for detecting `libdevice.bc`.59 # These extra steps are needed because of a bug on CMake.60 # See: https://gitlab.kitware.com/cmake/cmake/-/issues/2485861 # TODO: Bump the MLIR CMake version to 3.26.4 and switch to62 # ${CUDAToolkit_LIBRARY_ROOT}63 if(NOT DEFINED CUDAToolkit_LIBRARY_ROOT)64 get_filename_component(MLIR_CUDAToolkit_ROOT ${CUDAToolkit_BIN_DIR}65 DIRECTORY ABSOLUTE)66 else()67 set(MLIR_CUDAToolkit_ROOT ${CUDAToolkit_LIBRARY_ROOT})68 endif()69 70 # Add the `nvptxcompiler` library.71 if(MLIR_ENABLE_NVPTXCOMPILER)72 # Find the `nvptxcompiler` library.73 # TODO: Bump the MLIR CMake version to 3.25 and use `CUDA::nvptxcompiler_static`.74 find_library(MLIR_NVPTXCOMPILER_LIB_PATH nvptxcompiler_static75 PATHS ${CUDAToolkit_LIBRARY_DIR} NO_DEFAULT_PATH)76 77 # Fail if `nvptxcompiler_static` couldn't be found.78 if(MLIR_NVPTXCOMPILER_LIB_PATH STREQUAL "MLIR_NVPTXCOMPILER_LIB_PATH-NOTFOUND")79 message(FATAL_ERROR80 "Requested using the `nvptxcompiler` library backend but it couldn't be found.")81 endif()82 83 add_library(MLIR_NVPTXCOMPILER_LIB STATIC IMPORTED GLOBAL)84 # Downstream projects can modify this path and use it in CMake. For example:85 # add_library(MLIR_NVPTXCOMPILER_LIB STATIC IMPORTED GLOBAL)86 # set_property(TARGET MLIR_NVPTXCOMPILER_LIB PROPERTY IMPORTED_LOCATION ${...}) 87 # where `...` is to be replaced with the path to the library.88 set_property(TARGET MLIR_NVPTXCOMPILER_LIB PROPERTY IMPORTED_LOCATION ${MLIR_NVPTXCOMPILER_LIB_PATH})89 # Link against `nvptxcompiler_static`. TODO: use `CUDA::nvptxcompiler_static`.90 target_link_libraries(MLIRNVVMTarget PRIVATE MLIR_NVPTXCOMPILER_LIB)91 target_include_directories(obj.MLIRNVVMTarget PUBLIC ${CUDAToolkit_INCLUDE_DIRS})92 93 # Add the `nvfatbin` library.94 find_library(MLIR_NVFATBIN_LIB_PATH nvfatbin_static95 PATHS ${CUDAToolkit_LIBRARY_DIR} NO_DEFAULT_PATH)96 # Fail if `nvfatbin_static` couldn't be found.97 if(MLIR_NVFATBIN_LIB_PATH STREQUAL "MLIR_NVFATBIN_LIB_PATH-NOTFOUND")98 message(FATAL_ERROR99 "Requested using the static `nvptxcompiler` library which requires the \100 'nvfatbin` library, but it couldn't be found.")101 endif()102 103 add_library(MLIR_NVFATBIN_LIB STATIC IMPORTED GLOBAL)104 set_property(TARGET MLIR_NVFATBIN_LIB PROPERTY IMPORTED_LOCATION ${MLIR_NVFATBIN_LIB_PATH}) 105 target_link_libraries(MLIRNVVMTarget PRIVATE MLIR_NVFATBIN_LIB)106 endif()107 else()108 # Fail if `MLIR_ENABLE_NVPTXCOMPILER` is enabled and the toolkit couldn't be found.109 if(MLIR_ENABLE_NVPTXCOMPILER)110 message(FATAL_ERROR111 "Requested using the `nvptxcompiler` library backend but it couldn't be found.")112 endif()113 endif()114 message(VERBOSE "MLIR default CUDA toolkit path: ${MLIR_CUDAToolkit_ROOT}")115 116 # Define the `CUDAToolkit` path.117 target_compile_definitions(obj.MLIRNVVMTarget118 PRIVATE119 __DEFAULT_CUDATOOLKIT_PATH__="${MLIR_CUDAToolkit_ROOT}"120 )121endif()122 123 124function(embed_binary_to_src file output_file symbol)125 file(READ ${file} filedata HEX)126 # Convert hex data for C compatibility127 string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," filedata ${filedata})128 # Write data to output file129 file(WRITE ${output_file} "const unsigned char ${symbol}[] = {${filedata}};\nconst int ${symbol}_size = sizeof(${symbol});\n")130endfunction()131 132set(MLIR_NVVM_EMBED_LIBDEVICE 0 CACHE BOOL "Embed CUDA libdevice.bc in the binary at build time instead of looking it up at runtime")133if (MLIR_NVVM_EMBED_LIBDEVICE)134 if (NOT MLIR_NVVM_LIBDEVICE_PATH)135 if(CUDAToolkit_FOUND)136 find_file(MLIR_NVVM_LIBDEVICE_PATH libdevice.10.bc137 PATHS ${CUDAToolkit_LIBRARY_ROOT}138 PATH_SUFFIXES "nvvm/libdevice" NO_DEFAULT_PATH REQUIRED)139 else()140 message(FATAL_ERROR141 "Requested using the `nvptxcompiler` library backend but it couldn't be found.")142 endif()143 endif()144 145 embed_binary_to_src(${MLIR_NVVM_LIBDEVICE_PATH} ${CMAKE_CURRENT_BINARY_DIR}/libdevice_embedded.c _mlir_embedded_libdevice)146 add_mlir_library(MLIRNVVMLibdevice147 ${CMAKE_CURRENT_BINARY_DIR}/libdevice_embedded.c148 )149 target_link_libraries(MLIRNVVMTarget PRIVATE MLIRNVVMLibdevice)150 target_compile_definitions(obj.MLIRNVVMTarget151 PRIVATE152 MLIR_NVVM_EMBED_LIBDEVICE=1153 )154else()155 target_compile_definitions(obj.MLIRNVVMTarget156 PRIVATE157 MLIR_NVVM_EMBED_LIBDEVICE=0158 )159endif()160 161 162if (MLIR_ENABLE_ROCM_CONVERSIONS)163 set(AMDGPU_LIBS164 AMDGPUAsmParser165 AMDGPUCodeGen166 AMDGPUDesc167 AMDGPUInfo168 )169endif()170 171add_mlir_dialect_library(MLIRROCDLTarget172 ROCDL/Target.cpp173 ROCDL/Utils.cpp174 175 OBJECT176 177 LINK_COMPONENTS178 FrontendOffloading179 MCParser180 ${AMDGPU_LIBS}181 182 LINK_LIBS PUBLIC183 MLIRIR184 MLIRExecutionEngineUtils185 MLIRSupport186 MLIRGPUDialect187 MLIRTargetLLVM188 MLIRROCDLToLLVMIRTranslation189 )190 191if(MLIR_ENABLE_ROCM_CONVERSIONS)192 if (DEFINED ROCM_PATH)193 set(DEFAULT_ROCM_PATH "${ROCM_PATH}" CACHE PATH "Fallback path to search for ROCm installs")194 elseif(DEFINED ENV{ROCM_PATH})195 set(DEFAULT_ROCM_PATH "$ENV{ROCM_PATH}" CACHE PATH "Fallback path to search for ROCm installs")196 else()197 if (WIN32)198 # Avoid setting an UNIX path for Windows.199 # TODO: Eventually migrate to FindHIP once it becomes a part of CMake.200 set(DEFAULT_ROCM_PATH "" CACHE PATH "Fallback path to search for ROCm installs")201 else()202 set(DEFAULT_ROCM_PATH "/opt/rocm" CACHE PATH "Fallback path to search for ROCm installs")203 endif()204 endif()205 message(VERBOSE "MLIR Default ROCM toolkit path: ${DEFAULT_ROCM_PATH}")206 207 target_compile_definitions(obj.MLIRROCDLTarget208 PRIVATE209 __DEFAULT_ROCM_PATH__="${DEFAULT_ROCM_PATH}"210 )211endif()212 213if ("SPIRV" IN_LIST LLVM_TARGETS_TO_BUILD)214 set(SPIRV_LIBS215 SPIRVCodeGen216 SPIRVDesc217 SPIRVInfo218 )219endif()220 221add_mlir_dialect_library(MLIRXeVMTarget222 XeVM/Target.cpp223 224 OBJECT225 226 LINK_COMPONENTS227 ${SPIRV_LIBS}228 229 LINK_LIBS PUBLIC230 MLIRIR231 MLIRExecutionEngineUtils232 MLIRSupport233 MLIRGPUDialect234 MLIRTargetLLVM235 MLIRXeVMToLLVMIRTranslation236)237