================ @@ -90,36 +89,170 @@ bool RootSignatureParser::parseDescriptorTableClause() { CurToken.TokKind == TokenKind::kw_Sampler) && "Expects to only be invoked starting at given keyword"); + TokenKind ParamKind = CurToken.TokKind; + + if (consumeExpectedToken(TokenKind::pu_l_paren, diag::err_expected_after, + CurToken.TokKind)) + return true; + DescriptorTableClause Clause; - switch (CurToken.TokKind) { + TokenKind ExpectedReg; + switch (ParamKind) { default: llvm_unreachable("Switch for consumed token was not provided"); case TokenKind::kw_CBV: Clause.Type = ClauseType::CBuffer; + ExpectedReg = TokenKind::bReg; break; case TokenKind::kw_SRV: Clause.Type = ClauseType::SRV; + ExpectedReg = TokenKind::tReg; break; case TokenKind::kw_UAV: Clause.Type = ClauseType::UAV; + ExpectedReg = TokenKind::uReg; break; case TokenKind::kw_Sampler: Clause.Type = ClauseType::Sampler; + ExpectedReg = TokenKind::sReg; break; } - if (consumeExpectedToken(TokenKind::pu_l_paren, diag::err_expected_after, - CurToken.TokKind)) + auto Params = parseDescriptorTableClauseParams(ExpectedReg); + if (!Params.has_value()) return true; - if (consumeExpectedToken(TokenKind::pu_r_paren, diag::err_expected_after, - CurToken.TokKind)) + // Check mandatory parameters were provided + if (!Params->Reg.has_value()) { + getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_missing_param) + << ExpectedReg; + return true; + } + + Clause.Reg = Params->Reg.value(); + + // Fill in optional values + if (Params->Space.has_value()) + Clause.Space = Params->Space.value(); + + if (consumeExpectedToken(TokenKind::pu_r_paren, + diag::err_hlsl_unexpected_end_of_params, + /*param of=*/ParamKind)) return true; Elements.push_back(Clause); return false; } +std::optional<RootSignatureParser::ParsedClauseParams> +RootSignatureParser::parseDescriptorTableClauseParams(TokenKind RegType) { + assert(CurToken.TokKind == TokenKind::pu_l_paren && + "Expects to only be invoked starting at given token"); + + // Parameter arguments (eg. `bReg`, `space`, ...) can be specified in any + // order and only exactly once. Parse through as many arguments as possible ---------------- inbelic wrote:
This is just in the context of specifying the arguments of a single `DescriptorTableClause`. So for a given clause we can only have one register specified. https://github.com/llvm/llvm-project/pull/136740 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits