use crate::ir::Program;
use crate::opt::pass::Pass;
#[derive(Default)]
pub struct PassManager {
passes: Vec<Pass>,
}
impl PassManager {
pub fn new() -> Self {
Self::default()
}
pub fn register(&mut self, pass: Pass) {
self.passes.push(pass);
}
pub fn run_passes(&mut self, program: &mut Program) {
for pass in &mut self.passes {
match pass {
Pass::Module(p) => p.run_on(program),
Pass::Function(p) => {
for (func, data) in program.funcs_mut() {
p.run_on(*func, data);
}
}
}
}
}
}
impl From<Vec<Pass>> for PassManager {
fn from(passes: Vec<Pass>) -> Self {
Self { passes }
}
}