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 ) _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
