[clang] 0b0dca5 - clang/AMDGPU: Do not look for rocm device libs if environment is llvm (#180922)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 11 06:16:30 PST 2026
Author: Matt Arsenault
Date: 2026-02-11T15:16:26+01:00
New Revision: 0b0dca5668e9233ac1ec44178559d732edc13268
URL: https://github.com/llvm/llvm-project/commit/0b0dca5668e9233ac1ec44178559d732edc13268
DIFF: https://github.com/llvm/llvm-project/commit/0b0dca5668e9233ac1ec44178559d732edc13268.diff
LOG: clang/AMDGPU: Do not look for rocm device libs if environment is llvm (#180922)
clang/AMDGPU: Do not look for rocm device libs if environment is llvm
Introduce usage of the llvm environment type. This will be useful as
a switch to eventually stop depending on externally provided libraries,
and only take bitcode from the resource directory.
I wasn't sure how to handle the confusing mess of -no-* flags. Try
to handle them all. I'm not sure --no-offloadlib makes sense for OpenCL
since it's not really offload, but interpret it anyway.
Added:
clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/amdgcn-amd-amdhsa-llvm/gfx90a/libclc.bc
clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/amdgcn-amd-amdhsa-llvm/libclc.bc
clang/test/Driver/hip-device-libs-llvm-env.hip
Modified:
clang/include/clang/Driver/CommonArgs.h
clang/lib/Driver/ToolChains/AMDGPU.cpp
clang/lib/Driver/ToolChains/CommonArgs.cpp
clang/lib/Driver/ToolChains/HIPAMD.cpp
clang/test/Driver/opencl-libclc.cl
libclc/CMakeLists.txt
Removed:
################################################################################
diff --git a/clang/include/clang/Driver/CommonArgs.h b/clang/include/clang/Driver/CommonArgs.h
index 9325732f17368..a895579be7419 100644
--- a/clang/include/clang/Driver/CommonArgs.h
+++ b/clang/include/clang/Driver/CommonArgs.h
@@ -230,7 +230,8 @@ 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::opt::ArgList &DriverArgs,
+void addOpenCLBuiltinsLib(const Driver &D, const llvm::Triple &TT,
+ const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args);
void addOutlineAtomicsArgs(const Driver &D, const ToolChain &TC,
diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp
index 3a1366d46315f..ef5189359cd1a 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp
@@ -842,7 +842,8 @@ bool AMDGPUToolChain::isWave64(const llvm::opt::ArgList &DriverArgs,
ROCMToolChain::ROCMToolChain(const Driver &D, const llvm::Triple &Triple,
const ArgList &Args)
: AMDGPUToolChain(D, Triple, Args) {
- RocmInstallation->detectDeviceLibrary();
+ if (Triple.getEnvironment() != llvm::Triple::LLVM)
+ RocmInstallation->detectDeviceLibrary();
}
void AMDGPUToolChain::addClangTargetOptions(
@@ -872,7 +873,7 @@ void AMDGPUToolChain::addClangTargetOptions(
CC1Args.push_back("-disable-llvm-optzns");
if (DeviceOffloadingKind == Action::OFK_None)
- addOpenCLBuiltinsLib(getDriver(), DriverArgs, CC1Args);
+ addOpenCLBuiltinsLib(getDriver(), getTriple(), DriverArgs, CC1Args);
}
void AMDGPUToolChain::addClangWarningOptions(ArgStringList &CC1Args) const {
@@ -963,8 +964,15 @@ void ROCMToolChain::addClangTargetOptions(
// For SPIR-V (SPIRVAMDToolChain) we must not link any device libraries so we
// skip it.
- if (this->getEffectiveTriple().isSPIRV())
+ const llvm::Triple &TT = this->getEffectiveTriple();
+ if (TT.isSPIRV())
return;
+
+ // With an LLVM environment, only use libraries provided by the resource
+ // directory.
+ if (TT.getEnvironment() == llvm::Triple::LLVM)
+ return;
+
// Get the device name and canonicalize it
const StringRef GpuArch = getGPUArch(DriverArgs);
auto Kind = llvm::AMDGPU::parseArchAMDGCN(GpuArch);
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 6857231b2aafe..284dbc2a11fd6 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -3068,15 +3068,25 @@ void tools::addOpenMPDeviceRTL(const Driver &D,
}
}
-void tools::addOpenCLBuiltinsLib(const Driver &D,
+void tools::addOpenCLBuiltinsLib(const Driver &D, const llvm::Triple &TT,
const llvm::opt::ArgList &DriverArgs,
llvm::opt::ArgStringList &CC1Args) {
+
+ StringRef LibclcNamespec;
const Arg *A = DriverArgs.getLastArg(options::OPT_libclc_lib_EQ);
- if (!A)
- return;
+ if (A) {
+ // If the namespec is of the form :filename we use it exactly.
+ LibclcNamespec = A->getValue();
+ } else {
+ if (!TT.isAMDGPU() || TT.getEnvironment() != llvm::Triple::LLVM)
+ return;
+
+ // TODO: Should this accept following -stdlib to override?
+ if (DriverArgs.hasArg(options::OPT_no_offloadlib,
+ options::OPT_nodefaultlibs, options::OPT_nostdlib))
+ return;
+ }
- // If the namespec is of the form :filename we use it exactly.
- StringRef LibclcNamespec(A->getValue());
bool FilenameSearch = LibclcNamespec.consume_front(":");
if (FilenameSearch) {
SmallString<128> LibclcFile(LibclcNamespec);
diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp
index 61ae7b81d5025..31f0c5581f568 100644
--- a/clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -376,8 +376,11 @@ llvm::SmallVector<ToolChain::BitCodeLibraryInfo, 12>
HIPAMDToolChain::getDeviceLibs(const llvm::opt::ArgList &DriverArgs,
Action::OffloadKind DeviceOffloadingKind) const {
llvm::SmallVector<BitCodeLibraryInfo, 12> BCLibs;
+ const llvm::Triple &TT = getEffectiveTriple();
+
if (!DriverArgs.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib,
true) ||
+ TT.getEnvironment() == llvm::Triple::LLVM ||
getGPUArch(DriverArgs) == "amdgcnspirv")
return {};
ArgStringList LibraryPaths;
diff --git a/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/amdgcn-amd-amdhsa-llvm/gfx90a/libclc.bc b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/amdgcn-amd-amdhsa-llvm/gfx90a/libclc.bc
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/amdgcn-amd-amdhsa-llvm/libclc.bc b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/amdgcn-amd-amdhsa-llvm/libclc.bc
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/clang/test/Driver/hip-device-libs-llvm-env.hip b/clang/test/Driver/hip-device-libs-llvm-env.hip
new file mode 100644
index 0000000000000..7f3c4c9b7af10
--- /dev/null
+++ b/clang/test/Driver/hip-device-libs-llvm-env.hip
@@ -0,0 +1,11 @@
+// Do not use device library with llvm environment
+// RUN: %clang -### --target=x86_64-linux-gnu -nogpuinc \
+// RUN: --offload-targets=amdgcn-amd-amdhsa-llvm --offload-arch=gfx90a \
+// RUN: -resource-dir=%S/Inputs/rocm_resource_dir \
+// RUN: %S/Inputs/hip_multiple_inputs/b.hip \
+// RUN: 2>&1 | FileCheck --check-prefix=LLVMENV %s
+
+// LLVMENV-NOT: -mlink-builtin-bitcode
+// LLVMENV-NOT: oclc
+// LLVMENV-NOT: ocml
+// LLVMENV-NOT: ockl
diff --git a/clang/test/Driver/opencl-libclc.cl b/clang/test/Driver/opencl-libclc.cl
index f7428aeb9f922..d2ec8458442c7 100644
--- a/clang/test/Driver/opencl-libclc.cl
+++ b/clang/test/Driver/opencl-libclc.cl
@@ -19,3 +19,26 @@
// RUN: -resource-dir %S/Inputs/resource_dir_with_per_target_subdir \
// RUN: %s 2>&1 | FileCheck %s --check-prefix=CHECK-GENERIC
// CHECK-GENERIC: -mlink-builtin-bitcode{{.*}}resource_dir_with_per_target_subdir{{/|\\\\}}lib{{/|\\\\}}amdgcn-amd-amdhsa{{/|\\\\}}libclc.bc
+
+// RUN: %clang -### -target amdgcn-amd-amdhsa-llvm \
+// RUN: -resource-dir %S/Inputs/resource_dir_with_per_target_subdir \
+// RUN: %s 2>&1 | FileCheck %s --check-prefix=AMDGPU-LLVM-ENV
+// AMDGPU-LLVM-ENV: -mlink-builtin-bitcode{{.*}}resource_dir_with_per_target_subdir{{/|\\\\}}lib{{/|\\\\}}amdgcn-amd-amdhsa-llvm{{/|\\\\}}libclc.bc
+
+
+// RUN: %clang -### -target amdgcn-amd-amdhsa-llvm --no-offloadlib \
+// 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
+
+// Try with -nostdlib instead of --no-offloadlib
+// RUN: %clang -### -target amdgcn-amd-amdhsa-llvm -nostdlib \
+// 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
+
+// Try with -nodefaultlibs instead of -nostdlib
+// RUN: %clang -### -target amdgcn-amd-amdhsa-llvm -nodefaultlibs \
+// 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
diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index 3ab587c79cd12..70b4d96f211c5 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -154,7 +154,7 @@ endif()
# List of all targets. Note that some are added dynamically below.
set( LIBCLC_TARGETS_ALL
amdgcn--
- amdgcn-amd-amdhsa
+ amdgcn-amd-amdhsa-llvm
clspv--
clspv64--
r600--
@@ -207,7 +207,7 @@ include_directories( ${LLVM_INCLUDE_DIRS} )
set( r600--_devices cedar cypress barts cayman )
set( amdgcn--_devices tahiti )
set( amdgcn-mesa-mesa3d_devices ${amdgcn--_devices} )
-set( amdgcn-amd-amdhsa_devices none )
+set( amdgcn-amd-amdhsa-llvm_devices none )
set( clspv--_devices none )
set( clspv64--_devices none )
set( nvptx64--_devices none )
More information about the cfe-commits
mailing list