xrcf 0.1.0

A compiler framework to enable the rapid development of programming language compilers
Documentation
use crate::canonicalize::CanonicalizeOp;
use crate::canonicalize::DeadCodeElimination;
use crate::convert::apply_rewrites;
use crate::convert::ConvertFuncToLLVM;
use crate::convert::ConvertMLIRToLLVMIR;
use crate::convert::Rewrite;
use crate::convert::RewriteResult;
use crate::ir::Op;
use crate::Pass;
use anyhow::Result;
use std::sync::Arc;
use std::sync::RwLock;

pub struct OptOptions {
    canonicalize: bool,
    convert_func_to_llvm: bool,
    mlir_to_llvmir: bool,
}

impl OptOptions {
    pub fn set_canonicalize(&mut self, canonicalize: bool) {
        self.canonicalize = canonicalize;
    }
    pub fn set_convert_func_to_llvm(&mut self, convert_func_to_llvm: bool) {
        self.convert_func_to_llvm = convert_func_to_llvm;
    }
    pub fn set_mlir_to_llvmir(&mut self, mlir_to_llvmir: bool) {
        self.mlir_to_llvmir = mlir_to_llvmir;
    }
}

impl Default for OptOptions {
    fn default() -> Self {
        OptOptions {
            canonicalize: false,
            convert_func_to_llvm: false,
            mlir_to_llvmir: false,
        }
    }
}

pub fn opt(op: Arc<RwLock<dyn Op>>, options: OptOptions) -> Result<RewriteResult> {
    if options.canonicalize {
        let rewrites: Vec<&dyn Rewrite> = vec![&CanonicalizeOp, &DeadCodeElimination];
        return Ok(apply_rewrites(op, &rewrites)?);
    }
    if options.convert_func_to_llvm {
        assert!(ConvertFuncToLLVM::name() == "convert-func-to-llvm");
        return ConvertFuncToLLVM::convert(op);
    }
    if options.mlir_to_llvmir {
        assert!(ConvertMLIRToLLVMIR::name() == "convert-mlir-to-llvmir");
        return ConvertMLIRToLLVMIR::convert(op);
    }
    Ok(RewriteResult::Unchanged)
}