Make settings::Flags::new consume the Builder.

This makes it more clear what the relationship is between the Builder
and the resulting Flags.
This commit is contained in:
Dan Gohman
2018-04-27 21:01:35 -07:00
parent b7f38ac8bc
commit 94a883abae
21 changed files with 63 additions and 60 deletions

View File

@@ -61,9 +61,9 @@ pub fn parse_sets_and_isa(flag_set: &[String], flag_isa: &str) -> Result<OwnedFl
.map_err(|err| err.to_string())?; .map_err(|err| err.to_string())?;
Ok(OwnedFlagsOrIsa::Isa( Ok(OwnedFlagsOrIsa::Isa(
isa_builder.finish(settings::Flags::new(&flag_builder)), isa_builder.finish(settings::Flags::new(flag_builder)),
)) ))
} else { } else {
Ok(OwnedFlagsOrIsa::Flags(settings::Flags::new(&flag_builder))) Ok(OwnedFlagsOrIsa::Flags(settings::Flags::new(flag_builder)))
} }
} }

View File

@@ -262,7 +262,7 @@ def gen_constructor(sgrp, parent, fmt):
""" """
with fmt.indented('impl Flags {', '}'): with fmt.indented('impl Flags {', '}'):
args = 'builder: &Builder' args = 'builder: Builder'
if sgrp.parent: if sgrp.parent:
p = sgrp.parent p = sgrp.parent
args = '{}: &{}::Flags, {}'.format(p.name, p.qual_mod, args) args = '{}: &{}::Flags, {}'.format(p.name, p.qual_mod, args)

View File

@@ -929,7 +929,7 @@ mod test {
cfg.compute(cur.func); cfg.compute(cur.func);
let flags = settings::Flags::new(&settings::builder()); let flags = settings::Flags::new(settings::builder());
verify_context(cur.func, &cfg, &dt, &flags).unwrap(); verify_context(cur.func, &cfg, &dt, &flags).unwrap();
} }
} }

View File

