1//===--- HLSLBuiltinTypeDeclBuilder.h - HLSL Builtin Type Decl Builder ---===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Helper classes for creating HLSL builtin class types. Used by external HLSL
10// sema source.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_SEMA_HLSLBUILTINTYPEDECLBUILDER_H
15#define LLVM_CLANG_SEMA_HLSLBUILTINTYPEDECLBUILDER_H
16
17#include "clang/AST/Type.h"
18#include "clang/Sema/Sema.h"
19#include "llvm/ADT/StringMap.h"
20
21using llvm::hlsl::ResourceClass;
22using llvm::hlsl::ResourceDimension;
23
24namespace clang {
25
26class ClassTemplateDecl;
27class NamespaceDecl;
28class CXXRecordDecl;
29class FieldDecl;
30
31namespace hlsl {
32
33// Builder for builtin HLSL class types such as HLSL resource classes.
34// Allows creating declaration of builtin types using the builder pattern
35// like this:
36//
37// Decl = BuiltinTypeDeclBuilder(Sema, Namespace, "BuiltinClassName")
38// .addSimpleTemplateParams({"T"}, Concept)
39// .finalizeForwardDeclaration();
40//
41// And then completing the type like this:
42//
43// BuiltinTypeDeclBuilder(Sema, Decl)
44// .addDefaultHandleConstructor();
45// .addLoadMethods()
46// .completeDefinition();
47//
48class BuiltinTypeDeclBuilder {
49private:
50 Sema &SemaRef;
51 CXXRecordDecl *Record = nullptr;
52 ClassTemplateDecl *Template = nullptr;
53 ClassTemplateDecl *PrevTemplate = nullptr;
54 NamespaceDecl *HLSLNamespace = nullptr;
55 llvm::StringMap<FieldDecl *> Fields;
56
57public:
58 friend struct TemplateParameterListBuilder;
59 friend struct BuiltinTypeMethodBuilder;
60
61 BuiltinTypeDeclBuilder(Sema &SemaRef, CXXRecordDecl *R);
62 BuiltinTypeDeclBuilder(Sema &SemaRef, NamespaceDecl *Namespace,
63 StringRef Name);
64 ~BuiltinTypeDeclBuilder();
65
66 BuiltinTypeDeclBuilder &addSimpleTemplateParams(ArrayRef<StringRef> Names,
67 ConceptDecl *CD);
68 BuiltinTypeDeclBuilder &
69 addSimpleTemplateParams(ArrayRef<StringRef> Names,
70 ArrayRef<QualType> DefaultTypes, ConceptDecl *CD);
71 CXXRecordDecl *finalizeForwardDeclaration() { return Record; }
72 BuiltinTypeDeclBuilder &completeDefinition();
73
74 BuiltinTypeDeclBuilder &
75 addMemberVariable(StringRef Name, QualType Type, llvm::ArrayRef<Attr *> Attrs,
76 AccessSpecifier Access = AccessSpecifier::AS_private);
77
78 BuiltinTypeDeclBuilder &
79 addBufferHandles(ResourceClass RC, bool IsROV, bool RawBuffer,
80 bool HasCounter,
81 AccessSpecifier Access = AccessSpecifier::AS_private);
82 BuiltinTypeDeclBuilder &
83 addTextureHandle(ResourceClass RC, bool IsROV, ResourceDimension RD,
84 AccessSpecifier Access = AccessSpecifier::AS_private);
85 BuiltinTypeDeclBuilder &addSamplerHandle();
86 BuiltinTypeDeclBuilder &addArraySubscriptOperators();
87
88 // Builtin types constructors
89 BuiltinTypeDeclBuilder &addDefaultHandleConstructor();
90 BuiltinTypeDeclBuilder &addCopyConstructor();
91 BuiltinTypeDeclBuilder &addCopyAssignmentOperator();
92
93 // Static create methods
94 BuiltinTypeDeclBuilder &addStaticInitializationFunctions(bool HasCounter);
95
96 // Builtin types methods
97 BuiltinTypeDeclBuilder &addLoadMethods();
98 BuiltinTypeDeclBuilder &addTextureLoadMethods(ResourceDimension Dim);
99 BuiltinTypeDeclBuilder &addByteAddressBufferLoadMethods();
100 BuiltinTypeDeclBuilder &addByteAddressBufferStoreMethods();
101 BuiltinTypeDeclBuilder &addSampleMethods(ResourceDimension Dim);
102 BuiltinTypeDeclBuilder &addSampleBiasMethods(ResourceDimension Dim);
103 BuiltinTypeDeclBuilder &addSampleGradMethods(ResourceDimension Dim);
104 BuiltinTypeDeclBuilder &addSampleLevelMethods(ResourceDimension Dim);
105 BuiltinTypeDeclBuilder &addSampleCmpMethods(ResourceDimension Dim);
106 BuiltinTypeDeclBuilder &addSampleCmpLevelZeroMethods(ResourceDimension Dim);
107 BuiltinTypeDeclBuilder &addGatherMethods(ResourceDimension Dim);
108 BuiltinTypeDeclBuilder &addGatherCmpMethods(ResourceDimension Dim);
109 BuiltinTypeDeclBuilder &addIncrementCounterMethod();
110 BuiltinTypeDeclBuilder &addDecrementCounterMethod();
111 BuiltinTypeDeclBuilder &addHandleAccessFunction(DeclarationName &Name,
112 bool IsConst, bool IsRef,
113 QualType ElemTy = QualType());
114 BuiltinTypeDeclBuilder &
115 addLoadWithStatusFunction(DeclarationName &Name, bool IsConst,
116 QualType ReturnTy = QualType());
117 BuiltinTypeDeclBuilder &addStoreFunction(DeclarationName &Name, bool IsConst,
118 QualType ValueType);
119 BuiltinTypeDeclBuilder &addAppendMethod();
120 BuiltinTypeDeclBuilder &addConsumeMethod();
121
122 BuiltinTypeDeclBuilder &addGetDimensionsMethodForBuffer();
123
124private:
125 BuiltinTypeDeclBuilder &addCreateFromBinding();
126 BuiltinTypeDeclBuilder &addCreateFromImplicitBinding();
127 BuiltinTypeDeclBuilder &addCreateFromBindingWithImplicitCounter();
128 BuiltinTypeDeclBuilder &addCreateFromImplicitBindingWithImplicitCounter();
129 BuiltinTypeDeclBuilder &addResourceMember(StringRef MemberName,
130 ResourceClass RC,
131 ResourceDimension RD, bool IsROV,
132 bool RawBuffer, bool IsCounter,
133 AccessSpecifier Access);
134 BuiltinTypeDeclBuilder &
135 addHandleMember(ResourceClass RC, ResourceDimension RD, bool IsROV,
136 bool RawBuffer,
137 AccessSpecifier Access = AccessSpecifier::AS_private);
138 BuiltinTypeDeclBuilder &
139 addCounterHandleMember(ResourceClass RC, bool IsROV, bool RawBuffer,
140 AccessSpecifier Access = AccessSpecifier::AS_private);
141 QualType getGatherReturnType();
142 FieldDecl *getResourceHandleField() const;
143 FieldDecl *getResourceCounterHandleField() const;
144 QualType getFirstTemplateTypeParam();
145 QualType getHandleElementType();
146 Expr *getConstantIntExpr(int value);
147 Expr *getConstantUnsignedIntExpr(unsigned value);
148 HLSLAttributedResourceType::Attributes getResourceAttrs() const;
149};
150
151} // namespace hlsl
152
153} // namespace clang
154
155#endif // LLVM_CLANG_SEMA_HLSLBUILTINTYPEDECLBUILDER_H
156