https://github.com/inbelic updated https://github.com/llvm/llvm-project/pull/145795
>From 43991791409d376e682c6a482941fcc4cd43b0bc Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 9 Jul 2025 19:25:19 +0000 Subject: [PATCH 1/9] add basic integer range validations --- .../clang/Basic/DiagnosticSemaKinds.td | 2 + clang/lib/Sema/SemaHLSL.cpp | 63 ++++++++++++++++++- clang/test/SemaHLSL/RootSignature-err.hlsl | 31 +++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index f1290738d46b2..5d6c8b4ee79a4 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -13091,6 +13091,8 @@ def err_invalid_hlsl_resource_type: Error< def err_hlsl_spirv_only: Error<"%0 is only available for the SPIR-V target">; def err_hlsl_vk_literal_must_contain_constant: Error<"the argument to vk::Literal must be a vk::integral_constant">; +def err_hlsl_invalid_rootsig_value : Error<"value must be in the range [%0, %1]">; + def subst_hlsl_format_ranges: TextSubstitution< "%select{t|u|b|s}0[%1;%select{%3]|unbounded)}2">; diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 9af32138f9385..65c36ad4f7d09 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -44,6 +44,7 @@ #include "llvm/Support/DXILABI.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/TargetParser/Triple.h" +#include <cmath> #include <cstddef> #include <iterator> #include <utility> @@ -1083,6 +1084,63 @@ void SemaHLSL::ActOnFinishRootSignatureDecl( bool SemaHLSL::handleRootSignatureElements( ArrayRef<hlsl::RootSignatureElement> Elements) { + // Define some common error handling functions + bool HadError = false; + auto ReportError = [this, &HadError](SourceLocation Loc, uint32_t LowerBound, + uint32_t UpperBound) { + HadError = true; + this->Diag(Loc, diag::err_hlsl_invalid_rootsig_value) + << LowerBound << UpperBound; + }; + + auto VerifyRegister = [ReportError](SourceLocation Loc, uint32_t Register) { + if (!llvm::hlsl::rootsig::verifyRegisterValue(Register)) + ReportError(Loc, 0, 0xfffffffe); + }; + + auto VerifySpace = [ReportError](SourceLocation Loc, uint32_t Space) { + if (!llvm::hlsl::rootsig::verifyRegisterSpace(Space)) + ReportError(Loc, 0, 0xffffffef); + }; + + // Iterate through the elements and do basic validations + for (const hlsl::RootSignatureElement &RootSigElem : Elements) { + SourceLocation Loc = RootSigElem.getLocation(); + const llvm::hlsl::rootsig::RootElement &Elem = RootSigElem.getElement(); + if (const auto *Descriptor = + std::get_if<llvm::hlsl::rootsig::RootDescriptor>(&Elem)) { + VerifyRegister(Loc, Descriptor->Reg.Number); + VerifySpace(Loc, Descriptor->Space); + } else if (const auto *Constants = + std::get_if<llvm::hlsl::rootsig::RootConstants>(&Elem)) { + VerifyRegister(Loc, Constants->Reg.Number); + VerifySpace(Loc, Constants->Space); + } else if (const auto *Sampler = + std::get_if<llvm::hlsl::rootsig::StaticSampler>(&Elem)) { + VerifyRegister(Loc, Sampler->Reg.Number); + VerifySpace(Loc, Sampler->Space); + + assert(!std::isnan(Sampler->MaxLOD) && !std::isnan(Sampler->MinLOD) && + "By construction, parseFloatParam can't produce a NaN from a " + "float_literal token"); + + if (16 < Sampler->MaxAnisotropy) + ReportError(Loc, 0, 16); + } else if (const auto *Clause = + std::get_if<llvm::hlsl::rootsig::DescriptorTableClause>( + &Elem)) { + VerifyRegister(Loc, Clause->Reg.Number); + VerifySpace(Loc, Clause->Space); + + if (!llvm::hlsl::rootsig::verifyNumDescriptors(Clause->NumDescriptors)) { + // NumDescriptor could techincally be ~0u but that is reserved for + // unbounded, so the diagnostic will not report that as a valid int + // value + ReportError(Loc, 1, 0xfffffffe); + } + } + } + using RangeInfo = llvm::hlsl::rootsig::RangeInfo; using OverlappingRanges = llvm::hlsl::rootsig::OverlappingRanges; using InfoPairT = std::pair<RangeInfo, const hlsl::RootSignatureElement *>; @@ -1130,7 +1188,10 @@ bool SemaHLSL::handleRootSignatureElements( &Elem)) { RangeInfo Info; Info.LowerBound = Clause->Reg.Number; - assert(0 < Clause->NumDescriptors && "Verified as part of TODO(#129940)"); + // Relevant error will have already been reported above and needs to be + // fixed before we can conduct range analysis, so shortcut error return + if (Clause->NumDescriptors == 0) + return true; Info.UpperBound = Clause->NumDescriptors == RangeInfo::Unbounded ? RangeInfo::Unbounded : Info.LowerBound + Clause->NumDescriptors - diff --git a/clang/test/SemaHLSL/RootSignature-err.hlsl b/clang/test/SemaHLSL/RootSignature-err.hlsl index 4b53a127d2adb..22f9dfd7ffa48 100644 --- a/clang/test/SemaHLSL/RootSignature-err.hlsl +++ b/clang/test/SemaHLSL/RootSignature-err.hlsl @@ -103,3 +103,34 @@ void bad_root_signature_22() {} // expected-error@+1 {{invalid value of RootFlags}} [RootSignature("RootFlags(local_root_signature | root_flag_typo)")] void bad_root_signature_23() {} + +// Basic validation of register value and space + +// expected-error@+2 {{value must be in the range [0, 4294967294]}} +// expected-error@+1 {{value must be in the range [0, 4294967279]}} +[RootSignature("CBV(b4294967295, space = 4294967280)")] +void basic_validation_0() {} + +// expected-error@+2 {{value must be in the range [0, 4294967294]}} +// expected-error@+1 {{value must be in the range [0, 4294967279]}} +[RootSignature("RootConstants(b4294967295, space = 4294967280, num32BitConstants = 1)")] +void basic_validation_1() {} + +// expected-error@+2 {{value must be in the range [0, 4294967294]}} +// expected-error@+1 {{value must be in the range [0, 4294967279]}} +[RootSignature("StaticSampler(s4294967295, space = 4294967280)")] +void basic_validation_2() {} + +// expected-error@+2 {{value must be in the range [0, 4294967294]}} +// expected-error@+1 {{value must be in the range [0, 4294967279]}} +[RootSignature("DescriptorTable(SRV(t4294967295, space = 4294967280))")] +void basic_validation_3() {} + +// expected-error@+2 {{value must be in the range [1, 4294967294]}} +// expected-error@+1 {{value must be in the range [1, 4294967294]}} +[RootSignature("DescriptorTable(UAV(u0, numDescriptors = 0), Sampler(s0, numDescriptors = 0))")] +void basic_validation_4() {} + +// expected-error@+1 {{value must be in the range [0, 16]}} +[RootSignature("StaticSampler(s0, maxAnisotropy = 17, mipLODBias = -16.000001)")] +void basic_validation_5() {} >From f234a706e56c9624e8b8f1e5d79eabe30a632b9d Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 9 Jul 2025 19:35:25 +0000 Subject: [PATCH 2/9] add basic float range validations --- clang/lib/Sema/SemaHLSL.cpp | 10 ++++++++++ clang/test/SemaHLSL/RootSignature-err.hlsl | 7 ++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 65c36ad4f7d09..8a18cfc1fdf2c 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -1093,6 +1093,14 @@ bool SemaHLSL::handleRootSignatureElements( << LowerBound << UpperBound; }; + auto ReportFloatError = [this, &HadError](SourceLocation Loc, + float LowerBound, + float UpperBound) { + HadError = true; + this->Diag(Loc, diag::err_hlsl_invalid_rootsig_value) + << std::to_string(LowerBound) << std::to_string(UpperBound); + }; + auto VerifyRegister = [ReportError](SourceLocation Loc, uint32_t Register) { if (!llvm::hlsl::rootsig::verifyRegisterValue(Register)) ReportError(Loc, 0, 0xfffffffe); @@ -1126,6 +1134,8 @@ bool SemaHLSL::handleRootSignatureElements( if (16 < Sampler->MaxAnisotropy) ReportError(Loc, 0, 16); + if (!llvm::hlsl::rootsig::verifyMipLODBias(Sampler->MipLODBias)) + ReportFloatError(Loc, -16.f, 15.99); } else if (const auto *Clause = std::get_if<llvm::hlsl::rootsig::DescriptorTableClause>( &Elem)) { diff --git a/clang/test/SemaHLSL/RootSignature-err.hlsl b/clang/test/SemaHLSL/RootSignature-err.hlsl index 22f9dfd7ffa48..eaa5c1a11ce55 100644 --- a/clang/test/SemaHLSL/RootSignature-err.hlsl +++ b/clang/test/SemaHLSL/RootSignature-err.hlsl @@ -131,6 +131,11 @@ void basic_validation_3() {} [RootSignature("DescriptorTable(UAV(u0, numDescriptors = 0), Sampler(s0, numDescriptors = 0))")] void basic_validation_4() {} -// expected-error@+1 {{value must be in the range [0, 16]}} +// expected-error@+2 {{value must be in the range [0, 16]}} +// expected-error@+1 {{value must be in the range [-16.000000, 15.990000]}} [RootSignature("StaticSampler(s0, maxAnisotropy = 17, mipLODBias = -16.000001)")] void basic_validation_5() {} + +// expected-error@+1 {{value must be in the range [-16.000000, 15.990000]}} +[RootSignature("StaticSampler(s0, mipLODBias = 15.990001)")] +void basic_validation_6() {} >From 697f1f621ecdf5d6c06208e110d3384972c2ff60 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 9 Jul 2025 19:36:30 +0000 Subject: [PATCH 3/9] fix testcase to use valid mipLODBias --- clang/test/CodeGenHLSL/RootSignature.hlsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/test/CodeGenHLSL/RootSignature.hlsl b/clang/test/CodeGenHLSL/RootSignature.hlsl index 6618ca741aa9d..52f94dfaf52c7 100644 --- a/clang/test/CodeGenHLSL/RootSignature.hlsl +++ b/clang/test/CodeGenHLSL/RootSignature.hlsl @@ -76,7 +76,7 @@ void RootDescriptorsEntry() {} // CHECK-SAME: i32 2, i32 3, i32 5, // checking mipLODBias, maxAnisotropy, comparisonFunc, borderColor -// CHECK-SAME: float 0x40403999A0000000, i32 9, i32 3, i32 2, +// CHECK-SAME: float 0x4028E66660000000, i32 9, i32 3, i32 2, // checking minLOD, maxLOD // CHECK-SAME: float -1.280000e+02, float 1.280000e+02, @@ -90,7 +90,7 @@ void RootDescriptorsEntry() {} " addressU = TEXTURE_ADDRESS_MIRROR, " \ " addressV = TEXTURE_ADDRESS_CLAMP, " \ " addressW = TEXTURE_ADDRESS_MIRRORONCE, " \ - " mipLODBias = 32.45f, maxAnisotropy = 9, " \ + " mipLODBias = 12.45f, maxAnisotropy = 9, " \ " comparisonFunc = COMPARISON_EQUAL, " \ " borderColor = STATIC_BORDER_COLOR_OPAQUE_WHITE, " \ " minLOD = -128.f, maxLOD = 128.f, " \ >From 77c8d3ef719b7c10d91c7a3b0eb88b0239295f4d Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 9 Jul 2025 19:56:51 +0000 Subject: [PATCH 4/9] hook up flag validations --- .../clang/Basic/DiagnosticSemaKinds.td | 2 + clang/lib/Sema/SemaHLSL.cpp | 17 ++++++ .../SemaHLSL/RootSignature-flags-err.hlsl | 57 +++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 clang/test/SemaHLSL/RootSignature-flags-err.hlsl diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 5d6c8b4ee79a4..9ad61341679cb 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -13092,6 +13092,8 @@ def err_hlsl_spirv_only: Error<"%0 is only available for the SPIR-V target">; def err_hlsl_vk_literal_must_contain_constant: Error<"the argument to vk::Literal must be a vk::integral_constant">; def err_hlsl_invalid_rootsig_value : Error<"value must be in the range [%0, %1]">; +def err_hlsl_invalid_rootsig_flag : Error< + "invalid flags for version %select{1.0|1.1}0">; def subst_hlsl_format_ranges: TextSubstitution< "%select{t|u|b|s}0[%1;%select{%3]|unbounded)}2">; diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 8a18cfc1fdf2c..b905186a3f01c 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -1111,6 +1111,14 @@ bool SemaHLSL::handleRootSignatureElements( ReportError(Loc, 0, 0xffffffef); }; + const uint32_t Version = + llvm::to_underlying(SemaRef.getLangOpts().HLSLRootSigVer); + const uint32_t VersionEnum = Version - 1; + auto ReportFlagError = [this, &HadError, VersionEnum](SourceLocation Loc) { + HadError = true; + this->Diag(Loc, diag::err_hlsl_invalid_rootsig_flag) << VersionEnum; + }; + // Iterate through the elements and do basic validations for (const hlsl::RootSignatureElement &RootSigElem : Elements) { SourceLocation Loc = RootSigElem.getLocation(); @@ -1119,6 +1127,10 @@ bool SemaHLSL::handleRootSignatureElements( std::get_if<llvm::hlsl::rootsig::RootDescriptor>(&Elem)) { VerifyRegister(Loc, Descriptor->Reg.Number); VerifySpace(Loc, Descriptor->Space); + + if (!llvm::hlsl::rootsig::verifyRootDescriptorFlag( + Version, llvm::to_underlying(Descriptor->Flags))) + ReportFlagError(Loc); } else if (const auto *Constants = std::get_if<llvm::hlsl::rootsig::RootConstants>(&Elem)) { VerifyRegister(Loc, Constants->Reg.Number); @@ -1148,6 +1160,11 @@ bool SemaHLSL::handleRootSignatureElements( // value ReportError(Loc, 1, 0xfffffffe); } + + if (!llvm::hlsl::rootsig::verifyDescriptorRangeFlag( + Version, llvm::to_underlying(Clause->Type), + llvm::to_underlying(Clause->Flags))) + ReportFlagError(Loc); } } diff --git a/clang/test/SemaHLSL/RootSignature-flags-err.hlsl b/clang/test/SemaHLSL/RootSignature-flags-err.hlsl new file mode 100644 index 0000000000000..9449d33cee1ad --- /dev/null +++ b/clang/test/SemaHLSL/RootSignature-flags-err.hlsl @@ -0,0 +1,57 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -fsyntax-only \ +// RUN: -fdx-rootsignature-version=rootsig_1_0 %s -verify=v10 +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -x hlsl -fsyntax-only \ +// RUN: -fdx-rootsignature-version=rootsig_1_1 %s -verify=v11 + +// Root Descriptor Flags: + +// v10-error@+1 {{invalid flags for version 1.0}} +[RootSignature("CBV(b0, flags = DATA_STATIC)")] +void bad_root_descriptor_flags_0() {} + +// v10-error@+1 {{invalid flags for version 1.0}} +[RootSignature("CBV(b0, flags = DATA_STATIC_WHILE_SET_AT_EXECUTE)")] +void bad_root_descriptor_flags_1() {} + +// v10-error@+2 {{invalid flags for version 1.0}} +// v11-error@+1 {{invalid flags for version 1.1}} +[RootSignature("CBV(b0, flags = DATA_STATIC | DATA_VOLATILE)")] +void bad_root_descriptor_flags_2() {} + +// Descriptor Range Flags: + +// v10-error@+1 {{invalid flags for version 1.0}} +[RootSignature("DescriptorTable(CBV(b0, flags = DATA_VOLATILE))")] +void bad_descriptor_range_flags_0() {} + +// v10-error@+1 {{invalid flags for version 1.0}} +[RootSignature("DescriptorTable(CBV(b0, flags = DATA_STATIC))")] +void bad_descriptor_range_flags_1() {} + +// v10-error@+1 {{invalid flags for version 1.0}} +[RootSignature("DescriptorTable(CBV(b0, flags = DATA_STATIC_WHILE_SET_AT_EXECUTE | DESCRIPTORS_VOLATILE))")] +void bad_descriptor_range_flags_2() {} + +// v10-error@+1 {{invalid flags for version 1.0}} +[RootSignature("DescriptorTable(CBV(b0, flags = DESCRIPTORS_VOLATILE))")] +void bad_descriptor_range_flags_3() {} + +// v10-error@+1 {{invalid flags for version 1.0}} +[RootSignature("DescriptorTable(CBV(b0, flags = DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS))")] +void bad_descriptor_range_flags_4() {} + +// v10-error@+2 {{invalid flags for version 1.0}} +// v11-error@+1 {{invalid flags for version 1.1}} +[RootSignature("DescriptorTable(CBV(b0, flags = DATA_STATIC | DATA_STATIC_WHILE_SET_AT_EXECUTE))")] +void bad_descriptor_range_flags_5() {} + +// v10-error@+2 {{invalid flags for version 1.0}} +// v11-error@+1 {{invalid flags for version 1.1}} +[RootSignature("DescriptorTable(CBV(b0, flags = DESCRIPTORS_VOLATILE | DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS))")] +void bad_descriptor_range_flags_6() {} + +// v10-error@+2 {{invalid flags for version 1.0}} +// v11-error@+1 {{invalid flags for version 1.1}} +[RootSignature("DescriptorTable(CBV(b0, flags = DESCRIPTORS_VOLATILE | DATA_STATIC))")] +void bad_descriptor_range_flags_7() {} + >From 5ae69b4043fd4349352b872b73fe93c8a8db41f4 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Wed, 9 Jul 2025 22:35:29 +0000 Subject: [PATCH 5/9] self-review: fix testcase to be compliant with version 1.0 as well --- clang/test/AST/HLSL/RootSignatures-AST.hlsl | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/clang/test/AST/HLSL/RootSignatures-AST.hlsl b/clang/test/AST/HLSL/RootSignatures-AST.hlsl index 27c40430c9d0a..df06165f1f1f9 100644 --- a/clang/test/AST/HLSL/RootSignatures-AST.hlsl +++ b/clang/test/AST/HLSL/RootSignatures-AST.hlsl @@ -13,14 +13,14 @@ #define SampleRS "RootFlags( ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT | " \ "DENY_VERTEX_SHADER_ROOT_ACCESS), " \ - "CBV(b0, space = 1, flags = DATA_STATIC), " \ + "CBV(b0, space = 1, flags = DATA_VOLATILE), " \ "SRV(t0), " \ "UAV(u0), " \ "DescriptorTable( CBV(b1), " \ "SRV(t1, numDescriptors = 8, " \ - " flags = DESCRIPTORS_VOLATILE), " \ + " flags = DATA_VOLATILE | DESCRIPTORS_VOLATILE), " \ "UAV(u1, numDescriptors = unbounded, " \ - " flags = DESCRIPTORS_VOLATILE)), " \ + " flags = DATA_VOLATILE | DESCRIPTORS_VOLATILE)), " \ "DescriptorTable(Sampler(s0, space=1, numDescriptors = 4)), " \ "RootConstants(num32BitConstants=3, b10), " \ "StaticSampler(s1)," \ @@ -34,7 +34,7 @@ // CHECK-SAME: RootElements{ // CHECK-SAME: RootFlags(AllowInputAssemblerInputLayout | DenyVertexShaderRootAccess), // CHECK-SAME: RootCBV(b0, -// CHECK-SAME: space = 1, visibility = All, flags = DataStatic +// CHECK-SAME: space = 1, visibility = All, flags = DataVolatile // CHECK-SAME: ), // CHECK-SAME: RootSRV(t0, // CHECK-SAME: space = 0, visibility = All, @@ -50,10 +50,10 @@ // CHECK-V1_1-SAME: flags = DataStaticWhileSetAtExecute // CHECK-SAME: ), // CHECK-SAME: SRV( -// CHECK-SAME: t1, numDescriptors = 8, space = 0, offset = DescriptorTableOffsetAppend, flags = DescriptorsVolatile +// CHECK-SAME: t1, numDescriptors = 8, space = 0, offset = DescriptorTableOffsetAppend, flags = DescriptorsVolatile | DataVolatile // CHECK-SAME: ), // CHECK-SAME: UAV( -// CHECK-SAME: u1, numDescriptors = unbounded, space = 0, offset = DescriptorTableOffsetAppend, flags = DescriptorsVolatile +// CHECK-SAME: u1, numDescriptors = unbounded, space = 0, offset = DescriptorTableOffsetAppend, flags = DescriptorsVolatile | DataVolatile // CHECK-SAME: ), // CHECK-SAME: DescriptorTable( // CHECK-SAME: numClauses = 3, visibility = All @@ -92,14 +92,14 @@ void same_rs_main() {} #define SampleSameRS \ "RootFlags( ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT | " \ "DENY_VERTEX_SHADER_ROOT_ACCESS), " \ - "CBV(b0, space = 1, flags = DATA_STATIC), " \ + "CBV(b0, space = 1, flags = DATA_VOLATILE), " \ "SRV(t0), " \ "UAV(u0), " \ "DescriptorTable( CBV(b1), " \ - "SRV(t1, numDescriptors = 8, " \ - " flags = DESCRIPTORS_VOLATILE), " \ - "UAV(u1, numDescriptors = unbounded, " \ - " flags = DESCRIPTORS_VOLATILE)), " \ + " SRV(t1, numDescriptors = 8, " \ + " flags = DATA_VOLATILE | DESCRIPTORS_VOLATILE), " \ + " UAV(u1, numDescriptors = unbounded, " \ + " flags = DATA_VOLATILE | DESCRIPTORS_VOLATILE)), " \ "DescriptorTable(Sampler(s0, space=1, numDescriptors = 4)), " \ "RootConstants(num32BitConstants=3, b10), " \ "StaticSampler(s1)," \ >From 4a2761d2d71d571e5cca57de289d777fbde35999 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 11 Jul 2025 22:55:33 +0000 Subject: [PATCH 6/9] review: change diag to directly input the version minor --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 +-- clang/lib/Sema/SemaHLSL.cpp | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 9ad61341679cb..595c38467693f 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -13092,8 +13092,7 @@ def err_hlsl_spirv_only: Error<"%0 is only available for the SPIR-V target">; def err_hlsl_vk_literal_must_contain_constant: Error<"the argument to vk::Literal must be a vk::integral_constant">; def err_hlsl_invalid_rootsig_value : Error<"value must be in the range [%0, %1]">; -def err_hlsl_invalid_rootsig_flag : Error< - "invalid flags for version %select{1.0|1.1}0">; +def err_hlsl_invalid_rootsig_flag : Error< "invalid flags for version 1.%0">; def subst_hlsl_format_ranges: TextSubstitution< "%select{t|u|b|s}0[%1;%select{%3]|unbounded)}2">; diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index b905186a3f01c..28953422770c6 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -1116,7 +1116,8 @@ bool SemaHLSL::handleRootSignatureElements( const uint32_t VersionEnum = Version - 1; auto ReportFlagError = [this, &HadError, VersionEnum](SourceLocation Loc) { HadError = true; - this->Diag(Loc, diag::err_hlsl_invalid_rootsig_flag) << VersionEnum; + this->Diag(Loc, diag::err_hlsl_invalid_rootsig_flag) + << /*version minor*/ VersionEnum; }; // Iterate through the elements and do basic validations >From 153b38f1e2dc25762d9ef799aec496db2afaa01c Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 11 Jul 2025 22:57:46 +0000 Subject: [PATCH 7/9] review: correct the check of MaxAnisotropy --- clang/lib/Sema/SemaHLSL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 28953422770c6..bd318010492c0 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -1145,7 +1145,7 @@ bool SemaHLSL::handleRootSignatureElements( "By construction, parseFloatParam can't produce a NaN from a " "float_literal token"); - if (16 < Sampler->MaxAnisotropy) + if (!llvm::hlsl::rootsig::verifyMaxAnisotropy(Sampler->MaxAnisotropy)) ReportError(Loc, 0, 16); if (!llvm::hlsl::rootsig::verifyMipLODBias(Sampler->MipLODBias)) ReportFloatError(Loc, -16.f, 15.99); >From 6811f70ab6d26f06947a149b2d7f638d8ada735e Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Fri, 11 Jul 2025 23:04:29 +0000 Subject: [PATCH 8/9] review: clarify hex value --- clang/test/CodeGenHLSL/RootSignature.hlsl | 1 + 1 file changed, 1 insertion(+) diff --git a/clang/test/CodeGenHLSL/RootSignature.hlsl b/clang/test/CodeGenHLSL/RootSignature.hlsl index 52f94dfaf52c7..bc40bdd79ce59 100644 --- a/clang/test/CodeGenHLSL/RootSignature.hlsl +++ b/clang/test/CodeGenHLSL/RootSignature.hlsl @@ -76,6 +76,7 @@ void RootDescriptorsEntry() {} // CHECK-SAME: i32 2, i32 3, i32 5, // checking mipLODBias, maxAnisotropy, comparisonFunc, borderColor +// note: the hex value is the float bit representation of 12.45 // CHECK-SAME: float 0x4028E66660000000, i32 9, i32 3, i32 2, // checking minLOD, maxLOD >From d77ce957886196ebb7e898e6ee6acfefeaeee6e4 Mon Sep 17 00:00:00 2001 From: Finn Plummer <canadienf...@gmail.com> Date: Sat, 12 Jul 2025 03:37:21 +0000 Subject: [PATCH 9/9] self-review: use formatv + small string to use stack allocation --- clang/lib/Sema/SemaHLSL.cpp | 4 +++- clang/test/SemaHLSL/RootSignature-err.hlsl | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index bd318010492c0..4875c25c76988 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -43,6 +43,7 @@ #include "llvm/Support/Casting.h" #include "llvm/Support/DXILABI.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/FormatVariadic.h" #include "llvm/TargetParser/Triple.h" #include <cmath> #include <cstddef> @@ -1098,7 +1099,8 @@ bool SemaHLSL::handleRootSignatureElements( float UpperBound) { HadError = true; this->Diag(Loc, diag::err_hlsl_invalid_rootsig_value) - << std::to_string(LowerBound) << std::to_string(UpperBound); + << llvm::formatv("{0:f}", LowerBound).sstr<6>() + << llvm::formatv("{0:f}", UpperBound).sstr<6>(); }; auto VerifyRegister = [ReportError](SourceLocation Loc, uint32_t Register) { diff --git a/clang/test/SemaHLSL/RootSignature-err.hlsl b/clang/test/SemaHLSL/RootSignature-err.hlsl index eaa5c1a11ce55..e517274d937b0 100644 --- a/clang/test/SemaHLSL/RootSignature-err.hlsl +++ b/clang/test/SemaHLSL/RootSignature-err.hlsl @@ -132,10 +132,10 @@ void basic_validation_3() {} void basic_validation_4() {} // expected-error@+2 {{value must be in the range [0, 16]}} -// expected-error@+1 {{value must be in the range [-16.000000, 15.990000]}} +// expected-error@+1 {{value must be in the range [-16.00, 15.99]}} [RootSignature("StaticSampler(s0, maxAnisotropy = 17, mipLODBias = -16.000001)")] void basic_validation_5() {} -// expected-error@+1 {{value must be in the range [-16.000000, 15.990000]}} +// expected-error@+1 {{value must be in the range [-16.00, 15.99]}} [RootSignature("StaticSampler(s0, mipLODBias = 15.990001)")] void basic_validation_6() {} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits