Skip to content

Commit 982f84a

Browse files
committed
hook up flag validations
1 parent 9f96427 commit 982f84a

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13078,6 +13078,8 @@ def err_hlsl_spirv_only: Error<"%0 is only available for the SPIR-V target">;
1307813078
def err_hlsl_vk_literal_must_contain_constant: Error<"the argument to vk::Literal must be a vk::integral_constant">;
1307913079

1308013080
def err_hlsl_invalid_rootsig_value : Error<"value must be in the range [%0, %1]">;
13081+
def err_hlsl_invalid_rootsig_flag : Error<
13082+
"invalid flags for version %select{1.0|1.1}0">;
1308113083

1308213084
def subst_hlsl_format_ranges: TextSubstitution<
1308313085
"%select{t|u|b|s}0[%1;%select{%3]|unbounded)}2">;

clang/lib/Sema/SemaHLSL.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,6 +1111,14 @@ bool SemaHLSL::handleRootSignatureElements(
11111111
ReportError(Loc, 0, 0xffffffef);
11121112
};
11131113

1114+
const uint32_t Version =
1115+
llvm::to_underlying(SemaRef.getLangOpts().HLSLRootSigVer);
1116+
const uint32_t VersionEnum = Version - 1;
1117+
auto ReportFlagError = [this, &HadError, VersionEnum](SourceLocation Loc) {
1118+
HadError = true;
1119+
this->Diag(Loc, diag::err_hlsl_invalid_rootsig_flag) << VersionEnum;
1120+
};
1121+
11141122
// Iterate through the elements and do basic validations
11151123
for (const hlsl::RootSignatureElement &RootSigElem : Elements) {
11161124
SourceLocation Loc = RootSigElem.getLocation();
@@ -1119,6 +1127,10 @@ bool SemaHLSL::handleRootSignatureElements(
11191127
std::get_if<llvm::hlsl::rootsig::RootDescriptor>(&Elem)) {
11201128
VerifyRegister(Loc, Descriptor->Reg.Number);
11211129
VerifySpace(Loc, Descriptor->Space);
1130+
1131+
if (!llvm::hlsl::rootsig::verifyRootDescriptorFlag(
1132+
Version, llvm::to_underlying(Descriptor->Flags)))
1133+
ReportFlagError(Loc);
11221134
} else if (const auto *Constants =
11231135
std::get_if<llvm::hlsl::rootsig::RootConstants>(&Elem)) {
11241136
VerifyRegister(Loc, Constants->Reg.Number);
@@ -1148,6 +1160,11 @@ bool SemaHLSL::handleRootSignatureElements(
11481160
// value
11491161
ReportError(Loc, 1, 0xfffffffe);
11501162
}
1163+
1164+
if (!llvm::hlsl::rootsig::verifyDescriptorRangeFlag(
1165+
Version, llvm::to_underlying(Clause->Type),
1166+
llvm::to_underlying(Clause->Flags)))
1167+
ReportFlagError(Loc);
11511168
}
11521169
}
11531170

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -fsyntax-only \
2+
// RUN: -fdx-rootsignature-version=rootsig_1_0 %s -verify=v10
3+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -fsyntax-only \
4+
// RUN: -fdx-rootsignature-version=rootsig_1_1 %s -verify=v11
5+
6+
// Root Descriptor Flags:
7+
8+
// v10-error@+1 {{invalid flags for version 1.0}}
9+
[RootSignature("CBV(b0, flags = DATA_STATIC)")]
10+
void bad_root_descriptor_flags_0() {}
11+
12+
// v10-error@+1 {{invalid flags for version 1.0}}
13+
[RootSignature("CBV(b0, flags = DATA_STATIC_WHILE_SET_AT_EXECUTE)")]
14+
void bad_root_descriptor_flags_1() {}
15+
16+
// v10-error@+2 {{invalid flags for version 1.0}}
17+
// v11-error@+1 {{invalid flags for version 1.1}}
18+
[RootSignature("CBV(b0, flags = DATA_STATIC | DATA_VOLATILE)")]
19+
void bad_root_descriptor_flags_2() {}
20+
21+
// Descriptor Range Flags:
22+
23+
// v10-error@+1 {{invalid flags for version 1.0}}
24+
[RootSignature("DescriptorTable(CBV(b0, flags = DATA_VOLATILE))")]
25+
void bad_descriptor_range_flags_0() {}
26+
27+
// v10-error@+1 {{invalid flags for version 1.0}}
28+
[RootSignature("DescriptorTable(CBV(b0, flags = DATA_STATIC))")]
29+
void bad_descriptor_range_flags_1() {}
30+
31+
// v10-error@+1 {{invalid flags for version 1.0}}
32+
[RootSignature("DescriptorTable(CBV(b0, flags = DATA_STATIC_WHILE_SET_AT_EXECUTE | DESCRIPTORS_VOLATILE))")]
33+
void bad_descriptor_range_flags_2() {}
34+
35+
// v10-error@+1 {{invalid flags for version 1.0}}
36+
[RootSignature("DescriptorTable(CBV(b0, flags = DESCRIPTORS_VOLATILE))")]
37+
void bad_descriptor_range_flags_3() {}
38+
39+
// v10-error@+1 {{invalid flags for version 1.0}}
40+
[RootSignature("DescriptorTable(CBV(b0, flags = DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS))")]
41+
void bad_descriptor_range_flags_4() {}
42+
43+
// v10-error@+2 {{invalid flags for version 1.0}}
44+
// v11-error@+1 {{invalid flags for version 1.1}}
45+
[RootSignature("DescriptorTable(CBV(b0, flags = DATA_STATIC | DATA_STATIC_WHILE_SET_AT_EXECUTE))")]
46+
void bad_descriptor_range_flags_5() {}
47+
48+
// v10-error@+2 {{invalid flags for version 1.0}}
49+
// v11-error@+1 {{invalid flags for version 1.1}}
50+
[RootSignature("DescriptorTable(CBV(b0, flags = DESCRIPTORS_VOLATILE | DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS))")]
51+
void bad_descriptor_range_flags_6() {}
52+
53+
// v10-error@+2 {{invalid flags for version 1.0}}
54+
// v11-error@+1 {{invalid flags for version 1.1}}
55+
[RootSignature("DescriptorTable(CBV(b0, flags = DESCRIPTORS_VOLATILE | DATA_STATIC))")]
56+
void bad_descriptor_range_flags_7() {}
57+

0 commit comments

Comments
 (0)