This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGbdf1327fea63: [HLSL] Entry functions require param annotation (authored by beanz).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131625/new/ https://reviews.llvm.org/D131625 Files: clang/include/clang/AST/Attr.h clang/include/clang/Basic/Attr.td clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaDecl.cpp clang/test/SemaHLSL/Semantics/missing_entry_annotation.hlsl clang/utils/TableGen/ClangAttrEmitter.cpp
Index: clang/utils/TableGen/ClangAttrEmitter.cpp =================================================================== --- clang/utils/TableGen/ClangAttrEmitter.cpp +++ clang/utils/TableGen/ClangAttrEmitter.cpp @@ -2897,7 +2897,8 @@ { "INHERITABLE_ATTR", "InheritableAttr" }, { "DECL_OR_TYPE_ATTR", "DeclOrTypeAttr" }, { "INHERITABLE_PARAM_ATTR", "InheritableParamAttr" }, - { "PARAMETER_ABI_ATTR", "ParameterABIAttr" } + { "PARAMETER_ABI_ATTR", "ParameterABIAttr" }, + { "HLSL_ANNOTATION_ATTR", "HLSLAnnotationAttr"} }; static void emitDefaultDefine(raw_ostream &OS, StringRef name, Index: clang/test/SemaHLSL/Semantics/missing_entry_annotation.hlsl =================================================================== --- /dev/null +++ clang/test/SemaHLSL/Semantics/missing_entry_annotation.hlsl @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -hlsl-entry main -verify %s + +[numthreads(1,1, 1)] +void main(int GI) { } // expected-error{{semantic annotations must be present for all parameters of an entry function or patch constant function}} expected-note{{'GI' declared here}} Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -11894,6 +11894,16 @@ } break; } + + for (const auto *Param : FD->parameters()) { + if (!Param->hasAttr<HLSLAnnotationAttr>()) { + // FIXME: Handle struct parameters where annotations are on struct fields. + Diag(FD->getLocation(), diag::err_hlsl_missing_semantic_annotation); + Diag(Param->getLocation(), diag::note_previous_decl) << Param; + FD->setInvalidDecl(); + } + } + // FIXME: Verify return type semantic annotation. } bool Sema::CheckForConstantInitializer(Expr *Init, QualType DclT) { Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -11643,6 +11643,9 @@ def err_hlsl_numthreads_invalid : Error<"total number of threads cannot exceed %0">; def err_hlsl_missing_numthreads : Error<"missing numthreads attribute for %0 shader entry">; def err_hlsl_attribute_param_mismatch : Error<"%0 attribute parameters do not match the previous declaration">; +def err_hlsl_missing_semantic_annotation : Error< + "semantic annotations must be present for all parameters of an entry " + "function or patch constant function">; def err_hlsl_pointers_unsupported : Error< "%select{pointers|references}0 are unsupported in HLSL">; Index: clang/include/clang/Basic/Attr.td =================================================================== --- clang/include/clang/Basic/Attr.td +++ clang/include/clang/Basic/Attr.td @@ -608,6 +608,9 @@ /// A attribute is either a declaration attribute or a statement attribute. class DeclOrStmtAttr : InheritableAttr; +/// An attribute class for HLSL Annotations. +class HLSLAnnotationAttr : InheritableAttr; + /// A target-specific attribute. This class is meant to be used as a mixin /// with InheritableAttr or Attr depending on the attribute's needs. class TargetSpecificAttr<TargetSpec target> { @@ -4011,7 +4014,7 @@ let Documentation = [NumThreadsDocs]; } -def HLSLSV_GroupIndex: InheritableAttr { +def HLSLSV_GroupIndex: HLSLAnnotationAttr { let Spellings = [HLSLSemantic<"SV_GroupIndex">]; let Subjects = SubjectList<[ParmVar, GlobalVar]>; let LangOpts = [HLSL]; Index: clang/include/clang/AST/Attr.h =================================================================== --- clang/include/clang/AST/Attr.h +++ clang/include/clang/AST/Attr.h @@ -190,6 +190,22 @@ } }; +class HLSLAnnotationAttr : public InheritableAttr { +protected: + HLSLAnnotationAttr(ASTContext &Context, const AttributeCommonInfo &CommonInfo, + attr::Kind AK, bool IsLateParsed, + bool InheritEvenIfAlreadyPresent) + : InheritableAttr(Context, CommonInfo, AK, IsLateParsed, + InheritEvenIfAlreadyPresent) {} + +public: + // Implement isa/cast/dyncast/etc. + static bool classof(const Attr *A) { + return A->getKind() >= attr::FirstHLSLAnnotationAttr && + A->getKind() <= attr::LastHLSLAnnotationAttr; + } +}; + /// A parameter attribute which changes the argument-passing ABI rule /// for the parameter. class ParameterABIAttr : public InheritableParamAttr {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits