[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC 1/6] scripts/simpletrace-rust: Add the basic cargo framework
From: |
Zhao Liu |
Subject: |
[RFC 1/6] scripts/simpletrace-rust: Add the basic cargo framework |
Date: |
Mon, 27 May 2024 16:14:16 +0800 |
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 <pbonzini@redhat.com>
Signed-off-by: Zhao Liu <zhao1.liu@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
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.liu@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.liu@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
+{
+ /* 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.liu@intel.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+pub struct Event {}
--
2.34.1
- [RFC 0/6] scripts: Rewrite simpletrace printer in Rust, Zhao Liu, 2024/05/27
- [RFC 4/6] scripts/simpletrace-rust: Parse and check trace recode file, Zhao Liu, 2024/05/27
- [RFC 2/6] scripts/simpletrace-rust: Support Event & Arguments in trace module, Zhao Liu, 2024/05/27
- [RFC 5/6] scripts/simpletrace-rust: Format simple trace output, Zhao Liu, 2024/05/27
- [RFC 1/6] scripts/simpletrace-rust: Add the basic cargo framework,
Zhao Liu <=
- Re: [RFC 1/6] scripts/simpletrace-rust: Add the basic cargo framework, Stefan Hajnoczi, 2024/05/27
- Re: [RFC 1/6] scripts/simpletrace-rust: Add the basic cargo framework, Zhao Liu, 2024/05/28
- Re: [RFC 1/6] scripts/simpletrace-rust: Add the basic cargo framework, Stefan Hajnoczi, 2024/05/28
- Re: [RFC 1/6] scripts/simpletrace-rust: Add the basic cargo framework, Zhao Liu, 2024/05/29
- Re: [RFC 1/6] scripts/simpletrace-rust: Add the basic cargo framework, Stefan Hajnoczi, 2024/05/29
- Re: [RFC 1/6] scripts/simpletrace-rust: Add the basic cargo framework, Daniel P . Berrangé, 2024/05/31
[RFC 3/6] scripts/simpletrace-rust: Add helpers to parse trace file, Zhao Liu, 2024/05/27
[RFC 6/6] docs/tracing: Add simpletrace-rust section, Zhao Liu, 2024/05/27