https://github.com/bob80905 updated https://github.com/llvm/llvm-project/pull/101433
>From b17ddcc6f2081135125d6178b22d033bcf7c0998 Mon Sep 17 00:00:00 2001 From: Joshua Batista <jbati...@microsoft.com> Date: Wed, 31 Jul 2024 17:01:56 -0700 Subject: [PATCH 1/4] add attrs to handle in record decl, add ast dump test to verify --- clang/lib/CodeGen/CGHLSLRuntime.cpp | 24 +++++++++------- clang/lib/Sema/HLSLExternalSemaSource.cpp | 28 ++++++++----------- .../hlsl_resource_handle_attrs.hlsl | 14 ++++++++++ 3 files changed, 40 insertions(+), 26 deletions(-) create mode 100644 clang/test/ParserHLSL/hlsl_resource_handle_attrs.hlsl diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index 6a6aff594fb0f..a475d46966969 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -280,18 +280,22 @@ void CGHLSLRuntime::annotateHLSLResource(const VarDecl *D, GlobalVariable *GV) { const auto *RD = Ty->getAsCXXRecordDecl(); if (!RD) return; - const auto *HLSLResAttr = RD->getAttr<HLSLResourceAttr>(); - const auto *HLSLResClassAttr = RD->getAttr<HLSLResourceClassAttr>(); - if (!HLSLResAttr || !HLSLResClassAttr) - return; + // the resource related attributes are on the handle member + // inside the record decl + for (auto *FD : RD->fields()) { + const auto *HLSLResAttr = FD->getAttr<HLSLResourceAttr>(); + const auto *HLSLResClassAttr = FD->getAttr<HLSLResourceClassAttr>(); + if (!HLSLResAttr || !HLSLResClassAttr) + continue; - llvm::hlsl::ResourceClass RC = HLSLResClassAttr->getResourceClass(); - llvm::hlsl::ResourceKind RK = HLSLResAttr->getResourceKind(); - bool IsROV = HLSLResAttr->getIsROV(); - llvm::hlsl::ElementType ET = calculateElementType(CGM.getContext(), Ty); + llvm::hlsl::ResourceClass RC = HLSLResClassAttr->getResourceClass(); + llvm::hlsl::ResourceKind RK = HLSLResAttr->getResourceKind(); + bool IsROV = HLSLResAttr->getIsROV(); + llvm::hlsl::ElementType ET = calculateElementType(CGM.getContext(), Ty); - BufferResBinding Binding(D->getAttr<HLSLResourceBindingAttr>()); - addBufferResourceAnnotation(GV, RC, RK, IsROV, ET, Binding); + BufferResBinding Binding(D->getAttr<HLSLResourceBindingAttr>()); + addBufferResourceAnnotation(GV, RC, RK, IsROV, ET, Binding); + } } CGHLSLRuntime::BufferResBinding::BufferResBinding( diff --git a/clang/lib/Sema/HLSLExternalSemaSource.cpp b/clang/lib/Sema/HLSLExternalSemaSource.cpp index ca88d138aef5d..e651f9cd967f5 100644 --- a/clang/lib/Sema/HLSLExternalSemaSource.cpp +++ b/clang/lib/Sema/HLSLExternalSemaSource.cpp @@ -101,8 +101,9 @@ struct BuiltinTypeDeclBuilder { return *this; } - BuiltinTypeDeclBuilder & - addHandleMember(AccessSpecifier Access = AccessSpecifier::AS_private) { + BuiltinTypeDeclBuilder &addHandleMember( + ResourceClass RC, ResourceKind RK, + bool IsROV, AccessSpecifier Access = AccessSpecifier::AS_private) { if (Record->isCompleteDefinition()) return *this; QualType Ty = Record->getASTContext().VoidPtrTy; @@ -112,17 +113,13 @@ struct BuiltinTypeDeclBuilder { Ty = Record->getASTContext().getPointerType( QualType(TTD->getTypeForDecl(), 0)); } - return addMemberVariable("h", Ty, Access); - } - - BuiltinTypeDeclBuilder &annotateHLSLResource(ResourceClass RC, - ResourceKind RK, bool IsROV) { - if (Record->isCompleteDefinition()) - return *this; - Record->addAttr( - HLSLResourceClassAttr::CreateImplicit(Record->getASTContext(), RC)); - Record->addAttr( - HLSLResourceAttr::CreateImplicit(Record->getASTContext(), RK, IsROV)); + // add handle member + addMemberVariable("h", Ty, Access); + // add resource attributes to handle + auto *FD = Fields["h"]; + FD->addAttr(HLSLResourceClassAttr::CreateImplicit(FD->getASTContext(), RC)); + FD->addAttr( + HLSLResourceAttr::CreateImplicit(FD->getASTContext(), RK, IsROV)); return *this; } @@ -489,9 +486,8 @@ static BuiltinTypeDeclBuilder setupBufferType(CXXRecordDecl *Decl, Sema &S, ResourceClass RC, ResourceKind RK, bool IsROV) { return BuiltinTypeDeclBuilder(Decl) - .addHandleMember() - .addDefaultHandleConstructor(S, RC) - .annotateHLSLResource(RC, RK, IsROV); + .addHandleMember(RC, RK, IsROV) + .addDefaultHandleConstructor(S, RC); } void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() { diff --git a/clang/test/ParserHLSL/hlsl_resource_handle_attrs.hlsl b/clang/test/ParserHLSL/hlsl_resource_handle_attrs.hlsl new file mode 100644 index 0000000000000..6b7bcbc35b8f8 --- /dev/null +++ b/clang/test/ParserHLSL/hlsl_resource_handle_attrs.hlsl @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -ast-dump -o - %s | FileCheck %s + +// CHECK: -ClassTemplateDecl 0x{{[0-9a-f]+}} <<invalid sloc>> <invalid sloc> implicit RWBuffer +// CHECK: -CXXRecordDecl 0x{{[0-9a-f]+}} <<invalid sloc>> <invalid sloc> implicit class RWBuffer definition +// CHECK: -FieldDecl 0x{{[0-9a-f]+}} <<invalid sloc>> <invalid sloc> implicit h 'element_type *' +// CHECK: -HLSLResourceClassAttr 0x{{[0-9a-f]+}} <<invalid sloc>> Implicit UAV +// CHECK: -HLSLResourceAttr 0x{{[0-9a-f]+}} <<invalid sloc>> Implicit TypedBuffer +RasterizerOrderedBuffer<vector<float, 4> > BufferArray3[4] : register(u4, space1); + +// CHECK: -ClassTemplateSpecializationDecl 0x{{[0-9a-f]+}} <<invalid sloc>> <invalid sloc> class RWBuffer definition implicit_instantiation +// CHECK: -FieldDecl 0x{{[0-9a-f]+}} <<invalid sloc>> <invalid sloc> implicit referenced h 'float *' +// CHECK: -HLSLResourceClassAttr 0x{{[0-9a-f]+}} <<invalid sloc>> Implicit UAV +// CHECK: -HLSLResourceAttr 0x{{[0-9a-f]+}} <<invalid sloc>> Implicit TypedBuffer +RWBuffer<float> Buffer1; >From df4db590c73e39156f2c1ce69d140b0329b9dc95 Mon Sep 17 00:00:00 2001 From: Joshua Batista <jbati...@microsoft.com> Date: Wed, 31 Jul 2024 19:40:56 -0700 Subject: [PATCH 2/4] clang format --- clang/lib/CodeGen/CGHLSLRuntime.cpp | 4 ++-- clang/lib/Sema/HLSLExternalSemaSource.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index a475d46966969..defc79683e61f 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -280,7 +280,7 @@ void CGHLSLRuntime::annotateHLSLResource(const VarDecl *D, GlobalVariable *GV) { const auto *RD = Ty->getAsCXXRecordDecl(); if (!RD) return; - // the resource related attributes are on the handle member + // the resource related attributes are on the handle member // inside the record decl for (auto *FD : RD->fields()) { const auto *HLSLResAttr = FD->getAttr<HLSLResourceAttr>(); @@ -295,7 +295,7 @@ void CGHLSLRuntime::annotateHLSLResource(const VarDecl *D, GlobalVariable *GV) { BufferResBinding Binding(D->getAttr<HLSLResourceBindingAttr>()); addBufferResourceAnnotation(GV, RC, RK, IsROV, ET, Binding); - } + } } CGHLSLRuntime::BufferResBinding::BufferResBinding( diff --git a/clang/lib/Sema/HLSLExternalSemaSource.cpp b/clang/lib/Sema/HLSLExternalSemaSource.cpp index e651f9cd967f5..2f3aaa0bb228d 100644 --- a/clang/lib/Sema/HLSLExternalSemaSource.cpp +++ b/clang/lib/Sema/HLSLExternalSemaSource.cpp @@ -101,9 +101,9 @@ struct BuiltinTypeDeclBuilder { return *this; } - BuiltinTypeDeclBuilder &addHandleMember( - ResourceClass RC, ResourceKind RK, - bool IsROV, AccessSpecifier Access = AccessSpecifier::AS_private) { + BuiltinTypeDeclBuilder & + addHandleMember(ResourceClass RC, ResourceKind RK, bool IsROV, + AccessSpecifier Access = AccessSpecifier::AS_private) { if (Record->isCompleteDefinition()) return *this; QualType Ty = Record->getASTContext().VoidPtrTy; >From 5885434247bec27f09834b957a3105bb971227c5 Mon Sep 17 00:00:00 2001 From: Joshua Batista <jbati...@microsoft.com> Date: Wed, 31 Jul 2024 19:47:08 -0700 Subject: [PATCH 3/4] update ast test --- clang/test/AST/HLSL/RWBuffer-AST.hlsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/test/AST/HLSL/RWBuffer-AST.hlsl b/clang/test/AST/HLSL/RWBuffer-AST.hlsl index e95acb8896ba4..1f6ef60e121ea 100644 --- a/clang/test/AST/HLSL/RWBuffer-AST.hlsl +++ b/clang/test/AST/HLSL/RWBuffer-AST.hlsl @@ -30,9 +30,9 @@ RWBuffer<float> Buffer; // CHECK-NEXT: CXXRecordDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit class RWBuffer definition // CHECK: FinalAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit final +// CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit h 'element_type *' // CHECK-NEXT: HLSLResourceClassAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit UAV // CHECK-NEXT: HLSLResourceAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit TypedBuffer -// CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit h 'element_type *' // CHECK: CXXMethodDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> operator[] 'element_type &const (unsigned int) const' // CHECK-NEXT: ParmVarDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> Idx 'unsigned int' @@ -59,6 +59,6 @@ RWBuffer<float> Buffer; // CHECK: TemplateArgument type 'float' // CHECK-NEXT: BuiltinType 0x{{[0-9A-Fa-f]+}} 'float' // CHECK-NEXT: FinalAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit final +// CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit referenced h 'float *' // CHECK-NEXT: HLSLResourceClassAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit UAV // CHECK-NEXT: HLSLResourceAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit TypedBuffer -// CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit referenced h 'float *' >From 16fc4c7e84dff20515645126e873f04864e8318f Mon Sep 17 00:00:00 2001 From: Joshua Batista <jbati...@microsoft.com> Date: Thu, 1 Aug 2024 16:00:43 -0700 Subject: [PATCH 4/4] pass attrs to add to addmembervar fxn --- clang/lib/Sema/HLSLExternalSemaSource.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/clang/lib/Sema/HLSLExternalSemaSource.cpp b/clang/lib/Sema/HLSLExternalSemaSource.cpp index 2f3aaa0bb228d..4b04b08384a04 100644 --- a/clang/lib/Sema/HLSLExternalSemaSource.cpp +++ b/clang/lib/Sema/HLSLExternalSemaSource.cpp @@ -81,6 +81,7 @@ struct BuiltinTypeDeclBuilder { BuiltinTypeDeclBuilder & addMemberVariable(StringRef Name, QualType Type, + llvm::SmallVector<Attr *, 2> Attrs, AccessSpecifier Access = AccessSpecifier::AS_private) { if (Record->isCompleteDefinition()) return *this; @@ -96,6 +97,8 @@ struct BuiltinTypeDeclBuilder { nullptr, false, InClassInitStyle::ICIS_NoInit); Field->setAccess(Access); Field->setImplicit(true); + for (Attr *A : Attrs) + Field->addAttr(A); Record->addDecl(Field); Fields[Name] = Field; return *this; @@ -114,12 +117,12 @@ struct BuiltinTypeDeclBuilder { QualType(TTD->getTypeForDecl(), 0)); } // add handle member - addMemberVariable("h", Ty, Access); - // add resource attributes to handle - auto *FD = Fields["h"]; - FD->addAttr(HLSLResourceClassAttr::CreateImplicit(FD->getASTContext(), RC)); - FD->addAttr( - HLSLResourceAttr::CreateImplicit(FD->getASTContext(), RK, IsROV)); + llvm::SmallVector<Attr *, 2> Attrs; + Attrs.push_back( + HLSLResourceClassAttr::CreateImplicit(Record->getASTContext(), RC)); + Attrs.push_back( + HLSLResourceAttr::CreateImplicit(Record->getASTContext(), RK, IsROV)); + addMemberVariable("h", Ty, Attrs, Access); return *this; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits