1 //===--- LexHLSLRootSignature.h ---------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the LexHLSLRootSignature interface. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LEX_LEXHLSLROOTSIGNATURE_H 14 #define LLVM_CLANG_LEX_LEXHLSLROOTSIGNATURE_H 15 16 #include "clang/Basic/Diagnostic.h" 17 #include "clang/Basic/SourceLocation.h" 18 19 #include "llvm/ADT/SmallVector.h" 20 #include "llvm/ADT/StringRef.h" 21 #include "llvm/ADT/StringSwitch.h" 22 23 namespace clang { 24 namespace hlsl { 25 26 struct RootSignatureToken { 27 enum Kind { 28 #define TOK(X, SPELLING) X, 29 #include "clang/Lex/HLSLRootSignatureTokenKinds.def" 30 }; 31 32 Kind TokKind = Kind::invalid; 33 34 // Retain the location offset of the token in the Signature 35 // string 36 uint32_t LocOffset; 37 38 // Retain spelling of an numeric constant to be parsed later 39 StringRef NumSpelling; 40 41 // Constructors RootSignatureTokenRootSignatureToken42 RootSignatureToken(uint32_t LocOffset) : LocOffset(LocOffset) {} RootSignatureTokenRootSignatureToken43 RootSignatureToken(Kind TokKind, uint32_t LocOffset) 44 : TokKind(TokKind), LocOffset(LocOffset) {} 45 }; 46 47 inline const DiagnosticBuilder & 48 operator<<(const DiagnosticBuilder &DB, const RootSignatureToken::Kind Kind) { 49 switch (Kind) { 50 #define TOK(X, SPELLING) \ 51 case RootSignatureToken::Kind::X: \ 52 DB << SPELLING; \ 53 break; 54 #define PUNCTUATOR(X, SPELLING) \ 55 case RootSignatureToken::Kind::pu_##X: \ 56 DB << #SPELLING; \ 57 break; 58 #include "clang/Lex/HLSLRootSignatureTokenKinds.def" 59 } 60 return DB; 61 } 62 63 class RootSignatureLexer { 64 public: RootSignatureLexer(StringRef Signature)65 RootSignatureLexer(StringRef Signature) : Buffer(Signature) {} 66 67 /// Consumes and returns the next token. 68 RootSignatureToken consumeToken(); 69 70 /// Returns the token that proceeds CurToken 71 RootSignatureToken peekNextToken(); 72 isEndOfBuffer()73 bool isEndOfBuffer() { 74 advanceBuffer(Buffer.take_while(isspace).size()); 75 return Buffer.empty(); 76 } 77 78 private: 79 // Internal buffer state 80 StringRef Buffer; 81 uint32_t LocOffset = 0; 82 83 // Current peek state 84 std::optional<RootSignatureToken> NextToken = std::nullopt; 85 86 /// Consumes the buffer and returns the lexed token. 87 RootSignatureToken lexToken(); 88 89 /// Advance the buffer by the specified number of characters. 90 /// Updates the SourceLocation appropriately. 91 void advanceBuffer(unsigned NumCharacters = 1) { 92 Buffer = Buffer.drop_front(NumCharacters); 93 LocOffset += NumCharacters; 94 } 95 }; 96 97 } // namespace hlsl 98 } // namespace clang 99 100 #endif // LLVM_CLANG_LEX_PARSEHLSLROOTSIGNATURE_H 101