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
