#[derive(Clone)]
pub struct Flags {
bytes: [u8; 5],
}
impl Flags {
#[allow(unused_variables)]
pub fn new(builder: Builder) -> Self {
let bvec = builder.state_for("shared");
let mut shared = Self { bytes: [0; 5] };
debug_assert_eq!(bvec.len(), 5);
shared.bytes[0..5].copy_from_slice(&bvec);
shared
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum OptLevel {
Default,
Best,
Fastest,
}
impl fmt::Display for OptLevel {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(match *self {
OptLevel::Default => "default",
OptLevel::Best => "best",
OptLevel::Fastest => "fastest",
})
}
}
impl str::FromStr for OptLevel {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"default" => Ok(OptLevel::Default),
"best" => Ok(OptLevel::Best),
"fastest" => Ok(OptLevel::Fastest),
_ => Err(()),
}
}
}
#[allow(dead_code)]
impl Flags {
pub fn predicate_view(&self) -> crate::settings::PredicateView {
crate::settings::PredicateView::new(&self.bytes[3..])
}
fn numbered_predicate(&self, p: usize) -> bool {
self.bytes[3 + p / 8] & (1 << (p % 8)) != 0
}
pub fn opt_level(&self) -> OptLevel {
match self.bytes[0] {
0 => {
OptLevel::Default
}
1 => {
OptLevel::Best
}
2 => {
OptLevel::Fastest
}
_ => {
panic!("Invalid enum value")
}
}
}
pub fn enable_verifier(&self) -> bool {
self.numbered_predicate(0)
}
pub fn is_pic(&self) -> bool {
self.numbered_predicate(1)
}
pub fn colocated_libcalls(&self) -> bool {
self.numbered_predicate(2)
}
pub fn avoid_div_traps(&self) -> bool {
self.numbered_predicate(3)
}
pub fn enable_float(&self) -> bool {
self.numbered_predicate(4)
}
pub fn enable_nan_canonicalization(&self) -> bool {
self.numbered_predicate(5)
}
pub fn enable_simd(&self) -> bool {
self.numbered_predicate(6)
}
pub fn enable_atomics(&self) -> bool {
self.numbered_predicate(7)
}
pub fn baldrdash_prologue_words(&self) -> u8 {
self.bytes[1]
}
pub fn allones_funcaddrs(&self) -> bool {
self.numbered_predicate(8)
}
pub fn probestack_enabled(&self) -> bool {
self.numbered_predicate(9)
}
pub fn probestack_func_adjusts_sp(&self) -> bool {
self.numbered_predicate(10)
}
pub fn probestack_size_log2(&self) -> u8 {
self.bytes[2]
}
pub fn jump_tables_enabled(&self) -> bool {
self.numbered_predicate(11)
}
}
static DESCRIPTORS: [detail::Descriptor; 15] = [
detail::Descriptor {
name: "opt_level",
offset: 0,
detail: detail::Detail::Enum { last: 2, enumerators: 0 },
},
detail::Descriptor {
name: "enable_verifier",
offset: 3,
detail: detail::Detail::Bool { bit: 0 },
},
detail::Descriptor {
name: "is_pic",
offset: 3,
detail: detail::Detail::Bool { bit: 1 },
},
detail::Descriptor {
name: "colocated_libcalls",
offset: 3,
detail: detail::Detail::Bool { bit: 2 },
},
detail::Descriptor {
name: "avoid_div_traps",
offset: 3,
detail: detail::Detail::Bool { bit: 3 },
},
detail::Descriptor {
name: "enable_float",
offset: 3,
detail: detail::Detail::Bool { bit: 4 },
},
detail::Descriptor {
name: "enable_nan_canonicalization",
offset: 3,
detail: detail::Detail::Bool { bit: 5 },
},
detail::Descriptor {
name: "enable_simd",
offset: 3,
detail: detail::Detail::Bool { bit: 6 },
},
detail::Descriptor {
name: "enable_atomics",
offset: 3,
detail: detail::Detail::Bool { bit: 7 },
},
detail::Descriptor {
name: "baldrdash_prologue_words",
offset: 1,
detail: detail::Detail::Num,
},
detail::Descriptor {
name: "allones_funcaddrs",
offset: 4,
detail: detail::Detail::Bool { bit: 0 },
},
detail::Descriptor {
name: "probestack_enabled",
offset: 4,
detail: detail::Detail::Bool { bit: 1 },
},
detail::Descriptor {
name: "probestack_func_adjusts_sp",
offset: 4,
detail: detail::Detail::Bool { bit: 2 },
},
detail::Descriptor {
name: "probestack_size_log2",
offset: 2,
detail: detail::Detail::Num,
},
detail::Descriptor {
name: "jump_tables_enabled",
offset: 4,
detail: detail::Detail::Bool { bit: 3 },
},
];
static ENUMERATORS: [&str; 3] = [
"default",
"best",
"fastest",
];
static HASH_TABLE: [u16; 32] = [
0xffff,
10,
0xffff,
6,
0xffff,
1,
8,
7,
0xffff,
12,
0xffff,
14,
13,
0xffff,
0xffff,
0xffff,
0xffff,
0xffff,
0xffff,
3,
4,
11,
0xffff,
0xffff,
0xffff,
0xffff,
0xffff,
0xffff,
0,
2,
5,
9,
];
static PRESETS: [(u8, u8); 0] = [
];
static TEMPLATE: detail::Template = detail::Template {
name: "shared",
descriptors: &DESCRIPTORS,
enumerators: &ENUMERATORS,
hash_table: &HASH_TABLE,
defaults: &[0x00, 0x00, 0x0c, 0xd1, 0x0a],
presets: &PRESETS,
};
pub fn builder() -> Builder {
Builder::new(&TEMPLATE)
}
impl fmt::Display for Flags {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
writeln!(f, "[shared]")?;
for d in &DESCRIPTORS {
if !d.detail.is_preset() {
write!(f, "{} = ", d.name)?;
TEMPLATE.format_toml_value(d.detail, self.bytes[d.offset as usize], f)?;
writeln!(f)?;
}
}
Ok(())
}
}