Skip to content

Commit d2b4aea

Browse files
committed
adding multiple error messages
1 parent 84d4579 commit d2b4aea

File tree

6 files changed

+90
-23
lines changed

6 files changed

+90
-23
lines changed

llvm/include/llvm/Frontend/HLSL/RootSignatureMetadata.h

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,15 @@ class RootSignatureValidationError
4848
}
4949
};
5050

51-
class TableRegisterOverflowError
52-
: public ErrorInfo<TableRegisterOverflowError> {
51+
class OffsetOverflowError : public ErrorInfo<OffsetOverflowError> {
5352
public:
5453
static char ID;
5554
dxbc::DescriptorRangeType Type;
5655
uint32_t Register;
5756
uint32_t Space;
5857

59-
TableRegisterOverflowError(dxbc::DescriptorRangeType Type, uint32_t Register,
60-
uint32_t Space)
58+
OffsetOverflowError(dxbc::DescriptorRangeType Type, uint32_t Register,
59+
uint32_t Space)
6160
: Type(Type), Register(Register), Space(Space) {}
6261

6362
void log(raw_ostream &OS) const override {
@@ -72,6 +71,52 @@ class TableRegisterOverflowError
7271
}
7372
};
7473

74+
class ShaderRegisterOverflowError
75+
: public ErrorInfo<ShaderRegisterOverflowError> {
76+
public:
77+
static char ID;
78+
dxbc::DescriptorRangeType Type;
79+
uint32_t Register;
80+
uint32_t Space;
81+
82+
ShaderRegisterOverflowError(dxbc::DescriptorRangeType Type, uint32_t Register,
83+
uint32_t Space)
84+
: Type(Type), Register(Register), Space(Space) {}
85+
86+
void log(raw_ostream &OS) const override {
87+
OS << "Overflow for shader register range: "
88+
<< getResourceClassName(toResourceClass(Type))
89+
<< "(register=" << Register << ", space=" << Space << ").";
90+
}
91+
92+
std::error_code convertToErrorCode() const override {
93+
return llvm::inconvertibleErrorCode();
94+
}
95+
};
96+
97+
class DescriptorRangeOverflowError
98+
: public ErrorInfo<DescriptorRangeOverflowError> {
99+
public:
100+
static char ID;
101+
dxbc::DescriptorRangeType Type;
102+
uint32_t Register;
103+
uint32_t Space;
104+
105+
DescriptorRangeOverflowError(dxbc::DescriptorRangeType Type,
106+
uint32_t Register, uint32_t Space)
107+
: Type(Type), Register(Register), Space(Space) {}
108+
109+
void log(raw_ostream &OS) const override {
110+
OS << "Overflow for descriptor range: "
111+
<< getResourceClassName(toResourceClass(Type))
112+
<< "(register=" << Register << ", space=" << Space << ").";
113+
}
114+
115+
std::error_code convertToErrorCode() const override {
116+
return llvm::inconvertibleErrorCode();
117+
}
118+
};
119+
75120
class TableSamplerMixinError : public ErrorInfo<TableSamplerMixinError> {
76121
public:
77122
static char ID;

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,10 @@ LLVM_ABI bool verifyBorderColor(uint32_t BorderColor);
4343
LLVM_ABI bool verifyLOD(float LOD);
4444
LLVM_ABI bool verifyRegisterOverflow(uint64_t Register,
4545
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);
46+
LLVM_ABI uint64_t updateAppendingRegister(uint64_t AppendingRegisterRegister,
47+
uint64_t NumDescriptors,
48+
uint64_t Offset);
49+
LLVM_ABI bool verifyOffsetOverflow(uint64_t Register);
4950

5051
} // namespace rootsig
5152
} // namespace hlsl

llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ char GenericRSMetadataError::ID;
2727
char InvalidRSMetadataFormat::ID;
2828
char InvalidRSMetadataValue::ID;
2929
char TableSamplerMixinError::ID;
30-
char TableRegisterOverflowError::ID;
30+
char ShaderRegisterOverflowError::ID;
31+
char OffsetOverflowError::ID;
32+
char DescriptorRangeOverflowError::ID;
33+
3134
template <typename T> char RootSignatureValidationError<T>::ID;
3235

