From 606cb30c6be1ecce95fa06edf781851acc486134 Mon Sep 17 00:00:00 2001 From: shadow cat Date: Sat, 7 Dec 2024 23:56:00 -0500 Subject: [PATCH] slices (offsets now real in backend) --- data/test.lang | 23 +++-- src/compiler/arch/riscv64/compile.rs | 100 ++++++++++++++++----- src/ir/id.rs | 3 + src/ir/lower/func.rs | 14 ++- src/ir/lower/program.rs | 128 ++++++++++++++++++--------- src/ir/lower/symbol.rs | 8 +- src/ir/upper/func.rs | 30 ++++++- src/ir/upper/namespace.rs | 41 +++++++-- src/ir/upper/ty.rs | 44 ++------- src/main.rs | 11 ++- src/parser/v3/lower/def.rs | 14 ++- src/parser/v3/lower/expr.rs | 22 +++-- src/parser/v3/lower/func.rs | 73 ++------------- src/parser/v3/nodes/ty.rs | 9 -- 14 files changed, 305 insertions(+), 215 deletions(-) diff --git a/data/test.lang b/data/test.lang index d2b9a86..ba5a860 100644 --- a/data/test.lang +++ b/data/test.lang @@ -1,23 +1,30 @@ fn start() { - print("Hello World!\n", 13); - print("Hello World!\n", 13); - exit(0); + print("Helld!\n"); + print("Hello World!!!!!\n"); + thinger(); + print("what\n"); + exit(39); +} + +fn thinger() { + print("estamos jugando\n"); } fn unused() { - print("Hello World!\n", 13); + print("el unused\n"); } -fn print(msg, len) { - asm (a1 = msg, a2 = len) { - ld a2, 0, a2 +fn print(msg: slice<8>) { + asm (a1 = msg) { + ld a2, 8, a1 + ld a1, 0, a1 li a0, 1 li a7, 64 ecall } } -fn exit(status: 32) { +fn exit(status: 64) { asm (a0 = status) { ld a0, 0, a0 li a7, 93 diff --git a/src/compiler/arch/riscv64/compile.rs b/src/compiler/arch/riscv64/compile.rs index 68bb6bb..93e1d80 100644 --- a/src/compiler/arch/riscv64/compile.rs +++ b/src/compiler/arch/riscv64/compile.rs @@ -4,12 +4,44 @@ use crate::{ compiler::{arch::riscv64::Reg, create_program, Addr}, ir::{ arch::riscv64::{RV64Instruction as AI, RegRef}, - IRLInstruction as IRI, IRLProgram, + IRLInstruction as IRI, IRLProgram, Len, Size, Symbol, VarID, }, }; use super::{LinkerInstruction as LI, *}; +fn align(s: &Size) -> i32 { + (*s as i32 - 1).div_euclid(8) + 1 +} + +fn mov_mem( + v: &mut Vec
  • , + src: Reg, + src_offset: i32, + dest: Reg, + dest_offset: i32, + temp: Reg, + mut len: Len, +) { + let mut off = 0; + while len >= 8 { + v.extend([ + LI::Ld { + dest: temp, + offset: src_offset + off, + base: src, + }, + LI::Sd { + src: temp, + offset: dest_offset + off, + base: dest, + }, + ]); + len -= 8; + off += 8; + } +} + pub fn compile(program: IRLProgram) -> (Vec, Option) { let mut fns = Vec::new(); let mut data = Vec::new(); @@ -20,26 +52,36 @@ pub fn compile(program: IRLProgram) -> (Vec, Option) { let mut v = Vec::new(); let mut stack = HashMap::new(); let mut stack_len = 0; - if !f.stack.is_empty() || !f.args.is_empty() { + let has_stack = !f.stack.is_empty() || !f.args.is_empty() || f.makes_call; + let mut stack_ra = None; + if has_stack { + if f.makes_call { + // return addr + stack_ra = Some(stack_len); + stack_len += 8; + } for (id, s) in &f.stack { stack.insert(id, stack_len); - stack_len += *s as i32; + stack_len += align(s); } for (id, s) in f.args.iter().rev() { stack.insert(id, stack_len); - stack_len += *s as i32; + stack_len += align(s); } v.push(LI::Addi { dest: sp, src: sp, imm: -stack_len, }); + if let Some(stack_ra) = stack_ra { + v.push(LI::Sd { src: ra, offset: stack_ra, base: sp }); + } } for i in &f.instructions { match i { IRI::Mv { dest, src } => todo!(), IRI::Ref { dest, src } => todo!(), - IRI::LoadAddr { dest, src } => { + IRI::LoadAddr { dest, offset, src } => { v.extend([ LI::La { dest: t0, @@ -47,36 +89,38 @@ pub fn compile(program: IRLProgram) -> (Vec, Option) { }, LI::Sd { src: t0, - offset: stack[dest], + offset: stack[dest] + *offset as i32, base: sp, }, ]); } + IRI::LoadData { + dest, + offset, + src, + len, + } => { + v.push(LI::La { + dest: t0, + src: *src, + }); + mov_mem(&mut v, t0, 0, sp, stack[dest] + *offset as i32, t1, *len); + } IRI::Call { dest, f, args } => { let mut offset = 0; for (arg, s) in args { - offset -= *s as i32; - v.extend([ - LI::Ld { - dest: t0, - offset: stack[arg], - base: sp, - }, - LI::Sd { - src: t0, - offset, - base: sp, - }, - ]); + let bs = align(s); + offset -= bs; + mov_mem(&mut v, sp, stack[arg], sp, offset, t0, bs as Len); } v.push(LI::Call(*f)); } IRI::AsmBlock { args, instructions } => { for (reg, var) in args { - v.push(LI::Ld { + v.push(LI::Addi { dest: *reg, - offset: stack[var], - base: sp, + imm: stack[var], + src: sp, }); } fn r(rr: RegRef) -> Reg { @@ -105,9 +149,17 @@ pub fn compile(program: IRLProgram) -> (Vec, Option) { IRI::Ret { src } => todo!(), } } - if *sym != program.entry() { - v.push(LI::Ret); + if has_stack { + if let Some(stack_ra) = stack_ra { + v.push(LI::Ld { dest: ra, offset: stack_ra, base: sp }); + } + v.push(LI::Addi { + dest: sp, + src: sp, + imm: stack_len, + }); } + v.push(LI::Ret); fns.push((v, *sym)); } create_program(fns, data, Some(program.entry())) diff --git a/src/ir/id.rs b/src/ir/id.rs index 2106a58..ad8dcc2 100644 --- a/src/ir/id.rs +++ b/src/ir/id.rs @@ -9,6 +9,9 @@ pub struct FnID(pub usize); #[derive(Clone, Copy, Eq, Hash, PartialEq)] pub struct DataID(pub usize); +pub type Size = u32; +pub type Len = u32; + impl Debug for VarID { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "var{}", self.0) diff --git a/src/ir/lower/func.rs b/src/ir/lower/func.rs index ae883b0..a11f997 100644 --- a/src/ir/lower/func.rs +++ b/src/ir/lower/func.rs @@ -7,8 +7,9 @@ use std::collections::HashMap; pub struct IRLFunction { pub name: String, pub instructions: Vec, - pub stack: HashMap, - pub args: Vec<(VarID, usize)>, + pub stack: HashMap, + pub args: Vec<(VarID, Size)>, + pub makes_call: bool, } #[derive(Debug)] @@ -23,12 +24,19 @@ pub enum IRLInstruction { }, LoadAddr { dest: VarID, + offset: Size, src: Symbol, }, + LoadData { + dest: VarID, + offset: Size, + src: Symbol, + len: Len, + }, Call { dest: VarID, f: Symbol, - args: Vec<(VarID, usize)>, + args: Vec<(VarID, Size)>, }, AsmBlock { instructions: Vec, diff --git a/src/ir/lower/program.rs b/src/ir/lower/program.rs index 4935877..07f6ea1 100644 --- a/src/ir/lower/program.rs +++ b/src/ir/lower/program.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use crate::ir::{FnID, SymbolSpace}; -use super::{IRLFunction, IRLInstruction, IRUInstruction, Namespace, Symbol, VarID}; +use super::{IRLFunction, IRLInstruction, IRUInstruction, Len, Namespace, Symbol, VarID}; pub struct IRLProgram { sym_space: SymbolSpace, @@ -14,10 +14,9 @@ pub struct IRLProgram { impl IRLProgram { pub fn create(ns: &Namespace) -> Option { let mut start = None; - for (i, f) in ns.fns.iter().enumerate() { - let f = f.as_ref()?; - if f.name == "start" { - start = Some(FnID(i)); + for (i, f) in ns.iter_fns() { + if f?.name == "start" { + start = Some(i); } } let start = start?; @@ -25,78 +24,121 @@ impl IRLProgram { let entry = builder.func(&start); while let Some((sym, i)) = builder.pop_fn() { let f = ns.fns[i.0].as_ref().unwrap(); - let mut instructions = Vec::new(); + let mut instrs = Vec::new(); let mut stack = HashMap::new(); - let mut alloc_stack = |i: &VarID| { - if !stack.contains_key(i) { - stack.insert(*i, 8); - } + let mut makes_call = false; + let mut alloc_stack = |i: &VarID| -> bool { + let size = *stack + .entry(*i) + .or_insert(ns.size_of_var(i).expect("unsized type")); + size == 0 }; for i in &f.instructions { - instructions.push(match i { + match i { IRUInstruction::Mv { dest, src } => { - alloc_stack(dest); - IRLInstruction::Mv { + if alloc_stack(dest) { + continue; + } + instrs.push(IRLInstruction::Mv { dest: *dest, src: *src, - } + }); } IRUInstruction::Ref { dest, src } => { - alloc_stack(dest); - IRLInstruction::Ref { + if alloc_stack(dest) { + continue; + } + instrs.push(IRLInstruction::Ref { dest: *dest, src: *src, - } + }); } IRUInstruction::LoadData { dest, src } => { - alloc_stack(dest); - let addr = builder.ro_data(src, &ns.data[src.0]); - IRLInstruction::LoadAddr { - dest: *dest, - src: addr, + if alloc_stack(dest) { + continue; } + let data = &ns.data[src.0]; + let sym = builder.ro_data(src, data); + instrs.push(IRLInstruction::LoadData { + dest: *dest, + offset: 0, + len: data.len() as Len, + src: sym, + }); + } + IRUInstruction::LoadSlice { dest, src, len } => { + if alloc_stack(dest) { + continue; + } + let sym = builder.ro_data(src, &ns.data[src.0]); + instrs.push(IRLInstruction::LoadAddr { + dest: *dest, + offset: 0, + src: sym, + }); + let sym = builder.anon_ro_data(&(*len as u64).to_le_bytes()); + instrs.push(IRLInstruction::LoadData { + dest: *dest, + offset: 8, + len: 8, + src: sym, + }); } IRUInstruction::LoadFn { dest, src } => { - alloc_stack(dest); - let sym = builder.func(src); - IRLInstruction::LoadAddr { - dest: *dest, - src: sym, + if alloc_stack(dest) { + continue; } + let sym = builder.func(src); + instrs.push(IRLInstruction::LoadAddr { + dest: *dest, + offset: 0, + src: sym, + }); } IRUInstruction::Call { dest, f, args } => { alloc_stack(dest); + makes_call = true; let fid = &ns.fn_map[f]; let sym = builder.func(fid); - IRLInstruction::Call { + instrs.push(IRLInstruction::Call { dest: *dest, f: sym, - args: args.iter().map(|a| (*a, 8)).collect(), - } + args: args + .iter() + .map(|a| (*a, ns.size_of_var(a).expect("unsized type"))) + .collect(), + }); } - IRUInstruction::AsmBlock { instructions, args } => IRLInstruction::AsmBlock { - instructions: instructions.clone(), - args: args.clone(), - }, - IRUInstruction::Ret { src } => IRLInstruction::Ret { src: *src }, - }); + IRUInstruction::AsmBlock { instructions, args } => { + instrs.push(IRLInstruction::AsmBlock { + instructions: instructions.clone(), + args: args.clone(), + }) + } + IRUInstruction::Ret { src } => instrs.push(IRLInstruction::Ret { src: *src }), + }; } builder.write_fn( sym, IRLFunction { name: f.name.clone(), - instructions, - args: f.args.iter().map(|a| (*a, 8)).collect(), + instructions: instrs, + makes_call, + args: f + .args + .iter() + .map(|a| (*a, ns.size_of_var(a).expect("unsized type"))) + .collect(), stack, }, ); } let sym_space = builder.finish().expect("we failed the mission"); - println!("fns:"); - for (a, f) in sym_space.fns() { - println!(" {:?}: {}", a, f.name); - } - println!("datas: {}", sym_space.ro_data().len()); + // println!("fns:"); + // for (a, f) in sym_space.fns() { + // println!(" {:?}: {}", a, f.name); + // } + // println!("datas: {}", sym_space.ro_data().len()); Some(Self { sym_space, entry }) } diff --git a/src/ir/lower/symbol.rs b/src/ir/lower/symbol.rs index 4f65e92..f7be0ed 100644 --- a/src/ir/lower/symbol.rs +++ b/src/ir/lower/symbol.rs @@ -56,13 +56,17 @@ impl SymbolSpaceBuilder { pub fn pop_fn(&mut self) -> Option<(WritableSymbol, FnID)> { self.unwritten_fns.pop() } - pub fn ro_data(&mut self, id: &DataID, data: &Vec) -> Symbol { + pub fn anon_ro_data(&mut self, data: &[u8]) -> Symbol { + let sym = self.reserve(); + self.write_ro_data(sym, data.to_vec()) + } + pub fn ro_data(&mut self, id: &DataID, data: &[u8]) -> Symbol { match self.data_map.get(id) { Some(s) => *s, None => { let sym = self.reserve(); self.data_map.insert(*id, *sym); - self.write_ro_data(sym, data.clone()) + self.write_ro_data(sym, data.to_vec()) } } } diff --git a/src/ir/upper/func.rs b/src/ir/upper/func.rs index 7fbe294..d9c190e 100644 --- a/src/ir/upper/func.rs +++ b/src/ir/upper/func.rs @@ -1,8 +1,8 @@ -use crate::compiler::arch::riscv64::Reg; +use std::fmt::Write; -use super::{arch::riscv64::RV64Instruction, DataID, FnID, VarID}; +use super::{arch::riscv64::RV64Instruction, DataID, FnID, Len, VarID}; +use crate::{compiler::arch::riscv64::Reg, util::Padder}; -#[derive(Debug)] pub struct IRUFunction { pub name: String, pub args: Vec, @@ -22,6 +22,11 @@ pub enum IRUInstruction { dest: VarID, src: DataID, }, + LoadSlice { + dest: VarID, + src: DataID, + len: Len, + }, LoadFn { dest: VarID, src: FnID, @@ -70,6 +75,7 @@ impl std::fmt::Debug for IRUInstruction { Self::Ref { dest, src } => write!(f, "{dest:?} <- &{src:?}"), Self::LoadData { dest, src } => write!(f, "{dest:?} <- {src:?}"), Self::LoadFn { dest, src } => write!(f, "{dest:?} <- {src:?}"), + Self::LoadSlice { dest, src, len } => write!(f, "{dest:?} <- &[{src:?}; {len}]"), Self::Call { dest, f: func, @@ -80,3 +86,21 @@ impl std::fmt::Debug for IRUInstruction { } } } + +impl std::fmt::Debug for IRUFunction { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}{:?}", &self.name, self.args)?; + if !self.instructions.is_empty() { + f.write_str("{\n ")?; + let mut padder = Padder::new(f); + for i in &self.instructions { + // they don't expose wrap_buf :grief: + padder.write_str(&format!("{i:?};\n"))?; + } + f.write_char('}')?; + } else { + f.write_str("{}")?; + } + Ok(()) + } +} diff --git a/src/ir/upper/namespace.rs b/src/ir/upper/namespace.rs index a83976b..f296390 100644 --- a/src/ir/upper/namespace.rs +++ b/src/ir/upper/namespace.rs @@ -19,7 +19,7 @@ pub struct Namespace { impl Namespace { pub fn new() -> Self { - let mut s = Self { + Self { fn_defs: Vec::new(), var_defs: Vec::new(), type_defs: Vec::new(), @@ -28,11 +28,7 @@ impl Namespace { fns: Vec::new(), temp: 0, stack: vec![HashMap::new()], - }; - for b in BuiltinType::enumerate() { - s.def_type(b.def()); } - s } pub fn push(&mut self) -> NamespaceGuard { self.stack.push(HashMap::new()); @@ -76,6 +72,27 @@ impl Namespace { self.var_defs.push(var); VarID(i) } + pub fn size_of_type(&self, ty: &Type) -> Option { + // TODO: target matters + Some(match ty { + Type::Concrete(id) => { + let def = &self.type_defs[id.0]; + todo!() + } + Type::Bits(b) => *b, + Type::Generic { base, args } => todo!(), + Type::Fn { args, ret } => todo!(), + Type::Ref(_) => 64, + Type::Array(ty, len) => self.size_of_type(ty)? * len, + Type::Slice(_) => 128, + Type::Infer => return None, + Type::Error => return None, + Type::Unit => 0, + }) + } + pub fn size_of_var(&self, var: &VarID) -> Option { + self.size_of_type(&self.var_defs[var.0].ty) + } pub fn temp_var(&mut self, origin: FileSpan, ty: Type) -> VarID { let v = self.def_var(VarDef { name: format!("temp{}", self.temp), @@ -151,7 +168,9 @@ impl Namespace { Type::Error => str += "{error}", Type::Infer => str += "{inferred}", Type::Bits(size) => str += &format!("b{}", size), - Type::Array(t) => str += &format!("[{}]", self.type_name(t)), + Type::Array(t, len) => str += &format!("[{}; {len}]", self.type_name(t)), + Type::Unit => str += "()", + Type::Slice(t) => str += &format!("&[{}]", self.type_name(t)), } str } @@ -167,6 +186,16 @@ impl Namespace { pub fn write_fn(&mut self, id: FnID, f: IRUFunction) { self.fns[id.0] = Some(f); } + pub fn iter_vars(&self) -> impl Iterator { + (0..self.var_defs.len()) + .map(|i| VarID(i)) + .zip(self.var_defs.iter()) + } + pub fn iter_fns(&self) -> impl Iterator)> { + (0..self.fns.len()) + .map(|i| FnID(i)) + .zip(self.fns.iter().map(|f| f.as_ref())) + } } pub struct NamespaceGuard<'a>(&'a mut Namespace); diff --git a/src/ir/upper/ty.rs b/src/ir/upper/ty.rs index f452e39..89ac718 100644 --- a/src/ir/upper/ty.rs +++ b/src/ir/upper/ty.rs @@ -1,4 +1,4 @@ -use super::{Origin, TypeDef, TypeID}; +use super::{Len, TypeID}; #[derive(Clone)] pub enum Type { @@ -7,47 +7,21 @@ pub enum Type { Generic { base: TypeID, args: Vec }, Fn { args: Vec, ret: Box }, Ref(Box), - Array(Box), + Slice(Box), + Array(Box, Len), Infer, Error, + Unit, } impl Type { pub fn rf(self) -> Self { Self::Ref(Box::new(self)) } - pub fn arr(self) -> Self { - Self::Array(Box::new(self)) + pub fn arr(self, len: Len) -> Self { + Self::Array(Box::new(self), len) + } + pub fn slice(self) -> Self { + Self::Slice(Box::new(self)) } } - -#[repr(usize)] -#[derive(Debug, Clone, Copy)] -pub enum BuiltinType { - Unit, -} - -impl BuiltinType { - pub fn enumerate() -> &'static [Self; 1] { - &[Self::Unit] - } - pub fn def(&self) -> TypeDef { - match self { - BuiltinType::Unit => TypeDef { - name: "()".to_string(), - args: 0, - origin: Origin::Builtin, - }, - } - } - pub fn id(&self) -> TypeID { - TypeID::builtin(self) - } -} - -impl TypeID { - pub fn builtin(ty: &BuiltinType) -> Self { - Self(*ty as usize) - } -} - diff --git a/src/main.rs b/src/main.rs index 72f6372..abdcebb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -37,10 +37,13 @@ fn run_file(file: &str, gdb: bool) { let mut namespace = Namespace::new(); module.lower(&mut namespace.push(), &mut ctx.output); if ctx.output.errs.is_empty() { - println!("vars:"); - for def in &namespace.var_defs { - println!(" {}: {}", def.name, namespace.type_name(&def.ty)); - } + // println!("vars:"); + // for (id, def) in namespace.iter_vars() { + // println!(" {id:?} = {}: {}", def.name, namespace.type_name(&def.ty)); + // } + // for (id, f) in namespace.iter_fns() { + // println!("{id:?} = {:#?}", f.unwrap()); + // } let program = IRLProgram::create(&namespace); let bin = compiler::compile(program.expect("morir")); println!("compiled"); diff --git a/src/parser/v3/lower/def.rs b/src/parser/v3/lower/def.rs index a491f67..0e4a3ef 100644 --- a/src/parser/v3/lower/def.rs +++ b/src/parser/v3/lower/def.rs @@ -1,6 +1,6 @@ use crate::ir::{FileSpan, NamespaceGuard, Origin, Type, VarDef}; -use super::{Node, ParserMsg, ParserOutput, PType, PVarDef}; +use super::{Node, PType, PVarDef, ParserMsg, ParserOutput}; impl Node { pub fn lower( @@ -54,8 +54,16 @@ impl PType { if let Ok(num) = self.name.parse::() { Type::Bits(num) } else { - output.err(ParserMsg::from_span(span, "Type not found".to_string())); - Type::Error + match self.name.as_str() { + "slice" => { + let inner = self.args[0].lower(namespace, output); + Type::Slice(Box::new(inner)) + } + _ => { + output.err(ParserMsg::from_span(span, "Type not found".to_string())); + Type::Error + } + } } } } diff --git a/src/parser/v3/lower/expr.rs b/src/parser/v3/lower/expr.rs index 9f48b42..8f238dd 100644 --- a/src/parser/v3/lower/expr.rs +++ b/src/parser/v3/lower/expr.rs @@ -1,5 +1,5 @@ use super::{func::FnLowerCtx, FnLowerable, PExpr, UnaryOp}; -use crate::ir::{IRUInstruction, Type, VarID}; +use crate::ir::{IRUInstruction, Size, Type, VarID}; impl FnLowerable for PExpr { type Output = VarID; @@ -7,13 +7,15 @@ impl FnLowerable for PExpr { Some(match self { PExpr::Lit(l) => match l.as_ref()? { super::PLiteral::String(s) => { - let dest = ctx.map.temp_var(l.span, Type::Bits(64).arr().rf()); - let src = ctx.map.def_data(s.as_bytes().to_vec()); - ctx.push(IRUInstruction::LoadData { dest, src }); + let dest = ctx.map.temp_var(l.span, Type::Bits(8).slice()); + let data = s.as_bytes().to_vec(); + let len = data.len() as Size; + let src = ctx.map.def_data(data); + ctx.push(IRUInstruction::LoadSlice { dest, src, len }); dest } super::PLiteral::Char(c) => { - let dest = ctx.map.temp_var(l.span, Type::Bits(64).arr().rf()); + let dest = ctx.map.temp_var(l.span, Type::Bits(8).slice()); let src = ctx.map.def_data(c.to_string().as_bytes().to_vec()); ctx.push(IRUInstruction::LoadData { dest, src }); dest @@ -79,9 +81,15 @@ impl FnLowerable for PExpr { let ty = match def { Some(def) => def.ret.clone(), None => { - ctx.err_at(e.span, format!("Expected function, found {}", ctx.map.type_name(&ctx.map.get_var(fe).ty))); + ctx.err_at( + e.span, + format!( + "Expected function, found {}", + ctx.map.type_name(&ctx.map.get_var(fe).ty) + ), + ); Type::Error - }, + } }; let temp = ctx.temp(ty); ctx.push(IRUInstruction::Call { diff --git a/src/parser/v3/lower/func.rs b/src/parser/v3/lower/func.rs index 05058e6..9487fd0 100644 --- a/src/parser/v3/lower/func.rs +++ b/src/parser/v3/lower/func.rs @@ -1,8 +1,8 @@ -use super::{FnLowerable, PFunction, Node, ParserMsg, ParserOutput}; +use super::{FnLowerable, Node, PFunction, ParserMsg, ParserOutput}; use crate::{ ir::{ - BuiltinType, FileSpan, FnDef, FnID, IRUFunction, Idents, IRUInstruction, IRInstructions, - NamespaceGuard, Origin, Type, VarDef, VarID, + FileSpan, FnDef, FnID, IRInstructions, IRUFunction, IRUInstruction, Idents, NamespaceGuard, + Origin, Type, VarDef, VarID, }, parser, }; @@ -46,7 +46,7 @@ impl PFunction { .collect(); let ret = match &header.ret { Some(ty) => ty.lower(map, output), - None => Type::Concrete(BuiltinType::Unit.id()), + None => Type::Unit, }; Some(map.def_fn(FnDef { name: name.to_string(), @@ -63,9 +63,7 @@ impl PFunction { ) -> IRUFunction { let mut instructions = IRInstructions::new(); let def = map.get_fn(id).clone(); - let args = def.args.iter().map(|a| { - map.named_var(a.clone()) - }).collect(); + let args = def.args.iter().map(|a| map.named_var(a.clone())).collect(); let mut ctx = FnLowerCtx { instructions: &mut instructions, map, @@ -79,67 +77,6 @@ impl PFunction { } } -// impl Node { -// pub fn lower_header( -// &self, -// map: &mut NamespaceGuard, -// output: &mut ParserOutput, -// ) -> Option { -// self.as_ref()?.lower_header(map, output) -// } -// pub fn lower_body( -// &self, -// map: &mut NamespaceGuard, -// output: &mut ParserOutput, -// ) -> Option { -// Some(self.as_ref()?.lower_body(map, output)) -// } -// } -// -// impl AsmFunction { -// pub fn lower_header( -// &self, -// map: &mut NamespaceGuard, -// output: &mut ParserOutput, -// ) -> Option { -// let header = self.header.as_ref()?; -// let name = header.name.as_ref()?; -// let args = header -// .args -// .iter() -// .map(|a| { -// // a.lower(map, output).unwrap_or(VarDef { -// // name: "{error}".to_string(), -// // origin: Origin::File(a.span), -// // ty: Type::Error, -// // }) -// }) -// .collect(); -// // let ret = match &header.ret { -// // Some(ty) => ty.lower(map, output), -// // None => Type::Concrete(BuiltinType::Unit.id()), -// // }; -// let ret = Type::Concrete(BuiltinType::Unit.id()); -// Some(map.def_fn(FnDef { -// name: name.to_string(), -// origin: Origin::File(self.header.span), -// args, -// ret, -// })) -// } -// pub fn lower_body(&self, map: &mut NamespaceGuard, output: &mut ParserOutput) -> Function { -// let mut instructions = Instructions::new(); -// let mut ctx = FnLowerCtx { -// instructions: &mut instructions, -// map, -// output, -// span: self.body.span, -// }; -// self.body.lower(&mut ctx); -// Function::new(instructions) -// } -// } - pub struct FnLowerCtx<'a, 'n> { pub map: &'a mut NamespaceGuard<'n>, pub instructions: &'a mut IRInstructions, diff --git a/src/parser/v3/nodes/ty.rs b/src/parser/v3/nodes/ty.rs index 3809e32..e1b4e37 100644 --- a/src/parser/v3/nodes/ty.rs +++ b/src/parser/v3/nodes/ty.rs @@ -7,15 +7,6 @@ pub struct PType { pub args: Vec>, } -impl PType { - pub fn unit() -> Self { - Self { - name: "()".to_string(), - args: Vec::new(), - } - } -} - impl Parsable for PType { fn parse(ctx: &mut ParserCtx) -> ParseResult { let next = ctx.expect_peek()?;