xref: /llvm-project/mlir/lib/Target/LLVM/CMakeLists.txt (revision 6a7d6c5f69dda254ec92f982985fd10fa51c63ef)
1add_mlir_library(MLIRTargetLLVM
2  ModuleToObject.cpp
3
4  ADDITIONAL_HEADER_DIRS
5  ${MLIR_MAIN_INCLUDE_DIR}/mlir/Target/LLVM
6
7  DEPENDS
8  intrinsics_gen
9
10  LINK_COMPONENTS
11  Core
12  IPO
13  IRReader
14  Linker
15  MC
16  Passes
17  Support
18  Target
19  LINK_LIBS PUBLIC
20  MLIRExecutionEngineUtils
21  MLIRTargetLLVMIRExport
22)
23
24if ("NVPTX" IN_LIST LLVM_TARGETS_TO_BUILD)
25  set(NVPTX_LIBS
26    NVPTXCodeGen
27    NVPTXDesc
28    NVPTXInfo
29  )
30endif()
31
32add_mlir_dialect_library(MLIRNVVMTarget
33  NVVM/Target.cpp
34
35  OBJECT
36
37  ADDITIONAL_HEADER_DIRS
38  ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR
39
40  LINK_COMPONENTS
41  ${NVPTX_LIBS}
42
43  LINK_LIBS PUBLIC
44  MLIRIR
45  MLIRExecutionEngineUtils
46  MLIRSupport
47  MLIRGPUDialect
48  MLIRTargetLLVM
49  MLIRNVVMToLLVMIRTranslation
50  )
51
52if ("NVPTX" IN_LIST LLVM_TARGETS_TO_BUILD)
53  # Find the CUDA toolkit.
54  find_package(CUDAToolkit)
55
56  if(CUDAToolkit_FOUND)
57    # Get the CUDA toolkit path. The path is needed for detecting `libdevice.bc`.
58    # These extra steps are needed because of a bug on CMake.
59    # See: https://gitlab.kitware.com/cmake/cmake/-/issues/24858
60    # TODO: Bump the MLIR CMake version to 3.26.4 and switch to
61    # ${CUDAToolkit_LIBRARY_ROOT}
62    if(NOT DEFINED ${CUDAToolkit_LIBRARY_ROOT})
63      get_filename_component(MLIR_CUDAToolkit_ROOT ${CUDAToolkit_BIN_DIR}
64                             DIRECTORY ABSOLUTE)
65    else()
66      set(MLIR_CUDAToolkit_ROOT ${CUDAToolkit_LIBRARY_ROOT})
67    endif()
68
69    # Add the `nvptxcompiler` library.
70    if(MLIR_ENABLE_NVPTXCOMPILER)
71      # Find the `nvptxcompiler` library.
72      # TODO: Bump the MLIR CMake version to 3.25 and use `CUDA::nvptxcompiler_static`.
73      find_library(MLIR_NVPTXCOMPILER_LIB_PATH nvptxcompiler_static
74                  PATHS ${CUDAToolkit_LIBRARY_DIR} NO_DEFAULT_PATH)
75
76      # Fail if `nvptxcompiler_static` couldn't be found.
77      if(MLIR_NVPTXCOMPILER_LIB_PATH STREQUAL "MLIR_NVPTXCOMPILER_LIB_PATH-NOTFOUND")
78        message(FATAL_ERROR
79                "Requested using the `nvptxcompiler` library backend but it couldn't be found.")
80      endif()
81
82      add_library(MLIR_NVPTXCOMPILER_LIB STATIC IMPORTED GLOBAL)
83      # Downstream projects can modify this path and use it in CMake. For example:
84      # add_library(MLIR_NVPTXCOMPILER_LIB STATIC IMPORTED GLOBAL)
85      # set_property(TARGET MLIR_NVPTXCOMPILER_LIB PROPERTY IMPORTED_LOCATION ${...})
86      # where `...` is to be replaced with the path to the library.
87      set_property(TARGET MLIR_NVPTXCOMPILER_LIB PROPERTY IMPORTED_LOCATION ${MLIR_NVPTXCOMPILER_LIB_PATH})
88      # Link against `nvptxcompiler_static`. TODO: use `CUDA::nvptxcompiler_static`.
89      target_link_libraries(MLIRNVVMTarget PRIVATE MLIR_NVPTXCOMPILER_LIB)
90      target_include_directories(obj.MLIRNVVMTarget PUBLIC ${CUDAToolkit_INCLUDE_DIRS})
91
92      # Add the `nvfatbin` library.
93      find_library(MLIR_NVFATBIN_LIB_PATH nvfatbin_static
94                  PATHS ${CUDAToolkit_LIBRARY_DIR} NO_DEFAULT_PATH)
95      # Fail if `nvfatbin_static` couldn't be found.
96      if(MLIR_NVFATBIN_LIB_PATH STREQUAL "MLIR_NVFATBIN_LIB_PATH-NOTFOUND")
97        message(FATAL_ERROR
98                "Requested using the static `nvptxcompiler` library which requires the \
99                'nvfatbin` library, but it couldn't be found.")
100      endif()
101
102      add_library(MLIR_NVFATBIN_LIB STATIC IMPORTED GLOBAL)
103      set_property(TARGET MLIR_NVFATBIN_LIB PROPERTY IMPORTED_LOCATION ${MLIR_NVFATBIN_LIB_PATH})
104      target_link_libraries(MLIRNVVMTarget PRIVATE MLIR_NVFATBIN_LIB)
105    endif()
106  else()
107    # Fail if `MLIR_ENABLE_NVPTXCOMPILER` is enabled and the toolkit couldn't be found.
108    if(MLIR_ENABLE_NVPTXCOMPILER)
109      message(FATAL_ERROR
110              "Requested using the `nvptxcompiler` library backend but it couldn't be found.")
111    endif()
112  endif()
113  message(VERBOSE "MLIR default CUDA toolkit path: ${MLIR_CUDAToolkit_ROOT}")
114
115  # Define the `CUDAToolkit` path.
116  target_compile_definitions(obj.MLIRNVVMTarget
117    PRIVATE
118    __DEFAULT_CUDATOOLKIT_PATH__="${MLIR_CUDAToolkit_ROOT}"
119  )
120endif()
121
122
123function(embed_binary_to_src file output_file symbol)
124    file(READ ${file} filedata HEX)
125    # Convert hex data for C compatibility
126    string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," filedata ${filedata})
127    # Write data to output file
128    file(WRITE ${output_file} "const char ${symbol}[] = {${filedata}};\nconst int ${symbol}_size = sizeof(${symbol});\n")
129endfunction()
130
131set(MLIR_NVVM_EMBED_LIBDEVICE 0 CACHE BOOL "Embed CUDA libdevice.bc in the binary at build time instead of looking it up at runtime")
132if (MLIR_NVVM_EMBED_LIBDEVICE)
133  if (NOT MLIR_NVVM_LIBDEVICE_PATH)
134    if(CUDAToolkit_FOUND)
135      find_file(MLIR_NVVM_LIBDEVICE_PATH libdevice.10.bc
136                PATHS ${CUDAToolkit_LIBRARY_ROOT}
137                PATH_SUFFIXES "nvvm/libdevice" NO_DEFAULT_PATH REQUIRED)
138    else()
139      message(FATAL_ERROR
140              "Requested using the `nvptxcompiler` library backend but it couldn't be found.")
141    endif()
142  endif()
143
144  embed_binary_to_src(${MLIR_NVVM_LIBDEVICE_PATH} ${CMAKE_CURRENT_BINARY_DIR}/libdevice_embedded.c _mlir_embedded_libdevice)
145  add_mlir_library(MLIRNVVMLibdevice
146    ${CMAKE_CURRENT_BINARY_DIR}/libdevice_embedded.c
147  )
148  target_link_libraries(MLIRNVVMTarget PRIVATE MLIRNVVMLibdevice)
149  target_compile_definitions(obj.MLIRNVVMTarget
150    PRIVATE
151    MLIR_NVVM_EMBED_LIBDEVICE=1
152  )
153else()
154  target_compile_definitions(obj.MLIRNVVMTarget
155    PRIVATE
156    MLIR_NVVM_EMBED_LIBDEVICE=0
157  )
158endif()
159
160
161if (MLIR_ENABLE_ROCM_CONVERSIONS)
162  set(AMDGPU_LIBS
163    AMDGPUAsmParser
164    AMDGPUCodeGen
165    AMDGPUDesc
166    AMDGPUInfo
167  )
168endif()
169
170add_mlir_dialect_library(MLIRROCDLTarget
171  ROCDL/Target.cpp
172  ROCDL/Utils.cpp
173
174  OBJECT
175
176  LINK_COMPONENTS
177  FrontendOffloading
178  MCParser
179  ${AMDGPU_LIBS}
180
181  LINK_LIBS PUBLIC
182  MLIRIR
183  MLIRExecutionEngineUtils
184  MLIRSupport
185  MLIRGPUDialect
186  MLIRTargetLLVM
187  MLIRROCDLToLLVMIRTranslation
188  )
189
190if(MLIR_ENABLE_ROCM_CONVERSIONS)
191  if (DEFINED ROCM_PATH)
192    set(DEFAULT_ROCM_PATH "${ROCM_PATH}" CACHE PATH "Fallback path to search for ROCm installs")
193  elseif(DEFINED ENV{ROCM_PATH})
194    set(DEFAULT_ROCM_PATH "$ENV{ROCM_PATH}" CACHE PATH "Fallback path to search for ROCm installs")
195  else()
196    if (WIN32)
197      # Avoid setting an UNIX path for Windows.
198      # TODO: Eventually migrate to FindHIP once it becomes a part of CMake.
199      set(DEFAULT_ROCM_PATH "" CACHE PATH "Fallback path to search for ROCm installs")
200    else()
201      set(DEFAULT_ROCM_PATH "/opt/rocm" CACHE PATH "Fallback path to search for ROCm installs")
202    endif()
203  endif()
204  message(VERBOSE "MLIR Default ROCM toolkit path: ${DEFAULT_ROCM_PATH}")
205
206  target_compile_definitions(obj.MLIRROCDLTarget
207    PRIVATE
208    __DEFAULT_ROCM_PATH__="${DEFAULT_ROCM_PATH}"
209  )
210endif()
211
212