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 = nullptr);
68 BuiltinTypeDeclBuilder &
69 addSimpleTemplateParams(ArrayRef<StringRef> Names,
70 ArrayRef<QualType> DefaultTypes, ConceptDecl *CD);
71 // Adds `<typename element_type, int sample_count = 0>` for multisampled
72 // textures, with \p CD constraining the element type. Unlike the other
73 // textures the element type has no default argument.
74 BuiltinTypeDeclBuilder &addMSTextureTemplateParams(StringRef ElementName,
75 StringRef SampleCountName,
76 ConceptDecl *CD);
77 CXXRecordDecl *finalizeForwardDeclaration() { return Record; }
78 BuiltinTypeDeclBuilder &completeDefinition();
79
80 BuiltinTypeDeclBuilder &
81 addMemberVariable(StringRef Name, QualType Type, llvm::ArrayRef<Attr *> Attrs,
82 AccessSpecifier Access = AccessSpecifier::AS_private);
83
84 BuiltinTypeDeclBuilder &
85 addBufferHandles(ResourceClass RC, bool IsROV, bool RawBuffer,
86 bool HasCounter,
87 AccessSpecifier Access = AccessSpecifier::AS_private);
88 BuiltinTypeDeclBuilder &
89 addTextureHandle(ResourceClass RC, bool IsROV, bool IsArray,
90 ResourceDimension RD, Expr *SampleCountExpr = nullptr,
91 AccessSpecifier Access = AccessSpecifier::AS_private);
92 BuiltinTypeDeclBuilder &addSamplerHandle();
93 BuiltinTypeDeclBuilder &addConstantBufferConversionToType();
94 BuiltinTypeDeclBuilder &
95 addArraySubscriptOperators(ResourceDimension Dim = ResourceDimension::Unknown,
96 bool IsArray = false);
97
98 // Builtin types constructors
99 BuiltinTypeDeclBuilder &addDefaultHandleConstructor(
100 AccessSpecifier Access = AccessSpecifier::AS_public);
101 BuiltinTypeDeclBuilder &
102 addHeapResourceInfoConstructor(bool HasCounter = false);
103 BuiltinTypeDeclBuilder &addHeapSamplerInfoConstructor();
104 BuiltinTypeDeclBuilder &
105 addCopyConstructor(AccessSpecifier Access = AccessSpecifier::AS_public);
106 BuiltinTypeDeclBuilder &addCopyAssignmentOperator(
107 AccessSpecifier Access = AccessSpecifier::AS_public);
108
109 // Static create methods
110 BuiltinTypeDeclBuilder &addStaticInitializationFunctions(bool HasCounter);
111
112 // Builtin types methods
113 BuiltinTypeDeclBuilder &addLoadMethods();
114 BuiltinTypeDeclBuilder &addTextureLoadMethods(ResourceDimension Dim,
115 bool IsArray = false);
116 BuiltinTypeDeclBuilder &addTextureLoadMSMethods(ResourceDimension Dim,
117 bool IsArray = false);
118 BuiltinTypeDeclBuilder &addRWTextureLoadMethods(ResourceDimension Dim,
119 bool IsArray = false);
120 BuiltinTypeDeclBuilder &addByteAddressBufferLoadMethods();
121 BuiltinTypeDeclBuilder &addByteAddressBufferStoreMethods();
122 BuiltinTypeDeclBuilder &addByteAddressBufferInterlockedMethods();
123 BuiltinTypeDeclBuilder &addSampleMethods(ResourceDimension Dim,
124 bool IsArray = false);
125 BuiltinTypeDeclBuilder &addSampleBiasMethods(ResourceDimension Dim,
126 bool IsArray = false);
127 BuiltinTypeDeclBuilder &addSampleGradMethods(ResourceDimension Dim,
128 bool IsArray = false);
129 BuiltinTypeDeclBuilder &addSampleLevelMethods(ResourceDimension Dim,
130 bool IsArray = false);
131 BuiltinTypeDeclBuilder &addSampleCmpMethods(ResourceDimension Dim,
132 bool IsArray = false);
133 BuiltinTypeDeclBuilder &addSampleCmpLevelZeroMethods(ResourceDimension Dim,
134 bool IsArray = false);
135 BuiltinTypeDeclBuilder &addCalculateLodMethods(ResourceDimension Dim);
136 BuiltinTypeDeclBuilder &addGatherMethods(ResourceDimension Dim,
137 bool IsArray = false);
138 BuiltinTypeDeclBuilder &addGatherCmpMethods(ResourceDimension Dim,
139 bool IsArray = false);
140 BuiltinTypeDeclBuilder &addIncrementCounterMethod();
141 BuiltinTypeDeclBuilder &addDecrementCounterMethod();
142 BuiltinTypeDeclBuilder &addHandleAccessFunction(DeclarationName &Name,
143 bool IsConstReturn,
144 bool IsRef, QualType IndexTy,
145 QualType ElemTy = QualType(),
146 bool TransposeResult = false);
147 BuiltinTypeDeclBuilder &
148 addLoadWithStatusFunction(DeclarationName &Name,
149 QualType ReturnTy = QualType());
150 BuiltinTypeDeclBuilder &addStoreFunction(DeclarationName &Name, bool IsConst,
151 QualType ValueType,
152 bool TransposeArg = false);
153 BuiltinTypeDeclBuilder &
154 addByteAddressBufferInterlockedMethod(StringRef MethodName, QualType ValueTy,
155 StringRef BuiltinName,
156 bool RequiresOriginalValue = false);
157 BuiltinTypeDeclBuilder &addByteAddressBufferInterlockedCompareMethod(
158 StringRef MethodName, QualType ValueTy, StringRef BuiltinName,
159 bool WithOriginalValue = false);
160 BuiltinTypeDeclBuilder &addAppendMethod();
161 BuiltinTypeDeclBuilder &addConsumeMethod();
162
163 BuiltinTypeDeclBuilder &addGetDimensionsMethodForBuffer();
164 BuiltinTypeDeclBuilder &addGetDimensionsMethods(ResourceDimension Dim);
165 BuiltinTypeDeclBuilder &addMipsMember(ResourceDimension Dim);
166
167private:
168 BuiltinTypeDeclBuilder &addCreateFromBinding();
169 BuiltinTypeDeclBuilder &addCreateFromImplicitBinding();
170 BuiltinTypeDeclBuilder &addCreateFromBindingWithImplicitCounter();
171 BuiltinTypeDeclBuilder &addCreateFromImplicitBindingWithImplicitCounter();
172 BuiltinTypeDeclBuilder &
173 addResourceMember(StringRef MemberName, ResourceClass RC,
174 ResourceDimension RD, bool IsROV, bool RawBuffer,
175 bool IsCounter, bool IsArray, QualType ElementTy,
176 Expr *SampleCountExpr = nullptr,
177 AccessSpecifier Access = AccessSpecifier::AS_private);
178 BuiltinTypeDeclBuilder &addFriend(CXXRecordDecl *Friend);
179 CXXRecordDecl *addPrivateNestedRecord(StringRef Name);
180 CXXRecordDecl *addMipsSliceType(ResourceDimension Dim, QualType ReturnType);
181 CXXRecordDecl *addMipsType(ResourceDimension Dim, QualType ReturnType);
182 BuiltinTypeDeclBuilder &
183 addHandleMember(ResourceClass RC, ResourceDimension RD, bool IsROV,
184 bool RawBuffer, bool IsArray, QualType ElementTy,
185 AccessSpecifier Access = AccessSpecifier::AS_private);
186 BuiltinTypeDeclBuilder &
187 addCounterHandleMember(ResourceClass RC, bool IsROV, bool RawBuffer,
188 QualType ElementTy,
189 AccessSpecifier Access = AccessSpecifier::AS_private);
190 QualType getGatherReturnType();
191 BuiltinTypeDeclBuilder &addDerivativeAvailability(StringRef MethodName);
192 FieldDecl *getResourceHandleField() const;
193 FieldDecl *getResourceCounterHandleField() const;
194 QualType getFirstTemplateTypeParam();
195 QualType getHandleElementType();
196 Expr *getConstantIntExpr(int value);
197 Expr *getConstantUnsignedIntExpr(unsigned value);
198 HLSLAttributedResourceType::Attributes getResourceAttrs() const;
199};
200
201} // namespace hlsl
202
203} // namespace clang
204
205#endif // LLVM_CLANG_SEMA_HLSLBUILTINTYPEDECLBUILDER_H
206