26#include "llvm/ADT/SmallVector.h"
29using namespace llvm::hlsl;
48 HLSLNamespace->setImplicit(
true);
49 HLSLNamespace->setHasExternalLexicalStorage();
53 (void)HLSLNamespace->getCanonicalDecl()->decls_begin();
54 defineTrivialHLSLTypes();
55 defineHLSLTypesWithForwardDeclarations();
71void HLSLExternalSemaSource::defineHLSLVectorAlias() {
78 &AST.
Idents.
get(
"element", tok::TokenKind::identifier),
false,
false);
79 TypeParam->setDefaultArgument(
83 TemplateParams.emplace_back(TypeParam);
87 &AST.
Idents.
get(
"element_count", tok::TokenKind::identifier), AST.
IntTy,
92 SizeParam->setDefaultArgument(
95 TemplateParams.emplace_back(SizeParam);
114 Record->setImplicit(
true);
126void HLSLExternalSemaSource::defineHLSLMatrixAlias() {
132 &AST.
Idents.
get(
"element", tok::TokenKind::identifier),
false,
false);
133 TypeParam->setDefaultArgument(
137 TemplateParams.emplace_back(TypeParam);
142 &AST.
Idents.
get(
"rows_count", tok::TokenKind::identifier), AST.
IntTy,
147 RowsParam->setDefaultArgument(
150 TemplateParams.emplace_back(RowsParam);
154 &AST.
Idents.
get(
"cols_count", tok::TokenKind::identifier), AST.
IntTy,
159 ColsParam->setDefaultArgument(
162 TemplateParams.emplace_back(ColsParam);
164 const unsigned MaxMatDim = SemaPtr->
getLangOpts().MaxMatrixDimension;
216 Record->setImplicit(
true);
228void HLSLExternalSemaSource::defineTrivialHLSLTypes() {
229 defineHLSLVectorAlias();
230 defineHLSLMatrixAlias();
236 bool RawBuffer,
bool HasCounter) {
258 ResourceDimension
Dim) {
291 &AST.
Idents.
get(
"element_type"),
false,
false);
329 PartialSpec->setTemplateArgsAsWritten(
332 PartialSpec->setImplicit(
true);
333 PartialSpec->setLexicalDeclContext(HLSLNamespace);
334 PartialSpec->setHasExternalLexicalStorage();
337 HLSLNamespace->
addDecl(PartialSpec);
355 QualType TType = Context.getTypeDeclType(T);
359 Context.getTrivialTypeSourceInfo(TType, NameLoc);
362 Context, BoolTy, NameLoc, UTT_IsTypedResourceElementCompatible,
363 {TTypeSourceInfo}, NameLoc,
true);
381 QualType TType = Context.getTypeDeclType(T);
385 Context.getTrivialTypeSourceInfo(TType, NameLoc);
389 {TTypeSourceInfo}, NameLoc,
true);
398 UETT_SizeOf, TTypeSourceInfo, BoolTy, NameLoc, NameLoc);
403 Context, llvm::APInt(Context.getTypeSize(Context.getSizeType()), 1,
true),
404 Context.getSizeType(), NameLoc);
412 Context, NotIntangibleExpr, SizeGEQOneExpr, BO_LAnd, BoolTy,
VK_LValue,
419 bool isTypedBuffer) {
424 IdentifierInfo &ElementTypeII = Context.Idents.get(
"element_type");
433 T->setDeclContext(DC);
438 Context, DeclLoc, DeclLoc, {T}, DeclLoc,
nullptr);
441 Expr *ConstraintExpr =
nullptr;
445 &Context.Idents.get(
"__is_typed_resource_element_compatible"));
449 &Context.Idents.get(
"__is_structured_resource_element_compatible"));
456 ConceptParams, ConstraintExpr);
467void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
468 ASTContext &AST = SemaPtr->getASTContext();
471 *SemaPtr, HLSLNamespace,
true);
473 *SemaPtr, HLSLNamespace,
false);
475 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
"Buffer")
476 .addSimpleTemplateParams({
"element_type"}, TypedBufferConcept)
477 .finalizeForwardDeclaration();
479 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
488 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
"RWBuffer")
489 .addSimpleTemplateParams({
"element_type"}, TypedBufferConcept)
490 .finalizeForwardDeclaration();
492 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
502 BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
"RasterizerOrderedBuffer")
503 .addSimpleTemplateParams({
"element_type"}, StructuredBufferConcept)
504 .finalizeForwardDeclaration();
505 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
514 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
"StructuredBuffer")
515 .addSimpleTemplateParams({
"element_type"}, StructuredBufferConcept)
516 .finalizeForwardDeclaration();
517 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
526 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
"RWStructuredBuffer")
527 .addSimpleTemplateParams({
"element_type"}, StructuredBufferConcept)
528 .finalizeForwardDeclaration();
529 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
541 BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
"AppendStructuredBuffer")
542 .addSimpleTemplateParams({
"element_type"}, StructuredBufferConcept)
543 .finalizeForwardDeclaration();
544 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
553 BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
"ConsumeStructuredBuffer")
554 .addSimpleTemplateParams({
"element_type"}, StructuredBufferConcept)
555 .finalizeForwardDeclaration();
556 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
564 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
565 "RasterizerOrderedStructuredBuffer")
566 .addSimpleTemplateParams({
"element_type"}, StructuredBufferConcept)
567 .finalizeForwardDeclaration();
568 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
579 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
"ByteAddressBuffer")
580 .finalizeForwardDeclaration();
581 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
588 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
"RWByteAddressBuffer")
589 .finalizeForwardDeclaration();
590 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
598 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
599 "RasterizerOrderedByteAddressBuffer")
600 .finalizeForwardDeclaration();
601 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
608 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
"SamplerState")
609 .finalizeForwardDeclaration();
610 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
615 BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
"SamplerComparisonState")
616 .finalizeForwardDeclaration();
617 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
622 Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace,
"Texture2D")
623 .addSimpleTemplateParams({
"element_type"}, {Float4Ty},
625 .finalizeForwardDeclaration();
627 onCompletion(Decl, [
this](CXXRecordDecl *Decl) {
629 ResourceDimension::Dim2D)
634 *SemaPtr, HLSLNamespace,
Decl->getDescribedClassTemplate());
635 onCompletion(PartialSpec, [
this](CXXRecordDecl *Decl) {
637 ResourceDimension::Dim2D)
643 CompletionFunction Fn) {
644 if (!
Record->isCompleteDefinition())
645 Completions.insert(std::make_pair(
Record->getCanonicalDecl(), Fn));
655 if (
auto TDecl = dyn_cast<ClassTemplateSpecializationDecl>(
Record)) {
659 Template->getPartialSpecializations(Partials);
661 for (
auto *Partial : Partials) {
663 if (SemaPtr->DeduceTemplateArguments(Partial, TDecl->getTemplateArgs(),
666 MatchedPartial = Partial;
677 auto It = Completions.find(
Record);
678 if (It == Completions.end())
681 Completions.erase(It);
Defines the clang::ASTContext interface.
llvm::dxil::ResourceClass ResourceClass
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
static BuiltinTypeDeclBuilder setupBufferType(CXXRecordDecl *Decl, Sema &S, ResourceClass RC, bool IsROV, bool RawBuffer, bool HasCounter)
Set up common members and attributes for buffer types.
static BuiltinTypeDeclBuilder setupSamplerType(CXXRecordDecl *Decl, Sema &S)
Set up common members and attributes for sampler types.
static ConceptDecl * constructBufferConceptDecl(Sema &S, NamespaceDecl *NSD, bool isTypedBuffer)
static Expr * constructTypedBufferConstraintExpr(Sema &S, SourceLocation NameLoc, TemplateTypeParmDecl *T)
static BuiltinTypeDeclBuilder setupTextureType(CXXRecordDecl *Decl, Sema &S, ResourceClass RC, bool IsROV, ResourceDimension Dim)
Set up common members and attributes for texture types.
static ClassTemplatePartialSpecializationDecl * addVectorTexturePartialSpecialization(Sema &S, NamespaceDecl *HLSLNamespace, ClassTemplateDecl *TextureTemplate)
static Expr * constructStructuredBufferConstraintExpr(Sema &S, SourceLocation NameLoc, TemplateTypeParmDecl *T)
llvm::MachO::Record Record
This file declares semantic analysis for HLSL constructs.
Defines the clang::SourceLocation class and associated facilities.
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
QualType getDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, SourceLocation AttrLoc) const
Return the unique reference to the matrix type of the specified element type and size.
unsigned getIntWidth(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getTemplateTypeParmType(unsigned Depth, unsigned Index, bool ParameterPack, TemplateTypeParmDecl *ParmDecl=nullptr) const
Retrieve the template type parameter type for a template parameter or parameter pack with the given d...
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getTemplateSpecializationType(ElaboratedTypeKeyword Keyword, TemplateName T, ArrayRef< TemplateArgument > SpecifiedArgs, ArrayRef< TemplateArgument > CanonicalArgs, QualType Underlying=QualType()) const
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
QualType getDependentSizedExtVectorType(QualType VectorType, Expr *SizeExpr, SourceLocation AttrLoc) const
A builtin binary operation expression such as "x + y" or "x <= y".
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
Represents a C++ struct/union/class.
static CanQual< Type > CreateUnsafe(QualType Other)
Declaration of a class template.
void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, void *InsertPos)
Insert the specified partial specialization knowing that it is not already in.
static ClassTemplatePartialSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, TemplateParameterList *Params, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, CanQualType CanonInjectedTST, ClassTemplatePartialSpecializationDecl *PrevDecl)
Declaration of a C++20 concept.
static ConceptDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, Expr *ConstraintExpr=nullptr)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
void addDecl(Decl *D)
Add the declaration D into this context.
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
decl_iterator decls_begin() const
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
Decl - This represents one declaration (or definition), e.g.
DeclContext * getDeclContext()
The name of a declaration.
This represents one expression.
Represents difference between two FPOptions values.
void CompleteType(TagDecl *Tag) override
Complete an incomplete HLSL builtin type.
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
One of these records is kept for each identifier that is lexed.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Represents the results of name lookup.
Represent a C++ namespace.
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
A C++ nested-name-specifier augmented with source location information.
static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, unsigned P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)
A (possibly-)qualified type.
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
Sema - This implements semantic analysis and AST building for C.
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
ASTContext & getASTContext() const
const LangOptions & getLangOpts() const
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
Encodes a location in the source.
Represents the declaration of a struct/union/class/enum.
A convenient class for passing around template argument information.
void addArgument(const TemplateArgumentLoc &Loc)
Location wrapper for a TemplateArgument.
Represents a template argument.
void setTemplateParameters(TemplateParameterList *TParams)
Represents a C++ template name within the type system.
Stores a list of template parameters for a TemplateDecl and its derived classes.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
Declaration of a template type parameter.
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, unsigned D, unsigned P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
static TypeAliasTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
A container of type source information.
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
static TypeTraitExpr * Create(const ASTContext &C, QualType T, SourceLocation Loc, TypeTrait Kind, ArrayRef< TypeSourceInfo * > Args, SourceLocation RParenLoc, bool Value)
Create a new type trait expression.
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
Represents a C++ using-declaration.
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
Represents a GCC generic vector type.
BuiltinTypeDeclBuilder & addDefaultHandleConstructor(AccessSpecifier Access=AccessSpecifier::AS_public)
BuiltinTypeDeclBuilder & addConsumeMethod()
BuiltinTypeDeclBuilder & addCopyAssignmentOperator(AccessSpecifier Access=AccessSpecifier::AS_public)
BuiltinTypeDeclBuilder & addArraySubscriptOperators(ResourceDimension Dim=ResourceDimension::Unknown)
BuiltinTypeDeclBuilder & addSampleGradMethods(ResourceDimension Dim)
BuiltinTypeDeclBuilder & addGetDimensionsMethodForBuffer()
BuiltinTypeDeclBuilder & addGatherCmpMethods(ResourceDimension Dim)
BuiltinTypeDeclBuilder & addSamplerHandle()
BuiltinTypeDeclBuilder & addSampleBiasMethods(ResourceDimension Dim)
BuiltinTypeDeclBuilder & completeDefinition()
BuiltinTypeDeclBuilder & addBufferHandles(ResourceClass RC, bool IsROV, bool RawBuffer, bool HasCounter, AccessSpecifier Access=AccessSpecifier::AS_private)
BuiltinTypeDeclBuilder & addByteAddressBufferStoreMethods()
BuiltinTypeDeclBuilder & addTextureHandle(ResourceClass RC, bool IsROV, ResourceDimension RD, AccessSpecifier Access=AccessSpecifier::AS_private)
BuiltinTypeDeclBuilder & addCopyConstructor(AccessSpecifier Access=AccessSpecifier::AS_public)
BuiltinTypeDeclBuilder & addAppendMethod()
BuiltinTypeDeclBuilder & addTextureLoadMethods(ResourceDimension Dim)
BuiltinTypeDeclBuilder & addIncrementCounterMethod()
BuiltinTypeDeclBuilder & addSampleLevelMethods(ResourceDimension Dim)
BuiltinTypeDeclBuilder & addMipsMember(ResourceDimension Dim)
BuiltinTypeDeclBuilder & addByteAddressBufferLoadMethods()
BuiltinTypeDeclBuilder & addSampleMethods(ResourceDimension Dim)
BuiltinTypeDeclBuilder & addStaticInitializationFunctions(bool HasCounter)
BuiltinTypeDeclBuilder & addCalculateLodMethods(ResourceDimension Dim)
BuiltinTypeDeclBuilder & addGetDimensionsMethods(ResourceDimension Dim)
BuiltinTypeDeclBuilder & addSampleCmpLevelZeroMethods(ResourceDimension Dim)
BuiltinTypeDeclBuilder & addGatherMethods(ResourceDimension Dim)
BuiltinTypeDeclBuilder & addDecrementCounterMethod()
BuiltinTypeDeclBuilder & addSampleCmpMethods(ResourceDimension Dim)
BuiltinTypeDeclBuilder & addLoadMethods()
Provides information about an attempted template argument deduction, whose success or failure was des...
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
@ OK_Ordinary
An ordinary object is located at an address in memory.
@ Result
The result type of a method or function.
@ Template
We are parsing a template declaration.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
@ Success
Template argument deduction was successful.
U cast(CodeGen::Address addr)
@ Class
The "class" keyword introduces the elaborated-type-specifier.
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...