diff --git a/meta/gen_settings.py b/meta/gen_settings.py index 588c2cf798..c3c4710ea3 100644 --- a/meta/gen_settings.py +++ b/meta/gen_settings.py @@ -183,18 +183,18 @@ def gen_constructor(sgrp, parent, fmt): """ with fmt.indented('impl Flags {', '}'): - args = 'builder: Builder' + args = 'builder: &Builder' if sgrp.parent: p = sgrp.parent args = '{}: &{}::Flags, {}'.format(p.name, p.qual_mod, args) with fmt.indented( 'pub fn new({}) -> Flags {{'.format(args), '}'): - fmt.line('let bvec = builder.finish("{}");'.format(sgrp.name)) + fmt.line('let bvec = builder.state_for("{}");'.format(sgrp.name)) fmt.line('let mut bytes = [0; {}];'.format(sgrp.byte_size())) fmt.line('assert_eq!(bvec.len(), {});'.format(sgrp.settings_size)) with fmt.indented( - 'for (i, b) in bvec.into_iter().enumerate() {', '}'): - fmt.line('bytes[i] = b;') + 'for (i, b) in bvec.iter().enumerate() {', '}'): + fmt.line('bytes[i] = *b;') # Stop here without predicates. if len(sgrp.predicate_number) == sgrp.boolean_settings: diff --git a/src/libcretonne/isa/mod.rs b/src/libcretonne/isa/mod.rs index 1d788ffff1..a43b1a5cb4 100644 --- a/src/libcretonne/isa/mod.rs +++ b/src/libcretonne/isa/mod.rs @@ -24,7 +24,7 @@ //! use cretonne::isa; //! //! let shared_builder = settings::builder(); -//! let shared_flags = settings::Flags::new(shared_builder); +//! let shared_flags = settings::Flags::new(&shared_builder); //! //! match isa::lookup("riscv") { //! None => { @@ -66,14 +66,14 @@ fn riscv_builder() -> Option { /// Modify the ISA-specific settings before creating the `TargetIsa` trait object with `finish`. pub struct Builder { setup: settings::Builder, - constructor: fn(settings::Flags, settings::Builder) -> Box, + constructor: fn(settings::Flags, &settings::Builder) -> Box, } impl Builder { /// Combine the ISA-specific settings with the provided ISA-independent settings and allocate a /// fully configured `TargetIsa` trait object. pub fn finish(self, shared_flags: settings::Flags) -> Box { - (self.constructor)(shared_flags, self.setup) + (self.constructor)(shared_flags, &self.setup) } } diff --git a/src/libcretonne/isa/riscv/mod.rs b/src/libcretonne/isa/riscv/mod.rs index b1ee92a4a9..ea49358aa6 100644 --- a/src/libcretonne/isa/riscv/mod.rs +++ b/src/libcretonne/isa/riscv/mod.rs @@ -24,7 +24,7 @@ pub fn isa_builder() -> IsaBuilder { } fn isa_constructor(shared_flags: shared_settings::Flags, - builder: shared_settings::Builder) + builder: &shared_settings::Builder) -> Box { let level1 = if shared_flags.is_64bit() { &enc_tables::LEVEL1_RV64[..] @@ -72,7 +72,7 @@ mod tests { fn test_64bitenc() { let mut shared_builder = settings::builder(); shared_builder.set_bool("is_64bit", true).unwrap(); - let shared_flags = settings::Flags::new(shared_builder); + let shared_flags = settings::Flags::new(&shared_builder); let isa = isa::lookup("riscv").unwrap().finish(shared_flags); let mut dfg = DataFlowGraph::new(); @@ -119,7 +119,7 @@ mod tests { fn test_32bitenc() { let mut shared_builder = settings::builder(); shared_builder.set_bool("is_64bit", false).unwrap(); - let shared_flags = settings::Flags::new(shared_builder); + let shared_flags = settings::Flags::new(&shared_builder); let isa = isa::lookup("riscv").unwrap().finish(shared_flags); let mut dfg = DataFlowGraph::new(); @@ -174,7 +174,7 @@ mod tests { fn test_rv32m() { let mut shared_builder = settings::builder(); shared_builder.set_bool("is_64bit", false).unwrap(); - let shared_flags = settings::Flags::new(shared_builder); + let shared_flags = settings::Flags::new(&shared_builder); // Set the supports_m stting which in turn enables the use_m predicate that unlocks // encodings for imul. diff --git a/src/libcretonne/isa/riscv/settings.rs b/src/libcretonne/isa/riscv/settings.rs index ae765d9c15..57d8689ed1 100644 --- a/src/libcretonne/isa/riscv/settings.rs +++ b/src/libcretonne/isa/riscv/settings.rs @@ -14,9 +14,9 @@ mod tests { #[test] fn display_default() { - let shared = settings::Flags::new(settings::builder()); + let shared = settings::Flags::new(&settings::builder()); let b = builder(); - let f = Flags::new(&shared, b); + let f = Flags::new(&shared, &b); assert_eq!(f.to_string(), "[riscv]\n\ supports_m = false\n\ @@ -30,20 +30,20 @@ mod tests { #[test] fn predicates() { - let shared = settings::Flags::new(settings::builder()); + let shared = settings::Flags::new(&settings::builder()); let mut b = builder(); b.set_bool("supports_f", true).unwrap(); b.set_bool("supports_d", true).unwrap(); - let f = Flags::new(&shared, b); + let f = Flags::new(&shared, &b); assert_eq!(f.full_float(), true); let mut sb = settings::builder(); sb.set_bool("enable_simd", false).unwrap(); - let shared = settings::Flags::new(sb); + let shared = settings::Flags::new(&sb); let mut b = builder(); b.set_bool("supports_f", true).unwrap(); b.set_bool("supports_d", true).unwrap(); - let f = Flags::new(&shared, b); + let f = Flags::new(&shared, &b); assert_eq!(f.full_float(), false); } } diff --git a/src/libcretonne/settings.rs b/src/libcretonne/settings.rs index c7c0d1eb30..37d09d2ba8 100644 --- a/src/libcretonne/settings.rs +++ b/src/libcretonne/settings.rs @@ -16,7 +16,7 @@ //! let mut b = settings::builder(); //! b.set("opt_level", "fastest"); //! -//! let f = settings::Flags::new(b); +//! let f = settings::Flags::new(&b); //! assert_eq!(f.opt_level(), settings::OptLevel::Fastest); //! ``` @@ -57,9 +57,9 @@ impl Builder { } /// Extract contents of builder once everything is configured. - pub fn finish(self, name: &str) -> Vec { + pub fn state_for(&self, name: &str) -> &[u8] { assert_eq!(name, self.template.name); - self.bytes + &self.bytes[..] } /// Set the value of a single bit. @@ -256,7 +256,7 @@ mod tests { #[test] fn display_default() { let b = builder(); - let f = Flags::new(b); + let f = Flags::new(&b); assert_eq!(f.to_string(), "[shared]\n\ opt_level = \"default\"\n\ @@ -275,7 +275,7 @@ mod tests { assert_eq!(b.set_bool("enable_simd", true), Ok(())); assert_eq!(b.set_bool("enable_simd", false), Ok(())); - let f = Flags::new(b); + let f = Flags::new(&b); assert_eq!(f.enable_simd(), false); } @@ -289,7 +289,7 @@ mod tests { assert_eq!(b.set("opt_level", "best"), Ok(())); assert_eq!(b.set("enable_simd", "0"), Ok(())); - let f = Flags::new(b); + let f = Flags::new(&b); assert_eq!(f.enable_simd(), false); assert_eq!(f.opt_level(), super::OptLevel::Best); }