https://github.com/V-FEXrt updated https://github.com/llvm/llvm-project/pull/141086
>From 9868eef5e0752545c88e44ba2fb5d1929feb1e1a Mon Sep 17 00:00:00 2001 From: Ashley Coleman <ascole...@microsoft.com> Date: Thu, 22 May 2025 09:19:38 -0600 Subject: [PATCH 1/2] [HLSL] Add Buffer def to frontend --- clang/lib/Sema/HLSLExternalSemaSource.cpp | 13 ++ clang/test/SemaHLSL/BuiltIns/Buffers.hlsl | 114 ++++++++++++++++++ clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl | 4 +- .../SemaHLSL/BuiltIns/StructuredBuffers.hlsl | 4 +- 4 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 clang/test/SemaHLSL/BuiltIns/Buffers.hlsl diff --git a/clang/lib/Sema/HLSLExternalSemaSource.cpp b/clang/lib/Sema/HLSLExternalSemaSource.cpp index f09232a9db4da..b85f8fe9eacee 100644 --- a/clang/lib/Sema/HLSLExternalSemaSource.cpp +++ b/clang/lib/Sema/HLSLExternalSemaSource.cpp @@ -265,6 +265,19 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() { *SemaPtr, HLSLNamespace, /*isTypedBuffer*/ true); ConceptDecl *StructuredBufferConcept = constructBufferConceptDecl( *SemaPtr, HLSLNamespace, /*isTypedBuffer*/ false); + + Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "Buffer") + .addSimpleTemplateParams({"element_type"}, TypedBufferConcept) + .finalizeForwardDeclaration(); + + onCompletion(Decl, [this](CXXRecordDecl *Decl) { + setupBufferType(Decl, *SemaPtr, ResourceClass::SRV, /*IsROV=*/false, + /*RawBuffer=*/false) + .addArraySubscriptOperators() + .addLoadMethods() + .completeDefinition(); + }); + Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWBuffer") .addSimpleTemplateParams({"element_type"}, TypedBufferConcept) .finalizeForwardDeclaration(); diff --git a/clang/test/SemaHLSL/BuiltIns/Buffers.hlsl b/clang/test/SemaHLSL/BuiltIns/Buffers.hlsl new file mode 100644 index 0000000000000..477a16a454a9c --- /dev/null +++ b/clang/test/SemaHLSL/BuiltIns/Buffers.hlsl @@ -0,0 +1,114 @@ +// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify %s + +typedef vector<float, 3> float3; +typedef vector<double, 2> double2; +typedef vector<double, 3> double3; + + +// expected-error@+1 {{class template 'Buffer' requires template arguments}} +Buffer BufferErr1; + +// expected-error@+1 {{too few template arguments for class template 'Buffer'}} +Buffer<> BufferErr2; + +// test implicit Buffer concept +Buffer<int> r1; +Buffer<float> r2; +Buffer<float3> Buff; +Buffer<double2> r4; + +// expected-error@+4 {{constraints not satisfied for class template 'Buffer'}} +// expected-note@*:* {{template declaration from hidden source: template <typename element_type> requires __is_typed_resource_element_compatible<element_type> class Buffer}} +// expected-note@*:* {{because 'hlsl::Buffer<int>' does not satisfy '__is_typed_resource_element_compatible'}} +// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(hlsl::Buffer<int>)' evaluated to false}} +Buffer<Buffer<int> > r5; + +struct s { + int x; +}; + +struct Empty {}; + +template<typename T> struct TemplatedBuffer { + T a; +}; + +template<typename T> struct TemplatedVector { + vector<T, 4> v; +}; + +// structs not allowed +// expected-error@+4 {{constraints not satisfied for class template 'Buffer'}} +// expected-note@*:* {{template declaration from hidden source: template <typename element_type> requires __is_typed_resource_element_compatible<element_type> class Buffer}} +// expected-note@*:* {{because 's' does not satisfy '__is_typed_resource_element_compatible'}} +// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(s)' evaluated to false}} +Buffer<s> r6; +// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} +// expected-note@*:* {{because 'Empty' does not satisfy '__is_typed_resource_element_compatible'}} +// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(Empty)' evaluated to false}} +Buffer<Empty> r7; + +// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} +// expected-note@*:* {{because 'TemplatedBuffer<int>' does not satisfy '__is_typed_resource_element_compatible'}} +// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(TemplatedBuffer<int>)' evaluated to false}} +Buffer<TemplatedBuffer<int> > r8; +// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} +// expected-note@*:* {{because 'TemplatedVector<int>' does not satisfy '__is_typed_resource_element_compatible'}} +// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(TemplatedVector<int>)' evaluated to false}} +Buffer<TemplatedVector<int> > r9; + +// arrays not allowed +// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} +// expected-note@*:* {{because 'half[4]' does not satisfy '__is_typed_resource_element_compatible'}} +// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(half[4])' evaluated to false}} +Buffer<half[4]> r10; + +typedef vector<int, 8> int8; +// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} +// expected-note@*:* {{because 'vector<int, 8>' (vector of 8 'int' values) does not satisfy '__is_typed_resource_element_compatible'}} +// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(vector<int, 8>)' evaluated to false}} +Buffer<int8> r11; + +typedef int MyInt; +Buffer<MyInt> r12; + +// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} +// expected-note@*:* {{because 'bool' does not satisfy '__is_typed_resource_element_compatible'}} +// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(bool)' evaluated to false}} +Buffer<bool> r13; + +// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} +// expected-note@*:* {{because 'vector<bool, 2>' (vector of 2 'bool' values) does not satisfy '__is_typed_resource_element_compatible'}} +// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(vector<bool, 2>)' evaluated to false}} +Buffer<vector<bool, 2>> r14; + +enum numbers { one, two, three }; + +// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} +// expected-note@*:* {{because 'numbers' does not satisfy '__is_typed_resource_element_compatible'}} +// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(numbers)' evaluated to false}} +Buffer<numbers> r15; + +// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} +// expected-note@*:* {{because 'vector<double, 3>' (vector of 3 'double' values) does not satisfy '__is_typed_resource_element_compatible'}} +// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(vector<double, 3>)' evaluated to false}} +Buffer<double3> r16; + + +struct threeDoubles { + double a; + double b; + double c; +}; + +// expected-error@+3 {{constraints not satisfied for class template 'Buffer'}} +// expected-note@*:* {{because 'threeDoubles' does not satisfy '__is_typed_resource_element_compatible'}} +// expected-note@*:* {{because '__builtin_hlsl_is_typed_resource_element_compatible(threeDoubles)' evaluated to false}} +Buffer<threeDoubles> BufferErr3; + + +[numthreads(1,1,1)] +void main() { + (void)Buff.__handle; // expected-error {{'__handle' is a private member of 'hlsl::Buffer<vector<float, 3>>'}} + // expected-note@* {{implicitly declared private here}} +} diff --git a/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl b/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl index 91e96b995585f..b4f59393a1768 100644 --- a/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl +++ b/clang/test/SemaHLSL/BuiltIns/RWBuffers.hlsl @@ -14,7 +14,7 @@ RWBuffer<> BufferErr2; // test implicit RWBuffer concept RWBuffer<int> r1; RWBuffer<float> r2; -RWBuffer<float3> Buffer; +RWBuffer<float3> Buff; RWBuffer<double2> r4; // expected-error@+4 {{constraints not satisfied for class template 'RWBuffer'}} @@ -109,6 +109,6 @@ RWBuffer<threeDoubles> BufferErr3; [numthreads(1,1,1)] void main() { - (void)Buffer.__handle; // expected-error {{'__handle' is a private member of 'hlsl::RWBuffer<vector<float, 3>>'}} + (void)Buff.__handle; // expected-error {{'__handle' is a private member of 'hlsl::RWBuffer<vector<float, 3>>'}} // expected-note@* {{implicitly declared private here}} } diff --git a/clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl b/clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl index 991b04c80ac86..6596f73b25170 100644 --- a/clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl +++ b/clang/test/SemaHLSL/BuiltIns/StructuredBuffers.hlsl @@ -2,7 +2,7 @@ typedef vector<float, 3> float3; -StructuredBuffer<float3> Buffer; +StructuredBuffer<float3> Buff; // expected-error@+2 {{class template 'StructuredBuffer' requires template arguments}} // expected-note@*:* {{template declaration from hidden source: template <typename element_type> requires __is_structured_resource_element_compatible<element_type> class StructuredBuffer {}}} @@ -26,6 +26,6 @@ StructuredBuffer<Empty> BufferErr4; [numthreads(1,1,1)] void main() { - (void)Buffer.__handle; // expected-error {{'__handle' is a private member of 'hlsl::StructuredBuffer<vector<float, 3>>'}} + (void)Buff.__handle; // expected-error {{'__handle' is a private member of 'hlsl::StructuredBuffer<vector<float, 3>>'}} // expected-note@* {{implicitly declared private here}} } >From 81b977dfa47241f55e6d4354622d120bb661d6af Mon Sep 17 00:00:00 2001 From: Ashley Coleman <ascole...@microsoft.com> Date: Thu, 22 May 2025 13:09:41 -0600 Subject: [PATCH 2/2] Address comments --- clang/test/AST/HLSL/TypedBuffers-AST.hlsl | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/clang/test/AST/HLSL/TypedBuffers-AST.hlsl b/clang/test/AST/HLSL/TypedBuffers-AST.hlsl index dad1ef17a1f86..f716501a35ad9 100644 --- a/clang/test/AST/HLSL/TypedBuffers-AST.hlsl +++ b/clang/test/AST/HLSL/TypedBuffers-AST.hlsl @@ -1,11 +1,18 @@ // RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \ // RUN: -DRESOURCE=RWBuffer %s | FileCheck -DRESOURCE=RWBuffer -check-prefix=EMPTY %s // +// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \ +// RUN: -DRESOURCE=Buffer %s | FileCheck -DRESOURCE=Buffer -check-prefix=EMPTY %s +// // RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \ // RUN: -DRESOURCE=RWBuffer %s | FileCheck -DRESOURCE=RWBuffer \ // RUN: -check-prefixes=CHECK,CHECK-UAV %s +// +// RUN: %clang_cc1 -Wno-hlsl-implicit-binding -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \ +// RUN: -DRESOURCE=Buffer %s | FileCheck -DRESOURCE=Buffer \ +// RUN: -check-prefixes=CHECK,CHECK-SRV %s -// TODO: Add AST tests for Buffer and RasterizerOrderedBuffer here +// TODO: Add AST tests for RasterizerOrderedBuffer here // This test tests two different AST generations each typed buffer. // The "EMPTY" test mode verifies the AST generated by forward declaration @@ -54,6 +61,7 @@ RESOURCE<float> Buffer; // CHECK: FinalAttr {{.*}} Implicit final // CHECK-NEXT: FieldDecl {{.*}} implicit __handle '__hlsl_resource_t // CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] +// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // Default constructor @@ -125,7 +133,8 @@ RESOURCE<float> Buffer; // CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> // CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept' // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t -// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] +// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] +// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK-SAME: ' lvalue .__handle {{.*}} // CHECK-NEXT: CXXThisExpr {{.*}} 'const [[RESOURCE]]<element_type>' lvalue implicit this @@ -141,7 +150,8 @@ RESOURCE<float> Buffer; // CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> // CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept' // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t -// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] +// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] +// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK-SAME: ' lvalue .__handle {{.*}} // CHECK-NEXT: CXXThisExpr {{.*}} '[[RESOURCE]]<element_type>' lvalue implicit this @@ -159,7 +169,8 @@ RESOURCE<float> Buffer; // CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> // CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept' // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t -// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] +// CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] +// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK-SAME: ' lvalue .__handle {{.*}} // CHECK-NEXT: CXXThisExpr {{.*}} '[[RESOURCE]]<element_type>' lvalue implicit this @@ -173,4 +184,5 @@ RESOURCE<float> Buffer; // CHECK-NEXT: FinalAttr {{.*}} Implicit final // CHECK-NEXT: FieldDecl {{.*}} implicit referenced __handle '__hlsl_resource_t // CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] +// CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(float)]] _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits