[llvm-branch-commits] [clang] clang/AMDGPU: Fix double linking opencl libs with --libclc-lib (PR #204865)
Matt Arsenault via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Jun 19 11:44:29 PDT 2026
https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/204865
>From db06fa6c1f330ff8e9edfe22a9d0406a4111a27e Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Fri, 19 Jun 2026 17:32:59 +0200
Subject: [PATCH] clang/AMDGPU: Fix double linking opencl libs with
--libclc-lib
Noticed by inspection. If using an explicit --libclc-lib flag,
do not attempt to also link the rocm device libs which will contain
different implementations of the same opencl symbols.
Co-Authored-By: Claude <noreply at anthropic.com>
---
clang/include/clang/Driver/CommonArgs.h | 6 +++++-
clang/lib/Driver/ToolChains/AMDGPU.cpp | 3 ++-
clang/lib/Driver/ToolChains/CommonArgs.cpp | 15 ++++++++-------
clang/test/Driver/opencl-libclc.cl | 9 +++++++++
4 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/clang/include/clang/Driver/CommonArgs.h b/clang/include/clang/Driver/CommonArgs.h
index 14a83ff7beae4..0b91c6c888c29 100644
--- a/clang/include/clang/Driver/CommonArgs.h
+++ b/clang/include/clang/Driver/CommonArgs.h
@@ -239,7 +239,11 @@ void addOpenMPDeviceRTL(const Driver &D, const llvm::opt::ArgList &DriverArgs,
StringRef BitcodeSuffix, const llvm::Triple &Triple,
const ToolChain &HostTC);
-void addOpenCLBuiltinsLib(const Driver &D, const llvm::Triple &TT,
+/// Try to link libclc, depending on the target ABI and command line
+/// arguments.
+///
+/// \return true if libclc should be linked for the compile.
+bool addOpenCLBuiltinsLib(const Driver &D, const llvm::Triple &TT,
const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args);
diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp
index 6611b133057f5..af7417a2a9a7f 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp
@@ -928,7 +928,8 @@ void AMDGPUToolChain::addClangTargetOptions(
if (DriverArgs.hasArg(options::OPT_nostdlib))
return;
- addOpenCLBuiltinsLib(getDriver(), getTriple(), DriverArgs, CC1Args);
+ if (addOpenCLBuiltinsLib(getDriver(), getTriple(), DriverArgs, CC1Args))
+ return;
}
if (!DriverArgs.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib,
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index e568698d1c975..009c44fd9a59f 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -3114,7 +3114,7 @@ void tools::addOpenMPDeviceRTL(const Driver &D,
}
}
-void tools::addOpenCLBuiltinsLib(const Driver &D, const llvm::Triple &TT,
+bool tools::addOpenCLBuiltinsLib(const Driver &D, const llvm::Triple &TT,
const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) {
@@ -3125,12 +3125,12 @@ void tools::addOpenCLBuiltinsLib(const Driver &D, const llvm::Triple &TT,
LibclcNamespec = A->getValue();
} else {
if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
- return;
+ return false;
// TODO: Should this accept following -stdlib to override?
if (DriverArgs.hasArg(options::OPT_no_offloadlib,
options::OPT_nodefaultlibs, options::OPT_nostdlib))
- return;
+ return false;
}
bool FilenameSearch = LibclcNamespec.consume_front(":");
@@ -3139,10 +3139,10 @@ void tools::addOpenCLBuiltinsLib(const Driver &D, const llvm::Triple &TT,
if (D.getVFS().exists(LibclcFile)) {
CC1Args.push_back("-mlink-builtin-bitcode");
CC1Args.push_back(DriverArgs.MakeArgString(LibclcFile));
- return;
+ return true;
}
D.Diag(diag::err_drv_libclc_not_found) << LibclcFile;
- return;
+ return false;
}
// The OpenCL libraries are stored in <ResourceDir>/lib/<triple>.
@@ -3160,7 +3160,7 @@ void tools::addOpenCLBuiltinsLib(const Driver &D, const llvm::Triple &TT,
if (D.getVFS().exists(CPUPath)) {
CC1Args.push_back("-mlink-builtin-bitcode");
CC1Args.push_back(DriverArgs.MakeArgString(CPUPath));
- return;
+ return true;
}
}
}
@@ -3171,10 +3171,11 @@ void tools::addOpenCLBuiltinsLib(const Driver &D, const llvm::Triple &TT,
if (D.getVFS().exists(GenericPath)) {
CC1Args.push_back("-mlink-builtin-bitcode");
CC1Args.push_back(DriverArgs.MakeArgString(GenericPath));
- return;
+ return true;
}
D.Diag(diag::err_drv_libclc_not_found) << "libclc.bc";
+ return false;
}
void tools::addOutlineAtomicsArgs(const Driver &D, const ToolChain &TC,
diff --git a/clang/test/Driver/opencl-libclc.cl b/clang/test/Driver/opencl-libclc.cl
index d2ec8458442c7..fd58b5af04368 100644
--- a/clang/test/Driver/opencl-libclc.cl
+++ b/clang/test/Driver/opencl-libclc.cl
@@ -42,3 +42,12 @@
// RUN: -resource-dir %S/Inputs/resource_dir_with_per_target_subdir \
// RUN: %s 2>&1 | FileCheck %s --check-prefix=AMDGPU-LLVM-ENV-NO-OFFLOAD-LIB
// AMDGPU-LLVM-ENV-NO-OFFLOAD-LIB-NOT: libclc.bc
+
+// With amdgcn-amd-amdhsa and --libclc-lib, should use libclc and NOT link ROCm device libs
+// RUN: %clang -### -target amdgcn-amd-amdhsa --libclc-lib=:%S/Inputs/libclc/libclc.bc \
+// RUN: -resource-dir %S/Inputs/resource_dir_with_per_target_subdir \
+// RUN: %s 2>&1 | FileCheck %s --check-prefix=AMDHSA-LIBCLC
+// AMDHSA-LIBCLC: -mlink-builtin-bitcode{{.*}}Inputs{{/|\\\\}}libclc{{/|\\\\}}libclc.bc
+// AMDHSA-LIBCLC-NOT: ocml
+// AMDHSA-LIBCLC-NOT: ockl
+// AMDHSA-LIBCLC-NOT: oclc
More information about the llvm-branch-commits
mailing list