@@ -97,7 +97,7 @@ bool RootSignatureParser::ParseDescriptorTable() {
97
97
return true ;
98
98
}
99
99
SeenVisibility = true ;
100
- if (ParseParam (&Table.Visibility ))
100
+ if (ParseParam (&Table.Visibility , TokenKind::kw_visibility ))
101
101
return true ;
102
102
continue ;
103
103
}
@@ -158,7 +158,7 @@ bool RootSignatureParser::ParseDescriptorTableClause() {
158
158
{TokenKind::kw_offset, &Clause.Offset },
159
159
{TokenKind::kw_flags, &Clause.Flags },
160
160
};
161
- if (ParseOptionalParams ({RefMap}))
161
+ if (ParseOptionalParams ({RefMap}, Context ))
162
162
return true ;
163
163
164
164
if (ConsumeExpectedToken (TokenKind::pu_r_paren, diag::err_expected_after, CurToken.Kind ))
@@ -172,20 +172,20 @@ bool RootSignatureParser::ParseDescriptorTableClause() {
172
172
template <class ... Ts> struct ParseMethods : Ts... { using Ts::operator ()...; };
173
173
template <class ... Ts> ParseMethods (Ts...) -> ParseMethods<Ts...>;
174
174
175
- bool RootSignatureParser::ParseParam (ParamType Ref) {
175
+ bool RootSignatureParser::ParseParam (ParamType Ref, TokenKind Context ) {
176
176
if (ConsumeExpectedToken (TokenKind::pu_equal, diag::err_expected_after, CurToken.Kind ))
177
177
return true ;
178
178
179
179
bool Error;
180
180
std::visit (
181
181
ParseMethods{
182
- [&](uint32_t *X) { Error = ParseUInt (X); },
182
+ [&](uint32_t *X) { Error = ParseUInt (X, Context ); },
183
183
[&](DescriptorRangeOffset *X) {
184
- Error = ParseDescriptorRangeOffset (X);
184
+ Error = ParseDescriptorRangeOffset (X, Context );
185
185
},
186
- [&](ShaderVisibility *Enum) { Error = ParseShaderVisibility (Enum); },
186
+ [&](ShaderVisibility *Enum) { Error = ParseShaderVisibility (Enum, Context ); },
187
187
[&](DescriptorRangeFlags *Flags) {
188
- Error = ParseDescriptorRangeFlags (Flags);
188
+ Error = ParseDescriptorRangeFlags (Flags, Context );
189
189
},
190
190
},
191
191
Ref);
@@ -194,7 +194,7 @@ bool RootSignatureParser::ParseParam(ParamType Ref) {
194
194
}
195
195
196
196
bool RootSignatureParser::ParseOptionalParams (
197
- llvm::SmallDenseMap<TokenKind, ParamType> &RefMap) {
197
+ llvm::SmallDenseMap<TokenKind, ParamType> &RefMap, TokenKind Context ) {
198
198
SmallVector<TokenKind> ParamKeywords;
199
199
for (auto RefPair : RefMap)
200
200
ParamKeywords.push_back (RefPair.first );
@@ -214,7 +214,7 @@ bool RootSignatureParser::ParseOptionalParams(
214
214
}
215
215
Seen.insert (ParamKind);
216
216
217
- if (ParseParam (RefMap[ParamKind]))
217
+ if (ParseParam (RefMap[ParamKind], ParamKind ))
218
218
return true ;
219
219
}
220
220
@@ -274,10 +274,10 @@ bool RootSignatureParser::ParseRegister(Register *Register, TokenKind Context) {
274
274
return false ;
275
275
}
276
276
277
- bool RootSignatureParser::ParseUInt (uint32_t *X) {
277
+ bool RootSignatureParser::ParseUInt (uint32_t *X, TokenKind Context ) {
278
278
// Treat a postively signed integer as though it is unsigned to match DXC
279
279
TryConsumeExpectedToken (TokenKind::pu_plus);
280
- if (ConsumeExpectedToken (TokenKind::int_literal))
280
+ if (ConsumeExpectedToken (TokenKind::int_literal, diag::err_hlsl_expected_value, Context ))
281
281
return true ;
282
282
283
283
if (HandleUIntLiteral (*X))
@@ -286,9 +286,12 @@ bool RootSignatureParser::ParseUInt(uint32_t *X) {
286
286
return false ;
287
287
}
288
288
289
- bool RootSignatureParser::ParseDescriptorRangeOffset (DescriptorRangeOffset *X) {
289
+ bool RootSignatureParser::ParseDescriptorRangeOffset (DescriptorRangeOffset *X, TokenKind Context ) {
290
290
if (ConsumeExpectedToken (
291
- {TokenKind::int_literal, TokenKind::en_DescriptorRangeOffsetAppend}))
291
+ {TokenKind::int_literal, TokenKind::en_DescriptorRangeOffsetAppend},
292
+ diag::err_hlsl_expected_value,
293
+ Context
294
+ ))
292
295
return true ;
293
296
294
297
// Edge case for the offset enum -> static value
@@ -306,15 +309,15 @@ bool RootSignatureParser::ParseDescriptorRangeOffset(DescriptorRangeOffset *X) {
306
309
307
310
template <bool AllowZero, typename EnumType>
308
311
bool RootSignatureParser::ParseEnum (
309
- llvm::SmallDenseMap<TokenKind, EnumType> &EnumMap, EnumType *Enum) {
312
+ llvm::SmallDenseMap<TokenKind, EnumType> &EnumMap, EnumType *Enum, TokenKind Context ) {
310
313
SmallVector<TokenKind> EnumToks;
311
314
if (AllowZero)
312
315
EnumToks.push_back (TokenKind::int_literal); // '0' is a valid flag value
313
316
for (auto EnumPair : EnumMap)
314
317
EnumToks.push_back (EnumPair.first );
315
318
316
319
// If invoked we expect to have an enum
317
- if (ConsumeExpectedToken (EnumToks))
320
+ if (ConsumeExpectedToken (EnumToks, diag::err_hlsl_expected_value, Context ))
318
321
return true ;
319
322
320
323
// Handle the edge case when '0' is used to specify None
@@ -341,26 +344,26 @@ bool RootSignatureParser::ParseEnum(
341
344
llvm_unreachable (" Switch for an expected token was not provided" );
342
345
}
343
346
344
- bool RootSignatureParser::ParseShaderVisibility (ShaderVisibility *Enum) {
347
+ bool RootSignatureParser::ParseShaderVisibility (ShaderVisibility *Enum, TokenKind Context ) {
345
348
// Define the possible flag kinds
346
349
llvm::SmallDenseMap<TokenKind, ShaderVisibility> EnumMap = {
347
350
#define SHADER_VISIBILITY_ENUM (NAME, LIT ) \
348
351
{TokenKind::en_##NAME, ShaderVisibility::NAME},
349
352
#include " clang/Lex/HLSLRootSignatureTokenKinds.def"
350
353
};
351
354
352
- return ParseEnum (EnumMap, Enum);
355
+ return ParseEnum (EnumMap, Enum, Context );
353
356
}
354
357
355
358
template <typename FlagType>
356
359
bool RootSignatureParser::ParseFlags (
357
- llvm::SmallDenseMap<TokenKind, FlagType> &FlagMap, FlagType *Flags) {
360
+ llvm::SmallDenseMap<TokenKind, FlagType> &FlagMap, FlagType *Flags, TokenKind Context ) {
358
361
// Override the default value to 0 so that we can correctly 'or' the values
359
362
*Flags = FlagType (0 );
360
363
361
364
do {
362
365
FlagType Flag;
363
- if (ParseEnum<true >(FlagMap, &Flag))
366
+ if (ParseEnum<true >(FlagMap, &Flag, Context ))
364
367
return true ;
365
368
// Store the 'or'
366
369
*Flags |= Flag;
@@ -370,15 +373,15 @@ bool RootSignatureParser::ParseFlags(
370
373
}
371
374
372
375
bool RootSignatureParser::ParseDescriptorRangeFlags (
373
- DescriptorRangeFlags *Flags) {
376
+ DescriptorRangeFlags *Flags, TokenKind Context ) {
374
377
// Define the possible flag kinds
375
378
llvm::SmallDenseMap<TokenKind, DescriptorRangeFlags> FlagMap = {
376
379
#define DESCRIPTOR_RANGE_FLAG_ENUM (NAME, LIT, ON ) \
377
380
{TokenKind::en_##NAME, DescriptorRangeFlags::NAME},
378
381
#include " clang/Lex/HLSLRootSignatureTokenKinds.def"
379
382
};
380
383
381
- return ParseFlags (FlagMap, Flags);
384
+ return ParseFlags (FlagMap, Flags, Context );
382
385
}
383
386
384
387
// Is given token one of the expected kinds
@@ -419,6 +422,7 @@ bool RootSignatureParser::ConsumeExpectedToken(ArrayRef<TokenKind> AnyExpected,
419
422
case diag::err_expected_either:
420
423
case diag::err_expected_after:
421
424
case diag::err_hlsl_expected_param:
425
+ case diag::err_hlsl_expected_value:
422
426
DB << FormatTokenKinds (AnyExpected) << FormatTokenKinds ({Context});
423
427
break ;
424
428
default : break ;
0 commit comments