[clang] [clang][Driver][SPIRV] Add better error when SPIR-V tools is not found (PR #171704)
Nick Sarnie via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 10 13:09:47 PST 2025
https://github.com/sarnex created https://github.com/llvm/llvm-project/pull/171704
Today is SPIR-V Tools is not found, you get the below error:
```
clang: error: unable to execute command: posix_spawn failed: No such file or directory
clang: error: spirv-as command failed with exit code 1 (use -v to see invocation)
```
which is not exactly user friendly.
>From 28351868c2601284a81dbf562179e6f87338f652 Mon Sep 17 00:00:00 2001
From: Nick Sarnie <nick.sarnie at intel.com>
Date: Wed, 10 Dec 2025 13:05:27 -0800
Subject: [PATCH] [clang][Driver][SPIRV] Add better error when SPIR-V tools is
not found
Signed-off-by: Nick Sarnie <nick.sarnie at intel.com>
---
clang/include/clang/Basic/DiagnosticDriverKinds.td | 6 ++++++
clang/lib/Driver/ToolChains/SPIRV.cpp | 9 ++++++++-
clang/test/Driver/spirv-tools-err.c | 5 +++++
3 files changed, 19 insertions(+), 1 deletion(-)
create mode 100644 clang/test/Driver/spirv-tools-err.c
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 3e6f7a2a430ff..614ecd7b681be 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -93,6 +93,12 @@ def err_drv_hipspv_no_hip_path : Error<
"'--hip-path' must be specified when offloading to SPIR-V unless '-nogpuinc' "
"is given">;
+def err_drv_no_spv_tools : Error<"cannot find SPIR-V Tools binary '%0', which "
+ "is required for SPIR-V compilation. "
+ "It can be obtained from your system package "
+ "manager or from KhronosGroup/SPIRV-Tools "
+ "on GitHub">;
+
def err_drv_undetermined_gpu_arch : Error<
"cannot determine %0 architecture: %1; consider passing it via '%2'; "
"environment variable CLANG_TOOLCHAIN_PROGRAM_TIMEOUT specifies the tool "
diff --git a/clang/lib/Driver/ToolChains/SPIRV.cpp b/clang/lib/Driver/ToolChains/SPIRV.cpp
index 27de55cfebfc1..4d319fc5e61c7 100644
--- a/clang/lib/Driver/ToolChains/SPIRV.cpp
+++ b/clang/lib/Driver/ToolChains/SPIRV.cpp
@@ -64,7 +64,10 @@ void SPIRV::constructAssembleCommand(Compilation &C, const Tool &T,
std::string ExeCand = T.getToolChain().GetProgramPath(VersionedTool.c_str());
if (!llvm::sys::fs::can_execute(ExeCand))
ExeCand = T.getToolChain().GetProgramPath("spirv-as");
-
+ if (!llvm::sys::fs::can_execute(ExeCand)) {
+ C.getDriver().Diag(diag::err_drv_no_spv_tools) << "spirv-as";
+ return;
+ }
const char *Exec = C.getArgs().MakeArgString(ExeCand);
C.addCommand(std::make_unique<Command>(JA, T, ResponseFileSupport::None(),
Exec, CmdArgs, Input, Output));
@@ -133,6 +136,10 @@ void SPIRV::Linker::ConstructJob(Compilation &C, const JobAction &JA,
// the default linker (spirv-link).
if (Args.hasArg(options::OPT_sycl_link))
Linker = ToolChain.GetProgramPath("clang-sycl-linker");
+ else if (!llvm::sys::fs::can_execute(Linker)) {
+ C.getDriver().Diag(diag::err_drv_no_spv_tools) << getShortName();
+ return;
+ }
C.addCommand(std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
Args.MakeArgString(Linker), CmdArgs,
Inputs, Output));
diff --git a/clang/test/Driver/spirv-tools-err.c b/clang/test/Driver/spirv-tools-err.c
new file mode 100644
index 0000000000000..bc2da087baf37
--- /dev/null
+++ b/clang/test/Driver/spirv-tools-err.c
@@ -0,0 +1,5 @@
+// UNSUPPORTED: spirv-tools
+// RUN: env PATH='' not %clang -### --target=spirv64 --save-temps -v %s 2>&1 | FileCheck %s
+
+// CHECK: error: cannot find SPIR-V Tools binary 'spirv-as'
+// CHECK: error: cannot find SPIR-V Tools binary 'spirv-link'
More information about the cfe-commits
mailing list