use crate::compiler::JIT;
use cranelift_module::FuncId;
use edlc_core::prelude::mir_funcs::{FnCodeGen, MirFuncId};
use edlc_core::prelude::{HirPhase, MirError, MirPhase};
use std::collections::HashMap;
#[derive(Default)]
pub struct JITCode {
generated: HashMap<MirFuncId, FuncId>,
}
impl JITCode {
pub fn add_from_executor<Runtime>(
&mut self,
backend: &mut JIT<Runtime>,
phase: &mut MirPhase,
hir_phase: &mut HirPhase,
) -> Result<(), MirError<JIT<Runtime>>> {
let funcs = {
backend.func_reg
.borrow()
.collect_codegen(|id| !self.generated.contains_key(id))
};
if funcs.is_empty() {
return Ok(());
}
for func in funcs {
let func_id = func.gen_func(backend, phase, hir_phase, 0)?;
self.generated.insert(func.mir_id.unwrap(), func_id);
}
backend.finalize_definitions()
}
pub fn get_func_id(&self, mir_id: MirFuncId) -> Option<FuncId> {
self.generated.get(&mir_id).cloned()
}
}