[llvm-branch-commits] [llvm] [DirectX] Improve error accumulation in root signature parsing (PR #144465)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Jun 17 10:39:08 PDT 2025
https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/144465
>From ef396288dc10569cb1298e11ac4c67de6a5b5e03 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 16 Jun 2025 21:54:47 +0000
Subject: [PATCH 1/3] allowing multiple errors
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 250 ++++++++++--------
1 file changed, 141 insertions(+), 109 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 57d5ee8ac467c..a09398864259a 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -141,14 +141,14 @@ static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (RootFlagNode->getNumOperands() != 2)
return reportError(Ctx, "Invalid format for RootFlag Element");
-
+ bool HasError = false;
if (std::optional<uint32_t> Val = extractMdIntValue(RootFlagNode, 1))
RSD.Flags = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RootFlagNode",
- RootFlagNode, 1);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "RootFlagNode", RootFlagNode, 1);
- return false;
+ return HasError;
}
static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
@@ -157,6 +157,7 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (RootConstantNode->getNumOperands() != 5)
return reportError(Ctx, "Invalid format for RootConstants Element");
+ bool HasError = false;
dxbc::RTS0::v1::RootParameterHeader Header;
// The parameter offset doesn't matter here - we recalculate it during
// serialization Header.ParameterOffset = 0;
@@ -166,31 +167,31 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 1))
Header.ShaderVisibility = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RootConstantNode",
- RootConstantNode, 1);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "RootConstantNode", RootConstantNode, 1);
dxbc::RTS0::v1::RootConstants Constants;
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 2))
Constants.ShaderRegister = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RootConstantNode",
- RootConstantNode, 2);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "RootConstantNode", RootConstantNode, 2);
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 3))
Constants.RegisterSpace = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RootConstantNode",
- RootConstantNode, 3);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "RootConstantNode", RootConstantNode, 3);
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 4))
Constants.Num32BitValues = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RootConstantNode",
- RootConstantNode, 4);
-
- RSD.ParametersContainer.addParameter(Header, Constants);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "RootConstantNode", RootConstantNode, 4);
+ if (!HasError)
+ RSD.ParametersContainer.addParameter(Header, Constants);
- return false;
+ return HasError;
}
static bool parseRootDescriptors(LLVMContext *Ctx,
@@ -205,6 +206,7 @@ static bool parseRootDescriptors(LLVMContext *Ctx,
if (RootDescriptorNode->getNumOperands() != 5)
return reportError(Ctx, "Invalid format for Root Descriptor Element");
+ bool HasError = false;
dxbc::RTS0::v1::RootParameterHeader Header;
switch (ElementKind) {
case RootSignatureElementKind::SRV:
@@ -224,36 +226,41 @@ static bool parseRootDescriptors(LLVMContext *Ctx,
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 1))
Header.ShaderVisibility = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
- RootDescriptorNode, 1);
+ HasError = HasError ||
+ reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
+ RootDescriptorNode, 1);
dxbc::RTS0::v2::RootDescriptor Descriptor;
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 2))
Descriptor.ShaderRegister = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
- RootDescriptorNode, 2);
+ HasError = HasError ||
+ reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
+ RootDescriptorNode, 2);
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 3))
Descriptor.RegisterSpace = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
- RootDescriptorNode, 3);
+ HasError = HasError ||
+ reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
+ RootDescriptorNode, 3);
if (RSD.Version == 1) {
- RSD.ParametersContainer.addParameter(Header, Descriptor);
- return false;
+ if (!HasError)
+ RSD.ParametersContainer.addParameter(Header, Descriptor);
+ return HasError;
}
assert(RSD.Version > 1);
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 4))
Descriptor.Flags = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
- RootDescriptorNode, 4);
-
- RSD.ParametersContainer.addParameter(Header, Descriptor);
- return false;
+ HasError = HasError ||
+ reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
+ RootDescriptorNode, 4);
+ if (!HasError)
+ RSD.ParametersContainer.addParameter(Header, Descriptor);
+ return HasError;
}
static bool parseDescriptorRange(LLVMContext *Ctx,
@@ -264,14 +271,16 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
if (RangeDescriptorNode->getNumOperands() != 6)
return reportError(Ctx, "Invalid format for Descriptor Range");
+ bool HasError = false;
dxbc::RTS0::v2::DescriptorRange Range;
std::optional<StringRef> ElementText =
extractMdStringValue(RangeDescriptorNode, 0);
if (!ElementText.has_value())
- return reportInvalidTypeError<MDString>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 0);
+ HasError =
+ HasError || reportInvalidTypeError<MDString>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 0);
Range.RangeType =
StringSwitch<uint32_t>(*ElementText)
@@ -283,40 +292,46 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
.Default(-1u);
if (Range.RangeType == -1u)
- return reportError(Ctx, "Invalid Descriptor Range type: " + *ElementText);
+ HasError = HasError || reportError(Ctx, "Invalid Descriptor Range type: " +
+ *ElementText);
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 1))
Range.NumDescriptors = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 1);
+ HasError = HasError ||
+ reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 1);
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 2))
Range.BaseShaderRegister = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 2);
+ HasError = HasError ||
+ reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 2);
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 3))
Range.RegisterSpace = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 3);
+ HasError = HasError ||
+ reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 3);
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 4))
Range.OffsetInDescriptorsFromTableStart = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 4);
+ HasError = HasError ||
+ reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 4);
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 5))
Range.Flags = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 5);
-
- Table.Ranges.push_back(Range);
- return false;
+ HasError = HasError ||
+ reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 5);
+ if (!HasError)
+ Table.Ranges.push_back(Range);
+ return HasError;
}
static bool parseDescriptorTable(LLVMContext *Ctx,
@@ -325,13 +340,14 @@ static bool parseDescriptorTable(LLVMContext *Ctx,
const unsigned int NumOperands = DescriptorTableNode->getNumOperands();
if (NumOperands < 2)
return reportError(Ctx, "Invalid format for Descriptor Table");
-
+ bool HasError = false;
dxbc::RTS0::v1::RootParameterHeader Header;
if (std::optional<uint32_t> Val = extractMdIntValue(DescriptorTableNode, 1))
Header.ShaderVisibility = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "DescriptorTableNode",
- DescriptorTableNode, 1);
+ HasError = HasError ||
+ reportInvalidTypeError<ConstantInt>(Ctx, "DescriptorTableNode",
+ DescriptorTableNode, 1);
mcdxbc::DescriptorTable Table;
Header.ParameterType =
@@ -340,15 +356,16 @@ static bool parseDescriptorTable(LLVMContext *Ctx,
for (unsigned int I = 2; I < NumOperands; I++) {
MDNode *Element = dyn_cast<MDNode>(DescriptorTableNode->getOperand(I));
if (Element == nullptr)
- return reportInvalidTypeError<MDNode>(Ctx, "DescriptorTableNode",
- DescriptorTableNode, I);
+ HasError =
+ HasError || reportInvalidTypeError<MDNode>(Ctx, "DescriptorTableNode",
+ DescriptorTableNode, I);
if (parseDescriptorRange(Ctx, RSD, Table, Element))
- return true;
+ HasError = HasError || true;
}
-
- RSD.ParametersContainer.addParameter(Header, Table);
- return false;
+ if (!HasError)
+ RSD.ParametersContainer.addParameter(Header, Table);
+ return HasError;
}
static bool parseStaticSampler(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
@@ -356,87 +373,88 @@ static bool parseStaticSampler(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (StaticSamplerNode->getNumOperands() != 14)
return reportError(Ctx, "Invalid format for Static Sampler");
+ bool HasError = false;
dxbc::RTS0::v1::StaticSampler Sampler;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 1))
Sampler.Filter = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 1);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 1);
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 2))
Sampler.AddressU = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 2);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 2);
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 3))
Sampler.AddressV = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 3);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 3);
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 4))
Sampler.AddressW = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 4);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 4);
if (std::optional<APFloat> Val = extractMdFloatValue(StaticSamplerNode, 5))
Sampler.MipLODBias = Val->convertToFloat();
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 5);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 5);
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 6))
Sampler.MaxAnisotropy = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 6);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 6);
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 7))
Sampler.ComparisonFunc = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 7);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 7);
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 8))
Sampler.BorderColor = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 8);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 8);
if (std::optional<APFloat> Val = extractMdFloatValue(StaticSamplerNode, 9))
Sampler.MinLOD = Val->convertToFloat();
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 9);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 9);
if (std::optional<APFloat> Val = extractMdFloatValue(StaticSamplerNode, 10))
Sampler.MaxLOD = Val->convertToFloat();
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 10);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 10);
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 11))
Sampler.ShaderRegister = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 11);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 11);
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 12))
Sampler.RegisterSpace = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 12);
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 12);
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 13))
Sampler.ShaderVisibility = *Val;
else
- return reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
- StaticSamplerNode, 13);
-
- RSD.StaticSamplers.push_back(Sampler);
- return false;
+ HasError = HasError || reportInvalidTypeError<ConstantInt>(
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 13);
+ if (!HasError)
+ RSD.StaticSamplers.push_back(Sampler);
+ return HasError;
}
static bool parseRootSignatureElement(LLVMContext *Ctx,
@@ -699,19 +717,19 @@ static bool verifyBorderColor(uint32_t BorderColor) {
static bool verifyLOD(float LOD) { return !std::isnan(LOD); }
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
-
+ bool HasError = false;
if (!verifyVersion(RSD.Version)) {
- return reportValueError(Ctx, "Version", RSD.Version);
+ HasError = HasError || reportValueError(Ctx, "Version", RSD.Version);
}
if (!verifyRootFlag(RSD.Flags)) {
- return reportValueError(Ctx, "RootFlags", RSD.Flags);
+ HasError = HasError || reportValueError(Ctx, "RootFlags", RSD.Flags);
}
for (const mcdxbc::RootParameterInfo &Info : RSD.ParametersContainer) {
if (!dxbc::isValidShaderVisibility(Info.Header.ShaderVisibility))
- return reportValueError(Ctx, "ShaderVisibility",
- Info.Header.ShaderVisibility);
+ HasError = HasError || reportValueError(Ctx, "ShaderVisibility",
+ Info.Header.ShaderVisibility);
assert(dxbc::isValidParameterType(Info.Header.ParameterType) &&
"Invalid value for ParameterType");
@@ -724,15 +742,17 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
const dxbc::RTS0::v2::RootDescriptor &Descriptor =
RSD.ParametersContainer.getRootDescriptor(Info.Location);
if (!verifyRegisterValue(Descriptor.ShaderRegister))
- return reportValueError(Ctx, "ShaderRegister",
- Descriptor.ShaderRegister);
+ HasError = HasError || reportValueError(Ctx, "ShaderRegister",
+ Descriptor.ShaderRegister);
if (!verifyRegisterSpace(Descriptor.RegisterSpace))
- return reportValueError(Ctx, "RegisterSpace", Descriptor.RegisterSpace);
+ HasError = HasError || reportValueError(Ctx, "RegisterSpace",
+ Descriptor.RegisterSpace);
if (RSD.Version > 1) {
if (!verifyDescriptorFlag(Descriptor.Flags))
- return reportValueError(Ctx, "DescriptorFlag", Descriptor.Flags);
+ HasError = HasError ||
+ reportValueError(Ctx, "DescriptorFlag", Descriptor.Flags);
}
break;
}
@@ -741,14 +761,17 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
RSD.ParametersContainer.getDescriptorTable(Info.Location);
for (const dxbc::RTS0::v2::DescriptorRange &Range : Table) {
if (!verifyRangeType(Range.RangeType))
- return reportValueError(Ctx, "RangeType", Range.RangeType);
+ HasError =
+ HasError || reportValueError(Ctx, "RangeType", Range.RangeType);
if (!verifyRegisterSpace(Range.RegisterSpace))
- return reportValueError(Ctx, "RegisterSpace", Range.RegisterSpace);
+ HasError = HasError || reportValueError(Ctx, "RegisterSpace",
+ Range.RegisterSpace);
if (!verifyDescriptorRangeFlag(RSD.Version, Range.RangeType,
Range.Flags))
- return reportValueError(Ctx, "DescriptorFlag", Range.Flags);
+ HasError =
+ HasError || reportValueError(Ctx, "DescriptorFlag", Range.Flags);
}
break;
}
@@ -757,47 +780,56 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
for (const dxbc::RTS0::v1::StaticSampler &Sampler : RSD.StaticSamplers) {
if (!verifySamplerFilter(Sampler.Filter))
- return reportValueError(Ctx, "Filter", Sampler.Filter);
+ HasError = HasError || reportValueError(Ctx, "Filter", Sampler.Filter);
if (!verifyAddress(Sampler.AddressU))
- return reportValueError(Ctx, "AddressU", Sampler.AddressU);
+ HasError =
+ HasError || reportValueError(Ctx, "AddressU", Sampler.AddressU);
if (!verifyAddress(Sampler.AddressV))
- return reportValueError(Ctx, "AddressV", Sampler.AddressV);
+ HasError =
+ HasError || reportValueError(Ctx, "AddressV", Sampler.AddressV);
if (!verifyAddress(Sampler.AddressW))
- return reportValueError(Ctx, "AddressW", Sampler.AddressW);
+ HasError =
+ HasError || reportValueError(Ctx, "AddressW", Sampler.AddressW);
if (!verifyMipLODBias(Sampler.MipLODBias))
- return reportValueError(Ctx, "MipLODBias", Sampler.MipLODBias);
+ HasError =
+ HasError || reportValueError(Ctx, "MipLODBias", Sampler.MipLODBias);
if (!verifyMaxAnisotropy(Sampler.MaxAnisotropy))
- return reportValueError(Ctx, "MaxAnisotropy", Sampler.MaxAnisotropy);
+ HasError = HasError ||
+ reportValueError(Ctx, "MaxAnisotropy", Sampler.MaxAnisotropy);
if (!verifyComparisonFunc(Sampler.ComparisonFunc))
- return reportValueError(Ctx, "ComparisonFunc", Sampler.ComparisonFunc);
+ HasError = HasError || reportValueError(Ctx, "ComparisonFunc",
+ Sampler.ComparisonFunc);
if (!verifyBorderColor(Sampler.BorderColor))
- return reportValueError(Ctx, "BorderColor", Sampler.BorderColor);
+ HasError =
+ HasError || reportValueError(Ctx, "BorderColor", Sampler.BorderColor);
if (!verifyLOD(Sampler.MinLOD))
- return reportValueError(Ctx, "MinLOD", Sampler.MinLOD);
+ HasError = HasError || reportValueError(Ctx, "MinLOD", Sampler.MinLOD);
if (!verifyLOD(Sampler.MaxLOD))
- return reportValueError(Ctx, "MaxLOD", Sampler.MaxLOD);
+ HasError = HasError || reportValueError(Ctx, "MaxLOD", Sampler.MaxLOD);
if (!verifyRegisterValue(Sampler.ShaderRegister))
- return reportValueError(Ctx, "ShaderRegister", Sampler.ShaderRegister);
+ HasError = HasError || reportValueError(Ctx, "ShaderRegister",
+ Sampler.ShaderRegister);
if (!verifyRegisterSpace(Sampler.RegisterSpace))
- return reportValueError(Ctx, "RegisterSpace", Sampler.RegisterSpace);
+ HasError = HasError ||
+ reportValueError(Ctx, "RegisterSpace", Sampler.RegisterSpace);
if (!dxbc::isValidShaderVisibility(Sampler.ShaderVisibility))
- return reportValueError(Ctx, "ShaderVisibility",
- Sampler.ShaderVisibility);
+ HasError = HasError || reportValueError(Ctx, "ShaderVisibility",
+ Sampler.ShaderVisibility);
}
- return false;
+ return HasError;
}
static SmallDenseMap<const Function *, mcdxbc::RootSignatureDesc>
>From 1d89343f3c3b42ba6bcc1b65bf6478ca66ecab48 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 17 Jun 2025 17:25:19 +0000
Subject: [PATCH 2/3] fix issues
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 192 +++++++++---------
.../RootSignature-Error-Accumulation.ll | 23 +++
2 files changed, 119 insertions(+), 96 deletions(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-Accumulation.ll
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index a09398864259a..e96c680c6852a 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -145,8 +145,8 @@ static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (std::optional<uint32_t> Val = extractMdIntValue(RootFlagNode, 1))
RSD.Flags = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "RootFlagNode", RootFlagNode, 1);
+ HasError = reportInvalidTypeError<ConstantInt>(
+ Ctx, "RootFlagNode", RootFlagNode, 1) || HasError;
return HasError;
}
@@ -167,27 +167,27 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 1))
Header.ShaderVisibility = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "RootConstantNode", RootConstantNode, 1);
+ HasError = reportInvalidTypeError<ConstantInt>(
+ Ctx, "RootConstantNode", RootConstantNode, 1) || HasError;
dxbc::RTS0::v1::RootConstants Constants;
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 2))
Constants.ShaderRegister = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "RootConstantNode", RootConstantNode, 2);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "RootConstantNode", RootConstantNode, 2) || HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 3))
Constants.RegisterSpace = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "RootConstantNode", RootConstantNode, 3);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "RootConstantNode", RootConstantNode, 3) || HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 4))
Constants.Num32BitValues = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "RootConstantNode", RootConstantNode, 4);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "RootConstantNode", RootConstantNode, 4) || HasError;
if (!HasError)
RSD.ParametersContainer.addParameter(Header, Constants);
@@ -226,24 +226,24 @@ static bool parseRootDescriptors(LLVMContext *Ctx,
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 1))
Header.ShaderVisibility = *Val;
else
- HasError = HasError ||
+ HasError =
reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
- RootDescriptorNode, 1);
+ RootDescriptorNode, 1)|| HasError;
dxbc::RTS0::v2::RootDescriptor Descriptor;
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 2))
Descriptor.ShaderRegister = *Val;
else
- HasError = HasError ||
+ HasError =
reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
- RootDescriptorNode, 2);
+ RootDescriptorNode, 2)|| HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 3))
Descriptor.RegisterSpace = *Val;
else
- HasError = HasError ||
+ HasError =
reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
- RootDescriptorNode, 3);
+ RootDescriptorNode, 3)|| HasError;
if (RSD.Version == 1) {
if (!HasError)
@@ -255,9 +255,9 @@ static bool parseRootDescriptors(LLVMContext *Ctx,
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 4))
Descriptor.Flags = *Val;
else
- HasError = HasError ||
+ HasError =
reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
- RootDescriptorNode, 4);
+ RootDescriptorNode, 4)|| HasError;
if (!HasError)
RSD.ParametersContainer.addParameter(Header, Descriptor);
return HasError;
@@ -279,8 +279,8 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
if (!ElementText.has_value())
HasError =
- HasError || reportInvalidTypeError<MDString>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 0);
+ reportInvalidTypeError<MDString>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 0)|| HasError;
Range.RangeType =
StringSwitch<uint32_t>(*ElementText)
@@ -292,43 +292,43 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
.Default(-1u);
if (Range.RangeType == -1u)
- HasError = HasError || reportError(Ctx, "Invalid Descriptor Range type: " +
- *ElementText);
+ HasError = reportError(Ctx, "Invalid Descriptor Range type: " +
+ *ElementText)|| HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 1))
Range.NumDescriptors = *Val;
else
- HasError = HasError ||
+ HasError =
reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 1);
+ RangeDescriptorNode, 1) || HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 2))
Range.BaseShaderRegister = *Val;
else
- HasError = HasError ||
+ HasError =
reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 2);
+ RangeDescriptorNode, 2) || HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 3))
Range.RegisterSpace = *Val;
else
- HasError = HasError ||
+ HasError =
reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 3);
+ RangeDescriptorNode, 3) || HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 4))
Range.OffsetInDescriptorsFromTableStart = *Val;
else
- HasError = HasError ||
+ HasError =
reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 4);
+ RangeDescriptorNode, 4) || HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 5))
Range.Flags = *Val;
else
- HasError = HasError ||
+ HasError =
reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 5);
+ RangeDescriptorNode, 5) || HasError;
if (!HasError)
Table.Ranges.push_back(Range);
return HasError;
@@ -345,9 +345,9 @@ static bool parseDescriptorTable(LLVMContext *Ctx,
if (std::optional<uint32_t> Val = extractMdIntValue(DescriptorTableNode, 1))
Header.ShaderVisibility = *Val;
else
- HasError = HasError ||
+ HasError =
reportInvalidTypeError<ConstantInt>(Ctx, "DescriptorTableNode",
- DescriptorTableNode, 1);
+ DescriptorTableNode, 1) || HasError;
mcdxbc::DescriptorTable Table;
Header.ParameterType =
@@ -357,11 +357,11 @@ static bool parseDescriptorTable(LLVMContext *Ctx,
MDNode *Element = dyn_cast<MDNode>(DescriptorTableNode->getOperand(I));
if (Element == nullptr)
HasError =
- HasError || reportInvalidTypeError<MDNode>(Ctx, "DescriptorTableNode",
- DescriptorTableNode, I);
+ reportInvalidTypeError<MDNode>(Ctx, "DescriptorTableNode",
+ DescriptorTableNode, I) || HasError;
if (parseDescriptorRange(Ctx, RSD, Table, Element))
- HasError = HasError || true;
+ HasError = true || HasError;
}
if (!HasError)
RSD.ParametersContainer.addParameter(Header, Table);
@@ -378,80 +378,80 @@ static bool parseStaticSampler(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 1))
Sampler.Filter = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 1);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 1)|| HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 2))
Sampler.AddressU = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 2);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 2)|| HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 3))
Sampler.AddressV = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 3);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 3)|| HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 4))
Sampler.AddressW = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 4);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 4)|| HasError;
if (std::optional<APFloat> Val = extractMdFloatValue(StaticSamplerNode, 5))
Sampler.MipLODBias = Val->convertToFloat();
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 5);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 5)|| HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 6))
Sampler.MaxAnisotropy = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 6);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 6)|| HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 7))
Sampler.ComparisonFunc = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 7);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 7)|| HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 8))
Sampler.BorderColor = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 8);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 8)|| HasError;
if (std::optional<APFloat> Val = extractMdFloatValue(StaticSamplerNode, 9))
Sampler.MinLOD = Val->convertToFloat();
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 9);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 9)|| HasError;
if (std::optional<APFloat> Val = extractMdFloatValue(StaticSamplerNode, 10))
Sampler.MaxLOD = Val->convertToFloat();
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 10);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 10)|| HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 11))
Sampler.ShaderRegister = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 11);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 11)|| HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 12))
Sampler.RegisterSpace = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 12);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 12)|| HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 13))
Sampler.ShaderVisibility = *Val;
else
- HasError = HasError || reportInvalidTypeError<ConstantInt>(
- Ctx, "StaticSamplerNode", StaticSamplerNode, 13);
+ HasError = reportInvalidTypeError<ConstantInt> (
+ Ctx, "StaticSamplerNode", StaticSamplerNode, 13)|| HasError;
if (!HasError)
RSD.StaticSamplers.push_back(Sampler);
return HasError;
@@ -506,7 +506,7 @@ static bool parse(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (Element == nullptr)
return reportError(Ctx, "Missing Root Element Metadata Node.");
- HasError = HasError || parseRootSignatureElement(Ctx, RSD, Element);
+ HasError = parseRootSignatureElement(Ctx, RSD, Element) || HasError;
}
return HasError;
@@ -719,17 +719,17 @@ static bool verifyLOD(float LOD) { return !std::isnan(LOD); }
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
bool HasError = false;
if (!verifyVersion(RSD.Version)) {
- HasError = HasError || reportValueError(Ctx, "Version", RSD.Version);
+ HasError = reportValueError(Ctx, "Version", RSD.Version) || HasError;
}
if (!verifyRootFlag(RSD.Flags)) {
- HasError = HasError || reportValueError(Ctx, "RootFlags", RSD.Flags);
+ HasError = reportValueError(Ctx, "RootFlags", RSD.Flags) || HasError;
}
for (const mcdxbc::RootParameterInfo &Info : RSD.ParametersContainer) {
if (!dxbc::isValidShaderVisibility(Info.Header.ShaderVisibility))
- HasError = HasError || reportValueError(Ctx, "ShaderVisibility",
- Info.Header.ShaderVisibility);
+ HasError = reportValueError(Ctx, "ShaderVisibility" ,
+ Info.Header.ShaderVisibility)|| HasError;
assert(dxbc::isValidParameterType(Info.Header.ParameterType) &&
"Invalid value for ParameterType");
@@ -742,17 +742,17 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
const dxbc::RTS0::v2::RootDescriptor &Descriptor =
RSD.ParametersContainer.getRootDescriptor(Info.Location);
if (!verifyRegisterValue(Descriptor.ShaderRegister))
- HasError = HasError || reportValueError(Ctx, "ShaderRegister",
- Descriptor.ShaderRegister);
+ HasError = reportValueError(Ctx, "ShaderRegister" ,
+ Descriptor.ShaderRegister)|| HasError;
if (!verifyRegisterSpace(Descriptor.RegisterSpace))
- HasError = HasError || reportValueError(Ctx, "RegisterSpace",
- Descriptor.RegisterSpace);
+ HasError = reportValueError(Ctx, "RegisterSpace" ,
+ Descriptor.RegisterSpace)|| HasError;
if (RSD.Version > 1) {
if (!verifyDescriptorFlag(Descriptor.Flags))
- HasError = HasError ||
- reportValueError(Ctx, "DescriptorFlag", Descriptor.Flags);
+ HasError =
+ reportValueError(Ctx, "DescriptorFlag", Descriptor.Flags)|| HasError;
}
break;
}
@@ -762,16 +762,16 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
for (const dxbc::RTS0::v2::DescriptorRange &Range : Table) {
if (!verifyRangeType(Range.RangeType))
HasError =
- HasError || reportValueError(Ctx, "RangeType", Range.RangeType);
+ reportValueError(Ctx, "RangeType", Range.RangeType) || HasError;
if (!verifyRegisterSpace(Range.RegisterSpace))
- HasError = HasError || reportValueError(Ctx, "RegisterSpace",
- Range.RegisterSpace);
+ HasError = reportValueError(Ctx, "RegisterSpace" ,
+ Range.RegisterSpace)|| HasError;
if (!verifyDescriptorRangeFlag(RSD.Version, Range.RangeType,
Range.Flags))
HasError =
- HasError || reportValueError(Ctx, "DescriptorFlag", Range.Flags);
+ reportValueError(Ctx, "DescriptorFlag", Range.Flags) || HasError;
}
break;
}
@@ -780,53 +780,53 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
for (const dxbc::RTS0::v1::StaticSampler &Sampler : RSD.StaticSamplers) {
if (!verifySamplerFilter(Sampler.Filter))
- HasError = HasError || reportValueError(Ctx, "Filter", Sampler.Filter);
+ HasError = reportValueError(Ctx, "Filter", Sampler.Filter) || HasError;
if (!verifyAddress(Sampler.AddressU))
HasError =
- HasError || reportValueError(Ctx, "AddressU", Sampler.AddressU);
+ reportValueError(Ctx, "AddressU", Sampler.AddressU) || HasError;
if (!verifyAddress(Sampler.AddressV))
HasError =
- HasError || reportValueError(Ctx, "AddressV", Sampler.AddressV);
+ reportValueError(Ctx, "AddressV", Sampler.AddressV) || HasError;
if (!verifyAddress(Sampler.AddressW))
HasError =
- HasError || reportValueError(Ctx, "AddressW", Sampler.AddressW);
+ reportValueError(Ctx, "AddressW", Sampler.AddressW) || HasError;
if (!verifyMipLODBias(Sampler.MipLODBias))
HasError =
- HasError || reportValueError(Ctx, "MipLODBias", Sampler.MipLODBias);
+ reportValueError(Ctx, "MipLODBias", Sampler.MipLODBias) || HasError;
if (!verifyMaxAnisotropy(Sampler.MaxAnisotropy))
- HasError = HasError ||
- reportValueError(Ctx, "MaxAnisotropy", Sampler.MaxAnisotropy);
+ HasError =
+ reportValueError(Ctx, "MaxAnisotropy", Sampler.MaxAnisotropy)|| HasError;
if (!verifyComparisonFunc(Sampler.ComparisonFunc))
- HasError = HasError || reportValueError(Ctx, "ComparisonFunc",
- Sampler.ComparisonFunc);
+ HasError = reportValueError(Ctx, "ComparisonFunc" ,
+ Sampler.ComparisonFunc)|| HasError;
if (!verifyBorderColor(Sampler.BorderColor))
HasError =
- HasError || reportValueError(Ctx, "BorderColor", Sampler.BorderColor);
+ reportValueError(Ctx, "BorderColor", Sampler.BorderColor) || HasError;
if (!verifyLOD(Sampler.MinLOD))
- HasError = HasError || reportValueError(Ctx, "MinLOD", Sampler.MinLOD);
+ HasError = reportValueError(Ctx, "MinLOD", Sampler.MinLOD) || HasError;
if (!verifyLOD(Sampler.MaxLOD))
- HasError = HasError || reportValueError(Ctx, "MaxLOD", Sampler.MaxLOD);
+ HasError = reportValueError(Ctx, "MaxLOD", Sampler.MaxLOD) || HasError;
if (!verifyRegisterValue(Sampler.ShaderRegister))
- HasError = HasError || reportValueError(Ctx, "ShaderRegister",
- Sampler.ShaderRegister);
+ HasError = reportValueError(Ctx, "ShaderRegister" ,
+ Sampler.ShaderRegister)|| HasError;
if (!verifyRegisterSpace(Sampler.RegisterSpace))
- HasError = HasError ||
- reportValueError(Ctx, "RegisterSpace", Sampler.RegisterSpace);
+ HasError =
+ reportValueError(Ctx, "RegisterSpace", Sampler.RegisterSpace)|| HasError;
if (!dxbc::isValidShaderVisibility(Sampler.ShaderVisibility))
- HasError = HasError || reportValueError(Ctx, "ShaderVisibility",
- Sampler.ShaderVisibility);
+ HasError = reportValueError(Ctx, "ShaderVisibility" ,
+ Sampler.ShaderVisibility)|| HasError;
}
return HasError;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-Accumulation.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-Accumulation.ll
new file mode 100644
index 0000000000000..2d79088e3adcc
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-Accumulation.ll
@@ -0,0 +1,23 @@
+; RUN: not llc %s --filetype=obj -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for Filter: 666
+; CHECK: error: Invalid value for AddressU: 667
+; CHECK: error: Invalid value for AddressV: 668
+; CHECK: error: Invalid value for AddressW: 669
+; CHECK: error: Invalid value for ComparisonFunc: 670
+; CHECK: error: Invalid value for ShaderVisibility: 666
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 666, i32 667, i32 668, i32 669, float 0x3FF6CCCCC0000000, i32 9, i32 670, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 672, i32 666 }
>From d626252ab2531a96506fc40c43fdafbafb5a6d31 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 17 Jun 2025 17:38:54 +0000
Subject: [PATCH 3/3] format
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 217 ++++++++++--------
1 file changed, 123 insertions(+), 94 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index e96c680c6852a..eea46e714b756 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -145,8 +145,9 @@ static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (std::optional<uint32_t> Val = extractMdIntValue(RootFlagNode, 1))
RSD.Flags = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt>(
- Ctx, "RootFlagNode", RootFlagNode, 1) || HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RootFlagNode",
+ RootFlagNode, 1) ||
+ HasError;
return HasError;
}
@@ -167,27 +168,31 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 1))
Header.ShaderVisibility = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt>(
- Ctx, "RootConstantNode", RootConstantNode, 1) || HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RootConstantNode",
+ RootConstantNode, 1) ||
+ HasError;
dxbc::RTS0::v1::RootConstants Constants;
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 2))
Constants.ShaderRegister = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "RootConstantNode", RootConstantNode, 2) || HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RootConstantNode",
+ RootConstantNode, 2) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 3))
Constants.RegisterSpace = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "RootConstantNode", RootConstantNode, 3) || HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RootConstantNode",
+ RootConstantNode, 3) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 4))
Constants.Num32BitValues = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "RootConstantNode", RootConstantNode, 4) || HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RootConstantNode",
+ RootConstantNode, 4) ||
+ HasError;
if (!HasError)
RSD.ParametersContainer.addParameter(Header, Constants);
@@ -226,24 +231,24 @@ static bool parseRootDescriptors(LLVMContext *Ctx,
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 1))
Header.ShaderVisibility = *Val;
else
- HasError =
- reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
- RootDescriptorNode, 1)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
+ RootDescriptorNode, 1) ||
+ HasError;
dxbc::RTS0::v2::RootDescriptor Descriptor;
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 2))
Descriptor.ShaderRegister = *Val;
else
- HasError =
- reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
- RootDescriptorNode, 2)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
+ RootDescriptorNode, 2) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 3))
Descriptor.RegisterSpace = *Val;
else
- HasError =
- reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
- RootDescriptorNode, 3)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
+ RootDescriptorNode, 3) ||
+ HasError;
if (RSD.Version == 1) {
if (!HasError)
@@ -255,9 +260,9 @@ static bool parseRootDescriptors(LLVMContext *Ctx,
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 4))
Descriptor.Flags = *Val;
else
- HasError =
- reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
- RootDescriptorNode, 4)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RootDescriptorNode",
+ RootDescriptorNode, 4) ||
+ HasError;
if (!HasError)
RSD.ParametersContainer.addParameter(Header, Descriptor);
return HasError;
@@ -278,9 +283,9 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
extractMdStringValue(RangeDescriptorNode, 0);
if (!ElementText.has_value())
- HasError =
- reportInvalidTypeError<MDString>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 0)|| HasError;
+ HasError = reportInvalidTypeError<MDString>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 0) ||
+ HasError;
Range.RangeType =
StringSwitch<uint32_t>(*ElementText)
@@ -292,43 +297,44 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
.Default(-1u);
if (Range.RangeType == -1u)
- HasError = reportError(Ctx, "Invalid Descriptor Range type: " +
- *ElementText)|| HasError;
+ HasError =
+ reportError(Ctx, "Invalid Descriptor Range type: " + *ElementText) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 1))
Range.NumDescriptors = *Val;
else
- HasError =
- reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 1) || HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 1) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 2))
Range.BaseShaderRegister = *Val;
else
- HasError =
- reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 2) || HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 2) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 3))
Range.RegisterSpace = *Val;
else
- HasError =
- reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 3) || HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 3) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 4))
Range.OffsetInDescriptorsFromTableStart = *Val;
else
- HasError =
- reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 4) || HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 4) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 5))
Range.Flags = *Val;
else
- HasError =
- reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
- RangeDescriptorNode, 5) || HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "RangeDescriptorNode",
+ RangeDescriptorNode, 5) ||
+ HasError;
if (!HasError)
Table.Ranges.push_back(Range);
return HasError;
@@ -345,9 +351,9 @@ static bool parseDescriptorTable(LLVMContext *Ctx,
if (std::optional<uint32_t> Val = extractMdIntValue(DescriptorTableNode, 1))
Header.ShaderVisibility = *Val;
else
- HasError =
- reportInvalidTypeError<ConstantInt>(Ctx, "DescriptorTableNode",
- DescriptorTableNode, 1) || HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "DescriptorTableNode",
+ DescriptorTableNode, 1) ||
+ HasError;
mcdxbc::DescriptorTable Table;
Header.ParameterType =
@@ -356,9 +362,9 @@ static bool parseDescriptorTable(LLVMContext *Ctx,
for (unsigned int I = 2; I < NumOperands; I++) {
MDNode *Element = dyn_cast<MDNode>(DescriptorTableNode->getOperand(I));
if (Element == nullptr)
- HasError =
- reportInvalidTypeError<MDNode>(Ctx, "DescriptorTableNode",
- DescriptorTableNode, I) || HasError;
+ HasError = reportInvalidTypeError<MDNode>(Ctx, "DescriptorTableNode",
+ DescriptorTableNode, I) ||
+ HasError;
if (parseDescriptorRange(Ctx, RSD, Table, Element))
HasError = true || HasError;
@@ -378,80 +384,93 @@ static bool parseStaticSampler(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 1))
Sampler.Filter = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 1)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 1) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 2))
Sampler.AddressU = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 2)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 2) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 3))
Sampler.AddressV = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 3)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 3) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 4))
Sampler.AddressW = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 4)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 4) ||
+ HasError;
if (std::optional<APFloat> Val = extractMdFloatValue(StaticSamplerNode, 5))
Sampler.MipLODBias = Val->convertToFloat();
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 5)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 5) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 6))
Sampler.MaxAnisotropy = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 6)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 6) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 7))
Sampler.ComparisonFunc = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 7)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 7) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 8))
Sampler.BorderColor = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 8)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 8) ||
+ HasError;
if (std::optional<APFloat> Val = extractMdFloatValue(StaticSamplerNode, 9))
Sampler.MinLOD = Val->convertToFloat();
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 9)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 9) ||
+ HasError;
if (std::optional<APFloat> Val = extractMdFloatValue(StaticSamplerNode, 10))
Sampler.MaxLOD = Val->convertToFloat();
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 10)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 10) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 11))
Sampler.ShaderRegister = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 11)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 11) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 12))
Sampler.RegisterSpace = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 12)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 12) ||
+ HasError;
if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 13))
Sampler.ShaderVisibility = *Val;
else
- HasError = reportInvalidTypeError<ConstantInt> (
- Ctx, "StaticSamplerNode", StaticSamplerNode, 13)|| HasError;
+ HasError = reportInvalidTypeError<ConstantInt>(Ctx, "StaticSamplerNode",
+ StaticSamplerNode, 13) ||
+ HasError;
if (!HasError)
RSD.StaticSamplers.push_back(Sampler);
return HasError;
@@ -728,8 +747,9 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
for (const mcdxbc::RootParameterInfo &Info : RSD.ParametersContainer) {
if (!dxbc::isValidShaderVisibility(Info.Header.ShaderVisibility))
- HasError = reportValueError(Ctx, "ShaderVisibility" ,
- Info.Header.ShaderVisibility)|| HasError;
+ HasError = reportValueError(Ctx, "ShaderVisibility",
+ Info.Header.ShaderVisibility) ||
+ HasError;
assert(dxbc::isValidParameterType(Info.Header.ParameterType) &&
"Invalid value for ParameterType");
@@ -742,17 +762,20 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
const dxbc::RTS0::v2::RootDescriptor &Descriptor =
RSD.ParametersContainer.getRootDescriptor(Info.Location);
if (!verifyRegisterValue(Descriptor.ShaderRegister))
- HasError = reportValueError(Ctx, "ShaderRegister" ,
- Descriptor.ShaderRegister)|| HasError;
+ HasError = reportValueError(Ctx, "ShaderRegister",
+ Descriptor.ShaderRegister) ||
+ HasError;
if (!verifyRegisterSpace(Descriptor.RegisterSpace))
- HasError = reportValueError(Ctx, "RegisterSpace" ,
- Descriptor.RegisterSpace)|| HasError;
+ HasError =
+ reportValueError(Ctx, "RegisterSpace", Descriptor.RegisterSpace) ||
+ HasError;
if (RSD.Version > 1) {
if (!verifyDescriptorFlag(Descriptor.Flags))
- HasError =
- reportValueError(Ctx, "DescriptorFlag", Descriptor.Flags)|| HasError;
+ HasError =
+ reportValueError(Ctx, "DescriptorFlag", Descriptor.Flags) ||
+ HasError;
}
break;
}
@@ -765,8 +788,9 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
reportValueError(Ctx, "RangeType", Range.RangeType) || HasError;
if (!verifyRegisterSpace(Range.RegisterSpace))
- HasError = reportValueError(Ctx, "RegisterSpace" ,
- Range.RegisterSpace)|| HasError;
+ HasError =
+ reportValueError(Ctx, "RegisterSpace", Range.RegisterSpace) ||
+ HasError;
if (!verifyDescriptorRangeFlag(RSD.Version, Range.RangeType,
Range.Flags))
@@ -799,12 +823,14 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
reportValueError(Ctx, "MipLODBias", Sampler.MipLODBias) || HasError;
if (!verifyMaxAnisotropy(Sampler.MaxAnisotropy))
- HasError =
- reportValueError(Ctx, "MaxAnisotropy", Sampler.MaxAnisotropy)|| HasError;
+ HasError =
+ reportValueError(Ctx, "MaxAnisotropy", Sampler.MaxAnisotropy) ||
+ HasError;
if (!verifyComparisonFunc(Sampler.ComparisonFunc))
- HasError = reportValueError(Ctx, "ComparisonFunc" ,
- Sampler.ComparisonFunc)|| HasError;
+ HasError =
+ reportValueError(Ctx, "ComparisonFunc", Sampler.ComparisonFunc) ||
+ HasError;
if (!verifyBorderColor(Sampler.BorderColor))
HasError =
@@ -817,16 +843,19 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
HasError = reportValueError(Ctx, "MaxLOD", Sampler.MaxLOD) || HasError;
if (!verifyRegisterValue(Sampler.ShaderRegister))
- HasError = reportValueError(Ctx, "ShaderRegister" ,
- Sampler.ShaderRegister)|| HasError;
+ HasError =
+ reportValueError(Ctx, "ShaderRegister", Sampler.ShaderRegister) ||
+ HasError;
if (!verifyRegisterSpace(Sampler.RegisterSpace))
- HasError =
- reportValueError(Ctx, "RegisterSpace", Sampler.RegisterSpace)|| HasError;
+ HasError =
+ reportValueError(Ctx, "RegisterSpace", Sampler.RegisterSpace) ||
+ HasError;
if (!dxbc::isValidShaderVisibility(Sampler.ShaderVisibility))
- HasError = reportValueError(Ctx, "ShaderVisibility" ,
- Sampler.ShaderVisibility)|| HasError;
+ HasError =
+ reportValueError(Ctx, "ShaderVisibility", Sampler.ShaderVisibility) ||
+ HasError;
}
return HasError;
More information about the llvm-branch-commits
mailing list