Codegen intrinsics
This commit is contained in:
		
							parent
							
								
									b793ef7526
								
							
						
					
					
						commit
						954f3438d3
					
				| @ -7,7 +7,7 @@ import std::new_string; | ||||
| import std::add_num_to_str; | ||||
| import std::concat_strings; | ||||
| 
 | ||||
| fn main() -> i32 { | ||||
| fn main() -> u8 { | ||||
|     let mut test = from_str("hello"); | ||||
| 
 | ||||
|     concat_strings(&mut test, from_str(" world")); | ||||
| @ -21,5 +21,5 @@ fn main() -> i32 { | ||||
| 
 | ||||
|     free_string(&test); | ||||
| 
 | ||||
|     return 0; | ||||
|     return addition(5, 3); | ||||
| } | ||||
|  | ||||
| @ -50,7 +50,6 @@ impl ast::Module { | ||||
|                             block.into_mir(module_id), | ||||
|                             (*range).as_meta(module_id), | ||||
|                         ), | ||||
|                         source: module_id, | ||||
|                     }; | ||||
|                     functions.push(def); | ||||
|                 } | ||||
| @ -71,7 +70,6 @@ impl ast::Module { | ||||
|                             .map(|p| (p.0, p.1 .0.into_mir(module_id))) | ||||
|                             .collect(), | ||||
|                         kind: mir::FunctionDefinitionKind::Extern(false), | ||||
|                         source: module_id, | ||||
|                     }; | ||||
|                     functions.push(def); | ||||
|                 } | ||||
|  | ||||
| @ -317,7 +317,7 @@ impl mir::Module { | ||||
|                         ..FunctionFlags::default() | ||||
|                     }, | ||||
|                 ), | ||||
|                 mir::FunctionDefinitionKind::Intrinsic(instrinsic_kind) => module.function( | ||||
|                 mir::FunctionDefinitionKind::Intrinsic(_) => module.function( | ||||
|                     &function.name, | ||||
|                     function.return_type.get_type(&type_values), | ||||
|                     param_types, | ||||
| @ -478,7 +478,7 @@ impl mir::Module { | ||||
|                 } | ||||
|                 mir::FunctionDefinitionKind::Extern(_) => {} | ||||
|                 mir::FunctionDefinitionKind::Intrinsic(kind) => { | ||||
|                     let mut entry = function.ir.block("entry"); | ||||
|                     let entry = function.ir.block("entry"); | ||||
|                     let mut scope = Scope { | ||||
|                         context, | ||||
|                         modules: &modules, | ||||
|  | ||||
| @ -1,10 +1,57 @@ | ||||
| use crate::codegen::{ErrorKind, Scope, StackValue}; | ||||
| use reid_lib::Instr; | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub enum InstrinsicKind {} | ||||
| use crate::{ | ||||
|     codegen::{ErrorKind, Scope}, | ||||
|     mir::{FunctionDefinition, FunctionDefinitionKind, TypeKind}, | ||||
| }; | ||||
| 
 | ||||
| #[derive(Debug, Clone, Copy)] | ||||
| pub enum InstrinsicKind { | ||||
|     IAdd, | ||||
| } | ||||
| 
 | ||||
| fn intrinsic( | ||||
|     name: &str, | ||||
|     ret_ty: TypeKind, | ||||
|     params: Vec<(&str, TypeKind)>, | ||||
|     kind: InstrinsicKind, | ||||
| ) -> FunctionDefinition { | ||||
|     FunctionDefinition { | ||||
|         name: name.into(), | ||||
|         is_pub: false, | ||||
|         is_imported: false, | ||||
|         return_type: ret_ty, | ||||
|         parameters: params.into_iter().map(|(n, ty)| (n.into(), ty)).collect(), | ||||
|         kind: FunctionDefinitionKind::Intrinsic(kind), | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub fn form_intrinsics() -> Vec<FunctionDefinition> { | ||||
|     let mut intrinsics = Vec::new(); | ||||
| 
 | ||||
|     intrinsics.push(intrinsic( | ||||
|         "addition", | ||||
|         TypeKind::U8, | ||||
|         vec![("lhs".into(), TypeKind::U8), ("rhs".into(), TypeKind::U8)], | ||||
|         InstrinsicKind::IAdd, | ||||
|     )); | ||||
| 
 | ||||
|     intrinsics | ||||
| } | ||||
| 
 | ||||
| impl InstrinsicKind { | ||||
|     pub fn codegen<'ctx, 'a>(&self, mut scope: &mut Scope<'ctx, 'a>) -> Result<(), ErrorKind> { | ||||
|     pub fn codegen<'ctx, 'a>(&self, scope: &mut Scope<'ctx, 'a>) -> Result<(), ErrorKind> { | ||||
|         match self { | ||||
|             InstrinsicKind::IAdd => { | ||||
|                 let lhs = scope.block.build(Instr::Param(0)).unwrap(); | ||||
|                 let rhs = scope.block.build(Instr::Param(1)).unwrap(); | ||||
|                 let add = scope.block.build(Instr::Add(lhs, rhs)).unwrap(); | ||||
|                 scope | ||||
|                     .block | ||||
|                     .terminate(reid_lib::TerminatorKind::Ret(add)) | ||||
|                     .unwrap() | ||||
|             } | ||||
|         } | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -44,6 +44,7 @@ | ||||
| use std::path::PathBuf; | ||||
| 
 | ||||
| use error_raporting::{ErrorKind as ErrorRapKind, ErrorModules, ReidError}; | ||||
| use intrinsics::form_intrinsics; | ||||
| use lexer::FullToken; | ||||
| use mir::{ | ||||
|     linker::LinkerPass, typecheck::TypeCheck, typeinference::TypeInference, typerefs::TypeRefs, | ||||
| @ -127,6 +128,10 @@ pub fn perform_all_passes<'map>( | ||||
|     #[cfg(debug_assertions)] | ||||
|     dbg!(&context); | ||||
| 
 | ||||
|     for module in &mut context.modules { | ||||
|         module.1.functions.extend(form_intrinsics()); | ||||
|     } | ||||
| 
 | ||||
|     #[cfg(debug_assertions)] | ||||
|     println!("{}", &context); | ||||
| 
 | ||||
|  | ||||
| @ -331,7 +331,6 @@ impl<'map> Pass for LinkerPass<'map> { | ||||
|                     return_type, | ||||
|                     parameters: param_tys, | ||||
|                     kind: super::FunctionDefinitionKind::Extern(true), | ||||
|                     source: imported_mod_id, | ||||
|                 }); | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -294,7 +294,6 @@ pub struct FunctionDefinition { | ||||
|     pub return_type: TypeKind, | ||||
|     pub parameters: Vec<(String, TypeKind)>, | ||||
|     pub kind: FunctionDefinitionKind, | ||||
|     pub source: SourceModuleId, | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
|  | ||||
| @ -69,7 +69,7 @@ impl FunctionDefinition { | ||||
|                 } | ||||
|             } | ||||
|             FunctionDefinitionKind::Extern(_) => {} | ||||
|             FunctionDefinitionKind::Intrinsic(_) => todo!(), | ||||
|             FunctionDefinitionKind::Intrinsic(_) => {} | ||||
|         }; | ||||
| 
 | ||||
|         Ok(()) | ||||
|  | ||||
| @ -98,7 +98,7 @@ fn float_compiles_well() { | ||||
| } | ||||
| #[test] | ||||
| fn hello_world_compiles_well() { | ||||
|     test(include_str!("../../examples/hello_world.reid"), "test", 0); | ||||
|     test(include_str!("../../examples/hello_world.reid"), "test", 8); | ||||
| } | ||||
| #[test] | ||||
| fn mutable_compiles_well() { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user