@@ -117,26 +117,21 @@ bool RootSignatureParser::parseDescriptorTableClause() {
117
117
ParamKind))
118
118
return true ;
119
119
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))
126
122
return true ;
127
123
128
- // Mandatory parameters:
129
- if (!Params. checkAndClearSeen (ExpectedRegister )) {
124
+ // Check mandatory parameters were provided
125
+ if (!Result. Register . has_value ( )) {
130
126
getDiags ().Report (CurToken.TokLoc , diag::err_hlsl_rootsig_missing_param)
131
127
<< ExpectedRegister;
132
128
return true ;
133
129
}
134
130
135
- Clause.Register = Params .Register ;
131
+ Clause.Register = *Result .Register ;
136
132
137
- // Optional parameters:
138
- if (Params.checkAndClearSeen (TokenKind::kw_space))
139
- Clause.Space = Params.Space ;
133
+ if (Result.Space )
134
+ Clause.Space = *Result.Space ;
140
135
141
136
if (consumeExpectedToken (TokenKind::pu_r_paren,
142
137
diag::err_hlsl_unexpected_end_of_params,
@@ -147,66 +142,36 @@ bool RootSignatureParser::parseDescriptorTableClause() {
147
142
return false ;
148
143
}
149
144
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) {
194
146
assert (CurToken.TokKind == TokenKind::pu_l_paren &&
195
147
" Expects to only be invoked starting at given token" );
196
148
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)
200
153
<< CurToken.TokKind ;
201
- return true ;
154
+ return true ;
155
+ }
156
+ Register Reg;
157
+ if (parseRegister (Reg))
158
+ return true ;
159
+ Params.Register = Reg;
202
160
}
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));
210
175
211
176
return false ;
212
177
}
0 commit comments