On Mon, May 27, 2024 at 04:14:16PM +0800, Zhao Liu wrote: > Define the basic cargo framework to support compiling simpletrace-rust > via cargo, and add the Rust code style (with some nightly features) > check items to make Rust style as close to the QEMU C code as possible. > > With the base cargo package, define the basic code framework for > simpletrace-rust, approximating the Python version, and also abstract > Analyzer operations for simpletrace-rust. Event and other future > trace-related structures are placed in the trace module. > > Additionally, support basic command line parsing for simpletrace-rust as > a start. > > Suggested-by: Paolo Bonzini <pbonz...@redhat.com> > Signed-off-by: Zhao Liu <zhao1....@intel.com> > --- > scripts/simpletrace-rust/.gitignore | 1 + > scripts/simpletrace-rust/.rustfmt.toml | 9 + > scripts/simpletrace-rust/Cargo.lock | 239 +++++++++++++++++++++++++ > scripts/simpletrace-rust/Cargo.toml | 11 ++ > scripts/simpletrace-rust/src/main.rs | 173 ++++++++++++++++++ > scripts/simpletrace-rust/src/trace.rs | 11 ++ > 6 files changed, 444 insertions(+) > create mode 100644 scripts/simpletrace-rust/.gitignore > create mode 100644 scripts/simpletrace-rust/.rustfmt.toml > create mode 100644 scripts/simpletrace-rust/Cargo.lock > create mode 100644 scripts/simpletrace-rust/Cargo.toml > create mode 100644 scripts/simpletrace-rust/src/main.rs > create mode 100644 scripts/simpletrace-rust/src/trace.rs > > diff --git a/scripts/simpletrace-rust/.gitignore > b/scripts/simpletrace-rust/.gitignore > new file mode 100644 > index 000000000000..2f7896d1d136 > --- /dev/null > +++ b/scripts/simpletrace-rust/.gitignore > @@ -0,0 +1 @@ > +target/ > diff --git a/scripts/simpletrace-rust/.rustfmt.toml > b/scripts/simpletrace-rust/.rustfmt.toml > new file mode 100644 > index 000000000000..97a97c24ebfb > --- /dev/null > +++ b/scripts/simpletrace-rust/.rustfmt.toml > @@ -0,0 +1,9 @@ > +brace_style = "AlwaysNextLine" > +comment_width = 80 > +edition = "2021" > +group_imports = "StdExternalCrate" > +imports_granularity = "item" > +max_width = 80 > +use_field_init_shorthand = true > +use_try_shorthand = true > +wrap_comments = true
There should be QEMU-wide policy. That said, why is it necessary to customize rustfmt? > diff --git a/scripts/simpletrace-rust/Cargo.lock > b/scripts/simpletrace-rust/Cargo.lock > new file mode 100644 > index 000000000000..4a0ff8092dcb > --- /dev/null > +++ b/scripts/simpletrace-rust/Cargo.lock > @@ -0,0 +1,239 @@ > +# This file is automatically @generated by Cargo. > +# It is not intended for manual editing. > +version = 3 > + > +[[package]] > +name = "anstream" > +version = "0.6.14" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" > +dependencies = [ > + "anstyle", > + "anstyle-parse", > + "anstyle-query", > + "anstyle-wincon", > + "colorchoice", > + "is_terminal_polyfill", > + "utf8parse", > +] > + > +[[package]] > +name = "anstyle" > +version = "1.0.7" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" > + > +[[package]] > +name = "anstyle-parse" > +version = "0.2.4" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" > +dependencies = [ > + "utf8parse", > +] > + > +[[package]] > +name = "anstyle-query" > +version = "1.0.3" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" > +dependencies = [ > + "windows-sys", > +] > + > +[[package]] > +name = "anstyle-wincon" > +version = "3.0.3" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" > +dependencies = [ > + "anstyle", > + "windows-sys", > +] > + > +[[package]] > +name = "clap" > +version = "4.5.4" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" > +dependencies = [ > + "clap_builder", > +] > + > +[[package]] > +name = "clap_builder" > +version = "4.5.2" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" > +dependencies = [ > + "anstream", > + "anstyle", > + "clap_lex", > + "strsim", > +] > + > +[[package]] > +name = "clap_lex" > +version = "0.7.0" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" > + > +[[package]] > +name = "colorchoice" > +version = "1.0.1" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" > + > +[[package]] > +name = "is_terminal_polyfill" > +version = "1.70.0" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" > + > +[[package]] > +name = "proc-macro2" > +version = "1.0.83" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" > +dependencies = [ > + "unicode-ident", > +] > + > +[[package]] > +name = "quote" > +version = "1.0.36" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" > +dependencies = [ > + "proc-macro2", > +] > + > +[[package]] > +name = "simpletrace-rust" > +version = "0.1.0" > +dependencies = [ > + "clap", > + "thiserror", > +] > + > +[[package]] > +name = "strsim" > +version = "0.11.1" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" > + > +[[package]] > +name = "syn" > +version = "2.0.66" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" > +dependencies = [ > + "proc-macro2", > + "quote", > + "unicode-ident", > +] > + > +[[package]] > +name = "thiserror" > +version = "1.0.61" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" > +dependencies = [ > + "thiserror-impl", > +] > + > +[[package]] > +name = "thiserror-impl" > +version = "1.0.61" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" > +dependencies = [ > + "proc-macro2", > + "quote", > + "syn", > +] > + > +[[package]] > +name = "unicode-ident" > +version = "1.0.12" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" > + > +[[package]] > +name = "utf8parse" > +version = "0.2.1" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" > + > +[[package]] > +name = "windows-sys" > +version = "0.52.0" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" > +dependencies = [ > + "windows-targets", > +] > + > +[[package]] > +name = "windows-targets" > +version = "0.52.5" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" > +dependencies = [ > + "windows_aarch64_gnullvm", > + "windows_aarch64_msvc", > + "windows_i686_gnu", > + "windows_i686_gnullvm", > + "windows_i686_msvc", > + "windows_x86_64_gnu", > + "windows_x86_64_gnullvm", > + "windows_x86_64_msvc", > +] > + > +[[package]] > +name = "windows_aarch64_gnullvm" > +version = "0.52.5" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" > + > +[[package]] > +name = "windows_aarch64_msvc" > +version = "0.52.5" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" > + > +[[package]] > +name = "windows_i686_gnu" > +version = "0.52.5" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" > + > +[[package]] > +name = "windows_i686_gnullvm" > +version = "0.52.5" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" > + > +[[package]] > +name = "windows_i686_msvc" > +version = "0.52.5" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" > + > +[[package]] > +name = "windows_x86_64_gnu" > +version = "0.52.5" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" > + > +[[package]] > +name = "windows_x86_64_gnullvm" > +version = "0.52.5" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" > + > +[[package]] > +name = "windows_x86_64_msvc" > +version = "0.52.5" > +source = "registry+https://github.com/rust-lang/crates.io-index" > +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" > diff --git a/scripts/simpletrace-rust/Cargo.toml > b/scripts/simpletrace-rust/Cargo.toml > new file mode 100644 > index 000000000000..b44ba1569dad > --- /dev/null > +++ b/scripts/simpletrace-rust/Cargo.toml > @@ -0,0 +1,11 @@ > +[package] > +name = "simpletrace-rust" > +description = "Pretty-printer for simple trace backend binary trace files > (Rust version)" > +version = "0.1.0" > +edition = "2021" > +authors = ["Zhao Liu <zhao1....@intel.com>"] > +license = "GPL-2.0-or-later" > + > +[dependencies] > +clap = "4.5.4" > +thiserror = "1.0.20" > diff --git a/scripts/simpletrace-rust/src/main.rs > b/scripts/simpletrace-rust/src/main.rs > new file mode 100644 > index 000000000000..2d2926b7658d > --- /dev/null > +++ b/scripts/simpletrace-rust/src/main.rs > @@ -0,0 +1,173 @@ > +/* > + * Pretty-printer for simple trace backend binary trace files (Rust version) > + * > + * Copyright (C) 2024 Intel Corporation. > + * > + * Authors: Zhao Liu <zhao1....@intel.com> > + * > + * SPDX-License-Identifier: GPL-2.0-or-later > + */ > + > +#![allow(dead_code)] > +#![allow(unused_variables)] > + > +mod trace; > + > +use std::env; > + > +use clap::Arg; > +use clap::Command; > +use thiserror::Error; > +use trace::Event; > + > +#[derive(Error, Debug)] > +pub enum Error > +{ > + #[error("usage: {0} [--no-header] <trace-events> <trace-file>")] > + CliOptionUnmatch(String), > +} > + > +pub type Result<T> = std::result::Result<T, Error>; > + > +pub struct EventArgPayload {} > + > +trait Analyzer > +{ The Python version treats this as an API so that users can write trace analysis scripts. I see below that you're using non-doc comments. That suggests you don't see this as a public API that people can write trace analysis scripts against? > + /* Called at the start of the trace. */ > + fn begin(&self) {} > + > + /* Called if no specific method for processing a trace event. */ > + fn catchall( > + &mut self, > + rec_args: &[EventArgPayload], > + event: &Event, > + timestamp_ns: u64, > + pid: u32, > + event_id: u64, > + ) -> Result<String>; > + > + /* Called at the end of the trace. */ > + fn end(&self) {} > + > + /* > + * TODO: Support "variable" parameters (i.e. variants of process_event() > + * with different parameters, like **kwargs in python), when we need a > + * simpletrace rust module. > + */ > + fn process_event( > + &mut self, > + rec_args: &[EventArgPayload], > + event: &Event, > + event_id: u64, > + timestamp_ns: u64, > + pid: u32, > + ) -> Result<String> > + { > + self.catchall(rec_args, event, timestamp_ns, pid, event_id) > + > + /* > + * TODO: Support custom function hooks (like getattr() in python), > + * when we need a simpletrace rust module. > + */ > + } > +} > + > +struct Formatter > +{ > + last_timestamp_ns: Option<u64>, > +} > + > +impl Formatter > +{ > + fn new() -> Self > + { > + Formatter { > + last_timestamp_ns: None, > + } > + } > +} > + > +impl Analyzer for Formatter > +{ > + fn catchall( > + &mut self, > + rec_args: &[EventArgPayload], > + event: &Event, > + timestamp_ns: u64, > + pid: u32, > + event_id: u64, > + ) -> Result<String> > + { > + let fmt_str = String::new(); > + > + Ok(fmt_str) > + } > +} > + > +fn process( > + event_path: &str, > + trace_path: &str, > + analyzer: &mut Formatter, > + read_header: bool, > +) -> Result<()> > +{ > + analyzer.begin(); > + analyzer.end(); > + > + Ok(()) > +} > + > +/* > + * Execute an analyzer on a trace file given on the command-line. > + * This function is useful as a driver for simple analysis scripts. More > + * advanced scripts will want to call process() instead. > + */ > +fn run(analyzer: &mut Formatter) -> Result<()> > +{ > + let matches = Command::new("simple trace") > + .arg( > + Arg::new("no-header") > + .required(false) > + .long("no-header") > + .action(clap::ArgAction::SetTrue) > + .help("Disable header parsing"), > + ) > + .arg( > + Arg::new("trace-events") > + .required(true) > + .action(clap::ArgAction::Set) > + .help("Path to trace events file"), > + ) > + .arg( > + Arg::new("trace-file") > + .required(true) > + .action(clap::ArgAction::Set) > + .help("Path to trace file"), > + ) > + .try_get_matches() > + .map_err(|_| { > + Error::CliOptionUnmatch( > + env::current_exe() > + .unwrap_or_else(|_| "simpletrace".into()) > + .to_string_lossy() > + .to_string(), > + ) > + })?; > + > + let no_header = matches.get_flag("no-header"); > + let event_path = matches.get_one::<String>("trace-events").unwrap(); > + let trace_path = matches.get_one::<String>("trace-file").unwrap(); > + > + process(event_path, trace_path, analyzer, !no_header)?; > + > + Ok(()) > +} > + > +fn main() > +{ > + let mut fmt = Formatter::new(); > + > + if let Err(e) = run(&mut fmt) { > + println!("{:?}", e.to_string()); > + } > +} > diff --git a/scripts/simpletrace-rust/src/trace.rs > b/scripts/simpletrace-rust/src/trace.rs > new file mode 100644 > index 000000000000..3a4b06435b8b > --- /dev/null > +++ b/scripts/simpletrace-rust/src/trace.rs > @@ -0,0 +1,11 @@ > +/* > + * Machinery for generating tracing-related intermediate files (Rust version) > + * > + * Copyright (C) 2024 Intel Corporation. > + * > + * Authors: Zhao Liu <zhao1....@intel.com> > + * > + * SPDX-License-Identifier: GPL-2.0-or-later > + */ > + > +pub struct Event {} > -- > 2.34.1 >
signature.asc
Description: PGP signature