Work on intrinsics, clean up code a bit
This commit is contained in:
		
							parent
							
								
									4f1dc5e59d
								
							
						
					
					
						commit
						5ff5651f5f
					
				| @ -18,11 +18,16 @@ pub struct Allocator { | ||||
| pub struct AllocatorScope<'ctx, 'a> { | ||||
|     pub(super) block: &'a mut Block<'ctx>, | ||||
|     pub(super) module_id: SourceModuleId, | ||||
|     pub(super) types: &'a HashMap<TypeValue, TypeDefinition>, | ||||
|     pub(super) type_values: &'a HashMap<CustomTypeKey, TypeValue>, | ||||
| } | ||||
| 
 | ||||
| impl Allocator { | ||||
|     pub fn empty() -> Allocator { | ||||
|         Allocator { | ||||
|             allocations: Vec::new(), | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn from(func: &FunctionDefinition, scope: &mut AllocatorScope) -> Allocator { | ||||
|         func.allocate(scope) | ||||
|     } | ||||
| @ -44,22 +49,21 @@ impl mir::FunctionDefinition { | ||||
|     fn allocate<'ctx, 'a>(&self, scope: &mut AllocatorScope<'ctx, 'a>) -> Allocator { | ||||
|         let mut allocated = Vec::new(); | ||||
|         match &self.kind { | ||||
|             crate::mir::FunctionDefinitionKind::Local(block, _) => { | ||||
|             mir::FunctionDefinitionKind::Local(block, _) => { | ||||
|                 for param in &self.parameters { | ||||
|                     let allocation = scope | ||||
|                         .block | ||||
|                         .build_named( | ||||
|                             param.0.clone(), | ||||
|                             reid_lib::Instr::Alloca( | ||||
|                                 param.1.get_type(scope.type_values, scope.types), | ||||
|                             ), | ||||
|                             reid_lib::Instr::Alloca(param.1.get_type(scope.type_values)), | ||||
|                         ) | ||||
|                         .unwrap(); | ||||
|                     allocated.push(Allocation(param.0.clone(), param.1.clone(), allocation)); | ||||
|                 } | ||||
|                 allocated.extend(block.allocate(scope)); | ||||
|             } | ||||
|             crate::mir::FunctionDefinitionKind::Extern(_) => {} | ||||
|             mir::FunctionDefinitionKind::Extern(_) => {} | ||||
|             mir::FunctionDefinitionKind::Intrinsic(_) => {} | ||||
|         } | ||||
| 
 | ||||
|         Allocator { | ||||
| @ -95,11 +99,7 @@ impl mir::Statement { | ||||
|                     .block | ||||
|                     .build_named( | ||||
|                         named_variable_ref.1.clone(), | ||||
|                         reid_lib::Instr::Alloca( | ||||
|                             named_variable_ref | ||||
|                                 .0 | ||||
|                                 .get_type(scope.type_values, scope.types), | ||||
|                         ), | ||||
|                         reid_lib::Instr::Alloca(named_variable_ref.0.get_type(scope.type_values)), | ||||
|                     ) | ||||
|                     .unwrap(); | ||||
|                 allocated.push(Allocation( | ||||
|  | ||||
| @ -275,7 +275,7 @@ impl mir::Module { | ||||
|                             // TODO: Reorder custom-type definitions such that
 | ||||
|                             // inner types get evaluated first. Otherwise this
 | ||||
|                             // will cause a panic!
 | ||||
|                             .map(|StructField(_, t, _)| t.get_type(&type_values, &types)) | ||||
|                             .map(|StructField(_, t, _)| t.get_type(&type_values)) | ||||
|                             .collect(), | ||||
|                     ))) | ||||
|                 } | ||||
| @ -291,14 +291,14 @@ impl mir::Module { | ||||
|             let param_types: Vec<Type> = function | ||||
|                 .parameters | ||||
|                 .iter() | ||||
|                 .map(|(_, p)| p.get_type(&type_values, &types)) | ||||
|                 .map(|(_, p)| p.get_type(&type_values)) | ||||
|                 .collect(); | ||||
| 
 | ||||
|             let is_main = self.is_main && function.name == "main"; | ||||
|             let func = match &function.kind { | ||||
|                 mir::FunctionDefinitionKind::Local(_, _) => module.function( | ||||
|                     &function.name, | ||||
|                     function.return_type.get_type(&type_values, &types), | ||||
|                     function.return_type.get_type(&type_values), | ||||
|                     param_types, | ||||
|                     FunctionFlags { | ||||
|                         is_pub: function.is_pub || is_main, | ||||
| @ -309,7 +309,7 @@ impl mir::Module { | ||||
|                 ), | ||||
|                 mir::FunctionDefinitionKind::Extern(imported) => module.function( | ||||
|                     &function.name, | ||||
|                     function.return_type.get_type(&type_values, &types), | ||||
|                     function.return_type.get_type(&type_values), | ||||
|                     param_types, | ||||
|                     FunctionFlags { | ||||
|                         is_extern: true, | ||||
| @ -317,6 +317,7 @@ impl mir::Module { | ||||
|                         ..FunctionFlags::default() | ||||
|                     }, | ||||
|                 ), | ||||
|                 mir::FunctionDefinitionKind::Intrinsic(instrinsic_kind) => todo!(), | ||||
|             }; | ||||
| 
 | ||||
|             functions.insert(function.name.clone(), StackFunction { ir: func }); | ||||
| @ -333,7 +334,6 @@ impl mir::Module { | ||||
|                         &mut AllocatorScope { | ||||
|                             block: &mut entry, | ||||
|                             module_id: self.module_id, | ||||
|                             types: &types, | ||||
|                             type_values: &type_values, | ||||
|                         }, | ||||
|                     ); | ||||
| @ -470,6 +470,26 @@ impl mir::Module { | ||||
|                     } | ||||
|                 } | ||||
|                 mir::FunctionDefinitionKind::Extern(_) => {} | ||||
|                 mir::FunctionDefinitionKind::Intrinsic(kind) => { | ||||
|                     let mut entry = function.ir.block("entry"); | ||||
|                     let mut scope = Scope { | ||||
|                         context, | ||||
|                         modules: &modules, | ||||
|                         tokens, | ||||
|                         module: &module, | ||||
|                         module_id: self.module_id, | ||||
|                         function, | ||||
|                         block: entry, | ||||
|                         functions: &functions, | ||||
|                         types: &types, | ||||
|                         type_values: &type_values, | ||||
|                         stack_values: Default::default(), | ||||
|                         debug: None, | ||||
|                         allocator: Rc::new(RefCell::new(Allocator::empty())), | ||||
|                     }; | ||||
| 
 | ||||
|                     kind.codegen(&mut scope)? | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @ -694,7 +714,7 @@ impl mir::Expression { | ||||
|                                             format!("{}", varref.1), | ||||
|                                             Instr::Load( | ||||
|                                                 v.0.instr(), | ||||
|                                                 inner.get_type(scope.type_values, scope.types), | ||||
|                                                 inner.get_type(scope.type_values), | ||||
|                                             ), | ||||
|                                         ) | ||||
|                                         .unwrap(), | ||||
| @ -800,7 +820,7 @@ impl mir::Expression { | ||||
|                     .known() | ||||
|                     .expect("function return type unknown"); | ||||
| 
 | ||||
|                 let ret_type = ret_type_kind.get_type(scope.type_values, scope.types); | ||||
|                 let ret_type = ret_type_kind.get_type(scope.type_values); | ||||
| 
 | ||||
|                 let params = try_all( | ||||
|                     call.parameters | ||||
| @ -903,10 +923,7 @@ impl mir::Expression { | ||||
|                         .block | ||||
|                         .build_named( | ||||
|                             "load", | ||||
|                             Instr::Load( | ||||
|                                 kind.instr(), | ||||
|                                 inner.get_type(scope.type_values, scope.types), | ||||
|                             ), | ||||
|                             Instr::Load(kind.instr(), inner.get_type(scope.type_values)), | ||||
|                         ) | ||||
|                         .unwrap(); | ||||
|                     ( | ||||
| @ -962,10 +979,7 @@ impl mir::Expression { | ||||
|                                 .block | ||||
|                                 .build_named( | ||||
|                                     "array.load", | ||||
|                                     Instr::Load( | ||||
|                                         ptr, | ||||
|                                         contained_ty.get_type(scope.type_values, scope.types), | ||||
|                                     ), | ||||
|                                     Instr::Load(ptr, contained_ty.get_type(scope.type_values)), | ||||
|                                 ) | ||||
|                                 .unwrap() | ||||
|                                 .maybe_location(&mut scope.block, location), | ||||
| @ -1003,7 +1017,7 @@ impl mir::Expression { | ||||
|                     .unwrap_or(TypeKind::Void); | ||||
| 
 | ||||
|                 let array_ty = Type::Array( | ||||
|                     Box::new(elem_ty_kind.get_type(scope.type_values, scope.types)), | ||||
|                     Box::new(elem_ty_kind.get_type(scope.type_values)), | ||||
|                     instr_list.len() as u64, | ||||
|                 ); | ||||
|                 let array_name = format!("{}.{}", elem_ty_kind, instr_list.len()); | ||||
| @ -1086,10 +1100,7 @@ impl mir::Expression { | ||||
|                                 .block | ||||
|                                 .build_named( | ||||
|                                     load_n, | ||||
|                                     Instr::Load( | ||||
|                                         value, | ||||
|                                         type_kind.get_type(scope.type_values, scope.types), | ||||
|                                     ), | ||||
|                                     Instr::Load(value, type_kind.get_type(scope.type_values)), | ||||
|                                 ) | ||||
|                                 .unwrap(), | ||||
|                         ), | ||||
| @ -1180,10 +1191,7 @@ impl mir::Expression { | ||||
|                     .block | ||||
|                     .build_named( | ||||
|                         format!("{}.deref", varref.1), | ||||
|                         Instr::Load( | ||||
|                             v.0.instr(), | ||||
|                             ptr_inner.get_type(scope.type_values, scope.types), | ||||
|                         ), | ||||
|                         Instr::Load(v.0.instr(), ptr_inner.get_type(scope.type_values)), | ||||
|                     ) | ||||
|                     .unwrap(); | ||||
| 
 | ||||
| @ -1198,7 +1206,7 @@ impl mir::Expression { | ||||
|                                             format!("{}.deref.inner", varref.1), | ||||
|                                             Instr::Load( | ||||
|                                                 var_ptr_instr, | ||||
|                                                 inner.get_type(scope.type_values, scope.types), | ||||
|                                                 inner.get_type(scope.type_values), | ||||
|                                             ), | ||||
|                                         ) | ||||
|                                         .unwrap(), | ||||
| @ -1236,7 +1244,7 @@ impl mir::Expression { | ||||
|                                         .build(Instr::BitCast( | ||||
|                                             val.instr(), | ||||
|                                             Type::Ptr(Box::new( | ||||
|                                                 type_kind.get_type(scope.type_values, scope.types), | ||||
|                                                 type_kind.get_type(scope.type_values), | ||||
|                                             )), | ||||
|                                         )) | ||||
|                                         .unwrap(), | ||||
| @ -1254,7 +1262,7 @@ impl mir::Expression { | ||||
|                                     .block | ||||
|                                     .build(Instr::BitCast( | ||||
|                                         val.instr(), | ||||
|                                         type_kind.get_type(scope.type_values, scope.types), | ||||
|                                         type_kind.get_type(scope.type_values), | ||||
|                                     )) | ||||
|                                     .unwrap(), | ||||
|                             ), | ||||
| @ -1263,10 +1271,10 @@ impl mir::Expression { | ||||
|                         _ => { | ||||
|                             let cast_instr = val | ||||
|                                 .1 | ||||
|                                 .get_type(scope.type_values, scope.types) | ||||
|                                 .get_type(scope.type_values) | ||||
|                                 .cast_instruction( | ||||
|                                     val.instr(), | ||||
|                                     &type_kind.get_type(scope.type_values, scope.types), | ||||
|                                     &type_kind.get_type(scope.type_values), | ||||
|                                 ) | ||||
|                                 .unwrap(); | ||||
| 
 | ||||
| @ -1438,11 +1446,7 @@ impl mir::Literal { | ||||
| } | ||||
| 
 | ||||
| impl TypeKind { | ||||
|     pub(super) fn get_type( | ||||
|         &self, | ||||
|         type_vals: &HashMap<CustomTypeKey, TypeValue>, | ||||
|         typedefs: &HashMap<TypeValue, TypeDefinition>, | ||||
|     ) -> Type { | ||||
|     pub(super) fn get_type(&self, type_vals: &HashMap<CustomTypeKey, TypeValue>) -> Type { | ||||
|         match &self { | ||||
|             TypeKind::I8 => Type::I8, | ||||
|             TypeKind::I16 => Type::I16, | ||||
| @ -1463,24 +1467,16 @@ impl TypeKind { | ||||
|             TypeKind::F80 => Type::F80, | ||||
|             TypeKind::F128PPC => Type::F128PPC, | ||||
|             TypeKind::Char => Type::U8, | ||||
|             TypeKind::Array(elem_t, len) => { | ||||
|                 Type::Array(Box::new(elem_t.get_type(type_vals, typedefs)), *len) | ||||
|             } | ||||
|             TypeKind::Array(elem_t, len) => Type::Array(Box::new(elem_t.get_type(type_vals)), *len), | ||||
|             TypeKind::Void => Type::Void, | ||||
|             TypeKind::Vague(_) => panic!("Tried to compile a vague type!"), | ||||
|             TypeKind::CustomType(n) => { | ||||
|                 let type_val = type_vals.get(n).unwrap().clone(); | ||||
|                 Type::CustomType(type_val) | ||||
|             } | ||||
|             TypeKind::UserPtr(type_kind) => { | ||||
|                 Type::Ptr(Box::new(type_kind.get_type(type_vals, typedefs))) | ||||
|             } | ||||
|             TypeKind::CodegenPtr(type_kind) => { | ||||
|                 Type::Ptr(Box::new(type_kind.get_type(type_vals, typedefs))) | ||||
|             } | ||||
|             TypeKind::Borrow(type_kind, _) => { | ||||
|                 Type::Ptr(Box::new(type_kind.get_type(type_vals, typedefs))) | ||||
|             } | ||||
|             TypeKind::UserPtr(type_kind) => Type::Ptr(Box::new(type_kind.get_type(type_vals))), | ||||
|             TypeKind::CodegenPtr(type_kind) => Type::Ptr(Box::new(type_kind.get_type(type_vals))), | ||||
|             TypeKind::Borrow(type_kind, _) => Type::Ptr(Box::new(type_kind.get_type(type_vals))), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										10
									
								
								reid/src/intrinsics.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								reid/src/intrinsics.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| use crate::codegen::{ErrorKind, Scope, StackValue}; | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub enum InstrinsicKind {} | ||||
| 
 | ||||
| impl InstrinsicKind { | ||||
|     pub fn codegen<'ctx, 'a>(&self, mut scope: &mut Scope<'ctx, 'a>) -> Result<(), ErrorKind> { | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
| @ -56,6 +56,7 @@ mod allocator; | ||||
| mod ast; | ||||
| mod codegen; | ||||
| pub mod error_raporting; | ||||
| pub mod intrinsics; | ||||
| pub mod ld; | ||||
| mod lexer; | ||||
| pub mod mir; | ||||
|  | ||||
| @ -5,6 +5,7 @@ | ||||
| use std::{collections::HashMap, path::PathBuf}; | ||||
| 
 | ||||
| use crate::{ | ||||
|     intrinsics::InstrinsicKind, | ||||
|     lexer::{FullToken, Position}, | ||||
|     token_stream::TokenRange, | ||||
| }; | ||||
| @ -303,7 +304,7 @@ pub enum FunctionDefinitionKind { | ||||
|     /// True = imported from other module, False = Is user defined extern
 | ||||
|     Extern(bool), | ||||
|     /// Intrinsic definition, defined within the compiler
 | ||||
|     Intrinsic(Block), | ||||
|     Intrinsic(InstrinsicKind), | ||||
| } | ||||
| 
 | ||||
| impl FunctionDefinition { | ||||
|  | ||||
| @ -352,6 +352,7 @@ impl FunctionDefinition { | ||||
|                 block.pass(pass, state, scope, mod_id)?; | ||||
|             } | ||||
|             FunctionDefinitionKind::Extern(_) => {} | ||||
|             FunctionDefinitionKind::Intrinsic(..) => {} | ||||
|         }; | ||||
|         Ok(()) | ||||
|     } | ||||
|  | ||||
| @ -196,6 +196,9 @@ impl FunctionDefinition { | ||||
|             FunctionDefinitionKind::Extern(_) => { | ||||
|                 Ok((ReturnKind::Soft, TypeKind::Vague(Vague::Unknown))) | ||||
|             } | ||||
|             FunctionDefinitionKind::Intrinsic(..) => { | ||||
|                 Ok((ReturnKind::Soft, TypeKind::Vague(Vague::Unknown))) | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|         match inferred { | ||||
|  | ||||
| @ -69,6 +69,7 @@ impl FunctionDefinition { | ||||
|                 } | ||||
|             } | ||||
|             FunctionDefinitionKind::Extern(_) => {} | ||||
|             FunctionDefinitionKind::Intrinsic(_) => todo!(), | ||||
|         }; | ||||
| 
 | ||||
|         Ok(()) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user