From 2097524c851b15e89091fd3775817a06f0eeae4f Mon Sep 17 00:00:00 2001 From: iximeow Date: Sun, 24 Apr 2022 17:39:21 -0700 Subject: fix a few issues preventing no-std builds from ... building this includes a `Makefile` that exercises the various crate configs. most annoyingly, several doc comments needed to grow `#[cfg(feature="fmt")]` blocks so docs continue to build with that feature enabled or disabled. carved out a way to run exhaustive tests; they should be written as `#[ignore]`, and then the makefile will run even ignored tests on the expectation that this will run the exhaustive (but slower) suite. exhaustive tests are not yet written. they'll probably involve spanning 4 byte sequences from 0 to 2^32-1. --- src/real_mode/mod.rs | 74 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 31 deletions(-) (limited to 'src/real_mode') diff --git a/src/real_mode/mod.rs b/src/real_mode/mod.rs index 4b8ad6d..d7fda17 100644 --- a/src/real_mode/mod.rs +++ b/src/real_mode/mod.rs @@ -833,11 +833,13 @@ const REGISTER_CLASS_NAMES: &[&'static str] = &[ /// } /// /// if let Operand::Register(regspec) = instruction.operand(0) { +/// #[cfg(feature="fmt")] /// println!("first operand is {}", regspec); /// show_register_class_info(regspec.class()); /// } /// /// if let Operand::Register(regspec) = instruction.operand(1) { +/// #[cfg(feature="fmt")] /// println!("first operand is {}", regspec); /// show_register_class_info(regspec.class()); /// } @@ -7388,7 +7390,7 @@ fn read_0f3a_opcode(opcode: u8, prefixes: &mut Prefixes) -> OpcodeRecord { }; } -/// the actual description for a selection of bits involved in decoding an [`long_mode::Instruction`]. +/// the actual description for a selection of bits involved in decoding a [`real_mode::Instruction`]. /// /// some prefixes are only identified as an `InnerDescription::Misc` string, while some are full /// `InnerDescription::SegmentPrefix(Segment)`. generally, strings should be considered unstable @@ -7441,37 +7443,47 @@ impl InnerDescription { } } -impl fmt::Display for InnerDescription { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - InnerDescription::RexPrefix(bits) => { - write!(f, "rex prefix: {}{}{}{}", - if bits & 0x8 != 0 { "w" } else { "-" }, - if bits & 0x4 != 0 { "r" } else { "-" }, - if bits & 0x2 != 0 { "x" } else { "-" }, - if bits & 0x1 != 0 { "b" } else { "-" }, - ) - } - InnerDescription::SegmentPrefix(segment) => { - write!(f, "segment override: {}", segment) - } - InnerDescription::Misc(text) => { - f.write_str(text) - } - InnerDescription::Number(text, num) => { - write!(f, "{}: {:#x}", text, num) - } - InnerDescription::Opcode(opc) => { - write!(f, "opcode `{}`", opc) - } - InnerDescription::OperandCode(OperandCodeWrapper { code }) => { - write!(f, "operand code `{:?}`", code) - } - InnerDescription::RegisterNumber(name, num, reg) => { - write!(f, "`{}` (`{}` selects register number {})", reg, name, num) +cfg_if::cfg_if! { + if #[cfg(feature = "fmt")] { + impl fmt::Display for InnerDescription { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + InnerDescription::RexPrefix(bits) => { + write!(f, "rex prefix: {}{}{}{}", + if bits & 0x8 != 0 { "w" } else { "-" }, + if bits & 0x4 != 0 { "r" } else { "-" }, + if bits & 0x2 != 0 { "x" } else { "-" }, + if bits & 0x1 != 0 { "b" } else { "-" }, + ) + } + InnerDescription::SegmentPrefix(segment) => { + write!(f, "segment override: {}", segment) + } + InnerDescription::Misc(text) => { + f.write_str(text) + } + InnerDescription::Number(text, num) => { + write!(f, "{}: {:#x}", text, num) + } + InnerDescription::Opcode(opc) => { + write!(f, "opcode `{}`", opc) + } + InnerDescription::OperandCode(OperandCodeWrapper { code }) => { + write!(f, "operand code `{:?}`", code) + } + InnerDescription::RegisterNumber(name, num, reg) => { + write!(f, "`{}` (`{}` selects register number {})", reg, name, num) + } + InnerDescription::Boundary(desc) => { + write!(f, "{}", desc) + } + } } - InnerDescription::Boundary(desc) => { - write!(f, "{}", desc) + } + } else { + impl fmt::Display for InnerDescription { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.write_str("non-fmt build") } } } -- cgit v1.1