Author: Joseph Huber Date: 2023-04-03T12:57:21-05:00 New Revision: f263bd8f7d4c82af9672803e6d8d57f25c929d00
URL: https://github.com/llvm/llvm-project/commit/f263bd8f7d4c82af9672803e6d8d57f25c929d00 DIFF: https://github.com/llvm/llvm-project/commit/f263bd8f7d4c82af9672803e6d8d57f25c929d00.diff LOG: [Clang] Implicitly include LLVM libc headers for the GPU There is currently work to support basic `libc` functionality on the GPU. Some basic information about the projects can be found at https://libc.llvm.org/gpu_mode.html. Typically, including the system headers on the GPU will result in an error. For this reason the LLVM `libc` project will generate its own headers that can be used with the GPU. The problem is that these headers will use the same name as the system headers. For that reason, D146970 places it in the `llvm-libc` subfolder. In order to still pick these files up, this patch adds changes in clang to default to searching this directory when targeting the GPU. This lets offloading languages such as OpenMP use the system `string.h` when compiling for the host and then the LLVM libc `string.h` when targeting the GPU. Depends on D146970 Reviewed By: tra Differential Revision: https://reviews.llvm.org/D146973 Added: clang/test/Driver/gpu-libc-headers.c Modified: clang/lib/Driver/ToolChains/Clang.cpp Removed: ################################################################################ diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 41fe89337d1b1..a17db9b9ceb79 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1157,6 +1157,24 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, if (JA.isOffloading(Action::OFK_HIP)) getToolChain().AddHIPIncludeArgs(Args, CmdArgs); + // If we are compiling for a GPU target we want to override the system headers + // with ones created by the 'libc' project if present. + if (!Args.hasArg(options::OPT_nostdinc) && + !Args.hasArg(options::OPT_nogpuinc) && + !Args.hasArg(options::OPT_nobuiltininc) && + (getToolChain().getTriple().isNVPTX() || + getToolChain().getTriple().isAMDGCN())) { + + // Add include/gpu-none-libc/* to our system include path. This lets us use + // GPU-specific system headers first. These headers should be made to be + // compatible with the host environment's headers. + SmallString<128> P(llvm::sys::path::parent_path(D.InstalledDir)); + llvm::sys::path::append(P, "include"); + llvm::sys::path::append(P, "gpu-none-llvm"); + CmdArgs.push_back("-c-isystem"); + CmdArgs.push_back(Args.MakeArgString(P)); + } + // If we are offloading to a target via OpenMP we need to include the // openmp_wrappers folder which contains alternative system headers. if (JA.isDeviceOffloading(Action::OFK_OpenMP) && diff --git a/clang/test/Driver/gpu-libc-headers.c b/clang/test/Driver/gpu-libc-headers.c new file mode 100644 index 0000000000000..c8f772f102d03 --- /dev/null +++ b/clang/test/Driver/gpu-libc-headers.c @@ -0,0 +1,22 @@ +// REQUIRES: nvptx-registered-target +// REQUIRES: amdgpu-registered-target + +// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fopenmp=libomp --sysroot=./ \ +// RUN: -fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa --offload-arch=gfx908 \ +// RUN: -nogpulib %s 2>&1 | FileCheck %s --check-prefix=CHECK-HEADERS +// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fopenmp=libomp --sysroot=./ \ +// RUN: -fopenmp-targets=nvptx64-nvidia-cuda -Xopenmp-target=nvptx64-nvidia-cuda --offload-arch=sm_70 \ +// RUN: -nogpulib %s 2>&1 | FileCheck %s --check-prefix=CHECK-HEADERS +// RUN: %clang -### --target=nvptx64-nvidia-cuda -march=sm_70 -nogpulib --sysroot=./ %s 2>&1 | \ +// RUN: FileCheck %s --check-prefix=CHECK-HEADERS +// RUN: %clang -### --target=amdgcn-amd-amdhsa -mcpu=gfx1030 -nogpulib --sysroot=./ %s 2>&1 | \ +// RUN: FileCheck %s --check-prefix=CHECK-HEADERS +// CHECK-HEADERS: "-cc1"{{.*}}"-c-isystem" "{{.*}}include/gpu-none-llvm"{{.*}}"-isysroot" "./" + +// RUN: %clang -### --target=amdgcn-amd-amdhsa -mcpu=gfx1030 -nogpulib \ +// RUN: -nogpuinc %s 2>&1 | FileCheck %s --check-prefix=CHECK-HEADERS-DISABLED +// RUN: %clang -### --target=amdgcn-amd-amdhsa -mcpu=gfx1030 -nogpulib \ +// RUN: -nostdinc %s 2>&1 | FileCheck %s --check-prefix=CHECK-HEADERS-DISABLED +// RUN: %clang -### --target=amdgcn-amd-amdhsa -mcpu=gfx1030 -nogpulib \ +// RUN: -nobuiltininc %s 2>&1 | FileCheck %s --check-prefix=CHECK-HEADERS-DISABLED +// CHECK-HEADERS-DISABLED-NOT: "-cc1"{{.*}}"-c-isystem" "{{.*}}include/gpu-none-llvm" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits