================ @@ -94,10 +144,56 @@ static bool parse(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, static bool verifyRootFlag(uint32_t Flags) { return (Flags & ~0xfff) == 0; } +static bool verifyShaderVisibility(dxbc::ShaderVisibility Flags) { + switch (Flags) { + + case dxbc::ShaderVisibility::All: + case dxbc::ShaderVisibility::Vertex: + case dxbc::ShaderVisibility::Hull: + case dxbc::ShaderVisibility::Domain: + case dxbc::ShaderVisibility::Geometry: + case dxbc::ShaderVisibility::Pixel: + case dxbc::ShaderVisibility::Amplification: + case dxbc::ShaderVisibility::Mesh: + return true; + } + + return false; +} + +static bool verifyParameterType(dxbc::RootParameterType Flags) { + switch (Flags) { + case dxbc::RootParameterType::Constants32Bit: + return true; + } + + return false; +} + +static bool verifyVersion(uint32_t Version) { + return (Version == 1 || Version == 2); +} + static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) { + + if (!verifyVersion(RSD.Header.Version)) { + return reportValueError(Ctx, "Version", RSD.Header.Version); + } + if (!verifyRootFlag(RSD.Header.Flags)) { - return reportError(Ctx, "Invalid Root Signature flag value"); + return reportValueError(Ctx, "RootFlags", RSD.Header.Flags); + } + + for (const auto &P : RSD.Parameters) { + if (!verifyShaderVisibility(P.Header.ShaderVisibility)) + return reportValueError(Ctx, "ShaderVisibility", + (uint32_t)P.Header.ShaderVisibility); + + if (!verifyParameterType(P.Header.ParameterType)) + return reportValueError(Ctx, "ParameterType", ---------------- joaosaffran wrote:
This is a complicated test scenario, since `ParameterType` is specified in each of the root parameters parsing method. Maybe this is best suited as an assert? https://github.com/llvm/llvm-project/pull/135085 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits