diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 458747a1f7155..973e6a6015e98 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -4724,21 +4724,21 @@ def HLSLNumThreads: InheritableAttr { } def HLSLSV_GroupThreadID: HLSLAnnotationAttr { - let Spellings = [HLSLAnnotation<"SV_GroupThreadID">]; + let Spellings = [HLSLAnnotation<"sv_groupthreadid">]; let Subjects = SubjectList<[ParmVar, Field]>; let LangOpts = [HLSL]; let Documentation = [HLSLSV_GroupThreadIDDocs]; } def HLSLSV_GroupID: HLSLAnnotationAttr { - let Spellings = [HLSLAnnotation<"SV_GroupID">]; + let Spellings = [HLSLAnnotation<"sv_groupid">]; let Subjects = SubjectList<[ParmVar, Field]>; let LangOpts = [HLSL]; let Documentation = [HLSLSV_GroupIDDocs]; } def HLSLSV_GroupIndex: HLSLAnnotationAttr { - let Spellings = [HLSLAnnotation<"SV_GroupIndex">]; + let Spellings = [HLSLAnnotation<"sv_groupindex">]; let Subjects = SubjectList<[ParmVar, GlobalVar]>; let LangOpts = [HLSL]; let Documentation = [HLSLSV_GroupIndexDocs]; @@ -4790,7 +4790,7 @@ def HLSLPackOffset: HLSLAnnotationAttr { } def HLSLSV_DispatchThreadID: HLSLAnnotationAttr { - let Spellings = [HLSLAnnotation<"SV_DispatchThreadID">]; + let Spellings = [HLSLAnnotation<"sv_dispatchthreadid">]; let Subjects = SubjectList<[ParmVar, Field]>; let LangOpts = [HLSL]; let Documentation = [HLSLSV_DispatchThreadIDDocs]; diff --git a/clang/lib/Basic/Attributes.cpp b/clang/lib/Basic/Attributes.cpp index 2035d4c0a5768..6a070a99c8d96 100644 --- a/clang/lib/Basic/Attributes.cpp +++ b/clang/lib/Basic/Attributes.cpp @@ -143,13 +143,17 @@ static SmallString<64> normalizeName(const IdentifierInfo *Name, StringRef ScopeName = normalizeAttrScopeName(Scope, SyntaxUsed); StringRef AttrName = normalizeAttrName(Name, ScopeName, SyntaxUsed); + std::string StrAttrName = AttrName.str(); + if (SyntaxUsed == AttributeCommonInfo::AS_HLSLAnnotation) + StrAttrName = AttrName.lower(); + SmallString<64> FullName = ScopeName; if (!ScopeName.empty()) { assert(SyntaxUsed == AttributeCommonInfo::AS_CXX11 || SyntaxUsed == AttributeCommonInfo::AS_C23); FullName += "::"; } - FullName += AttrName; + FullName += StrAttrName; return FullName; } diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index bfe84b16218b7..cd16b2aa69ed8 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -752,7 +752,7 @@ void SemaHLSL::DiagnoseAttrStageMismatch( HLSLShaderAttr::ConvertEnvironmentTypeToStr(ST)); }); Diag(A->getLoc(), diag::err_hlsl_attr_unsupported_in_stage) - << A << llvm::Triple::getEnvironmentTypeName(Stage) + << A->getAttrName() << llvm::Triple::getEnvironmentTypeName(Stage) << (AllowedStages.size() != 1) << join(StageStrings, ", "); } diff --git a/clang/test/SemaHLSL/Semantics/valid_entry_parameter.hlsl b/clang/test/SemaHLSL/Semantics/valid_entry_parameter.hlsl index 6781f9241df24..a2203692b582b 100644 --- a/clang/test/SemaHLSL/Semantics/valid_entry_parameter.hlsl +++ b/clang/test/SemaHLSL/Semantics/valid_entry_parameter.hlsl @@ -24,6 +24,12 @@ void CSMain3(uint3 : SV_DispatchThreadID) { // CHECK-NEXT: ParmVarDecl 0x{{[0-9a-fA-F]+}} <{{.*}}> col:20 'uint3' // CHECK-NEXT: HLSLSV_DispatchThreadIDAttr } +[numthreads(8,8,1)] +void CSMain4(uint3 : SV_DispatchThreadId) { +// CHECK: FunctionDecl 0x{{[0-9a-fA-F]+}} <{{.*}}> line:[[@LINE-1]]:6 CSMain4 'void (uint3)' +// CHECK-NEXT: ParmVarDecl 0x{{[0-9a-fA-F]+}} <{{.*}}> col:20 'uint3' +// CHECK-NEXT: HLSLSV_DispatchThreadIDAttr +} [numthreads(8,8,1)] void CSMain_GID(uint ID : SV_GroupID) { @@ -49,6 +55,12 @@ void CSMain3_GID(uint3 : SV_GroupID) { // CHECK-NEXT: ParmVarDecl 0x{{[0-9a-fA-F]+}} <{{.*}}> col:24 'uint3' // CHECK-NEXT: HLSLSV_GroupIDAttr } +[numthreads(8,8,1)] +void CSMain4_GID(uint3 : Sv_GroupId) { +// CHECK: FunctionDecl 0x{{[0-9a-fA-F]+}} <{{.*}}> line:[[@LINE-1]]:6 CSMain4_GID 'void (uint3)' +// CHECK-NEXT: ParmVarDecl 0x{{[0-9a-fA-F]+}} <{{.*}}> col:24 'uint3' +// CHECK-NEXT: HLSLSV_GroupIDAttr +} [numthreads(8,8,1)] void CSMain_GThreadID(uint ID : SV_GroupThreadID) { @@ -74,3 +86,9 @@ void CSMain3_GThreadID(uint3 : SV_GroupThreadID) { // CHECK-NEXT: ParmVarDecl 0x{{[0-9a-fA-F]+}} <{{.*}}> col:30 'uint3' // CHECK-NEXT: HLSLSV_GroupThreadIDAttr } +[numthreads(8,8,1)] +void CSMain4_GThreadID(uint3 : sv_GroupThreadid) { +// CHECK: FunctionDecl 0x{{[0-9a-fA-F]+}} <{{.*}}> line:[[@LINE-1]]:6 CSMain4_GThreadID 'void (uint3)' +// CHECK-NEXT: ParmVarDecl 0x{{[0-9a-fA-F]+}} <{{.*}}> col:30 'uint3' +// CHECK-NEXT: HLSLSV_GroupThreadIDAttr +} diff --git a/clang/test/TableGen/HLSLAttribute-errors.td b/clang/test/TableGen/HLSLAttribute-errors.td new file mode 100644 index 0000000000000..fc9473dcc1fb4 --- /dev/null +++ b/clang/test/TableGen/HLSLAttribute-errors.td @@ -0,0 +1,11 @@ +// RUN: not clang-tblgen -gen-clang-attr-parsed-attr-kinds -I%p/../../include %s -o - 2>&1 | FileCheck %s + +include "clang/Basic/Attr.td" + +// CHECK: error: HLSLAnnotation Attribute must be lower case. +def HLSLSV_FAKE: HLSLAnnotationAttr { + let Spellings = [HLSLAnnotation<"SV_Fake">]; + let Subjects = SubjectList<[ParmVar, Field]>; + let LangOpts = [HLSL]; + let Documentation = [HLSLSV_GroupThreadIDDocs]; +} diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp index af7478b7986f9..3d90bfbc75b32 100644 --- a/clang/utils/TableGen/ClangAttrEmitter.cpp +++ b/clang/utils/TableGen/ClangAttrEmitter.cpp @@ -4932,6 +4932,9 @@ void EmitClangAttrParsedAttrKinds(const RecordKeeper &Records, Matches = &Pragma; } else if (Variety == "HLSLAnnotation") { Matches = &HLSLAnnotation; + if (RawSpelling.compare(RawSpelling.lower()) != 0) + PrintError(S.getSpellingRecord().getLoc(), + "HLSLAnnotation Attribute must be lower case."); } assert(Matches && "Unsupported spelling variety found");