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/3] 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/3] [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 0d88878aab7cb5043e720b40e63d59c76b586ca6 Mon Sep 17 00:00:00 2001
From: PrabbyDD <[email protected]>
Date: Tue, 7 Apr 2026 18:07:45 -0700
Subject: [PATCH 3/3] Fix formatting

---
 clang/lib/Frontend/CompilerInstance.cpp | 96 ++++++++++++-------------
 1 file changed, 44 insertions(+), 52 deletions(-)

diff --git a/clang/lib/Frontend/CompilerInstance.cpp 
b/clang/lib/Frontend/CompilerInstance.cpp
index 89898d3adfbae..efaf0b5cc7905 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -103,7 +103,8 @@ void CompilerInstance::setVerboseOutputStream(raw_ostream 
&Value) {
   VerboseOutputStream = &Value;
 }
 
-void CompilerInstance::setVerboseOutputStream(std::unique_ptr<raw_ostream> 
Value) {
+void CompilerInstance::setVerboseOutputStream(
+    std::unique_ptr<raw_ostream> Value) {
   OwnedVerboseOutputStream.swap(Value);
   VerboseOutputStream = OwnedVerboseOutputStream.get();
 }
@@ -113,7 +114,7 @@ void CompilerInstance::setAuxTarget(TargetInfo *Value) { 
AuxTarget = Value; }
 
 bool CompilerInstance::createTarget() {
 
-  // Validate Vulkan environment for SPIRV. 
+  // Validate Vulkan environment for SPIRV.
   llvm::Triple Triple(getInvocation().getTargetOpts().Triple);
   if (Triple.getArch() == llvm::Triple::spirv) {
     if (Triple.getOS() != llvm::Triple::Vulkan ||
@@ -197,9 +198,7 @@ void CompilerInstance::setASTContext(
     getASTConsumer().Initialize(getASTContext());
 }
 
-void CompilerInstance::setSema(Sema *S) {
-  TheSema.reset(S);
-}
+void CompilerInstance::setSema(Sema *S) { TheSema.reset(S); }
 
 void CompilerInstance::setASTConsumer(std::unique_ptr<ASTConsumer> Value) {
   Consumer = std::move(Value);
@@ -327,7 +326,7 @@ static void SetUpDiagnosticLog(DiagnosticOptions &DiagOpts,
 
   // Chain in the diagnostic client which will log the diagnostics.
   auto Logger = std::make_unique<LogDiagnosticPrinter>(*OS, DiagOpts,
-                                                        
std::move(StreamOwner));
+                                                       std::move(StreamOwner));
   if (CodeGenOpts)
     Logger->setDwarfDebugFlags(CodeGenOpts->DwarfDebugFlags);
   if (Diags.ownsClient()) {
@@ -608,7 +607,8 @@ struct ReadModuleNames : ASTReaderListener {
         Stack.push_back(M);
         while (!Stack.empty()) {
           Module *Current = Stack.pop_back_val();
-          if (Current->IsUnimportable) continue;
+          if (Current->IsUnimportable)
+            continue;
           Current->IsAvailable = true;
           auto SubmodulesRange = Current->submodules();
           llvm::append_range(Stack, SubmodulesRange);
@@ -702,16 +702,14 @@ IntrusiveRefCntPtr<ASTReader> 
CompilerInstance::createPCHExternalASTSource(
 
 // Code Completion
 
-static bool EnableCodeCompletion(Preprocessor &PP,
-                                 StringRef Filename,
-                                 unsigned Line,
-                                 unsigned Column) {
+static bool EnableCodeCompletion(Preprocessor &PP, StringRef Filename,
+                                 unsigned Line, unsigned Column) {
   // Tell the source manager to chop off the given file at a specific
   // line and column.
   auto Entry = PP.getFileManager().getOptionalFileRef(Filename);
   if (!Entry) {
     PP.getDiagnostics().Report(diag::err_fe_invalid_code_complete_file)
-      << Filename;
+        << Filename;
     return true;
   }
 
@@ -727,8 +725,8 @@ void CompilerInstance::createCodeCompletionConsumer() {
         getPreprocessor(), Loc.FileName, Loc.Line, Loc.Column,
         getFrontendOpts().CodeCompleteOpts, llvm::outs()));
     return;
-  } else if (EnableCodeCompletion(getPreprocessor(), Loc.FileName,
-                                  Loc.Line, Loc.Column)) {
+  } else if (EnableCodeCompletion(getPreprocessor(), Loc.FileName, Loc.Line,
+                                  Loc.Column)) {
     setCodeCompletionConsumer(nullptr);
     return;
   }
@@ -739,13 +737,9 @@ void CompilerInstance::createFrontendTimer() {
   FrontendTimer.reset(new llvm::Timer("frontend", "Front end", *timerGroup));
 }
 
-CodeCompleteConsumer *
-CompilerInstance::createCodeCompletionConsumer(Preprocessor &PP,
-                                               StringRef Filename,
-                                               unsigned Line,
-                                               unsigned Column,
-                                               const CodeCompleteOptions &Opts,
-                                               raw_ostream &OS) {
+CodeCompleteConsumer *CompilerInstance::createCodeCompletionConsumer(
+    Preprocessor &PP, StringRef Filename, unsigned Line, unsigned Column,
+    const CodeCompleteOptions &Opts, raw_ostream &OS) {
   if (EnableCodeCompletion(PP, Filename, Line, Column))
     return nullptr;
 
@@ -907,7 +901,7 @@ CompilerInstance::createOutputFileImpl(StringRef 
OutputPath, bool Binary,
 
 // Initialization Utilities
 
-bool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input){
+bool CompilerInstance::InitializeSourceManager(const FrontendInputFile &Input) 
{
   return InitializeSourceManager(Input, getDiagnostics(), getFileManager(),
                                  getSourceManager());
 }
@@ -921,7 +915,8 @@ bool CompilerInstance::InitializeSourceManager(const 
FrontendInputFile &Input,
       Input.getKind().getFormat() == InputKind::ModuleMap
           ? Input.isSystem() ? SrcMgr::C_System_ModuleMap
                              : SrcMgr::C_User_ModuleMap
-          : Input.isSystem() ? SrcMgr::C_System : SrcMgr::C_User;
+      : Input.isSystem() ? SrcMgr::C_System
+                         : SrcMgr::C_User;
 
   if (Input.isBuffer()) {
     SourceMgr.setMainFileID(SourceMgr.createFileID(Input.getBuffer(), Kind));
@@ -1452,7 +1447,7 @@ static bool readASTAfterCompileModule(CompilerInstance 
&ImportingInstance,
   // The ASTReader didn't diagnose the error, so conservatively report it.
   if (ReadResult == ASTReader::Missing || !Diags.hasErrorOccurred())
     Diags.Report(ModuleNameLoc, diag::err_module_not_built)
-      << Module->Name << SourceRange(ImportLoc, ModuleNameLoc);
+        << Module->Name << SourceRange(ImportLoc, ModuleNameLoc);
 
   return false;
 }
@@ -1671,29 +1666,29 @@ static void checkConfigMacro(Preprocessor &PP, 
StringRef ConfigMacro,
     // This macro was defined on the command line, then #undef'd later.
     // Complain.
     PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
-      << true << ConfigMacro << Mod->getFullModuleName();
+        << true << ConfigMacro << Mod->getFullModuleName();
     auto LatestDef = LatestLocalMD->getDefinition();
     assert(LatestDef.isUndefined() &&
            "predefined macro went away with no #undef?");
     PP.Diag(LatestDef.getUndefLocation(), diag::note_module_def_undef_here)
-      << true;
+        << true;
     return;
   } else if (!CmdLineDefinition) {
     // There was no definition for this macro in the command line,
     // but there was a local definition. Complain.
     PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
-      << false << ConfigMacro << Mod->getFullModuleName();
+        << false << ConfigMacro << Mod->getFullModuleName();
     PP.Diag(CurrentDefinition->getDefinitionLoc(),
             diag::note_module_def_undef_here)
-      << false;
+        << false;
   } else if (!CurrentDefinition->isIdenticalTo(*CmdLineDefinition, PP,
                                                /*Syntactically=*/true)) {
     // The macro definitions differ.
     PP.Diag(ImportLoc, diag::warn_module_config_macro_undef)
-      << false << ConfigMacro << Mod->getFullModuleName();
+        << false << ConfigMacro << Mod->getFullModuleName();
     PP.Diag(CurrentDefinition->getDefinitionLoc(),
             diag::note_module_def_undef_here)
-      << false;
+        << false;
   }
 }
 
@@ -1748,7 +1743,7 @@ void CompilerInstance::createASTReader() {
     TheASTReader->setDeserializationListener(
         getASTConsumer().GetASTDeserializationListener());
     getASTContext().setASTMutationListener(
-      getASTConsumer().GetASTMutationListener());
+        getASTConsumer().GetASTMutationListener());
   }
   getASTContext().setExternalSource(TheASTReader);
   if (hasSema())
@@ -1910,16 +1905,15 @@ ModuleLoadResult 
CompilerInstance::findOrCompileModuleAndReadAST(
   unsigned ARRFlags = Source == MS_ModuleCache
                           ? ASTReader::ARR_OutOfDate | ASTReader::ARR_Missing |
                                 ASTReader::ARR_TreatModuleWithErrorsAsOutOfDate
-                          : Source == MS_PrebuiltModulePath
-                                ? 0
-                                : ASTReader::ARR_ConfigurationMismatch;
-  switch (getASTReader()->ReadAST(ModuleFilename,
-                                  Source == MS_PrebuiltModulePath
-                                      ? serialization::MK_PrebuiltModule
-                                      : Source == MS_ModuleBuildPragma
-                                            ? serialization::MK_ExplicitModule
-                                            : serialization::MK_ImplicitModule,
-                                  ImportLoc, ARRFlags)) {
+                      : Source == MS_PrebuiltModulePath
+                          ? 0
+                          : ASTReader::ARR_ConfigurationMismatch;
+  switch (getASTReader()->ReadAST(
+      ModuleFilename,
+      Source == MS_PrebuiltModulePath  ? serialization::MK_PrebuiltModule
+      : Source == MS_ModuleBuildPragma ? serialization::MK_ExplicitModule
+                                       : serialization::MK_ImplicitModule,
+      ImportLoc, ARRFlags)) {
   case ASTReader::Success: {
     if (M)
       return M;
@@ -2019,8 +2013,7 @@ ModuleLoadResult 
CompilerInstance::findOrCompileModuleAndReadAST(
 }
 
 ModuleLoadResult
-CompilerInstance::loadModule(SourceLocation ImportLoc,
-                             ModuleIdPath Path,
+CompilerInstance::loadModule(SourceLocation ImportLoc, ModuleIdPath Path,
                              Module::NameVisibilityKind Visibility,
                              bool IsInclusionDirective) {
   // Determine what file we're searching from.
@@ -2255,7 +2248,7 @@ void 
CompilerInstance::createModuleFromSource(SourceLocation ImportLoc,
   FrontendInputFile Input(
       ModuleMapFileName,
       InputKind(getLanguageFromOptions(Invocation->getLangOpts()),
-                InputKind::ModuleMap, /*Preprocessed*/true));
+                InputKind::ModuleMap, /*Preprocessed*/ true));
 
   std::string NullTerminatedSource(Source.str());
 
@@ -2296,8 +2289,8 @@ void CompilerInstance::makeModuleVisible(Module *Mod,
   TheASTReader->makeModuleVisible(Mod, Visibility, ImportLoc);
 }
 
-GlobalModuleIndex *CompilerInstance::loadGlobalModuleIndex(
-    SourceLocation TriggerLoc) {
+GlobalModuleIndex *
+CompilerInstance::loadGlobalModuleIndex(SourceLocation TriggerLoc) {
   if (getPreprocessor()
           .getHeaderSearchInfo()
           .getSpecificModuleCachePath()
@@ -2343,7 +2336,8 @@ GlobalModuleIndex 
*CompilerInstance::loadGlobalModuleIndex(
 
     bool RecreateIndex = false;
     for (ModuleMap::module_iterator I = MMap.module_begin(),
-        E = MMap.module_end(); I != E; ++I) {
+                                    E = MMap.module_end();
+         I != E; ++I) {
       Module *TheModule = I->second;
       if (!TheModule->getASTFileKey()) {
         SmallVector<IdentifierLoc, 2> Path;
@@ -2375,15 +2369,13 @@ GlobalModuleIndex 
*CompilerInstance::loadGlobalModuleIndex(
 }
 
 // Check global module index for missing imports.
-bool
-CompilerInstance::lookupMissingImports(StringRef Name,
-                                       SourceLocation TriggerLoc) {
+bool CompilerInstance::lookupMissingImports(StringRef Name,
+                                            SourceLocation TriggerLoc) {
   // Look for the symbol in non-imported modules, but only if an error
   // actually occurred.
   if (!buildingModule()) {
     // Load global module index, or retrieve a previously loaded one.
-    GlobalModuleIndex *GlobalIndex = loadGlobalModuleIndex(
-      TriggerLoc);
+    GlobalModuleIndex *GlobalIndex = loadGlobalModuleIndex(TriggerLoc);
 
     // Only if we have a global index.
     if (GlobalIndex) {

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to