Skip to content

Commit 84d4579

Browse files
committed
refactoring suggested by inbelic
1 parent 34619da commit 84d4579

File tree

3 files changed

+42
-44
lines changed

3 files changed

+42
-44
lines changed

llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "llvm/ADT/IntervalMap.h"
1818
#include "llvm/Frontend/HLSL/HLSLRootSignature.h"
1919
#include "llvm/Support/Compiler.h"
20+
#include <cstdint>
2021

2122
namespace llvm {
2223
namespace hlsl {
@@ -40,9 +41,11 @@ LLVM_ABI bool verifyMaxAnisotropy(uint32_t MaxAnisotropy);
4041
LLVM_ABI bool verifyComparisonFunc(uint32_t ComparisonFunc);
4142
LLVM_ABI bool verifyBorderColor(uint32_t BorderColor);
4243
LLVM_ABI bool verifyLOD(float LOD);
43-
LLVM_ABI bool verifyOffsetOverflowing(
44-
uint64_t &AppendingRegister, uint32_t OffsetInDescriptorsFromTableStart,
45-
uint32_t BaseRegister, uint32_t Space, uint32_t NumDescriptors);
44+
LLVM_ABI bool verifyRegisterOverflow(uint64_t Register,
45+
uint32_t NumDescriptors);
46+
LLVM_ABI uint64_t updateAppendingRegister(uint64_t Register,
47+
uint32_t NumDescriptors);
48+
LLVM_ABI bool verifyOffsetOverflow(uint32_t Offset, uint64_t Register);
4649

4750
} // namespace rootsig
4851
} // namespace hlsl

llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -546,12 +546,22 @@ Error validateDescriptorTableRegisterOverflow(mcdxbc::DescriptorTable Table,
546546
for (const dxbc::RTS0::v2::DescriptorRange &Range : Table.Ranges) {
547547
dxbc::DescriptorRangeType RangeType =
548548
static_cast<dxbc::DescriptorRangeType>(Range.RangeType);
549-
if (verifyOffsetOverflowing(AppendingRegister,
550-
Range.OffsetInDescriptorsFromTableStart,
551-
Range.BaseShaderRegister, Range.RegisterSpace,
552-
Range.NumDescriptors))
549+
550+
if (verifyOffsetOverflow(Range.OffsetInDescriptorsFromTableStart,
551+
AppendingRegister))
552+
return make_error<TableRegisterOverflowError>(
553+
RangeType, Range.BaseShaderRegister, Range.RegisterSpace);
554+
555+
if (verifyRegisterOverflow(Range.BaseShaderRegister, Range.NumDescriptors))
553556
return make_error<TableRegisterOverflowError>(
554557
RangeType, Range.BaseShaderRegister, Range.RegisterSpace);
558+
559+
if (verifyRegisterOverflow(AppendingRegister, Range.NumDescriptors))
560+
return make_error<TableRegisterOverflowError>(
561+
RangeType, Range.BaseShaderRegister, Range.RegisterSpace);
562+
563+
AppendingRegister =
564+
updateAppendingRegister(AppendingRegister, Range.NumDescriptors);
555565
}
556566

557567
return Error::success();

llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -180,48 +180,33 @@ bool verifyBorderColor(uint32_t BorderColor) {
180180

181181
bool verifyLOD(float LOD) { return !std::isnan(LOD); }
182182

183-
/** This validation logic was extracted from the DXC codebase
184-
* https://github.com/microsoft/DirectXShaderCompiler/blob/7a1b1df9b50a8350a63756720e85196e0285e664/lib/DxilRootSignature/DxilRootSignatureValidator.cpp#L205
185-
*
186-
* It checks if the registers in a descriptor table are overflowing, meaning,
187-
* they are trying to bind a register larger than MAX_UINT.
188-
* This will usually happen when the descriptor table appends a resource
189-
* after an unbounded range.
190-
**/
191-
bool verifyOffsetOverflowing(uint64_t &AppendingRegister,
192-
uint32_t OffsetInDescriptorsFromTableStart,
193-
uint32_t BaseRegister, uint32_t Space,
194-
uint32_t NumDescriptors) {
195-
uint64_t Register = AppendingRegister;
196-
197-
// Checks if the current register should be appended to the previous range.
198-
if (OffsetInDescriptorsFromTableStart != ~0U)
199-
Register = OffsetInDescriptorsFromTableStart;
200-
201-
// Check for overflow in the register value.
183+
bool verifyOffsetOverflow(uint32_t Offset, uint64_t Register) {
184+
if (Offset != ~0U)
185+
Register = Offset;
186+
202187
if (Register > ~0U)
203188
return true;
204-
// Is the current range unbounded?
205-
if (NumDescriptors == ~0U) {
206-
// No ranges should be appended to an unbounded range.
207-
AppendingRegister = (uint64_t)~0U + (uint64_t)1ULL;
208-
} else {
209-
// Is the defined range, overflowing?
210-
uint64_t UpperBound =
211-
(uint64_t)BaseRegister + (uint64_t)NumDescriptors - (uint64_t)1U;
212-
if (UpperBound > ~0U)
213-
return true;
214-
215-
// If we append this range, will it overflow?
216-
uint64_t AppendingUpperBound =
217-
(uint64_t)Register + (uint64_t)NumDescriptors - (uint64_t)1U;
218-
if (AppendingUpperBound > ~0U)
219-
return true;
220-
AppendingRegister = Register + NumDescriptors;
221-
}
222189
return false;
223190
}
224191

192+
bool verifyRegisterOverflow(uint64_t Register, uint32_t NumDescriptors) {
193+
if (NumDescriptors == ~0U)
194+
return false;
195+
196+
uint64_t UpperBound =
197+
(uint64_t)Register + (uint64_t)NumDescriptors - (uint64_t)1U;
198+
if (UpperBound > ~0U)
199+
return true;
200+
201+
return false;
202+
}
203+
204+
uint64_t updateAppendingRegister(uint64_t AppendingRegisterRegister,
205+
uint32_t NumDescriptors) {
206+
if (NumDescriptors == ~0U)
207+
return (uint64_t)~0U + (uint64_t)1ULL;
208+
return AppendingRegisterRegister + NumDescriptors;
209+
}
225210
} // namespace rootsig
226211
} // namespace hlsl
227212
} // namespace llvm

0 commit comments

Comments
 (0)