#===-- cmake/modules/AddFlangRTOffload.cmake -------------------------------===# # # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. # See https://llvm.org/LICENSE.txt for license information. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # #===------------------------------------------------------------------------===# macro(enable_cuda_compilation name files) if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "CUDA") if (FLANG_RT_ENABLE_SHARED) message(FATAL_ERROR "FLANG_RT_ENABLE_SHARED is not supported for CUDA offload build of Flang-RT" ) endif() enable_language(CUDA) set_target_properties(${name}.static PROPERTIES CUDA_SEPARABLE_COMPILATION ON ) # Treat all supported sources as CUDA files. set_source_files_properties(${files} PROPERTIES LANGUAGE CUDA) set(CUDA_COMPILE_OPTIONS) if ("${CMAKE_CUDA_COMPILER_ID}" MATCHES "Clang") # Allow varargs. set(CUDA_COMPILE_OPTIONS -Xclang -fcuda-allow-variadic-functions ) endif() if ("${CMAKE_CUDA_COMPILER_ID}" MATCHES "NVIDIA") set(CUDA_COMPILE_OPTIONS --expt-relaxed-constexpr # Disable these warnings: # 'long double' is treated as 'double' in device code -Xcudafe --diag_suppress=20208 -Xcudafe --display_error_number ) endif() set_source_files_properties(${files} PROPERTIES COMPILE_OPTIONS "${CUDA_COMPILE_OPTIONS}") # Create a .a library consisting of CUDA PTX. # This is different from a regular static library. The CUDA_PTX_COMPILATION # property can only be applied to object libraries and create *.ptx files # instead of *.o files. The .a will consist of those *.ptx files only. add_flangrt_library(obj.${name}PTX OBJECT ${files}) set_target_properties(obj.${name}PTX PROPERTIES CUDA_PTX_COMPILATION ON CUDA_SEPARABLE_COMPILATION ON ) add_flangrt_library(${name}PTX STATIC "$") # Apply configuration options if (FLANG_RT_CUDA_RUNTIME_PTX_WITHOUT_GLOBAL_VARS) target_compile_definitions(obj.${name}PTX PRIVATE FLANG_RUNTIME_NO_GLOBAL_VAR_DEFS ) endif() # When using libcudacxx headers files, we have to use them # for all files of Flang-RT. if (EXISTS "${FLANG_RT_LIBCUDACXX_PATH}/include") foreach (tgt IN ITEMS "${name}.static" "obj.${name}PTX") target_include_directories(${tgt} AFTER PRIVATE "${FLANG_RT_LIBCUDACXX_PATH}/include") target_compile_definitions(${tgt} PRIVATE RT_USE_LIBCUDACXX=1) endforeach () endif () endif() endmacro() macro(enable_omp_offload_compilation name files) if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT STREQUAL "OpenMP") # OpenMP offload build only works with Clang compiler currently. if (FLANG_RT_ENABLE_SHARED) message(FATAL_ERROR "FLANG_RT_ENABLE_SHARED is not supported for OpenMP offload build of Flang-RT" ) endif() if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND "${CMAKE_C_COMPILER_ID}" MATCHES "Clang") string(REPLACE ";" "," compile_for_architectures "${FLANG_RT_DEVICE_ARCHITECTURES}" ) set(OMP_COMPILE_OPTIONS -fopenmp -fvisibility=hidden -fopenmp-cuda-mode --offload-arch=${compile_for_architectures} # Force LTO for the device part. -foffload-lto ) set_source_files_properties(${files} PROPERTIES COMPILE_OPTIONS "${OMP_COMPILE_OPTIONS}" ) target_link_options(${name}.static PUBLIC ${OMP_COMPILE_OPTIONS}) # Enable "declare target" in the source code. set_source_files_properties(${files} PROPERTIES COMPILE_DEFINITIONS OMP_OFFLOAD_BUILD ) else() message(FATAL_ERROR "Flang-rt build with OpenMP offload is not supported for these compilers:\n" "CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}\n" "CMAKE_C_COMPILER_ID: ${CMAKE_C_COMPILER_ID}") endif() endif() endmacro()