brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 47c8b0e Raw
129 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// Helper classes for creating HLSL builtin class types. Used by external HLSL10// sema source.11//12//===----------------------------------------------------------------------===//13 14#ifndef LLVM_CLANG_SEMA_HLSLBUILTINTYPEDECLBUILDER_H15#define LLVM_CLANG_SEMA_HLSLBUILTINTYPEDECLBUILDER_H16 17#include "clang/AST/Type.h"18#include "clang/Sema/Sema.h"19#include "llvm/ADT/StringMap.h"20 21using llvm::hlsl::ResourceClass;22 23namespace clang {24 25class ClassTemplateDecl;26class NamespaceDecl;27class CXXRecordDecl;28class FieldDecl;29 30namespace hlsl {31 32// Builder for builtin HLSL class types such as HLSL resource classes.33// Allows creating declaration of builtin types using the builder pattern34// like this:35//36//   Decl = BuiltinTypeDeclBuilder(Sema, Namespace, "BuiltinClassName")37//           .addSimpleTemplateParams({"T"}, Concept)38//           .finalizeForwardDeclaration();39//40// And then completing the type like this:41//42//   BuiltinTypeDeclBuilder(Sema, Decl)43//          .addDefaultHandleConstructor();44//          .addLoadMethods()45//          .completeDefinition();46//47class BuiltinTypeDeclBuilder {48private:49  Sema &SemaRef;50  CXXRecordDecl *Record = nullptr;51  ClassTemplateDecl *Template = nullptr;52  ClassTemplateDecl *PrevTemplate = nullptr;53  NamespaceDecl *HLSLNamespace = nullptr;54  llvm::StringMap<FieldDecl *> Fields;55 56public:57  friend struct TemplateParameterListBuilder;58  friend struct BuiltinTypeMethodBuilder;59 60  BuiltinTypeDeclBuilder(Sema &SemaRef, CXXRecordDecl *R);61  BuiltinTypeDeclBuilder(Sema &SemaRef, NamespaceDecl *Namespace,62                         StringRef Name);63  ~BuiltinTypeDeclBuilder();64 65  BuiltinTypeDeclBuilder &addSimpleTemplateParams(ArrayRef<StringRef> Names,66                                                  ConceptDecl *CD);67  CXXRecordDecl *finalizeForwardDeclaration() { return Record; }68  BuiltinTypeDeclBuilder &completeDefinition();69 70  BuiltinTypeDeclBuilder &71  addMemberVariable(StringRef Name, QualType Type, llvm::ArrayRef<Attr *> Attrs,72                    AccessSpecifier Access = AccessSpecifier::AS_private);73 74  BuiltinTypeDeclBuilder &75  addBufferHandles(ResourceClass RC, bool IsROV, bool RawBuffer,76                   bool HasCounter,77                   AccessSpecifier Access = AccessSpecifier::AS_private);78  BuiltinTypeDeclBuilder &addArraySubscriptOperators();79 80  // Builtin types constructors81  BuiltinTypeDeclBuilder &addDefaultHandleConstructor();82  BuiltinTypeDeclBuilder &addCopyConstructor();83  BuiltinTypeDeclBuilder &addCopyAssignmentOperator();84 85  // Static create methods86  BuiltinTypeDeclBuilder &addStaticInitializationFunctions(bool HasCounter);87 88  // Builtin types methods89  BuiltinTypeDeclBuilder &addLoadMethods();90  BuiltinTypeDeclBuilder &addIncrementCounterMethod();91  BuiltinTypeDeclBuilder &addDecrementCounterMethod();92  BuiltinTypeDeclBuilder &addHandleAccessFunction(DeclarationName &Name,93                                                  bool IsConst, bool IsRef);94  BuiltinTypeDeclBuilder &addLoadWithStatusFunction(DeclarationName &Name,95                                                    bool IsConst);96  BuiltinTypeDeclBuilder &addAppendMethod();97  BuiltinTypeDeclBuilder &addConsumeMethod();98 99  BuiltinTypeDeclBuilder &addGetDimensionsMethodForBuffer();100 101private:102  BuiltinTypeDeclBuilder &addCreateFromBinding();103  BuiltinTypeDeclBuilder &addCreateFromImplicitBinding();104  BuiltinTypeDeclBuilder &addCreateFromBindingWithImplicitCounter();105  BuiltinTypeDeclBuilder &addCreateFromImplicitBindingWithImplicitCounter();106  BuiltinTypeDeclBuilder &addResourceMember(StringRef MemberName,107                                            ResourceClass RC, bool IsROV,108                                            bool RawBuffer, bool IsCounter,109                                            AccessSpecifier Access);110  BuiltinTypeDeclBuilder &111  addHandleMember(ResourceClass RC, bool IsROV, bool RawBuffer,112                  AccessSpecifier Access = AccessSpecifier::AS_private);113  BuiltinTypeDeclBuilder &114  addCounterHandleMember(ResourceClass RC, bool IsROV, bool RawBuffer,115                         AccessSpecifier Access = AccessSpecifier::AS_private);116  FieldDecl *getResourceHandleField() const;117  FieldDecl *getResourceCounterHandleField() const;118  QualType getFirstTemplateTypeParam();119  QualType getHandleElementType();120  Expr *getConstantIntExpr(int value);121  HLSLAttributedResourceType::Attributes getResourceAttrs() const;122};123 124} // namespace hlsl125 126} // namespace clang127 128#endif // LLVM_CLANG_SEMA_HLSLBUILTINTYPEDECLBUILDER_H129