https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/98170
>From 1b488f77309922f8b4a43a2a7a8191c88d9e6996 Mon Sep 17 00:00:00 2001 From: Joseph Huber <hube...@outlook.com> Date: Tue, 9 Jul 2024 10:15:35 -0500 Subject: [PATCH] [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 | 11 +++++++++++ clang/lib/Driver/ToolChains/CommonArgs.cpp | 1 + clang/lib/Driver/ToolChains/Cuda.cpp | 10 ++++++++++ 3 files changed, 22 insertions(+) diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp index 453daed7cc7d5..6f39782966a72 100644 --- a/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -633,6 +633,17 @@ 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))); + + // If the user's toolchain has the 'include/amdgcn-amd-amdhsa/` path, we + // assume it supports the standard C libraries for the GPU and include them. + bool HasLibC = getToolChain().getStdlibIncludePath().has_value(); + if (!Args.hasArg(options::OPT_nogpulib) && + !Args.hasArg(options::OPT_nolibc) && + Args.hasFlag(options::OPT_gpulibc, options::OPT_nogpulibc, HasLibC)) { + CmdArgs.push_back("-lc"); + CmdArgs.push_back("-lm"); + } + 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..7529353fc284b 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1257,6 +1257,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/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp index 59453c484ae4f..1adbf2ca9da7a 100644 --- a/clang/lib/Driver/ToolChains/Cuda.cpp +++ b/clang/lib/Driver/ToolChains/Cuda.cpp @@ -621,6 +621,16 @@ void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA, addLTOOptions(getToolChain(), Args, CmdArgs, Output, Inputs[0], C.getDriver().getLTOMode() == LTOK_Thin); + // If the user's toolchain has the 'include/nvptx64-nvidia-cuda/` path, we + // assume it supports the standard C libraries for the GPU and include them. + bool HasLibC = getToolChain().getStdlibIncludePath().has_value(); + if (!Args.hasArg(options::OPT_nogpulib) && + !Args.hasArg(options::OPT_nolibc) && + Args.hasFlag(options::OPT_gpulibc, options::OPT_nogpulibc, HasLibC)) { + CmdArgs.push_back("-lc"); + CmdArgs.push_back("-lm"); + } + // Add paths for the default clang library path. SmallString<256> DefaultLibPath = llvm::sys::path::parent_path(TC.getDriver().Dir); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits