https://github.com/PrabbyDD updated https://github.com/llvm/llvm-project/pull/190840
>From 18508d94e3cde9cf47fa11fcc28803cc7966c5e4 Mon Sep 17 00:00:00 2001 From: PrabbyDD <[email protected]> Date: Mon, 6 Apr 2026 15:43:31 -0700 Subject: [PATCH 1/7] 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 <[email protected]> Date: Tue, 7 Apr 2026 13:04:38 -0700 Subject: [PATCH 2/7] [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 <[email protected]> Date: Tue, 7 Apr 2026 18:07:45 -0700 Subject: [PATCH 3/7] 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 <[email protected]> Date: Mon, 13 Apr 2026 07:40:35 -0700 Subject: [PATCH 4/7] 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 <[email protected]> Date: Mon, 13 Apr 2026 08:09:15 -0700 Subject: [PATCH 5/7] 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 <[email protected]> Date: Mon, 13 Apr 2026 08:34:40 -0700 Subject: [PATCH 6/7] 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 <[email protected]> Date: Mon, 13 Apr 2026 21:46:32 -0700 Subject: [PATCH 7/7] 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 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