@@ -33,7 +33,7 @@ pub fn isa_builder() -> IsaBuilder {
fn isa_constructor( fn isa_constructor(
shared_flags: shared_settings::Flags, shared_flags: shared_settings::Flags,
builder: &shared_settings::Builder, builder: shared_settings::Builder,
) -> Box<TargetIsa> { ) -> Box<TargetIsa> {
let level1 = if shared_flags.is_compressed() { let level1 = if shared_flags.is_compressed() {
&enc_tables::LEVEL1_T32[..] &enc_tables::LEVEL1_T32[..]

View File

@@ -32,7 +32,7 @@ pub fn isa_builder() -> IsaBuilder {
fn isa_constructor( fn isa_constructor(
shared_flags: shared_settings::Flags, shared_flags: shared_settings::Flags,
builder: &shared_settings::Builder, builder: shared_settings::Builder,
) -> Box<TargetIsa> { ) -> Box<TargetIsa> {
Box::new(Isa { Box::new(Isa {
isa_flags: settings::Flags::new(&shared_flags, builder), isa_flags: settings::Flags::new(&shared_flags, builder),

View File

@@ -24,7 +24,7 @@
//! use cretonne_codegen::isa; //! use cretonne_codegen::isa;
//! //!
//! let shared_builder = settings::builder(); //! 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") { //! match isa::lookup("riscv") {
//! Err(_) => { //! Err(_) => {
@@ -117,14 +117,14 @@ pub enum LookupError {
/// Modify the ISA-specific settings before creating the `TargetIsa` trait object with `finish`. /// Modify the ISA-specific settings before creating the `TargetIsa` trait object with `finish`.
pub struct Builder { pub struct Builder {
setup: settings::Builder, setup: settings::Builder,
constructor: fn(settings::Flags, &settings::Builder) -> Box<TargetIsa>, constructor: fn(settings::Flags, settings::Builder) -> Box<TargetIsa>,
} }
impl Builder { impl Builder {
/// Combine the ISA-specific settings with the provided ISA-independent settings and allocate a /// Combine the ISA-specific settings with the provided ISA-independent settings and allocate a
/// fully configured `TargetIsa` trait object. /// fully configured `TargetIsa` trait object.
pub fn finish(self, shared_flags: settings::Flags) -> Box<TargetIsa> { pub fn finish(self, shared_flags: settings::Flags) -> Box<TargetIsa> {
(self.constructor)(shared_flags, &self.setup) (self.constructor)(shared_flags, self.setup)
} }
} }

View File

@@ -33,7 +33,7 @@ pub fn isa_builder() -> IsaBuilder {
fn isa_constructor( fn isa_constructor(
shared_flags: shared_settings::Flags, shared_flags: shared_settings::Flags,
builder: &shared_settings::Builder, builder: shared_settings::Builder,
) -> Box<TargetIsa> { ) -> Box<TargetIsa> {
let level1 = if shared_flags.is_64bit() { let level1 = if shared_flags.is_64bit() {
&enc_tables::LEVEL1_RV64[..] &enc_tables::LEVEL1_RV64[..]
@@ -130,7 +130,7 @@ mod tests {
fn test_64bitenc() { fn test_64bitenc() {
let mut shared_builder = settings::builder(); let mut shared_builder = settings::builder();
shared_builder.enable("is_64bit").unwrap(); shared_builder.enable("is_64bit").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 isa = isa::lookup("riscv").unwrap().finish(shared_flags);
let mut func = Function::new(); let mut func = Function::new();
@@ -180,7 +180,7 @@ mod tests {
fn test_32bitenc() { fn test_32bitenc() {
let mut shared_builder = settings::builder(); let mut shared_builder = settings::builder();
shared_builder.set("is_64bit", "false").unwrap(); shared_builder.set("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 isa = isa::lookup("riscv").unwrap().finish(shared_flags);
let mut func = Function::new(); let mut func = Function::new();
@@ -234,7 +234,7 @@ mod tests {
fn test_rv32m() { fn test_rv32m() {
let mut shared_builder = settings::builder(); let mut shared_builder = settings::builder();
shared_builder.set("is_64bit", "false").unwrap(); shared_builder.set("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 // Set the supports_m stting which in turn enables the use_m predicate that unlocks
// encodings for imul. // encodings for imul.

View File

@@ -16,9 +16,9 @@ mod tests {
#[test] #[test]
fn display_default() { fn display_default() {
let shared = settings::Flags::new(&settings::builder()); let shared = settings::Flags::new(settings::builder());
let b = builder(); let b = builder();
let f = Flags::new(&shared, &b); let f = Flags::new(&shared, b);
assert_eq!( assert_eq!(
f.to_string(), f.to_string(),
"[riscv]\n\ "[riscv]\n\
@@ -35,20 +35,20 @@ mod tests {
#[test] #[test]
fn predicates() { fn predicates() {
let shared = settings::Flags::new(&settings::builder()); let shared = settings::Flags::new(settings::builder());
let mut b = builder(); let mut b = builder();
b.enable("supports_f").unwrap(); b.enable("supports_f").unwrap();
b.enable("supports_d").unwrap(); b.enable("supports_d").unwrap();
let f = Flags::new(&shared, &b); let f = Flags::new(&shared, b);
assert_eq!(f.full_float(), true); assert_eq!(f.full_float(), true);
let mut sb = settings::builder(); let mut sb = settings::builder();
sb.set("enable_simd", "false").unwrap(); sb.set("enable_simd", "false").unwrap();
let shared = settings::Flags::new(&sb); let shared = settings::Flags::new(sb);
let mut b = builder(); let mut b = builder();
b.enable("supports_f").unwrap(); b.enable("supports_f").unwrap();
b.enable("supports_d").unwrap(); b.enable("supports_d").unwrap();
let f = Flags::new(&shared, &b); let f = Flags::new(&shared, b);
assert_eq!(f.full_float(), false); assert_eq!(f.full_float(), false);
} }
} }

View File

@@ -35,7 +35,7 @@ pub fn isa_builder() -> IsaBuilder {
fn isa_constructor( fn isa_constructor(
shared_flags: shared_settings::Flags, shared_flags: shared_settings::Flags,
builder: &shared_settings::Builder, builder: shared_settings::Builder,
) -> Box<TargetIsa> { ) -> Box<TargetIsa> {
let level1 = if shared_flags.is_64bit() { let level1 = if shared_flags.is_64bit() {
&enc_tables::LEVEL1_I64[..] &enc_tables::LEVEL1_I64[..]

View File

@@ -15,38 +15,38 @@ mod tests {
#[test] #[test]
fn presets() { fn presets() {
let shared = settings::Flags::new(&settings::builder()); let shared = settings::Flags::new(settings::builder());
// Nehalem has SSE4.1 but not BMI1. // Nehalem has SSE4.1 but not BMI1.
let mut b1 = builder(); let mut b0 = builder();
b1.enable("nehalem").unwrap(); b0.enable("nehalem").unwrap();
let f1 = Flags::new(&shared, &b1); let f0 = Flags::new(&shared, b0);
assert_eq!(f1.has_sse41(), true); assert_eq!(f0.has_sse41(), true);
assert_eq!(f1.has_bmi1(), false); assert_eq!(f0.has_bmi1(), false);
let mut b2 = builder(); let mut b1 = builder();
b2.enable("haswell").unwrap(); b1.enable("haswell").unwrap();
let f2 = Flags::new(&shared, &b2); let f1 = Flags::new(&shared, b1);
assert_eq!(f2.has_sse41(), true); assert_eq!(f1.has_sse41(), true);
assert_eq!(f2.has_bmi1(), true); assert_eq!(f1.has_bmi1(), true);
} }
#[test] #[test]
fn display_presets() { fn display_presets() {
// Spot check that the flags Display impl does not cause a panic // Spot check that the flags Display impl does not cause a panic
let shared = settings::Flags::new(&settings::builder()); let shared = settings::Flags::new(settings::builder());
let b1 = builder(); let b0 = builder();
let f1 = Flags::new(&shared, &b1); let f0 = Flags::new(&shared, b0);
let _ = format!("{}", f0);
let mut b1 = builder();
b1.enable("nehalem").unwrap();
let f1 = Flags::new(&shared, b1);
let _ = format!("{}", f1); let _ = format!("{}", f1);
let mut b2 = builder(); let mut b2 = builder();
b2.enable("nehalem").unwrap(); b2.enable("haswell").unwrap();
let f2 = Flags::new(&shared, &b1); let f2 = Flags::new(&shared, b2);
let _ = format!("{}", f2); let _ = format!("{}", f2);
let mut b3 = builder();
b3.enable("haswell").unwrap();
let f3 = Flags::new(&shared, &b1);
let _ = format!("{}", f3);
} }
} }

View File

@@ -281,7 +281,7 @@ mod tests {
use settings; use settings;
let shared_builder = settings::builder(); let shared_builder = settings::builder();
let shared_flags = settings::Flags::new(&shared_builder); let shared_flags = settings::Flags::new(shared_builder);
isa::lookup("arm32").ok().map(|b| b.finish(shared_flags)) isa::lookup("arm32").ok().map(|b| b.finish(shared_flags))
} }

View File

@@ -1157,7 +1157,7 @@ mod tests {
use settings; use settings;
let shared_builder = settings::builder(); let shared_builder = settings::builder();
let shared_flags = settings::Flags::new(&shared_builder); let shared_flags = settings::Flags::new(shared_builder);
isa::lookup("arm32").ok().map(|b| b.finish(shared_flags)) isa::lookup("arm32").ok().map(|b| b.finish(shared_flags))
} }

View File

@@ -16,7 +16,7 @@
//! let mut b = settings::builder(); //! let mut b = settings::builder();
//! b.set("opt_level", "fastest"); //! 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); //! assert_eq!(f.opt_level(), settings::OptLevel::Fastest);
//! ``` //! ```
@@ -44,6 +44,7 @@ pub trait Configurable {
} }
/// Collect settings values based on a template. /// Collect settings values based on a template.
#[derive(Clone)]
pub struct Builder { pub struct Builder {
template: &'static detail::Template, template: &'static detail::Template,
bytes: Box<[u8]>, bytes: Box<[u8]>,
@@ -354,7 +355,7 @@ mod tests {
#[test] #[test]
fn display_default() { fn display_default() {
let b = builder(); let b = builder();
let f = Flags::new(&b); let f = Flags::new(b);
assert_eq!( assert_eq!(
f.to_string(), f.to_string(),
"[shared]\n\ "[shared]\n\
@@ -388,7 +389,7 @@ mod tests {
assert_eq!(b.enable("enable_simd"), Ok(())); assert_eq!(b.enable("enable_simd"), Ok(()));
assert_eq!(b.set("enable_simd", "false"), Ok(())); assert_eq!(b.set("enable_simd", "false"), Ok(()));
let f = Flags::new(&b); let f = Flags::new(b);
assert_eq!(f.enable_simd(), false); assert_eq!(f.enable_simd(), false);
} }
@@ -402,7 +403,7 @@ mod tests {
assert_eq!(b.set("opt_level", "best"), Ok(())); assert_eq!(b.set("opt_level", "best"), Ok(()));
assert_eq!(b.set("enable_simd", "0"), 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.enable_simd(), false);
assert_eq!(f.opt_level(), super::OptLevel::Best); assert_eq!(f.opt_level(), super::OptLevel::Best);
} }

View File

@@ -1175,7 +1175,7 @@ mod tests {
#[test] #[test]
fn empty() { fn empty() {
let func = Function::new(); let func = Function::new();
let flags = &settings::Flags::new(&settings::builder()); let flags = &settings::Flags::new(settings::builder());
let verifier = Verifier::new(&func, flags.into()); let verifier = Verifier::new(&func, flags.into());
assert_eq!(verifier.run(), Ok(())); assert_eq!(verifier.run(), Ok(()));
} }
@@ -1198,7 +1198,7 @@ mod tests {
}), }),
ebb0, ebb0,
); );
let flags = &settings::Flags::new(&settings::builder()); let flags = &settings::Flags::new(settings::builder());
let verifier = Verifier::new(&func, flags.into()); let verifier = Verifier::new(&func, flags.into());
assert_err_with_msg!(verifier.run(), "instruction format"); assert_err_with_msg!(verifier.run(), "instruction format");
} }

View File

@@ -688,7 +688,7 @@ mod tests {
builder.finalize(); builder.finalize();
} }
let flags = settings::Flags::new(&settings::builder()); let flags = settings::Flags::new(settings::builder());
let res = verify_function(&func, &flags); let res = verify_function(&func, &flags);
// println!("{}", func.display(None)); // println!("{}", func.display(None));
match res { match res {

View File

@@ -117,7 +117,7 @@
//! builder.finalize(); //! builder.finalize();
//! } //! }
//! //!
//! let flags = settings::Flags::new(&settings::builder()); //! let flags = settings::Flags::new(settings::builder());
//! let res = verify_function(&func, &flags); //! let res = verify_function(&func, &flags);
//! println!("{}", func.display(None)); //! println!("{}", func.display(None));
//! match res { //! match res {

View File

@@ -1021,7 +1021,7 @@ mod tests {
let mut cur = FuncCursor::new(&mut func).at_bottom(ebb1); let mut cur = FuncCursor::new(&mut func).at_bottom(ebb1);
cur.ins().return_(&[]) cur.ins().return_(&[])
}; };
let flags = settings::Flags::new(&settings::builder()); let flags = settings::Flags::new(settings::builder());
match verify_function(&func, &flags) { match verify_function(&func, &flags) {
Ok(()) => {} Ok(()) => {}
Err(err) => { Err(err) => {
@@ -1200,7 +1200,7 @@ mod tests {
ssa.declare_ebb_predecessor(ebb1, block2, j); ssa.declare_ebb_predecessor(ebb1, block2, j);
} }
ssa.seal_ebb_header_block(ebb1, &mut func); ssa.seal_ebb_header_block(ebb1, &mut func);
let flags = settings::Flags::new(&settings::builder()); let flags = settings::Flags::new(settings::builder());
match verify_function(&func, &flags) { match verify_function(&func, &flags) {
Ok(()) => {} Ok(()) => {}
Err(err) => { Err(err) => {
@@ -1251,7 +1251,7 @@ mod tests {
} }
ssa.seal_ebb_header_block(ebb1, &mut func); ssa.seal_ebb_header_block(ebb1, &mut func);
ssa.seal_ebb_header_block(ebb2, &mut func); ssa.seal_ebb_header_block(ebb2, &mut func);
let flags = settings::Flags::new(&settings::builder()); let flags = settings::Flags::new(settings::builder());
match verify_function(&func, &flags) { match verify_function(&func, &flags) {
Ok(()) => {} Ok(()) => {}
Err(err) => { Err(err) => {

View File

@@ -725,14 +725,16 @@ impl<'a> Parser<'a> {
isaspec::parse_options(words, &mut isa_builder, &self.loc)?; isaspec::parse_options(words, &mut isa_builder, &self.loc)?;
// Construct a trait object with the aggregate settings. // Construct a trait object with the aggregate settings.
isas.push(isa_builder.finish(settings::Flags::new(&flag_builder))); isas.push(isa_builder.finish(
settings::Flags::new(flag_builder.clone()),
));
} }
_ => break, _ => break,
} }
} }
if !seen_isa { if !seen_isa {
// No `isa` commands, but we allow for `set` commands. // No `isa` commands, but we allow for `set` commands.
Ok(isaspec::IsaSpec::None(settings::Flags::new(&flag_builder))) Ok(isaspec::IsaSpec::None(settings::Flags::new(flag_builder)))
} else if let Some(loc) = last_set_loc { } else if let Some(loc) = last_set_loc {
err!( err!(
loc, loc,

View File

@@ -22,7 +22,7 @@ impl SimpleJITBuilder {
let (flag_builder, isa_builder) = cretonne_native::builders().unwrap_or_else(|_| { let (flag_builder, isa_builder) = cretonne_native::builders().unwrap_or_else(|_| {
panic!("host machine is not a supported target"); panic!("host machine is not a supported target");
}); });
let isa = isa_builder.finish(settings::Flags::new(&flag_builder)); let isa = isa_builder.finish(settings::Flags::new(flag_builder));
Self::with_isa(isa) Self::with_isa(isa)
} }

View File

@@ -101,7 +101,7 @@ pub struct DummyEnvironment {
impl DummyEnvironment { impl DummyEnvironment {
/// Allocates the data structures with default flags. /// Allocates the data structures with default flags.
pub fn default() -> Self { pub fn default() -> Self {
Self::with_flags(settings::Flags::new(&settings::builder())) Self::with_flags(settings::Flags::new(settings::builder()))
} }
/// Allocates the data structures with the given flags. /// Allocates the data structures with the given flags.

View File

@@ -32,7 +32,7 @@ fn testsuite() {
}) })
.collect(); .collect();
paths.sort_by_key(|dir| dir.path()); paths.sort_by_key(|dir| dir.path());
let flags = Flags::new(&settings::builder()); let flags = Flags::new(settings::builder());
for path in paths { for path in paths {
let path = path.path(); let path = path.path();
handle_module(&path, &flags); handle_module(&path, &flags);
@@ -43,7 +43,7 @@ fn testsuite() {
fn return_at_end() { fn return_at_end() {
let mut flag_builder = settings::builder(); let mut flag_builder = settings::builder();
flag_builder.enable("return_at_end").unwrap(); flag_builder.enable("return_at_end").unwrap();
let flags = Flags::new(&flag_builder); let flags = Flags::new(flag_builder);
handle_module(&PathBuf::from("../../wasmtests/return_at_end.wat"), &flags); handle_module(&PathBuf::from("../../wasmtests/return_at_end.wat"), &flags);
} }