[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