|
24 | 24 | #include "clang/Basic/LLVM.h" |
25 | 25 | #include "clang/Basic/SourceLocation.h" |
26 | 26 | #include "clang/Basic/TargetInfo.h" |
| 27 | +#include "clang/Parse/ParseHLSLRootSignature.h" |
27 | 28 | #include "clang/Sema/Initialization.h" |
28 | 29 | #include "clang/Sema/ParsedAttr.h" |
29 | 30 | #include "clang/Sema/Sema.h" |
@@ -647,6 +648,41 @@ void SemaHLSL::emitLogicalOperatorFixIt(Expr *LHS, Expr *RHS, |
647 | 648 | << NewFnName << FixItHint::CreateReplacement(FullRange, OS.str()); |
648 | 649 | } |
649 | 650 |
|
| 651 | +void SemaHLSL::handleRootSignatureAttr(Decl *D, const ParsedAttr &AL) { |
| 652 | + using namespace llvm::hlsl::root_signature; |
| 653 | + |
| 654 | + if (AL.getNumArgs() != 1) |
| 655 | + return; |
| 656 | + |
| 657 | + StringRef Signature; |
| 658 | + if (!SemaRef.checkStringLiteralArgumentAttr(AL, 0, Signature)) |
| 659 | + return; |
| 660 | + |
| 661 | + SourceLocation Loc = AL.getArgAsExpr(0)->getExprLoc(); |
| 662 | + // FIXME: pass down below to lexer when fp is supported |
| 663 | + // llvm::RoundingMode RM = SemaRef.CurFPFeatures.getRoundingMode(); |
| 664 | + SmallVector<RootSignatureToken> Tokens; |
| 665 | + RootSignatureLexer Lexer(Signature, Loc, SemaRef.getPreprocessor()); |
| 666 | + if (Lexer.Lex(Tokens)) |
| 667 | + return; |
| 668 | + |
| 669 | + SmallVector<RootElement> Elements; |
| 670 | + RootSignatureParser Parser(Elements, Tokens); |
| 671 | + if (Parser.Parse()) |
| 672 | + return; |
| 673 | + |
| 674 | + unsigned N = Elements.size(); |
| 675 | + auto RootElements = |
| 676 | + MutableArrayRef<RootElement>(::new (getASTContext()) RootElement[N], N); |
| 677 | + for (unsigned I = 0; I < N; ++I) |
| 678 | + RootElements[I] = Elements[I]; |
| 679 | + |
| 680 | + auto *Result = ::new (getASTContext()) |
| 681 | + HLSLRootSignatureAttr(getASTContext(), AL, Signature); |
| 682 | + Result->setElements(ArrayRef<RootElement>(RootElements)); |
| 683 | + D->addAttr(Result); |
| 684 | +} |
| 685 | + |
650 | 686 | void SemaHLSL::handleNumThreadsAttr(Decl *D, const ParsedAttr &AL) { |
651 | 687 | llvm::VersionTuple SMVersion = |
652 | 688 | getASTContext().getTargetInfo().getTriple().getOSVersion(); |
|
0 commit comments