From 0eb2b9ec0466d1c76bee8d8fafbe8a32451d8783 Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Tue, 5 Apr 2022 22:17:53 -0500 Subject: [PATCH] fmt --- build.rs | 2 +- rustfmt.toml | 2 ++ src/ast.rs | 58 ------------------------------------------------- src/ast/llvm.rs | 38 ++++++++++++++++++++++++++++++++ src/ast/mod.rs | 37 +++++++++++++++++++++++++++++++ src/main.rs | 32 +++++++++++++-------------- 6 files changed, 94 insertions(+), 75 deletions(-) create mode 100644 rustfmt.toml delete mode 100644 src/ast.rs create mode 100644 src/ast/llvm.rs create mode 100644 src/ast/mod.rs diff --git a/build.rs b/build.rs index ca5c283..a8245d5 100644 --- a/build.rs +++ b/build.rs @@ -1,3 +1,3 @@ fn main() { - lalrpop::process_root().unwrap(); + lalrpop::process_root().unwrap(); } diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..4c1eefa --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,2 @@ +max_width = 80 +tab_spaces = 2 diff --git a/src/ast.rs b/src/ast.rs deleted file mode 100644 index f6b3f38..0000000 --- a/src/ast.rs +++ /dev/null @@ -1,58 +0,0 @@ -use anyhow::Result; -use inkwell::{context::Context, module::Module}; - -#[derive(Debug)] -pub enum Decl { - Func(Func), -} - -impl Decl { - pub fn unwrap_func(&self) -> Option<&Func> { - match self { - Decl::Func(func) => Some(func), - _ => None, - } - } -} - -#[derive(Debug)] -pub struct Func { - pub name: String, - pub return_ty: Type, - pub stmts: Vec, -} - -#[derive(Debug)] -pub enum Stmt { - Return(Option), -} - -#[derive(Debug)] -pub enum Expr { - Int(i64), -} - -#[derive(Debug)] -pub enum Type { - Int, -} - -pub fn convert(context: &mut Context, program: Vec) -> Result { - let module = context.create_module("program"); - let builder = context.create_builder(); - - for func in program.iter().filter_map(Decl::unwrap_func) { - // TODO: hardcoded void -> int function - let i64_ty = context.i64_type(); - let llvm_func_ty = i64_ty.fn_type(&[], false); - - let llvm_func = module.add_function(&func.name, llvm_func_ty, None); - let entry_block = context.append_basic_block(llvm_func, "entry"); - - builder.position_at_end(entry_block); - - builder.build_return(None); - } - - Ok(module) -} diff --git a/src/ast/llvm.rs b/src/ast/llvm.rs new file mode 100644 index 0000000..eff7e17 --- /dev/null +++ b/src/ast/llvm.rs @@ -0,0 +1,38 @@ +use anyhow::Result; +use inkwell::{ + context::Context, + module::Module, + types::{AnyType, AnyTypeEnum}, +}; + +use super::{Decl, Type}; + +impl Type { + pub fn into_llvm_type<'ctx>( + &self, + context: &'ctx Context, + ) -> AnyTypeEnum<'ctx> { + match self { + Type::Int => AnyTypeEnum::IntType(context.i64_type()), + } + } +} + +pub fn convert(context: &mut Context, program: Vec) -> Result { + let module = context.create_module("program"); + let builder = context.create_builder(); + + for func in program.iter().filter_map(Decl::unwrap_func) { + let return_ty = func.return_ty.into_llvm_type(context); + let llvm_func_ty = return_ty.fn_type(); + + let llvm_func = module.add_function(&func.name, llvm_func_ty, None); + let entry_block = context.append_basic_block(llvm_func, "entry"); + + builder.position_at_end(entry_block); + + builder.build_return(None); + } + + Ok(module) +} diff --git a/src/ast/mod.rs b/src/ast/mod.rs new file mode 100644 index 0000000..4a657da --- /dev/null +++ b/src/ast/mod.rs @@ -0,0 +1,37 @@ +pub mod llvm; + +#[derive(Debug)] +pub enum Decl { + Func(Func), +} + +impl Decl { + pub fn unwrap_func(&self) -> Option<&Func> { + match self { + Decl::Func(func) => Some(func), + _ => None, + } + } +} + +#[derive(Debug)] +pub struct Func { + pub name: String, + pub return_ty: Type, + pub stmts: Vec, +} + +#[derive(Debug)] +pub enum Stmt { + Return(Option), +} + +#[derive(Debug)] +pub enum Expr { + Int(i64), +} + +#[derive(Debug)] +pub enum Type { + Int, +} diff --git a/src/main.rs b/src/main.rs index d991574..0efcbe3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,29 +18,29 @@ use crate::parser::ProgramParser; #[derive(Debug, Parser)] struct Opt { - path: PathBuf, + path: PathBuf, - #[clap(short = 'o', long = "out")] - out_path: PathBuf, + #[clap(short = 'o', long = "out")] + out_path: PathBuf, } fn main() -> Result<()> { - let opts = Opt::parse(); + let opts = Opt::parse(); - let contents = fs::read_to_string(opts.path)?; + let contents = fs::read_to_string(opts.path)?; - let parser = ProgramParser::new(); - let ast = parser.parse(&contents).unwrap(); - println!("AST: {ast:?}"); + let parser = ProgramParser::new(); + let ast = parser.parse(&contents).unwrap(); + println!("AST: {ast:?}"); - let mut context = Context::create(); - let module = ast::convert(&mut context, ast)?; + let mut context = Context::create(); + let module = ast::llvm::convert(&mut context, ast)?; - { - let file = File::create(&opts.out_path)?; - module.write_bitcode_to_file(&file, true, true); - println!("Emitted."); - } + { + let file = File::create(&opts.out_path)?; + module.write_bitcode_to_file(&file, true, true); + println!("Emitted."); + } - Ok(()) + Ok(()) }