More tracing for custom parsers (#471)
Some checks failed
ZLUDA / Build (Linux) (push) Has been cancelled
ZLUDA / Build (Windows) (push) Has been cancelled
ZLUDA / Build AMD GPU unit tests (push) Has been cancelled
ZLUDA / Run AMD GPU unit tests (push) Has been cancelled

This commit is contained in:
Violet 2025-08-08 12:19:27 -07:00 committed by GitHub
commit d2f92e4267
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 61 additions and 36 deletions

View file

@ -152,26 +152,32 @@ type PtxParser<'a, 'input> =
Stateful<&'a [(Token<'input>, logos::Span)], PtxParserState<'a, 'input>>; Stateful<&'a [(Token<'input>, logos::Span)], PtxParserState<'a, 'input>>;
fn ident<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<&'input str> { fn ident<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<&'input str> {
any.verify_map(|(t, _)| { trace(
if let Token::Ident(text) = t { "ident",
Some(text) any.verify_map(|(t, _)| {
} else if let Some(text) = t.opcode_text() { if let Token::Ident(text) = t {
Some(text) Some(text)
} else { } else if let Some(text) = t.opcode_text() {
None Some(text)
} } else {
}) None
}
}),
)
.parse_next(stream) .parse_next(stream)
} }
fn dot_ident<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<&'input str> { fn dot_ident<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<&'input str> {
any.verify_map(|(t, _)| { trace(
if let Token::DotIdent(text) = t { "dot_ident",
Some(text) any.verify_map(|(t, _)| {
} else { if let Token::DotIdent(text) = t {
None Some(text)
} } else {
}) None
}
}),
)
.parse_next(stream) .parse_next(stream)
} }
@ -308,12 +314,15 @@ fn constant<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<ast::Imme
} }
fn immediate_value<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<ast::ImmediateValue> { fn immediate_value<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<ast::ImmediateValue> {
alt(( trace(
int_immediate, "immediate_value",
f32.map(ast::ImmediateValue::F32), alt((
f64.map(ast::ImmediateValue::F64), int_immediate,
constant, f32.map(ast::ImmediateValue::F32),
)) f64.map(ast::ImmediateValue::F64),
constant,
)),
)
.parse_next(stream) .parse_next(stream)
} }
@ -798,9 +807,10 @@ where
fn with_recovery<'a, 'input: 'a, T>( fn with_recovery<'a, 'input: 'a, T>(
mut parser: impl Parser<PtxParser<'a, 'input>, T, ContextError>, mut parser: impl Parser<PtxParser<'a, 'input>, T, ContextError>,
mut recovery: impl Parser<PtxParser<'a, 'input>, &'a [(Token<'input>, logos::Span)], ContextError>, recovery: impl Parser<PtxParser<'a, 'input>, &'a [(Token<'input>, logos::Span)], ContextError>,
mut error: impl FnMut(Option<&'input str>) -> PtxError<'input>, mut error: impl FnMut(Option<&'input str>) -> PtxError<'input>,
) -> impl Parser<PtxParser<'a, 'input>, Option<T>, ContextError> { ) -> impl Parser<PtxParser<'a, 'input>, Option<T>, ContextError> {
let mut recovery = trace("recovery", recovery);
trace( trace(
"with_recovery", "with_recovery",
move |stream: &mut PtxParser<'a, 'input>| { move |stream: &mut PtxParser<'a, 'input>| {
@ -828,9 +838,11 @@ fn with_recovery<'a, 'input: 'a, T>(
} }
fn pragma<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<()> { fn pragma<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<()> {
(Token::DotPragma, Token::String, Token::Semicolon) trace(
.void() "pragma",
.parse_next(stream) (Token::DotPragma, Token::String, Token::Semicolon).void(),
)
.parse_next(stream)
} }
fn method_parameter<'a, 'input: 'a>( fn method_parameter<'a, 'input: 'a>(
@ -1181,18 +1193,23 @@ fn scalar_type<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<Scalar
fn predicated_instruction<'a, 'input>( fn predicated_instruction<'a, 'input>(
stream: &mut PtxParser<'a, 'input>, stream: &mut PtxParser<'a, 'input>,
) -> PResult<ast::Statement<ParsedOperandStr<'input>>> { ) -> PResult<ast::Statement<ParsedOperandStr<'input>>> {
(opt(pred_at), parse_instruction, Token::Semicolon) trace(
.map(|(p, i, _)| ast::Statement::Instruction(p, i)) "predicated_instruction",
.parse_next(stream) (opt(pred_at), parse_instruction, Token::Semicolon)
.map(|(p, i, _)| ast::Statement::Instruction(p, i)),
)
.parse_next(stream)
} }
fn pred_at<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<ast::PredAt<&'input str>> { fn pred_at<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<ast::PredAt<&'input str>> {
(Token::At, opt(Token::Exclamation), ident) trace(
.map(|(_, not, label)| ast::PredAt { "pred_at",
(Token::At, opt(Token::Exclamation), ident).map(|(_, not, label)| ast::PredAt {
not: not.is_some(), not: not.is_some(),
label, label,
}) }),
.parse_next(stream) )
.parse_next(stream)
} }
fn label<'a, 'input>( fn label<'a, 'input>(
@ -1315,9 +1332,12 @@ impl<Ident> ast::ParsedOperand<Ident> {
trace( trace(
"operand", "operand",
alt(( alt((
ident_operands, trace("ident_operands", ident_operands),
immediate_value.map(ast::ParsedOperand::Imm), immediate_value.map(ast::ParsedOperand::Imm),
vector_operand.map(ast::ParsedOperand::VecPack), trace(
"vector_operand",
vector_operand.map(ast::ParsedOperand::VecPack),
),
)), )),
) )
.parse_next(stream) .parse_next(stream)

View file

@ -574,7 +574,7 @@ fn emit_parse_function(
#(#fns_)* #(#fns_)*
fn parse_instruction<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> winnow::error::PResult<Instruction<ParsedOperandStr<'input>>> fn parse_instruction_impl<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> winnow::error::PResult<Instruction<ParsedOperandStr<'input>>>
{ {
use winnow::Parser; use winnow::Parser;
use winnow::token::*; use winnow::token::*;
@ -588,6 +588,11 @@ fn emit_parse_function(
_ => return Err(winnow::error::ErrMode::from_error_kind(stream, winnow::error::ErrorKind::Token)) _ => return Err(winnow::error::ErrMode::from_error_kind(stream, winnow::error::ErrorKind::Token))
}) })
} }
fn parse_instruction<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> winnow::error::PResult<Instruction<ParsedOperandStr<'input>>>
{
trace("parse_instruction", parse_instruction_impl).parse_next(stream)
}
} }
} }