From 6e84eb0149b67fd8d67c2ab2d7aba2fb496ef17e Mon Sep 17 00:00:00 2001 From: Manuel Carrasco Date: Thu, 11 Dec 2025 06:09:39 -0600 Subject: [PATCH 1/4] [clang][Driver] SPIRVAMDToolChain must not require device libs. Prior to this changes, the toolchain was looking for device libs and failing. This is fixed by not looking for device libs (for SPIR-V). --- clang/lib/Driver/ToolChains/HIPAMD.cpp | 9 +++++++++ clang/lib/Driver/ToolChains/HIPAMD.h | 5 +++++ clang/test/Driver/spirv-amd-toolchain.c | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index f2f64922cb404..810218e1e5748 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -466,3 +466,12 @@ Tool *SPIRVAMDToolChain::buildLinker() const { assert(getTriple().getArch() == llvm::Triple::spirv64); return new tools::AMDGCN::Linker(*this); } + +void SPIRVAMDToolChain::addClangTargetOptions( + const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, + Action::OffloadKind DeviceOffloadingKind) const { + // For SPIR-V we must not link any device libraries, so we call the + // AMDGPUToolChain impl instead of the ROCMToolChain one. + AMDGPUToolChain::addClangTargetOptions(DriverArgs, CC1Args, + DeviceOffloadingKind); +} diff --git a/clang/lib/Driver/ToolChains/HIPAMD.h b/clang/lib/Driver/ToolChains/HIPAMD.h index 30fc01a2f8e40..d04e805f7e30c 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.h +++ b/clang/lib/Driver/ToolChains/HIPAMD.h @@ -104,6 +104,11 @@ class LLVM_LIBRARY_VISIBILITY SPIRVAMDToolChain final : public ROCMToolChain { SPIRVAMDToolChain(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args); + void + addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args, + Action::OffloadKind DeviceOffloadKind) const override; + protected: Tool *buildLinker() const override; }; diff --git a/clang/test/Driver/spirv-amd-toolchain.c b/clang/test/Driver/spirv-amd-toolchain.c index 8f1f0f33e53f9..91cd43622518d 100644 --- a/clang/test/Driver/spirv-amd-toolchain.c +++ b/clang/test/Driver/spirv-amd-toolchain.c @@ -12,7 +12,7 @@ // BINDINGS: # "spirv64-amd-amdhsa" - "clang", inputs: ["[[INPUT:.+]]"], output: "[[OUTPUT:.+]]" // BINDINGS: # "spirv64-amd-amdhsa" - "AMDGCN::Linker", inputs: ["[[OUTPUT]]"], output: "a.out" -// RUN: %clang -### --target=spirv64-amd-amdhsa %s -nogpulib -nogpuinc 2>&1 \ +// RUN: %clang -### --target=spirv64-amd-amdhsa %s 2>&1 \ // RUN: | FileCheck %s --check-prefix=INVOCATION // INVOCATION: "-cc1" "-triple" "spirv64-amd-amdhsa" {{.*}}"-disable-llvm-optzns" {{.*}} "-o" "[[OUTPUT:.+]]" "-x" "c" // INVOCATION: "{{.*}}llvm-link" "-o" "[[LINKED_OUTPUT:.+]]" "[[OUTPUT]]" From 5c7ecdbc72987ee0fb787a307ef14a13e7d4aece Mon Sep 17 00:00:00 2001 From: Manuel Carrasco Date: Thu, 11 Dec 2025 09:52:19 -0600 Subject: [PATCH 2/4] [Review] Revert last changes except its test case. --- clang/lib/Driver/ToolChains/HIPAMD.cpp | 9 --------- clang/lib/Driver/ToolChains/HIPAMD.h | 5 ----- 2 files changed, 14 deletions(-) diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index 810218e1e5748..f2f64922cb404 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -466,12 +466,3 @@ Tool *SPIRVAMDToolChain::buildLinker() const { assert(getTriple().getArch() == llvm::Triple::spirv64); return new tools::AMDGCN::Linker(*this); } - -void SPIRVAMDToolChain::addClangTargetOptions( - const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, - Action::OffloadKind DeviceOffloadingKind) const { - // For SPIR-V we must not link any device libraries, so we call the - // AMDGPUToolChain impl instead of the ROCMToolChain one. - AMDGPUToolChain::addClangTargetOptions(DriverArgs, CC1Args, - DeviceOffloadingKind); -} diff --git a/clang/lib/Driver/ToolChains/HIPAMD.h b/clang/lib/Driver/ToolChains/HIPAMD.h index d04e805f7e30c..30fc01a2f8e40 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.h +++ b/clang/lib/Driver/ToolChains/HIPAMD.h @@ -104,11 +104,6 @@ class LLVM_LIBRARY_VISIBILITY SPIRVAMDToolChain final : public ROCMToolChain { SPIRVAMDToolChain(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args); - void - addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, - llvm::opt::ArgStringList &CC1Args, - Action::OffloadKind DeviceOffloadKind) const override; - protected: Tool *buildLinker() const override; }; From 911051bd5c3e8b699701926767a055542df07299 Mon Sep 17 00:00:00 2001 From: Manuel Carrasco Date: Thu, 11 Dec 2025 09:54:45 -0600 Subject: [PATCH 3/4] [Review] Skip device lib linking in ROCMToolChain for SPIR-V. --- clang/lib/Driver/ToolChains/AMDGPU.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp index 87ccd40372681..8514a5123e3fa 100644 --- a/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -967,6 +967,8 @@ void ROCMToolChain::addClangTargetOptions( true)) return; + // For SPIR-V (SPIRVAMDToolChain) we must not link any device libraries so we skip it. + if (!this->getEffectiveTriple().isSPIRV()){ // Get the device name and canonicalize it const StringRef GpuArch = getGPUArch(DriverArgs); auto Kind = llvm::AMDGPU::parseArchAMDGCN(GpuArch); @@ -995,6 +997,7 @@ void ROCMToolChain::addClangTargetOptions( CC1Args.push_back(DriverArgs.MakeArgString(BCFile)); } } +} bool RocmInstallationDetector::checkCommonBitcodeLibs( StringRef GPUArch, StringRef LibDeviceFile, From 4ff79bf887b212508204edb9d92b6b62b961abb7 Mon Sep 17 00:00:00 2001 From: Manuel Carrasco Date: Thu, 11 Dec 2025 09:57:02 -0600 Subject: [PATCH 4/4] [Review] Early return instead. --- clang/lib/Driver/ToolChains/AMDGPU.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp index 8514a5123e3fa..30ece08008322 100644 --- a/clang/lib/Driver/ToolChains/AMDGPU.cpp +++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp @@ -967,8 +967,10 @@ void ROCMToolChain::addClangTargetOptions( true)) return; - // For SPIR-V (SPIRVAMDToolChain) we must not link any device libraries so we skip it. - if (!this->getEffectiveTriple().isSPIRV()){ + // For SPIR-V (SPIRVAMDToolChain) we must not link any device libraries so we + // skip it. + if (this->getEffectiveTriple().isSPIRV()) + return; // Get the device name and canonicalize it const StringRef GpuArch = getGPUArch(DriverArgs); auto Kind = llvm::AMDGPU::parseArchAMDGCN(GpuArch); @@ -997,7 +999,6 @@ void ROCMToolChain::addClangTargetOptions( CC1Args.push_back(DriverArgs.MakeArgString(BCFile)); } } -} bool RocmInstallationDetector::checkCommonBitcodeLibs( StringRef GPUArch, StringRef LibDeviceFile,