beanz created this revision. beanz added reviewers: aaron.ballman, Anastasia, kuhar, bogner, python3kgae. Herald added a project: All. beanz requested review of this revision. Herald added a project: clang.
HLSL Resource objects will have restrictions on use and codegen requirements. This patch is fairly minimal just adding the attribute with no spellings since it will only be attached by the HLSLExternalSemaSource. Depends on D1300017. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D130018 Files: clang/include/clang/Basic/Attr.td clang/include/clang/Basic/AttrDocs.td clang/lib/Sema/HLSLExternalSemaSource.cpp clang/test/AST/HLSL/RWBuffer-AST.hlsl Index: clang/test/AST/HLSL/RWBuffer-AST.hlsl =================================================================== --- clang/test/AST/HLSL/RWBuffer-AST.hlsl +++ clang/test/AST/HLSL/RWBuffer-AST.hlsl @@ -28,10 +28,12 @@ // 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: HLSLResourceAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit UAV // CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit h 'void *' // CHECK: ClassTemplateSpecializationDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> class RWBuffer definition // 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: HLSLResourceAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit UAV // CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit referenced h 'void *' Index: clang/lib/Sema/HLSLExternalSemaSource.cpp =================================================================== --- clang/lib/Sema/HLSLExternalSemaSource.cpp +++ clang/lib/Sema/HLSLExternalSemaSource.cpp @@ -107,6 +107,13 @@ return addMemberVariable("h", Record->getASTContext().VoidPtrTy, Access); } + BuiltinTypeDeclBuilder & + annotateResourceClass(HLSLResourceAttr::ResourceClass RC) { + Record->addAttr( + HLSLResourceAttr::CreateImplicit(Record->getASTContext(), RC)); + return *this; + } + static DeclRefExpr *lookupBuiltinFunction(ASTContext &AST, Sema &S, StringRef Name) { CXXScopeSpec SS; @@ -361,5 +368,6 @@ BuiltinTypeDeclBuilder(Record) .addHandleMember() .addDefaultHandleConstructor(*SemaPtr, ResourceClass::UAV) + .annotateResourceClass(HLSLResourceAttr::UAV) .completeDefinition(); } Index: clang/include/clang/Basic/AttrDocs.td =================================================================== --- clang/include/clang/Basic/AttrDocs.td +++ clang/include/clang/Basic/AttrDocs.td @@ -6467,6 +6467,24 @@ }]; } +def HLSLResourceDocs : Documentation { + let Category = DocCatType; + let Content = [{ +The HLSL ``resource`` attribute is not valid to manually specify in +HLSL. It is applied by the compiler to HLSL resource type objects enabling them +to be handled appropriately in CodeGen. + +Resource objects must be resolvable at compile time to a single declared +resource. Resources can only be declared in global scope, but local copies are +allowed as long as they can be optimized away. This allows dynamic indexing of +resources in loops and resources to be passed as parameters to functions as long +as the functions are inlined. + +The simplest way to view this restriction is that the default constructor for a +resource can only be used at translation unit scope. + }]; +} + def ClangRandomizeLayoutDocs : Documentation { let Category = DocCatDecl; let Heading = "randomize_layout, no_randomize_layout"; Index: clang/include/clang/Basic/Attr.td =================================================================== --- clang/include/clang/Basic/Attr.td +++ clang/include/clang/Basic/Attr.td @@ -4022,6 +4022,17 @@ let Documentation = [HLSLSV_ShaderTypeAttrDocs]; } +def HLSLResource : InheritableAttr { + let Spellings = []; + let Subjects = SubjectList<[Struct]>; + let LangOpts = [HLSL]; + let Args = [EnumArgument<"ResourceType", "ResourceClass", + ["SRV", "UAV", "CBuffer", "Sampler"], + ["SRV", "UAV", "CBuffer", "Sampler"] + >]; + let Documentation = [HLSLResourceDocs]; +} + def RandomizeLayout : InheritableAttr { let Spellings = [GCC<"randomize_layout">]; let Subjects = SubjectList<[Record]>;
Index: clang/test/AST/HLSL/RWBuffer-AST.hlsl =================================================================== --- clang/test/AST/HLSL/RWBuffer-AST.hlsl +++ clang/test/AST/HLSL/RWBuffer-AST.hlsl @@ -28,10 +28,12 @@ // 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: HLSLResourceAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit UAV // CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit h 'void *' // CHECK: ClassTemplateSpecializationDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> class RWBuffer definition // 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: HLSLResourceAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit UAV // CHECK-NEXT: FieldDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> implicit referenced h 'void *' Index: clang/lib/Sema/HLSLExternalSemaSource.cpp =================================================================== --- clang/lib/Sema/HLSLExternalSemaSource.cpp +++ clang/lib/Sema/HLSLExternalSemaSource.cpp @@ -107,6 +107,13 @@ return addMemberVariable("h", Record->getASTContext().VoidPtrTy, Access); } + BuiltinTypeDeclBuilder & + annotateResourceClass(HLSLResourceAttr::ResourceClass RC) { + Record->addAttr( + HLSLResourceAttr::CreateImplicit(Record->getASTContext(), RC)); + return *this; + } + static DeclRefExpr *lookupBuiltinFunction(ASTContext &AST, Sema &S, StringRef Name) { CXXScopeSpec SS; @@ -361,5 +368,6 @@ BuiltinTypeDeclBuilder(Record) .addHandleMember() .addDefaultHandleConstructor(*SemaPtr, ResourceClass::UAV) + .annotateResourceClass(HLSLResourceAttr::UAV) .completeDefinition(); } Index: clang/include/clang/Basic/AttrDocs.td =================================================================== --- clang/include/clang/Basic/AttrDocs.td +++ clang/include/clang/Basic/AttrDocs.td @@ -6467,6 +6467,24 @@ }]; } +def HLSLResourceDocs : Documentation { + let Category = DocCatType; + let Content = [{ +The HLSL ``resource`` attribute is not valid to manually specify in +HLSL. It is applied by the compiler to HLSL resource type objects enabling them +to be handled appropriately in CodeGen. + +Resource objects must be resolvable at compile time to a single declared +resource. Resources can only be declared in global scope, but local copies are +allowed as long as they can be optimized away. This allows dynamic indexing of +resources in loops and resources to be passed as parameters to functions as long +as the functions are inlined. + +The simplest way to view this restriction is that the default constructor for a +resource can only be used at translation unit scope. + }]; +} + def ClangRandomizeLayoutDocs : Documentation { let Category = DocCatDecl; let Heading = "randomize_layout, no_randomize_layout"; Index: clang/include/clang/Basic/Attr.td =================================================================== --- clang/include/clang/Basic/Attr.td +++ clang/include/clang/Basic/Attr.td @@ -4022,6 +4022,17 @@ let Documentation = [HLSLSV_ShaderTypeAttrDocs]; } +def HLSLResource : InheritableAttr { + let Spellings = []; + let Subjects = SubjectList<[Struct]>; + let LangOpts = [HLSL]; + let Args = [EnumArgument<"ResourceType", "ResourceClass", + ["SRV", "UAV", "CBuffer", "Sampler"], + ["SRV", "UAV", "CBuffer", "Sampler"] + >]; + let Documentation = [HLSLResourceDocs]; +} + def RandomizeLayout : InheritableAttr { let Spellings = [GCC<"randomize_layout">]; let Subjects = SubjectList<[Record]>;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits