diff --git a/Cargo.lock b/Cargo.lock index 91a54df..4ef8b80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -300,6 +300,7 @@ dependencies = [ name = "ppc750cl-fuzz" version = "0.2.0" dependencies = [ + "clap", "num_cpus", "ppc750cl", ] diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 5b846dc..138eca2 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -8,5 +8,6 @@ description = "Complete fuzzer for ppc750cl" repository = "https://github.com/terorie/ppc750cl" [dependencies] +clap = "3" num_cpus = "1.13" ppc750cl = { path = "../disasm", version = "0.2.0" } diff --git a/fuzz/src/main.rs b/fuzz/src/main.rs index be0840b..ed0e5b5 100644 --- a/fuzz/src/main.rs +++ b/fuzz/src/main.rs @@ -1,5 +1,6 @@ use std::io::Write; use std::ops::Range; +use std::str::FromStr; use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::Arc; use std::time::{Duration, Instant}; @@ -8,8 +9,24 @@ use ppc750cl::formatter::FormattedIns; use ppc750cl::Ins; fn main() { + let matches = clap::Command::new("ppc750cl-fuzz") + .version("0.2.0") + .about("Complete \"fuzzer\" for ppc750cl disassembler") + .arg( + clap::Arg::new("threads") + .short('t') + .long("--threads") + .takes_value(true) + .help("Number of threads to use (default num CPUs)"), + ) + .get_matches(); + + let threads = match matches.value_of("threads") { + Some(t) => u32::from_str(t).expect("invalid threads flag"), + None => num_cpus::get() as u32, + }; let start = Instant::now(); - let fuzzer = MultiFuzzer::new(num_cpus::get() as u32); + let fuzzer = MultiFuzzer::new(threads); fuzzer.run(); println!("Finished in {:.2}s", start.elapsed().as_secs_f32()); } diff --git a/genisa/src/main.rs b/genisa/src/main.rs index 8aad187..4591b9c 100644 --- a/genisa/src/main.rs +++ b/genisa/src/main.rs @@ -534,18 +534,13 @@ impl Isa { let use_match_arms = token_stream!(use_match_arms); let suffix_match_arms = token_stream!(suffix_match_arms); let simplified_ins_match_arms = token_stream!(simplified_ins_match_arms); - let field_accessors = self - .fields - .iter() - .map(|field| field.construct_accessor()) - .collect::>(); - let field_accessors = token_stream!(field_accessors); - let modifier_accessors = self - .modifiers - .iter() - .map(|modifier| modifier.construct_accessor()) - .collect::>(); - let modifier_accessors = token_stream!(modifier_accessors); + let field_accessors = + TokenStream::from_iter(self.fields.iter().map(|field| field.construct_accessor())); + let modifier_accessors = TokenStream::from_iter( + self.modifiers + .iter() + .map(|modifier| modifier.construct_accessor()), + ); // Generate final fields function. let ins_impl = quote! { #[allow(clippy::all, unused_mut)]