From 221beea478b7bd30762b5ed15ae15ea756b6d783 Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Sun, 17 Jul 2022 21:13:09 -0500 Subject: [PATCH] Variables --- src/codegen/llvm_ir/expr.rs | 11 ++++++++--- src/codegen/llvm_ir/mod.rs | 6 +++--- src/codegen/llvm_ir/stmts.rs | 9 ++++++++- src/utils.rs | 8 +++++++- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/codegen/llvm_ir/expr.rs b/src/codegen/llvm_ir/expr.rs index da1de0e..efa0830 100644 --- a/src/codegen/llvm_ir/expr.rs +++ b/src/codegen/llvm_ir/expr.rs @@ -19,11 +19,11 @@ impl LlvmIrCodegen { &mut self, expr: &'a Expr, ) -> Result> { - let expr_id = self.gensym("expr"); + let ty_str = type_to_llvm(&expr.ty); + let mut expr_id = self.gensym("expr"); match &expr.kind { ExprKind::Int(n) => { - let ty_str = type_to_llvm(&expr.ty); writeln!(self.writer, "%{} = alloca {}", expr_id, ty_str)?; writeln!( self.writer, @@ -31,7 +31,12 @@ impl LlvmIrCodegen { ty_str, n, ty_str, expr_id )?; } - ExprKind::Var(_) => todo!(), + ExprKind::Var(name) => match self.var_env.lookup(name) { + Some((_, name)) => { + expr_id = name.clone(); + } + None => bail!("Unbound name {name:?}"), + }, ExprKind::BinOp(_, _, _) => todo!(), ExprKind::Call(_, _) => todo!(), } diff --git a/src/codegen/llvm_ir/mod.rs b/src/codegen/llvm_ir/mod.rs index 6bab4a5..52a0909 100644 --- a/src/codegen/llvm_ir/mod.rs +++ b/src/codegen/llvm_ir/mod.rs @@ -13,16 +13,16 @@ use super::CodegenBackend; pub struct LlvmIrCodegen { ctr: usize, - env: LayeredEnv, + var_env: LayeredEnv, writer: W, } impl LlvmIrCodegen { pub fn new(writer: W) -> Self { - let env = LayeredEnv::default(); + let env = LayeredEnv::new(); LlvmIrCodegen { ctr: 0, - env, + var_env: env, writer, } } diff --git a/src/codegen/llvm_ir/stmts.rs b/src/codegen/llvm_ir/stmts.rs index 3bc1f99..5126f48 100644 --- a/src/codegen/llvm_ir/stmts.rs +++ b/src/codegen/llvm_ir/stmts.rs @@ -15,7 +15,14 @@ impl LlvmIrCodegen { for stmt in stmts.iter() { match stmt { - Stmt::Let(_, _, _) => todo!(), + Stmt::Let(name, _, expr) => { + let ty = expr.ty.clone(); + let expr = self.convert_expr(&expr)?; + let new_name = expr.name().to_owned(); + + // TODO: + self.var_env.insert(name.clone(), (ty, new_name)); + } Stmt::Return(expr) => match expr { Some(ret_val) => { let ret_ty = type_to_llvm(&ret_val.ty); diff --git a/src/utils.rs b/src/utils.rs index 6e9baa2..805d500 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,13 +1,19 @@ use std::collections::HashMap; use std::hash::Hash; -#[derive(Default)] pub struct LayeredEnv { parent: Option>>, inner_map: HashMap, } impl LayeredEnv { + pub fn new() -> Self { + LayeredEnv { + parent: None, + inner_map: HashMap::new(), + } + } + pub fn insert(&mut self, key: K, value: V) { self.inner_map.insert(key, value); }