From d2f92e4267d9762f13bfdcb46d869861699b15ca Mon Sep 17 00:00:00 2001 From: Violet Date: Fri, 8 Aug 2025 12:19:27 -0700 Subject: [PATCH] More tracing for custom parsers (#471) --- ptx_parser/src/lib.rs | 90 ++++++++++++++++++++++-------------- ptx_parser_macros/src/lib.rs | 7 ++- 2 files changed, 61 insertions(+), 36 deletions(-) diff --git a/ptx_parser/src/lib.rs b/ptx_parser/src/lib.rs index fabb16e..1908031 100644 --- a/ptx_parser/src/lib.rs +++ b/ptx_parser/src/lib.rs @@ -152,26 +152,32 @@ type PtxParser<'a, 'input> = Stateful<&'a [(Token<'input>, logos::Span)], PtxParserState<'a, 'input>>; fn ident<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<&'input str> { - any.verify_map(|(t, _)| { - if let Token::Ident(text) = t { - Some(text) - } else if let Some(text) = t.opcode_text() { - Some(text) - } else { - None - } - }) + trace( + "ident", + any.verify_map(|(t, _)| { + if let Token::Ident(text) = t { + Some(text) + } else if let Some(text) = t.opcode_text() { + Some(text) + } else { + None + } + }), + ) .parse_next(stream) } fn dot_ident<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult<&'input str> { - any.verify_map(|(t, _)| { - if let Token::DotIdent(text) = t { - Some(text) - } else { - None - } - }) + trace( + "dot_ident", + any.verify_map(|(t, _)| { + if let Token::DotIdent(text) = t { + Some(text) + } else { + None + } + }), + ) .parse_next(stream) } @@ -308,12 +314,15 @@ fn constant<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult(stream: &mut PtxParser<'a, 'input>) -> PResult { - alt(( - int_immediate, - f32.map(ast::ImmediateValue::F32), - f64.map(ast::ImmediateValue::F64), - constant, - )) + trace( + "immediate_value", + alt(( + int_immediate, + f32.map(ast::ImmediateValue::F32), + f64.map(ast::ImmediateValue::F64), + constant, + )), + ) .parse_next(stream) } @@ -798,9 +807,10 @@ where fn with_recovery<'a, 'input: 'a, T>( mut parser: impl Parser, T, ContextError>, - mut recovery: impl Parser, &'a [(Token<'input>, logos::Span)], ContextError>, + recovery: impl Parser, &'a [(Token<'input>, logos::Span)], ContextError>, mut error: impl FnMut(Option<&'input str>) -> PtxError<'input>, ) -> impl Parser, Option, ContextError> { + let mut recovery = trace("recovery", recovery); trace( "with_recovery", 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<()> { - (Token::DotPragma, Token::String, Token::Semicolon) - .void() - .parse_next(stream) + trace( + "pragma", + (Token::DotPragma, Token::String, Token::Semicolon).void(), + ) + .parse_next(stream) } fn method_parameter<'a, 'input: 'a>( @@ -1181,18 +1193,23 @@ fn scalar_type<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> PResult( stream: &mut PtxParser<'a, 'input>, ) -> PResult>> { - (opt(pred_at), parse_instruction, Token::Semicolon) - .map(|(p, i, _)| ast::Statement::Instruction(p, i)) - .parse_next(stream) + trace( + "predicated_instruction", + (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> { - (Token::At, opt(Token::Exclamation), ident) - .map(|(_, not, label)| ast::PredAt { + trace( + "pred_at", + (Token::At, opt(Token::Exclamation), ident).map(|(_, not, label)| ast::PredAt { not: not.is_some(), label, - }) - .parse_next(stream) + }), + ) + .parse_next(stream) } fn label<'a, 'input>( @@ -1315,9 +1332,12 @@ impl ast::ParsedOperand { trace( "operand", alt(( - ident_operands, + trace("ident_operands", ident_operands), immediate_value.map(ast::ParsedOperand::Imm), - vector_operand.map(ast::ParsedOperand::VecPack), + trace( + "vector_operand", + vector_operand.map(ast::ParsedOperand::VecPack), + ), )), ) .parse_next(stream) diff --git a/ptx_parser_macros/src/lib.rs b/ptx_parser_macros/src/lib.rs index 4d5d77c..87e3de0 100644 --- a/ptx_parser_macros/src/lib.rs +++ b/ptx_parser_macros/src/lib.rs @@ -574,7 +574,7 @@ fn emit_parse_function( #(#fns_)* - fn parse_instruction<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> winnow::error::PResult>> + fn parse_instruction_impl<'a, 'input>(stream: &mut PtxParser<'a, 'input>) -> winnow::error::PResult>> { use winnow::Parser; use winnow::token::*; @@ -588,6 +588,11 @@ fn emit_parse_function( _ => 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>> + { + trace("parse_instruction", parse_instruction_impl).parse_next(stream) + } } }