diff --git a/cranelift/fuzzgen/src/lib.rs b/cranelift/fuzzgen/src/lib.rs index 6e5b138dc3b5..67d52a1f9955 100644 --- a/cranelift/fuzzgen/src/lib.rs +++ b/cranelift/fuzzgen/src/lib.rs @@ -8,13 +8,13 @@ use cranelift::codegen::ir::Function; use cranelift::codegen::Context; use cranelift::prelude::*; use cranelift_native::builder_with_options; +use std::fmt; mod config; mod function_generator; pub type TestCaseInput = Vec; -#[derive(Debug)] pub struct TestCase { pub func: Function, /// Generate multiple test inputs for each test case. @@ -22,6 +22,41 @@ pub struct TestCase { pub inputs: Vec, } +impl fmt::Debug for TestCase { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + r#";; Fuzzgen test case + +test interpret +test run +set enable_llvm_abi_extensions +target aarch64 +target s390x +target x86_64 + +"# + )?; + + writeln!(f, "{}", self.func)?; + + for input in self.inputs.iter() { + let args = input + .iter() + .map(|val| format!("{}", val)) + .collect::>() + .join(", "); + + // TODO: We don't know the expected outputs, maybe we can run the interpreter + // here to figure them out? Should work, however we need to be careful to catch + // panics in case its the interpreter that is failing. + writeln!(f, "; run: {}({}) == TODO", self.func.name, args)?; + } + + Ok(()) + } +} + impl<'a> Arbitrary<'a> for TestCase { fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { FuzzGen::new(u)