From 43c828d96fd0890d8d1875768651955330a98981 Mon Sep 17 00:00:00 2001 From: Janis Date: Sun, 29 Dec 2024 19:57:29 +0100 Subject: [PATCH] irgen of ast2 --- Makefile | 4 + src/ast2/mod.rs | 149 ++++++++++++++++++++++++++++++++++++- tests/legal/custom_int.sea | 6 ++ 3 files changed, 156 insertions(+), 3 deletions(-) create mode 100644 Makefile create mode 100644 tests/legal/custom_int.sea diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b0de8c2 --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ + +test: + cargo run --bin main -- -i tests/legal/call.sea asm > asm.S + clang asm.S -c && clang asm.o -o asm && ./asm; echo $$? diff --git a/src/ast2/mod.rs b/src/ast2/mod.rs index 601acc3..7fb873e 100644 --- a/src/ast2/mod.rs +++ b/src/ast2/mod.rs @@ -4502,10 +4502,15 @@ pub mod ast_gen { } } -pub mod ir_gen { +pub mod irgen { + use super::visitor::AstExt; use super::*; - use crate::{symbol_table::syms2::Symbols, triples::*}; + use crate::{ + symbol_table::syms2::Symbols, + triples::{self, *}, + }; + use std::collections::HashMap; struct IRGen { ast: Ast, @@ -4514,5 +4519,143 @@ pub mod ir_gen { ip: intern::InternPool, } - impl IRGen {} + impl IRGen { + fn build(&mut self) { + let mut mapping = HashMap::::new(); + self.ast.visitor().visit( + |ast, scopes, i, tag, data| { + // pre + match tag { + Tag::Root => todo!(), + Tag::File => todo!(), + Tag::FunctionProto => todo!(), + Tag::FunctionDecl => todo!(), + Tag::ParameterList => todo!(), + Tag::Parameter => todo!(), + Tag::Block => todo!(), + Tag::BlockTrailingExpr => todo!(), + Tag::Constant => todo!(), + Tag::ExprStmt => todo!(), + Tag::ReturnStmt => todo!(), + Tag::ReturnExprStmt => todo!(), + Tag::VarDecl => todo!(), + Tag::MutVarDecl => todo!(), + Tag::VarDeclAssignment => todo!(), + Tag::MutVarDeclAssignment => todo!(), + Tag::GlobalDecl => todo!(), + Tag::StructDecl => todo!(), + Tag::FieldDecl => todo!(), + Tag::DeclRef => todo!(), + Tag::DeclRefUnresolved => todo!(), + Tag::InternedType => todo!(), + Tag::TypeDeclRef => todo!(), + Tag::TypeDeclRefUnresolved => todo!(), + Tag::PointerType => todo!(), + Tag::ArrayType => todo!(), + Tag::CallExpr => todo!(), + Tag::FieldAccess => todo!(), + Tag::ArgumentList => todo!(), + Tag::Argument => todo!(), + Tag::NamedArgument => todo!(), + Tag::ExplicitCast => todo!(), + Tag::Deref => todo!(), + Tag::AddressOf => todo!(), + Tag::Not => todo!(), + Tag::Negate => todo!(), + Tag::Or => todo!(), + Tag::And => todo!(), + Tag::BitOr => todo!(), + Tag::BitXOr => todo!(), + Tag::BitAnd => todo!(), + Tag::Eq => todo!(), + Tag::NEq => todo!(), + Tag::Lt => todo!(), + Tag::Gt => todo!(), + Tag::Le => todo!(), + Tag::Ge => todo!(), + Tag::Shl => todo!(), + Tag::Shr => todo!(), + Tag::Add => todo!(), + Tag::Sub => todo!(), + Tag::Mul => todo!(), + Tag::Div => todo!(), + Tag::Rem => todo!(), + Tag::Assign => todo!(), + Tag::SubscriptExpr => todo!(), + Tag::IfExpr => todo!(), + Tag::IfElseExpr => todo!(), + Tag::Error => todo!(), + Tag::Undefined => todo!(), + } + }, + |ast, scopes, i, tag, data| { + // post + match tag { + Tag::Root => todo!(), + Tag::File => todo!(), + Tag::FunctionProto => todo!(), + Tag::FunctionDecl => { + todo!() + } + Tag::ParameterList => todo!(), + Tag::Parameter => todo!(), + Tag::Block => todo!(), + Tag::BlockTrailingExpr => todo!(), + Tag::Constant => todo!(), + Tag::ExprStmt => todo!(), + Tag::ReturnStmt => todo!(), + Tag::ReturnExprStmt => todo!(), + Tag::VarDecl => todo!(), + Tag::MutVarDecl => todo!(), + Tag::VarDeclAssignment => todo!(), + Tag::MutVarDeclAssignment => todo!(), + Tag::GlobalDecl => todo!(), + Tag::StructDecl => todo!(), + Tag::FieldDecl => todo!(), + Tag::DeclRef => todo!(), + Tag::DeclRefUnresolved => todo!(), + Tag::InternedType => todo!(), + Tag::TypeDeclRef => todo!(), + Tag::TypeDeclRefUnresolved => todo!(), + Tag::PointerType => todo!(), + Tag::ArrayType => todo!(), + Tag::CallExpr => todo!(), + Tag::FieldAccess => todo!(), + Tag::ArgumentList => todo!(), + Tag::Argument => todo!(), + Tag::NamedArgument => todo!(), + Tag::ExplicitCast => todo!(), + Tag::Deref => todo!(), + Tag::AddressOf => todo!(), + Tag::Not => todo!(), + Tag::Negate => todo!(), + Tag::Or => todo!(), + Tag::And => todo!(), + Tag::BitOr => todo!(), + Tag::BitXOr => todo!(), + Tag::BitAnd => todo!(), + Tag::Eq => todo!(), + Tag::NEq => todo!(), + Tag::Lt => todo!(), + Tag::Gt => todo!(), + Tag::Le => todo!(), + Tag::Ge => todo!(), + Tag::Shl => todo!(), + Tag::Shr => todo!(), + Tag::Add => todo!(), + Tag::Sub => todo!(), + Tag::Mul => todo!(), + Tag::Div => todo!(), + Tag::Rem => todo!(), + Tag::Assign => todo!(), + Tag::SubscriptExpr => todo!(), + Tag::IfExpr => todo!(), + Tag::IfElseExpr => todo!(), + Tag::Error => todo!(), + Tag::Undefined => todo!(), + } + }, + ); + } + } } diff --git a/tests/legal/custom_int.sea b/tests/legal/custom_int.sea new file mode 100644 index 0000000..51f8dd4 --- /dev/null +++ b/tests/legal/custom_int.sea @@ -0,0 +1,6 @@ +fn main() -> u32 { + let a: u10 = 16u10; + let b: u80 = 299; + + return a as u32 + b as u32; +} \ No newline at end of file