[Clang] Permit vulkan as an OS for the SPIRV target architecture (#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.
This commit is contained in:
Joseph Huber 2026-05-07 08:42:42 -05:00 committed by GitHub
parent 7554007c80
commit a8e787ef54
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 28 additions and 11 deletions

View file

@ -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);

View file

@ -379,8 +379,9 @@ public:
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 @@ public:
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;

View file

@ -7166,7 +7166,12 @@ 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 ((Target.getArch() == llvm::Triple::spirv32 ||
Target.getArch() == llvm::Triple::spirv64) &&
!usesInput(Args, types::isHLSL))
TC = std::make_unique<toolchains::SPIRVToolChain>(*this, Target, Args);
else
TC = std::make_unique<toolchains::HLSLToolChain>(*this, Target, Args);
break;
case llvm::Triple::ChipStar:
TC = std::make_unique<toolchains::HIPSPVToolChain>(*this, Target, Args);

View file

@ -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"

View file

@ -4,10 +4,15 @@
// 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
// RUN: %clang -### --target=spirv64-unknown-vulkan1.3 -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{{(1\.3)?}}"
// 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