From 1c339f35e7b8a38b36d99643b12a6b3708553184 Mon Sep 17 00:00:00 2001 From: Andrew Brown Date: Mon, 23 Mar 2020 14:59:04 -0700 Subject: [PATCH] Make rodata test framework more robust Previously `test rodata` would cause failures when compiling Cranelift IR that had assertions about the current sink offset (e.g. multiple blocks, see `emit_function` in `binemit/mod.rs`). --- cranelift/filetests/src/test_rodata.rs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/cranelift/filetests/src/test_rodata.rs b/cranelift/filetests/src/test_rodata.rs index 4254d9939b..3dabc86e00 100644 --- a/cranelift/filetests/src/test_rodata.rs +++ b/cranelift/filetests/src/test_rodata.rs @@ -52,10 +52,7 @@ impl SubTest for TestRodata { ); // Verify that the returned code size matches the emitted bytes. - let mut sink = RodataSink { - rodata: Vec::new(), - in_rodata: false, - }; + let mut sink = RodataSink::default(); binemit::emit_function( &comp_ctx.func, |func, inst, div, sink, isa| isa.emit_inst(func, inst, div, sink), @@ -71,35 +68,41 @@ impl SubTest for TestRodata { } /// Code sink that only captures emitted rodata +#[derive(Default)] struct RodataSink { - in_rodata: bool, + offset: usize, rodata: Vec, + in_rodata: bool, } impl binemit::CodeSink for RodataSink { fn offset(&self) -> binemit::CodeOffset { - 0 + self.offset as u32 } fn put1(&mut self, byte: u8) { + self.offset += 1; if self.in_rodata { self.rodata.push(byte); } } fn put2(&mut self, bytes: u16) { + self.offset += 2; if self.in_rodata { self.rodata.extend_from_slice(&bytes.to_be_bytes()); } } fn put4(&mut self, bytes: u32) { + self.offset += 4; if self.in_rodata { self.rodata.extend_from_slice(&bytes.to_be_bytes()); } } fn put8(&mut self, bytes: u64) { + self.offset += 8; if self.in_rodata { self.rodata.extend_from_slice(&bytes.to_be_bytes()); } @@ -111,13 +114,16 @@ impl binemit::CodeSink for RodataSink { fn reloc_jt(&mut self, _reloc: binemit::Reloc, _jt: ir::JumpTable) {} fn trap(&mut self, _code: ir::TrapCode, _srcloc: ir::SourceLoc) {} fn begin_jumptables(&mut self) { - assert!(!self.in_rodata); + assert!(!self.in_rodata, "Jump tables must be emitted before rodata"); } fn begin_rodata(&mut self) { self.in_rodata = true; } fn end_codegen(&mut self) { - assert!(self.in_rodata); + assert!( + self.in_rodata, + "Expected rodata to be emitted before the end of codegen" + ); } fn add_stackmap(&mut self, _: &[Value], _: &Function, _: &dyn TargetIsa) {} }