[llvm] [DirectX] Add Range Overlap validation (PR #152229)
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 6 16:55:51 PDT 2025
================
@@ -84,8 +114,122 @@ static void reportOverlappingBinding(Module &M, DXILResourceMap &DRM) {
}
}
+static void reportOverlappingRegisters(
+ Module &M, const llvm::hlsl::BindingInfoBuilder::Binding &Reported,
+ const llvm::hlsl::BindingInfoBuilder::Binding &Overlaping) {
+ SmallString<128> Message;
+ raw_svector_ostream OS(Message);
+ OS << "register " << getResourceClassName(Reported.RC)
+ << " (space=" << Reported.Space << ", register=" << Reported.LowerBound
+ << ")" << " is overlapping with" << " register "
+ << getResourceClassName(Overlaping.RC) << " (space=" << Overlaping.Space
+ << ", register=" << Overlaping.LowerBound << ")"
+ << ", verify your root signature definition.";
+
+ M.getContext().diagnose(DiagnosticInfoGeneric(Message));
+}
+
+static dxbc::ShaderVisibility
+tripleToVisibility(llvm::Triple::EnvironmentType ET) {
+ assert((ET == Triple::Pixel || ET == Triple::Vertex ||
+ ET == Triple::Geometry || ET == Triple::Hull ||
+ ET == Triple::Domain || ET == Triple::Mesh ||
+ ET == Triple::Compute) &&
+ "Invalid Triple to shader stage conversion");
+
+ switch (ET) {
+ case Triple::Pixel:
+ return dxbc::ShaderVisibility::Pixel;
+ case Triple::Vertex:
+ return dxbc::ShaderVisibility::Vertex;
+ case Triple::Geometry:
+ return dxbc::ShaderVisibility::Geometry;
+ case Triple::Hull:
+ return dxbc::ShaderVisibility::Hull;
+ case Triple::Domain:
+ return dxbc::ShaderVisibility::Domain;
+ case Triple::Mesh:
+ return dxbc::ShaderVisibility::Mesh;
+ case Triple::Compute:
+ return dxbc::ShaderVisibility::All;
+ default:
+ llvm_unreachable("Invalid triple to shader stage conversion");
+ }
+}
+
+static void trackRootSigDescBinding(hlsl::BindingInfoBuilder &Builder,
+ const mcdxbc::RootSignatureDesc &RSD,
+ dxbc::ShaderVisibility Visibility) {
+ for (size_t I = 0; I < RSD.ParametersContainer.size(); I++) {
+ const auto &[Type, Loc] =
+ RSD.ParametersContainer.getTypeAndLocForParameter(I);
+
+ const auto &Header = RSD.ParametersContainer.getHeader(I);
+ if (Header.ShaderVisibility !=
+ llvm::to_underlying(dxbc::ShaderVisibility::All) &&
+ Header.ShaderVisibility != llvm::to_underlying(Visibility))
+ continue;
----------------
bogner wrote:
This seems backwards. We know we have a valid visibility here but it isn't the right type, we should convert it and compare against that:
```c++
dxbc::ShaderVisibility ParamVisibility =
static_cast<dxbc::ShaderVisibility>(ParamInfo.Header.ShaderVisibility);
if (ParamVisibility != dxbc::ShaderVisibility::All &&
ParamVisibility != Visibility)
continue;
```
https://github.com/llvm/llvm-project/pull/152229
More information about the llvm-commits
mailing list