From 100d6a24e0f649ac270f9851ba500fe93f05cfc9 Mon Sep 17 00:00:00 2001 From: Steven Perron Date: Tue, 18 Jun 2024 09:34:20 -0400 Subject: [PATCH 1/3] Avoid adding types to default namespace Some of the types that have been added to the vk namespace were being added to the default namespace when compiling for DXIL. The if conditions were such that they would fall through to a default case. The solution is to explicitly add code that we should skip adding those builtin types when the vk namespace is not defined. Fixes #6646. --- tools/clang/lib/Sema/SemaHLSL.cpp | 24 ++++++++++++----- .../test/CodeGenSPIRV/vk.types.in.dxil.hlsl | 27 +++++++++++++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 tools/clang/test/CodeGenSPIRV/vk.types.in.dxil.hlsl diff --git a/tools/clang/lib/Sema/SemaHLSL.cpp b/tools/clang/lib/Sema/SemaHLSL.cpp index 5159a5c285..03862a49fc 100644 --- a/tools/clang/lib/Sema/SemaHLSL.cpp +++ b/tools/clang/lib/Sema/SemaHLSL.cpp @@ -3817,29 +3817,41 @@ class HLSLExternalSource : public ExternalSemaSource { recordDecl = m_ThreadNodeOutputRecordsTemplateDecl->getTemplatedDecl(); } #ifdef ENABLE_SPIRV_CODEGEN - else if (kind == AR_OBJECT_VK_SPIRV_TYPE && m_vkNSDecl) { + else if (kind == AR_OBJECT_VK_SPIRV_TYPE) { + if (!m_vkNSDecl) + continue; recordDecl = DeclareInlineSpirvType(*m_context, m_vkNSDecl, typeName, false); recordDecl->setImplicit(true); - } else if (kind == AR_OBJECT_VK_SPIRV_OPAQUE_TYPE && m_vkNSDecl) { + } else if (kind == AR_OBJECT_VK_SPIRV_OPAQUE_TYPE) { + if (!m_vkNSDecl) + continue; recordDecl = DeclareInlineSpirvType(*m_context, m_vkNSDecl, typeName, true); recordDecl->setImplicit(true); - } else if (kind == AR_OBJECT_VK_INTEGRAL_CONSTANT && m_vkNSDecl) { + } else if (kind == AR_OBJECT_VK_INTEGRAL_CONSTANT) { + if (!m_vkNSDecl) + continue; recordDecl = DeclareVkIntegralConstant(*m_context, m_vkNSDecl, typeName, &m_vkIntegralConstantTemplateDecl); recordDecl->setImplicit(true); - } else if (kind == AR_OBJECT_VK_LITERAL && m_vkNSDecl) { + } else if (kind == AR_OBJECT_VK_LITERAL) { + if (!m_vkNSDecl) + continue; recordDecl = DeclareTemplateTypeWithHandleInDeclContext( *m_context, m_vkNSDecl, typeName, 1, nullptr); recordDecl->setImplicit(true); m_vkLiteralTemplateDecl = recordDecl->getDescribedClassTemplate(); - } else if (kind == AR_OBJECT_VK_SPV_INTRINSIC_TYPE && m_vkNSDecl) { + } else if (kind == AR_OBJECT_VK_SPV_INTRINSIC_TYPE) { + if (!m_vkNSDecl) + continue; recordDecl = DeclareUIntTemplatedTypeWithHandleInDeclContext( *m_context, m_vkNSDecl, typeName, "id"); recordDecl->setImplicit(true); - } else if (kind == AR_OBJECT_VK_SPV_INTRINSIC_RESULT_ID && m_vkNSDecl) { + } else if (kind == AR_OBJECT_VK_SPV_INTRINSIC_RESULT_ID) { + if (!m_vkNSDecl) + continue; recordDecl = DeclareTemplateTypeWithHandleInDeclContext( *m_context, m_vkNSDecl, typeName, 1, nullptr); recordDecl->setImplicit(true); diff --git a/tools/clang/test/CodeGenSPIRV/vk.types.in.dxil.hlsl b/tools/clang/test/CodeGenSPIRV/vk.types.in.dxil.hlsl new file mode 100644 index 0000000000..71dc97f255 --- /dev/null +++ b/tools/clang/test/CodeGenSPIRV/vk.types.in.dxil.hlsl @@ -0,0 +1,27 @@ +// RUN: not %dxc -T ps_6_0 -E PSMain -fcgl %s -DINTEGRAL_CONSTANT 2>&1 | FileCheck %s --check-prefix=INTEGRAL_CONSTANT + +#ifdef INTEGRAL_CONSTANT +// INTEGRAL_CONSTANT: 5:14: error: unknown type name 'integral_constant' +static const integral_constant MyVar; +#endif + +// RUN: not %dxc -T ps_6_0 -E PSMain -fcgl %s -DSPIRV_TYPE 2>&1 | FileCheck %s --check-prefix=SPIRV_TYPE + +#ifdef SPIRV_TYPE +// SPIRV_TYPE: 12:14: error: unknown type name 'SpirvType' +static const SpirvType MyVar; +#endif + +// RUN: not %dxc -T ps_6_0 -E PSMain -fcgl %s -DSPIRV_OPAQUE_TYPE 2>&1 | FileCheck %s --check-prefix=SPIRV_OPAQUE_TYPE + +#ifdef SPIRV_OPAQUE_TYPE +// SPIRV_OPAQUE_TYPE: 19:14: error: unknown type name 'SpirvOpaqueType' +static const SpirvOpaqueType MyVar; +#endif + +// RUN: not %dxc -T ps_6_0 -E PSMain -fcgl %s -DLITERAL 2>&1 | FileCheck %s --check-prefix=LITERAL + +#ifdef LITERAL +// LITERAL: 26:14: error: unknown type name 'Literal' +static const Literal MyVar; +#endif From b30c138a8b52243a9d44dd1bd314ec68c85e0363 Mon Sep 17 00:00:00 2001 From: Steven Perron Date: Thu, 20 Jun 2024 10:49:52 -0400 Subject: [PATCH 2/3] Remove assert that is no longer true. --- tools/clang/lib/Sema/SemaHLSL.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/clang/lib/Sema/SemaHLSL.cpp b/tools/clang/lib/Sema/SemaHLSL.cpp index 03862a49fc..4df32f9a65 100644 --- a/tools/clang/lib/Sema/SemaHLSL.cpp +++ b/tools/clang/lib/Sema/SemaHLSL.cpp @@ -4517,8 +4517,6 @@ class HLSLExternalSource : public ExternalSemaSource { int startDepth = (templateArgCount == 0) ? 0 : 1; CXXRecordDecl *recordDecl = m_objectTypeDecls[i]; if (recordDecl == nullptr) { - DXASSERT(kind == AR_OBJECT_WAVE, - "else objects other than reserved not initialized"); continue; } From 25dcbdba07505d9cc9c6f13f8cae71a5b0d84577 Mon Sep 17 00:00:00 2001 From: Steven Perron Date: Fri, 21 Jun 2024 09:55:18 -0400 Subject: [PATCH 3/3] Make new test a sema test. --- .../test/CodeGenSPIRV/vk.types.in.dxil.hlsl | 27 ------------------- .../clang/test/SemaHLSL/vk.types.in.dxil.hlsl | 12 +++++++++ 2 files changed, 12 insertions(+), 27 deletions(-) delete mode 100644 tools/clang/test/CodeGenSPIRV/vk.types.in.dxil.hlsl create mode 100644 tools/clang/test/SemaHLSL/vk.types.in.dxil.hlsl diff --git a/tools/clang/test/CodeGenSPIRV/vk.types.in.dxil.hlsl b/tools/clang/test/CodeGenSPIRV/vk.types.in.dxil.hlsl deleted file mode 100644 index 71dc97f255..0000000000 --- a/tools/clang/test/CodeGenSPIRV/vk.types.in.dxil.hlsl +++ /dev/null @@ -1,27 +0,0 @@ -// RUN: not %dxc -T ps_6_0 -E PSMain -fcgl %s -DINTEGRAL_CONSTANT 2>&1 | FileCheck %s --check-prefix=INTEGRAL_CONSTANT - -#ifdef INTEGRAL_CONSTANT -// INTEGRAL_CONSTANT: 5:14: error: unknown type name 'integral_constant' -static const integral_constant MyVar; -#endif - -// RUN: not %dxc -T ps_6_0 -E PSMain -fcgl %s -DSPIRV_TYPE 2>&1 | FileCheck %s --check-prefix=SPIRV_TYPE - -#ifdef SPIRV_TYPE -// SPIRV_TYPE: 12:14: error: unknown type name 'SpirvType' -static const SpirvType MyVar; -#endif - -// RUN: not %dxc -T ps_6_0 -E PSMain -fcgl %s -DSPIRV_OPAQUE_TYPE 2>&1 | FileCheck %s --check-prefix=SPIRV_OPAQUE_TYPE - -#ifdef SPIRV_OPAQUE_TYPE -// SPIRV_OPAQUE_TYPE: 19:14: error: unknown type name 'SpirvOpaqueType' -static const SpirvOpaqueType MyVar; -#endif - -// RUN: not %dxc -T ps_6_0 -E PSMain -fcgl %s -DLITERAL 2>&1 | FileCheck %s --check-prefix=LITERAL - -#ifdef LITERAL -// LITERAL: 26:14: error: unknown type name 'Literal' -static const Literal MyVar; -#endif diff --git a/tools/clang/test/SemaHLSL/vk.types.in.dxil.hlsl b/tools/clang/test/SemaHLSL/vk.types.in.dxil.hlsl new file mode 100644 index 0000000000..41d9bd650a --- /dev/null +++ b/tools/clang/test/SemaHLSL/vk.types.in.dxil.hlsl @@ -0,0 +1,12 @@ +// RUN: %dxc -T ps_6_0 -E PSMain -fcgl %s -verify + +static const integral_constant MyVar; // expected-error{{unknown type name 'integral_constant'}} +static const SpirvType MyVar; // expected-error{{unknown type name 'SpirvType'}} +static const SpirvOpaqueType MyVar; // expected-error{{unknown type name 'SpirvOpaqueType'}} +static const Literal MyVar; // expected-error{{unknown type name 'Literal'}} + +float4 PSMain() : SV_TARGET +{ + return float4(1.0, 1.0, 1.0, 1.0); +} +