https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/98170
>From 6ffbe94071a1b99e289f806aa145aaa871793b2a Mon Sep 17 00:00:00 2001 From: Joseph Huber <hube...@outlook.com> Date: Tue, 9 Jul 2024 10:15:35 -0500 Subject: [PATCH 1/2] [Clang] Make the GPU toolchains implicitly link `-lm` and `-lc` Summary: The previous patches (The other commits in this chain) allow the offloading toolchain to directly invoke the device linker. Because of this, we can now just have the toolchain implicitly include `-lc` and `-lm` like a standard target does. This removes the old handling that went through the fat binary `-lcgpu`. --- clang/lib/Driver/ToolChains/AMDGPU.cpp | 3 +++ clang/lib/Driver/ToolChains/CommonArgs.cpp | 17 +++++++++++++++++ clang/lib/Driver/ToolChains/CommonArgs.h | 3 +++ clang/lib/Driver/ToolChains/Cuda.cpp | 2 ++ 4 files changed, 25 insertions(+) diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp index 453daed7cc7d5..f6c7300162b9e 100644 --- a/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -633,6 +633,9 @@ void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA, else if (Args.hasArg(options::OPT_mcpu_EQ)) CmdArgs.push_back(Args.MakeArgString( "-plugin-opt=mcpu=" + Args.getLastArgValue(options::OPT_mcpu_EQ))); + + addGPULibraries(getToolChain(), Args, CmdArgs); + CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); C.addCommand(std::make_unique<Command>( diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 019df16a909f4..191feba912b66 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -509,6 +509,22 @@ void tools::addLinkerCompressDebugSectionsOption( } } +void tools::addGPULibraries(const ToolChain &TC, const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) { + if (Args.hasArg(options::OPT_nostdlib, options::OPT_r, + options::OPT_nodefaultlibs, options::OPT_nolibc, + options::OPT_nogpulibc)) + return; + + // If the user's toolchain has the 'include/<triple>/` path, we assume it + // supports the standard C libraries for the GPU and include them. + bool HasLibC = TC.getStdlibIncludePath().has_value(); + if (HasLibC) { + CmdArgs.push_back("-lc"); + CmdArgs.push_back("-lm"); + } +} + void tools::AddTargetFeature(const ArgList &Args, std::vector<StringRef> &Features, OptSpecifier OnOpt, OptSpecifier OffOpt, @@ -1257,6 +1273,7 @@ bool tools::addOpenMPRuntime(const Compilation &C, ArgStringList &CmdArgs, addOpenMPDeviceLibC(C, Args, CmdArgs); addArchSpecificRPath(TC, Args, CmdArgs); + addOpenMPRuntimeLibraryPath(TC, Args, CmdArgs); return true; diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h index 52818ecde924b..0d3b4d6b783ba 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -35,6 +35,9 @@ void addLinkerCompressDebugSectionsOption(const ToolChain &TC, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs); +void addGPULibraries(const ToolChain &TC, const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs); + void claimNoWarnArgs(const llvm::opt::ArgList &Args); bool addSanitizerRuntimes(const ToolChain &TC, const llvm::opt::ArgList &Args, diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp index 61d12b10dfb62..ffe5f4a6f4a25 100644 --- a/clang/lib/Driver/ToolChains/Cuda.cpp +++ b/clang/lib/Driver/ToolChains/Cuda.cpp @@ -625,6 +625,8 @@ void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA, addLTOOptions(getToolChain(), Args, CmdArgs, Output, Inputs[0], C.getDriver().getLTOMode() == LTOK_Thin); + addGPULibraries(getToolChain(), Args, CmdArgs); + // Add paths for the default clang library path. SmallString<256> DefaultLibPath = llvm::sys::path::parent_path(TC.getDriver().Dir); >From b609f5e90a72f0e36bc099bedd85d9bfeddf89e0 Mon Sep 17 00:00:00 2001 From: Joseph Huber <hube...@outlook.com> Date: Tue, 23 Jul 2024 11:48:04 -0500 Subject: [PATCH 2/2] Remove old method for passing C libraries. --- clang/lib/Driver/ToolChains/Clang.cpp | 5 +++ clang/lib/Driver/ToolChains/CommonArgs.cpp | 39 ---------------------- clang/test/Driver/openmp-offload-gpu.c | 28 ++-------------- 3 files changed, 7 insertions(+), 65 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 78936fd634f33..d663cf5bbf718 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -9108,6 +9108,11 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, A->claim(); } + // If we disable the GPU C library support it needs to be forwarded to the + // link job. + if (!Args.hasFlag(options::OPT_gpulibc, options::OPT_nogpulibc, true)) + CmdArgs.push_back("--device-linker=-nolibc"); + // Add the linker arguments to be forwarded by the wrapper. CmdArgs.push_back(Args.MakeArgString(Twine("--linker-path=") + LinkCommand->getExecutable())); diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 191feba912b66..940ea3de492b1 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1161,42 +1161,6 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args, } } -/// Adds the '-lcgpu' and '-lmgpu' libraries to the compilation to include the -/// LLVM C library for GPUs. -static void addOpenMPDeviceLibC(const Compilation &C, const ArgList &Args, - ArgStringList &CmdArgs) { - if (Args.hasArg(options::OPT_nogpulib) || Args.hasArg(options::OPT_nolibc)) - return; - - // Check the resource directory for the LLVM libc GPU declarations. If it's - // found we can assume that LLVM was built with support for the GPU libc. - SmallString<256> LibCDecls(C.getDriver().ResourceDir); - llvm::sys::path::append(LibCDecls, "include", "llvm_libc_wrappers", - "llvm-libc-decls"); - bool HasLibC = llvm::sys::fs::exists(LibCDecls) && - llvm::sys::fs::is_directory(LibCDecls); - if (!Args.hasFlag(options::OPT_gpulibc, options::OPT_nogpulibc, HasLibC)) - return; - - SmallVector<const ToolChain *> ToolChains; - auto TCRange = C.getOffloadToolChains(Action::OFK_OpenMP); - for (auto TI = TCRange.first, TE = TCRange.second; TI != TE; ++TI) - ToolChains.push_back(TI->second); - - if (llvm::any_of(ToolChains, [](const ToolChain *TC) { - return TC->getTriple().isAMDGPU(); - })) { - CmdArgs.push_back("-lcgpu-amdgpu"); - CmdArgs.push_back("-lmgpu-amdgpu"); - } - if (llvm::any_of(ToolChains, [](const ToolChain *TC) { - return TC->getTriple().isNVPTX(); - })) { - CmdArgs.push_back("-lcgpu-nvptx"); - CmdArgs.push_back("-lmgpu-nvptx"); - } -} - void tools::addOpenMPRuntimeLibraryPath(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) { @@ -1269,9 +1233,6 @@ bool tools::addOpenMPRuntime(const Compilation &C, ArgStringList &CmdArgs, if (IsOffloadingHost && !Args.hasArg(options::OPT_nogpulib)) CmdArgs.push_back("-lomptarget.devicertl"); - if (IsOffloadingHost) - addOpenMPDeviceLibC(C, Args, CmdArgs); - addArchSpecificRPath(TC, Args, CmdArgs); addOpenMPRuntimeLibraryPath(TC, Args, CmdArgs); diff --git a/clang/test/Driver/openmp-offload-gpu.c b/clang/test/Driver/openmp-offload-gpu.c index 7c91bdab35be0..0314f28f38a43 100644 --- a/clang/test/Driver/openmp-offload-gpu.c +++ b/clang/test/Driver/openmp-offload-gpu.c @@ -372,33 +372,9 @@ // XARCH-DEVICE: "-cc1" "-triple" "nvptx64-nvidia-cuda"{{.*}}"-O3" // XARCH-DEVICE-NOT: "-cc1" "-triple" "x86_64-unknown-linux-gnu"{{.*}}"-O3" -// -// Check that `-gpulibc` includes the LLVM C libraries for the GPU. -// -// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fopenmp=libomp \ -// RUN: --libomptarget-nvptx-bc-path=%S/Inputs/libomptarget/libomptarget-nvptx-test.bc \ -// RUN: --libomptarget-amdgpu-bc-path=%S/Inputs/hip_dev_lib/libomptarget-amdgpu-gfx803.bc \ -// RUN: --cuda-path=%S/Inputs/CUDA_102/usr/local/cuda \ -// RUN: --rocm-path=%S/Inputs/rocm \ -// RUN: --offload-arch=sm_52,gfx803 -gpulibc -nogpuinc %s 2>&1 \ -// RUN: | FileCheck --check-prefix=LIBC-GPU %s -// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fopenmp=libomp \ -// RUN: --libomptarget-nvptx-bc-path=%S/Inputs/libomptarget/libomptarget-nvptx-test.bc \ -// RUN: --libomptarget-amdgpu-bc-path=%S/Inputs/hip_dev_lib/libomptarget-amdgpu-gfx803.bc \ -// RUN: --cuda-path=%S/Inputs/CUDA_102/usr/local/cuda \ -// RUN: --rocm-path=%S/Inputs/rocm \ -// RUN: -Xopenmp-target=nvptx64-nvidia-cuda -march=sm_52 \ -// RUN: -Xopenmp-target=amdgcn-amd-amdhsa -march=gfx803 \ -// RUN: -fopenmp-targets=nvptx64-nvidia-cuda,amdgcn-amd-amdhsa -gpulibc -nogpuinc %s 2>&1 \ -// RUN: | FileCheck --check-prefix=LIBC-GPU %s -// LIBC-GPU-DAG: "-lcgpu-amdgpu" -// LIBC-GPU-DAG: "-lmgpu-amdgpu" -// LIBC-GPU-DAG: "-lcgpu-nvptx" -// LIBC-GPU-DAG: "-lmgpu-nvptx" - // RUN: %clang -### --target=x86_64-unknown-linux-gnu -fopenmp=libomp \ // RUN: --libomptarget-nvptx-bc-path=%S/Inputs/libomptarget/libomptarget-nvptx-test.bc \ // RUN: --cuda-path=%S/Inputs/CUDA_102/usr/local/cuda \ // RUN: --offload-arch=sm_52 -nogpulibc -nogpuinc %s 2>&1 \ -// RUN: | FileCheck --check-prefix=NO-LIBC-GPU %s -// NO-LIBC-GPU-NOT: -lmgpu{{.*}}-lcgpu +// RUN: | FileCheck --check-prefix=LIBC-GPU %s +// LIBC-GPU: clang-linker-wrapper{{.*}}"--device-linker=-nolibc" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits