Update allocator to remove dynamic allocations from lists/structs
This commit is contained in:
		
							parent
							
								
									ccee457cf4
								
							
						
					
					
						commit
						e14efa2ea7
					
				| @ -83,7 +83,11 @@ Common token used throughout this document to express parts of grammar include: | ||||
|     "i8" | "i16" | "i32" | "i64" | "i128" | | ||||
|     "f16" | "f32" | "f32b" | "f64" | "f80" | "f128" | "f128ppc" | ||||
| 
 | ||||
| <binop> :: "+" | "-" | "*" | "/" | "%" | "&&" | <cmp> | ||||
| <binop> :: "+" | "-" | "*"  | ||||
|   | "/" | "%" | "&&" | "||"  | ||||
|   | "&" | "|" | "^" | ">>"  | ||||
|   | "<<" | <cmp> | ||||
| 
 | ||||
| <cmp> :: "<" | "<=" | "==" | "!=" | ">=" | >" | ||||
| <unary> :: "+" | "-" | "!" | ||||
| ``` | ||||
|  | ||||
| @ -2,12 +2,12 @@ use std::collections::HashMap; | ||||
| 
 | ||||
| use reid_lib::{ | ||||
|     builder::{InstructionValue, TypeValue}, | ||||
|     Block, | ||||
|     Block, Instr, | ||||
| }; | ||||
| 
 | ||||
| use mir::{CustomTypeKey, FunctionCall, FunctionDefinitionKind, IfExpression, TypeKind, WhileStatement}; | ||||
| 
 | ||||
| use crate::mir::{self, FunctionParam, Metadata}; | ||||
| use crate::mir::{self, FunctionParam, Metadata, SourceModuleId}; | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub struct Allocator { | ||||
| @ -16,6 +16,7 @@ pub struct Allocator { | ||||
| 
 | ||||
| pub struct AllocatorScope<'ctx, 'a> { | ||||
|     pub(super) block: &'a mut Block<'ctx>, | ||||
|     pub(super) mod_id: SourceModuleId, | ||||
|     pub(super) type_values: &'a HashMap<CustomTypeKey, TypeValue>, | ||||
| } | ||||
| 
 | ||||
| @ -136,13 +137,38 @@ impl mir::Expression { | ||||
|                 allocated.extend(expression.allocate(scope)); | ||||
|             } | ||||
|             mir::ExprKind::Array(expressions) => { | ||||
|                 let (_, ty) = self.return_type(&Default::default(), scope.mod_id).unwrap(); | ||||
|                 let TypeKind::Array(elem_ty, _) = &ty else { panic!() }; | ||||
|                 let array_name = format!("{}.{}", elem_ty, expressions.len()); | ||||
| 
 | ||||
|                 let allocation = scope | ||||
|                     .block | ||||
|                     .build_named(array_name, Instr::Alloca(ty.get_type(scope.type_values))) | ||||
|                     .unwrap(); | ||||
|                 allocated.push(Allocation(self.1, ty, allocation)); | ||||
| 
 | ||||
|                 for expression in expressions { | ||||
|                     allocated.extend(expression.allocate(scope)); | ||||
|                 } | ||||
|             } | ||||
|             mir::ExprKind::Struct(_, items) => { | ||||
|                 for (_, expression) in items { | ||||
|             mir::ExprKind::Struct(name, items) => { | ||||
|                 let (_, ty) = self.return_type(&Default::default(), scope.mod_id).unwrap(); | ||||
|                 let allocation = scope | ||||
|                     .block | ||||
|                     .build_named(name, Instr::Alloca(ty.get_type(scope.type_values))) | ||||
|                     .unwrap(); | ||||
|                 allocated.push(Allocation(self.1, ty, allocation)); | ||||
| 
 | ||||
|                 for (field_name, expression) in items { | ||||
|                     allocated.extend(expression.allocate(scope)); | ||||
| 
 | ||||
|                     let (_, ty) = expression.return_type(&Default::default(), scope.mod_id).unwrap(); | ||||
| 
 | ||||
|                     let allocation = scope | ||||
|                         .block | ||||
|                         .build_named(field_name, Instr::Alloca(ty.get_type(scope.type_values))) | ||||
|                         .unwrap(); | ||||
|                     allocated.push(Allocation(expression.1, ty, allocation)); | ||||
|                 } | ||||
|             } | ||||
|             mir::ExprKind::Literal(_) => {} | ||||
| @ -186,10 +212,7 @@ impl mir::FunctionCall { | ||||
|         if self.return_type != TypeKind::Void { | ||||
|             let allocation = scope | ||||
|                 .block | ||||
|                 .build_named( | ||||
|                     name, | ||||
|                     reid_lib::Instr::Alloca(self.return_type.get_type(scope.type_values)), | ||||
|                 ) | ||||
|                 .build_named(name, Instr::Alloca(self.return_type.get_type(scope.type_values))) | ||||
|                 .unwrap(); | ||||
|             allocated.push(Allocation(self.meta, self.return_type.clone(), allocation)); | ||||
|         } | ||||
|  | ||||
| @ -293,6 +293,7 @@ impl mir::Module { | ||||
|                                 &mut AllocatorScope { | ||||
|                                     block: &mut entry, | ||||
|                                     type_values: &type_values, | ||||
|                                     mod_id: self.module_id, | ||||
|                                 }, | ||||
|                             ); | ||||
| 
 | ||||
| @ -367,6 +368,7 @@ impl mir::Module { | ||||
|                     &mut AllocatorScope { | ||||
|                         block: &mut entry, | ||||
|                         type_values: &type_values, | ||||
|                         mod_id: self.module_id, | ||||
|                     }, | ||||
|                 ); | ||||
| 
 | ||||
| @ -426,6 +428,7 @@ impl mir::Module { | ||||
|                     &mut AllocatorScope { | ||||
|                         block: &mut entry, | ||||
|                         type_values: &type_values, | ||||
|                         mod_id: self.module_id, | ||||
|                     }, | ||||
|                 ); | ||||
| 
 | ||||
| @ -1037,8 +1040,10 @@ impl mir::Expression { | ||||
|                 let load_n = format!("{}.load", array_name); | ||||
| 
 | ||||
|                 let array = scope | ||||
|                     .block | ||||
|                     .build_named(&array_name, Instr::Alloca(array_ty.clone())) | ||||
|                     .allocate( | ||||
|                         &self.1, | ||||
|                         &TypeKind::Array(Box::new(elem_ty_kind.clone()), expressions.len() as u64), | ||||
|                     ) | ||||
|                     .unwrap() | ||||
|                     .maybe_location(&mut scope.block, location.clone()); | ||||
| 
 | ||||
| @ -1135,8 +1140,7 @@ impl mir::Expression { | ||||
|                 let load_n = format!("{}.load", name); | ||||
| 
 | ||||
|                 let struct_ptr = scope | ||||
|                     .block | ||||
|                     .build_named(name, Instr::Alloca(ty.clone())) | ||||
|                     .allocate(&self.1, &TypeKind::CustomType(type_key.clone())) | ||||
|                     .unwrap() | ||||
|                     .maybe_location(&mut scope.block, location.clone()); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user