#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum CraneliftOptLevel {
None,
#[default]
Speed,
SpeedAndSize,
}
impl CraneliftOptLevel {
pub fn as_cranelift_str(self) -> &'static str {
match self {
CraneliftOptLevel::None => "none",
CraneliftOptLevel::Speed => "speed",
CraneliftOptLevel::SpeedAndSize => "speed_and_size",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum RegallocAlgorithm {
#[default]
Backtracking,
SinglePass,
}
impl RegallocAlgorithm {
pub fn as_cranelift_str(self) -> &'static str {
match self {
RegallocAlgorithm::Backtracking => "backtracking",
RegallocAlgorithm::SinglePass => "single_pass",
}
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct CraneliftDiagnostics {
pub pass_timing: bool,
}
#[derive(Debug, Clone, Copy)]
pub struct CraneliftOptions {
pub opt_level: CraneliftOptLevel,
pub regalloc_algorithm: RegallocAlgorithm,
pub enable_alias_analysis: bool,
pub enable_verifier: bool,
pub tail_call_split: bool,
pub diagnostics: CraneliftDiagnostics,
}
impl Default for CraneliftOptions {
fn default() -> Self {
Self {
opt_level: CraneliftOptLevel::default(),
regalloc_algorithm: RegallocAlgorithm::default(),
enable_alias_analysis: true,
enable_verifier: true,
tail_call_split: true,
diagnostics: CraneliftDiagnostics::default(),
}
}
}
impl CraneliftOptions {
pub fn fast_compile() -> Self {
Self {
opt_level: CraneliftOptLevel::None,
regalloc_algorithm: RegallocAlgorithm::SinglePass,
enable_alias_analysis: false,
enable_verifier: false,
tail_call_split: true,
diagnostics: CraneliftDiagnostics::default(),
}
}
pub fn for_speed_optimization(enabled: bool) -> Self {
if enabled {
Self::default()
} else {
Self::fast_compile()
}
}
}