https://github.com/hekota created https://github.com/llvm/llvm-project/pull/117448
This reverts commit 94bde8cdc39ff7e9c59ee0cd5edda882955242aa. >From 4edec79a02e7d32fe16e257f6151669a2f009d85 Mon Sep 17 00:00:00 2001 From: Helena Kotas <heko...@microsoft.com> Date: Sat, 23 Nov 2024 11:43:29 -0800 Subject: [PATCH] Revert "[HLSL] Add `Increment`/`DecrementCounter` methods to structured buffers (#114148)" This reverts commit 94bde8cdc39ff7e9c59ee0cd5edda882955242aa. --- clang/include/clang/Basic/Builtins.td | 7 +- .../clang/Basic/DiagnosticSemaKinds.td | 6 - clang/lib/CodeGen/CGBuiltin.cpp | 9 - clang/lib/CodeGen/CGHLSLRuntime.h | 1 - clang/lib/Sema/HLSLExternalSemaSource.cpp | 414 ++++-------------- clang/lib/Sema/SemaExpr.cpp | 3 - clang/lib/Sema/SemaHLSL.cpp | 54 --- .../test/AST/HLSL/RWStructuredBuffer-AST.hlsl | 26 -- .../StructuredBuffers-methods-lib.hlsl | 25 -- .../StructuredBuffers-methods-ps.hlsl | 28 -- .../buffer_update_counter-errors.hlsl | 48 -- llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 +- llvm/include/llvm/IR/IntrinsicsSPIRV.td | 5 - llvm/lib/Target/DirectX/DXILOpLowering.cpp | 2 +- 14 files changed, 96 insertions(+), 534 deletions(-) delete mode 100644 clang/test/CodeGenHLSL/builtins/StructuredBuffers-methods-lib.hlsl delete mode 100644 clang/test/CodeGenHLSL/builtins/StructuredBuffers-methods-ps.hlsl delete mode 100644 clang/test/SemaHLSL/BuiltIns/buffer_update_counter-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index eaff744924805e..83c90b3d6e681b 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4882,6 +4882,7 @@ def HLSLSaturate : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } + def HLSLSelect : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_select"]; let Attributes = [NoThrow, Const]; @@ -4906,12 +4907,6 @@ def HLSLRadians : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } -def HLSLBufferUpdateCounter : LangBuiltin<"HLSL_LANG"> { - let Spellings = ["__builtin_hlsl_buffer_update_counter"]; - let Attributes = [NoThrow]; - let Prototype = "uint32_t(...)"; -} - def HLSLSplitDouble: LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_elementwise_splitdouble"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index f21b125252b063..eb05a6a77978af 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -7287,8 +7287,6 @@ def err_typecheck_illegal_increment_decrement : Error< "cannot %select{decrement|increment}1 value of type %0">; def err_typecheck_expect_int : Error< "used type %0 where integer is required">; -def err_typecheck_expect_hlsl_resource : Error< - "used type %0 where __hlsl_resource_t is required">; def err_typecheck_arithmetic_incomplete_or_sizeless_type : Error< "arithmetic on a pointer to %select{an incomplete|sizeless}0 type %1">; def err_typecheck_pointer_arith_function_type : Error< @@ -12530,10 +12528,6 @@ def warn_attr_min_eq_max: Warning< def err_hlsl_attribute_number_arguments_insufficient_shader_model: Error< "attribute %0 with %1 arguments requires shader model %2 or greater">; -def err_hlsl_expect_arg_const_int_one_or_neg_one: Error< - "argument %0 must be constant integer 1 or -1">; -def err_invalid_hlsl_resource_type: Error< - "invalid __hlsl_resource_t type attributes">; // Layout randomization diagnostics. def err_non_designated_init_used : Error< diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index cde03a92b02853..8f754953d28998 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -19409,15 +19409,6 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { CGM.getHLSLRuntime().getRadiansIntrinsic(), ArrayRef<Value *>{Op0}, nullptr, "hlsl.radians"); } - case Builtin::BI__builtin_hlsl_buffer_update_counter: { - Value *ResHandle = EmitScalarExpr(E->getArg(0)); - Value *Offset = EmitScalarExpr(E->getArg(1)); - Value *OffsetI8 = Builder.CreateIntCast(Offset, Int8Ty, true); - return Builder.CreateIntrinsic( - /*ReturnType=*/Offset->getType(), - CGM.getHLSLRuntime().getBufferUpdateCounterIntrinsic(), - ArrayRef<Value *>{ResHandle, OffsetI8}, nullptr); - } case Builtin::BI__builtin_hlsl_elementwise_splitdouble: { assert((E->getArg(0)->getType()->hasFloatingRepresentation() && diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index 854214d6bc0677..a8e0ed42b79a35 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -102,7 +102,6 @@ class CGHLSLRuntime { GENERATE_HLSL_INTRINSIC_FUNCTION(UClamp, uclamp) GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromBinding, handle_fromBinding) - GENERATE_HLSL_INTRINSIC_FUNCTION(BufferUpdateCounter, bufferUpdateCounter) //===----------------------------------------------------------------------===// // End of reserved area for HLSL intrinsic getters. diff --git a/clang/lib/Sema/HLSLExternalSemaSource.cpp b/clang/lib/Sema/HLSLExternalSemaSource.cpp index fcc74a2e8e71b3..822202fd81dc89 100644 --- a/clang/lib/Sema/HLSLExternalSemaSource.cpp +++ b/clang/lib/Sema/HLSLExternalSemaSource.cpp @@ -12,9 +12,7 @@ #include "clang/Sema/HLSLExternalSemaSource.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Attr.h" -#include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" -#include "clang/AST/Expr.h" #include "clang/AST/Type.h" #include "clang/Basic/SourceLocation.h" #include "clang/Sema/Lookup.h" @@ -22,43 +20,36 @@ #include "clang/Sema/SemaHLSL.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Frontend/HLSL/HLSLResource.h" -#include "llvm/Support/ErrorHandling.h" #include <functional> using namespace clang; using namespace llvm::hlsl; -static FunctionDecl *lookupBuiltinFunction(Sema &S, StringRef Name); - namespace { struct TemplateParameterListBuilder; struct BuiltinTypeDeclBuilder { - Sema &SemaRef; CXXRecordDecl *Record = nullptr; ClassTemplateDecl *Template = nullptr; ClassTemplateDecl *PrevTemplate = nullptr; NamespaceDecl *HLSLNamespace = nullptr; llvm::StringMap<FieldDecl *> Fields; - BuiltinTypeDeclBuilder(Sema &SemaRef, CXXRecordDecl *R) - : SemaRef(SemaRef), Record(R) { + BuiltinTypeDeclBuilder(CXXRecordDecl *R) : Record(R) { Record->startDefinition(); Template = Record->getDescribedClassTemplate(); } - BuiltinTypeDeclBuilder(Sema &SemaRef, NamespaceDecl *Namespace, - StringRef Name) - : SemaRef(SemaRef), HLSLNamespace(Namespace) { - ASTContext &AST = SemaRef.getASTContext(); + BuiltinTypeDeclBuilder(Sema &S, NamespaceDecl *Namespace, StringRef Name) + : HLSLNamespace(Namespace) { + ASTContext &AST = S.getASTContext(); IdentifierInfo &II = AST.Idents.get(Name, tok::TokenKind::identifier); - LookupResult Result(SemaRef, &II, SourceLocation(), Sema::LookupTagName); + LookupResult Result(S, &II, SourceLocation(), Sema::LookupTagName); CXXRecordDecl *PrevDecl = nullptr; - if (SemaRef.LookupQualifiedName(Result, HLSLNamespace)) { - // Declaration already exists (from precompiled headers) + if (S.LookupQualifiedName(Result, HLSLNamespace)) { NamedDecl *Found = Result.getFoundDecl(); if (auto *TD = dyn_cast<ClassTemplateDecl>(Found)) { PrevDecl = TD->getTemplatedDecl(); @@ -70,7 +61,6 @@ struct BuiltinTypeDeclBuilder { if (PrevDecl && PrevDecl->isCompleteDefinition()) { Record = PrevDecl; - Template = PrevTemplate; return; } @@ -94,7 +84,8 @@ struct BuiltinTypeDeclBuilder { BuiltinTypeDeclBuilder & addMemberVariable(StringRef Name, QualType Type, llvm::ArrayRef<Attr *> Attrs, AccessSpecifier Access = AccessSpecifier::AS_private) { - assert(!Record->isCompleteDefinition() && "record is already complete"); + if (Record->isCompleteDefinition()) + return *this; assert(Record->isBeingDefined() && "Definition must be started before adding members!"); ASTContext &AST = Record->getASTContext(); @@ -118,16 +109,22 @@ struct BuiltinTypeDeclBuilder { } BuiltinTypeDeclBuilder & - addHandleMember(ResourceClass RC, ResourceKind RK, bool IsROV, bool RawBuffer, + addHandleMember(Sema &S, ResourceClass RC, ResourceKind RK, bool IsROV, + bool RawBuffer, AccessSpecifier Access = AccessSpecifier::AS_private) { - assert(!Record->isCompleteDefinition() && "record is already complete"); + if (Record->isCompleteDefinition()) + return *this; - ASTContext &Ctx = SemaRef.getASTContext(); + ASTContext &Ctx = S.getASTContext(); TypeSourceInfo *ElementTypeInfo = nullptr; QualType ElemTy = Ctx.Char8Ty; - if (Template) - ElemTy = getFirstTemplateTypeParam(); + if (Template) { + if (const auto *TTD = dyn_cast<TemplateTypeParmDecl>( + Template->getTemplateParameters()->getParam(0))) { + ElemTy = QualType(TTD->getTypeForDecl(), 0); + } + } ElementTypeInfo = Ctx.getTrivialTypeSourceInfo(ElemTy, SourceLocation()); // add handle member with resource type attributes @@ -140,13 +137,32 @@ struct BuiltinTypeDeclBuilder { ? HLSLContainedTypeAttr::CreateImplicit(Ctx, ElementTypeInfo) : nullptr}; Attr *ResourceAttr = HLSLResourceAttr::CreateImplicit(Ctx, RK); - if (CreateHLSLAttributedResourceType(SemaRef, Ctx.HLSLResourceTy, Attrs, + if (CreateHLSLAttributedResourceType(S, Ctx.HLSLResourceTy, Attrs, AttributedResTy)) addMemberVariable("__handle", AttributedResTy, {ResourceAttr}, Access); return *this; } - BuiltinTypeDeclBuilder &addDefaultHandleConstructor() { + static DeclRefExpr *lookupBuiltinFunction(ASTContext &AST, Sema &S, + StringRef Name) { + IdentifierInfo &II = AST.Idents.get(Name, tok::TokenKind::identifier); + DeclarationNameInfo NameInfo = + DeclarationNameInfo(DeclarationName(&II), SourceLocation()); + LookupResult R(S, NameInfo, Sema::LookupOrdinaryName); + // AllowBuiltinCreation is false but LookupDirect will create + // the builtin when searching the global scope anyways... + S.LookupName(R, S.getCurScope()); + // FIXME: If the builtin function was user-declared in global scope, + // this assert *will* fail. Should this call LookupBuiltin instead? + assert(R.isSingleResult() && + "Since this is a builtin it should always resolve!"); + auto *VD = cast<ValueDecl>(R.getFoundDecl()); + QualType Ty = VD->getType(); + return DeclRefExpr::Create(AST, NestedNameSpecifierLoc(), SourceLocation(), + VD, false, NameInfo, Ty, VK_PRValue); + } + + BuiltinTypeDeclBuilder &addDefaultHandleConstructor(Sema &S) { if (Record->isCompleteDefinition()) return *this; ASTContext &AST = Record->getASTContext(); @@ -171,18 +187,25 @@ struct BuiltinTypeDeclBuilder { } BuiltinTypeDeclBuilder &addArraySubscriptOperators() { + if (Record->isCompleteDefinition()) + return *this; addArraySubscriptOperator(true); addArraySubscriptOperator(false); return *this; } BuiltinTypeDeclBuilder &addArraySubscriptOperator(bool IsConst) { - assert(!Record->isCompleteDefinition() && "record is already complete"); + if (Record->isCompleteDefinition()) + return *this; ASTContext &AST = Record->getASTContext(); QualType ElemTy = AST.Char8Ty; - if (Template) - ElemTy = getFirstTemplateTypeParam(); + if (Template) { + if (const auto *TTD = dyn_cast<TemplateTypeParmDecl>( + Template->getTemplateParameters()->getParam(0))) { + ElemTy = QualType(TTD->getTypeForDecl(), 0); + } + } QualType ReturnTy = ElemTy; FunctionProtoType::ExtProtoInfo ExtInfo; @@ -248,31 +271,16 @@ struct BuiltinTypeDeclBuilder { return *this; } - FieldDecl *getResourceHandleField() { - auto I = Fields.find("__handle"); - assert(I != Fields.end() && - I->second->getType()->isHLSLAttributedResourceType() && - "record does not have resource handle field"); - return I->second; - } - - QualType getFirstTemplateTypeParam() { - assert(Template && "record it not a template"); - if (const auto *TTD = dyn_cast<TemplateTypeParmDecl>( - Template->getTemplateParameters()->getParam(0))) { - return QualType(TTD->getTypeForDecl(), 0); - } - return QualType(); - } - BuiltinTypeDeclBuilder &startDefinition() { - assert(!Record->isCompleteDefinition() && "record is already complete"); + if (Record->isCompleteDefinition()) + return *this; Record->startDefinition(); return *this; } BuiltinTypeDeclBuilder &completeDefinition() { - assert(!Record->isCompleteDefinition() && "record is already complete"); + if (Record->isCompleteDefinition()) + return *this; assert(Record->isBeingDefined() && "Definition must be started before completing it."); @@ -280,47 +288,38 @@ struct BuiltinTypeDeclBuilder { return *this; } - Expr *getConstantIntExpr(int value) { - ASTContext &AST = SemaRef.getASTContext(); - return IntegerLiteral::Create( - AST, llvm::APInt(AST.getTypeSize(AST.IntTy), value, true), AST.IntTy, - SourceLocation()); - } - - TemplateParameterListBuilder addTemplateArgumentList(); - BuiltinTypeDeclBuilder &addSimpleTemplateParams(ArrayRef<StringRef> Names, - ConceptDecl *CD); - - // Builtin types methods - BuiltinTypeDeclBuilder &addIncrementCounterMethod(); - BuiltinTypeDeclBuilder &addDecrementCounterMethod(); + TemplateParameterListBuilder addTemplateArgumentList(Sema &S); + BuiltinTypeDeclBuilder & + addSimpleTemplateParams(Sema &S, ArrayRef<StringRef> Names, ConceptDecl *CD); + BuiltinTypeDeclBuilder &addConceptSpecializationExpr(Sema &S); }; struct TemplateParameterListBuilder { BuiltinTypeDeclBuilder &Builder; + Sema &S; llvm::SmallVector<NamedDecl *> Params; - TemplateParameterListBuilder(BuiltinTypeDeclBuilder &RB) : Builder(RB) {} + TemplateParameterListBuilder(Sema &S, BuiltinTypeDeclBuilder &RB) + : Builder(RB), S(S) {} ~TemplateParameterListBuilder() { finalizeTemplateArgs(); } TemplateParameterListBuilder & addTypeParameter(StringRef Name, QualType DefaultValue = QualType()) { - assert(!Builder.Record->isCompleteDefinition() && - "record is already complete"); - ASTContext &AST = Builder.SemaRef.getASTContext(); + if (Builder.Record->isCompleteDefinition()) + return *this; unsigned Position = static_cast<unsigned>(Params.size()); auto *Decl = TemplateTypeParmDecl::Create( - AST, Builder.Record->getDeclContext(), SourceLocation(), + S.Context, Builder.Record->getDeclContext(), SourceLocation(), SourceLocation(), /* TemplateDepth */ 0, Position, - &AST.Idents.get(Name, tok::TokenKind::identifier), + &S.Context.Idents.get(Name, tok::TokenKind::identifier), /* Typename */ true, /* ParameterPack */ false, /* HasTypeConstraint*/ false); if (!DefaultValue.isNull()) - Decl->setDefaultArgument(AST, - Builder.SemaRef.getTrivialTemplateArgumentLoc( - DefaultValue, QualType(), SourceLocation())); + Decl->setDefaultArgument( + S.Context, S.getTrivialTemplateArgumentLoc(DefaultValue, QualType(), + SourceLocation())); Params.emplace_back(Decl); return *this; @@ -422,14 +421,14 @@ struct TemplateParameterListBuilder { BuiltinTypeDeclBuilder &finalizeTemplateArgs(ConceptDecl *CD = nullptr) { if (Params.empty()) return Builder; - - ASTContext &AST = Builder.SemaRef.Context; ConceptSpecializationExpr *CSE = - CD ? constructConceptSpecializationExpr(Builder.SemaRef, CD) : nullptr; - auto *ParamList = TemplateParameterList::Create( - AST, SourceLocation(), SourceLocation(), Params, SourceLocation(), CSE); + CD ? constructConceptSpecializationExpr(S, CD) : nullptr; + + auto *ParamList = TemplateParameterList::Create(S.Context, SourceLocation(), + SourceLocation(), Params, + SourceLocation(), CSE); Builder.Template = ClassTemplateDecl::Create( - AST, Builder.Record->getDeclContext(), SourceLocation(), + S.Context, Builder.Record->getDeclContext(), SourceLocation(), DeclarationName(Builder.Record->getIdentifier()), ParamList, Builder.Record); @@ -444,233 +443,26 @@ struct TemplateParameterListBuilder { Params.clear(); QualType T = Builder.Template->getInjectedClassNameSpecialization(); - T = AST.getInjectedClassNameType(Builder.Record, T); + T = S.Context.getInjectedClassNameType(Builder.Record, T); return Builder; } }; - -// Builder for methods of builtin types. Allows adding methods to builtin types -// using the builder pattern like this: -// -// BuiltinTypeMethodBuilder(Sema, RecordBuilder, "MethodName", ReturnType) -// .addParam("param_name", Type, InOutModifier) -// .callBuiltin("buildin_name", { BuiltinParams }) -// .finalizeMethod(); -// -// The builder needs to have all of the method parameters before it can create -// a CXXMethodDecl. It collects them in addParam calls and when a first -// method that builds the body is called or when access to 'this` is needed it -// creates the CXXMethodDecl and ParmVarDecls instances. These can then be -// referenced from the body building methods. Destructor or an explicit call to -// finalizeMethod() will complete the method definition. -// -// The callBuiltin helper method passes in the resource handle as the first -// argument of the builtin call. If this is not desired it takes a bool flag to -// disable this. -// -// If the method that is being built has a non-void return type the -// finalizeMethod will create a return statent with the value of the last -// statement (unless the last statement is already a ReturnStmt). -struct BuiltinTypeMethodBuilder { - struct MethodParam { - const IdentifierInfo &NameII; - QualType Ty; - HLSLParamModifierAttr::Spelling Modifier; - MethodParam(const IdentifierInfo &NameII, QualType Ty, - HLSLParamModifierAttr::Spelling Modifier) - : NameII(NameII), Ty(Ty), Modifier(Modifier) {} - }; - - BuiltinTypeDeclBuilder &DeclBuilder; - DeclarationNameInfo NameInfo; - QualType ReturnTy; - CXXMethodDecl *Method; - llvm::SmallVector<MethodParam> Params; - llvm::SmallVector<Stmt *> StmtsList; - -public: - BuiltinTypeMethodBuilder(Sema &S, BuiltinTypeDeclBuilder &DB, StringRef Name, - QualType ReturnTy) - : DeclBuilder(DB), ReturnTy(ReturnTy), Method(nullptr) { - const IdentifierInfo &II = - S.getASTContext().Idents.get(Name, tok::TokenKind::identifier); - NameInfo = DeclarationNameInfo(DeclarationName(&II), SourceLocation()); - } - - BuiltinTypeMethodBuilder &addParam(StringRef Name, QualType Ty, - HLSLParamModifierAttr::Spelling Modifier = - HLSLParamModifierAttr::Keyword_in) { - assert(Method == nullptr && "Cannot add param, method already created"); - llvm_unreachable("not yet implemented"); - } - -private: - void createMethodDecl() { - assert(Method == nullptr && "Method already created"); - - // create method type - ASTContext &AST = DeclBuilder.SemaRef.getASTContext(); - SmallVector<QualType> ParamTypes; - for (MethodParam &MP : Params) - ParamTypes.emplace_back(MP.Ty); - QualType MethodTy = AST.getFunctionType(ReturnTy, ParamTypes, - FunctionProtoType::ExtProtoInfo()); - - // create method decl - auto *TSInfo = AST.getTrivialTypeSourceInfo(MethodTy, SourceLocation()); - Method = - CXXMethodDecl::Create(AST, DeclBuilder.Record, SourceLocation(), - NameInfo, MethodTy, TSInfo, SC_None, false, false, - ConstexprSpecKind::Unspecified, SourceLocation()); - - // create params & set them to the function prototype - SmallVector<ParmVarDecl *> ParmDecls; - auto FnProtoLoc = - Method->getTypeSourceInfo()->getTypeLoc().getAs<FunctionProtoTypeLoc>(); - for (int I = 0, E = Params.size(); I != E; I++) { - MethodParam &MP = Params[I]; - ParmVarDecl *Parm = ParmVarDecl::Create( - AST, Method->getDeclContext(), SourceLocation(), SourceLocation(), - &MP.NameII, MP.Ty, - AST.getTrivialTypeSourceInfo(MP.Ty, SourceLocation()), SC_None, - nullptr); - if (MP.Modifier != HLSLParamModifierAttr::Keyword_in) { - auto *Mod = - HLSLParamModifierAttr::Create(AST, SourceRange(), MP.Modifier); - Parm->addAttr(Mod); - } - ParmDecls.push_back(Parm); - FnProtoLoc.setParam(I, Parm); - } - Method->setParams({ParmDecls}); - } - -public: - ~BuiltinTypeMethodBuilder() { finalizeMethod(); } - - Expr *getResourceHandleExpr() { - // The first statement added to a method or access to 'this' creates the - // declaration. - if (!Method) - createMethodDecl(); - - ASTContext &AST = DeclBuilder.SemaRef.getASTContext(); - CXXThisExpr *This = CXXThisExpr::Create( - AST, SourceLocation(), Method->getFunctionObjectParameterType(), true); - FieldDecl *HandleField = DeclBuilder.getResourceHandleField(); - return MemberExpr::CreateImplicit(AST, This, false, HandleField, - HandleField->getType(), VK_LValue, - OK_Ordinary); - } - - BuiltinTypeMethodBuilder & - callBuiltin(StringRef BuiltinName, ArrayRef<Expr *> CallParms, - bool AddResourceHandleAsFirstArg = true) { - - // The first statement added to a method or access to 'this` creates the - // declaration. - if (!Method) - createMethodDecl(); - - ASTContext &AST = DeclBuilder.SemaRef.getASTContext(); - FunctionDecl *FD = lookupBuiltinFunction(DeclBuilder.SemaRef, BuiltinName); - DeclRefExpr *DRE = DeclRefExpr::Create( - AST, NestedNameSpecifierLoc(), SourceLocation(), FD, false, - FD->getNameInfo(), FD->getType(), VK_PRValue); - - SmallVector<Expr *> NewCallParms; - if (AddResourceHandleAsFirstArg) { - NewCallParms.push_back(getResourceHandleExpr()); - for (auto *P : CallParms) - NewCallParms.push_back(P); - } - - Expr *Call = CallExpr::Create( - AST, DRE, AddResourceHandleAsFirstArg ? NewCallParms : CallParms, - FD->getReturnType(), VK_PRValue, SourceLocation(), FPOptionsOverride()); - StmtsList.push_back(Call); - return *this; - } - - BuiltinTypeDeclBuilder &finalizeMethod() { - assert(!DeclBuilder.Record->isCompleteDefinition() && - "record is already complete"); - assert( - Method != nullptr && - "method decl not created; are you missing a call to build the body?"); - - if (!Method->hasBody()) { - ASTContext &AST = DeclBuilder.SemaRef.getASTContext(); - assert((ReturnTy == AST.VoidTy || !StmtsList.empty()) && - "nothing to return from non-void method"); - if (ReturnTy != AST.VoidTy) { - if (Expr *LastExpr = dyn_cast<Expr>(StmtsList.back())) { - assert(AST.hasSameUnqualifiedType( - isa<CallExpr>(LastExpr) - ? cast<CallExpr>(LastExpr)->getCallReturnType(AST) - : LastExpr->getType(), - ReturnTy) && - "Return type of the last statement must match the return type " - "of the method"); - if (!isa<ReturnStmt>(LastExpr)) { - StmtsList.pop_back(); - StmtsList.push_back( - ReturnStmt::Create(AST, SourceLocation(), LastExpr, nullptr)); - } - } - } - - Method->setBody(CompoundStmt::Create(AST, StmtsList, FPOptionsOverride(), - SourceLocation(), SourceLocation())); - Method->setLexicalDeclContext(DeclBuilder.Record); - Method->setAccess(AccessSpecifier::AS_public); - Method->addAttr(AlwaysInlineAttr::CreateImplicit( - AST, SourceRange(), AlwaysInlineAttr::CXX11_clang_always_inline)); - DeclBuilder.Record->addDecl(Method); - } - return DeclBuilder; - } -}; - } // namespace -TemplateParameterListBuilder BuiltinTypeDeclBuilder::addTemplateArgumentList() { - return TemplateParameterListBuilder(*this); +TemplateParameterListBuilder +BuiltinTypeDeclBuilder::addTemplateArgumentList(Sema &S) { + return TemplateParameterListBuilder(S, *this); } -BuiltinTypeDeclBuilder & -BuiltinTypeDeclBuilder::addSimpleTemplateParams(ArrayRef<StringRef> Names, - ConceptDecl *CD = nullptr) { - if (Record->isCompleteDefinition()) { - assert(Template && "existing record it not a template"); - assert(Template->getTemplateParameters()->size() == Names.size() && - "template param count mismatch"); - return *this; - } - - TemplateParameterListBuilder Builder = this->addTemplateArgumentList(); +BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addSimpleTemplateParams( + Sema &S, ArrayRef<StringRef> Names, ConceptDecl *CD = nullptr) { + TemplateParameterListBuilder Builder = this->addTemplateArgumentList(S); for (StringRef Name : Names) Builder.addTypeParameter(Name); return Builder.finalizeTemplateArgs(CD); } -BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addIncrementCounterMethod() { - return BuiltinTypeMethodBuilder(SemaRef, *this, "IncrementCounter", - SemaRef.getASTContext().UnsignedIntTy) - .callBuiltin("__builtin_hlsl_buffer_update_counter", - {getConstantIntExpr(1)}) - .finalizeMethod(); -} - -BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addDecrementCounterMethod() { - return BuiltinTypeMethodBuilder(SemaRef, *this, "DecrementCounter", - SemaRef.getASTContext().UnsignedIntTy) - .callBuiltin("__builtin_hlsl_buffer_update_counter", - {getConstantIntExpr(-1)}) - .finalizeMethod(); -} - HLSLExternalSemaSource::~HLSLExternalSemaSource() {} void HLSLExternalSemaSource::InitializeSema(Sema &S) { @@ -774,9 +566,9 @@ void HLSLExternalSemaSource::defineTrivialHLSLTypes() { static BuiltinTypeDeclBuilder setupBufferType(CXXRecordDecl *Decl, Sema &S, ResourceClass RC, ResourceKind RK, bool IsROV, bool RawBuffer) { - return BuiltinTypeDeclBuilder(S, Decl) - .addHandleMember(RC, RK, IsROV, RawBuffer) - .addDefaultHandleConstructor(); + return BuiltinTypeDeclBuilder(Decl) + .addHandleMember(S, RC, RK, IsROV, RawBuffer) + .addDefaultHandleConstructor(S); } Expr *constructTypedBufferConstraintExpr(Sema &S, SourceLocation NameLoc, @@ -844,7 +636,8 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() { ConceptDecl *TypedBufferConcept = constructTypedBufferConceptDecl(*SemaPtr, HLSLNamespace); Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWBuffer") - .addSimpleTemplateParams({"element_type"}, TypedBufferConcept) + .addSimpleTemplateParams(*SemaPtr, {"element_type"}, + TypedBufferConcept) .Record; onCompletion(Decl, [this](CXXRecordDecl *Decl) { @@ -857,7 +650,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() { Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RasterizerOrderedBuffer") - .addSimpleTemplateParams({"element_type"}) + .addSimpleTemplateParams(*SemaPtr, {"element_type"}) .Record; onCompletion(Decl, [this](CXXRecordDecl *Decl) { setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, @@ -868,7 +661,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() { }); Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "StructuredBuffer") - .addSimpleTemplateParams({"element_type"}) + .addSimpleTemplateParams(*SemaPtr, {"element_type"}) .Record; onCompletion(Decl, [this](CXXRecordDecl *Decl) { setupBufferType(Decl, *SemaPtr, ResourceClass::SRV, ResourceKind::RawBuffer, @@ -878,20 +671,18 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() { }); Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RWStructuredBuffer") - .addSimpleTemplateParams({"element_type"}) + .addSimpleTemplateParams(*SemaPtr, {"element_type"}) .Record; onCompletion(Decl, [this](CXXRecordDecl *Decl) { setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer, /*IsROV=*/false, /*RawBuffer=*/true) .addArraySubscriptOperators() - .addIncrementCounterMethod() - .addDecrementCounterMethod() .completeDefinition(); }); Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "AppendStructuredBuffer") - .addSimpleTemplateParams({"element_type"}) + .addSimpleTemplateParams(*SemaPtr, {"element_type"}) .Record; onCompletion(Decl, [this](CXXRecordDecl *Decl) { setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer, @@ -901,7 +692,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() { Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "ConsumeStructuredBuffer") - .addSimpleTemplateParams({"element_type"}) + .addSimpleTemplateParams(*SemaPtr, {"element_type"}) .Record; onCompletion(Decl, [this](CXXRecordDecl *Decl) { setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer, @@ -911,22 +702,19 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() { Decl = BuiltinTypeDeclBuilder(*SemaPtr, HLSLNamespace, "RasterizerOrderedStructuredBuffer") - .addSimpleTemplateParams({"element_type"}) + .addSimpleTemplateParams(*SemaPtr, {"element_type"}) .Record; onCompletion(Decl, [this](CXXRecordDecl *Decl) { setupBufferType(Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer, /*IsROV=*/true, /*RawBuffer=*/true) .addArraySubscriptOperators() - .addIncrementCounterMethod() - .addDecrementCounterMethod() .completeDefinition(); }); } void HLSLExternalSemaSource::onCompletion(CXXRecordDecl *Record, CompletionFunction Fn) { - if (!Record->isCompleteDefinition()) - Completions.insert(std::make_pair(Record->getCanonicalDecl(), Fn)); + Completions.insert(std::make_pair(Record->getCanonicalDecl(), Fn)); } void HLSLExternalSemaSource::CompleteType(TagDecl *Tag) { @@ -944,19 +732,3 @@ void HLSLExternalSemaSource::CompleteType(TagDecl *Tag) { return; It->second(Record); } - -static FunctionDecl *lookupBuiltinFunction(Sema &S, StringRef Name) { - IdentifierInfo &II = - S.getASTContext().Idents.get(Name, tok::TokenKind::identifier); - DeclarationNameInfo NameInfo = - DeclarationNameInfo(DeclarationName(&II), SourceLocation()); - LookupResult R(S, NameInfo, Sema::LookupOrdinaryName); - // AllowBuiltinCreation is false but LookupDirect will create - // the builtin when searching the global scope anyways... - S.LookupName(R, S.getCurScope()); - // FIXME: If the builtin function was user-declared in global scope, - // this assert *will* fail. Should this call LookupBuiltin instead? - assert(R.isSingleResult() && - "Since this is a builtin it should always resolve!"); - return cast<FunctionDecl>(R.getFoundDecl()); -} diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index c9d7444d5865a5..6c7472ce92703b 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -983,9 +983,6 @@ Sema::VarArgKind Sema::isValidVarArgType(const QualType &Ty) { if (getLangOpts().MSVCCompat) return VAK_MSVCUndefined; - if (getLangOpts().HLSL && Ty->getAs<HLSLAttributedResourceType>()) - return VAK_Valid; - // FIXME: In C++11, these cases are conditionally-supported, meaning we're // permitted to reject them. We should consider doing so. return VAK_Undefined; diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 8bdacd6ded1654..2bc93e4ec1181f 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -1696,16 +1696,6 @@ static bool CheckVectorElementCallArgs(Sema *S, CallExpr *TheCall) { return true; } -bool CheckArgTypeIsCorrect(Sema *S, Expr *Arg, QualType ExpectedType) { - QualType ArgType = Arg->getType(); - if (!S->getASTContext().hasSameUnqualifiedType(ArgType, ExpectedType)) { - S->Diag(Arg->getBeginLoc(), diag::err_typecheck_convert_incompatible) - << ArgType << ExpectedType << 1 << 0 << 0; - return true; - } - return false; -} - bool CheckArgTypeIsCorrect( Sema *S, Expr *Arg, QualType ExpectedType, llvm::function_ref<bool(clang::QualType PassedType)> Check) { @@ -1888,29 +1878,6 @@ static bool CheckVectorSelect(Sema *S, CallExpr *TheCall) { return false; } -static bool CheckResourceHandle( - Sema *S, CallExpr *TheCall, unsigned ArgIndex, - llvm::function_ref<bool(const HLSLAttributedResourceType *ResType)> Check = - nullptr) { - assert(TheCall->getNumArgs() >= ArgIndex); - QualType ArgType = TheCall->getArg(ArgIndex)->getType(); - const HLSLAttributedResourceType *ResTy = - ArgType.getTypePtr()->getAs<HLSLAttributedResourceType>(); - if (!ResTy) { - S->Diag(TheCall->getArg(0)->getBeginLoc(), - diag::err_typecheck_expect_hlsl_resource) - << ArgType; - return true; - } - if (Check && Check(ResTy)) { - S->Diag(TheCall->getArg(ArgIndex)->getExprLoc(), - diag::err_invalid_hlsl_resource_type) - << ArgType; - return true; - } - return false; -} - // Note: returning true in this case results in CheckBuiltinFunctionCall // returning an ExprError bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { @@ -2209,27 +2176,6 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } - case Builtin::BI__builtin_hlsl_buffer_update_counter: { - auto checkResTy = [](const HLSLAttributedResourceType *ResTy) -> bool { - return !(ResTy->getAttrs().ResourceClass == ResourceClass::UAV && - ResTy->getAttrs().RawBuffer && ResTy->hasContainedType()); - }; - if (SemaRef.checkArgCount(TheCall, 2) || - CheckResourceHandle(&SemaRef, TheCall, 0, checkResTy) || - CheckArgTypeIsCorrect(&SemaRef, TheCall->getArg(1), - SemaRef.getASTContext().IntTy)) - return true; - Expr *OffsetExpr = TheCall->getArg(1); - std::optional<llvm::APSInt> Offset = - OffsetExpr->getIntegerConstantExpr(SemaRef.getASTContext()); - if (!Offset.has_value() || std::abs(Offset->getExtValue()) != 1) { - SemaRef.Diag(TheCall->getArg(1)->getBeginLoc(), - diag::err_hlsl_expect_arg_const_int_one_or_neg_one) - << 1; - return true; - } - break; - } } return false; } diff --git a/clang/test/AST/HLSL/RWStructuredBuffer-AST.hlsl b/clang/test/AST/HLSL/RWStructuredBuffer-AST.hlsl index a1af001e2cad62..bef054a62e794d 100644 --- a/clang/test/AST/HLSL/RWStructuredBuffer-AST.hlsl +++ b/clang/test/AST/HLSL/RWStructuredBuffer-AST.hlsl @@ -52,32 +52,6 @@ RWStructuredBuffer<int> Buffer; // CHECK-NEXT: CXXThisExpr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> 'RWStructuredBuffer<element_type>' lvalue implicit this // CHECK-NEXT: AlwaysInlineAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit always_inline -// CHECK-NEXT: CXXMethodDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> IncrementCounter 'unsigned int ()' -// CHECK-NEXT: CompoundStmt 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> -// CHECK-NEXT: ReturnStmt 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> -// CHECK-NEXT: CallExpr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> 'unsigned int' -// CHECK-NEXT: DeclRefExpr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> 'unsigned int (...) noexcept' Function 0x{{[0-9A-Fa-f]+}} '__builtin_hlsl_buffer_update_counter' 'unsigned int (...) noexcept' -// CHECK-NEXT: MemberExpr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> '__hlsl_resource_t -// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] -// CHECK-SAME{LITERAL}: [[hlsl::raw_buffer]] -// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]' lvalue .__handle -// CHECK-NEXT: CXXThisExpr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> 'RWStructuredBuffer<element_type>' lvalue implicit this -// CHECK-NEXT: IntegerLiteral 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> 'int' 1 -// CHECK-NEXT: AlwaysInlineAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit always_inline - -// CHECK-NEXT: CXXMethodDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> DecrementCounter 'unsigned int ()' -// CHECK-NEXT: CompoundStmt 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> -// CHECK-NEXT: ReturnStmt 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> -// CHECK-NEXT: CallExpr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> 'unsigned int' -// CHECK-NEXT: DeclRefExpr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> 'unsigned int (...) noexcept' Function 0x{{[0-9A-Fa-f]+}} '__builtin_hlsl_buffer_update_counter' 'unsigned int (...) noexcept' -// CHECK-NEXT: MemberExpr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> '__hlsl_resource_t -// CHECK-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] -// CHECK-SAME{LITERAL}: [[hlsl::raw_buffer]] -// CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]' lvalue .__handle -// CHECK-NEXT: CXXThisExpr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> 'RWStructuredBuffer<element_type>' lvalue implicit this -// CHECK-NEXT: IntegerLiteral 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> 'int' -1 -// CHECK-NEXT: AlwaysInlineAttr 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> Implicit always_inline - // CHECK: ClassTemplateSpecializationDecl 0x{{[0-9A-Fa-f]+}} <<invalid sloc>> <invalid sloc> class RWStructuredBuffer definition // CHECK: TemplateArgument type 'int' diff --git a/clang/test/CodeGenHLSL/builtins/StructuredBuffers-methods-lib.hlsl b/clang/test/CodeGenHLSL/builtins/StructuredBuffers-methods-lib.hlsl deleted file mode 100644 index 128fff9b90a223..00000000000000 --- a/clang/test/CodeGenHLSL/builtins/StructuredBuffers-methods-lib.hlsl +++ /dev/null @@ -1,25 +0,0 @@ -// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-DXIL -// RUN-DISABLED: %clang_cc1 -triple spirv-vulkan-library -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-SPIRV - -// NOTE: SPIRV codegen for resource methods is not yet implemented - -RWStructuredBuffer<float> RWSB1 : register(u0); -RWStructuredBuffer<float> RWSB2 : register(u1); - -// CHECK: %"class.hlsl::RWStructuredBuffer" = type { target("dx.RawBuffer", float, 1, 0), float } - -export void TestIncrementCounter() { - RWSB1.IncrementCounter(); -} - -// CHECK: define void @_Z20TestIncrementCounterv() -// CHECK-DXIL: call i32 @llvm.dx.bufferUpdateCounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %{{[0-9]+}}, i8 1) - -export void TestDecrementCounter() { - RWSB2.DecrementCounter(); -} - -// CHECK: define void @_Z20TestDecrementCounterv() -// CHECK-DXIL: call i32 @llvm.dx.bufferUpdateCounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %{{[0-9]+}}, i8 -1) - -// CHECK: declare i32 @llvm.dx.bufferUpdateCounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0), i8) diff --git a/clang/test/CodeGenHLSL/builtins/StructuredBuffers-methods-ps.hlsl b/clang/test/CodeGenHLSL/builtins/StructuredBuffers-methods-ps.hlsl deleted file mode 100644 index e895d30b54007a..00000000000000 --- a/clang/test/CodeGenHLSL/builtins/StructuredBuffers-methods-ps.hlsl +++ /dev/null @@ -1,28 +0,0 @@ -// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-pixel -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-DXIL -// RUN-DISABLED: %clang_cc1 -triple spirv-vulkan-pixel -x hlsl -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s --check-prefixes=CHECK,CHECK-SPIRV - -// NOTE: SPIRV codegen for resource methods is not yet implemented - -RWStructuredBuffer<float> RWSB1, RWSB2; -RasterizerOrderedStructuredBuffer<float> ROSB1, ROSB2; - -// CHECK: %"class.hlsl::RWStructuredBuffer" = type { target("dx.RawBuffer", float, 1, 0), float } - -export void TestIncrementCounter() { -// CHECK: define void @_Z20TestIncrementCounterv() -// CHECK-DXIL: call i32 @llvm.dx.bufferUpdateCounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %{{[0-9]+}}, i8 1) -// CHECK-DXIL: call i32 @llvm.dx.bufferUpdateCounter.tdx.RawBuffer_f32_1_1t(target("dx.RawBuffer", float, 1, 1) %{{[0-9]+}}, i8 1) - RWSB1.IncrementCounter(); - ROSB1.IncrementCounter(); -} - -export void TestDecrementCounter() { -// CHECK: define void @_Z20TestDecrementCounterv() -// CHECK-DXIL: call i32 @llvm.dx.bufferUpdateCounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0) %{{[0-9]+}}, i8 -1) -// CHECK-DXIL: call i32 @llvm.dx.bufferUpdateCounter.tdx.RawBuffer_f32_1_1t(target("dx.RawBuffer", float, 1, 1) %{{[0-9]+}}, i8 -1) - RWSB2.DecrementCounter(); - ROSB2.DecrementCounter(); -} - -// CHECK: declare i32 @llvm.dx.bufferUpdateCounter.tdx.RawBuffer_f32_1_0t(target("dx.RawBuffer", float, 1, 0), i8) -// CHECK: declare i32 @llvm.dx.bufferUpdateCounter.tdx.RawBuffer_f32_1_1t(target("dx.RawBuffer", float, 1, 1), i8) diff --git a/clang/test/SemaHLSL/BuiltIns/buffer_update_counter-errors.hlsl b/clang/test/SemaHLSL/BuiltIns/buffer_update_counter-errors.hlsl deleted file mode 100644 index 4aa3ac183d3b15..00000000000000 --- a/clang/test/SemaHLSL/BuiltIns/buffer_update_counter-errors.hlsl +++ /dev/null @@ -1,48 +0,0 @@ -// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -emit-llvm-only -disable-llvm-passes -verify - -// RWStructuredBuffer<int> -using handle_t = __hlsl_resource_t [[hlsl::resource_class(UAV)]] [[hlsl::contained_type(int)]] [[hlsl::raw_buffer]]; -// RWBuffer<int> -using bad_handle_not_raw_t = __hlsl_resource_t [[hlsl::resource_class(UAV)]] [[hlsl::contained_type(int)]]; -// RWByteAddressBuffer -using bad_handle_no_type_t = __hlsl_resource_t [[hlsl::resource_class(UAV)]] [[hlsl::raw_buffer]]; -// StructuredBuffer -using bad_handle_not_uav_t = __hlsl_resource_t [[hlsl::resource_class(SRV)]] [[hlsl::contained_type(int)]] [[hlsl::raw_buffer]]; - -void test_args(int x, bool b) { - // expected-error@+1 {{too few arguments to function call, expected 2, have 1}} - __builtin_hlsl_buffer_update_counter(x); - - // expected-error@+1 {{too many arguments to function call, expected 2, have 3}} - __builtin_hlsl_buffer_update_counter(x, x, x); - - // expected-error@+1 {{used type 'int' where __hlsl_resource_t is required}} - __builtin_hlsl_buffer_update_counter(x, x); - - bad_handle_not_raw_t bad1; - bad_handle_no_type_t bad2; - bad_handle_not_uav_t bad3; - - // expected-error@+1 {{invalid __hlsl_resource_t type attributes}} - __builtin_hlsl_buffer_update_counter(bad1, 1); - - // expected-error@+1 {{invalid __hlsl_resource_t type attributes}} - __builtin_hlsl_buffer_update_counter(bad2, 1); - - // expected-error@+1 {{invalid __hlsl_resource_t type attributes}} - __builtin_hlsl_buffer_update_counter(bad3, 1); - - handle_t res; - - // expected-error@+1 {{argument 1 must be constant integer 1 or -1}} - __builtin_hlsl_buffer_update_counter(res, x); - - // expected-error@+1 {{passing 'const char *' to parameter of incompatible type 'int'}} - __builtin_hlsl_buffer_update_counter(res, "1"); - - // expected-error@+1 {{argument 1 must be constant integer 1 or -1}} - __builtin_hlsl_buffer_update_counter(res, 10); - - // no error - __builtin_hlsl_buffer_update_counter(res, 1); -} diff --git a/llvm/include/llvm/IR/IntrinsicsDirectX.td b/llvm/include/llvm/IR/IntrinsicsDirectX.td index bf49ec6f6c6496..dad60a2535cf4d 100644 --- a/llvm/include/llvm/IR/IntrinsicsDirectX.td +++ b/llvm/include/llvm/IR/IntrinsicsDirectX.td @@ -37,7 +37,7 @@ def int_dx_typedBufferStore : DefaultAttrsIntrinsic<[], [llvm_any_ty, llvm_i32_ty, llvm_anyvector_ty], [IntrWriteMem]>; -def int_dx_bufferUpdateCounter +def int_dx_updateCounter : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_any_ty, llvm_i8_ty], [IntrInaccessibleMemOrArgMemOnly]>; diff --git a/llvm/include/llvm/IR/IntrinsicsSPIRV.td b/llvm/include/llvm/IR/IntrinsicsSPIRV.td index 17b70062e58fa9..e1157085832866 100644 --- a/llvm/include/llvm/IR/IntrinsicsSPIRV.td +++ b/llvm/include/llvm/IR/IntrinsicsSPIRV.td @@ -106,14 +106,9 @@ let TargetPrefix = "spv" in { [llvm_any_ty], [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i1_ty], [IntrNoMem]>; - def int_spv_firstbituhigh : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>; def int_spv_firstbitshigh : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>; - def int_spv_bufferUpdateCounter - : DefaultAttrsIntrinsic<[llvm_i32_ty], [llvm_any_ty, llvm_i8_ty], - [IntrInaccessibleMemOrArgMemOnly]>; - // Read a value from the image buffer. It does not translate directly to a // single OpImageRead because the result type is not necessarily a 4 element // vector. diff --git a/llvm/lib/Target/DirectX/DXILOpLowering.cpp b/llvm/lib/Target/DirectX/DXILOpLowering.cpp index 7f50fc509a862a..9f124394363a38 100644 --- a/llvm/lib/Target/DirectX/DXILOpLowering.cpp +++ b/llvm/lib/Target/DirectX/DXILOpLowering.cpp @@ -647,7 +647,7 @@ class OpLowerer { case Intrinsic::dx_typedBufferStore: HasErrors |= lowerTypedBufferStore(F); break; - case Intrinsic::dx_bufferUpdateCounter: + case Intrinsic::dx_updateCounter: HasErrors |= lowerUpdateCounter(F); break; // TODO: this can be removed when _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits