aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codegen.rs
diff options
context:
space:
mode:
authorJohannes Stoelp <johannes.stoelp@gmail.com>2021-09-16 21:13:16 +0200
committerJohannes Stoelp <johannes.stoelp@gmail.com>2021-09-16 21:13:16 +0200
commitb0cad668398c0102b726336871bac28ddfac347c (patch)
treea78f207fe1034c85555faf51457daa8bc5e8e470 /src/codegen.rs
parent0773a1531f1a34c9bba2fba19ef90b935267a160 (diff)
downloadllvm-kaleidoscope-rs-b0cad668398c0102b726336871bac28ddfac347c.tar.gz
llvm-kaleidoscope-rs-b0cad668398c0102b726336871bac28ddfac347c.zip
ch4: add function optimization passes
Diffstat (limited to 'src/codegen.rs')
-rw-r--r--src/codegen.rs5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/codegen.rs b/src/codegen.rs
index 866aab7..0a7893e 100644
--- a/src/codegen.rs
+++ b/src/codegen.rs
@@ -1,6 +1,6 @@
use std::collections::HashMap;
-use crate::llvm::{Builder, FnValue, Module, Value};
+use crate::llvm::{Builder, FnValue, FunctionPassManager, Module, Value};
use crate::parser::{ExprAST, FunctionAST, PrototypeAST};
use crate::Either;
@@ -10,6 +10,7 @@ type CodegenResult<T> = Result<T, String>;
pub struct Codegen<'llvm, 'a> {
module: &'llvm Module,
builder: &'a Builder<'llvm>,
+ fpm: &'a FunctionPassManager<'llvm>,
}
impl<'llvm, 'a> Codegen<'llvm, 'a> {
@@ -21,6 +22,7 @@ impl<'llvm, 'a> Codegen<'llvm, 'a> {
let cg = Codegen {
module,
builder: &Builder::with_ctx(module),
+ fpm: &FunctionPassManager::with_ctx(module),
};
let mut variables = HashMap::new();
@@ -127,6 +129,7 @@ impl<'llvm, 'a> Codegen<'llvm, 'a> {
if let Ok(ret) = self.codegen_expr(body, named_values) {
self.builder.ret(ret);
assert!(the_function.verify());
+ self.fpm.run(the_function);
Ok(the_function)
} else {
todo!("Failed to codegen function body, erase from module!");