[clang] Revert "[HLSL] Rewrite semantics parsing" (PR #157718)
Nathan Gauër via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 9 10:12:03 PDT 2025
https://github.com/Keenuts created https://github.com/llvm/llvm-project/pull/157718
Reverts llvm/llvm-project#152537
Broke the build in some cases. Need to investigate more for a proper solution.
>From d47a574d9ab76ae599a1d9dadbbaf9709ab35758 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nathan=20Gau=C3=ABr?= <github at keenuts.net>
Date: Tue, 9 Sep 2025 19:11:28 +0200
Subject: [PATCH] Revert "[HLSL] Rewrite semantics parsing (#152537)"
This reverts commit 57e1846c96f0c858f687fe9c66f4e3793b52f497.
---
clang/include/clang/AST/Attr.h | 34 ------
clang/include/clang/Basic/Attr.td | 66 +++++-----
.../clang/Basic/DiagnosticFrontendKinds.td | 4 -
.../clang/Basic/DiagnosticParseKinds.td | 5 +-
.../clang/Basic/DiagnosticSemaKinds.td | 5 -
clang/include/clang/Parse/Parser.h | 8 --
clang/include/clang/Sema/SemaHLSL.h | 25 +---
clang/lib/Basic/Attributes.cpp | 7 +-
clang/lib/CodeGen/CGHLSLRuntime.cpp | 72 +++--------
clang/lib/CodeGen/CGHLSLRuntime.h | 24 +---
clang/lib/Parse/ParseHLSL.cpp | 67 ++---------
clang/lib/Sema/SemaDeclAttr.cpp | 18 ++-
clang/lib/Sema/SemaHLSL.cpp | 113 +++++-------------
.../semantics/DispatchThreadID-noindex.hlsl | 8 --
.../semantics/SV_GroupID-noindex.hlsl | 9 --
.../semantics/SV_GroupThreadID-noindex.hlsl | 8 --
.../CodeGenHLSL/semantics/SV_Position.ps.hlsl | 4 +-
clang/test/CodeGenHLSL/semantics/missing.hlsl | 7 --
clang/test/ParserHLSL/semantic_parsing.hlsl | 36 +-----
.../ParserHLSL/semantic_parsing_define.hlsl | 7 --
.../Semantics/invalid_entry_parameter.hlsl | 12 +-
clang/utils/TableGen/ClangAttrEmitter.cpp | 8 +-
22 files changed, 128 insertions(+), 419 deletions(-)
delete mode 100644 clang/test/CodeGenHLSL/semantics/DispatchThreadID-noindex.hlsl
delete mode 100644 clang/test/CodeGenHLSL/semantics/SV_GroupID-noindex.hlsl
delete mode 100644 clang/test/CodeGenHLSL/semantics/SV_GroupThreadID-noindex.hlsl
delete mode 100644 clang/test/CodeGenHLSL/semantics/missing.hlsl
delete mode 100644 clang/test/ParserHLSL/semantic_parsing_define.hlsl
diff --git a/clang/include/clang/AST/Attr.h b/clang/include/clang/AST/Attr.h
index fe388b9fa045e..994f236337b99 100644
--- a/clang/include/clang/AST/Attr.h
+++ b/clang/include/clang/AST/Attr.h
@@ -232,40 +232,6 @@ class HLSLAnnotationAttr : public InheritableAttr {
}
};
-class HLSLSemanticAttr : public HLSLAnnotationAttr {
- unsigned SemanticIndex = 0;
- LLVM_PREFERRED_TYPE(bool)
- unsigned SemanticIndexable : 1;
- LLVM_PREFERRED_TYPE(bool)
- unsigned SemanticExplicitIndex : 1;
-
-protected:
- HLSLSemanticAttr(ASTContext &Context, const AttributeCommonInfo &CommonInfo,
- attr::Kind AK, bool IsLateParsed,
- bool InheritEvenIfAlreadyPresent, bool SemanticIndexable)
- : HLSLAnnotationAttr(Context, CommonInfo, AK, IsLateParsed,
- InheritEvenIfAlreadyPresent) {
- this->SemanticIndexable = SemanticIndexable;
- this->SemanticExplicitIndex = false;
- }
-
-public:
- bool isSemanticIndexable() const { return SemanticIndexable; }
-
- void setSemanticIndex(unsigned SemanticIndex) {
- this->SemanticIndex = SemanticIndex;
- this->SemanticExplicitIndex = true;
- }
-
- unsigned getSemanticIndex() const { return SemanticIndex; }
-
- // Implement isa/cast/dyncast/etc.
- static bool classof(const Attr *A) {
- return A->getKind() >= attr::FirstHLSLSemanticAttr &&
- A->getKind() <= attr::LastHLSLSemanticAttr;
- }
-};
-
/// A parameter attribute which changes the argument-passing ABI rule
/// for the parameter.
class ParameterABIAttr : public InheritableParamAttr {
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td
index b85abfcbecfcf..10bf96a50c982 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -779,16 +779,6 @@ class DeclOrStmtAttr : InheritableAttr;
/// An attribute class for HLSL Annotations.
class HLSLAnnotationAttr : InheritableAttr;
-class HLSLSemanticAttr<bit Indexable> : HLSLAnnotationAttr {
- bit SemanticIndexable = Indexable;
- int SemanticIndex = 0;
- bit SemanticExplicitIndex = 0;
-
- let Spellings = [];
- let Subjects = SubjectList<[ParmVar, Field, Function]>;
- let LangOpts = [HLSL];
-}
-
/// 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> {
@@ -4900,6 +4890,27 @@ def HLSLNumThreads: InheritableAttr {
let Documentation = [NumThreadsDocs];
}
+def HLSLSV_GroupThreadID: HLSLAnnotationAttr {
+ 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 Subjects = SubjectList<[ParmVar, Field]>;
+ let LangOpts = [HLSL];
+ let Documentation = [HLSLSV_GroupIDDocs];
+}
+
+def HLSLSV_GroupIndex: HLSLAnnotationAttr {
+ let Spellings = [HLSLAnnotation<"sv_groupindex">];
+ let Subjects = SubjectList<[ParmVar, GlobalVar]>;
+ let LangOpts = [HLSL];
+ let Documentation = [HLSLSV_GroupIndexDocs];
+}
+
def HLSLVkBinding : InheritableAttr {
let Spellings = [CXX11<"vk", "binding">];
let Subjects = SubjectList<[HLSLBufferObj, ExternalGlobalVar], ErrorDiag>;
@@ -4958,35 +4969,13 @@ def HLSLResourceBinding: InheritableAttr {
}];
}
-def HLSLUnparsedSemantic : HLSLAnnotationAttr {
- let Spellings = [];
- let Args = [DefaultIntArgument<"Index", 0>,
- DefaultBoolArgument<"ExplicitIndex", 0>];
- let Subjects = SubjectList<[ParmVar, Field, Function]>;
+def HLSLSV_Position : HLSLAnnotationAttr {
+ let Spellings = [HLSLAnnotation<"sv_position">];
+ let Subjects = SubjectList<[ParmVar, Field]>;
let LangOpts = [HLSL];
- let Documentation = [InternalOnly];
-}
-
-def HLSLSV_Position : HLSLSemanticAttr</* Indexable= */ 1> {
let Documentation = [HLSLSV_PositionDocs];
}
-def HLSLSV_GroupThreadID : HLSLSemanticAttr</* Indexable= */ 0> {
- let Documentation = [HLSLSV_GroupThreadIDDocs];
-}
-
-def HLSLSV_GroupID : HLSLSemanticAttr</* Indexable= */ 0> {
- let Documentation = [HLSLSV_GroupIDDocs];
-}
-
-def HLSLSV_GroupIndex : HLSLSemanticAttr</* Indexable= */ 0> {
- let Documentation = [HLSLSV_GroupIndexDocs];
-}
-
-def HLSLSV_DispatchThreadID : HLSLSemanticAttr</* Indexable= */ 0> {
- let Documentation = [HLSLSV_DispatchThreadIDDocs];
-}
-
def HLSLPackOffset: HLSLAnnotationAttr {
let Spellings = [HLSLAnnotation<"packoffset">];
let LangOpts = [HLSL];
@@ -4999,6 +4988,13 @@ def HLSLPackOffset: HLSLAnnotationAttr {
}];
}
+def HLSLSV_DispatchThreadID: HLSLAnnotationAttr {
+ let Spellings = [HLSLAnnotation<"sv_dispatchthreadid">];
+ let Subjects = SubjectList<[ParmVar, Field]>;
+ let LangOpts = [HLSL];
+ let Documentation = [HLSLSV_DispatchThreadIDDocs];
+}
+
def HLSLShader : InheritableAttr {
let Spellings = [Microsoft<"shader">];
let Subjects = SubjectList<[HLSLEntry]>;
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index 2fd2ae434d7c5..15447558cf952 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -400,10 +400,6 @@ def warn_hlsl_langstd_minimal :
"recommend using %1 instead">,
InGroup<HLSLDXCCompat>;
-def err_hlsl_semantic_missing : Error<"semantic annotations must be present "
- "for all input and outputs of an entry "
- "function or patch constant function">;
-
// ClangIR frontend errors
def err_cir_to_cir_transform_failed : Error<
"CIR-to-CIR transformation failed">, DefaultFatal;
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 968a7c5b0dc8e..bc7a6e231d93c 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1860,8 +1860,9 @@ def note_max_tokens_total_override : Note<"total token limit set here">;
def err_expected_semantic_identifier : Error<
"expected HLSL Semantic identifier">;
-def err_invalid_declaration_in_hlsl_buffer
- : Error<"invalid declaration inside %select{tbuffer|cbuffer}0">;
+def err_invalid_declaration_in_hlsl_buffer : Error<
+ "invalid declaration inside %select{tbuffer|cbuffer}0">;
+def err_unknown_hlsl_semantic : Error<"unknown HLSL semantic %0">;
def err_hlsl_separate_attr_arg_and_number : Error<"wrong argument format for hlsl attribute, use %0 instead">;
def ext_hlsl_access_specifiers : ExtWarn<
"access specifiers are a clang HLSL extension">,
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index e69123bb3715d..e78064fd676d7 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -13121,11 +13121,6 @@ def err_hlsl_duplicate_parameter_modifier : Error<"duplicate parameter modifier
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_unknown_semantic : Error<"unknown HLSL semantic %0">;
-def err_hlsl_semantic_output_not_supported
- : Error<"semantic %0 does not support output">;
-def err_hlsl_semantic_indexing_not_supported
- : Error<"semantic %0 does not allow indexing">;
def err_hlsl_init_priority_unsupported : Error<
"initializer priorities are not supported in HLSL">;
diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h
index 30edd303e1824..a9a87fb586fc2 100644
--- a/clang/include/clang/Parse/Parser.h
+++ b/clang/include/clang/Parse/Parser.h
@@ -5188,14 +5188,6 @@ class Parser : public CodeCompletionHandler {
ParseHLSLAnnotations(Attrs, EndLoc);
}
- struct ParsedSemantic {
- StringRef Name = "";
- unsigned Index = 0;
- bool Explicit = false;
- };
-
- ParsedSemantic ParseHLSLSemantic();
-
void ParseHLSLAnnotations(ParsedAttributes &Attrs,
SourceLocation *EndLoc = nullptr,
bool CouldBeBitField = false);
diff --git a/clang/include/clang/Sema/SemaHLSL.h b/clang/include/clang/Sema/SemaHLSL.h
index b5ddca0fe2ca5..4bad26e7a09a7 100644
--- a/clang/include/clang/Sema/SemaHLSL.h
+++ b/clang/include/clang/Sema/SemaHLSL.h
@@ -17,7 +17,6 @@
#include "clang/AST/Attr.h"
#include "clang/AST/Type.h"
#include "clang/AST/TypeLoc.h"
-#include "clang/Basic/DiagnosticSema.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Sema/SemaBase.h"
#include "llvm/ADT/SmallVector.h"
@@ -130,7 +129,6 @@ class SemaHLSL : public SemaBase {
bool ActOnUninitializedVarDecl(VarDecl *D);
void ActOnEndOfTranslationUnit(TranslationUnitDecl *TU);
void CheckEntryPoint(FunctionDecl *FD);
- bool isSemanticValid(FunctionDecl *FD, DeclaratorDecl *D);
void CheckSemanticAnnotation(FunctionDecl *EntryPoint, const Decl *Param,
const HLSLAnnotationAttr *AnnotationAttr);
void DiagnoseAttrStageMismatch(
@@ -170,31 +168,16 @@ class SemaHLSL : public SemaBase {
void handleWaveSizeAttr(Decl *D, const ParsedAttr &AL);
void handleVkConstantIdAttr(Decl *D, const ParsedAttr &AL);
void handleVkBindingAttr(Decl *D, const ParsedAttr &AL);
+ void handleSV_DispatchThreadIDAttr(Decl *D, const ParsedAttr &AL);
+ void handleSV_GroupThreadIDAttr(Decl *D, const ParsedAttr &AL);
+ void handleSV_GroupIDAttr(Decl *D, const ParsedAttr &AL);
+ void handleSV_PositionAttr(Decl *D, const ParsedAttr &AL);
void handlePackOffsetAttr(Decl *D, const ParsedAttr &AL);
void handleShaderAttr(Decl *D, const ParsedAttr &AL);
void handleResourceBindingAttr(Decl *D, const ParsedAttr &AL);
void handleParamModifierAttr(Decl *D, const ParsedAttr &AL);
bool handleResourceTypeAttr(QualType T, const ParsedAttr &AL);
- template <typename T>
- T *createSemanticAttr(const ParsedAttr &AL,
- std::optional<unsigned> Location) {
- T *Attr = ::new (getASTContext()) T(getASTContext(), AL);
- if (Attr->isSemanticIndexable())
- Attr->setSemanticIndex(Location ? *Location : 0);
- else if (Location.has_value()) {
- Diag(Attr->getLocation(), diag::err_hlsl_semantic_indexing_not_supported)
- << Attr->getAttrName()->getName();
- return nullptr;
- }
-
- return Attr;
- }
-
- void diagnoseSystemSemanticAttr(Decl *D, const ParsedAttr &AL,
- std::optional<unsigned> Index);
- void handleSemanticAttr(Decl *D, const ParsedAttr &AL);
-
void handleVkExtBuiltinInputAttr(Decl *D, const ParsedAttr &AL);
bool CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
diff --git a/clang/lib/Basic/Attributes.cpp b/clang/lib/Basic/Attributes.cpp
index 5878a4e3f83a4..81b186f844b8a 100644
--- a/clang/lib/Basic/Attributes.cpp
+++ b/clang/lib/Basic/Attributes.cpp
@@ -189,12 +189,7 @@ AttributeCommonInfo::Kind
AttributeCommonInfo::getParsedKind(const IdentifierInfo *Name,
const IdentifierInfo *ScopeName,
Syntax SyntaxUsed) {
- AttributeCommonInfo::Kind Kind =
- ::getAttrKind(normalizeName(Name, ScopeName, SyntaxUsed), SyntaxUsed);
- if (SyntaxUsed == AS_HLSLAnnotation &&
- Kind == AttributeCommonInfo::Kind::UnknownAttribute)
- return AttributeCommonInfo::Kind::AT_HLSLUnparsedSemantic;
- return Kind;
+ return ::getAttrKind(normalizeName(Name, ScopeName, SyntaxUsed), SyntaxUsed);
}
AttributeCommonInfo::AttrArgsInfo
diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp
index afee1198e0988..4c8ece972f754 100644
--- a/clang/lib/CodeGen/CGHLSLRuntime.cpp
+++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp
@@ -23,7 +23,6 @@
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/AST/Type.h"
#include "clang/Basic/TargetOptions.h"
-#include "clang/Frontend/FrontendDiagnostic.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Frontend/HLSL/RootSignatureMetadata.h"
@@ -566,78 +565,47 @@ static llvm::Value *createSPIRVBuiltinLoad(IRBuilder<> &B, llvm::Module &M,
return B.CreateLoad(Ty, GV);
}
-llvm::Value *
-CGHLSLRuntime::emitSystemSemanticLoad(IRBuilder<> &B, llvm::Type *Type,
- const clang::DeclaratorDecl *Decl,
- SemanticInfo &ActiveSemantic) {
- if (isa<HLSLSV_GroupIndexAttr>(ActiveSemantic.Semantic)) {
+llvm::Value *CGHLSLRuntime::emitInputSemantic(IRBuilder<> &B,
+ const ParmVarDecl &D,
+ llvm::Type *Ty) {
+ assert(D.hasAttrs() && "Entry parameter missing annotation attribute!");
+ if (D.hasAttr<HLSLSV_GroupIndexAttr>()) {
llvm::Function *GroupIndex =
CGM.getIntrinsic(getFlattenedThreadIdInGroupIntrinsic());
return B.CreateCall(FunctionCallee(GroupIndex));
}
-
- if (isa<HLSLSV_DispatchThreadIDAttr>(ActiveSemantic.Semantic)) {
+ if (D.hasAttr<HLSLSV_DispatchThreadIDAttr>()) {
llvm::Intrinsic::ID IntrinID = getThreadIdIntrinsic();
llvm::Function *ThreadIDIntrinsic =
llvm::Intrinsic::isOverloaded(IntrinID)
? CGM.getIntrinsic(IntrinID, {CGM.Int32Ty})
: CGM.getIntrinsic(IntrinID);
- return buildVectorInput(B, ThreadIDIntrinsic, Type);
+ return buildVectorInput(B, ThreadIDIntrinsic, Ty);
}
-
- if (isa<HLSLSV_GroupThreadIDAttr>(ActiveSemantic.Semantic)) {
+ if (D.hasAttr<HLSLSV_GroupThreadIDAttr>()) {
llvm::Intrinsic::ID IntrinID = getGroupThreadIdIntrinsic();
llvm::Function *GroupThreadIDIntrinsic =
llvm::Intrinsic::isOverloaded(IntrinID)
? CGM.getIntrinsic(IntrinID, {CGM.Int32Ty})
: CGM.getIntrinsic(IntrinID);
- return buildVectorInput(B, GroupThreadIDIntrinsic, Type);
+ return buildVectorInput(B, GroupThreadIDIntrinsic, Ty);
}
-
- if (isa<HLSLSV_GroupIDAttr>(ActiveSemantic.Semantic)) {
+ if (D.hasAttr<HLSLSV_GroupIDAttr>()) {
llvm::Intrinsic::ID IntrinID = getGroupIdIntrinsic();
llvm::Function *GroupIDIntrinsic =
llvm::Intrinsic::isOverloaded(IntrinID)
? CGM.getIntrinsic(IntrinID, {CGM.Int32Ty})
: CGM.getIntrinsic(IntrinID);
- return buildVectorInput(B, GroupIDIntrinsic, Type);
- }
-
- if (HLSLSV_PositionAttr *S =
- dyn_cast<HLSLSV_PositionAttr>(ActiveSemantic.Semantic)) {
- if (CGM.getTriple().getEnvironment() == Triple::EnvironmentType::Pixel)
- return createSPIRVBuiltinLoad(B, CGM.getModule(), Type,
- S->getAttrName()->getName(),
- /* BuiltIn::FragCoord */ 15);
+ return buildVectorInput(B, GroupIDIntrinsic, Ty);
}
-
- llvm_unreachable("non-handled system semantic. FIXME.");
-}
-
-llvm::Value *
-CGHLSLRuntime::handleScalarSemanticLoad(IRBuilder<> &B, llvm::Type *Type,
- const clang::DeclaratorDecl *Decl,
- SemanticInfo &ActiveSemantic) {
-
- if (!ActiveSemantic.Semantic) {
- ActiveSemantic.Semantic = Decl->getAttr<HLSLSemanticAttr>();
- if (!ActiveSemantic.Semantic) {
- CGM.getDiags().Report(Decl->getInnerLocStart(),
- diag::err_hlsl_semantic_missing);
- return nullptr;
- }
- ActiveSemantic.Index = ActiveSemantic.Semantic->getSemanticIndex();
+ if (D.hasAttr<HLSLSV_PositionAttr>()) {
+ if (getArch() == llvm::Triple::spirv)
+ return createSPIRVBuiltinLoad(B, CGM.getModule(), Ty, "sv_position",
+ /* BuiltIn::Position */ 0);
+ llvm_unreachable("SV_Position semantic not implemented for this target.");
}
-
- return emitSystemSemanticLoad(B, Type, Decl, ActiveSemantic);
-}
-
-llvm::Value *
-CGHLSLRuntime::handleSemanticLoad(IRBuilder<> &B, llvm::Type *Type,
- const clang::DeclaratorDecl *Decl,
- SemanticInfo &ActiveSemantic) {
- assert(!Type->isStructTy());
- return handleScalarSemanticLoad(B, Type, Decl, ActiveSemantic);
+ assert(false && "Unhandled parameter attribute");
+ return nullptr;
}
void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD,
@@ -682,10 +650,8 @@ void CGHLSLRuntime::emitEntryFunction(const FunctionDecl *FD,
Args.emplace_back(PoisonValue::get(Param.getType()));
continue;
}
-
const ParmVarDecl *PD = FD->getParamDecl(Param.getArgNo() - SRetOffset);
- SemanticInfo ActiveSemantic = {nullptr, 0};
- Args.push_back(handleSemanticLoad(B, Param.getType(), PD, ActiveSemantic));
+ Args.push_back(emitInputSemantic(B, *PD, Param.getType()));
}
CallInst *CI = B.CreateCall(FunctionCallee(Fn), Args, OB);
diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h
index 370f3d5c5d30d..0948fefe7685e 100644
--- a/clang/lib/CodeGen/CGHLSLRuntime.h
+++ b/clang/lib/CodeGen/CGHLSLRuntime.h
@@ -21,8 +21,6 @@
#include "llvm/IR/IntrinsicsDirectX.h"
#include "llvm/IR/IntrinsicsSPIRV.h"
-#include "clang/AST/Attr.h"
-#include "clang/AST/Decl.h"
#include "clang/Basic/Builtins.h"
#include "clang/Basic/HLSLRuntime.h"
@@ -140,26 +138,8 @@ class CGHLSLRuntime {
protected:
CodeGenModule &CGM;
- void collectInputSemantic(llvm::IRBuilder<> &B, const DeclaratorDecl *D,
- llvm::Type *Type,
- SmallVectorImpl<llvm::Value *> &Inputs);
-
- struct SemanticInfo {
- clang::HLSLSemanticAttr *Semantic;
- uint32_t Index;
- };
-
- llvm::Value *emitSystemSemanticLoad(llvm::IRBuilder<> &B, llvm::Type *Type,
- const clang::DeclaratorDecl *Decl,
- SemanticInfo &ActiveSemantic);
-
- llvm::Value *handleScalarSemanticLoad(llvm::IRBuilder<> &B, llvm::Type *Type,
- const clang::DeclaratorDecl *Decl,
- SemanticInfo &ActiveSemantic);
-
- llvm::Value *handleSemanticLoad(llvm::IRBuilder<> &B, llvm::Type *Type,
- const clang::DeclaratorDecl *Decl,
- SemanticInfo &ActiveSemantic);
+ llvm::Value *emitInputSemantic(llvm::IRBuilder<> &B, const ParmVarDecl &D,
+ llvm::Type *Ty);
public:
CGHLSLRuntime(CodeGenModule &CGM) : CGM(CGM) {}
diff --git a/clang/lib/Parse/ParseHLSL.cpp b/clang/lib/Parse/ParseHLSL.cpp
index 51f2aef869649..f243b0cb95eae 100644
--- a/clang/lib/Parse/ParseHLSL.cpp
+++ b/clang/lib/Parse/ParseHLSL.cpp
@@ -118,46 +118,6 @@ static void fixSeparateAttrArgAndNumber(StringRef ArgStr, SourceLocation ArgLoc,
Slot = new (Ctx) IdentifierLoc(ArgLoc, PP.getIdentifierInfo(FixedArg));
}
-Parser::ParsedSemantic Parser::ParseHLSLSemantic() {
- assert(Tok.is(tok::identifier) && "Not a HLSL Annotation");
-
- // Semantic pattern: [A-Za-z_]([A-Za-z_0-9]*[A-Za-z_])?[0-9]*
- // The first part is the semantic name, the second is the optional
- // semantic index. The semantic index is the number at the end of
- // the semantic, including leading zeroes. Digits located before
- // the last letter are part of the semantic name.
- bool Invalid = false;
- SmallString<256> Buffer;
- Buffer.resize(Tok.getLength() + 1);
- StringRef Identifier = PP.getSpelling(Tok, Buffer);
- if (Invalid) {
- Diag(Tok.getLocation(), diag::err_expected_semantic_identifier);
- return {};
- }
-
- assert(Identifier.size() > 0);
- // Determine the start of the semantic index.
- unsigned IndexIndex = Identifier.find_last_not_of("0123456789") + 1;
-
- // ParseHLSLSemantic being called on an indentifier, the first
- // character cannot be a digit. This error should be handled by
- // the caller. We can assert here.
- StringRef SemanticName = Identifier.take_front(IndexIndex);
- assert(SemanticName.size() > 0);
-
- unsigned Index = 0;
- bool Explicit = false;
- if (IndexIndex != Identifier.size()) {
- Explicit = true;
- [[maybe_unused]] bool Failure =
- Identifier.substr(IndexIndex).getAsInteger(10, Index);
- // Given the logic above, this should never fail.
- assert(!Failure);
- }
-
- return {SemanticName, Index, Explicit};
-}
-
void Parser::ParseHLSLAnnotations(ParsedAttributes &Attrs,
SourceLocation *EndLoc,
bool CouldBeBitField) {
@@ -181,15 +141,11 @@ void Parser::ParseHLSLAnnotations(ParsedAttributes &Attrs,
return;
}
- ParsedAttr::Kind AttrKind =
- ParsedAttr::getParsedKind(II, nullptr, ParsedAttr::AS_HLSLAnnotation);
- Parser::ParsedSemantic Semantic;
- if (AttrKind == ParsedAttr::AT_HLSLUnparsedSemantic)
- Semantic = ParseHLSLSemantic();
-
SourceLocation Loc = ConsumeToken();
if (EndLoc)
*EndLoc = Tok.getLocation();
+ ParsedAttr::Kind AttrKind =
+ ParsedAttr::getParsedKind(II, nullptr, ParsedAttr::AS_HLSLAnnotation);
ArgsVector ArgExprs;
switch (AttrKind) {
@@ -326,17 +282,14 @@ void Parser::ParseHLSLAnnotations(ParsedAttributes &Attrs,
return;
}
} break;
- case ParsedAttr::AT_HLSLUnparsedSemantic: {
- ASTContext &Ctx = Actions.getASTContext();
- ArgExprs.push_back(IntegerLiteral::Create(
- Ctx, llvm::APInt(Ctx.getTypeSize(Ctx.IntTy), Semantic.Index), Ctx.IntTy,
- SourceLocation()));
- ArgExprs.push_back(IntegerLiteral::Create(
- Ctx, llvm::APInt(1, Semantic.Explicit), Ctx.BoolTy, SourceLocation()));
- II = PP.getIdentifierInfo(Semantic.Name);
- break;
- }
- case ParsedAttr::UnknownAttribute: // FIXME: maybe this is obsolete?
+ case ParsedAttr::UnknownAttribute:
+ Diag(Loc, diag::err_unknown_hlsl_semantic) << II;
+ return;
+ case ParsedAttr::AT_HLSLSV_GroupThreadID:
+ case ParsedAttr::AT_HLSLSV_GroupID:
+ case ParsedAttr::AT_HLSLSV_GroupIndex:
+ case ParsedAttr::AT_HLSLSV_DispatchThreadID:
+ case ParsedAttr::AT_HLSLSV_Position:
break;
default:
llvm_unreachable("invalid HLSL Annotation");
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 44906456f3371..cb2c132cca978 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -7465,6 +7465,9 @@ ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, const ParsedAttr &AL,
case ParsedAttr::AT_HLSLWaveSize:
S.HLSL().handleWaveSizeAttr(D, AL);
break;
+ case ParsedAttr::AT_HLSLSV_Position:
+ S.HLSL().handleSV_PositionAttr(D, AL);
+ break;
case ParsedAttr::AT_HLSLVkExtBuiltinInput:
S.HLSL().handleVkExtBuiltinInputAttr(D, AL);
break;
@@ -7474,9 +7477,21 @@ ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, const ParsedAttr &AL,
case ParsedAttr::AT_HLSLVkBinding:
S.HLSL().handleVkBindingAttr(D, AL);
break;
+ case ParsedAttr::AT_HLSLSV_GroupThreadID:
+ S.HLSL().handleSV_GroupThreadIDAttr(D, AL);
+ break;
+ case ParsedAttr::AT_HLSLSV_GroupID:
+ S.HLSL().handleSV_GroupIDAttr(D, AL);
+ break;
+ case ParsedAttr::AT_HLSLSV_GroupIndex:
+ handleSimpleAttribute<HLSLSV_GroupIndexAttr>(S, D, AL);
+ break;
case ParsedAttr::AT_HLSLGroupSharedAddressSpace:
handleSimpleAttribute<HLSLGroupSharedAddressSpaceAttr>(S, D, AL);
break;
+ case ParsedAttr::AT_HLSLSV_DispatchThreadID:
+ S.HLSL().handleSV_DispatchThreadIDAttr(D, AL);
+ break;
case ParsedAttr::AT_HLSLPackOffset:
S.HLSL().handlePackOffsetAttr(D, AL);
break;
@@ -7489,9 +7504,6 @@ ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, const ParsedAttr &AL,
case ParsedAttr::AT_HLSLParamModifier:
S.HLSL().handleParamModifierAttr(D, AL);
break;
- case ParsedAttr::AT_HLSLUnparsedSemantic:
- S.HLSL().handleSemanticAttr(D, AL);
- break;
case ParsedAttr::AT_AbiTag:
handleAbiTagAttr(S, D, AL);
diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index c14ce2a2b84f8..21e5b331b517c 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -769,26 +769,6 @@ void SemaHLSL::ActOnTopLevelFunction(FunctionDecl *FD) {
}
}
-bool SemaHLSL::isSemanticValid(FunctionDecl *FD, DeclaratorDecl *D) {
- const auto *AnnotationAttr = D->getAttr<HLSLAnnotationAttr>();
- if (AnnotationAttr) {
- CheckSemanticAnnotation(FD, D, AnnotationAttr);
- return true;
- }
-
- const Type *T = D->getType()->getUnqualifiedDesugaredType();
- const RecordType *RT = dyn_cast<RecordType>(T);
- if (!RT)
- return false;
-
- const RecordDecl *RD = RT->getOriginalDecl();
- for (FieldDecl *Field : RD->fields()) {
- if (!isSemanticValid(FD, Field))
- return false;
- }
- return true;
-}
-
void SemaHLSL::CheckEntryPoint(FunctionDecl *FD) {
const auto *ShaderAttr = FD->getAttr<HLSLShaderAttr>();
assert(ShaderAttr && "Entry point has no shader attribute");
@@ -852,7 +832,11 @@ void SemaHLSL::CheckEntryPoint(FunctionDecl *FD) {
}
for (ParmVarDecl *Param : FD->parameters()) {
- if (!isSemanticValid(FD, Param)) {
+ if (const auto *AnnotationAttr = Param->getAttr<HLSLAnnotationAttr>()) {
+ CheckSemanticAnnotation(FD, Param, AnnotationAttr);
+ } else {
+ // FIXME: Handle struct parameters where annotations are on struct fields.
+ // See: https://github.com/llvm/llvm-project/issues/57875
Diag(FD->getLocation(), diag::err_hlsl_missing_semantic_annotation);
Diag(Param->getLocation(), diag::note_previous_decl) << Param;
FD->setInvalidDecl();
@@ -1576,8 +1560,18 @@ bool SemaHLSL::diagnoseInputIDType(QualType T, const ParsedAttr &AL) {
return true;
}
+void SemaHLSL::handleSV_DispatchThreadIDAttr(Decl *D, const ParsedAttr &AL) {
+ auto *VD = cast<ValueDecl>(D);
+ if (!diagnoseInputIDType(VD->getType(), AL))
+ return;
+
+ D->addAttr(::new (getASTContext())
+ HLSLSV_DispatchThreadIDAttr(getASTContext(), AL));
+}
+
bool SemaHLSL::diagnosePositionType(QualType T, const ParsedAttr &AL) {
const auto *VT = T->getAs<VectorType>();
+
if (!T->hasFloatingRepresentation() || (VT && VT->getNumElements() > 4)) {
Diag(AL.getLoc(), diag::err_hlsl_attr_invalid_type)
<< AL << "float/float1/float2/float3/float4";
@@ -1587,70 +1581,29 @@ bool SemaHLSL::diagnosePositionType(QualType T, const ParsedAttr &AL) {
return true;
}
-void SemaHLSL::diagnoseSystemSemanticAttr(Decl *D, const ParsedAttr &AL,
- std::optional<unsigned> Index) {
- std::string SemanticName = AL.getAttrName()->getName().upper();
-
+void SemaHLSL::handleSV_PositionAttr(Decl *D, const ParsedAttr &AL) {
auto *VD = cast<ValueDecl>(D);
- QualType ValueType = VD->getType();
- if (auto *FD = dyn_cast<FunctionDecl>(D))
- ValueType = FD->getReturnType();
-
- bool IsOutput = false;
- if (HLSLParamModifierAttr *MA = D->getAttr<HLSLParamModifierAttr>()) {
- if (MA->isOut()) {
- IsOutput = true;
- ValueType = cast<ReferenceType>(ValueType)->getPointeeType();
- }
- }
+ if (!diagnosePositionType(VD->getType(), AL))
+ return;
- Attr *Attribute = nullptr;
- if (SemanticName == "SV_DISPATCHTHREADID") {
- diagnoseInputIDType(ValueType, AL);
- if (IsOutput)
- Diag(AL.getLoc(), diag::err_hlsl_semantic_output_not_supported) << AL;
- Attribute = createSemanticAttr<HLSLSV_DispatchThreadIDAttr>(AL, Index);
- } else if (SemanticName == "SV_GROUPINDEX") {
- if (IsOutput)
- Diag(AL.getLoc(), diag::err_hlsl_semantic_output_not_supported) << AL;
- Attribute = createSemanticAttr<HLSLSV_GroupIndexAttr>(AL, Index);
- } else if (SemanticName == "SV_GROUPTHREADID") {
- diagnoseInputIDType(ValueType, AL);
- if (IsOutput)
- Diag(AL.getLoc(), diag::err_hlsl_semantic_output_not_supported) << AL;
- Attribute = createSemanticAttr<HLSLSV_GroupThreadIDAttr>(AL, Index);
- } else if (SemanticName == "SV_GROUPID") {
- diagnoseInputIDType(ValueType, AL);
- if (IsOutput)
- Diag(AL.getLoc(), diag::err_hlsl_semantic_output_not_supported) << AL;
- Attribute = createSemanticAttr<HLSLSV_GroupIDAttr>(AL, Index);
- } else if (SemanticName == "SV_POSITION") {
- const auto *VT = ValueType->getAs<VectorType>();
- if (!ValueType->hasFloatingRepresentation() ||
- (VT && VT->getNumElements() > 4))
- Diag(AL.getLoc(), diag::err_hlsl_attr_invalid_type)
- << AL << "float/float1/float2/float3/float4";
- Attribute = createSemanticAttr<HLSLSV_PositionAttr>(AL, Index);
- } else
- Diag(AL.getLoc(), diag::err_hlsl_unknown_semantic) << AL;
-
- if (!Attribute)
+ D->addAttr(::new (getASTContext()) HLSLSV_PositionAttr(getASTContext(), AL));
+}
+
+void SemaHLSL::handleSV_GroupThreadIDAttr(Decl *D, const ParsedAttr &AL) {
+ auto *VD = cast<ValueDecl>(D);
+ if (!diagnoseInputIDType(VD->getType(), AL))
return;
- D->addAttr(Attribute);
+
+ D->addAttr(::new (getASTContext())
+ HLSLSV_GroupThreadIDAttr(getASTContext(), AL));
}
-void SemaHLSL::handleSemanticAttr(Decl *D, const ParsedAttr &AL) {
- uint32_t IndexValue, ExplicitIndex;
- SemaRef.checkUInt32Argument(AL, AL.getArgAsExpr(0), IndexValue);
- SemaRef.checkUInt32Argument(AL, AL.getArgAsExpr(1), ExplicitIndex);
- assert(IndexValue > 0 ? ExplicitIndex : true);
- std::optional<unsigned> Index =
- ExplicitIndex ? std::optional<unsigned>(IndexValue) : std::nullopt;
-
- if (AL.getAttrName()->getName().starts_with_insensitive("SV_"))
- diagnoseSystemSemanticAttr(D, AL, Index);
- else
- Diag(AL.getLoc(), diag::err_hlsl_unknown_semantic) << AL;
+void SemaHLSL::handleSV_GroupIDAttr(Decl *D, const ParsedAttr &AL) {
+ auto *VD = cast<ValueDecl>(D);
+ if (!diagnoseInputIDType(VD->getType(), AL))
+ return;
+
+ D->addAttr(::new (getASTContext()) HLSLSV_GroupIDAttr(getASTContext(), AL));
}
void SemaHLSL::handlePackOffsetAttr(Decl *D, const ParsedAttr &AL) {
diff --git a/clang/test/CodeGenHLSL/semantics/DispatchThreadID-noindex.hlsl b/clang/test/CodeGenHLSL/semantics/DispatchThreadID-noindex.hlsl
deleted file mode 100644
index 9ed545762ec94..0000000000000
--- a/clang/test/CodeGenHLSL/semantics/DispatchThreadID-noindex.hlsl
+++ /dev/null
@@ -1,8 +0,0 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -finclude-default-header -disable-llvm-passes -o - %s -verify -verify-ignore-unexpected=note,error
-// RUN: %clang_cc1 -triple spirv-linux-vulkan-library -x hlsl -emit-llvm -finclude-default-header -disable-llvm-passes -o - %s -verify -verify-ignore-unexpected=note,error
-
-[shader("compute")]
-[numthreads(8,8,1)]
-void foo(uint Idx : SV_DispatchThreadID1) {
- // expected-error at -1 {{semantic SV_DispatchThreadID does not allow indexing}}
-}
diff --git a/clang/test/CodeGenHLSL/semantics/SV_GroupID-noindex.hlsl b/clang/test/CodeGenHLSL/semantics/SV_GroupID-noindex.hlsl
deleted file mode 100644
index 8fa0b07a36027..0000000000000
--- a/clang/test/CodeGenHLSL/semantics/SV_GroupID-noindex.hlsl
+++ /dev/null
@@ -1,9 +0,0 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -finclude-default-header -disable-llvm-passes -o - %s -verify -verify-ignore-unexpected=note,error
-// RUN: %clang_cc1 -triple spirv-linux-vulkan-library -x hlsl -emit-llvm -finclude-default-header -disable-llvm-passes -o - %s -verify -verify-ignore-unexpected=note,error
-
-[shader("compute")]
-[numthreads(8,8,1)]
-void foo(uint Idx : SV_GroupID1) {
- // expected-error at -1 {{semantic SV_GroupID does not allow indexing}}
-}
-
diff --git a/clang/test/CodeGenHLSL/semantics/SV_GroupThreadID-noindex.hlsl b/clang/test/CodeGenHLSL/semantics/SV_GroupThreadID-noindex.hlsl
deleted file mode 100644
index da72e85d2600e..0000000000000
--- a/clang/test/CodeGenHLSL/semantics/SV_GroupThreadID-noindex.hlsl
+++ /dev/null
@@ -1,8 +0,0 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -emit-llvm -finclude-default-header -disable-llvm-passes -o - %s -verify -verify-ignore-unexpected=note,error
-// RUN: %clang_cc1 -triple spirv-linux-vulkan-library -x hlsl -emit-llvm -finclude-default-header -disable-llvm-passes -o - %s -verify -verify-ignore-unexpected=note,error
-
-[shader("compute")]
-[numthreads(8,8,1)]
-void foo(uint Idx : SV_GroupThreadID1) {
- // expected-error at -1 {{semantic SV_GroupThreadID does not allow indexing}}
-}
diff --git a/clang/test/CodeGenHLSL/semantics/SV_Position.ps.hlsl b/clang/test/CodeGenHLSL/semantics/SV_Position.ps.hlsl
index 1bba87ea07141..bdba38e028edd 100644
--- a/clang/test/CodeGenHLSL/semantics/SV_Position.ps.hlsl
+++ b/clang/test/CodeGenHLSL/semantics/SV_Position.ps.hlsl
@@ -1,10 +1,10 @@
// RUN: %clang_cc1 -triple spirv-unknown-vulkan1.3-pixel -x hlsl -emit-llvm -finclude-default-header -disable-llvm-passes -o - %s | FileCheck %s
-// CHECK: @SV_Position = external hidden thread_local addrspace(7) externally_initialized constant <4 x float>, !spirv.Decorations !0
+// CHECK: @sv_position = external hidden thread_local addrspace(7) externally_initialized constant <4 x float>, !spirv.Decorations !0
// CHECK: define void @main() {{.*}} {
float4 main(float4 p : SV_Position) {
- // CHECK: %[[#P:]] = load <4 x float>, ptr addrspace(7) @SV_Position, align 16
+ // CHECK: %[[#P:]] = load <4 x float>, ptr addrspace(7) @sv_position, align 16
// CHECK: %[[#R:]] = call spir_func <4 x float> @_Z4mainDv4_f(<4 x float> %[[#P]])
return p;
}
diff --git a/clang/test/CodeGenHLSL/semantics/missing.hlsl b/clang/test/CodeGenHLSL/semantics/missing.hlsl
deleted file mode 100644
index 3ba725e49c2c0..0000000000000
--- a/clang/test/CodeGenHLSL/semantics/missing.hlsl
+++ /dev/null
@@ -1,7 +0,0 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -emit-llvm -disable-llvm-passes -o - -hlsl-entry main %s -verify -verify-ignore-unexpected=note
-// RUN: %clang_cc1 -triple spirv-unknown-vulkan-compute -x hlsl -emit-llvm -disable-llvm-passes -o - -hlsl-entry main %s -verify -verify-ignore-unexpected=note
-
-[numthreads(1,1,1)]
-void main(unsigned GI) {
- // expected-error at -1 {{semantic annotations must be present for all parameters of an entry function or patch constant function}}
-}
diff --git a/clang/test/ParserHLSL/semantic_parsing.hlsl b/clang/test/ParserHLSL/semantic_parsing.hlsl
index 726deadb7c44c..34df1805c5a95 100644
--- a/clang/test/ParserHLSL/semantic_parsing.hlsl
+++ b/clang/test/ParserHLSL/semantic_parsing.hlsl
@@ -1,41 +1,7 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -o - %s -verify
-// RUN: %clang_cc1 -triple spirv-unknown-vulkan1.3-compute -x hlsl -o - %s -verify
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -ast-dump -o - %s -verify
// expected-error at +1 {{expected HLSL Semantic identifier}}
void Entry(int GI : ) { }
// expected-error at +1 {{unknown HLSL semantic 'SV_IWantAPony'}}
void Pony(int GI : SV_IWantAPony) { }
-
-// expected-error at +3 {{expected HLSL Semantic identifier}}
-// expected-error at +2 {{expected ')'}}
-// expected-note at +1 {{to match this '('}}
-void SuperPony(int GI : 0) { }
-
-// expected-error at +1 {{unknown HLSL semantic '_'}}
-void MegaPony(int GI : _) { }
-
-// expected-error at +1 {{unknown HLSL semantic 'A0A'}}
-void CoolPony(int GI : A0A0) { }
-
-// expected-error at +1 {{unknown HLSL semantic 'A_'}}
-void NicePony(int GI : A_0) { }
-
-// expected-error at +1 {{unknown HLSL semantic 'A'}}
-void CutePony(int GI : A00) { }
-
-// expected-error at +3 {{unknown HLSL semantic 'A'}}
-// expected-error at +2 {{expected ')'}}
-// expected-note at +1 {{to match this '('}}
-void DoublePony(int GI : A00 B) { }
-
-// expected-error at +1 {{unknown HLSL semantic 'é'}}
-void BigPony(int GI : é) { }
-
-// expected-error at +2 {{unexpected character <U+1F60A>}}
-// expected-error at +1 {{expected HLSL Semantic identifier}}
-void UTFPony(int GI : 😊) { }
-
-// expected-error at +2 {{character <U+1F60A> not allowed in an identifier}}
-// expected-error at +1 {{unknown HLSL semantic 'PonyWithA😊'}}
-void SmilingPony(int GI : PonyWithA😊) { }
diff --git a/clang/test/ParserHLSL/semantic_parsing_define.hlsl b/clang/test/ParserHLSL/semantic_parsing_define.hlsl
deleted file mode 100644
index b42e2e6abd3de..0000000000000
--- a/clang/test/ParserHLSL/semantic_parsing_define.hlsl
+++ /dev/null
@@ -1,7 +0,0 @@
-// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -o - %s -verify
-// RUN: %clang_cc1 -triple spirv-unknown-vulkan1.3-compute -x hlsl -o - %s -verify
-
-#define SomeDefine SV_IWantAPony
-
-// expected-error at 7 {{unknown HLSL semantic 'SV_IWantAPony'}}
-void Pony(int GI : SomeDefine) { }
diff --git a/clang/test/SemaHLSL/Semantics/invalid_entry_parameter.hlsl b/clang/test/SemaHLSL/Semantics/invalid_entry_parameter.hlsl
index 070075d419df1..1bb4ee5182d62 100644
--- a/clang/test/SemaHLSL/Semantics/invalid_entry_parameter.hlsl
+++ b/clang/test/SemaHLSL/Semantics/invalid_entry_parameter.hlsl
@@ -17,13 +17,13 @@ void CSMain2(ST ID : SV_DispatchThreadID) {
}
void foo() {
-// expected-warning at +1 {{'SV_DispatchThreadID' attribute only applies to parameters, non-static data members, and functions}}
+// expected-warning at +1 {{'SV_DispatchThreadID' attribute only applies to parameters and non-static data members}}
uint V : SV_DispatchThreadID;
}
struct ST2 {
-// expected-warning at +1 {{'SV_DispatchThreadID' attribute only applies to parameters, non-static data members, and functions}}
+// expected-warning at +1 {{'SV_DispatchThreadID' attribute only applies to parameters and non-static data members}}
static uint X : SV_DispatchThreadID;
uint s : SV_DispatchThreadID;
};
@@ -40,12 +40,12 @@ void CSMain2_GID(ST GID : SV_GroupID) {
}
void foo_GID() {
-// expected-warning at +1 {{'SV_GroupID' attribute only applies to parameters, non-static data members, and functions}}
+// expected-warning at +1 {{'SV_GroupID' attribute only applies to parameters and non-static data members}}
uint GIS : SV_GroupID;
}
struct ST2_GID {
-// expected-warning at +1 {{'SV_GroupID' attribute only applies to parameters, non-static data members, and functions}}
+// expected-warning at +1 {{'SV_GroupID' attribute only applies to parameters and non-static data members}}
static uint GID : SV_GroupID;
uint s_gid : SV_GroupID;
};
@@ -62,12 +62,12 @@ void CSMain2_GThreadID(ST GID : SV_GroupThreadID) {
}
void foo_GThreadID() {
-// expected-warning at +1 {{'SV_GroupThreadID' attribute only applies to parameters, non-static data members, and functions}}
+// expected-warning at +1 {{'SV_GroupThreadID' attribute only applies to parameters and non-static data members}}
uint GThreadIS : SV_GroupThreadID;
}
struct ST2_GThreadID {
-// expected-warning at +1 {{'SV_GroupThreadID' attribute only applies to parameters, non-static data members, and functions}}
+// expected-warning at +1 {{'SV_GroupThreadID' attribute only applies to parameters and non-static data members}}
static uint GThreadID : SV_GroupThreadID;
uint s_gthreadid : SV_GroupThreadID;
};
diff --git a/clang/utils/TableGen/ClangAttrEmitter.cpp b/clang/utils/TableGen/ClangAttrEmitter.cpp
index e76e2db3774ed..d63e79a5f5155 100644
--- a/clang/utils/TableGen/ClangAttrEmitter.cpp
+++ b/clang/utils/TableGen/ClangAttrEmitter.cpp
@@ -2725,15 +2725,12 @@ static void emitAttributes(const RecordKeeper &Records, raw_ostream &OS,
assert(!Supers.empty() && "Forgot to specify a superclass for the attr");
std::string SuperName;
bool Inheritable = false;
- bool HLSLSemantic = false;
for (const Record *R : reverse(Supers)) {
if (R->getName() != "TargetSpecificAttr" &&
R->getName() != "DeclOrTypeAttr" && SuperName.empty())
SuperName = R->getName().str();
if (R->getName() == "InheritableAttr")
Inheritable = true;
- if (R->getName() == "HLSLSemanticAttr")
- HLSLSemantic = true;
}
if (Header)
@@ -3057,8 +3054,6 @@ static void emitAttributes(const RecordKeeper &Records, raw_ostream &OS,
<< (R.getValueAsBit("InheritEvenIfAlreadyPresent") ? "true"
: "false");
}
- if (HLSLSemantic)
- OS << ", " << (R.getValueAsBit("SemanticIndexable") ? "true" : "false");
OS << ")\n";
for (auto const &ai : Args) {
@@ -3275,8 +3270,7 @@ static const AttrClassDescriptor AttrClassDescriptors[] = {
{"INHERITABLE_PARAM_ATTR", "InheritableParamAttr"},
{"INHERITABLE_PARAM_OR_STMT_ATTR", "InheritableParamOrStmtAttr"},
{"PARAMETER_ABI_ATTR", "ParameterABIAttr"},
- {"HLSL_ANNOTATION_ATTR", "HLSLAnnotationAttr"},
- {"HLSL_SEMANTIC_ATTR", "HLSLSemanticAttr"}};
+ {"HLSL_ANNOTATION_ATTR", "HLSLAnnotationAttr"}};
static void emitDefaultDefine(raw_ostream &OS, StringRef name,
const char *superName) {
More information about the cfe-commits
mailing list