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 <[email protected]>
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 <[email protected]>
---
 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'

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to