================ @@ -52,6 +59,45 @@ static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, return false; } +static bool extractMdValue(uint32_t &Value, MDNode *Node, unsigned int OpId) { + + auto *CI = mdconst::extract<ConstantInt>(Node->getOperand(OpId)); + if (CI == nullptr) + return true; + + Value = CI->getZExtValue(); + return false; +} + +static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, + MDNode *RootFlagNode) { + + if (RootFlagNode->getNumOperands() != 5) + return reportError(Ctx, "Invalid format for RootConstants Element"); + + mcdxbc::RootParameter NewParameter; + NewParameter.Header.ParameterType = dxbc::RootParameterType::Constants32Bit; + + uint32_t SV; + if (extractMdValue(SV, RootFlagNode, 1)) + return reportError(Ctx, "Invalid value for ShaderVisibility"); + + NewParameter.Header.ShaderVisibility = (dxbc::ShaderVisibility)SV; + + if (extractMdValue(NewParameter.Constants.ShaderRegister, RootFlagNode, 2)) + return reportError(Ctx, "Invalid value for ShaderRegister"); + + if (extractMdValue(NewParameter.Constants.RegisterSpace, RootFlagNode, 3)) + return reportError(Ctx, "Invalid value for RegisterSpace"); + + if (extractMdValue(NewParameter.Constants.Num32BitValues, RootFlagNode, 4)) + return reportError(Ctx, "Invalid value for Num32BitValues"); ---------------- inbelic wrote:
Only the "Invalid value for ShaderVisibility" has a test demonstrating its functionality. Maybe it is too verbose to include a test case for each diag type, or, they are all reporting the same error (expected an i32) and we could move that logic into `extractMdValue`? 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