[clang] 8f1e24a - [Clang] diagnosing missing Vulkan environment when using SPIR-V triple (#190840)

via cfe-commits cfe-commits at lists.llvm.org
Sat Apr 18 01:30:26 PDT 2026


Author: PrabbyDD
Date: 2026-04-18T10:30:22+02:00
New Revision: 8f1e24a207294f6454aa79ac9389c1093654cee5

URL: https://github.com/llvm/llvm-project/commit/8f1e24a207294f6454aa79ac9389c1093654cee5
DIFF: https://github.com/llvm/llvm-project/commit/8f1e24a207294f6454aa79ac9389c1093654cee5.diff

LOG: [Clang] diagnosing missing Vulkan environment when using SPIR-V triple (#190840)

When a user passes '-target spirv' without specififying a vulkan
environment ttriple, SPIRVTargetInfo will fire an assert instead of
throwing an error diagnostic. Added this diagnostic in
CompilerInstance::createTarget() before target is initialized. Fixes
https://github.com/llvm/llvm-project/issues/189964

Added: 
    clang/test/Frontend/spirv-target-validation.c

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/include/clang/Basic/DiagnosticFrontendKinds.td
    clang/lib/Basic/Targets/SPIR.h

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 46dc5bb97463e..638a813ca105b 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -444,6 +444,7 @@ Bug Fixes in This Version
   to "lambda" instead of "block". (#GH188661)
 - Fixed a crash on _BitInt(N) arrays where 129 ≤ N ≤ 192 due to incorrect array filler lowering. (#GH189643)
 - Fixed the behavior in C23 of ``auto``, by emitting an error when an array type is specified for a ``char *``. (#GH162694)
+- Fixed an issue where an assert was thrown instead of an error if no vulkan env was specified with ``--triple spirv``. (#GH189964)
 - Fixed incorrect rejection of ``auto`` with reordered declaration specifiers in C23. (#GH164121)
 - Fixed a crash where constexpr evaluation encountered invalid overrides. (#GH183290)
 - Fixed a crash when assigning to an element of an ``ext_vector_type`` with ``bool`` element type. (#GH189260)

diff  --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index 62b74574102e4..f384a97b6825e 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -43,6 +43,11 @@ def note_fe_backend_resource_limit: Note<"%0 (%1) exceeds limit (%2) in '%3'">,
 def remark_fe_backend_plugin: Remark<"%0">, BackendInfo, InGroup<RemarkBackendPlugin>;
 def note_fe_backend_plugin: Note<"%0">, BackendInfo;
 
+def err_target_spirv_requires_vulkan : Error<
+    "SPIR-V target requires a Vulkan environment">;
+def err_target_spirv_requires_shader_stage : Error<
+    "SPIR-V target requires a valid shader stage environment">;
+
 def warn_fe_override_module : Warning<
     "overriding the module target triple with %0">,
     InGroup<DiagGroup<"override-module">>;

diff  --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index 37fe4a970dfef..633eaf3803452 100644
--- a/clang/lib/Basic/Targets/SPIR.h
+++ b/clang/lib/Basic/Targets/SPIR.h
@@ -15,6 +15,8 @@
 
 #include "Targets.h"
 #include "clang/Basic/AddressSpaces.h"
+#include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/DiagnosticFrontend.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Basic/TargetOptions.h"
 #include "llvm/Support/Compiler.h"
@@ -341,12 +343,6 @@ class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRVTargetInfo {
       : BaseSPIRVTargetInfo(Triple, Opts) {
     assert(Triple.getArch() == llvm::Triple::spirv &&
            "Invalid architecture for Logical SPIR-V.");
-    assert(Triple.getOS() == llvm::Triple::Vulkan &&
-           Triple.getVulkanVersion() != llvm::VersionTuple(0) &&
-           "Logical SPIR-V requires a valid Vulkan environment.");
-    assert(Triple.getEnvironment() >= llvm::Triple::Pixel &&
-           Triple.getEnvironment() <= llvm::Triple::Amplification &&
-           "Logical SPIR-V environment must be a valid shader stage.");
     PointerWidth = PointerAlign = 64;
 
     // SPIR-V IDs are represented with a single 32-bit word.
@@ -355,6 +351,23 @@ class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRVTargetInfo {
     resetDataLayout();
   }
 
+  // SPIR-V targeting requires a fully specified Vulkan environment.
+  // SPIR-V requires the enviornment to be in a valid shader stage as well.
+  // Validate here before CreateTargetInfo() to emit a proper diagnostic.
+  bool validateTarget(DiagnosticsEngine &Diags) const override {
+    if (getTriple().getOS() != llvm::Triple::Vulkan ||
+        getTriple().getVulkanVersion() == llvm::VersionTuple(0)) {
+      Diags.Report(diag::err_target_spirv_requires_vulkan);
+      return false;
+    }
+    if (getTriple().getEnvironment() < llvm::Triple::Pixel ||
+        getTriple().getEnvironment() > llvm::Triple::Amplification) {
+      Diags.Report(diag::err_target_spirv_requires_shader_stage);
+      return false;
+    }
+    return true;
+  }
+
   void getTargetDefines(const LangOptions &Opts,
                         MacroBuilder &Builder) const override;
 };

diff  --git a/clang/test/Frontend/spirv-target-validation.c b/clang/test/Frontend/spirv-target-validation.c
new file mode 100644
index 0000000000000..a463f7ffe7d90
--- /dev/null
+++ b/clang/test/Frontend/spirv-target-validation.c
@@ -0,0 +1,7 @@
+// RUN: not %clang_cc1 -triple spirv %s 2>&1 | FileCheck %s --check-prefix=CHECK-VULKAN
+// RUN: not %clang_cc1 -triple spirv-vulkan-mlibc %s 2>&1 | FileCheck %s --check-prefix=CHECK-SHADER
+
+// CHECK-VULKAN: error: SPIR-V target requires a Vulkan environment
+// CHECK-SHADER: error: SPIR-V target requires a valid shader stage environment
+
+int main() { return 0; }


        


More information about the cfe-commits mailing list