use crate::{ir::ty::HirTypeCache, Module, OptimizationLevel};
use inkwell::{
passes::{PassManager, PassManagerBuilder},
values::FunctionValue,
};
use mun_hir::HirDatabase;
pub(crate) fn create_pass_manager<'ink>(
module: &Module<'ink>,
optimization_lvl: OptimizationLevel,
) -> PassManager<FunctionValue<'ink>> {
let pass_builder = PassManagerBuilder::create();
pass_builder.set_optimization_level(optimization_lvl);
let function_pass_manager = PassManager::create(module);
pass_builder.populate_function_pass_manager(&function_pass_manager);
function_pass_manager.initialize();
function_pass_manager
}
pub(crate) fn gen_prototype<'db, 'ink>(
db: &'db dyn HirDatabase,
types: &HirTypeCache<'db, 'ink>,
func: mun_hir::Function,
module: &Module<'ink>,
) -> FunctionValue<'ink> {
let name = func.name(db).to_string();
let ir_ty = types.get_function_type(func);
module.add_function(&name, ir_ty, None)
}
pub(crate) fn gen_public_prototype<'db, 'ink>(
db: &'db dyn HirDatabase,
types: &HirTypeCache<'db, 'ink>,
func: mun_hir::Function,
module: &Module<'ink>,
) -> FunctionValue<'ink> {
let name = format!("{}_wrapper", func.name(db));
let ir_ty = types.get_public_function_type(func);
module.add_function(&name, ir_ty, None)
}