https://github.com/jhuber6 created https://github.com/llvm/llvm-project/pull/142021
Summary: This patch identifies the CUDA path that clang used and forwards it to the linker wrapper. This should make sure that we're using a consistent CUDA path, but the behavior should be the same for normal use. Most toolchains have a lazy detector for this, which we could potentially borrow. However, that would require adding a new top-level accessor to the global toolchain and I wasn't sure if it was worth it for this, since it's not overly expensive. >From 9bd201be348f68bf98eb46f920948d84b25b4f90 Mon Sep 17 00:00:00 2001 From: Joseph Huber <hube...@outlook.com> Date: Thu, 29 May 2025 14:13:49 -0500 Subject: [PATCH] [Clang] Always pass the detected CUDA path to the linker wrapper Summary: This patch identifies the CUDA path that clang used and forwards it to the linker wrapper. This should make sure that we're using a consistent CUDA path, but the behavior should be the same for normal use. Most toolchains have a lazy detector for this, which we could potentially borrow. However, that would require adding a new top-level accessor to the global toolchain and I wasn't sure if it was worth it for this, since it's not overly expensive. --- clang/lib/Driver/ToolChains/Clang.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 13842b8cc2870..f72c7e5cb91ae 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -9217,7 +9217,6 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, // compilation job. const llvm::DenseSet<unsigned> CompilerOptions{ OPT_v, - OPT_cuda_path_EQ, OPT_rocm_path_EQ, OPT_O_Group, OPT_g_Group, @@ -9260,6 +9259,18 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, for (auto &I : llvm::make_range(TCRange)) { const ToolChain *TC = I.second; + // All NVPTX targets currently depend on CUDA binary utilities. + if (TC->getTriple().isNVPTX()) { + // Most toolchains have a cached version of this, but it's not exposed + // so we just do the work again. + CudaInstallationDetector CudaInstallation(C.getDriver(), + TC->getTriple(), Args); + if (CudaInstallation.isValid()) + CmdArgs.push_back( + Args.MakeArgString("--device-compiler=" + TC->getTripleString() + + "=" + CudaInstallation.getInstallPath())); + } + // We do not use a bound architecture here so options passed only to a // specific architecture via -Xarch_<cpu> will not be forwarded. ArgStringList CompilerArgs; @@ -9314,9 +9325,6 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, Args.MakeArgString("--host-triple=" + getToolChain().getTripleString())); if (Args.hasArg(options::OPT_v)) CmdArgs.push_back("--wrapper-verbose"); - if (Arg *A = Args.getLastArg(options::OPT_cuda_path_EQ)) - CmdArgs.push_back( - Args.MakeArgString(Twine("--cuda-path=") + A->getValue())); // Construct the link job so we can wrap around it. Linker->ConstructJob(C, JA, Output, Inputs, Args, LinkingOutput); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits