[clang] [Clang] Permit `vulkan` as an OS for the SPIRV target architecture (PR #196101)

Joseph Huber via cfe-commits cfe-commits at lists.llvm.org
Wed May 6 08:48:49 PDT 2026


https://github.com/jhuber6 created https://github.com/llvm/llvm-project/pull/196101

Summary:
This is currently rejected in two places, the toolchain creation and the
target itself. For the target we just permit it in the same way we alloe
things like 'amdhsa'. For the driver, the current handling just assumed
everything with 'vulkan' was HLSL. This shouldn't be true so we check
the source file type, and only push through actual HLSL files.

This is intended to more canonically support the 'CLSPV' target that
google has.


>From e8defa05d75fb29eefbafef6645b9dfb09723921 Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Wed, 6 May 2026 10:44:40 -0500
Subject: [PATCH] [Clang] Permit `vulkan` as an OS for the SPIRV target
 architecture

Summary:
This is currently rejected in two places, the toolchain creation and the
target itself. For the target we just permit it in the same way we alloe
things like 'amdhsa'. For the driver, the current handling just assumed
everything with 'vulkan' was HLSL. This shouldn't be true so we check
the source file type, and only push through actual HLSL files.

This is intended to more canonically support the 'CLSPV' target that
google has.
---
 clang/lib/Basic/Targets.cpp          | 13 +++++++------
 clang/lib/Basic/Targets/SPIR.h       | 10 ++++++----
 clang/lib/Driver/Driver.cpp          |  5 ++++-
 clang/test/CodeGen/target-data.c     |  4 ++++
 clang/test/Driver/spirv-toolchain.cl |  4 ++++
 5 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index d9cac93fd2906..99fab175016ab 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -697,18 +697,19 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
     return std::make_unique<SPIRVTargetInfo>(Triple, Opts);
   }
   case llvm::Triple::spirv32: {
-    if ((os != llvm::Triple::UnknownOS && os != llvm::Triple::ChipStar) ||
+    if ((os != llvm::Triple::UnknownOS && os != llvm::Triple::ChipStar &&
+         os != llvm::Triple::Vulkan) ||
         Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
       return nullptr;
     return std::make_unique<SPIRV32TargetInfo>(Triple, Opts);
   }
   case llvm::Triple::spirv64: {
-    if ((os != llvm::Triple::UnknownOS && os != llvm::Triple::ChipStar) ||
-        Triple.getEnvironment() != llvm::Triple::UnknownEnvironment) {
-      if (os == llvm::Triple::OSType::AMDHSA)
-        return std::make_unique<SPIRV64AMDGCNTargetInfo>(Triple, Opts);
+    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) ||
+        Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
       return nullptr;
-    }
     if (Triple.getVendor() == llvm::Triple::Intel)
       return std::make_unique<SPIRV64IntelTargetInfo>(Triple, Opts);
     return std::make_unique<SPIRV64TargetInfo>(Triple, Opts);
diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index ebf0e8122edfe..399904e8a3286 100644
--- a/clang/lib/Basic/Targets/SPIR.h
+++ b/clang/lib/Basic/Targets/SPIR.h
@@ -379,8 +379,9 @@ class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public BaseSPIRVTargetInfo {
     assert(Triple.getArch() == llvm::Triple::spirv32 &&
            "Invalid architecture for 32-bit SPIR-V.");
     assert((getTriple().getOS() == llvm::Triple::UnknownOS ||
-            getTriple().getOS() == llvm::Triple::ChipStar) &&
-           "32-bit SPIR-V target must use unknown or chipstar OS");
+            getTriple().getOS() == llvm::Triple::ChipStar ||
+            getTriple().getOS() == llvm::Triple::Vulkan) &&
+           "32-bit SPIR-V target must use unknown, chipstar, or vulkan OS");
     assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
            "32-bit SPIR-V target must use unknown environment type");
     PointerWidth = PointerAlign = 32;
@@ -403,8 +404,9 @@ class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public BaseSPIRVTargetInfo {
     assert(Triple.getArch() == llvm::Triple::spirv64 &&
            "Invalid architecture for 64-bit SPIR-V.");
     assert((getTriple().getOS() == llvm::Triple::UnknownOS ||
-            getTriple().getOS() == llvm::Triple::ChipStar) &&
-           "64-bit SPIR-V target must use unknown or chipstar OS");
+            getTriple().getOS() == llvm::Triple::ChipStar ||
+            getTriple().getOS() == llvm::Triple::Vulkan) &&
+           "64-bit SPIR-V target must use unknown, chipstar, or vulkan OS");
     assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
            "64-bit SPIR-V target must use unknown environment type");
     PointerWidth = PointerAlign = 64;
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index a283abef09f32..529a55c0750e8 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -7162,7 +7162,10 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
       break;
     case llvm::Triple::Vulkan:
     case llvm::Triple::ShaderModel:
-      TC = std::make_unique<toolchains::HLSLToolChain>(*this, Target, Args);
+      if (usesInput(Args, types::isHLSL))
+        TC = std::make_unique<toolchains::HLSLToolChain>(*this, Target, Args);
+      else if (Target.isSPIRV())
+        TC = std::make_unique<toolchains::SPIRVToolChain>(*this, Target, Args);
       break;
     case llvm::Triple::ChipStar:
       TC = std::make_unique<toolchains::HIPSPVToolChain>(*this, Target, Args);
diff --git a/clang/test/CodeGen/target-data.c b/clang/test/CodeGen/target-data.c
index 6df20c728f71b..3912c22cc8814 100644
--- a/clang/test/CodeGen/target-data.c
+++ b/clang/test/CodeGen/target-data.c
@@ -260,3 +260,7 @@
 // RUN: %clang_cc1 -triple spirv64-amd-amdhsa -o - -emit-llvm %s | \
 // RUN: FileCheck %s -check-prefix=AMDGPUSPIRV64
 // AMDGPUSPIRV64: target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n32:64-S32-G1-P4-A0"
+
+// RUN: %clang_cc1 -triple spirv64-unknown-vulkan -o - -emit-llvm %s | \
+// RUN: FileCheck %s -check-prefix=SPIRV64VULKAN
+// SPIRV64VULKAN: target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64-G1"
diff --git a/clang/test/Driver/spirv-toolchain.cl b/clang/test/Driver/spirv-toolchain.cl
index 54c794c77ea04..a2828898a5006 100644
--- a/clang/test/Driver/spirv-toolchain.cl
+++ b/clang/test/Driver/spirv-toolchain.cl
@@ -4,10 +4,14 @@
 // RUN: %clang -### --target=spirv64 -x ir -c %s 2>&1 | FileCheck --check-prefix=SPV64 %s
 // RUN: %clang -### --target=spirv64 -x clcpp -c %s 2>&1 | FileCheck --check-prefix=SPV64 %s
 // RUN: %clang -### --target=spirv64 -x c -c %s 2>&1 | FileCheck --check-prefix=SPV64 %s
+// RUN: %clang -### --target=spirv64-unknown-vulkan -x c -c %s 2>&1 | FileCheck --check-prefix=SPV64VK %s
 
 // SPV64: "-cc1" "-triple" "spirv64"
 // SPV64-SAME: "-o" {{".*o"}}
 
+// SPV64VK: "-cc1" "-triple" "spirv64-unknown-vulkan"
+// SPV64VK-SAME: "-o" {{".*o"}}
+
 // RUN: %clang -### --target=spirv32 -x cl -c %s 2>&1 | FileCheck --check-prefix=SPV32 %s
 // RUN: %clang -### --target=spirv32 %s 2>&1 | FileCheck --check-prefix=SPV32 %s
 // RUN: %clang -### --target=spirv32 -x ir -c %s 2>&1 | FileCheck --check-prefix=SPV32 %s



More information about the cfe-commits mailing list