From 3a550d185ff35cb4971b87f0d50b5cc5898a83bb Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Fri, 27 Jul 2018 17:55:26 +0200 Subject: [PATCH] Enhance Verifier error reporting; --- cranelift/filetests/verifier/type_check.clif | 4 +- lib/codegen/src/print_errors.rs | 52 +++++++++++--------- lib/codegen/src/verifier/mod.rs | 3 +- lib/filetests/src/runone.rs | 2 +- 4 files changed, 34 insertions(+), 27 deletions(-) diff --git a/cranelift/filetests/verifier/type_check.clif b/cranelift/filetests/verifier/type_check.clif index 8783c4aced..1e7278e973 100644 --- a/cranelift/filetests/verifier/type_check.clif +++ b/cranelift/filetests/verifier/type_check.clif @@ -44,7 +44,7 @@ function %type_mismatch_controlling_variable() { function %fn_call_too_few_args() { fn2 = %great_fn(i32, f32) ebb0: - call fn2() ; error: mismatched argument count, got 0, expected 2 + call fn2() ; error: mismatched argument count for `call fn2()`: got 0, expected 2 return } @@ -53,7 +53,7 @@ function %fn_call_too_many_args() { ebb0: v0 = iconst.i64 56 v1 = f32const 0.0 - call fn5(v0, v1) ; error: mismatched argument count, got 2, expected 0 + call fn5(v0, v1) ; error: mismatched argument count for `call fn5(v0, v1)`: got 2, expected 0 return } diff --git a/lib/codegen/src/print_errors.rs b/lib/codegen/src/print_errors.rs index 5783056c03..6fbe3c9af1 100644 --- a/lib/codegen/src/print_errors.rs +++ b/lib/codegen/src/print_errors.rs @@ -18,6 +18,16 @@ pub fn pretty_verifier_error( err: &VerifierError, ) -> String { let mut w = String::new(); + + match err.location { + ir::entities::AnyEntity::Inst(_) => {} + _ => { + // Print the error, because the pretty_function_error below won't do it since it isn't + // tied to an instruction. + writeln!(w, "verifier error summary: {}\n", err.to_string()).unwrap(); + } + } + decorate_function( &mut |w, func, isa, inst, indent| pretty_function_error(w, func, isa, inst, indent, err), &mut w, @@ -37,31 +47,27 @@ fn pretty_function_error( err: &VerifierError, ) -> fmt::Result { match err.location { - ir::entities::AnyEntity::Inst(inst) => { - if inst == cur_inst { - writeln!( - w, - "{1:0$}{2}", - indent, - "", - func.dfg.display_inst(cur_inst, isa) - )?; - write!(w, "{1:0$}^", indent, "")?; - for _c in cur_inst.to_string().chars() { - write!(w, "~")?; - } - writeln!(w, "\n\nverifier {}\n", err.to_string()) - } else { - write!( - w, - "{1:0$}{2}", - indent, - "", - func.dfg.display_inst(cur_inst, isa) - ) + ir::entities::AnyEntity::Inst(inst) if inst == cur_inst => { + writeln!( + w, + "{1:0$}{2}", + indent, + "", + func.dfg.display_inst(cur_inst, isa) + )?; + write!(w, "{1:0$}^", indent, "")?; + for _c in cur_inst.to_string().chars() { + write!(w, "~")?; } + writeln!(w, " verifier {}\n", err.to_string()) } - _ => writeln!(w), + _ => writeln!( + w, + "{1:0$}{2}", + indent, + "", + func.dfg.display_inst(cur_inst, isa) + ), } } diff --git a/lib/codegen/src/verifier/mod.rs b/lib/codegen/src/verifier/mod.rs index f92bdda1d8..a25be6bcec 100644 --- a/lib/codegen/src/verifier/mod.rs +++ b/lib/codegen/src/verifier/mod.rs @@ -820,7 +820,8 @@ impl<'a> Verifier<'a> { if i != variable_args.len() { return err!( inst, - "mismatched argument count, got {}, expected {}", + "mismatched argument count for `{}`: got {}, expected {}", + self.func.dfg.display_inst(inst, None), variable_args.len(), i ); diff --git a/lib/filetests/src/runone.rs b/lib/filetests/src/runone.rs index 4036e482ad..60cb057e60 100644 --- a/lib/filetests/src/runone.rs +++ b/lib/filetests/src/runone.rs @@ -135,5 +135,5 @@ fn run_one_test<'a>( } test.run(func, context) - .map_err(|e| format!("{}: {}", name, e)) + .map_err(|e| format!("{}:\n{}", name, e)) }