3336
static std::optional<uint32_t> extractMdIntValue(MDNode *Node,
@@ -547,21 +550,25 @@ Error validateDescriptorTableRegisterOverflow(mcdxbc::DescriptorTable Table,
547550
dxbc::DescriptorRangeType RangeType =
548551
static_cast<dxbc::DescriptorRangeType>(Range.RangeType);
549552

550-
if (verifyOffsetOverflow(Range.OffsetInDescriptorsFromTableStart,
551-
AppendingRegister))
552-
return make_error<TableRegisterOverflowError>(
553+
uint64_t StartSlot = AppendingRegister;
554+
if (Range.OffsetInDescriptorsFromTableStart != ~0U)
555+
StartSlot = Range.OffsetInDescriptorsFromTableStart;
556+
557+
if (verifyOffsetOverflow(StartSlot))
558+
return make_error<OffsetOverflowError>(
553559
RangeType, Range.BaseShaderRegister, Range.RegisterSpace);
554560

555561
if (verifyRegisterOverflow(Range.BaseShaderRegister, Range.NumDescriptors))
556-
return make_error<TableRegisterOverflowError>(
562+
return make_error<ShaderRegisterOverflowError>(
557563
RangeType, Range.BaseShaderRegister, Range.RegisterSpace);
558564

559-
if (verifyRegisterOverflow(AppendingRegister, Range.NumDescriptors))
560-
return make_error<TableRegisterOverflowError>(
565+
if (verifyRegisterOverflow(StartSlot, Range.NumDescriptors))
566+
return make_error<DescriptorRangeOverflowError>(
561567
RangeType, Range.BaseShaderRegister, Range.RegisterSpace);
562568

563569
AppendingRegister =
564-
updateAppendingRegister(AppendingRegister, Range.NumDescriptors);
570+
updateAppendingRegister(StartSlot, Range.NumDescriptors,
571+
Range.OffsetInDescriptorsFromTableStart);
565572
}
566573

567574
return Error::success();

llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,7 @@ bool verifyBorderColor(uint32_t BorderColor) {
180180

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

183-
bool verifyOffsetOverflow(uint32_t Offset, uint64_t Register) {
184-
if (Offset != ~0U)
185-
Register = Offset;
186-
183+
bool verifyOffsetOverflow(uint64_t Register) {
187184
if (Register > ~0U)
188185
return true;
189186
return false;
@@ -201,11 +198,12 @@ bool verifyRegisterOverflow(uint64_t Register, uint32_t NumDescriptors) {
201198
return false;
202199
}
203200

204-
uint64_t updateAppendingRegister(uint64_t AppendingRegisterRegister,
205-
uint32_t NumDescriptors) {
201+
uint64_t updateAppendingRegister(uint64_t AppendingRegister,
202+
uint64_t NumDescriptors, uint64_t Offset) {
206203
if (NumDescriptors == ~0U)
207204
return (uint64_t)~0U + (uint64_t)1ULL;
208-
return AppendingRegisterRegister + NumDescriptors;
205+
return Offset == ~0U ? AppendingRegister + NumDescriptors
206+
: Offset + NumDescriptors;
209207
}
210208
} // namespace rootsig
211209
} // namespace hlsl
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
; RUN: not opt -S -passes='dxil-post-optimization-validation' -mtriple=dxil-pc-shadermodel6.6-compute %s 2>&1 | FileCheck %s
2+
; CHECK: error: Overflow for descriptor range: UAV(register=0, space=0)
3+
@TB.str = private unnamed_addr constant [3 x i8] c"TB\00", align 1
4+
5+
define void @CSMain() "hlsl.shader"="compute" {
6+
entry:
7+
ret void
8+
}
9+
10+
!dx.rootsignatures = !{!0}
11+
12+
!0 = !{ptr @CSMain, !1, i32 2}
13+
!1 = !{!3}
14+
!3 = !{!"DescriptorTable", i32 0, !4, !5}
15+
!4 = !{!"UAV", i32 100, i32 0, i32 0, i32 4294967294, i32 0}
16+
!5 = !{!"UAV", i32 1, i32 101, i32 0, i32 10, i32 0}

llvm/test/CodeGen/DirectX/rootsignature-validation-fail-register-overflow.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
; RUN: not opt -S -passes='dxil-post-optimization-validation' -mtriple=dxil-pc-shadermodel6.6-compute %s 2>&1 | FileCheck %s
2-
; CHECK: error: Cannot append range with implicit lower bound after an unbounded range UAV(register=4294967295, space=0).
2+
; CHECK: error: Overflow for shader register range: UAV(register=4294967295, space=0)
33
@TB.str = private unnamed_addr constant [3 x i8] c"TB\00", align 1
44

55
define void @CSMain() "hlsl.shader"="compute" {

0 commit comments

Comments
 (0)