@@ -117,26 +117,21 @@ bool RootSignatureParser::parseDescriptorTableClause() {
117117 ParamKind))
118118 return true ;
119119
120- TokenKind Keywords[2 ] = {
121- ExpectedRegister,
122- TokenKind::kw_space,
123- };
124- ParsedParamState Params (Keywords, ParamKind, CurToken.TokLoc );
125- if (parseParams (Params))
120+ ParsedParams Result;
121+ if (parseDescriptorTableClauseParams (Result, ExpectedRegister))
126122 return true ;
127123
128- // Mandatory parameters:
129- if (!Params. checkAndClearSeen (ExpectedRegister )) {
124+ // Check mandatory parameters were provided
125+ if (!Result. Register . has_value ( )) {
130126 getDiags ().Report (CurToken.TokLoc , diag::err_hlsl_rootsig_missing_param)
131127 << ExpectedRegister;
132128 return true ;
133129 }
134130
135- Clause.Register = Params .Register ;
131+ Clause.Register = *Result .Register ;
136132
137- // Optional parameters:
138- if (Params.checkAndClearSeen (TokenKind::kw_space))
139- Clause.Space = Params.Space ;
133+ if (Result.Space )
134+ Clause.Space = *Result.Space ;
140135
141136 if (consumeExpectedToken (TokenKind::pu_r_paren,
142137 diag::err_hlsl_unexpected_end_of_params,
@@ -147,66 +142,36 @@ bool RootSignatureParser::parseDescriptorTableClause() {
147142 return false ;
148143}
149144
150- size_t RootSignatureParser::ParsedParamState::getKeywordIdx (
151- RootSignatureToken::Kind Keyword) {
152- ArrayRef KeywordRef = Keywords;
153- auto It = llvm::find (KeywordRef, Keyword);
154- assert (It != KeywordRef.end () && " Did not provide a valid param keyword" );
155- return std::distance (KeywordRef.begin (), It);
156- }
157-
158- bool RootSignatureParser::ParsedParamState::checkAndSetSeen (
159- RootSignatureToken::Kind Keyword) {
160- size_t Idx = getKeywordIdx (Keyword);
161- bool WasSeen = Seen & (1 << Idx);
162- Seen |= 1u << Idx;
163- return WasSeen;
164- }
165-
166- bool RootSignatureParser::ParsedParamState::checkAndClearSeen (
167- RootSignatureToken::Kind Keyword) {
168- size_t Idx = getKeywordIdx (Keyword);
169- bool WasSeen = Seen & (1 << Idx);
170- Seen &= ~(1u << Idx);
171- return WasSeen;
172- }
173-
174- bool RootSignatureParser::parseParam (ParsedParamState &Params) {
175- TokenKind Keyword = CurToken.TokKind ;
176- if (Keyword == TokenKind::bReg || Keyword == TokenKind::tReg ||
177- Keyword == TokenKind::uReg || Keyword == TokenKind::sReg ) {
178- return parseRegister (Params.Register );
179- }
180-
181- if (consumeExpectedToken (TokenKind::pu_equal, diag::err_expected_after,
182- Keyword))
183- return true ;
184-
185- switch (Keyword) {
186- case RootSignatureToken::Kind::kw_space:
187- return parseUIntParam (Params.Space );
188- default :
189- llvm_unreachable (" Switch for consumed keyword was not provided" );
190- }
191- }
192-
193- bool RootSignatureParser::parseParams (ParsedParamState &Params) {
145+ bool RootSignatureParser::parseDescriptorTableClauseParams (ParsedParams &Params, TokenKind RegType) {
194146 assert (CurToken.TokKind == TokenKind::pu_l_paren &&
195147 " Expects to only be invoked starting at given token" );
196148
197- while (tryConsumeExpectedToken (Params.Keywords )) {
198- if (Params.checkAndSetSeen (CurToken.TokKind )) {
199- getDiags ().Report (CurToken.TokLoc , diag::err_hlsl_rootsig_repeat_param)
149+ do {
150+ if (tryConsumeExpectedToken (RegType)) {
151+ if (Params.Register .has_value ()) {
152+ getDiags ().Report (CurToken.TokLoc , diag::err_hlsl_rootsig_repeat_param)
200153 << CurToken.TokKind ;
201- return true ;
154+ return true ;
155+ }
156+ Register Reg;
157+ if (parseRegister (Reg))
158+ return true ;
159+ Params.Register = Reg;
202160 }
203-
204- if (parseParam (Params))
205- return true ;
206-
207- if (!tryConsumeExpectedToken (TokenKind::pu_comma))
208- break ;
209- }
161+ if (tryConsumeExpectedToken (TokenKind::kw_space)) {
162+ if (Params.Space .has_value ()) {
163+ getDiags ().Report (CurToken.TokLoc , diag::err_hlsl_rootsig_repeat_param)
164+ << CurToken.TokKind ;
165+ return true ;
166+ }
167+ if (consumeExpectedToken (TokenKind::pu_equal))
168+ return true ;
169+ uint32_t Space;
170+ if (parseUIntParam (Space))
171+ return true ;
172+ Params.Space = Space;
173+ }
174+ } while (tryConsumeExpectedToken (TokenKind::pu_comma));
210175
211176 return false ;
212177}
0 commit comments