https://github.com/wenju-he created 
https://github.com/llvm/llvm-project/pull/197148

Fix libclc `spirv32-mesa-mesa3d` target build error: error: unknown target 
triple 'spirv32-mesa-mesa3d'

Fix libclc `spirv-mesa-mesa3d` target build error: error: SPIR-V target 
requires a Vulkan environment.

mesa3d is a valid OS in llvm triple. This PR enables libclc build for 
spirv32-mesa-mesa3d and spirv64-mesa-mesa3d targets.

Note previously spirv[64]-mesa3d- targets used spir[64]-unknown-unknown. This 
PR canonicalizes the triples to spirv32[64]-mesa-mesa3d.

>From ad5f035b66df9a0cb43b5526171279f47a1350f8 Mon Sep 17 00:00:00 2001
From: Wenju He <[email protected]>
Date: Tue, 12 May 2026 13:06:19 +0200
Subject: [PATCH] [clang] Allow mesa3d OS in spirv32 and spirv64 targets

Fix libclc `spirv32-mesa-mesa3d` target build error:
error: unknown target triple 'spirv32-mesa-mesa3d'

Fix libclc `spirv-mesa-mesa3d` target build error:
error: SPIR-V target requires a Vulkan environment.

mesa3d is a valid OS in llvm triple. This PR enables libclc build for
spirv32-mesa-mesa3d and spirv64-mesa-mesa3d targets.

Note previously spirv[64]-mesa3d- targets used spir[64]-unknown-unknown.
This PR canonicalizes the triples to spirv32[64]-mesa-mesa3d.
---
 clang/lib/Basic/Targets.cpp                   |  4 ++--
 clang/lib/Basic/Targets/SPIR.h                | 23 +++++++++++--------
 clang/test/Frontend/spirv-target-validation.c |  5 +++-
 3 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index ed88ae7173bad..0a1938b0bebd3 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -714,7 +714,7 @@ std::unique_ptr<TargetInfo> AllocateTarget(const 
llvm::Triple &Triple,
   }
   case llvm::Triple::spirv32: {
     if ((os != llvm::Triple::UnknownOS && os != llvm::Triple::ChipStar &&
-         os != llvm::Triple::Vulkan) ||
+         os != llvm::Triple::Vulkan && os != llvm::Triple::Mesa3D) ||
         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
       return nullptr;
     return std::make_unique<SPIRV32TargetInfo>(Triple, Opts);
@@ -723,7 +723,7 @@ std::unique_ptr<TargetInfo> AllocateTarget(const 
llvm::Triple &Triple,
     if (os == llvm::Triple::OSType::AMDHSA)
       return std::make_unique<SPIRV64AMDGCNTargetInfo>(Triple, Opts);
     if ((os != llvm::Triple::UnknownOS && os != llvm::Triple::ChipStar &&
-         os != llvm::Triple::Vulkan) ||
+         os != llvm::Triple::Vulkan && os != llvm::Triple::Mesa3D) ||
         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
       return nullptr;
     if (Triple.getVendor() == llvm::Triple::Intel)
diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index 399904e8a3286..261a8bd28a16a 100644
--- a/clang/lib/Basic/Targets/SPIR.h
+++ b/clang/lib/Basic/Targets/SPIR.h
@@ -351,12 +351,13 @@ 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.
+  // When targeting Vulkan, require a fully specified Vulkan environment
+  // (version + valid shader stage). Non-Vulkan OS triples (e.g. mesa3d)
+  // could be used for OpenCL SPIR-V.
   bool validateTarget(DiagnosticsEngine &Diags) const override {
-    if (getTriple().getOS() != llvm::Triple::Vulkan ||
-        getTriple().getVulkanVersion() == llvm::VersionTuple(0)) {
+    if (getTriple().getOS() != llvm::Triple::Vulkan)
+      return true;
+    if (getTriple().getVulkanVersion() == llvm::VersionTuple(0)) {
       Diags.Report(diag::err_target_spirv_requires_vulkan);
       return false;
     }
@@ -380,8 +381,10 @@ class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public 
BaseSPIRVTargetInfo {
            "Invalid architecture for 32-bit SPIR-V.");
     assert((getTriple().getOS() == llvm::Triple::UnknownOS ||
             getTriple().getOS() == llvm::Triple::ChipStar ||
-            getTriple().getOS() == llvm::Triple::Vulkan) &&
-           "32-bit SPIR-V target must use unknown, chipstar, or vulkan OS");
+            getTriple().getOS() == llvm::Triple::Vulkan ||
+            getTriple().getOS() == llvm::Triple::Mesa3D) &&
+           "32-bit SPIR-V target must use unknown, chipstar, vulkan, or mesa3d 
"
+           "OS");
     assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
            "32-bit SPIR-V target must use unknown environment type");
     PointerWidth = PointerAlign = 32;
@@ -405,8 +408,10 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public 
BaseSPIRVTargetInfo {
            "Invalid architecture for 64-bit SPIR-V.");
     assert((getTriple().getOS() == llvm::Triple::UnknownOS ||
             getTriple().getOS() == llvm::Triple::ChipStar ||
-            getTriple().getOS() == llvm::Triple::Vulkan) &&
-           "64-bit SPIR-V target must use unknown, chipstar, or vulkan OS");
+            getTriple().getOS() == llvm::Triple::Vulkan ||
+            getTriple().getOS() == llvm::Triple::Mesa3D) &&
+           "64-bit SPIR-V target must use unknown, chipstar, vulkan, or mesa3d 
"
+           "OS");
     assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
            "64-bit SPIR-V target must use unknown environment type");
     PointerWidth = PointerAlign = 64;
diff --git a/clang/test/Frontend/spirv-target-validation.c 
b/clang/test/Frontend/spirv-target-validation.c
index a463f7ffe7d90..1313c504c6d32 100644
--- a/clang/test/Frontend/spirv-target-validation.c
+++ b/clang/test/Frontend/spirv-target-validation.c
@@ -1,5 +1,8 @@
-// RUN: not %clang_cc1 -triple spirv %s 2>&1 | FileCheck %s 
--check-prefix=CHECK-VULKAN
+// RUN: not %clang_cc1 -triple spirv-unknown-vulkan1.0 %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
+// RUN: %clang_cc1 -triple spirv32-mesa-mesa3d %s -fsyntax-only 2>&1
+// RUN: %clang_cc1 -triple spirv64-mesa-mesa3d %s -fsyntax-only 2>&1
+// RUN: %clang_cc1 -triple spirv-mesa-mesa3d %s -fsyntax-only 2>&1
 
 // CHECK-VULKAN: error: SPIR-V target requires a Vulkan environment
 // CHECK-SHADER: error: SPIR-V target requires a valid shader stage environment

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

Reply via email to