[clang] [Clang] diagnosing missing Vulkan environment when using SPIR-V triple (PR #190840)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 16 14:48:11 PDT 2026
https://github.com/PrabbyDD updated https://github.com/llvm/llvm-project/pull/190840
>From 18508d94e3cde9cf47fa11fcc28803cc7966c5e4 Mon Sep 17 00:00:00 2001
From: PrabbyDD <dhaliprabh at gmail.com>
Date: Mon, 6 Apr 2026 15:43:31 -0700
Subject: [PATCH 01/10] first PR attempt on SPIRV diagnositic
---
clang/include/clang/Basic/DiagnosticFrontendKinds.td | 3 +++
clang/lib/Frontend/CompilerInstance.cpp | 11 +++++++++++
2 files changed, 14 insertions(+)
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index 62b74574102e4..7fa858c0d50be 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -43,6 +43,9 @@ 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_spirv_requires_vulkan : Error
+ "SPIR-V target requires a Vulkan environment, e.g. '-target spirv64-unknown-vulkan1.3'">;
+
def warn_fe_override_module : Warning<
"overriding the module target triple with %0">,
InGroup<DiagGroup<"override-module">>;
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index 0b00ad7128c00..89898d3adfbae 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -112,6 +112,17 @@ void CompilerInstance::setTarget(TargetInfo *Value) { Target = Value; }
void CompilerInstance::setAuxTarget(TargetInfo *Value) { AuxTarget = Value; }
bool CompilerInstance::createTarget() {
+
+ // Validate Vulkan environment for SPIRV.
+ llvm::Triple Triple(getInvocation().getTargetOpts().Triple);
+ if (Triple.getArch() == llvm::Triple::spirv) {
+ if (Triple.getOS() != llvm::Triple::Vulkan ||
+ Triple.getVulkanVersion() == llvm::VersionTuple(0)) {
+ getDiagnostics().Report(diag::err_spirv_requires_vulkan) << Triple.str();
+ return false;
+ }
+ }
+
// Create the target instance.
setTarget(TargetInfo::CreateTargetInfo(getDiagnostics(),
getInvocation().getTargetOpts()));
>From 2b0276129061915fc82c1639439c7b733215e196 Mon Sep 17 00:00:00 2001
From: PrabbyDD <dhaliprabh at gmail.com>
Date: Tue, 7 Apr 2026 13:04:38 -0700
Subject: [PATCH 02/10] [clang] generate diagnostic error instead of assert for
invalid SPIR-V target for release
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 #189964
---
clang/include/clang/Basic/DiagnosticFrontendKinds.td | 4 ++--
clang/test/Driver/spirv-target-validation.c | 4 ++++
2 files changed, 6 insertions(+), 2 deletions(-)
create mode 100644 clang/test/Driver/spirv-target-validation.c
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index 7fa858c0d50be..0a3e4e82a79e5 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -43,8 +43,8 @@ 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_spirv_requires_vulkan : Error
- "SPIR-V target requires a Vulkan environment, e.g. '-target spirv64-unknown-vulkan1.3'">;
+def err_spirv_requires_vulkan : Error<
+ "SPIR-V target requires a Vulkan environment (e.g. '-target spirv64-unknown-vulkan1.3')">;
def warn_fe_override_module : Warning<
"overriding the module target triple with %0">,
diff --git a/clang/test/Driver/spirv-target-validation.c b/clang/test/Driver/spirv-target-validation.c
new file mode 100644
index 0000000000000..cde5b46c54b94
--- /dev/null
+++ b/clang/test/Driver/spirv-target-validation.c
@@ -0,0 +1,4 @@
+// RUN: %clang -target spirv %s 2>&1 | FileCheck %s
+// CHECK: error: SPIR-V target requires a Vulkan environment
+
+int main() { return 0; }
\ No newline at end of file
>From 4c9d66e02d93864b6df3f4763f4ee5f354ec2c55 Mon Sep 17 00:00:00 2001
From: PrabbyDD <dhaliprabh at gmail.com>
Date: Tue, 7 Apr 2026 18:07:45 -0700
Subject: [PATCH 03/10] Fix formatting
---
clang/lib/Frontend/CompilerInstance.cpp | 3 ++-
clang/test/Driver/spirv-target-validation.c | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index 89898d3adfbae..bca4532cf2fa8 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -113,7 +113,8 @@ void CompilerInstance::setAuxTarget(TargetInfo *Value) { AuxTarget = Value; }
bool CompilerInstance::createTarget() {
- // Validate Vulkan environment for SPIRV.
+ // SPIR-V targeting requires a fully specified Vulkan environment.
+ // Validate here before CreateTargetInfo() to emit a proper diagnostic
llvm::Triple Triple(getInvocation().getTargetOpts().Triple);
if (Triple.getArch() == llvm::Triple::spirv) {
if (Triple.getOS() != llvm::Triple::Vulkan ||
diff --git a/clang/test/Driver/spirv-target-validation.c b/clang/test/Driver/spirv-target-validation.c
index cde5b46c54b94..c87e528c75350 100644
--- a/clang/test/Driver/spirv-target-validation.c
+++ b/clang/test/Driver/spirv-target-validation.c
@@ -1,4 +1,4 @@
-// RUN: %clang -target spirv %s 2>&1 | FileCheck %s
+// RUN: not %clang -target spirv %s 2>&1 | FileCheck %s
// CHECK: error: SPIR-V target requires a Vulkan environment
int main() { return 0; }
\ No newline at end of file
>From 2f67bdb5a42d39eb6b29cad31c6dab09660bca14 Mon Sep 17 00:00:00 2001
From: PrabbyDD <dhaliprabh at gmail.com>
Date: Mon, 13 Apr 2026 07:40:35 -0700
Subject: [PATCH 04/10] added release note
---
clang/docs/ReleaseNotes.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1601be699a604..b00d0375f6fd1 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -374,7 +374,7 @@ Bug Fixes in This Version
-------------------------
- Fixed atomic boolean compound assignment; the conversion back to atomic bool would be miscompiled. (#GH33210)
-
+- Fixed an issue where an assert was thrown instead of an error if no vulkan env was specified with -target spirv (#GH#189964)
- Fixed a failed assertion in the preprocessor when ``__has_embed`` parameters are missing parentheses. (#GH175088)
- Fix lifetime extension of temporaries in for-range-initializers in templates. (#GH165182)
- Fixed a preprocessor crash in ``__has_cpp_attribute`` on incomplete scoped attributes. (#GH178098)
>From 787ac61578806a265ce4457543d4dcef78803158 Mon Sep 17 00:00:00 2001
From: PrabbyDD <dhaliprabh at gmail.com>
Date: Mon, 13 Apr 2026 08:09:15 -0700
Subject: [PATCH 05/10] Renaming error and adding triple to error
---
clang/docs/ReleaseNotes.rst | 2 +-
clang/include/clang/Basic/DiagnosticFrontendKinds.td | 4 ++--
clang/lib/Frontend/CompilerInstance.cpp | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index b00d0375f6fd1..44cf68e182f63 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -374,7 +374,7 @@ Bug Fixes in This Version
-------------------------
- Fixed atomic boolean compound assignment; the conversion back to atomic bool would be miscompiled. (#GH33210)
-- Fixed an issue where an assert was thrown instead of an error if no vulkan env was specified with -target spirv (#GH#189964)
+- Fixed an issue where an assert was thrown instead of an error if no vulkan env was specified with -target spirv (#GH189964)
- Fixed a failed assertion in the preprocessor when ``__has_embed`` parameters are missing parentheses. (#GH175088)
- Fix lifetime extension of temporaries in for-range-initializers in templates. (#GH165182)
- Fixed a preprocessor crash in ``__has_cpp_attribute`` on incomplete scoped attributes. (#GH178098)
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index 0a3e4e82a79e5..7ccf21d3060f0 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -43,8 +43,8 @@ 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_spirv_requires_vulkan : Error<
- "SPIR-V target requires a Vulkan environment (e.g. '-target spirv64-unknown-vulkan1.3')">;
+def err_fe_spirv_requires_vulkan : Error<
+ "SPIR-V target '%0' requires a Vulkan environment (e.g. '-target spirv64-unknown-vulkan1.3')">;
def warn_fe_override_module : Warning<
"overriding the module target triple with %0">,
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index bca4532cf2fa8..c93d42d9bc4cc 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -119,7 +119,7 @@ bool CompilerInstance::createTarget() {
if (Triple.getArch() == llvm::Triple::spirv) {
if (Triple.getOS() != llvm::Triple::Vulkan ||
Triple.getVulkanVersion() == llvm::VersionTuple(0)) {
- getDiagnostics().Report(diag::err_spirv_requires_vulkan) << Triple.str();
+ getDiagnostics().Report(diag::err_fe_spirv_requires_vulkan) << Triple.str();
return false;
}
}
>From c4f935a8ba9a13994188b225621175a5420021df Mon Sep 17 00:00:00 2001
From: PrabbyDD <dhaliprabh at gmail.com>
Date: Mon, 13 Apr 2026 08:34:40 -0700
Subject: [PATCH 06/10] moved test to frontend directory
---
clang/test/{Driver => Frontend}/spirv-target-validation.c | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename clang/test/{Driver => Frontend}/spirv-target-validation.c (100%)
diff --git a/clang/test/Driver/spirv-target-validation.c b/clang/test/Frontend/spirv-target-validation.c
similarity index 100%
rename from clang/test/Driver/spirv-target-validation.c
rename to clang/test/Frontend/spirv-target-validation.c
>From ac84182a055d19dd396ea334cd9311110d84a6f8 Mon Sep 17 00:00:00 2001
From: PrabbyDD <dhaliprabh at gmail.com>
Date: Mon, 13 Apr 2026 21:46:32 -0700
Subject: [PATCH 07/10] removed some asserts from SPIR.h and added
validateTarget overridden function in there, as well as moved
spirv-target-validation test to Frontend, and removed validation code from
CompilerINstance.cpp, unknown yet if need to add asserts back in
CompilerInstance or SPIR.H
---
clang/lib/Basic/Targets/SPIR.h | 19 +++++++++++++------
clang/lib/Frontend/CompilerInstance.cpp | 12 ------------
clang/test/Frontend/spirv-target-validation.c | 2 +-
3 files changed, 14 insertions(+), 19 deletions(-)
diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index 5570a9c55a508..820d6ba7eb71a 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.
@@ -354,6 +350,17 @@ class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRVTargetInfo {
resetDataLayout();
}
+ // SPIR-V targeting requires a fully specified Vulkan environment.
+ // 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_fe_spirv_requires_vulkan) << getTriple().str();
+ return false;
+ }
+ return true;
+ }
+
void getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const override;
};
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index c93d42d9bc4cc..0b00ad7128c00 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -112,18 +112,6 @@ void CompilerInstance::setTarget(TargetInfo *Value) { Target = Value; }
void CompilerInstance::setAuxTarget(TargetInfo *Value) { AuxTarget = Value; }
bool CompilerInstance::createTarget() {
-
- // SPIR-V targeting requires a fully specified Vulkan environment.
- // Validate here before CreateTargetInfo() to emit a proper diagnostic
- llvm::Triple Triple(getInvocation().getTargetOpts().Triple);
- if (Triple.getArch() == llvm::Triple::spirv) {
- if (Triple.getOS() != llvm::Triple::Vulkan ||
- Triple.getVulkanVersion() == llvm::VersionTuple(0)) {
- getDiagnostics().Report(diag::err_fe_spirv_requires_vulkan) << Triple.str();
- return false;
- }
- }
-
// Create the target instance.
setTarget(TargetInfo::CreateTargetInfo(getDiagnostics(),
getInvocation().getTargetOpts()));
diff --git a/clang/test/Frontend/spirv-target-validation.c b/clang/test/Frontend/spirv-target-validation.c
index c87e528c75350..d5243e8a74071 100644
--- a/clang/test/Frontend/spirv-target-validation.c
+++ b/clang/test/Frontend/spirv-target-validation.c
@@ -1,4 +1,4 @@
// RUN: not %clang -target spirv %s 2>&1 | FileCheck %s
-// CHECK: error: SPIR-V target requires a Vulkan environment
+// CHECK: error: SPIR-V target '%0' requires a Vulkan environment (e.g. '-target spirv64-unknown-vulkan1.3')
int main() { return 0; }
\ No newline at end of file
>From d518156b0d2c521d31dd049e2afcefd5c49ed9a6 Mon Sep 17 00:00:00 2001
From: PrabbyDD <dhaliprabh at gmail.com>
Date: Wed, 15 Apr 2026 08:10:15 -0700
Subject: [PATCH 08/10] tidying up and changing error message
---
clang/docs/ReleaseNotes.rst | 2 +-
clang/include/clang/Basic/DiagnosticFrontendKinds.td | 2 +-
clang/lib/Basic/Targets/SPIR.h | 5 ++++-
clang/test/Frontend/spirv-target-validation.c | 4 ++--
4 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 44cf68e182f63..f13558f3bbd70 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -374,7 +374,6 @@ Bug Fixes in This Version
-------------------------
- Fixed atomic boolean compound assignment; the conversion back to atomic bool would be miscompiled. (#GH33210)
-- Fixed an issue where an assert was thrown instead of an error if no vulkan env was specified with -target spirv (#GH189964)
- Fixed a failed assertion in the preprocessor when ``__has_embed`` parameters are missing parentheses. (#GH175088)
- Fix lifetime extension of temporaries in for-range-initializers in templates. (#GH165182)
- Fixed a preprocessor crash in ``__has_cpp_attribute`` on incomplete scoped attributes. (#GH178098)
@@ -399,6 +398,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 ``-target spirv``. (#GH189964)
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index 7ccf21d3060f0..513e000821590 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -44,7 +44,7 @@ def remark_fe_backend_plugin: Remark<"%0">, BackendInfo, InGroup<RemarkBackendPl
def note_fe_backend_plugin: Note<"%0">, BackendInfo;
def err_fe_spirv_requires_vulkan : Error<
- "SPIR-V target '%0' requires a Vulkan environment (e.g. '-target spirv64-unknown-vulkan1.3')">;
+ "SPIR-V target requires a Vulkan environment (e.g. '-target spirv64-unknown-vulkan1.3')">;
def warn_fe_override_module : Warning<
"overriding the module target triple with %0">,
diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index 820d6ba7eb71a..61305b1cbbb91 100644
--- a/clang/lib/Basic/Targets/SPIR.h
+++ b/clang/lib/Basic/Targets/SPIR.h
@@ -355,9 +355,12 @@ class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRVTargetInfo {
bool validateTarget(DiagnosticsEngine &Diags) const override {
if (getTriple().getOS() != llvm::Triple::Vulkan ||
getTriple().getVulkanVersion() == llvm::VersionTuple(0)) {
- Diags.Report(diag::err_fe_spirv_requires_vulkan) << getTriple().str();
+ Diags.Report(diag::err_fe_spirv_requires_vulkan);
return false;
}
+ assert(getTriple().getEnvironment() >= llvm::Triple::Pixel &&
+ getTriple().getEnvironment() <= llvm::Triple::Amplification &&
+ "Logical SPIR-V environment must be a valid shader stage.");
return true;
}
diff --git a/clang/test/Frontend/spirv-target-validation.c b/clang/test/Frontend/spirv-target-validation.c
index d5243e8a74071..a6dab14cf19e1 100644
--- a/clang/test/Frontend/spirv-target-validation.c
+++ b/clang/test/Frontend/spirv-target-validation.c
@@ -1,4 +1,4 @@
-// RUN: not %clang -target spirv %s 2>&1 | FileCheck %s
+// RUN: not %clang_cc1 -target spirv %s 2>&1 | FileCheck %s
// CHECK: error: SPIR-V target '%0' requires a Vulkan environment (e.g. '-target spirv64-unknown-vulkan1.3')
-int main() { return 0; }
\ No newline at end of file
+int main() { return 0; }
>From d8523036bf6b76037553acc08e0d3324630efc7c Mon Sep 17 00:00:00 2001
From: PrabbyDD <dhaliprabh at gmail.com>
Date: Wed, 15 Apr 2026 08:14:36 -0700
Subject: [PATCH 09/10] I keep forgetting to modify the test in tandem with the
Diagnostic report changes...fixing that so test passes
---
clang/test/Frontend/spirv-target-validation.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/test/Frontend/spirv-target-validation.c b/clang/test/Frontend/spirv-target-validation.c
index a6dab14cf19e1..def98de0d9c27 100644
--- a/clang/test/Frontend/spirv-target-validation.c
+++ b/clang/test/Frontend/spirv-target-validation.c
@@ -1,4 +1,4 @@
// RUN: not %clang_cc1 -target spirv %s 2>&1 | FileCheck %s
-// CHECK: error: SPIR-V target '%0' requires a Vulkan environment (e.g. '-target spirv64-unknown-vulkan1.3')
+// CHECK: error: SPIR-V target requires a Vulkan environment (e.g. '-target spirv64-unknown-vulkan1.3')
int main() { return 0; }
>From fd3e09c635f993b6180ac3fa5d5b924ea358ec0a Mon Sep 17 00:00:00 2001
From: PrabbyDD <dhaliprabh at gmail.com>
Date: Thu, 16 Apr 2026 14:45:43 -0700
Subject: [PATCH 10/10] adding testing diagnostic for shader validation
---
clang/include/clang/Basic/DiagnosticFrontendKinds.td | 4 +++-
clang/lib/Basic/Targets/SPIR.h | 11 +++++++----
clang/test/Frontend/spirv-target-validation.c | 7 +++++--
3 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index 513e000821590..6cb856e893eba 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -44,7 +44,9 @@ def remark_fe_backend_plugin: Remark<"%0">, BackendInfo, InGroup<RemarkBackendPl
def note_fe_backend_plugin: Note<"%0">, BackendInfo;
def err_fe_spirv_requires_vulkan : Error<
- "SPIR-V target requires a Vulkan environment (e.g. '-target spirv64-unknown-vulkan1.3')">;
+ "SPIR-V target requires a Vulkan environment">;
+def err_fe_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">,
diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index 61305b1cbbb91..cb08fc9fc31df 100644
--- a/clang/lib/Basic/Targets/SPIR.h
+++ b/clang/lib/Basic/Targets/SPIR.h
@@ -351,16 +351,19 @@ class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRVTargetInfo {
}
// SPIR-V targeting requires a fully specified Vulkan environment.
- // Validate here before CreateTargetInfo() to emit a proper diagnostic
+ // 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_fe_spirv_requires_vulkan);
return false;
}
- assert(getTriple().getEnvironment() >= llvm::Triple::Pixel &&
- getTriple().getEnvironment() <= llvm::Triple::Amplification &&
- "Logical SPIR-V environment must be a valid shader stage.");
+ if (getTriple().getEnvironment() < llvm::Triple::Pixel ||
+ getTriple().getEnvironment() > llvm::Triple::Amplification) {
+ Diags.Report(diag::err_fe_spirv_requires_shader_stage);
+ return false;
+ }
return true;
}
diff --git a/clang/test/Frontend/spirv-target-validation.c b/clang/test/Frontend/spirv-target-validation.c
index def98de0d9c27..725def6e47cfb 100644
--- a/clang/test/Frontend/spirv-target-validation.c
+++ b/clang/test/Frontend/spirv-target-validation.c
@@ -1,4 +1,7 @@
-// RUN: not %clang_cc1 -target spirv %s 2>&1 | FileCheck %s
-// CHECK: error: SPIR-V target requires a Vulkan environment (e.g. '-target spirv64-unknown-vulkan1.3')
+// RUN: not %clang -target spirv %s 2>&1 | FileCheck %s --check-prefix=CHECK-VULKAN
+// RUN: not %clang -target spirv-unknown-vulkan1.3 %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