summaryrefslogtreecommitdiff
path: root/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp')
-rw-r--r--llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp89
1 files changed, 47 insertions, 42 deletions
diff --git a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
index be2c7d1ddff3..d02f4b9f7ebc 100644
--- a/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
+++ b/llvm/lib/Target/DirectX/DXILPostOptimizationValidation.cpp
@@ -25,21 +25,6 @@
using namespace llvm;
using namespace llvm::dxil;
-static ResourceClass toResourceClass(dxbc::DescriptorRangeType RangeType) {
- using namespace dxbc;
- switch (RangeType) {
- case DescriptorRangeType::SRV:
- return ResourceClass::SRV;
- case DescriptorRangeType::UAV:
- return ResourceClass::UAV;
- case DescriptorRangeType::CBV:
- return ResourceClass::CBuffer;
- case DescriptorRangeType::Sampler:
- return ResourceClass::Sampler;
- }
- llvm_unreachable("Unknown DescriptorRangeType");
-}
-
static ResourceClass toResourceClass(dxbc::RootParameterType Type) {
using namespace dxbc;
switch (Type) {
@@ -95,7 +80,7 @@ static void reportOverlappingError(Module &M, ResourceInfo R1,
}
static void reportOverlappingBinding(Module &M, DXILResourceMap &DRM) {
- bool ErrorFound = false;
+ [[maybe_unused]] bool ErrorFound = false;
for (const auto &ResList :
{DRM.srvs(), DRM.uavs(), DRM.cbuffers(), DRM.samplers()}) {
if (ResList.empty())
@@ -118,10 +103,8 @@ static void reportOverlappingBinding(Module &M, DXILResourceMap &DRM) {
"true, yet no overlapping binding was found");
}
-static void
-reportOverlappingRegisters(Module &M,
- const llvm::hlsl::BindingInfoBuilder::Binding &R1,
- const llvm::hlsl::BindingInfoBuilder::Binding &R2) {
+static void reportOverlappingRegisters(Module &M, const llvm::hlsl::Binding &R1,
+ const llvm::hlsl::Binding &R2) {
SmallString<128> Message;
raw_svector_ostream OS(Message);
@@ -133,6 +116,17 @@ reportOverlappingRegisters(Module &M,
M.getContext().diagnose(DiagnosticInfoGeneric(Message));
}
+static void
+reportRegNotBound(Module &M, ResourceClass Class,
+ const llvm::dxil::ResourceInfo::ResourceBinding &Unbound) {
+ SmallString<128> Message;
+ raw_svector_ostream OS(Message);
+ OS << getResourceClassName(Class) << " register " << Unbound.LowerBound
+ << " in space " << Unbound.Space
+ << " does not have a binding in the Root Signature";
+ M.getContext().diagnose(DiagnosticInfoGeneric(Message));
+}
+
static dxbc::ShaderVisibility
tripleToVisibility(llvm::Triple::EnvironmentType ET) {
switch (ET) {
@@ -157,22 +151,23 @@ tripleToVisibility(llvm::Triple::EnvironmentType ET) {
static void validateRootSignature(Module &M,
const mcdxbc::RootSignatureDesc &RSD,
- dxil::ModuleMetadataInfo &MMI) {
+ dxil::ModuleMetadataInfo &MMI,
+ DXILResourceMap &DRM,
+ DXILResourceTypeMap &DRTM) {
hlsl::BindingInfoBuilder Builder;
dxbc::ShaderVisibility Visibility = tripleToVisibility(MMI.ShaderProfile);
for (const mcdxbc::RootParameterInfo &ParamInfo : RSD.ParametersContainer) {
dxbc::ShaderVisibility ParamVisibility =
- static_cast<dxbc::ShaderVisibility>(ParamInfo.Header.ShaderVisibility);
+ dxbc::ShaderVisibility(ParamInfo.Visibility);
if (ParamVisibility != dxbc::ShaderVisibility::All &&
ParamVisibility != Visibility)
continue;
- dxbc::RootParameterType ParamType =
- static_cast<dxbc::RootParameterType>(ParamInfo.Header.ParameterType);
+ dxbc::RootParameterType ParamType = dxbc::RootParameterType(ParamInfo.Type);
switch (ParamType) {
case dxbc::RootParameterType::Constants32Bit: {
- dxbc::RTS0::v1::RootConstants Const =
+ mcdxbc::RootConstants Const =
RSD.ParametersContainer.getConstant(ParamInfo.Location);
Builder.trackBinding(dxil::ResourceClass::CBuffer, Const.RegisterSpace,
Const.ShaderRegister, Const.ShaderRegister,
@@ -183,12 +178,11 @@ static void validateRootSignature(Module &M,
case dxbc::RootParameterType::SRV:
case dxbc::RootParameterType::UAV:
case dxbc::RootParameterType::CBV: {
- dxbc::RTS0::v2::RootDescriptor Desc =
+ mcdxbc::RootDescriptor Desc =
RSD.ParametersContainer.getRootDescriptor(ParamInfo.Location);
- Builder.trackBinding(toResourceClass(static_cast<dxbc::RootParameterType>(
- ParamInfo.Header.ParameterType)),
- Desc.RegisterSpace, Desc.ShaderRegister,
- Desc.ShaderRegister, &ParamInfo);
+ Builder.trackBinding(toResourceClass(ParamInfo.Type), Desc.RegisterSpace,
+ Desc.ShaderRegister, Desc.ShaderRegister,
+ &ParamInfo);
break;
}
@@ -196,16 +190,13 @@ static void validateRootSignature(Module &M,
const mcdxbc::DescriptorTable &Table =
RSD.ParametersContainer.getDescriptorTable(ParamInfo.Location);
- for (const dxbc::RTS0::v2::DescriptorRange &Range : Table.Ranges) {
+ for (const mcdxbc::DescriptorRange &Range : Table.Ranges) {
uint32_t UpperBound =
Range.NumDescriptors == ~0U
? Range.BaseShaderRegister
: Range.BaseShaderRegister + Range.NumDescriptors - 1;
- Builder.trackBinding(
- toResourceClass(
- static_cast<dxbc::DescriptorRangeType>(Range.RangeType)),
- Range.RegisterSpace, Range.BaseShaderRegister, UpperBound,
- &ParamInfo);
+ Builder.trackBinding(Range.RangeType, Range.RegisterSpace,
+ Range.BaseShaderRegister, UpperBound, &ParamInfo);
}
break;
}
@@ -218,11 +209,19 @@ static void validateRootSignature(Module &M,
Builder.calculateBindingInfo(
[&M](const llvm::hlsl::BindingInfoBuilder &Builder,
- const llvm::hlsl::BindingInfoBuilder::Binding &ReportedBinding) {
- const llvm::hlsl::BindingInfoBuilder::Binding &Overlaping =
+ const llvm::hlsl::Binding &ReportedBinding) {
+ const llvm::hlsl::Binding &Overlaping =
Builder.findOverlapping(ReportedBinding);
reportOverlappingRegisters(M, ReportedBinding, Overlaping);
});
+ const hlsl::BoundRegs &BoundRegs = Builder.takeBoundRegs();
+ for (const ResourceInfo &RI : DRM) {
+ const ResourceInfo::ResourceBinding &Binding = RI.getBinding();
+ ResourceClass RC = DRTM[RI.getHandleTy()].getResourceClass();
+ if (!BoundRegs.isBound(RC, Binding.Space, Binding.LowerBound,
+ Binding.LowerBound + Binding.Size - 1))
+ reportRegNotBound(M, RC, Binding);
+ }
}
static mcdxbc::RootSignatureDesc *
@@ -236,7 +235,8 @@ getRootSignature(RootSignatureBindingInfo &RSBI,
static void reportErrors(Module &M, DXILResourceMap &DRM,
DXILResourceBindingInfo &DRBI,
RootSignatureBindingInfo &RSBI,
- dxil::ModuleMetadataInfo &MMI) {
+ dxil::ModuleMetadataInfo &MMI,
+ DXILResourceTypeMap &DRTM) {
if (DRM.hasInvalidCounterDirection())
reportInvalidDirection(M, DRM);
@@ -247,7 +247,7 @@ static void reportErrors(Module &M, DXILResourceMap &DRM,
"DXILResourceImplicitBinding pass");
if (mcdxbc::RootSignatureDesc *RSD = getRootSignature(RSBI, MMI))
- validateRootSignature(M, *RSD, MMI);
+ validateRootSignature(M, *RSD, MMI, DRM, DRTM);
}
PreservedAnalyses
@@ -256,8 +256,9 @@ DXILPostOptimizationValidation::run(Module &M, ModuleAnalysisManager &MAM) {
DXILResourceBindingInfo &DRBI = MAM.getResult<DXILResourceBindingAnalysis>(M);
RootSignatureBindingInfo &RSBI = MAM.getResult<RootSignatureAnalysis>(M);
ModuleMetadataInfo &MMI = MAM.getResult<DXILMetadataAnalysis>(M);
+ DXILResourceTypeMap &DRTM = MAM.getResult<DXILResourceTypeAnalysis>(M);
- reportErrors(M, DRM, DRBI, RSBI, MMI);
+ reportErrors(M, DRM, DRBI, RSBI, MMI, DRTM);
return PreservedAnalyses::all();
}
@@ -273,8 +274,10 @@ public:
getAnalysis<RootSignatureAnalysisWrapper>().getRSInfo();
dxil::ModuleMetadataInfo &MMI =
getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata();
+ DXILResourceTypeMap &DRTM =
+ getAnalysis<DXILResourceTypeWrapperPass>().getResourceTypeMap();
- reportErrors(M, DRM, DRBI, RSBI, MMI);
+ reportErrors(M, DRM, DRBI, RSBI, MMI, DRTM);
return false;
}
StringRef getPassName() const override {
@@ -288,6 +291,7 @@ public:
AU.addRequired<DXILResourceBindingWrapperPass>();
AU.addRequired<DXILMetadataAnalysisWrapperPass>();
AU.addRequired<RootSignatureAnalysisWrapper>();
+ AU.addRequired<DXILResourceTypeWrapperPass>();
AU.addPreserved<DXILResourceWrapperPass>();
AU.addPreserved<DXILResourceBindingWrapperPass>();
AU.addPreserved<DXILMetadataAnalysisWrapperPass>();
@@ -305,6 +309,7 @@ INITIALIZE_PASS_DEPENDENCY(DXILResourceTypeWrapperPass)
INITIALIZE_PASS_DEPENDENCY(DXILResourceWrapperPass)
INITIALIZE_PASS_DEPENDENCY(DXILMetadataAnalysisWrapperPass)
INITIALIZE_PASS_DEPENDENCY(RootSignatureAnalysisWrapper)
+INITIALIZE_PASS_DEPENDENCY(DXILResourceTypeWrapperPass)
INITIALIZE_PASS_END(DXILPostOptimizationValidationLegacy, DEBUG_TYPE,
"DXIL Post Optimization Validation", false, false)