Move the TestCodeSink functionality to MachBufferFinalized
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
use crate::ir::types::*;
|
use crate::ir::types::*;
|
||||||
use crate::ir::TrapCode;
|
use crate::ir::TrapCode;
|
||||||
use crate::isa::aarch64::inst::*;
|
use crate::isa::aarch64::inst::*;
|
||||||
use crate::isa::test_utils;
|
|
||||||
use crate::isa::CallConv;
|
use crate::isa::CallConv;
|
||||||
use crate::settings;
|
use crate::settings;
|
||||||
|
|
||||||
@@ -6523,12 +6522,10 @@ fn test_aarch64_binemit() {
|
|||||||
let actual_printing = insn.show_rru(Some(&rru));
|
let actual_printing = insn.show_rru(Some(&rru));
|
||||||
assert_eq!(expected_printing, actual_printing);
|
assert_eq!(expected_printing, actual_printing);
|
||||||
|
|
||||||
let mut sink = test_utils::TestCodeSink::new();
|
|
||||||
let mut buffer = MachBuffer::new();
|
let mut buffer = MachBuffer::new();
|
||||||
insn.emit(&mut buffer, &emit_info, &mut Default::default());
|
insn.emit(&mut buffer, &emit_info, &mut Default::default());
|
||||||
let buffer = buffer.finish();
|
let buffer = buffer.finish();
|
||||||
buffer.emit(&mut sink);
|
let actual_encoding = &buffer.stringify_code_bytes();
|
||||||
let actual_encoding = &sink.stringify();
|
|
||||||
assert_eq!(expected_encoding, actual_encoding);
|
assert_eq!(expected_encoding, actual_encoding);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
use crate::isa::arm32::inst::*;
|
use crate::isa::arm32::inst::*;
|
||||||
use crate::isa::test_utils;
|
|
||||||
use crate::settings;
|
use crate::settings;
|
||||||
|
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
@@ -1948,12 +1947,10 @@ fn test_arm32_emit() {
|
|||||||
// Check the printed text is as expected.
|
// Check the printed text is as expected.
|
||||||
let actual_printing = insn.show_rru(Some(&rru));
|
let actual_printing = insn.show_rru(Some(&rru));
|
||||||
assert_eq!(expected_printing, actual_printing);
|
assert_eq!(expected_printing, actual_printing);
|
||||||
let mut sink = test_utils::TestCodeSink::new();
|
|
||||||
let mut buffer = MachBuffer::new();
|
let mut buffer = MachBuffer::new();
|
||||||
insn.emit(&mut buffer, &flags, &mut Default::default());
|
insn.emit(&mut buffer, &flags, &mut Default::default());
|
||||||
let buffer = buffer.finish();
|
let buffer = buffer.finish();
|
||||||
buffer.emit(&mut sink);
|
let actual_encoding = &buffer.stringify_code_bytes();
|
||||||
let actual_encoding = &sink.stringify();
|
|
||||||
assert_eq!(expected_encoding, actual_encoding, "{}", expected_printing);
|
assert_eq!(expected_encoding, actual_encoding, "{}", expected_printing);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,9 +76,6 @@ pub mod unwind;
|
|||||||
|
|
||||||
mod call_conv;
|
mod call_conv;
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod test_utils;
|
|
||||||
|
|
||||||
/// Returns a builder that can create a corresponding `TargetIsa`
|
/// Returns a builder that can create a corresponding `TargetIsa`
|
||||||
/// or `Err(LookupError::SupportDisabled)` if not enabled.
|
/// or `Err(LookupError::SupportDisabled)` if not enabled.
|
||||||
macro_rules! isa_builder {
|
macro_rules! isa_builder {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
use crate::ir::MemFlags;
|
use crate::ir::MemFlags;
|
||||||
use crate::isa::s390x::inst::*;
|
use crate::isa::s390x::inst::*;
|
||||||
use crate::isa::s390x::settings as s390x_settings;
|
use crate::isa::s390x::settings as s390x_settings;
|
||||||
use crate::isa::test_utils;
|
|
||||||
use crate::settings;
|
use crate::settings;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
|
|
||||||
@@ -8112,12 +8111,10 @@ fn test_s390x_binemit() {
|
|||||||
let actual_printing = insn.show_rru(Some(&rru));
|
let actual_printing = insn.show_rru(Some(&rru));
|
||||||
assert_eq!(expected_printing, actual_printing);
|
assert_eq!(expected_printing, actual_printing);
|
||||||
|
|
||||||
let mut sink = test_utils::TestCodeSink::new();
|
|
||||||
let mut buffer = MachBuffer::new();
|
let mut buffer = MachBuffer::new();
|
||||||
insn.emit(&mut buffer, &emit_info, &mut Default::default());
|
insn.emit(&mut buffer, &emit_info, &mut Default::default());
|
||||||
let buffer = buffer.finish();
|
let buffer = buffer.finish();
|
||||||
buffer.emit(&mut sink);
|
let actual_encoding = &buffer.stringify_code_bytes();
|
||||||
let actual_encoding = &sink.stringify();
|
|
||||||
assert_eq!(expected_encoding, actual_encoding);
|
assert_eq!(expected_encoding, actual_encoding);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,74 +0,0 @@
|
|||||||
// This is unused when no platforms with the new backend are enabled.
|
|
||||||
#![allow(dead_code)]
|
|
||||||
|
|
||||||
use crate::binemit::{Addend, CodeOffset, CodeSink, Reloc};
|
|
||||||
use crate::ir::{ExternalName, Opcode, SourceLoc, TrapCode};
|
|
||||||
|
|
||||||
use alloc::vec::Vec;
|
|
||||||
use std::string::String;
|
|
||||||
|
|
||||||
pub struct TestCodeSink {
|
|
||||||
bytes: Vec<u8>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TestCodeSink {
|
|
||||||
/// Create a new TestCodeSink.
|
|
||||||
pub fn new() -> TestCodeSink {
|
|
||||||
TestCodeSink { bytes: vec![] }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Return the code emitted to this sink as a hex string.
|
|
||||||
pub fn stringify(&self) -> String {
|
|
||||||
// This is pretty lame, but whatever ..
|
|
||||||
use std::fmt::Write;
|
|
||||||
let mut s = String::with_capacity(self.bytes.len() * 2);
|
|
||||||
for b in &self.bytes {
|
|
||||||
write!(&mut s, "{:02X}", b).unwrap();
|
|
||||||
}
|
|
||||||
s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl CodeSink for TestCodeSink {
|
|
||||||
fn offset(&self) -> CodeOffset {
|
|
||||||
self.bytes.len() as CodeOffset
|
|
||||||
}
|
|
||||||
|
|
||||||
fn put1(&mut self, x: u8) {
|
|
||||||
self.bytes.push(x);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn put2(&mut self, x: u16) {
|
|
||||||
self.bytes.push((x >> 0) as u8);
|
|
||||||
self.bytes.push((x >> 8) as u8);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn put4(&mut self, mut x: u32) {
|
|
||||||
for _ in 0..4 {
|
|
||||||
self.bytes.push(x as u8);
|
|
||||||
x >>= 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn put8(&mut self, mut x: u64) {
|
|
||||||
for _ in 0..8 {
|
|
||||||
self.bytes.push(x as u8);
|
|
||||||
x >>= 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn reloc_external(
|
|
||||||
&mut self,
|
|
||||||
_srcloc: SourceLoc,
|
|
||||||
_rel: Reloc,
|
|
||||||
_name: &ExternalName,
|
|
||||||
_addend: Addend,
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
fn trap(&mut self, _code: TrapCode, _srcloc: SourceLoc) {}
|
|
||||||
|
|
||||||
fn end_codegen(&mut self) {}
|
|
||||||
|
|
||||||
fn add_call_site(&mut self, _opcode: Opcode, _srcloc: SourceLoc) {}
|
|
||||||
}
|
|
||||||
@@ -13,7 +13,6 @@
|
|||||||
//! -- isa::x64::inst::emit_tests::test_x64_emit
|
//! -- isa::x64::inst::emit_tests::test_x64_emit
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::isa::test_utils;
|
|
||||||
use crate::isa::x64;
|
use crate::isa::x64;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
|
|
||||||
@@ -4460,7 +4459,6 @@ fn test_x64_emit() {
|
|||||||
// Check the printed text is as expected.
|
// Check the printed text is as expected.
|
||||||
let actual_printing = insn.show_rru(Some(&rru));
|
let actual_printing = insn.show_rru(Some(&rru));
|
||||||
assert_eq!(expected_printing, actual_printing);
|
assert_eq!(expected_printing, actual_printing);
|
||||||
let mut sink = test_utils::TestCodeSink::new();
|
|
||||||
let mut buffer = MachBuffer::new();
|
let mut buffer = MachBuffer::new();
|
||||||
|
|
||||||
insn.emit(&mut buffer, &emit_info, &mut Default::default());
|
insn.emit(&mut buffer, &emit_info, &mut Default::default());
|
||||||
@@ -4470,8 +4468,7 @@ fn test_x64_emit() {
|
|||||||
buffer.bind_label(label);
|
buffer.bind_label(label);
|
||||||
|
|
||||||
let buffer = buffer.finish();
|
let buffer = buffer.finish();
|
||||||
buffer.emit(&mut sink);
|
let actual_encoding = &buffer.stringify_code_bytes();
|
||||||
let actual_encoding = &sink.stringify();
|
|
||||||
assert_eq!(expected_encoding, actual_encoding, "{}", expected_printing);
|
assert_eq!(expected_encoding, actual_encoding, "{}", expected_printing);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1420,6 +1420,17 @@ impl MachBufferFinalized {
|
|||||||
self.data.len() as CodeOffset
|
self.data.len() as CodeOffset
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return the code in this mach buffer as a hex string for testing purposes.
|
||||||
|
pub fn stringify_code_bytes(&self) -> String {
|
||||||
|
// This is pretty lame, but whatever ..
|
||||||
|
use std::fmt::Write;
|
||||||
|
let mut s = String::with_capacity(self.data.len() * 2);
|
||||||
|
for b in &self.data {
|
||||||
|
write!(&mut s, "{:02X}", b).unwrap();
|
||||||
|
}
|
||||||
|
s
|
||||||
|
}
|
||||||
|
|
||||||
/// Emit this buffer to the given CodeSink.
|
/// Emit this buffer to the given CodeSink.
|
||||||
pub fn emit<CS: CodeSink>(&self, sink: &mut CS) {
|
pub fn emit<CS: CodeSink>(&self, sink: &mut CS) {
|
||||||
// N.B.: we emit every section into the .text section as far as
|
// N.B.: we emit every section into the .text section as far as
|
||||||
|
|||||||
Reference in New Issue
Block a user