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::add_num_to_str;
|
||||||
import std::concat_strings;
|
import std::concat_strings;
|
||||||
|
|
||||||
fn main() -> i32 {
|
fn main() -> u8 {
|
||||||
let mut test = from_str("hello");
|
let mut test = from_str("hello");
|
||||||
|
|
||||||
concat_strings(&mut test, from_str(" world"));
|
concat_strings(&mut test, from_str(" world"));
|
||||||
@ -21,5 +21,5 @@ fn main() -> i32 {
|
|||||||
|
|
||||||
free_string(&test);
|
free_string(&test);
|
||||||
|
|
||||||
return 0;
|
return addition(5, 3);
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,6 @@ impl ast::Module {
|
|||||||
block.into_mir(module_id),
|
block.into_mir(module_id),
|
||||||
(*range).as_meta(module_id),
|
(*range).as_meta(module_id),
|
||||||
),
|
),
|
||||||
source: module_id,
|
|
||||||
};
|
};
|
||||||
functions.push(def);
|
functions.push(def);
|
||||||
}
|
}
|
||||||
@ -71,7 +70,6 @@ impl ast::Module {
|
|||||||
.map(|p| (p.0, p.1 .0.into_mir(module_id)))
|
.map(|p| (p.0, p.1 .0.into_mir(module_id)))
|
||||||
.collect(),
|
.collect(),
|
||||||
kind: mir::FunctionDefinitionKind::Extern(false),
|
kind: mir::FunctionDefinitionKind::Extern(false),
|
||||||
source: module_id,
|
|
||||||
};
|
};
|
||||||
functions.push(def);
|
functions.push(def);
|
||||||
}
|
}
|
||||||
|
@ -317,7 +317,7 @@ impl mir::Module {
|
|||||||
..FunctionFlags::default()
|
..FunctionFlags::default()
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
mir::FunctionDefinitionKind::Intrinsic(instrinsic_kind) => module.function(
|
mir::FunctionDefinitionKind::Intrinsic(_) => module.function(
|
||||||
&function.name,
|
&function.name,
|
||||||
function.return_type.get_type(&type_values),
|
function.return_type.get_type(&type_values),
|
||||||
param_types,
|
param_types,
|
||||||
@ -478,7 +478,7 @@ impl mir::Module {
|
|||||||
}
|
}
|
||||||
mir::FunctionDefinitionKind::Extern(_) => {}
|
mir::FunctionDefinitionKind::Extern(_) => {}
|
||||||
mir::FunctionDefinitionKind::Intrinsic(kind) => {
|
mir::FunctionDefinitionKind::Intrinsic(kind) => {
|
||||||
let mut entry = function.ir.block("entry");
|
let entry = function.ir.block("entry");
|
||||||
let mut scope = Scope {
|
let mut scope = Scope {
|
||||||
context,
|
context,
|
||||||
modules: &modules,
|
modules: &modules,
|
||||||
|
@ -1,10 +1,57 @@
|
|||||||
use crate::codegen::{ErrorKind, Scope, StackValue};
|
use reid_lib::Instr;
|
||||||
|
|
||||||
#[derive(Debug)]
|
use crate::{
|
||||||
pub enum InstrinsicKind {}
|
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 {
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use error_raporting::{ErrorKind as ErrorRapKind, ErrorModules, ReidError};
|
use error_raporting::{ErrorKind as ErrorRapKind, ErrorModules, ReidError};
|
||||||
|
use intrinsics::form_intrinsics;
|
||||||
use lexer::FullToken;
|
use lexer::FullToken;
|
||||||
use mir::{
|
use mir::{
|
||||||
linker::LinkerPass, typecheck::TypeCheck, typeinference::TypeInference, typerefs::TypeRefs,
|
linker::LinkerPass, typecheck::TypeCheck, typeinference::TypeInference, typerefs::TypeRefs,
|
||||||
@ -127,6 +128,10 @@ pub fn perform_all_passes<'map>(
|
|||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
dbg!(&context);
|
dbg!(&context);
|
||||||
|
|
||||||
|
for module in &mut context.modules {
|
||||||
|
module.1.functions.extend(form_intrinsics());
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
println!("{}", &context);
|
println!("{}", &context);
|
||||||
|
|
||||||
|
@ -331,7 +331,6 @@ impl<'map> Pass for LinkerPass<'map> {
|
|||||||
return_type,
|
return_type,
|
||||||
parameters: param_tys,
|
parameters: param_tys,
|
||||||
kind: super::FunctionDefinitionKind::Extern(true),
|
kind: super::FunctionDefinitionKind::Extern(true),
|
||||||
source: imported_mod_id,
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -294,7 +294,6 @@ pub struct FunctionDefinition {
|
|||||||
pub return_type: TypeKind,
|
pub return_type: TypeKind,
|
||||||
pub parameters: Vec<(String, TypeKind)>,
|
pub parameters: Vec<(String, TypeKind)>,
|
||||||
pub kind: FunctionDefinitionKind,
|
pub kind: FunctionDefinitionKind,
|
||||||
pub source: SourceModuleId,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -69,7 +69,7 @@ impl FunctionDefinition {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
FunctionDefinitionKind::Extern(_) => {}
|
FunctionDefinitionKind::Extern(_) => {}
|
||||||
FunctionDefinitionKind::Intrinsic(_) => todo!(),
|
FunctionDefinitionKind::Intrinsic(_) => {}
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -98,7 +98,7 @@ fn float_compiles_well() {
|
|||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn hello_world_compiles_well() {
|
fn hello_world_compiles_well() {
|
||||||
test(include_str!("../../examples/hello_world.reid"), "test", 0);
|
test(include_str!("../../examples/hello_world.reid"), "test", 8);
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn mutable_compiles_well() {
|
fn mutable_compiles_well() {
|
||||||
|
Loading…
Reference in New Issue
Block a user