diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -964,12 +964,12 @@ endif() endforeach() -add_subdirectory(projects) - if( LLVM_INCLUDE_TOOLS ) add_subdirectory(tools) endif() +add_subdirectory(projects) + if( LLVM_INCLUDE_RUNTIMES ) add_subdirectory(runtimes) endif() diff --git a/openmp/README.rst b/openmp/README.rst --- a/openmp/README.rst +++ b/openmp/README.rst @@ -263,14 +263,18 @@ **LIBOMPTARGET_NVPTX_CUDA_COMPILER** = ``""`` Location of a CUDA compiler capable of emitting LLVM bitcode. Currently only the Clang compiler is supported. This is only used when building the CUDA LLVM - bitcode offloading device RTL. If unspecified and the CMake C compiler is - Clang, then Clang is used. + bitcode offloading device RTL. If unspecified, either the Clang from the build + itself is used (i.e. an in-tree build with LLVM_ENABLE_PROJECTS including + clang), or the Clang compiler that the build uses as C compiler + (CMAKE_C_COMPILER; only if it is Clang). The latter is common for a + stage2-build or when using -DLLVM_ENABLE_RUNTIMES=openmp. **LIBOMPTARGET_NVPTX_BC_LINKER** = ``""`` Location of a linker capable of linking LLVM bitcode objects. This is only - used when building the CUDA LLVM bitcode offloading device RTL. If unspecified - and the CMake C compiler is Clang and there exists a llvm-link binary in the - directory containing Clang, then this llvm-link binary is used. + used when building the CUDA LLVM bitcode offloading device RTL. If + unspecified, either the llvm-link in that same directory as + LIBOMPTARGET_NVPTX_CUDA_COMPILER is used, or the llvm-link from the + same build (available in an in-tree build). **LIBOMPTARGET_NVPTX_ALTERNATE_HOST_COMPILER** = ``""`` Host compiler to use with NVCC. This compiler is not going to be used to diff --git a/openmp/libomptarget/deviceRTLs/nvptx/CMakeLists.txt b/openmp/libomptarget/deviceRTLs/nvptx/CMakeLists.txt --- a/openmp/libomptarget/deviceRTLs/nvptx/CMakeLists.txt +++ b/openmp/libomptarget/deviceRTLs/nvptx/CMakeLists.txt @@ -30,7 +30,17 @@ if (NOT LIBOMPTARGET_NVPTX_CUDA_COMPILER STREQUAL "") set(cuda_compiler ${LIBOMPTARGET_NVPTX_CUDA_COMPILER}) +elseif (TARGET clang) # Or query LLVM_TOOL_CLANG_BUILD + # Compile the deviceRTL with the clang that is built in the project. + set(cuda_compiler clang) elseif(${CMAKE_C_COMPILER_ID} STREQUAL "Clang") + # Compile the device runtime with the compiler that OpenMP is built with. + # This is the case with LLVM_ENABLE_RUNTIMES=openmp. + # FIXME: This is unreliable; the compiler can be on older version of clang + # that does not support compiling CUDA, or only an older version of it. The + # risk is espicially high on sustems where clang is the default compiler + # (MacOS, BSDs). LLVM_ENABLE_RUNTIMES=openmp should itself set + # LIBOMPTARGET_NVPTX_CUDA_COMPILER instead. set(cuda_compiler ${CMAKE_C_COMPILER}) else() libomptarget_say("Not building NVPTX deviceRTL: clang not found") @@ -44,7 +54,12 @@ if (NOT LIBOMPTARGET_NVPTX_BC_LINKER STREQUAL "") set(bc_linker ${LIBOMPTARGET_NVPTX_BC_LINKER}) elseif (EXISTS ${llvm_link}) + # Try to use the linker consistent with the CUDA compiler unless explicitly + # set to a different linker. set(bc_linker ${llvm_link}) +elseif (TARGET llvm-link) + # Use the linker also built in the same project. + set(bc_linker llvm-link) else() libomptarget_say("Not building NVPTX deviceRTL: llvm-link not found") return()