diff --git a/lib/cretonne/meta/gen_settings.py b/lib/cretonne/meta/gen_settings.py index 9f80a391ff..693b7baa76 100644 --- a/lib/cretonne/meta/gen_settings.py +++ b/lib/cretonne/meta/gen_settings.py @@ -218,11 +218,12 @@ def gen_display(sgrp, fmt): '}'): fmt.line('writeln!(f, "[{}]")?;'.format(sgrp.name)) with fmt.indented('for d in &DESCRIPTORS {', '}'): - fmt.line('write!(f, "{} = ", d.name)?;') - fmt.line( - 'TEMPLATE.format_toml_value(d.detail,' + - 'self.bytes[d.offset as usize], f)?;') - fmt.line('writeln!(f, "")?;') + with fmt.indented('if !d.detail.is_preset() {', '}'): + fmt.line('write!(f, "{} = ", d.name)?;') + fmt.line( + 'TEMPLATE.format_toml_value(d.detail,' + + 'self.bytes[d.offset as usize], f)?;') + fmt.line('writeln!(f, "")?;') fmt.line('Ok(())') diff --git a/lib/cretonne/src/isa/intel/settings.rs b/lib/cretonne/src/isa/intel/settings.rs index 7ca4886588..f933e91b87 100644 --- a/lib/cretonne/src/isa/intel/settings.rs +++ b/lib/cretonne/src/isa/intel/settings.rs @@ -30,4 +30,23 @@ mod tests { assert_eq!(f2.has_sse41(), true); assert_eq!(f2.has_bmi1(), true); } + #[test] + fn display_presets() { + // Spot check that the flags Display impl does not cause a panic + let shared = settings::Flags::new(&settings::builder()); + + let b1 = builder(); + let f1 = Flags::new(&shared, &b1); + let _ = format!("{}", f1); + + let mut b2 = builder(); + b2.enable("nehalem").unwrap(); + let f2 = Flags::new(&shared, &b1); + let _ = format!("{}", f2); + + let mut b3 = builder(); + b3.enable("haswell").unwrap(); + let f3 = Flags::new(&shared, &b1); + let _ = format!("{}", f3); + } } diff --git a/lib/cretonne/src/settings.rs b/lib/cretonne/src/settings.rs index f08bea95c2..cc9f91f452 100644 --- a/lib/cretonne/src/settings.rs +++ b/lib/cretonne/src/settings.rs @@ -297,6 +297,17 @@ pub mod detail { /// The `Descriptor::offset` field refers to the `PRESETS` table. Preset, } + + impl Detail { + /// Check if a detail is a Detail::Preset. Useful because the Descriptor + /// offset field has a different meaning when the detail is a preset. + pub fn is_preset(&self) -> bool { + match self { + &Detail::Preset => true, + _ => false, + } + } + } } // Include code generated by `meta/gen_settings.py`. This file contains a public `Flags` struct