use serde::Deserialize;
use serde::Serialize;
use crate::target_machine::TargetMachine;
use self::settings::Settings;
pub mod settings;
#[derive(Debug, Serialize, Deserialize)]
pub struct Optimizer {
settings: Settings,
#[serde(skip)]
newyork: bool,
}
impl Optimizer {
pub fn new(settings: Settings) -> Self {
Self {
settings,
newyork: false,
}
}
pub fn enable_newyork_pipeline(&mut self) {
self.newyork = true;
}
pub fn is_newyork(&self) -> bool {
self.newyork
}
pub fn run(
&self,
target_machine: &TargetMachine,
module: &inkwell::module::Module,
) -> Result<(), inkwell::support::LLVMString> {
let optimization_level = self.settings.middle_end_as_string();
let pass_pipeline = if self.newyork {
format!(
"mergefunc,default<O{optimization_level}>,mergefunc,ipsccp,deadargelim,attributor,default<O1>,mergefunc"
)
} else {
format!("default<O{optimization_level}>")
};
target_machine.run_optimization_passes(module, &pass_pipeline)
}
pub fn settings(&self) -> &Settings {
&self.settings
}
}