diff options
author | Johannes Stoelp <johannes.stoelp@gmail.com> | 2021-09-16 21:13:16 +0200 |
---|---|---|
committer | Johannes Stoelp <johannes.stoelp@gmail.com> | 2021-09-16 21:13:16 +0200 |
commit | b0cad668398c0102b726336871bac28ddfac347c (patch) | |
tree | a78f207fe1034c85555faf51457daa8bc5e8e470 /src/codegen.rs | |
parent | 0773a1531f1a34c9bba2fba19ef90b935267a160 (diff) | |
download | llvm-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.rs | 5 |
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!"); |