[NFC][HLSL] Move Sema work from ParseMicrosoftRootSignatureAttributeArgs (#143184)
This separates semantic analysis from parsing by moving `RootSignatureDecl` creation, scope storage, and lookup logic into `SemaHLSL`. For more context see: https://github.com/llvm/llvm-project/issues/142834. - Define `ActOnStartRootSignatureDecl` and `ActOnFinishRootSignatureDecl` on `SemaHLSL` - NFC so no test changes. Resolves: https://github.com/llvm/llvm-project/issues/142834 --------- Co-authored-by: Aaron Ballman <aaron@aaronballman.com>
This commit is contained in:
@@ -3598,7 +3598,7 @@ private:
|
||||
/// keyword.
|
||||
bool isClassCompatibleKeyword(Token Tok) const;
|
||||
|
||||
void ParseMicrosoftRootSignatureAttributeArgs(ParsedAttributes &Attrs);
|
||||
void ParseHLSLRootSignatureAttributeArgs(ParsedAttributes &Attrs);
|
||||
|
||||
///@}
|
||||
|
||||
|
||||
@@ -119,6 +119,19 @@ public:
|
||||
bool IsCompAssign);
|
||||
void emitLogicalOperatorFixIt(Expr *LHS, Expr *RHS, BinaryOperatorKind Opc);
|
||||
|
||||
/// Computes the unique Root Signature identifier from the given signature,
|
||||
/// then lookup if there is a previousy created Root Signature decl.
|
||||
///
|
||||
/// Returns the identifier and if it was found
|
||||
std::pair<IdentifierInfo *, bool>
|
||||
ActOnStartRootSignatureDecl(StringRef Signature);
|
||||
|
||||
/// Creates the Root Signature decl of the parsed Root Signature elements
|
||||
/// onto the AST and push it onto current Scope
|
||||
void ActOnFinishRootSignatureDecl(
|
||||
SourceLocation Loc, IdentifierInfo *DeclIdent,
|
||||
SmallVector<llvm::hlsl::rootsig::RootElement> &Elements);
|
||||
|
||||
void handleRootSignatureAttr(Decl *D, const ParsedAttr &AL);
|
||||
void handleNumThreadsAttr(Decl *D, const ParsedAttr &AL);
|
||||
void handleWaveSizeAttr(Decl *D, const ParsedAttr &AL);
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "clang/Sema/ParsedTemplate.h"
|
||||
#include "clang/Sema/Scope.h"
|
||||
#include "clang/Sema/SemaCodeCompletion.h"
|
||||
#include "clang/Sema/SemaHLSL.h"
|
||||
#include "llvm/Support/TimeProfiler.h"
|
||||
#include <optional>
|
||||
|
||||
@@ -4903,7 +4904,7 @@ void Parser::ParseMicrosoftUuidAttributeArgs(ParsedAttributes &Attrs) {
|
||||
}
|
||||
}
|
||||
|
||||
void Parser::ParseMicrosoftRootSignatureAttributeArgs(ParsedAttributes &Attrs) {
|
||||
void Parser::ParseHLSLRootSignatureAttributeArgs(ParsedAttributes &Attrs) {
|
||||
assert(Tok.is(tok::identifier) &&
|
||||
"Expected an identifier to denote which MS attribute to consider");
|
||||
IdentifierInfo *RootSignatureIdent = Tok.getIdentifierInfo();
|
||||
@@ -4945,18 +4946,14 @@ void Parser::ParseMicrosoftRootSignatureAttributeArgs(ParsedAttributes &Attrs) {
|
||||
|
||||
// Construct our identifier
|
||||
StringRef Signature = StrLiteral.value()->getString();
|
||||
auto Hash = llvm::hash_value(Signature);
|
||||
std::string IdStr = "__hlsl_rootsig_decl_" + std::to_string(Hash);
|
||||
IdentifierInfo *DeclIdent = &(Actions.getASTContext().Idents.get(IdStr));
|
||||
|
||||
LookupResult R(Actions, DeclIdent, SourceLocation(),
|
||||
Sema::LookupOrdinaryName);
|
||||
// Check if we have already found a decl of the same name, if we haven't
|
||||
// then parse the root signature string and construct the in-memory elements
|
||||
if (!Actions.LookupQualifiedName(R, Actions.CurContext)) {
|
||||
auto [DeclIdent, Found] =
|
||||
Actions.HLSL().ActOnStartRootSignatureDecl(Signature);
|
||||
// If we haven't found an already defined DeclIdent then parse the root
|
||||
// signature string and construct the in-memory elements
|
||||
if (!Found) {
|
||||
// Offset location 1 to account for '"'
|
||||
SourceLocation SignatureLoc =
|
||||
StrLiteral.value()->getExprLoc().getLocWithOffset(
|
||||
1); // offset 1 for '"'
|
||||
StrLiteral.value()->getExprLoc().getLocWithOffset(1);
|
||||
// Invoke the root signature parser to construct the in-memory constructs
|
||||
hlsl::RootSignatureLexer Lexer(Signature, SignatureLoc);
|
||||
SmallVector<llvm::hlsl::rootsig::RootElement> RootElements;
|
||||
@@ -4966,12 +4963,9 @@ void Parser::ParseMicrosoftRootSignatureAttributeArgs(ParsedAttributes &Attrs) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Create the Root Signature
|
||||
auto *SignatureDecl = HLSLRootSignatureDecl::Create(
|
||||
Actions.getASTContext(), /*DeclContext=*/Actions.CurContext,
|
||||
RootSignatureLoc, DeclIdent, RootElements);
|
||||
SignatureDecl->setImplicit();
|
||||
Actions.PushOnScopeChains(SignatureDecl, getCurScope());
|
||||
// Construct the declaration.
|
||||
Actions.HLSL().ActOnFinishRootSignatureDecl(RootSignatureLoc, DeclIdent,
|
||||
RootElements);
|
||||
}
|
||||
|
||||
// Create the arg for the ParsedAttr
|
||||
@@ -5014,7 +5008,7 @@ void Parser::ParseMicrosoftAttributes(ParsedAttributes &Attrs) {
|
||||
if (Tok.getIdentifierInfo()->getName() == "uuid")
|
||||
ParseMicrosoftUuidAttributeArgs(Attrs);
|
||||
else if (Tok.getIdentifierInfo()->getName() == "RootSignature")
|
||||
ParseMicrosoftRootSignatureAttributeArgs(Attrs);
|
||||
ParseHLSLRootSignatureAttributeArgs(Attrs);
|
||||
else {
|
||||
IdentifierInfo *II = Tok.getIdentifierInfo();
|
||||
SourceLocation NameLoc = Tok.getLocation();
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/Frontend/HLSL/HLSLRootSignature.h"
|
||||
#include "llvm/Support/SaveAndRestore.h"
|
||||
#include "llvm/TargetParser/Triple.h"
|
||||
#include <algorithm>
|
||||
|
||||
@@ -978,6 +978,31 @@ void SemaHLSL::emitLogicalOperatorFixIt(Expr *LHS, Expr *RHS,
|
||||
<< NewFnName << FixItHint::CreateReplacement(FullRange, OS.str());
|
||||
}
|
||||
|
||||
std::pair<IdentifierInfo *, bool>
|
||||
SemaHLSL::ActOnStartRootSignatureDecl(StringRef Signature) {
|
||||
llvm::hash_code Hash = llvm::hash_value(Signature);
|
||||
std::string IdStr = "__hlsl_rootsig_decl_" + std::to_string(Hash);
|
||||
IdentifierInfo *DeclIdent = &(getASTContext().Idents.get(IdStr));
|
||||
|
||||
// Check if we have already found a decl of the same name.
|
||||
LookupResult R(SemaRef, DeclIdent, SourceLocation(),
|
||||
Sema::LookupOrdinaryName);
|
||||
bool Found = SemaRef.LookupQualifiedName(R, SemaRef.CurContext);
|
||||
return {DeclIdent, Found};
|
||||
}
|
||||
|
||||
void SemaHLSL::ActOnFinishRootSignatureDecl(
|
||||
SourceLocation Loc, IdentifierInfo *DeclIdent,
|
||||
SmallVector<llvm::hlsl::rootsig::RootElement> &Elements) {
|
||||
|
||||
auto *SignatureDecl = HLSLRootSignatureDecl::Create(
|
||||
SemaRef.getASTContext(), /*DeclContext=*/SemaRef.CurContext, Loc,
|
||||
DeclIdent, Elements);
|
||||
|
||||
SignatureDecl->setImplicit();
|
||||
SemaRef.PushOnScopeChains(SignatureDecl, SemaRef.getCurScope());
|
||||
}
|
||||
|
||||
void SemaHLSL::handleRootSignatureAttr(Decl *D, const ParsedAttr &AL) {
|
||||
if (AL.getNumArgs() != 1) {
|
||||
Diag(AL.getLoc(), diag::err_attribute_wrong_number_arguments) << AL << 1;
|
||||
|
||||
Reference in New Issue
Block a user