From 48573b52b2c7ab52b5f3608437d59763812c1703 Mon Sep 17 00:00:00 2001 From: Chris Fallin Date: Thu, 21 May 2020 12:09:30 -0700 Subject: [PATCH] Merge `vcode` filetest mode into `compile`. I hadn't realized before that the filetest backend for `test vcode` is doing essentially what `compile` is doing, but for new (`MachInst`) backends: it is just getting a disassembly and running it through filecheck. There's no reason not to reuse `test compile` for the AArch64 tests as well. This was motivated by the desire to have "this IR compiles successfully" tests work on both x86 and AArch64. It seems this should work fine by adding multiple `target` directives when a test case should be compile-tested on multiple architectures. --- .../filetests/vcode/aarch64/arithmetic.clif | 2 +- .../filetests/vcode/aarch64/basic1.clif | 2 +- .../filetests/vcode/aarch64/bitops.clif | 2 +- .../vcode/aarch64/call-indirect.clif | 2 +- .../filetests/vcode/aarch64/call.clif | 2 +- .../filetests/vcode/aarch64/condbr.clif | 2 +- .../filetests/vcode/aarch64/condops.clif | 2 +- .../filetests/vcode/aarch64/constants.clif | 2 +- .../filetests/vcode/aarch64/extend-op.clif | 2 +- .../vcode/aarch64/floating-point.clif | 2 +- .../filetests/vcode/aarch64/jumptable.clif | 2 +- .../vcode/aarch64/narrow-arithmetic.clif | 2 +- .../vcode/aarch64/saturating-ops.clif | 2 +- .../filetests/vcode/aarch64/shift-op.clif | 2 +- .../filetests/vcode/aarch64/shift-rotate.clif | 2 +- .../filetests/vcode/aarch64/stack-limit.clif | 2 +- .../filetests/vcode/aarch64/stack.clif | 2 +- .../filetests/vcode/aarch64/symbol-value.clif | 2 +- .../filetests/vcode/aarch64/traps.clif | 2 +- .../vcode/aarch64/uextend-sextend.clif | 2 +- cranelift/filetests/src/lib.rs | 2 - cranelift/filetests/src/test_compile.rs | 50 +++++++++----- cranelift/filetests/src/test_vcode.rs | 67 ------------------- 23 files changed, 53 insertions(+), 106 deletions(-) delete mode 100644 cranelift/filetests/src/test_vcode.rs diff --git a/cranelift/filetests/filetests/vcode/aarch64/arithmetic.clif b/cranelift/filetests/filetests/vcode/aarch64/arithmetic.clif index 9a95c52c64..98ec613214 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/arithmetic.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/arithmetic.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f1(i64, i64) -> i64 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/basic1.clif b/cranelift/filetests/filetests/vcode/aarch64/basic1.clif index b5ec1ae160..dc117152e1 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/basic1.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/basic1.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f(i32, i32) -> i32 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/bitops.clif b/cranelift/filetests/filetests/vcode/aarch64/bitops.clif index f1f1a7dba3..c7ddd04608 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/bitops.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/bitops.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %a(i8) -> i8 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/call-indirect.clif b/cranelift/filetests/filetests/vcode/aarch64/call-indirect.clif index c5e8ea0596..6bb331dd20 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/call-indirect.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/call-indirect.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f(i64, i64) -> i64 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/call.clif b/cranelift/filetests/filetests/vcode/aarch64/call.clif index 4178a4c2f7..40cbd21383 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/call.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/call.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f(i64) -> i64 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/condbr.clif b/cranelift/filetests/filetests/vcode/aarch64/condbr.clif index 3f0c0766d7..d171d02bfb 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/condbr.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/condbr.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f(i64, i64) -> b1 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/condops.clif b/cranelift/filetests/filetests/vcode/aarch64/condops.clif index e489836527..ebdff13850 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/condops.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/condops.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f(i8, i64, i64) -> i64 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/constants.clif b/cranelift/filetests/filetests/vcode/aarch64/constants.clif index 7470941dec..80baeb1c98 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/constants.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/constants.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f() -> b8 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/extend-op.clif b/cranelift/filetests/filetests/vcode/aarch64/extend-op.clif index 6194dd563f..aa58cb2deb 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/extend-op.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/extend-op.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f(i8) -> i64 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/floating-point.clif b/cranelift/filetests/filetests/vcode/aarch64/floating-point.clif index b5d0c3768b..c4fbffc404 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/floating-point.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/floating-point.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f1(f32, f32) -> f32 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/jumptable.clif b/cranelift/filetests/filetests/vcode/aarch64/jumptable.clif index f7c94c50b6..da4daae571 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/jumptable.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/jumptable.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f(i64) -> i64 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/narrow-arithmetic.clif b/cranelift/filetests/filetests/vcode/aarch64/narrow-arithmetic.clif index d11fc22417..e68eb28c67 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/narrow-arithmetic.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/narrow-arithmetic.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %add8(i8, i8) -> i8 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/saturating-ops.clif b/cranelift/filetests/filetests/vcode/aarch64/saturating-ops.clif index dcb76e0f26..d184eeef95 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/saturating-ops.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/saturating-ops.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %uaddsat64(i64, i64) -> i64 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/shift-op.clif b/cranelift/filetests/filetests/vcode/aarch64/shift-op.clif index 12984620a1..2b72b9951f 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/shift-op.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/shift-op.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f(i64) -> i64 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/shift-rotate.clif b/cranelift/filetests/filetests/vcode/aarch64/shift-rotate.clif index 26a6922b39..2f2439ff57 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/shift-rotate.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/shift-rotate.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/cranelift/filetests/filetests/vcode/aarch64/stack-limit.clif b/cranelift/filetests/filetests/vcode/aarch64/stack-limit.clif index c9734e7cdd..b7dc3bf342 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/stack-limit.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/stack-limit.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %foo() { diff --git a/cranelift/filetests/filetests/vcode/aarch64/stack.clif b/cranelift/filetests/filetests/vcode/aarch64/stack.clif index 47c4b37a0f..85f19bdb25 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/stack.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/stack.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %stack_addr_small() -> i64 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/symbol-value.clif b/cranelift/filetests/filetests/vcode/aarch64/symbol-value.clif index 01c0a8a46b..650115f1f8 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/symbol-value.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/symbol-value.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f() -> i64 { diff --git a/cranelift/filetests/filetests/vcode/aarch64/traps.clif b/cranelift/filetests/filetests/vcode/aarch64/traps.clif index b4c4be344b..ab0ca07ae4 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/traps.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/traps.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f() { diff --git a/cranelift/filetests/filetests/vcode/aarch64/uextend-sextend.clif b/cranelift/filetests/filetests/vcode/aarch64/uextend-sextend.clif index 86084ff0cc..803f144844 100644 --- a/cranelift/filetests/filetests/vcode/aarch64/uextend-sextend.clif +++ b/cranelift/filetests/filetests/vcode/aarch64/uextend-sextend.clif @@ -1,4 +1,4 @@ -test vcode +test compile target aarch64 function %f_u_8_64(i8) -> i64 { diff --git a/cranelift/filetests/src/lib.rs b/cranelift/filetests/src/lib.rs index 5cf7331225..05a6a80da3 100644 --- a/cranelift/filetests/src/lib.rs +++ b/cranelift/filetests/src/lib.rs @@ -57,7 +57,6 @@ mod test_shrink; mod test_simple_gvn; mod test_simple_preopt; mod test_unwind; -mod test_vcode; mod test_verifier; /// The result of running the test in a file. @@ -141,7 +140,6 @@ fn new_subtest(parsed: &TestCommand) -> subtest::SubtestResult test_simple_gvn::subtest(parsed), "simple_preopt" => test_simple_preopt::subtest(parsed), "unwind" => test_unwind::subtest(parsed), - "vcode" => test_vcode::subtest(parsed), "verifier" => test_verifier::subtest(parsed), _ => Err(format!("unknown test command '{}'", parsed.command)), } diff --git a/cranelift/filetests/src/test_compile.rs b/cranelift/filetests/src/test_compile.rs index 8e0f2dd1ab..64369183ba 100644 --- a/cranelift/filetests/src/test_compile.rs +++ b/cranelift/filetests/src/test_compile.rs @@ -40,6 +40,11 @@ impl SubTest for TestCompile { let isa = context.isa.expect("compile needs an ISA"); let mut comp_ctx = cranelift_codegen::Context::for_function(func.into_owned()); + if isa.get_mach_backend().is_some() { + // With `MachBackend`s, we need to explicitly request dissassembly results. + comp_ctx.set_disasm(true); + } + let CodeInfo { total_size, .. } = comp_ctx .compile(isa) .map_err(|e| pretty_error(&comp_ctx.func, context.isa, e))?; @@ -50,25 +55,36 @@ impl SubTest for TestCompile { comp_ctx.func.display(isa) ); - // Verify that the returned code size matches the emitted bytes. - let mut sink = SizeSink { offset: 0 }; - binemit::emit_function( - &comp_ctx.func, - |func, inst, div, sink, isa| isa.emit_inst(func, inst, div, sink), - &mut sink, - isa, - ); + if !isa.get_mach_backend().is_some() { + // Verify that the returned code size matches the emitted bytes. + let mut sink = SizeSink { offset: 0 }; + binemit::emit_function( + &comp_ctx.func, + |func, inst, div, sink, isa| isa.emit_inst(func, inst, div, sink), + &mut sink, + isa, + ); - if sink.offset != total_size { - return Err(format!( - "Expected code size {}, got {}", - total_size, sink.offset - )); + if sink.offset != total_size { + return Err(format!( + "Expected code size {}, got {}", + total_size, sink.offset + )); + } + + // Run final code through filecheck. + let text = comp_ctx.func.display(Some(isa)).to_string(); + run_filecheck(&text, context) + } else { + let disasm = comp_ctx + .mach_compile_result + .as_ref() + .unwrap() + .disasm + .as_ref() + .unwrap(); + run_filecheck(&disasm, context) } - - // Run final code through filecheck. - let text = comp_ctx.func.display(Some(isa)).to_string(); - run_filecheck(&text, context) } } diff --git a/cranelift/filetests/src/test_vcode.rs b/cranelift/filetests/src/test_vcode.rs deleted file mode 100644 index 93bce57a59..0000000000 --- a/cranelift/filetests/src/test_vcode.rs +++ /dev/null @@ -1,67 +0,0 @@ -use crate::subtest::{run_filecheck, Context, SubTest, SubtestResult}; -use cranelift_codegen::ir::Function; -use cranelift_codegen::isa::lookup; -use cranelift_codegen::settings; -use cranelift_codegen::Context as CodegenContext; -use cranelift_reader::{TestCommand, TestOption}; - -use log::info; -use std::borrow::Cow; -use std::string::String; - -struct TestVCode { - arch: String, -} - -pub fn subtest(parsed: &TestCommand) -> SubtestResult> { - assert_eq!(parsed.command, "vcode"); - - let mut arch = "arm64".to_string(); - for option in &parsed.options { - match option { - TestOption::Value(k, v) if k == &"arch" => { - arch = v.to_string(); - } - _ => {} - } - } - - Ok(Box::new(TestVCode { arch })) -} - -impl SubTest for TestVCode { - fn name(&self) -> &'static str { - "vcode" - } - - fn is_mutating(&self) -> bool { - true - } - - fn needs_isa(&self) -> bool { - true - } - - fn run(&self, func: Cow, context: &Context) -> SubtestResult<()> { - let triple = context.isa.unwrap().triple().clone(); - let func = func.into_owned(); - - let mut isa = lookup(triple) - .map_err(|_| format!("Could not look up backend for arch '{}'", self.arch))? - .finish(settings::Flags::new(settings::builder())); - - let mut codectx = CodegenContext::for_function(func); - codectx.set_disasm(true); - - codectx - .compile(&mut *isa) - .map_err(|e| format!("Could not compile with arch '{}': {:?}", self.arch, e))?; - - let result = codectx.mach_compile_result.take().unwrap(); - let text = result.disasm.unwrap(); - - info!("text input to filecheck is:\n{}\n", text); - - run_filecheck(&text, context) - } -}