[clang] [llvm] Reland "[HLSL][RootSignature] Implement initial parsing of the descriptor table clause params" (PR #136740)
Finn Plummer via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 23 11:49:53 PDT 2025
================
@@ -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
More information about the llvm-commits
mailing list