about summary refs log tree commit diff
path: root/src/codegen/mod.rs
diff options
context:
space:
mode:
authorGriffin Smith <root@gws.fyi>2021-03-07T20·29-0500
committerGriffin Smith <root@gws.fyi>2021-03-07T20·29-0500
commit80f8ede0bbc9799d5199707e1e1ad8e80e4ca7ac (patch)
treecbb418b042583714fe09f946f1b9a03d1d98857f /src/codegen/mod.rs
Initial commit
Diffstat (limited to 'src/codegen/mod.rs')
-rw-r--r--src/codegen/mod.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs
new file mode 100644
index 000000000000..4620b6b48e84
--- /dev/null
+++ b/src/codegen/mod.rs
@@ -0,0 +1,26 @@
+pub mod llvm;
+
+use inkwell::execution_engine::JitFunction;
+use inkwell::OptimizationLevel;
+pub use llvm::*;
+
+use crate::ast::Expr;
+use crate::common::Result;
+
+pub fn jit_eval<T>(expr: &Expr) -> Result<T> {
+    let context = Context::create();
+    let mut codegen = Codegen::new(&context, "eval");
+    let execution_engine = codegen
+        .module
+        .create_jit_execution_engine(OptimizationLevel::None)
+        .map_err(Error::from)?;
+    codegen.new_function("eval", context.i64_type().fn_type(&[], false));
+    let res = codegen.codegen_expr(&expr)?;
+    codegen.finish_function(&res);
+
+    unsafe {
+        let fun: JitFunction<unsafe extern "C" fn() -> T> =
+            execution_engine.get_function("eval").unwrap();
+        Ok(fun.call())
+    }
+}