12
12
// ===----------------------------------------------------------------------===//
13
13
#include " DXILRootSignature.h"
14
14
#include " DirectX.h"
15
+ #include " llvm/ADT/STLForwardCompat.h"
15
16
#include " llvm/ADT/StringSwitch.h"
16
17
#include " llvm/ADT/Twine.h"
17
18
#include " llvm/Analysis/DXILMetadataAnalysis.h"
30
31
#include < cstdint>
31
32
#include < optional>
32
33
#include < utility>
34
+ #include < variant>
33
35
34
36
using namespace llvm ;
35
37
using namespace llvm ::dxil;
@@ -217,6 +219,19 @@ static bool verifyVersion(uint32_t Version) {
217
219
return (Version == 1 || Version == 2 );
218
220
}
219
221
222
+ static bool verifyRegisterValue (uint32_t RegisterValue) {
223
+ return !(RegisterValue == 0xFFFFFFFF );
224
+ }
225
+
226
+ static bool verifyRegisterSpace (uint32_t RegisterSpace) {
227
+ return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace <= 0xFFFFFFFF );
228
+ }
229
+
230
+ static bool verifyDescriptorFlag (uint32_t Flags) {
231
+ return (Flags & ~0xE ) == 0 ;
232
+ }
233
+
234
+
220
235
static bool validate (LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
221
236
222
237
if (!verifyVersion (RSD.Version )) {
@@ -234,6 +249,38 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
234
249
235
250
assert (dxbc::isValidParameterType (Info.Header .ParameterType ) &&
236
251
" Invalid value for ParameterType" );
252
+
253
+
254
+ auto P = RSD.ParametersContainer .getParameter (&Info);
255
+ if (!P)
256
+ return reportError (Ctx, " Cannot locate parameter from Header Info" );
257
+
258
+ if ( std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(*P)){
259
+ auto *Descriptor = std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value ());
260
+
261
+ if (!verifyRegisterValue (Descriptor->ShaderRegister ))
262
+ return reportValueError (Ctx, " ShaderRegister" ,
263
+ Descriptor->ShaderRegister );
264
+
265
+ if (!verifyRegisterSpace (Descriptor->RegisterSpace ))
266
+ return reportValueError (Ctx, " RegisterSpace" ,
267
+ Descriptor->RegisterSpace );
268
+
269
+ } else if ( std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(*P)){
270
+ auto *Descriptor = std::get<const dxbc::RTS0::v2::RootDescriptor *>(P.value ());
271
+
272
+ if (!verifyRegisterValue (Descriptor->ShaderRegister ))
273
+ return reportValueError (Ctx, " ShaderRegister" ,
274
+ Descriptor->ShaderRegister );
275
+
276
+ if (!verifyRegisterSpace (Descriptor->RegisterSpace ))
277
+ return reportValueError (Ctx, " RegisterSpace" ,
278
+ Descriptor->RegisterSpace );
279
+
280
+ if (!verifyDescriptorFlag (Descriptor->Flags ))
281
+ return reportValueError (Ctx, " DescriptorFlag" ,
282
+ Descriptor->Flags );
283
+ }
237
284
}
238
285
239
286
return false ;
@@ -370,6 +417,20 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
370
417
<< " Shader Register: " << Constants->ShaderRegister << " \n " ;
371
418
OS << indent (Space + 2 )
372
419
<< " Num 32 Bit Values: " << Constants->Num32BitValues << " \n " ;
420
+ } else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(*P)) {
421
+ auto *Constants = std::get<const dxbc::RTS0::v1::RootDescriptor *>(*P);
422
+ OS << indent (Space + 2 )
423
+ << " Register Space: " << Constants->RegisterSpace << " \n " ;
424
+ OS << indent (Space + 2 )
425
+ << " Shader Register: " << Constants->ShaderRegister << " \n " ;
426
+ } else if (std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(*P)) {
427
+ auto *Constants = std::get<const dxbc::RTS0::v2::RootDescriptor *>(*P);
428
+ OS << indent (Space + 2 )
429
+ << " Register Space: " << Constants->RegisterSpace << " \n " ;
430
+ OS << indent (Space + 2 )
431
+ << " Shader Register: " << Constants->ShaderRegister << " \n " ;
432
+ OS << indent (Space + 2 )
433
+ << " Flags: " << Constants->Flags << " \n " ;
373
434
}
374
435
}
375
436
Space--;
0 commit comments