@@ -68,6 +68,11 @@ extractShaderVisibility(MDNode *Node, unsigned int OpId) {
6868 return make_error<InvalidRSMetadataValue>(" ShaderVisibility" );
6969}
7070
71+ static uint64_t updateOngoingOffset (uint64_t CurOfset, uint64_t NumDescriptors,
72+ uint64_t Offset) {
73+ return Offset == ~0U ? CurOfset + NumDescriptors : Offset + NumDescriptors;
74+ }
75+
7176namespace {
7277
7378// We use the OverloadVisit with std::visit to ensure the compiler catches if a
@@ -549,32 +554,40 @@ Error validateDescriptorTableRegisterOverflow(mcdxbc::DescriptorTable Table,
549554 uint32_t Location) {
550555 uint64_t Offset = 0 ;
551556
552- for (const llvm::mcdxbc::DescriptorRange &Range : Table.Ranges ) {
557+ for (const mcdxbc::DescriptorRange &Range : Table.Ranges ) {
558+ // Errors for this check should be emitted before this point.
559+ if (Range.NumDescriptors <= 0 )
560+ continue ;
553561 dxil::ResourceClass RangeType =
554562 static_cast <dxil::ResourceClass>(Range.RangeType );
555563
556- if (Range.OffsetInDescriptorsFromTableStart != llvm::hlsl::rootsig:: DescriptorTableOffsetAppend)
564+ if (Range.OffsetInDescriptorsFromTableStart != DescriptorTableOffsetAppend)
557565 Offset = Range.OffsetInDescriptorsFromTableStart ;
558566
559- uint64_t RangeBound = llvm::hlsl::rootsig::computeRangeBound (
560- Offset, Range.NumDescriptors );
561- if (verifyBoundOffset (Offset))
562- return make_error<DescriptorRangeOverflowError>(
563- RangeType, Range.BaseShaderRegister ,
564- Range.RegisterSpace );
565- else if (!verifyNoOverflowedOffset (Offset))
567+ if (!verifyNoOverflowedOffset (Offset))
566568 return make_error<OffsetOverflowError>(RangeType,
567569 Range.BaseShaderRegister ,
568570 Range.RegisterSpace );
569571
570- if (!verifyNoOverflowedOffset (Range.BaseShaderRegister ))
572+ const uint64_t RangeBound = llvm::hlsl::rootsig::computeRangeBound (
573+ Range.BaseShaderRegister , Range.NumDescriptors );
574+
575+ if (!verifyNoOverflowedOffset (RangeBound))
571576 return make_error<ShaderRegisterOverflowError>(
572577 RangeType, Range.BaseShaderRegister ,
573578 Range.RegisterSpace );
574579
575- Offset = RangeBound == llvm::hlsl::rootsig::NumDescriptorsUnbounded
576- ? uint32_t (RangeBound)
577- : uint32_t (RangeBound + 1 );
580+ const uint64_t OffsetBound =
581+ llvm::hlsl::rootsig::computeRangeBound (Offset, Range.NumDescriptors );
582+
583+ if (!verifyNoOverflowedOffset (OffsetBound))
584+ return make_error<DescriptorRangeOverflowError>(
585+ RangeType, Range.BaseShaderRegister , Range.RegisterSpace );
586+
587+ // Append to the current offset if DescriptorTableOffsetAppend, otherwise
588+ // calculate the new Offset.
589+ Offset = updateOngoingOffset (Offset, Range.NumDescriptors ,
590+ Range.OffsetInDescriptorsFromTableStart );
578591 }
579592
580593 return Error::success ();
0 commit comments